DEADSOFTWARE

bffb846d6116ef42439a8032e156ea19fb393e23
[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 java.io.Serializable
13 import javax.inject.Inject
15 @GameScope
16 class ContainerController @Inject constructor(
17 _dropController: DropController,
18 _gameItemsHolder: GameItemsHolder
19 ) : Serializable, Saveable {
21 @Suppress("UNNECESSARY_LATEINIT")
22 @Transient
23 private lateinit var dropController: DropController
25 @Suppress("UNNECESSARY_LATEINIT")
26 @Transient
27 private lateinit var gameItemsHolder: GameItemsHolder
29 private val containerMap = mutableMapOf<String, Container>()
31 val size get() = containerMap.size
33 init {
34 dropController = _dropController
35 gameItemsHolder = _gameItemsHolder
36 }
38 fun init(dropController: DropController, gameItemsHolder: GameItemsHolder) {
39 this.dropController = dropController
40 this.gameItemsHolder = gameItemsHolder
41 containerMap.forEach { (_, container) -> container.initItems(gameItemsHolder) }
42 }
44 fun getContainer(x: Int, y: Int, z: Int): Container? {
45 return containerMap["$x;$y;$z"]
46 }
48 fun addContainer(x: Int, y: Int, z: Int, clazz: Class<out Block.Container>) {
49 val container = when (clazz) {
50 Block.Furnace::class.java -> Furnace(gameItemsHolder)
51 Block.Chest::class.java -> Chest(gameItemsHolder)
52 else -> {
53 Gdx.app.error(TAG, "Unknown container class $clazz")
54 return
55 }
56 }
57 containerMap["$x;$y;$z"] = container
58 }
60 @JvmOverloads
61 fun destroyContainer(x: Int, y: Int, z: Int, dropItems: Boolean = true) {
62 val container = containerMap.remove("$x;$y;$z") ?: return
64 if (!dropItems) {
65 return
66 }
68 val xPx = (x + .5f).px
69 val yPx = (y + .5f).px
71 container.items.forEach { item ->
72 if (!item.isNoneOrNull()) {
73 dropController.addDrop(xPx, yPx, item)
74 }
75 }
76 }
78 fun update() {
79 containerMap.forEach { (_, container) ->
80 container.update(gameItemsHolder)
81 }
82 }
84 override fun getSaveData(): SaveDataDto.ContainerControllerSaveData {
85 return SaveDataDto.ContainerControllerSaveData(
86 version = SAVE_DATA_VERSION,
87 containerMap = containerMap.mapValues { (_, container) -> container.getSaveData() },
88 )
89 }
91 companion object {
92 private const val SAVE_DATA_VERSION = 1
93 private const val TAG = "ContainerController"
95 fun fromSaveData(
96 saveData: SaveDataDto.ContainerControllerSaveData,
97 dropController: DropController,
98 gameItemsHolder: GameItemsHolder
99 ): ContainerController {
100 saveData.verifyVersion(SAVE_DATA_VERSION)
102 return ContainerController(
103 dropController,
104 gameItemsHolder
105 ).apply {
106 containerMap.putAll(
107 saveData.containerMap.mapValues { (_, containerSaveData) ->
108 Container.fromSaveData(containerSaveData, gameItemsHolder)