DEADSOFTWARE

Bug fixes
[cavedroid.git] / core / src / ru / deadsoftware / cavedroid / game / ui / windows / inventory / AbstractInventoryWindow.kt
index f49ba4908d1cd91b88ce7918ce823a8fef715d57..ed15baca1d5d49baa0d1daf5942dffb3b3c21443 100644 (file)
@@ -1,8 +1,10 @@
 package ru.deadsoftware.cavedroid.game.ui.windows.inventory
 
+import com.badlogic.gdx.math.MathUtils
 import ru.deadsoftware.cavedroid.game.GameItemsHolder
 import ru.deadsoftware.cavedroid.game.GameUiWindow
 import ru.deadsoftware.cavedroid.game.model.item.InventoryItem
+import ru.deadsoftware.cavedroid.game.model.item.InventoryItem.Companion.isNoneOrNull
 
 abstract class AbstractInventoryWindow {
 
@@ -12,17 +14,27 @@ abstract class AbstractInventoryWindow {
 
     var selectItemPointer: Int = -1
 
-    fun onLeftCLick(items: MutableList<InventoryItem?>, gameItemsHolder: GameItemsHolder, index: Int, pointer: Int = -1) {
-        if (selectedItem != null && selectedItem?.item?.isNone() != true && pointer >= 0 && selectItemPointer >= 0 && pointer != selectItemPointer) {
+    fun onLeftCLick(
+        items: MutableList<InventoryItem>,
+        gameItemsHolder: GameItemsHolder,
+        index: Int,
+        pointer: Int = -1
+    ) {
+        if (selectedItem != null &&
+            selectedItem?.item?.isNone() != true &&
+            pointer >= 0 && selectItemPointer >= 0 &&
+            pointer != selectItemPointer
+        ) {
             return
         }
 
         val clickedItem = items[index]
 
         selectedItem?.let { selectedItem ->
-            if (clickedItem != null && items[index]!!.item == selectedItem.item &&
-                items[index]!!.amount + selectedItem.amount <= selectedItem.item.params.maxStack) {
-                items[index]!!.amount += selectedItem.amount
+            if (!clickedItem.isNoneOrNull() && items[index].item == selectedItem.item &&
+                items[index].amount + selectedItem.amount <= selectedItem.item.params.maxStack
+            ) {
+                items[index].amount += selectedItem.amount
                 this@AbstractInventoryWindow.selectedItem = null
                 selectItemPointer = -1
                 return
@@ -35,15 +47,31 @@ abstract class AbstractInventoryWindow {
         selectItemPointer = pointer
     }
 
-    fun onRightClick(items: MutableList<InventoryItem?>, index: Int) {
+    fun onRightClick(items: MutableList<InventoryItem>, gameItemsHolder: GameItemsHolder, index: Int) {
         val clickedItem = items[index]
         val selectedItem = selectedItem
-            ?.takeIf { clickedItem == null || clickedItem.item.isNone() || it.item == items[index]!!.item && items[index]!!.amount + 1 < it.item.params.maxStack }
-            ?: return
 
-        val newItem = selectedItem.item.toInventoryItem((clickedItem?.takeIf { !it.item.isNone() }?.amount ?: 0) + 1)
+        if (selectedItem.isNoneOrNull() && !clickedItem.isNoneOrNull()) {
+            val half = InventoryItem(clickedItem.item, MathUtils.ceil(clickedItem.amount.toFloat() / 2f))
+            this.selectedItem = half
+            clickedItem.subtract(half.amount)
+            if (clickedItem.amount == 0) {
+                items[index] = gameItemsHolder.fallbackItem.toInventoryItem()
+            }
+            return
+        }
+
+        if (selectedItem == null ||
+            (!clickedItem.isNoneOrNull() && selectedItem.item != clickedItem.item) ||
+            !clickedItem.canBeAdded()) {
+            return
+        }
+
+        val newItem = selectedItem.item.toInventoryItem(
+            (clickedItem.takeIf { !it.item.isNone() }?.amount ?: 0) + 1
+        )
         items[index] = newItem
-        selectedItem.amount --
+        selectedItem.amount--
 
         if (selectedItem.amount <= 0) {
             this@AbstractInventoryWindow.selectedItem = null