"tint": "#EDBFB4",
"action_key": "use_spawn_egg_pig",
"origin_x": 0.5
+ },
+ "porkchop_raw": {
+ "name": "Raw Porkchop",
+ "type": "food",
+ "texture": "porkchop_raw",
+ "heal": 3,
+ "smelt_product": "porkchop_cooked"
+ },
+ "porkchop_cooked": {
+ "name": "Raw Porkchop",
+ "type": "food",
+ "texture": "porkchop_cooked",
+ "heal": 8
}
}
}
import ru.deadsoftware.cavedroid.game.mobs.MobsController;
import ru.deadsoftware.cavedroid.game.mobs.player.Player;
import ru.deadsoftware.cavedroid.game.model.block.Block;
+import ru.deadsoftware.cavedroid.game.model.item.InventoryItem;
import ru.deadsoftware.cavedroid.game.objects.drop.Drop;
import ru.deadsoftware.cavedroid.game.objects.drop.DropController;
import ru.deadsoftware.cavedroid.game.world.GameWorld;
mob.ai(mGameWorld, mGameItemsHolder, mMobsController, delta);
mobPhy(mob, delta);
if (mob.isDead()) {
+ for (InventoryItem invItem : mob.getDrop(mGameItemsHolder)) {
+ mDropController.addDrop(mob.x, mob.y, invItem);
+ }
+
it.remove();
}
}
playerPhy(player, delta);
player.ai(mGameWorld, mGameItemsHolder, mMobsController, delta);
if (player.isDead()) {
+ for (InventoryItem invItem : player.inventory.getItems()) {
+ mDropController.addDrop(player.x, player.y, invItem);
+ }
+ player.inventory.clear();
player.respawn(mGameWorld, mGameItemsHolder);
}
}
import ru.deadsoftware.cavedroid.misc.annotations.multibinding.BindMouseInputHandler
import com.badlogic.gdx.Gdx
import com.badlogic.gdx.utils.Timer
+import ru.deadsoftware.cavedroid.game.GameItemsHolder
import ru.deadsoftware.cavedroid.game.GameScope
import ru.deadsoftware.cavedroid.game.GameUiWindow
import ru.deadsoftware.cavedroid.game.actions.placeToBackgroundAction
private val useBlockActionMap: Map<String, @JvmSuppressWildcards IUseBlockAction>,
private val gameWindowsManager: GameWindowsManager,
private val gameWorld: GameWorld,
+ private val gameItemsHolder: GameItemsHolder,
) : IMouseInputHandler {
private var buttonHoldTask: Timer.Task? = null
} else if (item is Item.Usable) {
useItemActionMap[item.useActionKey]?.perform(item, player.cursorX, player.cursorY)
?: Gdx.app.error(TAG, "use item action ${item.useActionKey} not found");
+ } else if (item is Item.Food && player.health < player.maxHealth) {
+ player.heal(item.heal)
+ player.decreaseCurrentItemCount(gameItemsHolder)
} else {
tryUseBlock()
}
import com.badlogic.gdx.math.Vector2;
import com.badlogic.gdx.utils.Timer;
import ru.deadsoftware.cavedroid.game.GameItemsHolder;
+import ru.deadsoftware.cavedroid.game.model.item.InventoryItem;
+import ru.deadsoftware.cavedroid.game.model.item.Item;
import ru.deadsoftware.cavedroid.game.world.GameWorld;
import javax.annotation.CheckForNull;
import java.io.Serializable;
+import java.util.Collections;
+import java.util.List;
/**
* Mob class.
/**
* Set's mob's dead variable to true and nothing else. It doesn't delete the
*/
- public final void kill() {
+ public void kill() {
mDead = true;
}
return mHealth;
}
+ public final int getMaxHealth() {
+ return mMaxHealth;
+ }
+
public final void attachToController(MobsController controller) {
controller.addMob(this);
}
return isTakingDamage() ? DAMAGE_TINT_COLOR : Color.WHITE;
}
+ public List<InventoryItem> getDrop(GameItemsHolder gameItemsHolder) {
+ return Collections.emptyList();
+ }
+
public abstract void draw(SpriteBatch spriteBatch, float x, float y, float delta);
public abstract void ai(GameWorld gameWorld, GameItemsHolder gameItemsHolder, MobsController mobsController, float delta);
--- /dev/null
+package ru.deadsoftware.cavedroid.game.mobs
+
+import com.badlogic.gdx.math.MathUtils
+import ru.deadsoftware.cavedroid.game.GameItemsHolder
+import ru.deadsoftware.cavedroid.game.world.GameWorld
+
+abstract class PeacefulMob(x: Float, y: Float, width: Float, height: Float, direction: Direction, maxHealth: Int, )
+ : Mob(x, y, width, height, direction, Type.MOB, maxHealth) {
+
+ override fun ai(world: GameWorld, gameItemsHolder: GameItemsHolder, mobsController: MobsController, delta: Float) {
+ if (MathUtils.randomBoolean(delta)) {
+ if (velocity.x != 0f) {
+ velocity.x = 0f
+ } else {
+ changeDir()
+ }
+ }
+ }
+
+}
\ No newline at end of file
package ru.deadsoftware.cavedroid.game.mobs
import com.badlogic.gdx.graphics.g2d.SpriteBatch
-import com.badlogic.gdx.math.MathUtils
import com.badlogic.gdx.math.Vector2
import ru.deadsoftware.cavedroid.game.GameItemsHolder
-import ru.deadsoftware.cavedroid.game.world.GameWorld
+import ru.deadsoftware.cavedroid.game.model.item.InventoryItem
import ru.deadsoftware.cavedroid.misc.utils.drawSprite
import ru.deadsoftware.cavedroid.misc.utils.mobs.MobSprites.Pig.getBackgroundLeg
import ru.deadsoftware.cavedroid.misc.utils.mobs.MobSprites.Pig.getBody
import ru.deadsoftware.cavedroid.misc.utils.mobs.MobSprites.Pig.getLegsRelativeY
import ru.deadsoftware.cavedroid.misc.utils.mobs.MobSprites.Pig.getRightLegRelativeX
-class Pig(x: Float, y: Float) : Mob(x, y, WIDTH, HEIGHT, randomDir(), Type.MOB, MAX_HEALTH) {
+class Pig(x: Float, y: Float) : PeacefulMob(x, y, WIDTH, HEIGHT, randomDir(), MAX_HEALTH) {
override fun getSpeed(): Float {
return SPEED
}
}
- override fun ai(world: GameWorld, gameItemsHolder: GameItemsHolder, mobsController: MobsController, delta: Float) {
- if (MathUtils.randomBoolean(delta)) {
- if (velocity.x != 0f) {
- velocity.x = 0f
- } else {
- changeDir()
- }
- }
+ override fun getDrop(gameItemsHolder: GameItemsHolder): List<InventoryItem> {
+ return listOf(gameItemsHolder.getItem("porkchop_raw").toInventoryItem())
}
override fun draw(spriteBatch: SpriteBatch, x: Float, y: Float, delta: Float) {
fun decreaseCurrentItemAmount(count: Int = 1) {
decreaseItemAmount(activeSlot, count)
}
+
+ fun clear() {
+ for (i in _items.indices) {
+ _items[i] = fallbackItem
+ }
+ }
}
\ No newline at end of file
@SerialName("tint") val tint: String? = null,
@SerialName("burning_time") val burningTime: Long? = null,
@SerialName("smelt_product") val smeltProduct: String? = null,
+ @SerialName("heal") val heal: Int? = null,
)
return this is Usable
}
+ fun isFood(): Boolean {
+ contract { returns(true) implies (this@Item is Food) }
+ return this is Food
+ }
+
@JvmOverloads
fun toInventoryItem(amount: Int = 1): InventoryItem {
return InventoryItem(this, amount)
override val level: Int,
) : Tool()
+ data class Food(
+ override val params: CommonItemParams,
+ override val sprite: Sprite,
+ val heal: Int,
+ ) : Item()
+
}
\ No newline at end of file
"shears" -> Shears(params, requireNotNull(loadSprite(dto)), dto.mobDamageMultiplier, dto.blockDamageMultiplier, requireNotNull(dto.toolLevel))
"block" -> Block(params, requireNotNull(block))
"slab" -> Slab(params, requireNotNull(slabTopBlock), requireNotNull(slabBottomBlock))
+ "food" -> Food(params, requireNotNull(loadSprite(dto)), requireNotNull(dto.heal))
"none" -> None(params)
else -> throw IllegalArgumentException("Unknown item type ${dto.type}")
}