DEADSOFTWARE

Add crafting
[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.GameItemsHolder
10 import ru.deadsoftware.cavedroid.game.GameScope
11 import ru.deadsoftware.cavedroid.game.mobs.Mob
12 import ru.deadsoftware.cavedroid.game.mobs.MobsController
13 import ru.deadsoftware.cavedroid.game.render.IGameRenderer
14 import ru.deadsoftware.cavedroid.game.render.WindowsRenderer
15 import ru.deadsoftware.cavedroid.game.windows.GameWindowsConfigs
16 import ru.deadsoftware.cavedroid.game.windows.GameWindowsManager
17 import ru.deadsoftware.cavedroid.game.windows.inventory.SurvivalInventoryWindow
18 import ru.deadsoftware.cavedroid.misc.Assets
19 import javax.inject.Inject
20 import kotlin.math.atan
22 @GameScope
23 class SurvivalWindowRenderer @Inject constructor(
24 private val mainConfig: MainConfig,
25 private val mobsController: MobsController,
26 private val gameWindowsManager: GameWindowsManager,
27 private val gameItemsHolder: GameItemsHolder,
28 ) : AbstractWindowRenderer(), IGameRenderer {
30 override val renderLayer get() = WindowsRenderer.RENDER_LAYER
32 private val survivalWindowTexture get() = requireNotNull(Assets.textureRegions[SURVIVAL_WINDOW_KEY])
34 private fun setPortraitHeadRotation(portraitX: Float, portraitY: Float) {
35 if (mainConfig.isTouch) {
36 return
37 }
39 val mouseX = Gdx.input.x * (mainConfig.width / Gdx.graphics.width)
40 val mouseY = Gdx.input.y * (mainConfig.height / Gdx.graphics.height)
42 val h = mouseX.toDouble() - portraitX.toDouble()
43 val v = mouseY.toDouble() - portraitY.toDouble()
45 mobsController.player.setDir(
46 if (mouseX < portraitX + mobsController.player.width / 2)
47 Mob.Direction.LEFT
48 else
49 Mob.Direction.RIGHT
50 )
52 mobsController.player.headRotation = atan(v / h).toFloat() * MathUtils.radDeg
53 }
55 private fun drawPlayerPortrait(spriteBatch: SpriteBatch, windowX: Float, windowY: Float, delta: Float) {
56 val portraitX = windowX + GameWindowsConfigs.Survival.portraitMarginLeft +
57 (GameWindowsConfigs.Survival.portraitWidth / 2 - mobsController.player.width / 2)
58 val portraitY = windowY + GameWindowsConfigs.Survival.portraitMarginTop +
59 (GameWindowsConfigs.Survival.portraitHeight / 2 - mobsController.player.height / 2)
61 setPortraitHeadRotation(portraitX, portraitY)
62 mobsController.player.draw(spriteBatch, portraitX, portraitY, delta)
63 }
65 override fun draw(spriteBatch: SpriteBatch, shapeRenderer: ShapeRenderer, viewport: Rectangle, delta: Float) {
66 val windowTexture = survivalWindowTexture
67 val window = gameWindowsManager.currentWindow as SurvivalInventoryWindow
69 val windowX = viewport.width / 2 - windowTexture.regionWidth / 2
70 val windowY = viewport.height / 2 - windowTexture.regionHeight / 2
72 spriteBatch.draw(windowTexture, windowX, windowY)
74 drawPlayerPortrait(spriteBatch, windowX, windowY, delta)
76 drawItemsGrid(
77 spriteBatch = spriteBatch,
78 shapeRenderer = shapeRenderer,
79 gridX = windowX + GameWindowsConfigs.Survival.itemsGridMarginLeft,
80 gridY = windowY + GameWindowsConfigs.Survival.itemsGridMarginTop,
81 items = mobsController.player.inventory.asSequence()
82 .drop(GameWindowsConfigs.Survival.hotbarCells)
83 .take(GameWindowsConfigs.Survival.itemsInCol * GameWindowsConfigs.Survival.itemsInRow)
84 .asIterable(),
85 itemsInRow = GameWindowsConfigs.Survival.itemsInRow,
86 cellWidth = GameWindowsConfigs.Survival.itemsGridColWidth,
87 cellHeight = GameWindowsConfigs.Survival.itemsGridRowHeight,
88 )
90 drawItemsGrid(
91 spriteBatch = spriteBatch,
92 shapeRenderer = shapeRenderer,
93 gridX = windowX + GameWindowsConfigs.Survival.itemsGridMarginLeft,
94 gridY = windowY + windowTexture.regionHeight - GameWindowsConfigs.Survival.hotbarOffsetFromBottom,
95 items = mobsController.player.inventory.asSequence()
96 .take(GameWindowsConfigs.Survival.hotbarCells)
97 .asIterable(),
98 itemsInRow = GameWindowsConfigs.Survival.hotbarCells,
99 cellWidth = GameWindowsConfigs.Survival.itemsGridColWidth,
100 cellHeight = GameWindowsConfigs.Survival.itemsGridRowHeight,
103 drawItemsGrid(
104 spriteBatch = spriteBatch,
105 shapeRenderer = shapeRenderer,
106 gridX = windowX + GameWindowsConfigs.Survival.craftOffsetX,
107 gridY = windowY + GameWindowsConfigs.Survival.craftOffsetY,
108 items = window.craftingItems.asSequence().mapIndexedNotNull { index, it ->
109 if (index % 3 > 1 || index / 3 > 1) {
110 null
111 } else {
112 it ?: gameItemsHolder.fallbackItem.toInventoryItem()
114 }.asIterable(),
115 itemsInRow = GameWindowsConfigs.Survival.craftGridSize,
116 cellWidth = GameWindowsConfigs.Survival.itemsGridColWidth,
117 cellHeight = GameWindowsConfigs.Survival.itemsGridRowHeight,
120 window.craftResult?.draw(
121 spriteBatch = spriteBatch,
122 shapeRenderer = shapeRenderer,
123 x = windowX + GameWindowsConfigs.Survival.craftResultOffsetX,
124 y = windowY + GameWindowsConfigs.Survival.craftResultOffsetY
127 window.selectedItem?.drawSelected(
128 spriteBatch = spriteBatch,
129 x = Gdx.input.x * (viewport.width / Gdx.graphics.width),
130 y = Gdx.input.y * (viewport.height / Gdx.graphics.height)
134 companion object {
135 private const val SURVIVAL_WINDOW_KEY = "survival"