DEADSOFTWARE

59856821cd1b8332f8247f6c34025f5275ca373d
[cavedroid.git] /
1 package ru.fredboy.cavedroid.game.controller.container.impl
2
3 import ru.fredboy.cavedroid.common.di.GameScope
4 import ru.fredboy.cavedroid.game.controller.container.ContainerController
5 import ru.fredboy.cavedroid.game.controller.container.listener.ContainerAddedListener
6 import ru.fredboy.cavedroid.game.controller.container.listener.ContainerRemovedListener
7 import ru.fredboy.cavedroid.game.controller.container.model.Container
8 import ru.fredboy.cavedroid.domain.items.usecase.GetItemByKeyUseCase
9 import javax.inject.Inject
10
11 @GameScope
12 class ContainerControllerImpl @Inject constructor(
13 private val itemByKey: GetItemByKeyUseCase,
14 ) : ContainerController {
15
16 val containerMap = mutableMapOf<String, Container>()
17
18 private val containerAddedListeners = mutableSetOf<ContainerAddedListener>()
19 private val containerRemovedListeners = mutableSetOf<ContainerRemovedListener>()
20
21 override val size get() = containerMap.size
22
23 private fun getContainerKey(x: Int, y: Int, z: Int): String {
24 return "$x;$y;$z"
25 }
26
27 override fun getContainer(x: Int, y: Int, z: Int): Container? {
28 return containerMap[getContainerKey(x, y, z)]
29 }
30
31 override fun addContainer(x: Int, y: Int, z: Int, container: Container) {
32 val key = getContainerKey(x, y, z)
33 if (containerMap.containsKey(key)) {
34 resetContainer(x, y, z)
35 }
36
37 containerMap[key] = container
38
39 containerAddedListeners.forEach { listener ->
40 listener.onContainerAdded(x, y, z, container)
41 }
42 }
43
44 private fun retrieveContainer(x: Int, y: Int, z: Int): Container? {
45 return containerMap.remove(getContainerKey(x, y, z))
46 }
47
48 override fun resetContainer(x: Int, y: Int, z: Int) {
49 retrieveContainer(x, y, z)
50 }
51
52 override fun destroyContainer(x: Int, y: Int, z: Int) {
53 retrieveContainer(x, y, z)?.let { container ->
54 containerRemovedListeners.forEach { listener ->
55 listener.onContainerRemoved(x, y, z, container)
56 }
57 }
58 }
59
60 override fun addContainerAddedListener(listener: ContainerAddedListener) {
61 containerAddedListeners.add(listener)
62 }
63
64 override fun removeContainerAddedListener(listener: ContainerAddedListener) {
65 containerAddedListeners.remove(listener)
66 }
67
68 override fun addContainerRemovedListener(listener: ContainerRemovedListener) {
69 containerRemovedListeners.add(listener)
70 }
71
72 override fun removeContainerRemovedListener(listener: ContainerRemovedListener) {
73 containerRemovedListeners.remove(listener)
74 }
75
76 override fun update(delta: Float) {
77 containerMap.values.forEach { container ->
78 container.update(itemByKey)
79 }
80 }
81
82 override fun dispose() {
83 containerAddedListeners.clear()
84 containerRemovedListeners.clear()
85 containerMap.clear()
86 }
87 }