DEADSOFTWARE

Remove java serialization
[cavedroid.git] / core / src / ru / deadsoftware / cavedroid / game / mobs / player / Player.java
index dcc77ef81202b4bb6e96018b3651b348b3aeb1f1..f454b0c4d05a978e3a88d4387710d7535905e718 100644 (file)
@@ -4,12 +4,17 @@ import com.badlogic.gdx.graphics.g2d.Sprite;
 import com.badlogic.gdx.graphics.g2d.SpriteBatch;
 import com.badlogic.gdx.math.MathUtils;
 import com.badlogic.gdx.math.Vector2;
+import org.jetbrains.annotations.NotNull;
 import ru.deadsoftware.cavedroid.game.GameItemsHolder;
 import ru.deadsoftware.cavedroid.game.mobs.Mob;
+import ru.deadsoftware.cavedroid.game.mobs.MobsController;
 import ru.deadsoftware.cavedroid.game.model.block.Block;
+import ru.deadsoftware.cavedroid.game.model.dto.SaveDataDto;
 import ru.deadsoftware.cavedroid.game.model.item.InventoryItem;
 import ru.deadsoftware.cavedroid.game.model.item.Item;
-import ru.deadsoftware.cavedroid.game.objects.Drop;
+import ru.deadsoftware.cavedroid.game.objects.drop.Drop;
+import ru.deadsoftware.cavedroid.game.objects.drop.DropController;
+import ru.deadsoftware.cavedroid.game.ui.TooltipManager;
 import ru.deadsoftware.cavedroid.game.world.GameWorld;
 import ru.deadsoftware.cavedroid.misc.Assets;
 import ru.deadsoftware.cavedroid.misc.utils.SpriteOrigin;
@@ -19,8 +24,11 @@ import javax.annotation.CheckForNull;
 
 public class Player extends Mob {
 
+    private static final int SAVE_DATA_VERSION = 1;
+
     private static final float SPEED = 69.072f;
     private static final float JUMP_VELOCITY = -133.332f;
+    private static final int SURVIVAL_CURSOR_RANGE = 4;
 
     public static final int MAX_HEALTH = 20;
     public static final int INVENTORY_SIZE = 36;
@@ -30,7 +38,7 @@ public class Player extends Mob {
     private float hitAnim = 0f;
     private float hitAnimDelta = ANIMATION_SPEED;
 
-    public final Inventory inventory;
+    public Inventory inventory;
 
     public int gameMode;
     public boolean swim;
@@ -50,14 +58,14 @@ public class Player extends Mob {
         CURSOR
     }
 
-    public Player(GameItemsHolder gameItemsHolder) {
+    public Player(GameItemsHolder gameItemsHolder, TooltipManager tooltipManager) {
         super(0, 0, 4, 30, randomDir(), Type.MOB, MAX_HEALTH);
-        inventory = new Inventory(INVENTORY_SIZE, HOTBAR_SIZE, gameItemsHolder);
+        inventory = new Inventory(INVENTORY_SIZE, HOTBAR_SIZE, gameItemsHolder, tooltipManager);
         swim = false;
     }
 
-    public void initInventory(GameItemsHolder gameItemsHolder) {
-        inventory.initItems(gameItemsHolder);
+    public void initInventory(GameItemsHolder gameItemsHolder, TooltipManager tooltipManager) {
+        inventory.initItems(gameItemsHolder, tooltipManager);
     }
 
     public void respawn(GameWorld gameWorld, GameItemsHolder itemsHolder) {
@@ -81,6 +89,11 @@ public class Player extends Mob {
         }
     }
 
+    public void dropCurrentItem(DropController dropController) {
+        final InventoryItem activeItem = inventory.getActiveItem();
+
+    }
+
     private Vector2 getSpawnPoint(GameWorld gameWorld, GameItemsHolder itemsHolder) {
         if (spawnPoint != null) {
             return spawnPoint;
@@ -125,6 +138,17 @@ public class Player extends Mob {
 
     @Override
     public void jump() {
+        if (!canJump()) {
+            if (gameMode == 1) {
+                if (isFlyMode()) {
+                    setFlyMode(false);
+                } else {
+                    getVelocity().y = 0f;
+                    setFlyMode(true);
+                }
+            }
+            return;
+        }
         mVelocity.y = JUMP_VELOCITY;
     }
 
@@ -132,6 +156,29 @@ public class Player extends Mob {
         return !block.isNone() && block.getParams().getHitPoints() >= 0;
     }
 
+    /**
+     * @return true if any mob fas hit
+     */
+    private boolean hitMobs(GameItemsHolder gameItemsHolder, MobsController mobsController) {
+        if (!hitting || !hittingWithDamage) {
+            return false;
+        }
+
+        boolean result = false;
+        for (Mob mob : mobsController.getMobs()) {
+            if (overlaps(mob.getHitBox())) {
+                final Item activeItem = inventory.getActiveItem().getItem();
+                final Item.Tool tool = activeItem.isTool() ? (Item.Tool) activeItem : null;
+                if (tool != null) {
+                    decreaseCurrentItemCount(gameItemsHolder);
+                }
+                result = true;
+                mob.damage(MathUtils.floor(tool != null ? tool.getMobDamageMultiplier() : 1));
+            }
+        }
+        return result;
+    }
+
     private void hitBlock(GameWorld gameWorld, GameItemsHolder gameItemsHolder) {
         if (!hitting || !hittingWithDamage) {
             return;
@@ -169,9 +216,14 @@ public class Player extends Mob {
     }
 
     @Override
-    public void ai(GameWorld gameWorld, GameItemsHolder gameItemsHolder, float delta) {
+    public void ai(GameWorld gameWorld, GameItemsHolder gameItemsHolder, MobsController mobsController, float delta) {
         updateAnimation(delta);
-        hitBlock(gameWorld, gameItemsHolder);
+
+        if (!hitMobs(gameItemsHolder, mobsController)) {
+            hitBlock(gameWorld, gameItemsHolder);
+        } else {
+            stopHitting();
+        }
 
         if (gameMode == 1) {
             return;
@@ -233,6 +285,20 @@ public class Player extends Mob {
         super.heal(heal);
     }
 
+    public void checkCursorBounds(GameWorld gameWorld) {
+        if (gameMode == 0) {
+            int minCursorX = getMapX() - SURVIVAL_CURSOR_RANGE;
+            int maxCursorX = getMapX() + SURVIVAL_CURSOR_RANGE;
+            int minCursorY = getMiddleMapY() - SURVIVAL_CURSOR_RANGE;
+            int maxCursorY = getMiddleMapY() + SURVIVAL_CURSOR_RANGE;
+
+            cursorX = MathUtils.clamp(cursorX, minCursorX, maxCursorX);
+            cursorY = MathUtils.clamp(cursorY, minCursorY, maxCursorY);
+        }
+
+        cursorY = MathUtils.clamp(cursorY, 0, gameWorld.getHeight() - 1);
+    }
+
     private void drawItem(SpriteBatch spriteBatch, float x, float y, float anim) {
         final Item item = inventory.getActiveItem().getItem();
 
@@ -352,6 +418,13 @@ public class Player extends Mob {
             frontHandAnim = -rightHandAnim;
         }
 
+        backHand.setColor(getTintColor());
+        backLeg.setColor(getTintColor());
+        frontLeg.setColor(getTintColor());
+        head.setColor(getTintColor());
+        body.setColor(getTintColor());
+        frontHand.setColor(getTintColor());
+
         SpriteUtilsKt.drawSprite(spriteBatch, backHand, x + 2, y + 8, backHandAnim);
 
         if (looksLeft()) {
@@ -370,4 +443,79 @@ public class Player extends Mob {
         SpriteUtilsKt.drawSprite(spriteBatch, frontHand, x + 2, y + 8, frontHandAnim);
     }
 
+    @NotNull
+    @Override
+    public SaveDataDto.PlayerSaveData getSaveData() {
+        return new SaveDataDto.PlayerSaveData(
+                SAVE_DATA_VERSION,
+                mType,
+                mAnimDelta,
+                mAnim,
+                mDirection,
+                mDead,
+                mCanJump,
+                mFlyMode,
+                mMaxHealth,
+                mHealth,
+                x,
+                y,
+                width,
+                height,
+                getVelocity().x,
+                getVelocity().y,
+                hitting,
+                hittingWithDamage,
+                hitAnim,
+                hitAnimDelta,
+                inventory.getSaveData(),
+                gameMode,
+                swim,
+                headRotation,
+                blockDamage,
+                cursorX,
+                cursorY,
+                spawnPoint != null ? spawnPoint.x : 0f,
+                spawnPoint != null ? spawnPoint.y : 0f,
+                controlMode
+        );
+    }
+
+    public static Player fromSaveData(
+            SaveDataDto.PlayerSaveData saveData,
+            GameItemsHolder gameItemsHolder,
+            TooltipManager tooltipManager
+    ) {
+        saveData.verifyVersion(SAVE_DATA_VERSION);
+
+        Player player = new Player(gameItemsHolder, tooltipManager);
+
+        player.mType = saveData.getType();
+        player.mAnimDelta = saveData.getAnimDelta();
+        player.mAnim = saveData.getAnim();
+        player.mDirection = saveData.getDirection();
+        player.mDead = saveData.getDead();
+        player.mCanJump = saveData.getCanJump();
+        player.mFlyMode = saveData.getFlyMode();
+        player.mMaxHealth = saveData.getMaxHealth();
+        player.mHealth = saveData.getHealth();
+        player.x = saveData.getX();
+        player.y = saveData.getY();
+        player.width = saveData.getWidth();
+        player.height = saveData.getHeight();
+        player.hitting = saveData.getHitting();
+        player.hittingWithDamage = saveData.getHittingWithDamage();
+        player.hitAnim = saveData.getHitAnim();
+        player.hitAnimDelta = saveData.getHitAnimDelta();
+        player.inventory = Inventory.Companion.fromSaveData(saveData.getInventory(), gameItemsHolder, tooltipManager);
+        player.gameMode = saveData.getGameMode();
+        player.swim = saveData.getSwim();
+        player.headRotation = saveData.getHeadRotation();
+        player.blockDamage = saveData.getBlockDamage();
+        player.cursorX = saveData.getCursorX();
+        player.cursorY = saveData.getCursorY();
+        player.spawnPoint = new Vector2(saveData.getSpawnPointX(), saveData.getSpawnPointY());
+        player.controlMode = saveData.getControlMode();
+
+        return player;
+    }
 }