diff --git a/src/net/torvald/terrarum/modulebasegame/ui/UILoadDemoSavefiles.kt b/src/net/torvald/terrarum/modulebasegame/ui/UILoadDemoSavefiles.kt index a079f25cf..953f413e2 100644 --- a/src/net/torvald/terrarum/modulebasegame/ui/UILoadDemoSavefiles.kt +++ b/src/net/torvald/terrarum/modulebasegame/ui/UILoadDemoSavefiles.kt @@ -29,6 +29,7 @@ import net.torvald.terrarum.ui.Movement import net.torvald.terrarum.ui.Toolkit import net.torvald.terrarum.ui.UICanvas import net.torvald.terrarum.ui.UIItem +import net.torvald.terrarum.utils.RandomWordsName import net.torvald.terrarumsansbitmap.gdx.TextureRegionPack import java.time.Instant import java.time.format.DateTimeFormatter @@ -39,6 +40,34 @@ import kotlin.math.roundToInt val SAVE_CELL_WIDTH = 480 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] * @@ -46,6 +75,8 @@ val SAVE_CELL_HEIGHT = 120 */ class UILoadDemoSavefiles(val remoCon: UIRemoCon) : UICanvas() { + private val hash = RandomWordsName(3) + init { CommonResourcePool.addToLoadingList("inventory_category") { TextureRegionPack("./assets/graphics/gui/inventory/category.tga", 20, 20) @@ -110,15 +141,15 @@ class UILoadDemoSavefiles(val remoCon: UIRemoCon) : UICanvas() { private var showSpinner = false - // used by UIItem*Cells - internal var playerDisk: DiskSkimmer? = null - internal var worldDisk: DiskSkimmer? = null - private val worldCells = ArrayList() private val playerCells = ArrayList() var mode = 0; private set// 0: show players, 1: show worlds + constructor(remoCon: UIRemoCon, mode: Int) : this(remoCon) { + this.mode = mode + } + fun advanceMode() { mode += 1 uiScroll = 0f @@ -189,6 +220,7 @@ class UILoadDemoSavefiles(val remoCon: UIRemoCon) : UICanvas() { private val mode2Node = Yaml(UITitleRemoConYaml.injectedMenuSingleWorldSel).parse() private val menus = listOf(mode1Node, mode2Node) + private val titles = listOf("CONTEXT_CHARACTER", "MENU_LABEL_WORLD") init { // 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 mode2Node.parent = mode1Node - mode1Node.data = "MENU_MODE_SINGLEPLAYER+NODISPOSE : net.torvald.terrarum.modulebasegame.ui.UILoadDemoSavefiles" - mode2Node.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 : 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 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) if (loadFired == 2) { - LoadSavegame(playerDisk!!, worldDisk) + LoadSavegame(UILoadGovernor.playerDisk!!, UILoadGovernor.worldDisk) } } else { @@ -327,7 +359,7 @@ class UILoadDemoSavefiles(val remoCon: UIRemoCon) : UICanvas() { batch.draw(saveTex, (width - uiWidth - 10) / 2f, 0f) // draw texts - val loadGameTitleStr = Lang["MENU_IO_LOAD"] + val loadGameTitleStr = Lang[titles[mode]] + "$EMDASH$hash" // "Game Load" App.fontGame.draw(batch, loadGameTitleStr, (width - App.fontGame.getWidth(loadGameTitleStr)).div(2).toFloat(), titleTextPosY.toFloat()) // Control help @@ -445,7 +477,7 @@ class UIItemPlayerCells( private var thumb: TextureRegion? = null override var clickOnceListener: ((Int, Int, Int) -> Unit)? = { _: Int, _: Int, _: Int -> - parent.playerDisk = skimmer + UILoadGovernor.playerDisk = skimmer parent.advanceMode() } @@ -641,7 +673,7 @@ class UIItemWorldCells( } override var clickOnceListener: ((Int, Int, Int) -> Unit)? = { _: Int, _: Int, _: Int -> - parent.worldDisk = skimmer + UILoadGovernor.worldDisk = skimmer parent.advanceMode() } diff --git a/src/net/torvald/terrarum/modulebasegame/ui/UINewWorld.kt b/src/net/torvald/terrarum/modulebasegame/ui/UINewWorld.kt index 0ee169f77..fa7999aaf 100644 --- a/src/net/torvald/terrarum/modulebasegame/ui/UINewWorld.kt +++ b/src/net/torvald/terrarum/modulebasegame/ui/UINewWorld.kt @@ -73,7 +73,7 @@ class UINewWorld(val remoCon: UIRemoCon) : UICanvas() { printdbg(this, "generate! Size=${sizeSelector.selection}, Name=${nameInput.getTextOrPlaceholder()}, Seed=${seedInput.getTextOrPlaceholder()}") } backButton.touchDownListener = { _, _, _, _ -> - printdbg(this, "back!") + remoCon.openUI(UILoadDemoSavefiles(remoCon, 1)) } addUIitem(sizeSelector) diff --git a/src/net/torvald/terrarum/modulebasegame/ui/UIRemoCon.kt b/src/net/torvald/terrarum/modulebasegame/ui/UIRemoCon.kt index 16b1e5e40..6b83e8398 100644 --- a/src/net/torvald/terrarum/modulebasegame/ui/UIRemoCon.kt +++ b/src/net/torvald/terrarum/modulebasegame/ui/UIRemoCon.kt @@ -43,6 +43,8 @@ open class UIRemoCon(val parent: TitleScreen, val treeRoot: QNDTreeNode) registerUIclasses(treeRoot) } + var currentRemoConLabelCount = 0; private set + private fun registerUIclasses(tree: QNDTreeNode) { tree.traversePreorder { node, _ -> val splittedNodeName = node.data?.split(yamlSep) @@ -72,6 +74,7 @@ open class UIRemoCon(val parent: TitleScreen, val treeRoot: QNDTreeNode) private fun generateNewRemoCon(node: QNDTreeNode): UIRemoConElement { 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) ?: "") } + currentRemoConLabelCount = labels.size return UIRemoConElement(this, labels, tags) } @@ -189,6 +192,20 @@ open class UIRemoCon(val parent: TitleScreen, val treeRoot: QNDTreeNode) } } + 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) { remoConTray.render(batch, camera) openUI?.render(batch, camera) @@ -253,8 +270,10 @@ open class UIRemoCon(val parent: TitleScreen, val treeRoot: QNDTreeNode) class UIRemoConElement(uiRemoCon: UIRemoCon, val labels: Array, val tags: Array>) { - private val lineHeight = 36 - private val paddingLeft = 48 + companion object { + const val lineHeight = 36 + const val paddingLeft = 48 + } private val menubar = UIItemTextButtonList( uiRemoCon, diff --git a/src/net/torvald/terrarum/ui/UIItemTransitionContainer.kt b/src/net/torvald/terrarum/ui/UIItemTransitionContainer.kt index e499c8b2c..a593afa3c 100644 --- a/src/net/torvald/terrarum/ui/UIItemTransitionContainer.kt +++ b/src/net/torvald/terrarum/ui/UIItemTransitionContainer.kt @@ -76,7 +76,7 @@ open class UIItemTransitionContainer( uis.forEachIndexed { index, ui -> if (currentPosition > index - 1 + epsilon && currentPosition < index + 1 - epsilon) { - ui.setAsOpen() + if (!ui.isOpened && !ui.isOpening) ui.setAsOpen() ui.render(batch, camera) if (debugvals) { @@ -84,7 +84,7 @@ open class UIItemTransitionContainer( } } else { - ui.setAsClose() + if (!ui.isClosed && !ui.isClosing) ui.setAsClose() } }