DEADSOFTWARE

Add furnace, more craft and items
[cavedroid.git] / core / src / ru / deadsoftware / cavedroid / game / render / windows / FurnaceWindowRenderer.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.Rectangle
7 import com.badlogic.gdx.utils.TimeUtils
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.MobsController
12 import ru.deadsoftware.cavedroid.game.objects.furnace.Furnace
13 import ru.deadsoftware.cavedroid.game.render.IGameRenderer
14 import ru.deadsoftware.cavedroid.game.render.WindowsRenderer
15 import ru.deadsoftware.cavedroid.game.ui.windows.GameWindowsConfigs
16 import ru.deadsoftware.cavedroid.game.ui.windows.GameWindowsManager
17 import ru.deadsoftware.cavedroid.game.ui.windows.inventory.FurnaceInventoryWindow
18 import ru.deadsoftware.cavedroid.misc.Assets
19 import ru.deadsoftware.cavedroid.misc.utils.drawSprite
20 import ru.deadsoftware.cavedroid.misc.utils.withScissors
21 import javax.inject.Inject
23 @GameScope
24 class FurnaceWindowRenderer @Inject constructor(
25 private val mainConfig: MainConfig,
26 private val mobsController: MobsController,
27 private val gameWindowsManager: GameWindowsManager,
28 private val gameItemsHolder: GameItemsHolder,
29 ) : AbstractWindowRenderer(), IGameRenderer {
31 override val renderLayer get() = WindowsRenderer.RENDER_LAYER
33 private val furnaceWindowTexture get() = requireNotNull(Assets.textureRegions[FURNACE_WINDOW_KEY])
36 override fun draw(spriteBatch: SpriteBatch, shapeRenderer: ShapeRenderer, viewport: Rectangle, delta: Float) {
37 val windowTexture = furnaceWindowTexture
39 val window = gameWindowsManager.currentWindow as FurnaceInventoryWindow
41 val windowX = viewport.width / 2 - windowTexture.regionWidth / 2
42 val windowY = viewport.height / 2 - windowTexture.regionHeight / 2
44 spriteBatch.draw(windowTexture, windowX, windowY)
45 drawItemsGrid(
46 spriteBatch = spriteBatch,
47 shapeRenderer = shapeRenderer,
48 gridX = windowX + GameWindowsConfigs.Furnace.itemsGridMarginLeft,
49 gridY = windowY + GameWindowsConfigs.Furnace.itemsGridMarginTop,
50 items = mobsController.player.inventory.items.asSequence()
51 .drop(GameWindowsConfigs.Furnace.hotbarCells)
52 .take(GameWindowsConfigs.Furnace.itemsInCol * GameWindowsConfigs.Furnace.itemsInRow)
53 .asIterable(),
54 itemsInRow = GameWindowsConfigs.Furnace.itemsInRow,
55 cellWidth = GameWindowsConfigs.Furnace.itemsGridColWidth,
56 cellHeight = GameWindowsConfigs.Furnace.itemsGridRowHeight,
57 )
59 drawItemsGrid(
60 spriteBatch = spriteBatch,
61 shapeRenderer = shapeRenderer,
62 gridX = windowX + GameWindowsConfigs.Furnace.itemsGridMarginLeft,
63 gridY = windowY + windowTexture.regionHeight - GameWindowsConfigs.Furnace.hotbarOffsetFromBottom,
64 items = mobsController.player.inventory.items.asSequence()
65 .take(GameWindowsConfigs.Furnace.hotbarCells)
66 .asIterable(),
67 itemsInRow = GameWindowsConfigs.Furnace.hotbarCells,
68 cellWidth = GameWindowsConfigs.Furnace.itemsGridColWidth,
69 cellHeight = GameWindowsConfigs.Furnace.itemsGridRowHeight,
70 )
72 window.furnace.fuel?.draw(
73 spriteBatch = spriteBatch,
74 shapeRenderer = shapeRenderer,
75 x = windowX + GameWindowsConfigs.Furnace.smeltFuelMarginLeft,
76 y = windowY + GameWindowsConfigs.Furnace.smeltFuelMarginTop
77 )
79 window.furnace.input?.draw(
80 spriteBatch = spriteBatch,
81 shapeRenderer = shapeRenderer,
82 x = windowX + GameWindowsConfigs.Furnace.smeltInputMarginLeft,
83 y = windowY + GameWindowsConfigs.Furnace.smeltInputMarginTop
84 )
86 window.furnace.result?.draw(
87 spriteBatch = spriteBatch,
88 shapeRenderer = shapeRenderer,
89 x = windowX + GameWindowsConfigs.Furnace.smeltResultOffsetX,
90 y = windowY + GameWindowsConfigs.Furnace.smeltResultOffsetY
91 )
93 if (window.furnace.isActive) {
94 val burn = GameWindowsConfigs.Furnace.fuelBurnHeight * window.furnace.burnProgress
96 spriteBatch.withScissors(
97 mainConfig = mainConfig,
98 x = windowX + GameWindowsConfigs.Furnace.fuelBurnMarginLeft,
99 y = windowY + GameWindowsConfigs.Furnace.fuelBurnMarginTop + burn,
100 width = Assets.furnaceBurn.width,
101 height = GameWindowsConfigs.Furnace.fuelBurnHeight,
102 ) {
103 spriteBatch.drawSprite(
104 sprite = Assets.furnaceBurn,
105 x = windowX + GameWindowsConfigs.Furnace.fuelBurnMarginLeft,
106 y = windowY + GameWindowsConfigs.Furnace.fuelBurnMarginTop
110 if (window.furnace.canSmelt()) {
111 val progress = GameWindowsConfigs.Furnace.progressWidth * window.furnace.smeltProgress
113 spriteBatch.withScissors(
114 mainConfig = mainConfig,
115 x = windowX + GameWindowsConfigs.Furnace.progressMarginLeft,
116 y = windowY + GameWindowsConfigs.Furnace.progressMarginTop,
117 width = progress,
118 height = Assets.furnaceProgress.height
119 ) {
120 spriteBatch.drawSprite(
121 sprite = Assets.furnaceProgress,
122 x = windowX + GameWindowsConfigs.Furnace.progressMarginLeft,
123 y = windowY + GameWindowsConfigs.Furnace.progressMarginTop,
129 window.selectedItem?.drawSelected(
130 spriteBatch = spriteBatch,
131 x = Gdx.input.x * (viewport.width / Gdx.graphics.width),
132 y = Gdx.input.y * (viewport.height / Gdx.graphics.height)
136 companion object {
137 private const val FURNACE_WINDOW_KEY = "furnace"