DEADSOFTWARE

Add tools
[cavedroid.git] / core / src / ru / deadsoftware / cavedroid / game / render / BlocksRenderer.kt
index 3409fdf363f72ef44043c0ac629ef3e5b919d336..378ed7b9191c048884db9d80fdc953e7273cb155 100644 (file)
@@ -1,10 +1,12 @@
 package ru.deadsoftware.cavedroid.game.render
 
+import com.badlogic.gdx.graphics.g2d.Sprite
 import com.badlogic.gdx.graphics.g2d.SpriteBatch
 import com.badlogic.gdx.graphics.g2d.TextureRegion
 import com.badlogic.gdx.graphics.glutils.ShapeRenderer
+import com.badlogic.gdx.math.MathUtils
 import com.badlogic.gdx.math.Rectangle
-import ru.deadsoftware.cavedroid.game.GameInput
+import ru.deadsoftware.cavedroid.game.mobs.MobsController
 import ru.deadsoftware.cavedroid.game.model.block.Block
 import ru.deadsoftware.cavedroid.game.world.GameWorld
 import ru.deadsoftware.cavedroid.misc.Assets
@@ -12,7 +14,7 @@ import ru.deadsoftware.cavedroid.misc.utils.px
 
 abstract class BlocksRenderer(
     protected val gameWorld: GameWorld,
-    protected val gameInput: GameInput,
+    protected val mobsController: MobsController,
 ) : IGameRenderer {
 
     protected abstract val background: Boolean
@@ -20,24 +22,38 @@ abstract class BlocksRenderer(
     private val Block.canSeeThrough
         get() = isNone() || params.isTransparent
 
-    private fun blockDamageTexture(index: Int): TextureRegion? {
-        if (index !in 0..MAX_BLOCK_DAMAGE_INDEX) {
+    private fun blockDamageSprite(index: Int): Sprite? {
+        if (index !in 0..MAX_BLOCK_DAMAGE_INDEX) {
             return null
         }
-        val textureKey = "$BLOCK_DAMAGE_TEXTURE_PREFIX$index"
-        return Assets.textureRegions[textureKey]
+        return Assets.blockDamageSprites[index]
     }
 
-    private fun drawBlockDamage(spriteBatch: SpriteBatch, block: Block, x: Float, y: Float) {
-        val blockDamage = gameInput.blockDamage
-        if (blockDamage <= 0) {
-            return
+    protected fun drawBlockDamage(spriteBatch: SpriteBatch, viewport: Rectangle) {
+        val player = mobsController.player
+        val blockDamage = player.blockDamage.takeIf { it > 0f } ?: return
+        val cursorX = player.cursorX
+        val cursorY = player.cursorY
+
+        val block = if (background) {
+            gameWorld.getBackMap(cursorX, cursorY)
+        } else {
+            gameWorld.getForeMap(cursorX, cursorY)
         }
 
-        val index = MAX_BLOCK_DAMAGE_INDEX * (blockDamage / block.params.hitPoints)
-        val texture = blockDamageTexture(index) ?: return
+        val index = (MAX_BLOCK_DAMAGE_INDEX.toFloat() * (blockDamage.toFloat() / block.params.hitPoints.toFloat()))
+            .let(MathUtils::floor)
+        val sprite = blockDamageSprite(index) ?: return
 
-        spriteBatch.draw(texture, x, y)
+        if (gameWorld.hasForeAt(cursorX, cursorY) != background) {
+            sprite.setBounds(
+                /* x = */ cursorX.px - viewport.x + block.params.spriteMargins.left,
+                /* y = */ cursorY.px - viewport.y + block.params.spriteMargins.top,
+                /* width = */ block.spriteWidth,
+                /* height = */ block.spriteHeight
+            )
+            sprite.draw(spriteBatch)
+        }
     }
 
     protected fun shadeBackMap(
@@ -72,10 +88,6 @@ abstract class BlocksRenderer(
             val drawX = x.px - viewport.x
             val drawY = y.px - viewport.y
             backgroundBlock.draw(spriteBatch, drawX, drawY)
-
-            if (foregroundBlock.isNone()) {
-                drawBlockDamage(spriteBatch, backgroundBlock, drawX, drawY)
-            }
         }
     }
 
@@ -86,15 +98,10 @@ abstract class BlocksRenderer(
             val drawX = x.px - viewport.x
             val drawY = y.px - viewport.y
             foregroundBlock.draw(spriteBatch, drawX, drawY)
-
-            if (!foregroundBlock.isNone()) {
-                drawBlockDamage(spriteBatch, foregroundBlock, drawX, drawY)
-            }
         }
     }
 
     companion object {
-        private const val BLOCK_DAMAGE_TEXTURE_PREFIX = "break_"
         private const val MAX_BLOCK_DAMAGE_INDEX = 10
     }