X-Git-Url: http://deadsoftware.ru/gitweb?a=blobdiff_plain;f=core%2Fsrc%2Fru%2Fdeadsoftware%2Fcavedroid%2Fgame%2Fmobs%2Fplayer%2FPlayer.java;h=f454b0c4d05a978e3a88d4387710d7535905e718;hb=91283c3181af9700e20b5600f4e9017e0c31d33a;hp=5fcfe319b80f886499cb42f17e53f7d29db5f5db;hpb=398c9c46a58db1b26f502f9a55956ba03b90deaf;p=cavedroid.git diff --git a/core/src/ru/deadsoftware/cavedroid/game/mobs/player/Player.java b/core/src/ru/deadsoftware/cavedroid/game/mobs/player/Player.java index 5fcfe31..f454b0c 100644 --- a/core/src/ru/deadsoftware/cavedroid/game/mobs/player/Player.java +++ b/core/src/ru/deadsoftware/cavedroid/game/mobs/player/Player.java @@ -4,13 +4,16 @@ 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.DropController; +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; @@ -21,6 +24,8 @@ 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; @@ -33,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; @@ -151,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; @@ -188,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; @@ -385,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()) { @@ -403,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; + } }