DEADSOFTWARE

Add crafting
[cavedroid.git] / core / src / ru / deadsoftware / cavedroid / game / mobs / Player.java
index 83f3257d86b027c21bb03e4fcb29d6ed8e18d81f..0e8af6e0eed0407b1cc3a4be057ae2dc344f5b87 100644 (file)
@@ -15,6 +15,7 @@ import ru.deadsoftware.cavedroid.misc.utils.SpriteOrigin;
 import ru.deadsoftware.cavedroid.misc.utils.SpriteUtilsKt;
 
 import javax.annotation.CheckForNull;
+import java.util.ArrayList;
 
 public class Player extends Mob {
 
@@ -26,7 +27,7 @@ public class Player extends Mob {
     private float hitAnim = 0f;
     private float hitAnimDelta = ANIMATION_SPEED;
 
-    public final InventoryItem[] inventory;
+    public final ArrayList<InventoryItem> inventory;
     public int slot;
     public int gameMode;
     public boolean swim;
@@ -36,6 +37,9 @@ 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 {
@@ -45,9 +49,9 @@ public class Player extends Mob {
 
     public Player(GameItemsHolder gameItemsHolder) {
         super(0, 0, 4, 30, randomDir(), Type.MOB, MAX_HEALTH);
-        inventory = new InventoryItem[36];
-        for (int i = 0; i < inventory.length; i++) {
-            inventory[i] = gameItemsHolder.getFallbackItem().toInventoryItem();
+        inventory = new ArrayList<>(36);
+        for (int i = 0; i < 36; i++) {
+            inventory.add(gameItemsHolder.getFallbackItem().toInventoryItem());
         }
         swim = false;
     }
@@ -60,7 +64,7 @@ public class Player extends Mob {
 
     @CheckForNull
     public Item inventory(int i) {
-        return inventory[i].getItem();
+        return inventory.get(i).getItem();
     }
     
     public void respawn(GameWorld gameWorld, GameItemsHolder itemsHolder) {
@@ -83,7 +87,7 @@ public class Player extends Mob {
     }
 
     public InventoryItem getCurrentItem() {
-        return inventory[slot];
+        return inventory.get(slot);
     }
 
     public void pickUpDrop(Drop drop) {
@@ -97,9 +101,9 @@ public class Player extends Mob {
             }
         }
 
-        for (int i = 0; i < inventory.length; i++) {
+        for (int i = 0; i < inventory.size(); i++) {
             if (inventory(i) == null || inventory(i).getParams().getKey().equals(GameItemsHolder.FALLBACK_ITEM_KEY)) {
-                inventory[i] = drop.getItem().toInventoryItem();
+                inventory.set(i, drop.getItem().toInventoryItem());
                 drop.setPickedUp(true);
                 break;
             }
@@ -107,18 +111,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) {
@@ -128,7 +144,7 @@ public class Player extends Mob {
     }
 
     public void setCurrentInventorySlotItem(Item item) {
-        inventory[slot] = item.toInventoryItem();
+        inventory.set(slot, item.toInventoryItem());
     }
 
     @Override
@@ -196,7 +212,7 @@ public class Player extends Mob {
         final boolean canHitBlock = target != null;
 
         float multiplier = 1f;
-        final Item currentItem = inventory[slot].getItem();
+        final Item currentItem = inventory.get(slot).getItem();
         if (currentItem instanceof Item.Tool && canHitBlock) {
             if (target.getParams().getToolType() == currentItem.getClass()
                     && ((Item.Tool)currentItem).getLevel() >= target.getParams().getToolLevel()) {
@@ -247,6 +263,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);
         }
@@ -275,12 +294,15 @@ 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());
         }