Explorar o código

added head hit block, removed freeze effect of level messages, new snuvi script commands, tile_hit event, fixed londoner attack on player

Kajetan Johannes Hammerle %!s(int64=5) %!d(string=hai) anos
pai
achega
e41f2f5c8e

+ 39 - 9
levels/00-Tech_Demo.snuvi

@@ -1,5 +1,6 @@
 event.load("level_reset");
 event.load("tile_interact");
+event.load("tile_hit");
 
 @main
 wait();
@@ -8,11 +9,14 @@ if(event == "level_reset")
 {
     onLevelReset();
 }
-
-if(event == "tile_interact")
+elseif(event == "tile_interact")
 {
     onInteract(tile_x, tile_y);
 }
+elseif(event == "tile_hit")
+{
+    onTileHit(tile_x, tile_y, entity);
+}
 
 goto(@main);
 
@@ -29,17 +33,43 @@ function onLevelReset()
 
     entity.teleport(hero, x, y);
 
-    level.setTile(level.getBackgroundIndex(), 0, 12, 70);
-    level.setTile(level.getBackgroundIndex(), 4, 12, -1);
+    index = level.getBackgroundIndex();
+    level.setTile(index, 0, 12, 70);
+    level.setTile(index, 4, 12, -1);
+    level.setTile(index, 2, 12, 70);
+    level.setTile(index, 1, 9, 71);
+    level.setTile(index, 4, 8, 71);
+    level.setTile(index, 10, 8, 70);
 }
 
 function onInteract(x, y)
 {
-    level.setTile(level.getBackgroundIndex(), 4, 12, 6);
-    newLine = text.fromCode(10);
-
-    message = text.concat("Hi, ein neuer Block ist erschienen.", newLine, "Hi, ein neuer Block ist erschienen. Hi, ein neuer Block ist erschienen. Hi, ein neuer Block ist erschienen. Hi, ein neuer Block ist erschienen. Hi, ein neuer Block ist erschienen. Hi, ein neuer Block ist erschienen. Hi, ein neuer Block ist erschienen.");
+    if(x == 0 && y == 12)
+    {
+        level.setTile(level.getBackgroundIndex(), 4, 12, 3);
+        level.addMessage("Bla bla, I new block has appeared.");
+        level.addMessage("This is another page.");
+        level.addMessage("And another page.");
+    }
+    elseif(x == 2 && y == 12)
+    {
+        entity.setMotionY(entity.getHero(), -100);
+    }
+    elseif(x == 10 && y == 8)
+    {
+        entity.spawn(2, tile.toLevelCoord(14), tile.toLevelCoord(4));
+    }
+}
 
-    level.addMessage(message);
+function onTileHit(x, y, ent)
+{
+    if(x == 1 && y == 9)
+    {
+        level.addMessage("I'm an info block. ");
+    }
+    elseif(x == 4 && y == 8)
+    {
+        level.setTile(level.getBackgroundIndex(), 4, 7, 3);
+    }
 }
 

+ 1 - 1
slot1.txt

@@ -5,7 +5,7 @@ level.01-Parabola.map=true
 level.01-Parabola.map.bottles=4
 level.01-Parabola.map.time=1.6249999999999962
 level.01-Tech_Demo.map=true
-level.01-Tech_Demo.map.bottles=2
+level.01-Tech_Demo.map.bottles=3
 level.01-Tech_Demo.map.time=3.6499977
 level.02-Out_of_Reach.map=true
 level.02-Out_of_Reach.map.bottles=10

+ 39 - 1
src/me/hammerle/supersnuvi/Game.java

@@ -10,6 +10,7 @@ import me.hammerle.snuviengine.api.KeyBinding;
 import me.hammerle.snuviengine.api.Shader;
 import me.hammerle.snuviscript.code.SnuviParser;
 import me.hammerle.supersnuvi.entity.Entity;
+import me.hammerle.supersnuvi.entity.EntityBuilder;
 import me.hammerle.supersnuvi.gamelogic.Level;
 import me.hammerle.supersnuvi.gamelogic.StartScreenLevel;
 import me.hammerle.supersnuvi.savegame.SimpleConfig;
@@ -40,7 +41,7 @@ public class Game extends Engine
     public static final NullTile FALLBACK_TILE = new NullTile();
     
     // tiles
-    private final Tile[] registeredTiles = new Tile[71];
+    private final Tile[] registeredTiles = new Tile[72];
     
     // levels
     private Level currentLevel = null;
@@ -626,6 +627,8 @@ public class Game extends Engine
         
         // test interact tile
         registeredTiles[70] = new InteractTile(0.5625f, 0.0f, 0.625f, 0.0625f);
+        // test hit tile
+        registeredTiles[71] = new HeadHitBlock(0.5625f, 0.0f, 0.625f, 0.0625f);
     }
     
     public Tile getTile(int id)
@@ -715,6 +718,7 @@ public class Game extends Engine
         snuviParser.registerFunction("level.getheight", (sc, in) -> (double) currentLevel.getHeight());
         snuviParser.registerFunction("level.getlayers", (sc, in) -> (double) currentLevel.getData().getLayers());
         snuviParser.registerFunction("level.getbackgroundindex", (sc, in) -> (double) currentLevel.getData().getBackgroundIndex());
+        snuviParser.registerFunction("level.gettile", (sc, in) -> currentLevel.getData().getTile(in[0].getInt(sc), in[1].getInt(sc), in[2].getInt(sc)));
         snuviParser.registerFunction("level.settile", (sc, in) -> 
         {
             int layer = in[0].getInt(sc);
@@ -747,5 +751,39 @@ public class Game extends Engine
             ent.setPosition(x, y);
             return Void.TYPE;
         });
+        snuviParser.registerFunction("entity.getmotionx", (sc, in) -> (double) ((Entity) in[0].get(sc)).getMotionX());
+        snuviParser.registerFunction("entity.getmotiony", (sc, in) -> (double) ((Entity) in[0].get(sc)).getMotionY());
+        snuviParser.registerFunction("entity.setmotionx", (sc, in) -> 
+        {
+            ((Entity) in[0].get(sc)).setMotionX(in[1].getFloat(sc));
+            return Void.TYPE;
+        });
+        snuviParser.registerFunction("entity.setmotiony", (sc, in) -> 
+        {
+            ((Entity) in[0].get(sc)).setMotionY(in[1].getFloat(sc));
+            return Void.TYPE;
+        });
+        snuviParser.registerFunction("entity.ishero", (sc, in) -> currentLevel.getHero() == in[0].get(sc));
+        snuviParser.registerFunction("entity.gethealth", (sc, in) -> ((Entity) in[0].get(sc)).getHealth().getHealthPercent());
+        snuviParser.registerFunction("entity.addhealth", (sc, in) -> 
+        {
+            ((Entity) in[0].get(sc)).getHealth().addHealthPercent(in[1].getFloat(sc));
+            return Void.TYPE;
+        });
+        snuviParser.registerFunction("entity.getenergy", (sc, in) -> ((Entity) in[0].get(sc)).getEnergy().getEnergyPercent());
+        snuviParser.registerFunction("entity.addenergy", (sc, in) -> 
+        {
+            ((Entity) in[0].get(sc)).getEnergy().addEnergyPercent(in[1].getFloat(sc));
+            return Void.TYPE;
+        });
+        snuviParser.registerFunction("entity.spawn", (sc, in) -> 
+        {
+            Entity ent = EntityBuilder.fromId(in[0].getInt(sc), currentLevel, in[1].getFloat(sc), in[2].getFloat(sc));
+            if(ent != null)
+            {
+                currentLevel.spawnEntity(ent);
+            }
+            return ent;
+        });
     }
 }

+ 8 - 5
src/me/hammerle/supersnuvi/entity/components/ai/LondonerController.java

@@ -121,7 +121,7 @@ public class LondonerController extends Controller
         if(attacker != null)
         {
             this.ent.getHealth().addHealthPercent(-0.201f);
-            attacker.setMotionY(-attacker.getMovement().getJumpPower());
+            attacker.setMotionY(-attacker.getMovement().getJumpPower() * 0.5f);
             
             attacker = null;
             hurt = null;
@@ -133,14 +133,13 @@ public class LondonerController extends Controller
 
             hurt.setMotionY(ent.getMotionY() - 20.0f);
 
-            float hx = hurt.getLevel().getHero().getCenterX();
-            if(hx < hurt.getCenterX())
+            if(ent.getCenterX() < hurt.getCenterX())
             {
-                hurt.setMotionX(hurt.getMotionX() - 10.0f);
+                hurt.setMotionX(hurt.getMotionX() + 10.0f);
             }
             else
             {
-                hurt.setMotionX(hurt.getMotionX() + 10.0f);
+                hurt.setMotionX(hurt.getMotionX() - 10.0f);
             }
             
             hurt = null;
@@ -255,6 +254,10 @@ public class LondonerController extends Controller
                 {
                     hurt = ent;
                 }
+                else
+                {
+                    direction = direction.getOpposite();
+                }
                 break;
             case UP:
                 attacker = ent;

+ 2 - 33
src/me/hammerle/supersnuvi/gamelogic/Level.java

@@ -66,8 +66,6 @@ public final class Level implements ILevel
     
     private Script levelScript = null;
     private final LinkedList<String> messages = new LinkedList<>();
-    private float lastFrameLag = 0;
-    private boolean removeMessageLock = false;
     
     public Level(File f)
     {
@@ -303,16 +301,10 @@ public final class Level implements ILevel
     {
         if(worldLoaded)
         {
-            if(!messages.isEmpty())
+            if(!messages.isEmpty() && Keys.ENTER.getTime() == 1)
             {
-                if(Keys.ENTER.getTime() == 1)
-                {
-                    messages.removeFirst();
-                }
-                removeMessageLock = messages.isEmpty();
-                return;
+                messages.removeFirst();
             }
-            removeMessageLock = false;
             
             time += Game.SECS_PER_TICK;
             Game.get().tickTiles();
@@ -522,29 +514,6 @@ public final class Level implements ILevel
     {
         if(worldLoaded)
         {
-            if(messages.isEmpty())
-            {
-                if(removeMessageLock)
-                {
-                    if(lag > lastFrameLag)
-                    {
-                        removeMessageLock = false;
-                    }
-                    else
-                    {
-                        lag = lastFrameLag;
-                    }
-                }
-                else
-                {
-                    lastFrameLag = lag;
-                }
-            }
-            else
-            {
-                lag = lastFrameLag;
-            }
-            
             float camX = Utils.interpolate(oldCameraX, cameraX, lag);
             float camY = Utils.interpolate(oldCameraY, cameraY, lag);
             

+ 30 - 0
src/me/hammerle/supersnuvi/tiles/HeadHitBlock.java

@@ -0,0 +1,30 @@
+package me.hammerle.supersnuvi.tiles;
+
+import me.hammerle.supersnuvi.entity.Entity;
+import me.hammerle.supersnuvi.gamelogic.ILevel;
+import me.hammerle.supersnuvi.util.Face;
+
+public class HeadHitBlock extends BaseBoxTile
+{
+    public HeadHitBlock(float tMinX, float tMinY, float tMaxX, float tMaxY)
+    {
+        super(tMinX, tMinY, tMaxX, tMaxY);
+    }
+
+    @Override
+    public void onEntityCollide(Entity ent, int x, int y, Face face, ILevel l)
+    {
+        if(face == Face.DOWN && ent.getMotionY() < 0)
+        {
+            l.callEvent("tile_hit", (sc) -> 
+            {
+                sc.setVar("tile_x", (double) x);
+                sc.setVar("tile_y", (double) y);
+                sc.setVar("entity", ent);
+            }, (sc) -> 
+            {
+                
+            });
+        }
+    }
+}

+ 7 - 1
src/me/hammerle/supersnuvi/tiles/Ramp.java

@@ -1,5 +1,6 @@
 package me.hammerle.supersnuvi.tiles;
 
+import me.hammerle.supersnuvi.gamelogic.ILevel;
 import me.hammerle.supersnuvi.util.CollisionLine;
 
 public class Ramp extends BaseTile
@@ -12,5 +13,10 @@ public class Ramp extends BaseTile
         super.setCollisionBox(line);
         super.setMovementBox(line);
     }
-    
+
+    @Override
+    public boolean shouldAiUseCollisionBox(int x, int y, ILevel l)
+    {
+        return false;
+    }
 }

+ 6 - 0
src/me/hammerle/supersnuvi/tiles/StartTile.java

@@ -9,4 +9,10 @@ public class StartTile extends Tile
     {
         return false;
     }
+
+    @Override
+    public boolean shouldAiUseCollisionBox(int x, int y, ILevel l)
+    {
+        return false;
+    }
 }