Skip to content

Commit

Permalink
Switched entities to data classes removing TileSystem.kts closes #18
Browse files Browse the repository at this point in the history
Switched Tile to an inline class closing #46
  • Loading branch information
GregHib committed Apr 12, 2020
1 parent 41276d9 commit 3c95b29
Show file tree
Hide file tree
Showing 22 changed files with 54 additions and 234 deletions.
6 changes: 6 additions & 0 deletions engine/build.gradle.kts
@@ -1,3 +1,5 @@
import org.jetbrains.kotlin.gradle.tasks.KotlinCompile

plugins {
`java-library`
}
Expand All @@ -8,4 +10,8 @@ dependencies {
implementation(project(":utility"))
implementation("io.github.classgraph:classgraph:4.8.65")
implementation(kotlin("script-runtime"))
}
val compileKotlin: KotlinCompile by tasks
compileKotlin.kotlinOptions {
freeCompilerArgs = listOf("-XXLanguage:+InlineClasses")
}
Expand Up @@ -2,7 +2,6 @@ package org.redrune.engine.entity.factory

import org.redrune.engine.entity.event.Registered
import org.redrune.engine.entity.model.FloorItem
import org.redrune.engine.entity.tile.Tiles
import org.redrune.engine.event.EventBus
import org.redrune.engine.model.Tile
import org.redrune.utility.inject
Expand All @@ -14,12 +13,10 @@ import org.redrune.utility.inject
class FloorItemFactory {

private val bus: EventBus by inject()
private val tiles: Tiles by inject()

fun spawn(index: Int, x: Int, y: Int, plane: Int): FloorItem {
val floorItem = FloorItem(index)
val floorItem = FloorItem(index, Tile(x, y, plane))
bus.emit(Registered(floorItem))
tiles[floorItem] = Tile(x, y, plane)
return floorItem
}
}
Expand Up @@ -2,7 +2,6 @@ package org.redrune.engine.entity.factory

import org.redrune.engine.entity.event.Registered
import org.redrune.engine.entity.model.NPC
import org.redrune.engine.entity.tile.Tiles
import org.redrune.engine.event.EventBus
import org.redrune.engine.model.Direction
import org.redrune.engine.model.Tile
Expand All @@ -15,12 +14,10 @@ import org.redrune.utility.inject
class NPCFactory {

private val bus: EventBus by inject()
private val tiles: Tiles by inject()

fun spawn(id: Int, x: Int, y: Int, plane: Int, direction: Direction): NPC {
val npc = NPC(id)
val npc = NPC(id, Tile(x, y, plane))
bus.emit(Registered(npc))
tiles[npc] = Tile(x, y, plane)
return npc
}
}
Expand Up @@ -2,7 +2,6 @@ package org.redrune.engine.entity.factory

import org.redrune.engine.entity.event.Registered
import org.redrune.engine.entity.model.IObject
import org.redrune.engine.entity.tile.Tiles
import org.redrune.engine.event.EventBus
import org.redrune.engine.model.Tile
import org.redrune.utility.inject
Expand All @@ -14,12 +13,10 @@ import org.redrune.utility.inject
class ObjectFactory {

private val bus: EventBus by inject()
private val tiles: Tiles by inject()

fun spawn(id: Int, x: Int, y: Int, plane: Int, rotation: Int): IObject {
val obj = IObject(id)
val obj = IObject(id, Tile(x, y, plane))
bus.emit(Registered(obj))
tiles[obj] = Tile(x, y, plane)
return obj
}
}
Expand Up @@ -3,6 +3,7 @@ package org.redrune.engine.entity.factory
import org.redrune.engine.entity.event.Registered
import org.redrune.engine.entity.model.Projectile
import org.redrune.engine.event.EventBus
import org.redrune.engine.model.Tile
import org.redrune.utility.inject

/**
Expand All @@ -14,7 +15,7 @@ class ProjectileFactory {
private val bus: EventBus by inject()

fun spawn(index: Int): Projectile {
val floorItem = Projectile(index)
val floorItem = Projectile(index, Tile(0, 0, 0))
bus.emit(Registered(floorItem))
return floorItem
}
Expand Down
Expand Up @@ -7,27 +7,24 @@ import org.redrune.engine.entity.list.obj.Objects
import org.redrune.engine.entity.list.player.Players
import org.redrune.engine.entity.list.proj.Projectiles
import org.redrune.engine.entity.model.*
import org.redrune.engine.entity.tile.Tiles
import org.redrune.engine.event.priority
import org.redrune.engine.event.then
import org.redrune.utility.inject

loadKoinModules(entityListModule)

val tiles: Tiles by inject()
val players: Players by inject()
val npcs: NPCs by inject()
val objects: Objects by inject()
val items: FloorItems by inject()
val projectiles: Projectiles by inject()

Registered priority 9 then {
val tile = tiles[entity]
when (entity) {
is Player -> players[tile] = entity
is NPC -> npcs[tile] = entity
is IObject -> objects[tile] = entity
is FloorItem -> items[tile] = entity
is Projectile -> projectiles[tile] = entity
is Player -> players[entity.tile] = entity
is NPC -> npcs[entity.tile] = entity
is IObject -> objects[entity.tile] = entity
is FloorItem -> items[entity.tile] = entity
is Projectile -> projectiles[entity.tile] = entity
}
}
@@ -1,10 +1,13 @@
package org.redrune.engine.entity.model

import org.redrune.engine.model.Tile

/**
* An identifiable object with a physical spatial location
* @author Greg Hibberd <greg@greghibberd.com>
* @since March 28, 2020
*/
interface Entity {
val id: Int
var tile: Tile
}
@@ -1,8 +1,10 @@
package org.redrune.engine.entity.model

import org.redrune.engine.model.Tile

/**
* An [Item] with physical location
* @author Greg Hibberd <greg@greghibberd.com>
* @since March 28, 2020
*/
data class FloorItem(override val id: Int) : Entity
data class FloorItem(override val id: Int, override var tile: Tile) : Entity
@@ -1,8 +1,10 @@
package org.redrune.engine.entity.model

import org.redrune.engine.model.Tile

/**
* Interactive Object
* @author Greg Hibberd <greg@greghibberd.com>
* @since March 28, 2020
*/
data class IObject(override val id: Int) : Entity
data class IObject(override val id: Int, override var tile: Tile) : Entity
11 changes: 11 additions & 0 deletions engine/src/main/kotlin/org/redrune/engine/entity/model/Movable.kt
@@ -0,0 +1,11 @@
package org.redrune.engine.entity.model

import org.redrune.engine.model.Tile

/**
* @author Greg Hibberd <greg@greghibberd.com>
* @since April 03, 2020
*/
interface Movable {
val tile: Tile
}
@@ -1,8 +1,10 @@
package org.redrune.engine.entity.model

import org.redrune.engine.model.Tile

/**
* A non-player character
* @author Greg Hibberd <greg@greghibberd.com>
* @since March 28, 2020
*/
data class NPC(override val id: Int) : Entity
data class NPC(override val id: Int, override var tile: Tile) : Entity
@@ -1,8 +1,12 @@
package org.redrune.engine.entity.model

import org.redrune.engine.model.Tile

/**
* A player controlled by client or bot
* @author Greg Hibberd <greg@greghibberd.com>
* @since March 28, 2020
*/
data class Player(override val id: Int) : Entity
data class Player(override var id: Int, override var tile: Tile) : Entity, Movable {

}
@@ -1,7 +1,9 @@
package org.redrune.engine.entity.model

import org.redrune.engine.model.Tile

/**
* @author Greg Hibberd <greg@greghibberd.com>
* @since March 28, 2020
*/
data class Projectile(override val id: Int) : Entity
data class Projectile(override val id: Int, override var tile: Tile) : Entity
24 changes: 0 additions & 24 deletions engine/src/main/kotlin/org/redrune/engine/entity/tile/TileList.kt

This file was deleted.

This file was deleted.

24 changes: 0 additions & 24 deletions engine/src/main/kotlin/org/redrune/engine/entity/tile/Tiles.kt

This file was deleted.

2 changes: 1 addition & 1 deletion engine/src/main/kotlin/org/redrune/engine/model/Tile.kt
Expand Up @@ -4,7 +4,7 @@ package org.redrune.engine.model
* @author Greg Hibberd <greg@greghibberd.com>
* @since March 28, 2020
*/
data class Tile(val value: Int) {// FIXME #46
inline class Tile(val value: Int) {

constructor(x: Int, y: Int, plane: Int) : this(y + (x shl 14) + (plane shl 28))

Expand Down
Expand Up @@ -12,9 +12,6 @@ import org.junit.jupiter.api.extension.ExtendWith
import org.koin.dsl.module
import org.koin.test.mock.declareMock
import org.redrune.engine.entity.event.Registered
import org.redrune.engine.entity.model.Entity
import org.redrune.engine.entity.tile.Tiles
import org.redrune.engine.entity.tile.tileModule
import org.redrune.engine.event.EventBus
import org.redrune.engine.event.eventBusModule
import org.redrune.engine.model.Tile
Expand All @@ -30,7 +27,7 @@ internal class FloorItemFactoryTest : KoinMock() {

@BeforeEach
fun setup() {
loadModules(module { single { FloorItemFactory() } }, eventBusModule, tileModule)
loadModules(module { single { FloorItemFactory() } }, eventBusModule)
}

@Test
Expand All @@ -40,15 +37,12 @@ internal class FloorItemFactoryTest : KoinMock() {
val bus: EventBus = declareMock {
every { emit(any<Registered>()) } just Runs
}
val tiles: Tiles = declareMock {
every { this@declareMock[any<Entity>()] = any<Tile>() } just Runs// FIXME https://github.com/mockk/mockk/issues/152
}
// When
val item = factory.spawn(1, 10, 20, 1)
// Then
assertEquals(1, item.id)
verify { bus.emit<Registered>(any()) }
verify { tiles[item] = Tile(10, 20, 1) }
assertEquals(item.tile, Tile(10, 20, 1))
}

}

0 comments on commit 3c95b29

Please sign in to comment.