DEADSOFTWARE

Prettier world + ores
[cavedroid.git] / core / src / ru / deadsoftware / cavedroid / game / mobs / Player.java
index 46cb8cd1fc250d8fab4582ba23cad5e67e19b114..b369f1ccc7f37613d9b90ec0d863a5530a7a7563 100644 (file)
@@ -22,7 +22,7 @@ public class Player extends Mob {
     private static final float JUMP_VELOCITY = -133.332f;
     private static final int MAX_HEALTH = 20;
 
-    private boolean hitting = false;
+    private boolean hitting = false, hittingWithDamage = false;
     private float hitAnim = 0f;
     private float hitAnimDelta = ANIMATION_SPEED;
 
@@ -36,10 +36,20 @@ public class Player extends Mob {
     public int cursorX = 0;
     public int cursorY = 0;
 
+    @CheckForNull
+    private Vector2 spawnPoint = null;
+
+    public ControlMode controlMode = ControlMode.WALK;
+
+    public enum ControlMode {
+        WALK,
+        CURSOR
+    }
+
     public Player(GameItemsHolder gameItemsHolder) {
         super(0, 0, 4, 30, randomDir(), Type.MOB, MAX_HEALTH);
-        inventory = new InventoryItem[9];
-        for (int i = 0; i < 9; i++) {
+        inventory = new InventoryItem[36];
+        for (int i = 0; i < inventory.length; i++) {
             inventory[i] = gameItemsHolder.getFallbackItem().toInventoryItem();
         }
         swim = false;
@@ -65,9 +75,33 @@ public class Player extends Mob {
         heal(MAX_HEALTH);
     }
 
+    public void decreaseCurrentItemCount(GameItemsHolder gameItemsHolder) {
+        if (gameMode == 1) {
+            return;
+        }
+        getCurrentItem().setAmount(getCurrentItem().getAmount() - 1);
+        if (getCurrentItem().getAmount() <= 0) {
+            setCurrentInventorySlotItem(gameItemsHolder.getFallbackItem());
+        }
+    }
+
+    public InventoryItem getCurrentItem() {
+        return inventory[slot];
+    }
+
     public void pickUpDrop(Drop drop) {
+        for (InventoryItem invItem : inventory) {
+            if (!invItem.getItem().isTool()
+                    && invItem.getItem() == drop.getItem()
+                    && invItem.getAmount() < invItem.getItem().getParams().getMaxStack()) {
+                invItem.setAmount(invItem.getAmount() + 1);
+                drop.setPickedUp(true);
+                return;
+            }
+        }
+
         for (int i = 0; i < inventory.length; i++) {
-            if (inventory(i) == null || inventory(i).getParams().getKey().equals(GameItemsHolder.FALLBACK_ITEM_KEY) || inventory(i) == drop.getItem()) {
+            if (inventory(i) == null || inventory(i).getParams().getKey().equals(GameItemsHolder.FALLBACK_ITEM_KEY)) {
                 inventory[i] = drop.getItem().toInventoryItem();
                 drop.setPickedUp(true);
                 break;
@@ -76,18 +110,30 @@ public class Player extends Mob {
     }
 
     private Vector2 getSpawnPoint(GameWorld gameWorld, GameItemsHolder itemsHolder) {
-        int y;
-        for (y = 0; y < gameWorld.getHeight(); y++) {
-            if (y == gameWorld.getHeight() - 1) {
-                y = 60;
-                gameWorld.setForeMap(0, y, itemsHolder.getBlock("grass"));
+        if (spawnPoint != null) {
+            return spawnPoint;
+        }
+
+        int y, x = gameWorld.getWidth() / 2;
+        for (y = 0; y <= gameWorld.getWorldConfig().getSeaLevel(); y++) {
+            if (y == gameWorld.getWorldConfig().getSeaLevel()) {
+                for (x = 0; x < gameWorld.getWidth(); x++) {
+                    if (gameWorld.getForeMap(x, y).getParams().getHasCollision()) {
+                        break;
+                    }
+                    if (x == gameWorld.getWidth() - 1) {
+                        gameWorld.setForeMap(x, y, itemsHolder.getBlock("grass"));
+                        break;
+                    }
+                }
                 break;
             }
-            if (gameWorld.hasForeAt(0, y) && gameWorld.getForeMap(0, y).hasCollision()) {
+            if (gameWorld.hasForeAt(x, y) && gameWorld.getForeMap(x, y).hasCollision()) {
                 break;
             }
         }
-        return new Vector2(8 - getWidth() / 2, (float) y * 16 - getHeight());
+        spawnPoint = new Vector2(x * 16 + 8 - getWidth() / 2, (float) y * 16 - getHeight());
+        return spawnPoint;
     }
 
     public void setDir(Direction dir) {
@@ -110,8 +156,42 @@ public class Player extends Mob {
         mVelocity.y = JUMP_VELOCITY;
     }
 
+    private void hitBlock(GameWorld gameWorld, GameItemsHolder gameItemsHolder) {
+        if (!hitting || !hittingWithDamage) {
+            return;
+        }
+
+        final Block foregroundBlock = gameWorld.getForeMap(cursorX, cursorY);
+        final Block backgroundBlock = gameWorld.getBackMap(cursorX, cursorY);
+
+        if ((!foregroundBlock.isNone() && foregroundBlock.getParams().getHitPoints() >= 0) ||
+                (foregroundBlock.isNone() && !backgroundBlock.isNone() && backgroundBlock.getParams().getHitPoints() >= 0)) {
+            if (gameMode == 0) {
+                if (!foregroundBlock.isNone() && blockDamage >= foregroundBlock.getParams().getHitPoints()) {
+                    gameWorld.destroyForeMap(cursorX, cursorY);
+                    blockDamage = 0;
+                } else if (!backgroundBlock.isNone() && blockDamage >= backgroundBlock.getParams().getHitPoints()) {
+                    gameWorld.destroyBackMap(cursorX, cursorY);
+                    blockDamage = 0;
+                }
+            } else {
+                if (!foregroundBlock.isNone()) {
+                    gameWorld.placeToForeground(cursorX, cursorY, gameItemsHolder.getFallbackBlock());
+                } else if (!backgroundBlock.isNone()) {
+                    gameWorld.placeToBackground(cursorX, cursorY, gameItemsHolder.getFallbackBlock());
+                }
+                stopHitting();
+            }
+        } else {
+            stopHitting();
+        }
+    }
+
     @Override
     public void ai(GameWorld gameWorld, GameItemsHolder gameItemsHolder, float delta) {
+        updateAnimation(delta);
+        hitBlock(gameWorld, gameItemsHolder);
+
         if (gameMode == 1) {
             return;
         }
@@ -140,7 +220,7 @@ public class Player extends Mob {
             multiplier *= ((Item.Tool)currentItem).getBlockDamageMultiplier();
         }
 
-        if (hitting && canHitBlock) {
+        if (hitting && hittingWithDamage && canHitBlock) {
             blockDamage += 60f * delta * multiplier;
         } else {
             blockDamage = 0f;
@@ -156,6 +236,11 @@ public class Player extends Mob {
         if (gameMode == 1) {
             return;
         }
+
+        if (damage > 0) {
+            getVelocity().y += JUMP_VELOCITY / 3f;
+        }
+
         super.damage(damage);
     }
 
@@ -177,6 +262,9 @@ public class Player extends Mob {
         final Sprite sprite = item.getSprite();
         final boolean smallSprite = !item.isTool() || item.isShears();
 
+        final float originalWidth = sprite.getWidth();
+        final float originalHeight = sprite.getHeight();
+
         if (smallSprite) {
             sprite.setSize(Drop.DROP_SIZE, Drop.DROP_SIZE);
         }
@@ -205,27 +293,35 @@ public class Player extends Mob {
             SpriteUtilsKt.applyOrigin(sprite, spriteOrigin);
         }
 
-        SpriteUtilsKt.drawSprite(spriteBatch, sprite, itemX, itemY, -handMultiplier * rotate);
+        sprite.setRotation(-handMultiplier * rotate);
+        sprite.setPosition(itemX, itemY);
+        sprite.draw(spriteBatch);
 
         // dont forget to reset
         sprite.setFlip(false, sprite.isFlipY());
         sprite.setRotation(0);
         sprite.setOriginCenter();
+        sprite.setSize(originalWidth, originalHeight);
         if (item.isTool()) {
             sprite.rotate90(looksRight());
         }
     }
 
-    public void startHitting() {
+    public void startHitting(boolean withDamage) {
         if (hitting) {
             return;
         }
 
         hitting = true;
+        hittingWithDamage = withDamage;
         hitAnim = 90f;
         hitAnimDelta = ANIMATION_SPEED;
     }
 
+    public void startHitting() {
+        startHitting(true);
+    }
+
     public void stopHitting() {
         blockDamage = 0f;
         hitting = false;
@@ -256,8 +352,6 @@ public class Player extends Mob {
 
     @Override
     public void draw(SpriteBatch spriteBatch, float x, float y, float delta) {
-        updateAnimation(delta);
-
         final Sprite backHand = Assets.playerSprite[1][2];
         final Sprite backLeg = Assets.playerSprite[1][3];
         final Sprite frontLeg = Assets.playerSprite[0][3];