storage chest still wip

This commit is contained in:
minjaesong
2021-03-13 15:48:14 +09:00
parent d093c2cb30
commit c25e9f92be
11 changed files with 148 additions and 98 deletions

View File

@@ -17,6 +17,7 @@ import net.torvald.terrarum.AppLoader.*
import net.torvald.terrarum.gameactors.Actor
import net.torvald.terrarum.gameactors.ActorID
import net.torvald.terrarum.itemproperties.ItemCodex
import net.torvald.terrarum.ui.UICanvas
import net.torvald.terrarum.worlddrawer.CreateTileAtlas
import net.torvald.terrarum.worlddrawer.WorldCamera
import net.torvald.terrarumsansbitmap.gdx.GameFontBase
@@ -26,7 +27,6 @@ import java.io.File
import java.io.PrintStream
import kotlin.math.absoluteValue
import kotlin.math.round
import kotlin.math.roundToInt
@@ -578,3 +578,48 @@ fun printStackTrace(obj: Any, out: PrintStream = System.out) {
}
}
}
class UIContainer {
private val data = ArrayList<Any>()
fun add(vararg things: Any) {
things.forEach {
if (it is UICanvas || it is Id_UICanvasNullable)
data.add(it)
else throw IllegalArgumentException(it.javaClass.name) }
}
fun iterator() = object : Iterator<UICanvas?> {
private var cursor = 0
override fun hasNext() = cursor < data.size
override fun next(): UICanvas? {
val it = data[cursor]
// whatever the fucking reason when() does not work
if (it is UICanvas) {
cursor += 1
return it
}
else if (it is Id_UICanvasNullable) {
cursor += 1
return it.get()
}
else throw IllegalArgumentException("Unacceptable type ${it.javaClass.name}, instance of ${it.javaClass.superclass.name}")
}
}
fun forEach(operation: (UICanvas?) -> Unit) = iterator().forEach(operation)
fun countVisible(): Int {
var c = 0
forEach { if (it?.isVisible == true) c += 1 }
return c
}
fun contains(element: Any) = data.contains(element)
fun <T> map(transformation: (UICanvas?) -> T) = iterator().asSequence().map(transformation)
}
interface Id_UICanvasNullable {
fun get(): UICanvas?
}

View File

@@ -114,7 +114,7 @@ class TitleScreen(batch: SpriteBatch) : IngameInstance(batch) {
private val gradWhiteBottom = Color(0xd8d8d8ff.toInt())
val uiContainer = ArrayList<UICanvas?>()
val uiContainer = UIContainer()
private lateinit var uiMenu: UICanvas
private lateinit var worldFBO: FrameBuffer
@@ -242,7 +242,7 @@ class TitleScreen(batch: SpriteBatch) : IngameInstance(batch) {
if (!demoWorld.layerTerrain.ptr.destroyed) { // FIXME q&d hack to circumvent the dangling pointer issue #26
IngameRenderer.invoke(gamePaused = false, uisToDraw = uiContainer)
IngameRenderer.invoke(gamePaused = false, uiContainer = uiContainer)
}
else {
printdbgerr(this, "Demoworld is already been destroyed")

View File

@@ -113,8 +113,8 @@ class IngameController(val terrarumIngame: TerrarumIngame) : InputAdapter() {
}
}
terrarumIngame.uiContainer.forEach { it.keyDown(keycode) } // for KeyboardControlled UIcanvases
terrarumIngame.uiContainer.forEach { it?.keyDown(keycode) } // for KeyboardControlled UIcanvases
// Debug UIs
if (keycode == Input.Keys.GRAVE) {
terrarumIngame.consoleHandler.toggleOpening()
@@ -138,9 +138,8 @@ class IngameController(val terrarumIngame: TerrarumIngame) : InputAdapter() {
terrarumIngame.uiQuickBar.setAsOpen()
}
terrarumIngame.uiContainer.forEach { it.keyUp(keycode) } // for KeyboardControlled UIcanvases
terrarumIngame.uiContainer.forEach { it?.keyUp(keycode) } // for KeyboardControlled UIcanvases
// screenshot key
if (keycode == Input.Keys.F12) f12Down = false
@@ -149,12 +148,12 @@ class IngameController(val terrarumIngame: TerrarumIngame) : InputAdapter() {
}
override fun keyTyped(character: Char): Boolean {
terrarumIngame.uiContainer.forEach { if (it.isVisible) it.keyTyped(character) }
terrarumIngame.uiContainer.forEach { if (it?.isVisible == true) it.keyTyped(character) }
return true
}
override fun mouseMoved(screenX: Int, screenY: Int): Boolean {
terrarumIngame.uiContainer.forEach { it.mouseMoved(screenX, screenY) }
terrarumIngame.uiContainer.forEach { it?.mouseMoved(screenX, screenY) }
return true
}
@@ -162,7 +161,7 @@ class IngameController(val terrarumIngame: TerrarumIngame) : InputAdapter() {
// don't separate Player from this! Physics will break, esp. airborne manoeuvre
if (!terrarumIngame.paused) {
// fire world click events; the event is defined as Ingame's (or any others') WorldClick event
if (terrarumIngame.uiContainer.map { if ((it.isOpening || it.isOpened) && it.mouseUp) 1 else 0 }.sum() == 0) { // no UI on the mouse, right?
if (terrarumIngame.uiContainer.map { if ((it?.isOpening == true || it?.isOpened == true) && it.mouseUp) 1 else 0 }.sum() == 0) { // no UI on the mouse, right?
if (
button == AppLoader.getConfigInt("config_mouseprimary") ||
@@ -181,8 +180,7 @@ class IngameController(val terrarumIngame: TerrarumIngame) : InputAdapter() {
terrarumIngame.uiQuickBar.setAsOpen()
}
terrarumIngame.uiContainer.forEach { it.touchUp(screenX, screenY, pointer, button) } // for MouseControlled UIcanvases
terrarumIngame.uiContainer.forEach { it?.touchUp(screenX, screenY, pointer, button) } // for MouseControlled UIcanvases
return true
}
@@ -197,18 +195,18 @@ class IngameController(val terrarumIngame: TerrarumIngame) : InputAdapter() {
}
}
terrarumIngame.uiContainer.forEach { it.scrolled(amount) }
terrarumIngame.uiContainer.forEach { it?.scrolled(amount) }
return true
}
override fun touchDragged(screenX: Int, screenY: Int, pointer: Int): Boolean {
terrarumIngame.uiContainer.forEach { it.touchDragged(screenX, screenY, pointer) }
terrarumIngame.uiContainer.forEach { it?.touchDragged(screenX, screenY, pointer) }
return true
}
override fun touchDown(screenX: Int, screenY: Int, pointer: Int, button: Int): Boolean {
terrarumIngame.uiContainer.forEach { it.touchDown(screenX, screenY, pointer, button) }
terrarumIngame.uiContainer.forEach { it?.touchDown(screenX, screenY, pointer, button) }
// pie menu
if (button == AppLoader.getConfigInt("config_mousequicksel")) {
terrarumIngame.uiPieMenu.setAsOpen()

View File

@@ -116,7 +116,7 @@ class BuildingMaker(batch: SpriteBatch) : IngameInstance(batch) {
val uiPenMenu = UIBuildingMakerPenMenu(this)
val uiContainer = ArrayList<UICanvas?>()
val uiContainer = UIContainer()
private val pensMustShowSelection = arrayOf(
PENMODE_MARQUEE, PENMODE_MARQUEE_ERASE
@@ -392,7 +392,7 @@ class BuildingMaker(batch: SpriteBatch) : IngameInstance(batch) {
private fun renderGame() {
_testMarkerDrawCalls = 0L
IngameRenderer.invoke(false, actorsRenderOverlay = if (showSelection) actorsRenderOverlay + essentialOverlays else essentialOverlays, uisToDraw = uiContainer)
IngameRenderer.invoke(false, actorsRenderOverlay = if (showSelection) actorsRenderOverlay + essentialOverlays else essentialOverlays, uiContainer = uiContainer)
AppLoader.setDebugTime("Test.MarkerDrawCalls", _testMarkerDrawCalls)
}

View File

@@ -173,7 +173,7 @@ object IngameRenderer : Disposable {
actorsRenderOverlay: List<ActorWithBody>? = null,
particlesContainer : CircularArray<ParticleBase>? = null,
player: ActorWithBody? = null,
uisToDraw: List<UICanvas?>? = null
uiContainer: UIContainer? = null
) {
renderingActorsCount = (actorsRenderBehind?.size ?: 0) +
(actorsRenderMiddle?.size ?: 0) +
@@ -182,15 +182,9 @@ object IngameRenderer : Disposable {
(actorsRenderOverlay?.size ?: 0)
//renderingParticleCount = particlesContainer?.size ?: 0
//renderingParticleCount = (particlesContainer?.buffer?.map { (!it.flagDespawn).toInt() } ?: listOf(0)).sum()
renderingUIsCount = ((uisToDraw?.map { (it?.isVisible ?: false).toInt() }) ?: listOf(0)).sum()
renderingUIsCount = uiContainer?.countVisible() ?: 0
val zoom = Terrarum.ingame?.screenZoom ?: 1f
if (uisToDraw != null) {
uiListToDraw = uisToDraw
}
invokeInit()
batch.color = Color.WHITE
@@ -331,7 +325,7 @@ object IngameRenderer : Disposable {
batch.shader = null
batch.color = Color.WHITE
uiListToDraw.forEach {
uiContainer?.forEach {
it?.render(batch, camera)
}
}

View File

@@ -4,8 +4,8 @@ import com.badlogic.gdx.Gdx
import com.badlogic.gdx.Input
import com.badlogic.gdx.graphics.Camera
import com.badlogic.gdx.graphics.g2d.SpriteBatch
import com.badlogic.gdx.utils.GdxRuntimeException
import net.torvald.EMDASH
import net.torvald.UnsafeHelper
import net.torvald.terrarum.*
import net.torvald.terrarum.AppLoader.printdbg
import net.torvald.terrarum.blockproperties.BlockPropUtil
@@ -62,7 +62,7 @@ open class TerrarumIngame(batch: SpriteBatch) : IngameInstance(batch) {
//val actorContainerActive = ArrayList<Actor>(ACTORCONTAINER_INITIAL_SIZE)
//val actorContainerInactive = ArrayList<Actor>(ACTORCONTAINER_INITIAL_SIZE)
val particlesContainer = CircularArray<ParticleBase>(PARTICLES_MAX, true)
val uiContainer = ArrayList<UICanvas>()
val uiContainer = UIContainer()
private val actorsRenderBehind = ArrayList<ActorWithBody>(ACTORCONTAINER_INITIAL_SIZE)
private val actorsRenderMiddle = ArrayList<ActorWithBody>(ACTORCONTAINER_INITIAL_SIZE)
@@ -118,13 +118,20 @@ open class TerrarumIngame(batch: SpriteBatch) : IngameInstance(batch) {
* This will not allow multiple fixture UIs from popping up (does not prevent them actually being open)
* because UI updating and rendering is whitelist-operated
*/
var uiFixture: UICanvas? = null
private var uiFixture: UICanvas? = null
set(value) {
printdbg(this, "uiFixture change: $uiFixture -> $value")
field?.let { it.setAsClose() }
value?.let { uiFixturesHistory.add(it) }
field = value
}
val getUIFixture = object : Id_UICanvasNullable { // quick workaround for the type erasure (you can't use lambda...)
override fun get(): UICanvas? {
return uiFixture
}
}
lateinit var uiInventoryContainer: UICanvas
lateinit var uiVitalPrimary: UICanvas
lateinit var uiVitalSecondary: UICanvas
@@ -361,7 +368,7 @@ open class TerrarumIngame(batch: SpriteBatch) : IngameInstance(batch) {
// batch-process uiAliases
// NOTE: UIs that should pause the game (e.g. Inventory) must have relevant codes ON THEIR SIDE
arrayListOf(
uiContainer.add(
// drawn first
//uiVitalPrimary,
//uiVitalSecondary,
@@ -373,13 +380,12 @@ open class TerrarumIngame(batch: SpriteBatch) : IngameInstance(batch) {
uiWatchTierOne,
UIScreenZoom(),
uiInventoryPlayer,
//uiInventoryContainer,
getUIFixture,
uiTooltip,
consoleHandler,
uiCheatMotherfuckerNootNoot
// drawn last
).forEach { addUI(it) }
)
ingameUpdateThread = ThreadIngameUpdate(this)
@@ -605,8 +611,13 @@ open class TerrarumIngame(batch: SpriteBatch) : IngameInstance(batch) {
Gdx.graphics.setTitle(getCanonicalTitle())
filterVisibleActors()
uiContainer.forEach { it.update(Gdx.graphics.rawDeltaTime) }
uiFixture?.update(Gdx.graphics.rawDeltaTime)
uiContainer.forEach {
when (it) {
is UICanvas -> it.update(Gdx.graphics.rawDeltaTime)
is Id_UICanvasNullable -> it.get()?.update(Gdx.graphics.rawDeltaTime)
}
}
//uiFixture?.update(Gdx.graphics.rawDeltaTime)
// deal with the uiFixture being closed
if (uiFixture?.isClosed == true) { uiFixture = null }
@@ -619,7 +630,7 @@ open class TerrarumIngame(batch: SpriteBatch) : IngameInstance(batch) {
visibleActorsRenderOverlay,
particlesContainer,
actorNowPlaying,
uiContainer + uiFixture
uiContainer// + uiFixture
)
}
@@ -828,7 +839,7 @@ open class TerrarumIngame(batch: SpriteBatch) : IngameInstance(batch) {
if (actor.referenceID == theRealGamer.referenceID || actor.referenceID == 0x51621D) // do not delete this magic
throw RuntimeException("Attempted to remove player.")
val indexToDelete = actorContainerActive.searchForIndex(actor.referenceID!!) { it.referenceID!! }
val indexToDelete = actorContainerActive.searchForIndex(actor.referenceID) { it.referenceID!! }
if (indexToDelete != null) {
printdbg(this, "Removing actor $actor")
printStackTrace(this)
@@ -840,23 +851,23 @@ open class TerrarumIngame(batch: SpriteBatch) : IngameInstance(batch) {
if (actor is ActorWithBody) {
when (actor.renderOrder) {
Actor.RenderOrder.BEHIND -> {
val i = actorsRenderBehind.binarySearch(actor.referenceID!!)
val i = actorsRenderBehind.binarySearch(actor.referenceID)
actorsRenderBehind.removeAt(i)
}
Actor.RenderOrder.MIDDLE -> {
val i = actorsRenderMiddle.binarySearch(actor.referenceID!!)
val i = actorsRenderMiddle.binarySearch(actor.referenceID)
actorsRenderMiddle.removeAt(i)
}
Actor.RenderOrder.MIDTOP -> {
val i = actorsRenderMidTop.binarySearch(actor.referenceID!!)
val i = actorsRenderMidTop.binarySearch(actor.referenceID)
actorsRenderMidTop.removeAt(i)
}
Actor.RenderOrder.FRONT -> {
val i = actorsRenderFront.binarySearch(actor.referenceID!!)
val i = actorsRenderFront.binarySearch(actor.referenceID)
actorsRenderFront.removeAt(i)
}
Actor.RenderOrder.OVERLAY-> {
val i = actorsRenderOverlay.binarySearch(actor.referenceID!!)
val i = actorsRenderOverlay.binarySearch(actor.referenceID)
actorsRenderFront.removeAt(i)
}
}
@@ -864,7 +875,7 @@ open class TerrarumIngame(batch: SpriteBatch) : IngameInstance(batch) {
}
}
private fun ArrayList<*>.binarySearch(actor: Actor) = this.binarySearch(actor.referenceID!!)
private fun ArrayList<*>.binarySearch(actor: Actor) = this.binarySearch(actor.referenceID)
private fun ArrayList<*>.binarySearch(ID: Int): Int {
// code from collections/Collections.kt
@@ -892,7 +903,7 @@ open class TerrarumIngame(batch: SpriteBatch) : IngameInstance(batch) {
override fun addNewActor(actor: Actor?) {
if (actor == null) return
if (AppLoader.IS_DEVELOPMENT_BUILD && theGameHasActor(actor.referenceID!!)) {
if (AppLoader.IS_DEVELOPMENT_BUILD && theGameHasActor(actor.referenceID)) {
throw Error("The actor $actor already exists in the game")
}
else {
@@ -924,8 +935,8 @@ open class TerrarumIngame(batch: SpriteBatch) : IngameInstance(batch) {
}
fun activateDormantActor(actor: Actor) {
if (AppLoader.IS_DEVELOPMENT_BUILD && !isInactive(actor.referenceID!!)) {
if (isActive(actor.referenceID!!))
if (AppLoader.IS_DEVELOPMENT_BUILD && !isInactive(actor.referenceID)) {
if (isActive(actor.referenceID))
throw Error("The actor $actor is already activated")
else
throw Error("The actor $actor already exists in the game")
@@ -960,17 +971,6 @@ open class TerrarumIngame(batch: SpriteBatch) : IngameInstance(batch) {
particlesContainer.appendHead(particle)
}
fun addUI(ui: UICanvas) {
// check for exact duplicates
if (uiContainer.contains(ui)) {
throw IllegalArgumentException(
"Exact copy of the UI already exists: The instance of ${ui.javaClass.simpleName}"
)
}
uiContainer.add(ui)
}
private fun insertionSortLastElemAV(arr: ArrayList<ActorWithBody>) { // out-projection doesn't work, duh
ReentrantLock().lock {
var j = arr.lastIndex - 1
@@ -1003,7 +1003,7 @@ open class TerrarumIngame(batch: SpriteBatch) : IngameInstance(batch) {
}
override fun hide() {
uiContainer.forEach { it.handler.dispose() }
uiContainer.forEach { it?.handler?.dispose() }
}
@@ -1063,15 +1063,17 @@ open class TerrarumIngame(batch: SpriteBatch) : IngameInstance(batch) {
actorsRenderOverlay.forEach { it.dispose() }
uiContainer.forEach {
it.handler.dispose()
it.dispose()
it?.handler?.dispose()
it?.dispose()
}
uiFixturesHistory.forEach {
it.handler.dispose()
it.dispose()
try {
it.handler.dispose()
it.dispose()
}
catch (e: GdxRuntimeException) {}
}
super.dispose()
}
}

View File

@@ -44,9 +44,7 @@ internal object UIStorageChest : UICanvas(), HasInventory {
override var height = 512
override var openCloseTime: Second = 0.0f
private val negotiator = object : InventoryNegotiator {
override fun getItemFilter(): List<String> = listOf(CAT_ALL)
private val negotiator = object : InventoryNegotiator() {
override fun accept(item: GameItem, amount: Int) {
TODO("Not yet implemented")
}
@@ -66,32 +64,38 @@ internal object UIStorageChest : UICanvas(), HasInventory {
TODO("Not yet implemented")
}
private lateinit var catBar: UIItemInventoryCatBar
private lateinit var itemList: UIItemInventoryItemGrid
init {
catBar = UIItemInventoryCatBar(
this,
100,
50,
500,
500,
{ itemList.rebuild(catBar.catIconsMeaning[catBar.selectedIcon]) },
false
)
itemList = UIItemInventoryItemGrid(
this,
catBar,
Terrarum.ingame!!.actorNowPlaying!!.inventory, // just for a placeholder...
100,
100,
4, 5,
drawScrollOnRightside = true,
drawWallet = true,
listRebuildFun = { itemListUpdate() }
)
handler.allowESCtoClose = true
addUIitem(catBar)
addUIitem(itemList)
}
private val catBar = UIItemInventoryCatBar(
this,
100,
50,
500,
500,
{},
false
)
private val itemList = UIItemInventoryItemGrid(
this,
catBar,
Terrarum.ingame!!.actorNowPlaying!!.inventory, // just for a placeholder...
100,
100,
4, 5,
drawScrollOnRightside = true,
drawWallet = true,
listRebuildFun = { itemListUpdate() }
)
private fun itemListUpdate() {
itemList.rebuild(catBar.catIconsMeaning[catBar.selectedIcon])
}
@@ -104,6 +108,7 @@ internal object UIStorageChest : UICanvas(), HasInventory {
override fun renderUI(batch: SpriteBatch, camera: Camera) {
batch.color = Color.WHITE
catBar.render(batch, camera)
itemList.render(batch, camera)
}

View File

@@ -1,15 +1,16 @@
package net.torvald.terrarum.modulebasegame.ui
import net.torvald.terrarum.UIItemInventoryCatBar.Companion.CAT_ALL
import net.torvald.terrarum.gameitem.GameItem
/**
* Created by minjaesong on 2021-03-12.
*/
interface InventoryNegotiator {
abstract class InventoryNegotiator {
/** Retrieve item filter to be used to show only the acceptable items when player's own inventory is being displayed */
fun getItemFilter(): List<String> // GameItem.Category
open fun getItemFilter(): List<String> = listOf(CAT_ALL) // GameItem.Category
/** Accepts item from the player and pass it to right inventory (object), slot (UI), etc... */
fun accept(item: GameItem, amount: Int = 1)
abstract fun accept(item: GameItem, amount: Int = 1)
/** Rejects item and perhaps returns it back to the player, or make explosion, etc... */
fun reject(item: GameItem, amount: Int = 1)
abstract fun reject(item: GameItem, amount: Int = 1)
}

View File

@@ -221,6 +221,8 @@ class UIItemInventoryItemGrid(
gridModeButtons[1].highlighted = false
itemPage = 0
rebuild(currentFilter)
println("ItemGridMode 0 touchdown")
}
gridModeButtons[1].touchDownListener = { _, _, _, _ ->
isCompactMode = true
@@ -228,6 +230,8 @@ class UIItemInventoryItemGrid(
gridModeButtons[1].highlighted = true
itemPage = 0
rebuild(currentFilter)
println("ItemGridMode 1 touchdown")
}
scrollUpButton.clickOnceListener = { _, _, _ ->

View File

@@ -65,10 +65,6 @@ abstract class UICanvas(
*/
val handler = UIHandler(toggleKeyLiteral, toggleButtonLiteral, customPositioning, doNotWarnConstant)
init {
}
/**
* In milliseconds
*
@@ -285,6 +281,9 @@ abstract class UICanvas(
// end of handler func aliases
init {
if (uiItems.isEmpty()) println("UICanvas '${this.javaClass.name}' has no UIItem registered, just so you know...")
}
companion object {
const val OPENCLOSE_GENERIC = 0.2f

View File

@@ -193,6 +193,8 @@ abstract class UIItem(var parentUI: UICanvas, val initialX: Int, val initialY: I
return false
}
open fun touchDown(screenX: Int, screenY: Int, pointer: Int, button: Int): Boolean {
println("uiitem ${this.javaClass.name} touchdown")
var actionDone = false
if (parentUI.isVisible) {