DEADSOFTWARE

Minor enhancements
[cavedroid.git] / core / src / ru / deadsoftware / cavecraft / game / GameProc.java
index 8f5dca275d9b6c3fd3c8e3402cf5212f09cbbdb8..49fe7056faf70015c50f5828e724c7374052491b 100644 (file)
@@ -5,6 +5,8 @@ import com.badlogic.gdx.Input;
 import com.badlogic.gdx.utils.TimeUtils;
 import ru.deadsoftware.cavecraft.CaveGame;
 import ru.deadsoftware.cavecraft.GameScreen;
+import ru.deadsoftware.cavecraft.game.mobs.FallingGravel;
+import ru.deadsoftware.cavecraft.game.mobs.FallingSand;
 import ru.deadsoftware.cavecraft.game.mobs.Mob;
 import ru.deadsoftware.cavecraft.game.mobs.Pig;
 import ru.deadsoftware.cavecraft.game.objects.Player;
@@ -18,6 +20,10 @@ public class GameProc implements Serializable{
 
     public static double RUN_TIME = 0;
 
+    public static boolean DO_UPD = false;
+    public static int UPD_X = -1, UPD_Y = -1;
+    public static int FUPD_X, FUPD_Y;
+
     public Player player;
 
     public ArrayList<Mob> mobs;
@@ -31,7 +37,7 @@ public class GameProc implements Serializable{
     public int ctrlMode;
     public int creativeScroll, maxCreativeScroll;
 
-    public boolean isTouchDown, isKeyDown;
+    public boolean isTouchDown, isKeyDown, swim;
     public int touchDownX, touchDownY, keyDownCode;
     public int touchDownButton;
     public long touchDownTime;
@@ -53,7 +59,7 @@ public class GameProc implements Serializable{
             renderer = new GameRenderer(this,480,
                     480*((float)GameScreen.getHeight()/GameScreen.getWidth()));
         }
-        maxCreativeScroll = Items.BLOCKS.size/40;
+        maxCreativeScroll = Items.BLOCKS.size/8;
         GameSaver.save(this);
     }
 
@@ -110,9 +116,290 @@ public class GameProc implements Serializable{
         }
     }
 
+    private void updateFluids(int x, int y) {
+        if (Items.isWater(world.getForeMap(x, y)) && world.getForeMap(x, y)!=8) {
+            if (world.getForeMap(x, y)==60) {
+                if (!Items.isWater(world.getForeMap(x, y - 1)))
+                    world.setForeMap(x, y, world.getForeMap(x, y) + 1);
+            } else if ((!Items.isWater(world.getForeMap(x-1,y)) ||
+                    (Items.isWater(world.getForeMap(x,y)) && world.getForeMap(x-1, y)>=world.getForeMap(x, y))) &&
+                    (!Items.isWater(world.getForeMap(x+1,y)) ||
+                            (Items.isWater(world.getForeMap(x,y)) && world.getForeMap(x+1, y)>=world.getForeMap(x, y)))){
+                world.setForeMap(x, y, world.getForeMap(x, y)+1);
+            }
+            if (world.getForeMap(x, y)>63) world.setForeMap(x, y, 0);
+        }
+
+        if (world.getForeMap(x, y) == 8 || world.getForeMap(x, y) == 60) {
+            if (world.getForeMap(x, y+1)==0 || (world.getForeMap(x, y+1)>=61 && world.getForeMap(x, y+1)<=63) ||
+                    (!Items.BLOCKS.getValueAt(world.getForeMap(x, y+1)).collision && !Items.isFluid(world.getForeMap(x, y+1)))) {
+                world.setForeMap(x,y+1,60);
+                updateBlock(x, y+2);
+            } else if (Items.isLava(world.getForeMap(x, y+1))) {
+                if (world.getForeMap(x, y+1)>9) world.setForeMap(x, y+1, 4);
+                else world.setForeMap(x, y+1, 68);
+            } else if (Items.BLOCKS.getValueAt(world.getForeMap(x, y+1)).collision) {
+                if (world.getForeMap(x+1, y)==0 ||
+                        (!Items.BLOCKS.getValueAt(world.getForeMap(x+1, y)).collision && !Items.isFluid(world.getForeMap(x+1, y))) ||
+                        (Items.isWater(world.getForeMap(x+1, y)) && world.getForeMap(x+1, y)>61)) {
+                    world.setForeMap(x+1,y,61);
+                    updateBlock(x+1, y+1);
+                } else if (Items.isLava(world.getForeMap(x+1, y))) {
+                    if (world.getForeMap(x+1, y)>9) world.setForeMap(x+1, y, 4);
+                    else world.setForeMap(x+1, y, 68);
+                } else if (world.getForeMap(x+1, y)==61 && (world.getForeMap(x+2, y)==8 || world.getForeMap(x+2, y)==60)) world.setForeMap(x+1, y, 8);
+
+                if (world.getForeMap(x-1, y)==0 ||
+                        (!Items.BLOCKS.getValueAt(world.getForeMap(x-1, y)).collision && !Items.isFluid(world.getForeMap(x-1, y))) ||
+                        (Items.isWater(world.getForeMap(x-1, y)) && world.getForeMap(x-1, y)>61)) {
+                    world.setForeMap(x-1,y,61);
+                    updateBlock(x-1, y+1);
+                } else if (Items.isLava(world.getForeMap(x-1, y))) {
+                    if (world.getForeMap(x-1, y)>9) world.setForeMap(x-1, y, 4);
+                    else world.setForeMap(x-1, y, 68);
+                } else if (world.getForeMap(x-1, y)==61 && (world.getForeMap(x-2, y)==8 || world.getForeMap(x-2, y)==60)) world.setForeMap(x-1, y, 8);
+            }
+            return;
+        }
+        if (world.getForeMap(x, y) == 61) {
+            if (world.getForeMap(x, y+1)==0 || (world.getForeMap(x, y+1)>=61 && world.getForeMap(x, y+1)<=63) ||
+                    (!Items.BLOCKS.getValueAt(world.getForeMap(x, y+1)).collision && !Items.isFluid(world.getForeMap(x, y+1)))) {
+                world.setForeMap(x,y+1,60);
+                updateBlock(x, y+2);
+            } else if (Items.isLava(world.getForeMap(x, y+1))) {
+                if (world.getForeMap(x, y+1)>9) world.setForeMap(x, y+1, 4);
+                else world.setForeMap(x, y+1, 68);
+            } else if (Items.BLOCKS.getValueAt(world.getForeMap(x, y+1)).collision) {
+                if (world.getForeMap(x+1, y)==0 ||
+                        (!Items.BLOCKS.getValueAt(world.getForeMap(x+1, y)).collision && !Items.isFluid(world.getForeMap(x+1, y))) ||
+                        (Items.isWater(world.getForeMap(x+1, y)) && world.getForeMap(x+1, y)>62)){
+                    world.setForeMap(x+1,y,62);
+                    updateBlock(x+1, y+1);
+                } else if (Items.isLava(world.getForeMap(x+1, y))) {
+                    if (world.getForeMap(x+1, y)>9) world.setForeMap(x+1, y, 4);
+                    else world.setForeMap(x+1, y, 68);
+                }
+
+                if (world.getForeMap(x-1, y)==0 ||
+                        (!Items.BLOCKS.getValueAt(world.getForeMap(x-1, y)).collision && !Items.isFluid(world.getForeMap(x-1, y))) ||
+                        (Items.isWater(world.getForeMap(x-1, y)) && world.getForeMap(x-1, y)>62)){
+                    world.setForeMap(x-1,y,62);
+                    updateBlock(x-1, y+1);
+                } else if (Items.isLava(world.getForeMap(x-1, y))) {
+                    if (world.getForeMap(x-1, y)>9) world.setForeMap(x-1, y, 4);
+                    else world.setForeMap(x-1, y, 68);
+                }
+            }
+            return;
+        }
+        if (world.getForeMap(x, y) == 62) {
+            if (world.getForeMap(x, y+1)==0 || (world.getForeMap(x, y+1)>=61 && world.getForeMap(x, y+1)<=63) ||
+                    (!Items.BLOCKS.getValueAt(world.getForeMap(x, y+1)).collision && !Items.isFluid(world.getForeMap(x, y+1)))) {
+                world.setForeMap(x,y+1,60);
+                updateBlock(x, y+2);
+            } else if (Items.isLava(world.getForeMap(x, y+1))) {
+                if (world.getForeMap(x, y+1)>9) world.setForeMap(x, y+1, 4);
+                else world.setForeMap(x, y+1, 68);
+            } else if (Items.BLOCKS.getValueAt(world.getForeMap(x, y+1)).collision) {
+                if (world.getForeMap(x+1, y)==0 ||
+                        (!Items.BLOCKS.getValueAt(world.getForeMap(x+1, y)).collision && !Items.isFluid(world.getForeMap(x+1, y))) ){
+                    world.setForeMap(x+1,y,63);
+                    updateBlock(x+1, y+1);
+                } else if (Items.isLava(world.getForeMap(x+1, y))) {
+                    if (world.getForeMap(x+1, y)>9) world.setForeMap(x+1, y, 4);
+                    else world.setForeMap(x+1, y, 68);
+                }
+
+                if (world.getForeMap(x-1, y)==0 ||
+                        (!Items.BLOCKS.getValueAt(world.getForeMap(x-1, y)).collision && !Items.isFluid(world.getForeMap(x-1, y))) ){
+                    world.setForeMap(x-1,y,63);
+                    updateBlock(x-1, y+1);
+                } else if (Items.isLava(world.getForeMap(x-1, y))) {
+                    if (world.getForeMap(x-1, y)>9) world.setForeMap(x-1, y, 4);
+                    else world.setForeMap(x-1, y, 68);
+                }
+            }
+            return;
+        }
+        if (world.getForeMap(x, y) == 63) {
+            if (world.getForeMap(x, y+1)==0 || (world.getForeMap(x, y+1)>=61 && world.getForeMap(x, y+1)<=63) ||
+                    (!Items.BLOCKS.getValueAt(world.getForeMap(x, y+1)).collision && !Items.isFluid(world.getForeMap(x, y+1)))) {
+                world.setForeMap(x,y+1,60);
+                updateBlock(x, y+2);
+            } else if (Items.isLava(world.getForeMap(x, y+1))) {
+                if (world.getForeMap(x, y+1)>9) world.setForeMap(x, y+1, 4);
+                else world.setForeMap(x, y+1, 68);
+            }
+            return;
+        }
+
+        if (Items.isLava(world.getForeMap(x, y)) && world.getForeMap(x, y)!=9) {
+            if (world.getForeMap(x, y)==64) {
+                if (!Items.isLava(world.getForeMap(x, y - 1)))
+                    world.setForeMap(x, y, world.getForeMap(x, y) + 1);
+            } else if ((!Items.isLava(world.getForeMap(x,y-1))) &&
+                    (!Items.isLava(world.getForeMap(x-1,y)) ||
+                    (Items.isLava(world.getForeMap(x,y)) && world.getForeMap(x-1, y)>=world.getForeMap(x, y))) &&
+                    (!Items.isLava(world.getForeMap(x+1,y)) ||
+                            (Items.isLava(world.getForeMap(x,y)) && world.getForeMap(x+1, y)>=world.getForeMap(x, y)))){
+                world.setForeMap(x, y, world.getForeMap(x, y)+1);
+            }
+            if (world.getForeMap(x, y)>67) world.setForeMap(x, y, 0);
+        }
+
+        if (world.getForeMap(x, y) == 9 || world.getForeMap(x, y) == 64) {
+            if (world.getForeMap(x, y+1)==0 || (world.getForeMap(x, y+1)>=65 && world.getForeMap(x, y+1)<=67) ||
+                    (!Items.BLOCKS.getValueAt(world.getForeMap(x, y+1)).collision && !Items.isFluid(world.getForeMap(x, y+1)))) {
+                world.setForeMap(x,y+1,64);
+                updateBlock(x, y+2);
+            } else if (Items.isWater(world.getForeMap(x, y+1))) {
+                world.setForeMap(x, y+1, 1);
+            } else if (Items.BLOCKS.getValueAt(world.getForeMap(x, y+1)).collision) {
+                if (world.getForeMap(x+1, y)==0 ||
+                        (!Items.BLOCKS.getValueAt(world.getForeMap(x+1, y)).collision && !Items.isFluid(world.getForeMap(x+1, y))) ||
+                        (Items.isLava(world.getForeMap(x+1, y)) && world.getForeMap(x+1, y)>65)) {
+                    world.setForeMap(x+1,y,65);
+                    updateBlock(x+1, y+1);
+                } else if (Items.isWater(world.getForeMap(x+1, y))) {
+                    world.setForeMap(x+1, y, 1);
+                }
+
+                if (world.getForeMap(x-1, y)==0 ||
+                        (!Items.BLOCKS.getValueAt(world.getForeMap(x-1, y)).collision && !Items.isFluid(world.getForeMap(x-1, y))) ||
+                        (Items.isLava(world.getForeMap(x-1, y)) && world.getForeMap(x-1, y)>65)) {
+                    world.setForeMap(x-1,y,65);
+                    updateBlock(x-1, y+1);
+                } else if (Items.isWater(world.getForeMap(x-1, y))) {
+                    world.setForeMap(x-1, y, 1);
+                }
+            }
+            return;
+        }
+        if (world.getForeMap(x, y) == 65) {
+            if (world.getForeMap(x, y+1)==0 || (world.getForeMap(x, y+1)>=65 && world.getForeMap(x, y+1)<=67) ||
+                    (!Items.BLOCKS.getValueAt(world.getForeMap(x, y+1)).collision && !Items.isFluid(world.getForeMap(x, y+1)))) {
+                world.setForeMap(x,y+1,64);
+                updateBlock(x, y+2);
+            } else if (Items.isWater(world.getForeMap(x, y+1))) {
+                world.setForeMap(x, y+1, 1);
+            } else if (Items.BLOCKS.getValueAt(world.getForeMap(x, y+1)).collision) {
+                if (world.getForeMap(x+1, y)==0 ||
+                        (!Items.BLOCKS.getValueAt(world.getForeMap(x+1, y)).collision && !Items.isFluid(world.getForeMap(x+1, y))) ||
+                        (Items.isLava(world.getForeMap(x+1, y)) && world.getForeMap(x+1, y)>66)){
+                    world.setForeMap(x+1,y,66);
+                    updateBlock(x+1, y+1);
+                } else if (Items.isWater(world.getForeMap(x+1, y))) {
+                    world.setForeMap(x+1, y, 1);
+                }
+
+                if (world.getForeMap(x-1, y)==0 ||
+                        (!Items.BLOCKS.getValueAt(world.getForeMap(x-1, y)).collision && !Items.isFluid(world.getForeMap(x-1, y))) ||
+                        (Items.isLava(world.getForeMap(x-1, y)) && world.getForeMap(x-1, y)>66)){
+                    world.setForeMap(x-1,y,66);
+                    updateBlock(x-1, y+1);
+                } else if (Items.isWater(world.getForeMap(x-1, y))) {
+                    world.setForeMap(x-1, y, 1);
+                }
+            }
+            return;
+        }
+        if (world.getForeMap(x, y) == 66) {
+            if (world.getForeMap(x, y+1)==0 || (world.getForeMap(x, y+1)>=65 && world.getForeMap(x, y+1)<=67) ||
+                    (!Items.BLOCKS.getValueAt(world.getForeMap(x, y+1)).collision && !Items.isFluid(world.getForeMap(x, y+1)))) {
+                world.setForeMap(x,y+1,64);
+                updateBlock(x, y+2);
+            } else if (Items.isWater(world.getForeMap(x, y+1))) {
+                world.setForeMap(x, y+1, 1);
+            } else if (Items.BLOCKS.getValueAt(world.getForeMap(x, y+1)).collision) {
+                if (world.getForeMap(x+1, y)==0 ||
+                        (!Items.BLOCKS.getValueAt(world.getForeMap(x+1, y)).collision && !Items.isFluid(world.getForeMap(x+1, y))) ){
+                    world.setForeMap(x+1,y,67);
+                    updateBlock(x+1, y+1);
+                } else if (Items.isWater(world.getForeMap(x+1, y))) {
+                    world.setForeMap(x+1, y, 1);
+                }
+
+                if (world.getForeMap(x-1, y)==0 ||
+                        (!Items.BLOCKS.getValueAt(world.getForeMap(x-1, y)).collision && !Items.isFluid(world.getForeMap(x-1, y))) ){
+                    world.setForeMap(x-1,y,67);
+                    updateBlock(x-1, y+1);
+                } else if (Items.isWater(world.getForeMap(x-1, y))) {
+                    world.setForeMap(x-1, y, 1);
+                }
+            }
+            return;
+        }
+        if (world.getForeMap(x, y) == 67) {
+            if (world.getForeMap(x, y+1)==0 || (world.getForeMap(x, y+1)>=65 && world.getForeMap(x, y+1)<=67) ||
+                    (!Items.BLOCKS.getValueAt(world.getForeMap(x, y+1)).collision && !Items.isFluid(world.getForeMap(x, y+1)))) {
+                world.setForeMap(x,y+1,64);
+                updateBlock(x, y+2);
+            } else if (Items.isWater(world.getForeMap(x, y+1))) {
+                world.setForeMap(x, y+1, 1);
+            }
+            return;
+        }
+    }
+
+    private void updateBlock(int x, int y) {
+        if (world.getForeMap(x, y) == 10) {
+            if (world.getForeMap(x, y+1)==0 || !Items.BLOCKS.getValueAt(world.getForeMap(x,y+1)).collision) {
+                world.setForeMap(x, y, 0);
+                mobs.add(new FallingSand(x*16, y*16));
+                updateBlock(x, y-1);
+            }
+        }
+
+        if (world.getForeMap(x, y) == 11) {
+            if (world.getForeMap(x, y+1)==0 || !Items.BLOCKS.getValueAt(world.getForeMap(x,y+1)).collision) {
+                world.setForeMap(x, y, 0);
+                mobs.add(new FallingGravel(x*16, y*16));
+                updateBlock(x, y-1);
+            }
+        }
+
+        if (world.getForeMap(x, y) == 59) {
+            if (world.getForeMap(x, y+1)==0 || !Items.BLOCKS.getValueAt(world.getForeMap(x, y+1)).collision) {
+                world.setForeMap(x,y,0);
+                updateBlock(x, y-1);
+            }
+        }
+
+        if (world.getForeMap(x, y) == 2) {
+            if (world.getForeMap(x, y-1)>0 && (Items.BLOCKS.getValueAt(world.getForeMap(x, y-1)).collision ||
+                    Items.isFluid(world.getForeMap(x, y-1)))) {
+                world.setForeMap(x, y, 3);
+            }
+        }
+    }
+
     public void update(float delta) {
         RUN_TIME += delta;
 
+        if (DO_UPD) {
+            for (int y=UPD_Y; y<UPD_Y+16; y++)
+                for (int x=UPD_X; x<UPD_X+16; x++) {
+                    updateBlock(x, y);
+                }
+            DO_UPD = false;
+        }
+
+        for (int y=0; y<world.getHeight(); y++) {
+            for (int x=(int)renderer.camera.position.x/16-1; x<(int)(renderer.camera.position.x+renderer.camera.viewportWidth)/16+1; x++) {
+                updateFluids(x, y);
+            }
+        }
+
+        updateFluids(FUPD_X, FUPD_Y);
+        FUPD_X++;
+        if (FUPD_X>=(int)(renderer.camera.position.x+renderer.camera.viewportWidth)/16+1) {
+            FUPD_X = (int) renderer.camera.position.x / 16 - 1;
+            FUPD_Y++;
+            if (FUPD_Y>=(int)(renderer.camera.position.y+renderer.camera.viewportHeight)/16+1) {
+                FUPD_Y = (int) renderer.camera.position.y / 16 - 1;
+            }
+        }
+
         physics.update(delta);
         moveCursor();
         checkCursorBounds();
@@ -121,8 +408,7 @@ public class GameProc implements Serializable{
             if (touchDownButton== Input.Buttons.RIGHT) {
                 world.placeToBackground(cursorX, cursorY,
                         player.inventory[invSlot]);
-            } else if (touchDownButton==Input.Buttons.LEFT &&
-                    touchDownY< Assets.invBar.getRegionHeight() &&
+            } else if (touchDownY< Assets.invBar.getRegionHeight() &&
                     touchDownX>renderer.camera.viewportWidth/2-Assets.invBar.getRegionWidth()/2 &&
                     touchDownX<renderer.camera.viewportWidth/2+Assets.invBar.getRegionWidth()/2) {
                 CaveGame.STATE = AppState.GAME_CREATIVE_INV;