1 package ru.fredboy.cavedroid.game.controller.drop
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
14 import javax.inject.Inject
17 class DropController @Inject constructor(
18 private val itemsRepository: ItemsRepository,
19 private val dropWorldAdapter: DropWorldAdapter,
20 ) : OnBlockDestroyedListener {
22 private val drops = LinkedList<Drop>()
25 itemsRepository: ItemsRepository,
26 dropWorldAdapter: DropWorldAdapter,
27 initialDrop: Collection<Drop>
28 ) : this(itemsRepository, dropWorldAdapter) {
29 drops.addAll(initialDrop.filterNot { drop -> drop.item.isNone() })
32 val size get() = drops.size
35 dropWorldAdapter.addOnBlockDestroyedListener(this)
38 fun getAllDrop(): Collection<Drop> {
42 fun addDrop(drop: Drop) {
43 if (drop.item.isNone()) {
50 fun addDrop(x: Float, y: Float, item: Item, count: Int) {
51 addDrop(Drop(x, y, item, count))
54 fun addDrop(x: Float, y: Float, inventoryItem: InventoryItem) {
55 addDrop(x, y, inventoryItem.item, inventoryItem.amount)
58 fun forEach(action: (Drop) -> Unit) {
63 fun update(delta: Float) {
64 val iterator = drops.iterator()
66 while (iterator.hasNext()) {
67 val drop = iterator.next();
68 if (drop.isPickedUp) {
78 override fun onBlockDestroyed(block: Block, x: Int, y: Int, layer: Layer, withDrop: Boolean) {
83 val dropInfo = block.params.dropInfo ?: return
84 val item = itemsRepository.getItemByKey(dropInfo.itemKey).takeIf { !it.isNone() } ?: return
87 x = x.blockCenterPx() - Drop.DROP_SIZE / 2,
88 y = y.blockCenterPx() - Drop.DROP_SIZE / 2,
90 count = dropInfo.count