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 bcca82606eb711dea6add8f9003243a7e0b94d52..9aa503f917a1daec0fa0d92482d7bf377b06cb32 100644 (file)
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 org.jetbrains.annotations.Nullable;
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;
import ru.deadsoftware.cavedroid.misc.utils.SpriteUtilsKt;
-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;
private float hitAnim = 0f;
private float hitAnimDelta = ANIMATION_SPEED;
- public final Inventory inventory;
+ public Inventory inventory;
public int gameMode;
public boolean swim;
public int cursorX = 0;
public int cursorY = 0;
- @CheckForNull
+ @Nullable
private Vector2 spawnPoint = null;
public ControlMode controlMode = ControlMode.WALK;
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) {
}
}
+ public void dropCurrentItem(DropController dropController) {
+ final InventoryItem activeItem = inventory.getActiveItem();
+
+ }
+
private Vector2 getSpawnPoint(GameWorld gameWorld, GameItemsHolder itemsHolder) {
if (spawnPoint != null) {
return spawnPoint;
@Override
public void jump() {
+ if (!canJump()) {
+ if (gameMode == 1) {
+ if (isFlyMode()) {
+ setFlyMode(false);
+ } else {
+ getVelocity().y = 0f;
+ setFlyMode(true);
+ }
+ }
+ return;
+ }
mVelocity.y = JUMP_VELOCITY;
}
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;
}
@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;
final Block foregroundBlock = gameWorld.getForeMap(cursorX, cursorY);
final Block backgroundBlock = gameWorld.getBackMap(cursorX, cursorY);
- @CheckForNull final Block target;
+ @Nullable final Block target;
if (checkBlockCanBeHit(foregroundBlock)) {
target = foregroundBlock;
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();
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()) {
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;
+ }
}