DEADSOFTWARE

Add player health
[cavedroid.git] / core / src / ru / deadsoftware / cavedroid / game / mobs / Player.java
1 package ru.deadsoftware.cavedroid.game.mobs;
3 import com.badlogic.gdx.graphics.g2d.Sprite;
4 import com.badlogic.gdx.graphics.g2d.SpriteBatch;
5 import com.badlogic.gdx.math.MathUtils;
6 import com.badlogic.gdx.math.Vector2;
7 import ru.deadsoftware.cavedroid.game.GameItems;
8 import ru.deadsoftware.cavedroid.game.objects.Drop;
9 import ru.deadsoftware.cavedroid.game.objects.Item;
10 import ru.deadsoftware.cavedroid.game.world.GameWorld;
11 import ru.deadsoftware.cavedroid.misc.Assets;
12 import ru.deadsoftware.cavedroid.misc.utils.SpriteOrigin;
13 import ru.deadsoftware.cavedroid.misc.utils.SpriteUtilsKt;
15 import javax.annotation.CheckForNull;
17 public class Player extends Mob {
19 private static final float SPEED = 69.072f;
20 private static final float JUMP_VELOCITY = -133.332f;
21 private static final int MAX_HEALTH = 20;
23 private boolean hitting = false;
24 private float hitAnim = 0f;
25 private float hitAnimDelta = ANIMATION_SPEED;
27 public final int[] inventory;
28 public int slot;
29 public final int gameMode;
30 public boolean swim;
31 public float headRotation = 0f;
33 public Player() {
34 super(0, 0, 4, 30, randomDir(), Type.MOB, MAX_HEALTH);
35 this.gameMode = 1;
36 inventory = new int[9];
37 swim = false;
38 }
40 public void respawn(GameWorld gameWorld) {
41 Vector2 pos = getSpawnPoint(gameWorld);
42 this.x = pos.x;
43 this.y = pos.y;
44 mVelocity.setZero();
45 mDead = false;
46 heal(MAX_HEALTH);
47 }
49 public void pickUpDrop(Drop drop) {
50 for (int i = 0; i < inventory.length; i++) {
51 if (inventory[i] == 0 || inventory[i] == drop.getId()) {
52 inventory[i] = drop.getId();
53 drop.setPickedUp(true);
54 break;
55 }
56 }
57 }
59 private Vector2 getSpawnPoint(GameWorld gameWorld) {
60 int y;
61 for (y = 0; y < gameWorld.getHeight(); y++) {
62 if (y == gameWorld.getHeight() - 1) {
63 y = 60;
64 gameWorld.setForeMap(0, y, 1);
65 break;
66 }
67 if (gameWorld.hasForeAt(0, y) && gameWorld.getForeMapBlock(0, y).hasCollision()) {
68 break;
69 }
70 }
71 return new Vector2(8 - getWidth() / 2, (float) y * 16 - getHeight());
72 }
74 public void setDir(Direction dir) {
75 if (dir != getDirection()) {
76 switchDir();
77 }
78 }
80 @Override
81 public float getSpeed() {
82 return SPEED;
83 }
85 @Override
86 public void jump() {
87 mVelocity.y = JUMP_VELOCITY;
88 }
90 @Override
91 public void ai(GameWorld gameWorld, float delta) {
92 }
94 @Override
95 public void changeDir() {
96 }
98 @Override
99 public void damage(int damage) {
100 if (gameMode == 1) {
101 return;
103 super.damage(damage);
106 @Override
107 public void heal(int heal) {
108 if (gameMode == 1) {
109 return;
111 super.heal(heal);
114 private void drawItem(SpriteBatch spriteBatch, float x, float y, float anim) {
115 final int itemId = inventory[slot];
116 final Item item = GameItems.getItem(itemId);
118 @CheckForNull final Sprite sprite = item.isBlock()
119 ? item.toBlock().getTexture()
120 : item.getSprite();
122 if (sprite == null) {
123 return;
126 if (!item.isTool()) {
127 sprite.setSize(Drop.DROP_SIZE, Drop.DROP_SIZE);
130 final float handLength = Assets.playerSprite[0][2].getHeight();
132 final SpriteOrigin spriteOrigin = item.getDefaultOrigin();
133 final int handMultiplier = -getDirection().getBasis();
134 final float xOffset = (-1 + getDirection().getIndex()) * sprite.getWidth() + 4 + handMultiplier * (sprite.getWidth() * spriteOrigin.getX());
135 final float yOffset = item.isTool() ? -sprite.getHeight() / 2 : 0;
137 float rotate = anim + 30;
139 final float itemX = x + handLength * MathUtils.sin(handMultiplier * anim * MathUtils.degRad) + xOffset;
140 final float itemY = y + handLength * MathUtils.cos(handMultiplier * anim * MathUtils.degRad) + yOffset;
142 if (looksLeft()) {
143 sprite.setFlip(true, sprite.isFlipY());
144 SpriteUtilsKt.applyOrigin(sprite, spriteOrigin.getFlipped(true, false));
145 } else {
146 sprite.setFlip(false, sprite.isFlipY());
147 SpriteUtilsKt.applyOrigin(sprite, spriteOrigin);
150 SpriteUtilsKt.drawSprite(spriteBatch, sprite, itemX, itemY, -handMultiplier * rotate);
152 // dont forget to reset
153 sprite.setFlip(false, sprite.isFlipY());
154 sprite.setRotation(0);
155 sprite.setOriginCenter();
158 public void startHitting() {
159 if (hitting) {
160 return;
163 hitting = true;
164 hitAnim = 90f;
165 hitAnimDelta = ANIMATION_SPEED;
168 public void stopHitting() {
169 hitting = false;
172 private float getRightHandAnim(float delta) {
173 hitAnim -= hitAnimDelta * delta;
175 if (hitAnim < 30f || hitAnim > 90f) {
176 if (hitting) {
177 hitAnimDelta = -hitAnimDelta;
178 } else {
179 hitAnimDelta = ANIMATION_SPEED;
183 if (!hitting) {
184 if (hitAnim < hitAnimDelta * delta) {
185 hitAnim = 0;
186 hitAnimDelta = 0;
187 return -mAnim;
191 return hitAnim;
194 @Override
195 public void draw(SpriteBatch spriteBatch, float x, float y, float delta) {
196 updateAnimation(delta);
198 final Sprite backHand = Assets.playerSprite[1][2];
199 final Sprite backLeg = Assets.playerSprite[1][3];
200 final Sprite frontLeg = Assets.playerSprite[0][3];
201 final Sprite head = Assets.playerSprite[getDirection().getIndex()][0];
202 final Sprite body = Assets.playerSprite[getDirection().getIndex()][1];
203 final Sprite frontHand = Assets.playerSprite[0][2];
205 float backHandAnim, frontHandAnim;
207 final float rightHandAnim = getRightHandAnim(delta);
209 if (looksLeft()) {
210 backHandAnim = rightHandAnim;
211 frontHandAnim = mAnim;
212 } else {
213 backHandAnim = -mAnim;
214 frontHandAnim = -rightHandAnim;
217 SpriteUtilsKt.drawSprite(spriteBatch, backHand, x + 2, y + 8, backHandAnim);
219 if (looksLeft()) {
220 drawItem(spriteBatch, x, y, -backHandAnim);
223 SpriteUtilsKt.drawSprite(spriteBatch, backLeg, x + 2, y + 20, mAnim);
224 SpriteUtilsKt.drawSprite(spriteBatch, frontLeg, x + 2, y + 20, -mAnim);
225 SpriteUtilsKt.drawSprite(spriteBatch, head, x, y, headRotation);
226 SpriteUtilsKt.drawSprite(spriteBatch, body, x + 2, y + 8);
228 if (looksRight()) {
229 drawItem(spriteBatch, x, y, frontHandAnim);
232 SpriteUtilsKt.drawSprite(spriteBatch, frontHand, x + 2, y + 8, frontHandAnim);