mirror of
https://github.com/curioustorvald/Terrarum.git
synced 2026-06-12 11:34:05 +09:00
colour-changing durability and encumbrance bar
This commit is contained in:
@@ -5,12 +5,12 @@ import com.badlogic.gdx.graphics.Camera
|
|||||||
import com.badlogic.gdx.graphics.Color
|
import com.badlogic.gdx.graphics.Color
|
||||||
import com.badlogic.gdx.graphics.g2d.SpriteBatch
|
import com.badlogic.gdx.graphics.g2d.SpriteBatch
|
||||||
import com.badlogic.gdx.graphics.g2d.TextureRegion
|
import com.badlogic.gdx.graphics.g2d.TextureRegion
|
||||||
import net.torvald.colourutil.CIELabUtil.darkerLab
|
|
||||||
import net.torvald.terrarum.itemproperties.GameItem
|
import net.torvald.terrarum.itemproperties.GameItem
|
||||||
import net.torvald.terrarum.itemproperties.ItemCodex
|
import net.torvald.terrarum.itemproperties.ItemCodex
|
||||||
import net.torvald.terrarum.modulebasegame.Ingame
|
import net.torvald.terrarum.modulebasegame.Ingame
|
||||||
import net.torvald.terrarum.modulebasegame.ui.UIInventoryFull
|
import net.torvald.terrarum.modulebasegame.ui.UIInventoryFull
|
||||||
import net.torvald.terrarum.modulebasegame.ui.UIItemInventoryCellBase
|
import net.torvald.terrarum.modulebasegame.ui.UIItemInventoryCellBase
|
||||||
|
import net.torvald.terrarum.modulebasegame.ui.UIItemInventoryCellCommonRes
|
||||||
import net.torvald.terrarum.ui.UIItemTextButton
|
import net.torvald.terrarum.ui.UIItemTextButton
|
||||||
|
|
||||||
/***
|
/***
|
||||||
@@ -45,8 +45,6 @@ class UIItemInventoryElem(
|
|||||||
val height = 48
|
val height = 48
|
||||||
val UNIQUE_ITEM_HAS_NO_AMOUNT = -1
|
val UNIQUE_ITEM_HAS_NO_AMOUNT = -1
|
||||||
|
|
||||||
internal val durabilityCol = Color(0x22ff11_ff)
|
|
||||||
internal val durabilityBack: Color; get() = durabilityCol.darkerLab(0.4f)
|
|
||||||
internal val durabilityBarThickness = 3f
|
internal val durabilityBarThickness = 3f
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -126,11 +124,14 @@ class UIItemInventoryElem(
|
|||||||
// durability metre
|
// durability metre
|
||||||
val barFullLen = (width - 8f) - textOffsetX
|
val barFullLen = (width - 8f) - textOffsetX
|
||||||
val barOffset = posX + textOffsetX
|
val barOffset = posX + textOffsetX
|
||||||
|
val percentage = if (item!!.maxDurability < 0.00001f) 0f else item!!.durability / item!!.maxDurability
|
||||||
|
val durabilityCol = UIItemInventoryCellCommonRes.getHealthMeterColour(percentage, 0f, 1f)
|
||||||
|
val durabilityBack = durabilityCol mul UIItemInventoryCellCommonRes.meterBackDarkening
|
||||||
if (item!!.maxDurability > 0.0) {
|
if (item!!.maxDurability > 0.0) {
|
||||||
batch.color = durabilityBack
|
batch.color = durabilityBack
|
||||||
batch.drawStraightLine(barOffset, posY + durabilityBarOffY, barOffset + barFullLen, durabilityBarThickness, false)
|
batch.drawStraightLine(barOffset, posY + durabilityBarOffY, barOffset + barFullLen, durabilityBarThickness, false)
|
||||||
batch.color = durabilityCol
|
batch.color = durabilityCol
|
||||||
batch.drawStraightLine(barOffset, posY + durabilityBarOffY, barOffset + barFullLen * (item!!.durability / item!!.maxDurability), durabilityBarThickness, false)
|
batch.drawStraightLine(barOffset, posY + durabilityBarOffY, barOffset + barFullLen * percentage, durabilityBarThickness, false)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -10,6 +10,7 @@ import net.torvald.terrarum.itemproperties.ItemCodex
|
|||||||
import net.torvald.terrarum.modulebasegame.Ingame
|
import net.torvald.terrarum.modulebasegame.Ingame
|
||||||
import net.torvald.terrarum.modulebasegame.ui.UIInventoryFull
|
import net.torvald.terrarum.modulebasegame.ui.UIInventoryFull
|
||||||
import net.torvald.terrarum.modulebasegame.ui.UIItemInventoryCellBase
|
import net.torvald.terrarum.modulebasegame.ui.UIItemInventoryCellBase
|
||||||
|
import net.torvald.terrarum.modulebasegame.ui.UIItemInventoryCellCommonRes
|
||||||
import net.torvald.terrarum.ui.UIItemTextButton
|
import net.torvald.terrarum.ui.UIItemTextButton
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -94,11 +95,14 @@ class UIItemInventoryElemSimple(
|
|||||||
val barFullLen = width
|
val barFullLen = width
|
||||||
val barOffset = posX.toFloat()
|
val barOffset = posX.toFloat()
|
||||||
val thickness = UIItemInventoryElem.durabilityBarThickness
|
val thickness = UIItemInventoryElem.durabilityBarThickness
|
||||||
|
val percentage = item!!.durability / item!!.maxDurability
|
||||||
|
val durabilityCol = UIItemInventoryCellCommonRes.getHealthMeterColour(percentage, 0f, 1f)
|
||||||
|
val durabilityBack = durabilityCol mul UIItemInventoryCellCommonRes.meterBackDarkening
|
||||||
if (item!!.maxDurability > 0.0) {
|
if (item!!.maxDurability > 0.0) {
|
||||||
batch.color = UIItemInventoryElem.durabilityBack
|
batch.color = durabilityBack
|
||||||
batch.drawStraightLine(barOffset, posY + height - thickness, barOffset + barFullLen, thickness, false)
|
batch.drawStraightLine(barOffset, posY + height - thickness, barOffset + barFullLen, thickness, false)
|
||||||
batch.color = UIItemInventoryElem.durabilityCol
|
batch.color = durabilityCol
|
||||||
batch.drawStraightLine(barOffset, posY + height - thickness, barOffset + barFullLen * (item!!.durability / item!!.maxDurability), thickness, false)
|
batch.drawStraightLine(barOffset, posY + height - thickness, barOffset + barFullLen * percentage, thickness, false)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// draw item count when applicable
|
// draw item count when applicable
|
||||||
|
|||||||
@@ -7,6 +7,7 @@ import com.badlogic.gdx.graphics.g2d.SpriteBatch
|
|||||||
import com.badlogic.gdx.graphics.glutils.FrameBuffer
|
import com.badlogic.gdx.graphics.glutils.FrameBuffer
|
||||||
import com.badlogic.gdx.graphics.glutils.ShapeRenderer
|
import com.badlogic.gdx.graphics.glutils.ShapeRenderer
|
||||||
import net.torvald.terrarum.*
|
import net.torvald.terrarum.*
|
||||||
|
import net.torvald.terrarum.AppLoader.IS_DEVELOPMENT_BUILD
|
||||||
import net.torvald.terrarum.AppLoader.printdbg
|
import net.torvald.terrarum.AppLoader.printdbg
|
||||||
import net.torvald.terrarum.Terrarum.gamepadLabelEast
|
import net.torvald.terrarum.Terrarum.gamepadLabelEast
|
||||||
import net.torvald.terrarum.Terrarum.gamepadLabelLStick
|
import net.torvald.terrarum.Terrarum.gamepadLabelLStick
|
||||||
@@ -229,7 +230,7 @@ class UIInventoryFull(
|
|||||||
private val shapeRenderer = ShapeRenderer()
|
private val shapeRenderer = ShapeRenderer()
|
||||||
private val gradHeight = 48f
|
private val gradHeight = 48f
|
||||||
|
|
||||||
private val weightBarWidth = 60f
|
private val weightBarWidth = 64f
|
||||||
|
|
||||||
private var xEnd = (Terrarum.WIDTH + internalWidth).div(2).toFloat()
|
private var xEnd = (Terrarum.WIDTH + internalWidth).div(2).toFloat()
|
||||||
private var yEnd = (Terrarum.HEIGHT + internalHeight).div(2).toFloat()
|
private var yEnd = (Terrarum.HEIGHT + internalHeight).div(2).toFloat()
|
||||||
@@ -465,8 +466,6 @@ class UIInventoryFull(
|
|||||||
gameMenuButtons.render(batch, camera)
|
gameMenuButtons.render(batch, camera)
|
||||||
}
|
}
|
||||||
|
|
||||||
private val encumbranceBarBackCol = Color(0xa0a0a0_ff.toInt())
|
|
||||||
|
|
||||||
private fun renderScreenInventory(batch: SpriteBatch, camera: Camera) {
|
private fun renderScreenInventory(batch: SpriteBatch, camera: Camera) {
|
||||||
itemList.render(batch, camera)
|
itemList.render(batch, camera)
|
||||||
equipped.render(batch, camera)
|
equipped.render(batch, camera)
|
||||||
@@ -483,31 +482,41 @@ class UIInventoryFull(
|
|||||||
|
|
||||||
Terrarum.fontGame.draw(batch,
|
Terrarum.fontGame.draw(batch,
|
||||||
encumbranceText,
|
encumbranceText,
|
||||||
xEnd - 9 - Terrarum.fontGame.getWidth(encumbranceText) - weightBarWidth + inventoryScrOffX,
|
xEnd - 6 - Terrarum.fontGame.getWidth(encumbranceText) - weightBarWidth + inventoryScrOffX,
|
||||||
yEnd-20
|
yEnd-20
|
||||||
)
|
)
|
||||||
|
|
||||||
// encumbrance bar background
|
// encumbrance bar background
|
||||||
blendMul(batch)
|
blendNormal(batch)
|
||||||
batch.color = encumbranceBarBackCol
|
val encumbCol = UIItemInventoryCellCommonRes.getHealthMeterColour(1f - encumbrancePerc, 0f, 1f)
|
||||||
|
val encumbBack = encumbCol mul UIItemInventoryCellCommonRes.meterBackDarkening
|
||||||
|
batch.color = encumbBack
|
||||||
batch.fillRect(
|
batch.fillRect(
|
||||||
xEnd - 3 - weightBarWidth + inventoryScrOffX,
|
xEnd - weightBarWidth + inventoryScrOffX,
|
||||||
yEnd-20 + 3f,
|
yEnd-20 + 3f,
|
||||||
weightBarWidth,
|
weightBarWidth,
|
||||||
controlHelpHeight - 6f
|
controlHelpHeight - 6f
|
||||||
)
|
)
|
||||||
// encumbrance bar
|
// encumbrance bar
|
||||||
blendNormal(batch)
|
batch.color = encumbCol
|
||||||
batch.color = if (isEncumbered) Color(0xff0000_cc.toInt()) else Color(0x00ff00_cc.toInt())
|
|
||||||
batch.fillRect(
|
batch.fillRect(
|
||||||
xEnd - 3 - weightBarWidth + inventoryScrOffX,
|
xEnd - weightBarWidth + inventoryScrOffX,
|
||||||
yEnd-20 + 3f,
|
yEnd-20 + 3f,
|
||||||
if (actor.inventory.capacityMode == CAPACITY_MODE_NO_ENCUMBER)
|
if (actor.inventory.capacityMode == CAPACITY_MODE_NO_ENCUMBER)
|
||||||
1f
|
1f
|
||||||
else // make sure 1px is always be seen
|
else // make sure 1px is always be seen
|
||||||
minOf(weightBarWidth, maxOf(1f, weightBarWidth * encumbrancePerc)),
|
minOf(weightBarWidth, maxOf(1f, weightBarWidth * encumbrancePerc)),
|
||||||
controlHelpHeight - 5f
|
controlHelpHeight - 6f
|
||||||
)
|
)
|
||||||
|
// debug text
|
||||||
|
batch.color = Color.LIGHT_GRAY
|
||||||
|
if (IS_DEVELOPMENT_BUILD) {
|
||||||
|
AppLoader.fontSmallNumbers.draw(batch,
|
||||||
|
"${actor.inventory.capacity}/${actor.inventory.maxCapacity}",
|
||||||
|
xEnd - 6 - Terrarum.fontGame.getWidth(encumbranceText) - weightBarWidth + inventoryScrOffX,
|
||||||
|
yEnd-20 + 3f + controlHelpHeight - 4f
|
||||||
|
)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -1,10 +1,14 @@
|
|||||||
package net.torvald.terrarum.modulebasegame.ui
|
package net.torvald.terrarum.modulebasegame.ui
|
||||||
|
|
||||||
|
import com.badlogic.gdx.Gdx
|
||||||
import com.badlogic.gdx.graphics.Camera
|
import com.badlogic.gdx.graphics.Camera
|
||||||
|
import com.badlogic.gdx.graphics.Color
|
||||||
import com.badlogic.gdx.graphics.g2d.SpriteBatch
|
import com.badlogic.gdx.graphics.g2d.SpriteBatch
|
||||||
import com.badlogic.gdx.graphics.g2d.TextureRegion
|
import com.badlogic.gdx.graphics.g2d.TextureRegion
|
||||||
|
import net.torvald.terrarum.GdxColorMap
|
||||||
import net.torvald.terrarum.itemproperties.GameItem
|
import net.torvald.terrarum.itemproperties.GameItem
|
||||||
import net.torvald.terrarum.ui.UIItem
|
import net.torvald.terrarum.ui.UIItem
|
||||||
|
import kotlin.math.roundToInt
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Cross section of two inventory cell types
|
* Cross section of two inventory cell types
|
||||||
@@ -24,3 +28,23 @@ abstract class UIItemInventoryCellBase(
|
|||||||
abstract override fun update(delta: Float)
|
abstract override fun update(delta: Float)
|
||||||
abstract override fun render(batch: SpriteBatch, camera: Camera)
|
abstract override fun render(batch: SpriteBatch, camera: Camera)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
object UIItemInventoryCellCommonRes {
|
||||||
|
val meterColourMap = GdxColorMap(Gdx.files.internal("./assets/clut/health_bar_colouring_4096.tga"))
|
||||||
|
val meterBackDarkening = Color(0x828282ff.toInt())
|
||||||
|
|
||||||
|
fun getHealthMeterColour(value: Float, start: Float, end: Float): Color {
|
||||||
|
if (start > end) throw IllegalArgumentException("Start value is greater than end value: $start..$end")
|
||||||
|
|
||||||
|
return if (value <= start)
|
||||||
|
meterColourMap[0]
|
||||||
|
else if (value >= end)
|
||||||
|
meterColourMap[meterColourMap.width - 1]
|
||||||
|
else {
|
||||||
|
val scale = (value - start) / (end - start)
|
||||||
|
meterColourMap[scale.times(meterColourMap.width - 1).roundToInt()]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fun getHealthMeterColour(value: Int, start: Int, end: Int) = getHealthMeterColour(value.toFloat(), start.toFloat(), end.toFloat())
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user