DEADSOFTWARE

8275613f5c9f58a7854f0fe6624607ccb9830129
[cavedroid.git] /
1 package ru.fredboy.cavedroid.game.controller.drop
2
3 import ru.fredboy.cavedroid.common.di.GameScope
4 import ru.fredboy.cavedroid.common.utils.blockCenterPx
5 import ru.fredboy.cavedroid.domain.items.model.block.Block
6 import ru.fredboy.cavedroid.domain.items.model.inventory.InventoryItem
7 import ru.fredboy.cavedroid.domain.items.model.item.Item
8 import ru.fredboy.cavedroid.domain.items.repository.ItemsRepository
9 import ru.fredboy.cavedroid.domain.world.listener.OnBlockDestroyedListener
10 import ru.fredboy.cavedroid.domain.world.model.Layer
11 import ru.fredboy.cavedroid.entity.drop.abstraction.DropWorldAdapter
12 import ru.fredboy.cavedroid.entity.drop.model.Drop
13 import java.util.*
14 import javax.inject.Inject
15
16 @GameScope
17 class DropController @Inject constructor(
18 private val itemsRepository: ItemsRepository,
19 private val dropWorldAdapter: DropWorldAdapter,
20 ) : OnBlockDestroyedListener {
21
22 private val drops = LinkedList<Drop>()
23
24 constructor(
25 itemsRepository: ItemsRepository,
26 dropWorldAdapter: DropWorldAdapter,
27 initialDrop: Collection<Drop>
28 ) : this(itemsRepository, dropWorldAdapter) {
29 drops.addAll(initialDrop.filterNot { drop -> drop.item.isNone() })
30 }
31
32 val size get() = drops.size
33
34 init {
35 dropWorldAdapter.addOnBlockDestroyedListener(this)
36 }
37
38 fun getAllDrop(): Collection<Drop> {
39 return drops
40 }
41
42 fun addDrop(drop: Drop) {
43 if (drop.item.isNone()) {
44 return
45 }
46
47 drops.add(drop)
48 }
49
50 fun addDrop(x: Float, y: Float, item: Item, count: Int) {
51 addDrop(Drop(x, y, item, count))
52 }
53
54 fun addDrop(x: Float, y: Float, inventoryItem: InventoryItem) {
55 addDrop(x, y, inventoryItem.item, inventoryItem.amount)
56 }
57
58 fun forEach(action: (Drop) -> Unit) {
59 drops.forEach(action)
60 }
61
62 @Suppress("unused")
63 fun update(delta: Float) {
64 val iterator = drops.iterator()
65
66 while (iterator.hasNext()) {
67 val drop = iterator.next();
68 if (drop.isPickedUp) {
69 iterator.remove()
70 }
71 }
72 }
73
74 fun dispose() {
75 drops.clear()
76 }
77
78 override fun onBlockDestroyed(block: Block, x: Int, y: Int, layer: Layer, withDrop: Boolean) {
79 if (!withDrop) {
80 return
81 }
82
83 val dropInfo = block.params.dropInfo ?: return
84 val item = itemsRepository.getItemByKey(dropInfo.itemKey).takeIf { !it.isNone() } ?: return
85
86 addDrop(
87 x = x.blockCenterPx() - Drop.DROP_SIZE / 2,
88 y = y.blockCenterPx() - Drop.DROP_SIZE / 2,
89 item = item,
90 count = dropInfo.count
91 )
92 }
93
94 }