DEADSOFTWARE

Add survival inventory
[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.misc.Assets
15 import javax.inject.Inject
16 import kotlin.math.atan
18 @GameScope
19 class SurvivalWindowRenderer @Inject constructor(
20 private val mainConfig: MainConfig,
21 private val mobsController: MobsController,
22 ) : AbstractWindowRenderer(), IGameRenderer {
24 override val renderLayer get() = WindowsRenderer.RENDER_LAYER
26 private val survivalWindowTexture get() = requireNotNull(Assets.textureRegions[SURVIVAL_WINDOW_KEY])
28 private fun setPortraitHeadRotation(portraitX: Float, portraitY: Float) {
29 if (mainConfig.isTouch) {
30 return
31 }
33 val mouseX = Gdx.input.x * (mainConfig.width / Gdx.graphics.width)
34 val mouseY = Gdx.input.y * (mainConfig.height / Gdx.graphics.height)
36 val h = mouseX.toDouble() - portraitX.toDouble()
37 val v = mouseY.toDouble() - portraitY.toDouble()
39 mobsController.player.setDir(
40 if (mouseX < portraitX + mobsController.player.width / 2)
41 Mob.Direction.LEFT
42 else
43 Mob.Direction.RIGHT
44 )
46 mobsController.player.headRotation = atan(v / h).toFloat() * MathUtils.radDeg
47 }
49 private fun drawPlayerPortrait(spriteBatch: SpriteBatch, windowX: Float, windowY: Float, delta: Float) {
50 val portraitX = windowX + Config.portraitMarginLeft +
51 (Config.portraitWidth / 2 - mobsController.player.width / 2)
52 val portraitY = windowY + Config.portraitMarginTop +
53 (Config.portraitHeight / 2 - mobsController.player.height / 2)
55 setPortraitHeadRotation(portraitX, portraitY)
56 mobsController.player.draw(spriteBatch, portraitX, portraitY, delta)
57 }
59 override fun draw(spriteBatch: SpriteBatch, shapeRenderer: ShapeRenderer, viewport: Rectangle, delta: Float) {
60 val survivalWindow = survivalWindowTexture
62 val windowX = viewport.width / 2 - survivalWindow.regionWidth / 2
63 val windowY = viewport.height / 2 - survivalWindow.regionHeight / 2
65 spriteBatch.draw(survivalWindow, windowX, windowY)
67 drawPlayerPortrait(spriteBatch, windowX, windowY, delta)
69 drawItemsGrid(
70 spriteBatch = spriteBatch,
71 shapeRenderer = shapeRenderer,
72 gridX = windowX + Config.itemsGridMarginLeft,
73 gridY = windowY + Config.itemsGridMarginTop,
74 items = mobsController.player.inventory.asSequence()
75 .drop(Config.hotbarCells)
76 .take(Config.itemsInCol * Config.itemsInRow)
77 .asIterable(),
78 itemsInRow = Config.itemsInRow,
79 cellWidth = Config.itemsGridColWidth,
80 cellHeight = Config.itemsGridRowHeight,
81 )
83 drawItemsGrid(
84 spriteBatch = spriteBatch,
85 shapeRenderer = shapeRenderer,
86 gridX = windowX + Config.itemsGridMarginLeft,
87 gridY = windowY + survivalWindow.regionHeight - Config.hotbarOffsetFromBottom,
88 items = mobsController.player.inventory.asSequence()
89 .take(Config.hotbarCells)
90 .asIterable(),
91 itemsInRow = Config.hotbarCells,
92 cellWidth = Config.itemsGridColWidth,
93 cellHeight = Config.itemsGridRowHeight,
94 )
95 }
97 companion object {
98 private const val SURVIVAL_WINDOW_KEY = "survival"
100 private data object Config {
101 const val itemsGridMarginLeft = 8f
102 const val itemsGridMarginTop = 84f
104 const val itemsGridRowHeight = 18f
105 const val itemsGridColWidth = 18f
107 const val itemsInRow = 8
108 const val itemsInCol = 5
110 const val hotbarOffsetFromBottom = 24f
111 const val hotbarCells = 9
113 const val portraitMarginLeft = 24f
114 const val portraitMarginTop = 8f
115 const val portraitWidth = 48f
116 const val portraitHeight = 68f