DEADSOFTWARE

Remove java serialization
[cavedroid.git] / core / src / ru / deadsoftware / cavedroid / game / objects / drop / Drop.kt
index 9099864b39f8c12db0f2362d41a2eecd2739d393..2b4f7409cd4b16fac15c121913b66151f436e483 100644 (file)
@@ -4,21 +4,25 @@ import com.badlogic.gdx.math.Intersector
 import com.badlogic.gdx.math.Rectangle
 import com.badlogic.gdx.math.Vector2
 import ru.deadsoftware.cavedroid.game.GameItemsHolder
+import ru.deadsoftware.cavedroid.game.model.dto.SaveDataDto
 import ru.deadsoftware.cavedroid.game.model.item.Item
+import ru.deadsoftware.cavedroid.misc.Saveable
 
 class Drop @JvmOverloads constructor(
     x: Float,
     y: Float,
     _item: Item,
-    val amount: Int = 1,
-) : Rectangle(x, y, DROP_SIZE, DROP_SIZE) {
+    _amount: Int = 1,
+) : Rectangle(x, y, DROP_SIZE, DROP_SIZE), Saveable {
+
+    var amount: Int = _amount
+        private set
 
     val itemKey = _item.params.key
     val velocity = getInitialVelocity()
     var pickedUp = false
 
     @Suppress("UNNECESSARY_LATEINIT")
-    @Transient
     lateinit var item: Item
         private set
 
@@ -39,6 +43,15 @@ class Drop @JvmOverloads constructor(
         return Intersector.overlaps(magnetArea, rectangle)
     }
 
+    @JvmOverloads
+    fun subtract(count: Int = 1) {
+        if (count < 0) {
+            throw IllegalArgumentException("Can't subtract negative amount")
+        }
+
+        amount -= count
+    }
+
     private fun getMagnetArea(): Rectangle {
         return Rectangle(
             /* x = */ x - MAGNET_DISTANCE,
@@ -48,12 +61,44 @@ class Drop @JvmOverloads constructor(
         )
     }
 
+    override fun getSaveData(): SaveDataDto.DropSaveData {
+        return SaveDataDto.DropSaveData(
+            version = SAVE_DATA_VERSION,
+            x = x,
+            y = y,
+            width = width,
+            height = height,
+            velocityX = velocity.x,
+            velocityY = velocity.y,
+            itemKey = itemKey,
+            amount = amount,
+            pickedUp = pickedUp
+        )
+    }
+
     companion object {
+        private const val SAVE_DATA_VERSION = 1
+
         private const val MAGNET_DISTANCE = 8f
 
         const val MAGNET_VELOCITY = 256f
         const val DROP_SIZE = 8f
 
         private fun getInitialVelocity(): Vector2 = Vector2(0f, -1f)
+
+        fun fromSaveData(saveData: SaveDataDto.DropSaveData, gameItemsHolder: GameItemsHolder): Drop {
+            saveData.verifyVersion(SAVE_DATA_VERSION)
+
+            return Drop(
+                x = saveData.x,
+                y = saveData.y,
+                _item = gameItemsHolder.getItem(saveData.itemKey),
+                _amount = saveData.amount,
+            ).apply {
+                velocity.x = saveData.velocityX
+                velocity.y = saveData.velocityY
+                pickedUp = saveData.pickedUp
+            }
+        }
     }
 }