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=bcca82606eb711dea6add8f9003243a7e0b94d52;hpb=c1b8f5c93482cb9933dd608c48f41622ce2994c6;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 bcca826..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,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,10 +24,13 @@ 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 MAX_HEALTH = 20; + private static final int SURVIVAL_CURSOR_RANGE = 4; + public static final int MAX_HEALTH = 20; public static final int INVENTORY_SIZE = 36; public static final int HOTBAR_SIZE = 9; @@ -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; + } }