DEADSOFTWARE

Add update blocks logic actions
[cavedroid.git] / core / src / ru / deadsoftware / cavedroid / game / world / GameWorldBlocksLogicControllerTask.kt
1 package ru.deadsoftware.cavedroid.game.world
3 import com.badlogic.gdx.Gdx
4 import com.badlogic.gdx.utils.TimeUtils
5 import com.badlogic.gdx.utils.Timer.Task
6 import ru.deadsoftware.cavedroid.game.GameScope
7 import ru.deadsoftware.cavedroid.game.actions.getRequiresBlockAction
8 import ru.deadsoftware.cavedroid.game.actions.updateblock.IUpdateBlockAction
9 import ru.deadsoftware.cavedroid.game.mobs.MobsController
10 import javax.inject.Inject
12 @GameScope
13 class GameWorldBlocksLogicControllerTask @Inject constructor(
14 private val gameWorld: GameWorld,
15 private val updateBlockActions: Map<String, @JvmSuppressWildcards IUpdateBlockAction>,
16 private val mobsController: MobsController,
17 ) : Task() {
19 private var currentRelativeChunk = 0
21 private fun getChunkStart(): Int {
22 val playerX = mobsController.player.mapX
23 val playerChunk = playerX / CHUNK_WIDTH
24 val currentChunk = playerChunk - CHUNKS / 2 + currentRelativeChunk
26 return currentChunk * 16
27 }
29 private fun updateBlock(x: Int, y: Int) {
30 val block = gameWorld.getForeMapBlock(x, y)
31 val blockKey = block.key
32 val action = updateBlockActions[blockKey]
33 ?: updateBlockActions.getRequiresBlockAction().takeIf { block.requiresBlock }
35 action?.update(x, y)
36 }
38 override fun run() {
39 val startX = getChunkStart()
41 for (y in gameWorld.height downTo 0) {
42 for (x in startX ..< startX + CHUNK_WIDTH) {
43 updateBlock(x, y)
44 }
45 }
47 currentRelativeChunk = (currentRelativeChunk + 1) % CHUNKS
48 }
50 companion object {
51 private const val TAG = "GameWorldBlocksLogicControllerTask"
53 private const val CHUNK_WIDTH = 16
54 private const val CHUNKS = 3
56 const val WORLD_BLOCKS_LOGIC_UPDATE_INTERVAL_SEC = .1f
57 }
59 }