Skip to content

Commit 7e16922

Browse files
author
Adam Arold
committed
Add food and hunger
1 parent 2db3a39 commit 7e16922

20 files changed

Lines changed: 247 additions & 19 deletions
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
package org.hexworks.cavesofzircon.attributes
2+
3+
import org.hexworks.amethyst.api.Attribute
4+
import org.hexworks.cobalt.databinding.api.createPropertyFrom
5+
6+
class EnergyLevel(initialEnergy: Int,
7+
val maxEnergy: Int) : Attribute {
8+
9+
var currentEnergy: Int
10+
get() = currentValueProperty.value
11+
set(value) {
12+
currentValueProperty.value = Math.min(value, maxEnergy)
13+
}
14+
15+
private val currentValueProperty = createPropertyFrom(initialEnergy)
16+
17+
}
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
package org.hexworks.cavesofzircon.attributes
2+
3+
import org.hexworks.amethyst.api.Attribute
4+
5+
data class NutritionalValue(val energy: Int) : Attribute
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
package org.hexworks.cavesofzircon.attributes.types
2+
3+
import org.hexworks.amethyst.api.entity.EntityType
4+
import org.hexworks.cavesofzircon.attributes.EnergyLevel
5+
import org.hexworks.cavesofzircon.extensions.GameEntity
6+
7+
interface EnergyUser : EntityType
8+
9+
val GameEntity<EnergyUser>.energyLevel: EnergyLevel
10+
get() = findAttribute(EnergyLevel::class).get()

src/main/kotlin/org/hexworks/cavesofzircon/attributes/types/EntityTypes.kt

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ package org.hexworks.cavesofzircon.attributes.types
33
import org.hexworks.amethyst.api.base.BaseEntityType
44

55
object Player : BaseEntityType(
6-
name = "player"), Combatant, ItemHolder
6+
name = "player"), Combatant, ItemHolder, EnergyUser
77

88
object Wall : BaseEntityType(
99
name = "wall")
@@ -12,7 +12,11 @@ object Fungus : BaseEntityType(
1212
name = "fungus"), Combatant
1313

1414
object Bat : BaseEntityType(
15-
name = "bat"), Combatant
15+
name = "bat"), Combatant, ItemHolder
16+
17+
object BatMeat : BaseEntityType(
18+
name = "Bat meat",
19+
description = "Stringy bat meat. It is edible, but not tasty."), Food
1620

1721
object StairsDown : BaseEntityType(
1822
name = "stairs down")
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
package org.hexworks.cavesofzircon.attributes.types
2+
3+
import org.hexworks.cavesofzircon.attributes.NutritionalValue
4+
import org.hexworks.cavesofzircon.extensions.GameEntity
5+
import org.hexworks.cavesofzircon.extensions.tryToFindAttribute
6+
7+
interface Food : Item
8+
9+
val GameEntity<Food>.energy: Int
10+
get() = tryToFindAttribute(NutritionalValue::class).energy

src/main/kotlin/org/hexworks/cavesofzircon/builders/EntityFactory.kt

Lines changed: 26 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -4,16 +4,19 @@ import org.hexworks.amethyst.api.Entities
44
import org.hexworks.amethyst.api.builder.EntityBuilder
55
import org.hexworks.amethyst.api.entity.EntityType
66
import org.hexworks.cavesofzircon.attributes.CombatStats
7+
import org.hexworks.cavesofzircon.attributes.EnergyLevel
78
import org.hexworks.cavesofzircon.attributes.EntityActions
89
import org.hexworks.cavesofzircon.attributes.EntityPosition
910
import org.hexworks.cavesofzircon.attributes.EntityTile
1011
import org.hexworks.cavesofzircon.attributes.FungusSpread
1112
import org.hexworks.cavesofzircon.attributes.Inventory
1213
import org.hexworks.cavesofzircon.attributes.ItemIcon
14+
import org.hexworks.cavesofzircon.attributes.NutritionalValue
1315
import org.hexworks.cavesofzircon.attributes.Vision
1416
import org.hexworks.cavesofzircon.attributes.flags.BlockOccupier
1517
import org.hexworks.cavesofzircon.attributes.flags.VisionBlocker
1618
import org.hexworks.cavesofzircon.attributes.types.Bat
19+
import org.hexworks.cavesofzircon.attributes.types.BatMeat
1720
import org.hexworks.cavesofzircon.attributes.types.Fungus
1821
import org.hexworks.cavesofzircon.attributes.types.Player
1922
import org.hexworks.cavesofzircon.attributes.types.StairsDown
@@ -26,12 +29,15 @@ import org.hexworks.cavesofzircon.entities.FogOfWar
2629
import org.hexworks.cavesofzircon.systems.Attackable
2730
import org.hexworks.cavesofzircon.systems.CameraMover
2831
import org.hexworks.cavesofzircon.systems.Destructible
32+
import org.hexworks.cavesofzircon.systems.DigestiveSystem
2933
import org.hexworks.cavesofzircon.systems.Diggable
34+
import org.hexworks.cavesofzircon.systems.EnergyExpender
3035
import org.hexworks.cavesofzircon.systems.FungusGrowth
3136
import org.hexworks.cavesofzircon.systems.InputReceiver
3237
import org.hexworks.cavesofzircon.systems.InventoryInspector
3338
import org.hexworks.cavesofzircon.systems.ItemDropper
3439
import org.hexworks.cavesofzircon.systems.ItemPicker
40+
import org.hexworks.cavesofzircon.systems.LootDropper
3541
import org.hexworks.cavesofzircon.systems.Movable
3642
import org.hexworks.cavesofzircon.systems.StairClimber
3743
import org.hexworks.cavesofzircon.systems.StairDescender
@@ -78,10 +84,11 @@ object EntityFactory {
7884
defenseValue = 5),
7985
EntityTile(GameTileRepository.PLAYER),
8086
EntityActions(Dig::class, Attack::class),
81-
Inventory(10))
82-
behaviors(InputReceiver)
83-
facets(Movable, CameraMover, StairClimber, StairDescender, Attackable, Destructible, ItemPicker,
84-
InventoryInspector, ItemDropper)
87+
Inventory(10),
88+
EnergyLevel(1000, 1000))
89+
behaviors(InputReceiver, EnergyExpender)
90+
facets(Movable, CameraMover, StairClimber, StairDescender, Attackable, Destructible,
91+
ItemPicker, InventoryInspector, ItemDropper, EnergyExpender, DigestiveSystem)
8592
}
8693

8794
fun newFungus(fungusSpread: FungusSpread = FungusSpread()) = newGameEntityOfType(Fungus) {
@@ -105,11 +112,24 @@ object EntityFactory {
105112
maxHp = 5,
106113
attackValue = 2,
107114
defenseValue = 1),
108-
EntityActions(Attack::class))
109-
facets(Movable, Attackable, Destructible)
115+
EntityActions(Attack::class),
116+
Inventory(1).apply {
117+
addItem(newBatMeat())
118+
})
119+
facets(Movable, Attackable, ItemDropper, LootDropper, Destructible)
110120
behaviors(Wanderer)
111121
}
112122

123+
fun newBatMeat() = newGameEntityOfType(BatMeat) {
124+
attributes(ItemIcon(Tiles.newBuilder()
125+
.withName("Meatball")
126+
.withTileset(GraphicalTilesetResources.nethack16x16())
127+
.buildGraphicTile()),
128+
NutritionalValue(750),
129+
EntityPosition(),
130+
EntityTile(GameTileRepository.BAT_MEAT))
131+
}
132+
113133
fun newZircon() = newGameEntityOfType(Zircon) {
114134
attributes(ItemIcon(Tiles.newBuilder()
115135
.withName("white gem")

src/main/kotlin/org/hexworks/cavesofzircon/builders/GameColors.kt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ object GameColors {
1414

1515
val ACCENT_COLOR = TileColors.fromString("#FFCD22")
1616
val ZIRCON_COLOR = TileColors.fromString("#dddddd")
17+
val BAT_MEAT_COLOR = TileColors.fromString("#EA4861")
1718

1819
val UNREVEALED_COLOR = TileColors.fromString("#000000")
1920
}

src/main/kotlin/org/hexworks/cavesofzircon/builders/GameTileRepository.kt

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,12 @@ object GameTileRepository {
5050
.withForegroundColor(GameColors.BAT_COLOR)
5151
.buildCharacterTile()
5252

53+
val BAT_MEAT = Tiles.newBuilder()
54+
.withCharacter('m')
55+
.withBackgroundColor(GameColors.FLOOR_BACKGROUND)
56+
.withForegroundColor(GameColors.BAT_MEAT_COLOR)
57+
.buildCharacterTile()
58+
5359
val ZIRCON = Tiles.newBuilder()
5460
.withCharacter(',')
5561
.withBackgroundColor(GameColors.FLOOR_BACKGROUND)
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
package org.hexworks.cavesofzircon.commands
2+
3+
import org.hexworks.cavesofzircon.attributes.types.Food
4+
import org.hexworks.cavesofzircon.attributes.types.EnergyUser
5+
import org.hexworks.cavesofzircon.extensions.GameEntity
6+
import org.hexworks.cavesofzircon.world.GameContext
7+
8+
data class Eat(override val context: GameContext,
9+
override val source: GameEntity<EnergyUser>,
10+
override val target: GameEntity<Food>) : EntityAction<EnergyUser, Food>
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
package org.hexworks.cavesofzircon.commands
2+
3+
import org.hexworks.amethyst.api.entity.EntityType
4+
import org.hexworks.cavesofzircon.attributes.types.EnergyUser
5+
import org.hexworks.cavesofzircon.extensions.GameCommand
6+
import org.hexworks.cavesofzircon.extensions.GameEntity
7+
import org.hexworks.cavesofzircon.world.GameContext
8+
9+
data class Expend(override val context: GameContext,
10+
override val source: GameEntity<EnergyUser>,
11+
val energy: Int) : GameCommand<EntityType>

0 commit comments

Comments
 (0)