mirror of
https://github.com/curioustorvald/Terrarum.git
synced 2026-03-07 12:21:52 +09:00
288 lines
9.2 KiB
Kotlin
288 lines
9.2 KiB
Kotlin
package net.torvald.terrarum.ui
|
|
|
|
import com.badlogic.gdx.Gdx
|
|
import com.badlogic.gdx.graphics.Camera
|
|
import com.badlogic.gdx.graphics.Color
|
|
import com.badlogic.gdx.graphics.GL20
|
|
import com.badlogic.gdx.graphics.g2d.SpriteBatch
|
|
import com.badlogic.gdx.graphics.glutils.ShapeRenderer
|
|
import net.torvald.terrarum.*
|
|
import net.torvald.terrarum.gameactors.ActorWithPhysics
|
|
import net.torvald.terrarum.gameactors.ActorInventory.Companion.CAPACITY_MODE_NO_ENCUMBER
|
|
import net.torvald.terrarum.gameactors.Pocketed
|
|
import net.torvald.terrarum.gameactors.Second
|
|
import net.torvald.terrarum.langpack.Lang
|
|
import net.torvald.terrarumsansbitmap.gdx.TextureRegionPack
|
|
|
|
/**
|
|
* Created by minjaesong on 2017-10-21.
|
|
*/
|
|
class UIInventoryFull(
|
|
var actor: Pocketed?,
|
|
|
|
toggleKeyLiteral: Int? = null, toggleButtonLiteral: Int? = null,
|
|
// UI positions itself? (you must g.flush() yourself after the g.translate(Int, Int))
|
|
customPositioning: Boolean = false, // mainly used by vital meter
|
|
doNotWarnConstant: Boolean = false
|
|
) : UICanvas(toggleKeyLiteral, toggleButtonLiteral, customPositioning, doNotWarnConstant) {
|
|
|
|
override var width: Int = Terrarum.WIDTH
|
|
override var height: Int = Terrarum.HEIGHT
|
|
|
|
val internalWidth: Int = 630
|
|
val internalHeight: Int = 558 // grad_begin..grad_end..contents..grad_begin..grad_end
|
|
|
|
|
|
|
|
internal val catIcons: TextureRegionPack = TextureRegionPack("./assets/graphics/gui/inventory/category.tga", 20, 20)
|
|
internal val catArrangement: IntArray = intArrayOf(9,6,7,1,0,2,3,4,5,8)
|
|
|
|
|
|
|
|
private val SP = "${0x3000.toChar()}${0x3000.toChar()}"
|
|
val listControlHelp: String
|
|
get() = if (Terrarum.environment == RunningEnvironment.PC)
|
|
"${0xe031.toChar()} ${Lang["GAME_ACTION_CLOSE"]}$SP" +
|
|
"${0xe006.toChar()} ${Lang["GAME_INVENTORY_USE"]}$SP" +
|
|
"${0xe011.toChar()}..${0xe010.toChar()} ${Lang["GAME_INVENTORY_REGISTER"]}$SP" +
|
|
"${0xe034.toChar()} ${Lang["GAME_INVENTORY_DROP"]}"
|
|
else
|
|
"${0xe069.toChar()} ${Lang["GAME_ACTION_CLOSE"]}$SP" +
|
|
"${Terrarum.joypadLabelNinY} ${Lang["GAME_INVENTORY_USE"]}$SP" +
|
|
"${0xe011.toChar()}${0xe010.toChar()} ${Lang["GAME_INVENTORY_REGISTER"]}$SP" +
|
|
"${Terrarum.joypadLabelNinA} ${Lang["GAME_INVENTORY_DROP"]}"
|
|
val controlHelpHeight = Terrarum.fontGame.lineHeight
|
|
|
|
private var encumbrancePerc = 0f
|
|
private var isEncumbered = false
|
|
|
|
|
|
val catBarWidth = 330
|
|
val catBar = UIItemInventoryCatBar(
|
|
this,
|
|
(Terrarum.WIDTH - catBarWidth) / 2,
|
|
66 + (Terrarum.HEIGHT - internalHeight) / 2,
|
|
catBarWidth
|
|
)
|
|
val catSelection: Int
|
|
get() = catBar.selectedIndex
|
|
val catSelectedIcon: Int
|
|
get() = catBar.selectedIcon
|
|
|
|
override var openCloseTime: Second = 0.0f
|
|
|
|
|
|
private val itemList: UIItemInventoryDynamicList? =
|
|
if (actor != null) {
|
|
UIItemInventoryDynamicList(
|
|
this,
|
|
actor!!.inventory,
|
|
0 + (Terrarum.WIDTH - internalWidth) / 2,
|
|
109 + (Terrarum.HEIGHT - internalHeight) / 2
|
|
)
|
|
}
|
|
else null
|
|
|
|
|
|
private val equipped: UIItemInventoryEquippedView? =
|
|
if (actor != null) {
|
|
UIItemInventoryEquippedView(
|
|
this,
|
|
actor!!.inventory,
|
|
actor as ActorWithPhysics,
|
|
internalWidth - UIItemInventoryEquippedView.width + (Terrarum.WIDTH - internalWidth) / 2,
|
|
109 + (Terrarum.HEIGHT - internalHeight) / 2
|
|
)
|
|
}
|
|
else null
|
|
|
|
|
|
|
|
init {
|
|
addItem(catBar)
|
|
itemList?.let { addItem(it) }
|
|
equipped?.let { addItem(it) }
|
|
|
|
|
|
catBar.selectionChangeListener = { old, new -> rebuildList() }
|
|
|
|
|
|
|
|
rebuildList()
|
|
|
|
}
|
|
|
|
private var offsetX = ((Terrarum.WIDTH - internalWidth) / 2).toFloat()
|
|
private var offsetY = ((Terrarum.HEIGHT - internalHeight) / 2).toFloat()
|
|
|
|
|
|
|
|
override fun updateUI(delta: Float) {
|
|
if (handler.openFired) {
|
|
rebuildList()
|
|
}
|
|
|
|
|
|
catBar.update(delta)
|
|
itemList?.update(delta)
|
|
equipped?.update(delta)
|
|
}
|
|
|
|
private val gradStartCol = Color(0x404040_60)
|
|
private val gradEndCol = Color(0x000000_70)
|
|
private val shapeRenderer = ShapeRenderer()
|
|
private val gradHeight = 48f
|
|
|
|
private val weightBarWidth = 60f
|
|
|
|
override fun renderUI(batch: SpriteBatch, camera: Camera) {
|
|
val xEnd = (Terrarum.WIDTH + internalWidth).div(2).toFloat()
|
|
val yEnd = (Terrarum.HEIGHT + internalHeight).div(2).toFloat()
|
|
|
|
|
|
// background fill
|
|
batch.end()
|
|
Gdx.gl.glEnable(GL20.GL_BLEND) // ending the batch disables blend
|
|
|
|
val gradTopStart = (Terrarum.HEIGHT - internalHeight).div(2).toFloat()
|
|
val gradBottomEnd = Terrarum.HEIGHT - gradTopStart
|
|
|
|
shapeRenderer.inUse {
|
|
shapeRenderer.rect(0f, gradTopStart, Terrarum.WIDTH.toFloat(), gradHeight, gradStartCol, gradStartCol, gradEndCol, gradEndCol)
|
|
shapeRenderer.rect(0f, gradBottomEnd, Terrarum.WIDTH.toFloat(), -gradHeight, gradStartCol, gradStartCol, gradEndCol, gradEndCol)
|
|
|
|
shapeRenderer.rect(0f, gradTopStart + gradHeight, Terrarum.WIDTH.toFloat(), internalHeight - (2 * gradHeight), gradEndCol, gradEndCol, gradEndCol, gradEndCol)
|
|
|
|
shapeRenderer.rect(0f, 0f, Terrarum.WIDTH.toFloat(), gradTopStart, gradStartCol, gradStartCol, gradStartCol, gradStartCol)
|
|
shapeRenderer.rect(0f, Terrarum.HEIGHT.toFloat(), Terrarum.WIDTH.toFloat(), -(Terrarum.HEIGHT.toFloat() - gradBottomEnd), gradStartCol, gradStartCol, gradStartCol, gradStartCol)
|
|
}
|
|
|
|
|
|
batch.begin()
|
|
|
|
// UI items
|
|
catBar.render(batch, camera)
|
|
itemList?.render(batch, camera)
|
|
equipped?.render(batch, camera)
|
|
|
|
|
|
// control hints
|
|
blendNormal(batch)
|
|
batch.color = Color.WHITE
|
|
Terrarum.fontGame.draw(batch, listControlHelp, offsetX, offsetY + internalHeight)
|
|
|
|
|
|
// encumbrance meter
|
|
if (actor != null) {
|
|
val encumbranceText = Lang["GAME_INVENTORY_ENCUMBRANCE"]
|
|
|
|
Terrarum.fontGame.draw(batch,
|
|
encumbranceText,
|
|
xEnd - 9 - Terrarum.fontGame.getWidth(encumbranceText) - weightBarWidth,
|
|
yEnd
|
|
)
|
|
|
|
// encumbrance bar background
|
|
blendMul()
|
|
batch.color = Color(0xa0a0a0_ff.toInt())
|
|
batch.fillRect(
|
|
xEnd - 3 - weightBarWidth,
|
|
yEnd + 3f,
|
|
weightBarWidth,
|
|
controlHelpHeight - 6f
|
|
)
|
|
// encumbrance bar
|
|
blendNormal()
|
|
batch.color = if (isEncumbered) Color(0xff0000_cc.toInt()) else Color(0x00ff00_cc.toInt())
|
|
batch.fillRect(
|
|
xEnd - 3 - weightBarWidth,
|
|
yEnd + 3f,
|
|
if (actor?.inventory?.capacityMode == CAPACITY_MODE_NO_ENCUMBER)
|
|
1f
|
|
else // make sure 1px is always be seen
|
|
minOf(weightBarWidth, maxOf(1f, weightBarWidth * encumbrancePerc)),
|
|
controlHelpHeight - 5f
|
|
)
|
|
}
|
|
}
|
|
|
|
|
|
|
|
fun rebuildList() {
|
|
itemList?.rebuild()
|
|
equipped?.rebuild()
|
|
|
|
actor?.let {
|
|
encumbrancePerc = actor!!.inventory.capacity.toFloat() / actor!!.inventory.maxCapacity
|
|
isEncumbered = actor!!.inventory.isEncumbered
|
|
}
|
|
}
|
|
|
|
override fun dispose() {
|
|
catBar.dispose()
|
|
itemList?.dispose()
|
|
equipped?.dispose()
|
|
}
|
|
|
|
|
|
|
|
override fun doOpening(delta: Float) {
|
|
Terrarum.ingame?.setTooltipMessage(null)
|
|
}
|
|
|
|
override fun doClosing(delta: Float) {
|
|
Terrarum.ingame?.setTooltipMessage(null)
|
|
}
|
|
|
|
override fun endOpening(delta: Float) {
|
|
}
|
|
|
|
override fun endClosing(delta: Float) {
|
|
Terrarum.ingame?.setTooltipMessage(null) // required!!
|
|
}
|
|
|
|
|
|
|
|
override fun resize(width: Int, height: Int) {
|
|
super.resize(width, height)
|
|
|
|
offsetX = ((Terrarum.WIDTH - internalWidth) / 2).toFloat()
|
|
offsetY = ((Terrarum.HEIGHT - internalHeight) / 2).toFloat()
|
|
}
|
|
|
|
|
|
|
|
override fun keyDown(keycode: Int): Boolean {
|
|
return super.keyDown(keycode)
|
|
}
|
|
|
|
override fun keyTyped(character: Char): Boolean {
|
|
return super.keyTyped(character)
|
|
}
|
|
|
|
override fun touchDown(screenX: Int, screenY: Int, pointer: Int, button: Int): Boolean {
|
|
return super.touchDown(screenX, screenY, pointer, button)
|
|
}
|
|
|
|
override fun keyUp(keycode: Int): Boolean {
|
|
return super.keyUp(keycode)
|
|
}
|
|
|
|
override fun mouseMoved(screenX: Int, screenY: Int): Boolean {
|
|
return super.mouseMoved(screenX, screenY)
|
|
}
|
|
|
|
override fun touchDragged(screenX: Int, screenY: Int, pointer: Int): Boolean {
|
|
return super.touchDragged(screenX, screenY, pointer)
|
|
}
|
|
|
|
override fun touchUp(screenX: Int, screenY: Int, pointer: Int, button: Int): Boolean {
|
|
return super.touchUp(screenX, screenY, pointer, button)
|
|
}
|
|
|
|
override fun scrolled(amount: Int): Boolean {
|
|
return super.scrolled(amount)
|
|
}
|
|
|
|
|
|
} |