mirror of
https://github.com/curioustorvald/Terrarum.git
synced 2026-06-12 03:24:06 +09:00
dirty way to go back a step with multiple uis in coordination
This commit is contained in:
@@ -29,6 +29,7 @@ import net.torvald.terrarum.ui.Movement
|
|||||||
import net.torvald.terrarum.ui.Toolkit
|
import net.torvald.terrarum.ui.Toolkit
|
||||||
import net.torvald.terrarum.ui.UICanvas
|
import net.torvald.terrarum.ui.UICanvas
|
||||||
import net.torvald.terrarum.ui.UIItem
|
import net.torvald.terrarum.ui.UIItem
|
||||||
|
import net.torvald.terrarum.utils.RandomWordsName
|
||||||
import net.torvald.terrarumsansbitmap.gdx.TextureRegionPack
|
import net.torvald.terrarumsansbitmap.gdx.TextureRegionPack
|
||||||
import java.time.Instant
|
import java.time.Instant
|
||||||
import java.time.format.DateTimeFormatter
|
import java.time.format.DateTimeFormatter
|
||||||
@@ -39,6 +40,34 @@ import kotlin.math.roundToInt
|
|||||||
val SAVE_CELL_WIDTH = 480
|
val SAVE_CELL_WIDTH = 480
|
||||||
val SAVE_CELL_HEIGHT = 120
|
val SAVE_CELL_HEIGHT = 120
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The pinnacle of the dirty coding! This object exists only because I couldn't make
|
||||||
|
* UILoadDemoSavefiles persistent.
|
||||||
|
*
|
||||||
|
* This objects holds which Player and World has been chosen.
|
||||||
|
*
|
||||||
|
* WARNING: the values are not guaranteed to reset when the selector UI is closed!
|
||||||
|
*/
|
||||||
|
object UILoadGovernor {
|
||||||
|
var playerDisk: DiskSkimmer? = null
|
||||||
|
set(value) {
|
||||||
|
printdbg(this, "Player selected: ${value?.diskFile?.name}")
|
||||||
|
field = value
|
||||||
|
}
|
||||||
|
|
||||||
|
var worldDisk: DiskSkimmer? = null
|
||||||
|
set(value) {
|
||||||
|
printdbg(this, "World selected: ${value?.diskFile?.name}")
|
||||||
|
field = value
|
||||||
|
}
|
||||||
|
|
||||||
|
fun reset() {
|
||||||
|
printdbg(this, "Resetting player and world selection")
|
||||||
|
playerDisk = null
|
||||||
|
worldDisk = null
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Only works if current screen set by the App is [TitleScreen]
|
* Only works if current screen set by the App is [TitleScreen]
|
||||||
*
|
*
|
||||||
@@ -46,6 +75,8 @@ val SAVE_CELL_HEIGHT = 120
|
|||||||
*/
|
*/
|
||||||
class UILoadDemoSavefiles(val remoCon: UIRemoCon) : UICanvas() {
|
class UILoadDemoSavefiles(val remoCon: UIRemoCon) : UICanvas() {
|
||||||
|
|
||||||
|
private val hash = RandomWordsName(3)
|
||||||
|
|
||||||
init {
|
init {
|
||||||
CommonResourcePool.addToLoadingList("inventory_category") {
|
CommonResourcePool.addToLoadingList("inventory_category") {
|
||||||
TextureRegionPack("./assets/graphics/gui/inventory/category.tga", 20, 20)
|
TextureRegionPack("./assets/graphics/gui/inventory/category.tga", 20, 20)
|
||||||
@@ -110,15 +141,15 @@ class UILoadDemoSavefiles(val remoCon: UIRemoCon) : UICanvas() {
|
|||||||
|
|
||||||
private var showSpinner = false
|
private var showSpinner = false
|
||||||
|
|
||||||
// used by UIItem*Cells
|
|
||||||
internal var playerDisk: DiskSkimmer? = null
|
|
||||||
internal var worldDisk: DiskSkimmer? = null
|
|
||||||
|
|
||||||
private val worldCells = ArrayList<UIItemWorldCells>()
|
private val worldCells = ArrayList<UIItemWorldCells>()
|
||||||
private val playerCells = ArrayList<UIItemPlayerCells>()
|
private val playerCells = ArrayList<UIItemPlayerCells>()
|
||||||
|
|
||||||
var mode = 0; private set// 0: show players, 1: show worlds
|
var mode = 0; private set// 0: show players, 1: show worlds
|
||||||
|
|
||||||
|
constructor(remoCon: UIRemoCon, mode: Int) : this(remoCon) {
|
||||||
|
this.mode = mode
|
||||||
|
}
|
||||||
|
|
||||||
fun advanceMode() {
|
fun advanceMode() {
|
||||||
mode += 1
|
mode += 1
|
||||||
uiScroll = 0f
|
uiScroll = 0f
|
||||||
@@ -189,6 +220,7 @@ class UILoadDemoSavefiles(val remoCon: UIRemoCon) : UICanvas() {
|
|||||||
private val mode2Node = Yaml(UITitleRemoConYaml.injectedMenuSingleWorldSel).parse()
|
private val mode2Node = Yaml(UITitleRemoConYaml.injectedMenuSingleWorldSel).parse()
|
||||||
|
|
||||||
private val menus = listOf(mode1Node, mode2Node)
|
private val menus = listOf(mode1Node, mode2Node)
|
||||||
|
private val titles = listOf("CONTEXT_CHARACTER", "MENU_LABEL_WORLD")
|
||||||
|
|
||||||
init {
|
init {
|
||||||
// this UI will NOT persist; the parent of the mode1Node must be set using an absolute value (e.g. treeRoot, not remoCon.currentRemoConContents)
|
// this UI will NOT persist; the parent of the mode1Node must be set using an absolute value (e.g. treeRoot, not remoCon.currentRemoConContents)
|
||||||
@@ -199,8 +231,8 @@ class UILoadDemoSavefiles(val remoCon: UIRemoCon) : UICanvas() {
|
|||||||
mode1Node.parent = remoCon.treeRoot
|
mode1Node.parent = remoCon.treeRoot
|
||||||
mode2Node.parent = mode1Node
|
mode2Node.parent = mode1Node
|
||||||
|
|
||||||
mode1Node.data = "MENU_MODE_SINGLEPLAYER+NODISPOSE : net.torvald.terrarum.modulebasegame.ui.UILoadDemoSavefiles"
|
mode1Node.data = "MENU_MODE_SINGLEPLAYER : net.torvald.terrarum.modulebasegame.ui.UILoadDemoSavefiles"
|
||||||
mode2Node.data = "MENU_MODE_SINGLEPLAYER+NODISPOSE : net.torvald.terrarum.modulebasegame.ui.UILoadDemoSavefiles"
|
mode2Node.data = "MENU_MODE_SINGLEPLAYER : net.torvald.terrarum.modulebasegame.ui.UILoadDemoSavefiles"
|
||||||
|
|
||||||
printdbg(this, "mode1Node parent: ${mode1Node.parent?.data}") // will be 'null' because the parent is the root node
|
printdbg(this, "mode1Node parent: ${mode1Node.parent?.data}") // will be 'null' because the parent is the root node
|
||||||
printdbg(this, "mode1Node data: ${mode1Node.data}")
|
printdbg(this, "mode1Node data: ${mode1Node.data}")
|
||||||
@@ -267,7 +299,7 @@ class UILoadDemoSavefiles(val remoCon: UIRemoCon) : UICanvas() {
|
|||||||
App.fontGame.draw(batch, txt, (App.scr.width - App.fontGame.getWidth(txt)) / 2f, (App.scr.height - App.fontGame.lineHeight) / 2f)
|
App.fontGame.draw(batch, txt, (App.scr.width - App.fontGame.getWidth(txt)) / 2f, (App.scr.height - App.fontGame.lineHeight) / 2f)
|
||||||
|
|
||||||
if (loadFired == 2) {
|
if (loadFired == 2) {
|
||||||
LoadSavegame(playerDisk!!, worldDisk)
|
LoadSavegame(UILoadGovernor.playerDisk!!, UILoadGovernor.worldDisk)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
@@ -327,7 +359,7 @@ class UILoadDemoSavefiles(val remoCon: UIRemoCon) : UICanvas() {
|
|||||||
batch.draw(saveTex, (width - uiWidth - 10) / 2f, 0f)
|
batch.draw(saveTex, (width - uiWidth - 10) / 2f, 0f)
|
||||||
|
|
||||||
// draw texts
|
// draw texts
|
||||||
val loadGameTitleStr = Lang["MENU_IO_LOAD"]
|
val loadGameTitleStr = Lang[titles[mode]] + "$EMDASH$hash"
|
||||||
// "Game Load"
|
// "Game Load"
|
||||||
App.fontGame.draw(batch, loadGameTitleStr, (width - App.fontGame.getWidth(loadGameTitleStr)).div(2).toFloat(), titleTextPosY.toFloat())
|
App.fontGame.draw(batch, loadGameTitleStr, (width - App.fontGame.getWidth(loadGameTitleStr)).div(2).toFloat(), titleTextPosY.toFloat())
|
||||||
// Control help
|
// Control help
|
||||||
@@ -445,7 +477,7 @@ class UIItemPlayerCells(
|
|||||||
private var thumb: TextureRegion? = null
|
private var thumb: TextureRegion? = null
|
||||||
|
|
||||||
override var clickOnceListener: ((Int, Int, Int) -> Unit)? = { _: Int, _: Int, _: Int ->
|
override var clickOnceListener: ((Int, Int, Int) -> Unit)? = { _: Int, _: Int, _: Int ->
|
||||||
parent.playerDisk = skimmer
|
UILoadGovernor.playerDisk = skimmer
|
||||||
parent.advanceMode()
|
parent.advanceMode()
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -641,7 +673,7 @@ class UIItemWorldCells(
|
|||||||
}
|
}
|
||||||
|
|
||||||
override var clickOnceListener: ((Int, Int, Int) -> Unit)? = { _: Int, _: Int, _: Int ->
|
override var clickOnceListener: ((Int, Int, Int) -> Unit)? = { _: Int, _: Int, _: Int ->
|
||||||
parent.worldDisk = skimmer
|
UILoadGovernor.worldDisk = skimmer
|
||||||
parent.advanceMode()
|
parent.advanceMode()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -73,7 +73,7 @@ class UINewWorld(val remoCon: UIRemoCon) : UICanvas() {
|
|||||||
printdbg(this, "generate! Size=${sizeSelector.selection}, Name=${nameInput.getTextOrPlaceholder()}, Seed=${seedInput.getTextOrPlaceholder()}")
|
printdbg(this, "generate! Size=${sizeSelector.selection}, Name=${nameInput.getTextOrPlaceholder()}, Seed=${seedInput.getTextOrPlaceholder()}")
|
||||||
}
|
}
|
||||||
backButton.touchDownListener = { _, _, _, _ ->
|
backButton.touchDownListener = { _, _, _, _ ->
|
||||||
printdbg(this, "back!")
|
remoCon.openUI(UILoadDemoSavefiles(remoCon, 1))
|
||||||
}
|
}
|
||||||
|
|
||||||
addUIitem(sizeSelector)
|
addUIitem(sizeSelector)
|
||||||
|
|||||||
@@ -43,6 +43,8 @@ open class UIRemoCon(val parent: TitleScreen, val treeRoot: QNDTreeNode<String>)
|
|||||||
registerUIclasses(treeRoot)
|
registerUIclasses(treeRoot)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var currentRemoConLabelCount = 0; private set
|
||||||
|
|
||||||
private fun registerUIclasses(tree: QNDTreeNode<String>) {
|
private fun registerUIclasses(tree: QNDTreeNode<String>) {
|
||||||
tree.traversePreorder { node, _ ->
|
tree.traversePreorder { node, _ ->
|
||||||
val splittedNodeName = node.data?.split(yamlSep)
|
val splittedNodeName = node.data?.split(yamlSep)
|
||||||
@@ -72,6 +74,7 @@ open class UIRemoCon(val parent: TitleScreen, val treeRoot: QNDTreeNode<String>)
|
|||||||
private fun generateNewRemoCon(node: QNDTreeNode<String>): UIRemoConElement {
|
private fun generateNewRemoCon(node: QNDTreeNode<String>): UIRemoConElement {
|
||||||
val labels = Array(node.children.size) { node.children[it].data?.split(yamlSep)?.get(0)?.split(tagSep)?.get(0) ?: "(null)" }
|
val labels = Array(node.children.size) { node.children[it].data?.split(yamlSep)?.get(0)?.split(tagSep)?.get(0) ?: "(null)" }
|
||||||
val tags = Array(node.children.size) { arrayOf(node.children[it].data?.split(yamlSep)?.get(0)?.split(tagSep)?.getOrNull(1) ?: "") }
|
val tags = Array(node.children.size) { arrayOf(node.children[it].data?.split(yamlSep)?.get(0)?.split(tagSep)?.getOrNull(1) ?: "") }
|
||||||
|
currentRemoConLabelCount = labels.size
|
||||||
return UIRemoConElement(this, labels, tags)
|
return UIRemoConElement(this, labels, tags)
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -189,6 +192,20 @@ open class UIRemoCon(val parent: TitleScreen, val treeRoot: QNDTreeNode<String>)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fun openUI(external: UICanvas) {
|
||||||
|
openUI?.let {
|
||||||
|
it.setAsClose()
|
||||||
|
it.dispose()
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
printdbg(this, "Displaying external UI ${external.javaClass.canonicalName}")
|
||||||
|
external.setPosition(0,0)
|
||||||
|
parent.uiFakeBlurOverlay.setAsOpen()
|
||||||
|
external.setAsOpen()
|
||||||
|
openUI = external
|
||||||
|
}
|
||||||
|
|
||||||
override fun renderUI(batch: SpriteBatch, camera: Camera) {
|
override fun renderUI(batch: SpriteBatch, camera: Camera) {
|
||||||
remoConTray.render(batch, camera)
|
remoConTray.render(batch, camera)
|
||||||
openUI?.render(batch, camera)
|
openUI?.render(batch, camera)
|
||||||
@@ -253,8 +270,10 @@ open class UIRemoCon(val parent: TitleScreen, val treeRoot: QNDTreeNode<String>)
|
|||||||
|
|
||||||
class UIRemoConElement(uiRemoCon: UIRemoCon, val labels: Array<String>, val tags: Array<Array<String>>) {
|
class UIRemoConElement(uiRemoCon: UIRemoCon, val labels: Array<String>, val tags: Array<Array<String>>) {
|
||||||
|
|
||||||
private val lineHeight = 36
|
companion object {
|
||||||
private val paddingLeft = 48
|
const val lineHeight = 36
|
||||||
|
const val paddingLeft = 48
|
||||||
|
}
|
||||||
|
|
||||||
private val menubar = UIItemTextButtonList(
|
private val menubar = UIItemTextButtonList(
|
||||||
uiRemoCon,
|
uiRemoCon,
|
||||||
|
|||||||
@@ -76,7 +76,7 @@ open class UIItemTransitionContainer(
|
|||||||
|
|
||||||
uis.forEachIndexed { index, ui ->
|
uis.forEachIndexed { index, ui ->
|
||||||
if (currentPosition > index - 1 + epsilon && currentPosition < index + 1 - epsilon) {
|
if (currentPosition > index - 1 + epsilon && currentPosition < index + 1 - epsilon) {
|
||||||
ui.setAsOpen()
|
if (!ui.isOpened && !ui.isOpening) ui.setAsOpen()
|
||||||
ui.render(batch, camera)
|
ui.render(batch, camera)
|
||||||
|
|
||||||
if (debugvals) {
|
if (debugvals) {
|
||||||
@@ -84,7 +84,7 @@ open class UIItemTransitionContainer(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
ui.setAsClose()
|
if (!ui.isClosed && !ui.isClosing) ui.setAsClose()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user