DEADSOFTWARE

Add some survival inventory controls
[cavedroid.git] / core / src / ru / deadsoftware / cavedroid / game / render / windows / SurvivalWindowRenderer.kt
1 package ru.deadsoftware.cavedroid.game.render.windows
3 import com.badlogic.gdx.Gdx
4 import com.badlogic.gdx.graphics.g2d.SpriteBatch
5 import com.badlogic.gdx.graphics.glutils.ShapeRenderer
6 import com.badlogic.gdx.math.MathUtils
7 import com.badlogic.gdx.math.Rectangle
8 import ru.deadsoftware.cavedroid.MainConfig
9 import ru.deadsoftware.cavedroid.game.GameScope
10 import ru.deadsoftware.cavedroid.game.mobs.Mob
11 import ru.deadsoftware.cavedroid.game.mobs.MobsController
12 import ru.deadsoftware.cavedroid.game.render.IGameRenderer
13 import ru.deadsoftware.cavedroid.game.render.WindowsRenderer
14 import ru.deadsoftware.cavedroid.game.windows.GameWindowsConfigs
15 import ru.deadsoftware.cavedroid.game.windows.GameWindowsManager
16 import ru.deadsoftware.cavedroid.misc.Assets
17 import javax.inject.Inject
18 import kotlin.math.atan
20 @GameScope
21 class SurvivalWindowRenderer @Inject constructor(
22 private val mainConfig: MainConfig,
23 private val mobsController: MobsController,
24 private val gameWindowsManager: GameWindowsManager,
25 ) : AbstractWindowRenderer(), IGameRenderer {
27 override val renderLayer get() = WindowsRenderer.RENDER_LAYER
29 private val survivalWindowTexture get() = requireNotNull(Assets.textureRegions[SURVIVAL_WINDOW_KEY])
31 private fun setPortraitHeadRotation(portraitX: Float, portraitY: Float) {
32 if (mainConfig.isTouch) {
33 return
34 }
36 val mouseX = Gdx.input.x * (mainConfig.width / Gdx.graphics.width)
37 val mouseY = Gdx.input.y * (mainConfig.height / Gdx.graphics.height)
39 val h = mouseX.toDouble() - portraitX.toDouble()
40 val v = mouseY.toDouble() - portraitY.toDouble()
42 mobsController.player.setDir(
43 if (mouseX < portraitX + mobsController.player.width / 2)
44 Mob.Direction.LEFT
45 else
46 Mob.Direction.RIGHT
47 )
49 mobsController.player.headRotation = atan(v / h).toFloat() * MathUtils.radDeg
50 }
52 private fun drawPlayerPortrait(spriteBatch: SpriteBatch, windowX: Float, windowY: Float, delta: Float) {
53 val portraitX = windowX + GameWindowsConfigs.Survival.portraitMarginLeft +
54 (GameWindowsConfigs.Survival.portraitWidth / 2 - mobsController.player.width / 2)
55 val portraitY = windowY + GameWindowsConfigs.Survival.portraitMarginTop +
56 (GameWindowsConfigs.Survival.portraitHeight / 2 - mobsController.player.height / 2)
58 setPortraitHeadRotation(portraitX, portraitY)
59 mobsController.player.draw(spriteBatch, portraitX, portraitY, delta)
60 }
62 override fun draw(spriteBatch: SpriteBatch, shapeRenderer: ShapeRenderer, viewport: Rectangle, delta: Float) {
63 val survivalWindow = survivalWindowTexture
65 val windowX = viewport.width / 2 - survivalWindow.regionWidth / 2
66 val windowY = viewport.height / 2 - survivalWindow.regionHeight / 2
68 spriteBatch.draw(survivalWindow, windowX, windowY)
70 drawPlayerPortrait(spriteBatch, windowX, windowY, delta)
72 drawItemsGrid(
73 spriteBatch = spriteBatch,
74 shapeRenderer = shapeRenderer,
75 gridX = windowX + GameWindowsConfigs.Survival.itemsGridMarginLeft,
76 gridY = windowY + GameWindowsConfigs.Survival.itemsGridMarginTop,
77 items = mobsController.player.inventory.asSequence()
78 .drop(GameWindowsConfigs.Survival.hotbarCells)
79 .take(GameWindowsConfigs.Survival.itemsInCol * GameWindowsConfigs.Survival.itemsInRow)
80 .asIterable(),
81 itemsInRow = GameWindowsConfigs.Survival.itemsInRow,
82 cellWidth = GameWindowsConfigs.Survival.itemsGridColWidth,
83 cellHeight = GameWindowsConfigs.Survival.itemsGridRowHeight,
84 )
86 drawItemsGrid(
87 spriteBatch = spriteBatch,
88 shapeRenderer = shapeRenderer,
89 gridX = windowX + GameWindowsConfigs.Survival.itemsGridMarginLeft,
90 gridY = windowY + survivalWindow.regionHeight - GameWindowsConfigs.Survival.hotbarOffsetFromBottom,
91 items = mobsController.player.inventory.asSequence()
92 .take(GameWindowsConfigs.Survival.hotbarCells)
93 .asIterable(),
94 itemsInRow = GameWindowsConfigs.Survival.hotbarCells,
95 cellWidth = GameWindowsConfigs.Survival.itemsGridColWidth,
96 cellHeight = GameWindowsConfigs.Survival.itemsGridRowHeight,
97 )
99 gameWindowsManager.selectedItem?.drawSelected(
100 spriteBatch = spriteBatch,
101 x = Gdx.input.x * (viewport.width / Gdx.graphics.width),
102 y = Gdx.input.y * (viewport.height / Gdx.graphics.height)
106 companion object {
107 private const val SURVIVAL_WINDOW_KEY = "survival"