Skip to content

Commit 5fdac9f

Browse files
author
adam-arold
committed
Add a wandering monster
1 parent 890c370 commit 5fdac9f

7 files changed

Lines changed: 62 additions & 1 deletion

File tree

src/main/kotlin/org/hexworks/cavesofzircon/GameConfig.kt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ object GameConfig {
2424

2525
// entities
2626
const val FUNGI_PER_LEVEL = 15
27+
const val BATS_PER_LEVEL = 10
2728
const val MAXIMUM_FUNGUS_SPREAD = 20
2829

2930
fun buildAppConfig() = AppConfigs.newConfig()

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

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,9 @@ object Wall : BaseEntityType(
1111
object Fungus : BaseEntityType(
1212
name = "fungus"), Combatant
1313

14+
object Bat : BaseEntityType(
15+
name = "bat"), Combatant
16+
1417
object StairsDown : BaseEntityType(
1518
name = "stairs down")
1619

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

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import org.hexworks.cavesofzircon.attributes.FungusSpread
1111
import org.hexworks.cavesofzircon.attributes.Vision
1212
import org.hexworks.cavesofzircon.attributes.flags.BlockOccupier
1313
import org.hexworks.cavesofzircon.attributes.flags.VisionBlocker
14+
import org.hexworks.cavesofzircon.attributes.types.Bat
1415
import org.hexworks.cavesofzircon.attributes.types.Fungus
1516
import org.hexworks.cavesofzircon.attributes.types.Player
1617
import org.hexworks.cavesofzircon.attributes.types.StairsDown
@@ -28,6 +29,7 @@ import org.hexworks.cavesofzircon.systems.InputReceiver
2829
import org.hexworks.cavesofzircon.systems.Movable
2930
import org.hexworks.cavesofzircon.systems.StairClimber
3031
import org.hexworks.cavesofzircon.systems.StairDescender
32+
import org.hexworks.cavesofzircon.systems.Wanderer
3133
import org.hexworks.cavesofzircon.world.Game
3234
import org.hexworks.cavesofzircon.world.GameContext
3335

@@ -61,14 +63,15 @@ object EntityFactory {
6163
attributes(
6264
Vision(9),
6365
EntityPosition(),
66+
BlockOccupier,
6467
CombatStats.create(
6568
maxHp = 100,
6669
attackValue = 10,
6770
defenseValue = 5),
6871
EntityTile(GameTileRepository.PLAYER),
6972
EntityActions(Dig::class, Attack::class))
7073
behaviors(InputReceiver)
71-
facets(Movable, CameraMover, StairClimber, StairDescender)
74+
facets(Movable, CameraMover, StairClimber, StairDescender, Attackable, Destructible)
7275
}
7376

7477
fun newFungus(fungusSpread: FungusSpread = FungusSpread()) = newGameEntityOfType(Fungus) {
@@ -83,5 +86,18 @@ object EntityFactory {
8386
facets(Attackable, Destructible)
8487
behaviors(FungusGrowth)
8588
}
89+
90+
fun newBat() = newGameEntityOfType(Bat) {
91+
attributes(BlockOccupier,
92+
EntityPosition(),
93+
EntityTile(GameTileRepository.BAT),
94+
CombatStats.create(
95+
maxHp = 5,
96+
attackValue = 2,
97+
defenseValue = 1),
98+
EntityActions(Attack::class))
99+
facets(Movable, Attackable, Destructible)
100+
behaviors(Wanderer)
101+
}
86102
}
87103

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ object GameColors {
1010
val FLOOR_BACKGROUND = TileColors.fromString("#1e2320")
1111

1212
val FUNGUS_COLOR = TileColors.fromString("#85DD1B")
13+
val BAT_COLOR = TileColors.fromString("#2348b2")
1314

1415
val ACCENT_COLOR = TileColors.fromString("#FFCD22")
1516

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

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,12 @@ object GameTileRepository {
4444
.withForegroundColor(GameColors.FUNGUS_COLOR)
4545
.buildCharacterTile()
4646

47+
val BAT = Tiles.newBuilder()
48+
.withCharacter('b')
49+
.withBackgroundColor(GameColors.FLOOR_BACKGROUND)
50+
.withForegroundColor(GameColors.BAT_COLOR)
51+
.buildCharacterTile()
52+
4753
val UNREVEALED = Tiles.newBuilder()
4854
.withCharacter(' ')
4955
.withBackgroundColor(GameColors.UNREVEALED_COLOR)
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
package org.hexworks.cavesofzircon.systems
2+
3+
import org.hexworks.amethyst.api.base.BaseBehavior
4+
import org.hexworks.amethyst.api.entity.EntityType
5+
import org.hexworks.cavesofzircon.commands.MoveTo
6+
import org.hexworks.cavesofzircon.extensions.GameEntity
7+
import org.hexworks.cavesofzircon.extensions.position
8+
import org.hexworks.cavesofzircon.extensions.sameLevelNeighborsShuffled
9+
import org.hexworks.cavesofzircon.world.GameContext
10+
11+
object Wanderer : BaseBehavior<GameContext>() {
12+
13+
override fun update(entity: GameEntity<EntityType>, context: GameContext): Boolean {
14+
val pos = entity.position
15+
if (pos.isUnknown().not()) {
16+
entity.executeCommand(MoveTo(
17+
context = context,
18+
source = entity,
19+
position = pos.sameLevelNeighborsShuffled().first()))
20+
return true
21+
}
22+
return false
23+
}
24+
}

src/main/kotlin/org/hexworks/cavesofzircon/world/GameBuilder.kt

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package org.hexworks.cavesofzircon.world
22

33
import org.hexworks.amethyst.api.entity.EntityType
44
import org.hexworks.cavesofzircon.GameConfig
5+
import org.hexworks.cavesofzircon.GameConfig.BATS_PER_LEVEL
56
import org.hexworks.cavesofzircon.GameConfig.WORLD_SIZE
67
import org.hexworks.cavesofzircon.attributes.types.Player
78
import org.hexworks.cavesofzircon.builders.EntityFactory
@@ -28,6 +29,7 @@ class GameBuilder(val worldSize: Size3D = WORLD_SIZE) {
2829

2930
val player = addPlayer()
3031
addFungi()
32+
addBats()
3133

3234
val game = Game.create(
3335
player = player,
@@ -56,6 +58,14 @@ class GameBuilder(val worldSize: Size3D = WORLD_SIZE) {
5658
}
5759
}
5860

61+
private fun addBats() = also {
62+
repeat(world.actualSize().zLength) { level ->
63+
repeat(BATS_PER_LEVEL) {
64+
EntityFactory.newBat().addToWorld(level)
65+
}
66+
}
67+
}
68+
5969
private fun <T : EntityType> GameEntity<T>.addToWorld(
6070
atLevel: Int,
6171
atArea: Size = world.actualSize().to2DSize()): GameEntity<T> {

0 commit comments

Comments
 (0)