mirror of
https://github.com/curioustorvald/Terrarum.git
synced 2026-06-09 18:14:06 +09:00
145 lines
5.5 KiB
Kotlin
145 lines
5.5 KiB
Kotlin
package net.torvald.terrarum.modulebasegame.ui
|
|
|
|
import com.badlogic.gdx.graphics.Camera
|
|
import com.badlogic.gdx.graphics.Color
|
|
import com.badlogic.gdx.graphics.OrthographicCamera
|
|
import com.badlogic.gdx.graphics.g2d.SpriteBatch
|
|
import com.jme3.math.FastMath
|
|
import net.torvald.terrarum.*
|
|
import net.torvald.terrarum.gameactors.AVKey
|
|
import net.torvald.terrarum.modulebasegame.TerrarumIngame
|
|
import net.torvald.terrarum.modulebasegame.ui.UIItemInventoryCellCommonRes.toItemCountText
|
|
import net.torvald.terrarum.modulebasegame.ui.UIQuickslotBar.Companion.COMMON_OPEN_CLOSE
|
|
import net.torvald.terrarum.modulebasegame.ui.UIQuickslotBar.Companion.SLOT_COUNT
|
|
import net.torvald.terrarum.ui.Toolkit
|
|
import net.torvald.terrarum.ui.UICanvas
|
|
import net.torvald.terrarum.ui.UINotControllable
|
|
import org.dyn4j.geometry.Vector2
|
|
import kotlin.math.roundToInt
|
|
|
|
/**
|
|
* The Sims styled pie representation of the Quickslot.
|
|
*
|
|
* Created by minjaesong on 2016-07-20.
|
|
*/
|
|
@UINotControllable
|
|
class UIQuickslotPie : UICanvas() {
|
|
|
|
init {
|
|
handler.allowESCtoClose = false
|
|
}
|
|
|
|
private val cellSize = ItemSlotImageFactory.slotImage.tileW
|
|
|
|
private val slotCount = UIQuickslotBar.SLOT_COUNT
|
|
|
|
private val slotDistanceFromCentre: Double
|
|
get() = cellSize * 2.666 * handler.scale
|
|
override var width: Int = cellSize * 7
|
|
override var height: Int = width
|
|
|
|
|
|
/**
|
|
* In milliseconds
|
|
*/
|
|
override var openCloseTime: Second = COMMON_OPEN_CLOSE
|
|
|
|
private val smallenSize = 0.92f
|
|
|
|
var selection: Int = -1
|
|
|
|
override fun updateUI(delta: Float) {
|
|
if (selection >= 0 && (Terrarum.ingame!! as TerrarumIngame).actorNowPlaying != null)
|
|
(Terrarum.ingame!! as TerrarumIngame).actorNowPlaying!!.actorValue[AVKey.__PLAYER_QUICKSLOTSEL] =
|
|
selection % slotCount
|
|
|
|
|
|
// update controls
|
|
if (handler.isOpened || handler.isOpening) {
|
|
val cursorPos = Vector2(Terrarum.mouseScreenX.toDouble(), Terrarum.mouseScreenY.toDouble())
|
|
val centre = Vector2(Toolkit.hdrawWidth.toDouble(), App.scr.halfh.toDouble())
|
|
val deg = -(centre - cursorPos).direction.toFloat()
|
|
|
|
selection = Math.round(deg * slotCount / FastMath.TWO_PI)
|
|
if (selection < 0) selection += SLOT_COUNT
|
|
|
|
// TODO add gamepad support
|
|
}
|
|
}
|
|
|
|
private val drawColor = Color(1f, 1f, 1f, 1f)
|
|
|
|
override fun renderUI(frameDelta: Float, batch: SpriteBatch, camera: OrthographicCamera) {
|
|
// draw radial thingies
|
|
for (i in 0 until slotCount) {
|
|
val qs = (Terrarum.ingame!! as TerrarumIngame).actorNowPlaying?.inventory?.getQuickslotItem(i)
|
|
val item = ItemCodex[qs?.itm]
|
|
val itemHasGauge = ((item?.maxDurability ?: 0) > 0.0) || item?.stackable == true
|
|
|
|
// set position
|
|
val angle = Math.PI * 2.0 * (i.toDouble() / slotCount) + Math.PI // 180 deg monitor-wise
|
|
val slotCentrePoint = Vector2(0.0, slotDistanceFromCentre).setDirection(-angle) // NOTE: NOT a center of circle!
|
|
|
|
// draw cells
|
|
val image = if (i == selection)
|
|
ItemSlotImageFactory.produceLarge(false, (i + 1) % SLOT_COUNT, item, itemHasGauge)
|
|
else
|
|
ItemSlotImageFactory.produce(true, (i + 1) % SLOT_COUNT, item)
|
|
|
|
val slotX = slotCentrePoint.x.toInt()
|
|
val slotY = slotCentrePoint.y.toInt()
|
|
|
|
drawColor.a = UIQuickslotBar.DISPLAY_OPACITY
|
|
batch.color = drawColor
|
|
image.draw(batch, slotX, slotY)
|
|
|
|
// durability meter/item count for the selected cell
|
|
if (i == selection && item != null) {
|
|
if (item.maxDurability > 0.0) {
|
|
val percentage = item.durability / item.maxDurability
|
|
val barCol = UIItemInventoryCellCommonRes.getHealthMeterColour(percentage, 0f, 1f)
|
|
val barBack = barCol mul UIItemInventoryCellCommonRes.meterBackDarkening
|
|
val durabilityIndex = percentage.times(38).roundToInt()
|
|
|
|
// draw bar background
|
|
batch.color = barBack
|
|
batch.draw(ItemSlotImageFactory.slotImage.get(8,7), slotX - 19f, slotY - 19f)
|
|
// draw bar foreground
|
|
batch.color = barCol
|
|
batch.draw(ItemSlotImageFactory.slotImage.get(durabilityIndex % 10,4 + durabilityIndex / 10), slotX - 19f, slotY - 19f)
|
|
}
|
|
else if (item.stackable) {
|
|
val amountString = qs!!.qty.toItemCountText()
|
|
batch.color = Color(0xfff066_ff.toInt())
|
|
val textLen = amountString.length * App.fontSmallNumbers.W
|
|
val y = slotY + 25 - App.fontSmallNumbers.H
|
|
val x = slotX - 19 + (38 - textLen) / 2
|
|
App.fontSmallNumbers.draw(batch, amountString, x.toFloat(), y.toFloat())
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
override fun doOpening(delta: Float) {
|
|
doOpeningFade(this, openCloseTime)
|
|
handler.scale = smallenSize + (1f.minus(smallenSize) * handler.opacity)
|
|
}
|
|
|
|
override fun doClosing(delta: Float) {
|
|
doClosingFade(this, openCloseTime)
|
|
handler.scale = smallenSize + (1f.minus(smallenSize) * handler.opacity)
|
|
}
|
|
|
|
override fun endOpening(delta: Float) {
|
|
endOpeningFade(this)
|
|
handler.scale = 1f
|
|
}
|
|
|
|
override fun endClosing(delta: Float) {
|
|
endClosingFade(this)
|
|
handler.scale = 1f
|
|
}
|
|
|
|
override fun dispose() {
|
|
}
|
|
} |