DEADSOFTWARE

d2159f1cf72f3498016b8c457395e96c5f20b5ca
[cavedroid.git] / core / src / ru / deadsoftware / cavedroid / game / objects / container / ContainerController.kt
1 package ru.deadsoftware.cavedroid.game.objects.container
3 import com.badlogic.gdx.Gdx
4 import ru.deadsoftware.cavedroid.game.GameItemsHolder
5 import ru.deadsoftware.cavedroid.game.GameScope
6 import ru.deadsoftware.cavedroid.game.model.block.Block
7 import ru.deadsoftware.cavedroid.game.model.dto.SaveDataDto
8 import ru.deadsoftware.cavedroid.game.model.item.InventoryItem.Companion.isNoneOrNull
9 import ru.deadsoftware.cavedroid.game.objects.drop.DropController
10 import ru.deadsoftware.cavedroid.misc.Saveable
11 import ru.deadsoftware.cavedroid.misc.utils.px
12 import javax.inject.Inject
14 @GameScope
15 class ContainerController @Inject constructor(
16 _dropController: DropController,
17 _gameItemsHolder: GameItemsHolder
18 ) : Saveable {
20 @Suppress("UNNECESSARY_LATEINIT")
21 private lateinit var dropController: DropController
23 @Suppress("UNNECESSARY_LATEINIT")
24 private lateinit var gameItemsHolder: GameItemsHolder
26 private val containerMap = mutableMapOf<String, Container>()
28 val size get() = containerMap.size
30 init {
31 dropController = _dropController
32 gameItemsHolder = _gameItemsHolder
33 }
35 fun init(dropController: DropController, gameItemsHolder: GameItemsHolder) {
36 this.dropController = dropController
37 this.gameItemsHolder = gameItemsHolder
38 containerMap.forEach { (_, container) -> container.initItems(gameItemsHolder) }
39 }
41 fun getContainer(x: Int, y: Int, z: Int): Container? {
42 return containerMap["$x;$y;$z"]
43 }
45 fun addContainer(x: Int, y: Int, z: Int, clazz: Class<out Block.Container>) {
46 val container = when (clazz) {
47 Block.Furnace::class.java -> Furnace(gameItemsHolder)
48 Block.Chest::class.java -> Chest(gameItemsHolder)
49 else -> {
50 Gdx.app.error(TAG, "Unknown container class $clazz")
51 return
52 }
53 }
54 containerMap["$x;$y;$z"] = container
55 }
57 @JvmOverloads
58 fun destroyContainer(x: Int, y: Int, z: Int, dropItems: Boolean = true) {
59 val container = containerMap.remove("$x;$y;$z") ?: return
61 if (!dropItems) {
62 return
63 }
65 val xPx = (x + .5f).px
66 val yPx = (y + .5f).px
68 container.items.forEach { item ->
69 if (!item.isNoneOrNull()) {
70 dropController.addDrop(xPx, yPx, item)
71 }
72 }
73 }
75 fun update() {
76 containerMap.forEach { (_, container) ->
77 container.update(gameItemsHolder)
78 }
79 }
81 override fun getSaveData(): SaveDataDto.ContainerControllerSaveData {
82 return SaveDataDto.ContainerControllerSaveData(
83 version = SAVE_DATA_VERSION,
84 containerMap = containerMap.mapValues { (_, container) -> container.getSaveData() },
85 )
86 }
88 companion object {
89 private const val SAVE_DATA_VERSION = 1
90 private const val TAG = "ContainerController"
92 fun fromSaveData(
93 saveData: SaveDataDto.ContainerControllerSaveData,
94 dropController: DropController,
95 gameItemsHolder: GameItemsHolder
96 ): ContainerController {
97 saveData.verifyVersion(SAVE_DATA_VERSION)
99 return ContainerController(
100 dropController,
101 gameItemsHolder
102 ).apply {
103 containerMap.putAll(
104 saveData.containerMap.mapValues { (_, containerSaveData) ->
105 Container.fromSaveData(containerSaveData, gameItemsHolder)