From 739b51af956a2ee5e458003105b5b4f241781aeb Mon Sep 17 00:00:00 2001 From: minjaesong Date: Mon, 26 Jun 2023 18:18:59 +0900 Subject: [PATCH] manual/auto selection for savegame loading --- assets/locales/en/terrarum.json | 9 +- assets/locales/isIC/terrarum.json | 2 +- assets/locales/koKR/terrarum.json | 13 +- .../torvald/terrarum/SavegameCollection.kt | 11 +- .../modulebasegame/ui/UILoadSavegame.kt | 206 ++++++++++++++---- .../modulebasegame/ui/UINewCharacter.kt | 9 +- .../terrarum/modulebasegame/ui/UINewWorld.kt | 13 +- .../ui/UIPerformanceControlPanel.kt | 4 +- .../modulebasegame/ui/UITitleModules.kt | 2 +- .../torvald/terrarum/ui/UIItemImageButton.kt | 26 ++- 10 files changed, 225 insertions(+), 70 deletions(-) diff --git a/assets/locales/en/terrarum.json b/assets/locales/en/terrarum.json index 3d68e5433..cb03ebed8 100644 --- a/assets/locales/en/terrarum.json +++ b/assets/locales/en/terrarum.json @@ -7,6 +7,7 @@ "MENU_LABEL_PRESS_START_SYMBOL": "Press >", "MENU_MODULES" : "Modules", "MENU_CREDIT_GPL_DNT" : "GPL", + "MENU_LABEL_JVM_DNT" : "JVM", "GAME_ACTION_MOVE_VERB" : "Move", "GAME_ACTION_ZOOM" : "Zoom", "MENU_LABEL_RESET" : "Reset", @@ -30,16 +31,18 @@ "MENU_LABEL_PASTE_FROM_CLIPBOARD": "Paste from Clipboard", "MENU_OPTIONS_PERFORMANCE": "Performance", "MENU_LABEL_DELETE": "Delete", - "MENU_OPTIONS_JVM_HEAP_MAX": "Max JVM Heap Memory", + "MENU_OPTIONS_JVM_HEAP_MAX": "Max Heap Memory", "MENU_OPTIONS_AUTOSAVE": "Autosave", "CONTEXT_TIME_MINUTE_PLURAL": "Minutes", "CONTEXT_TIME_SECOND_PLURAL": "Seconds", "MENU_LABEL_SYSTEM_INFO": "System Info", "MENU_OPTIONS_NOTIFICATION_DISPLAY_DURATION": "Show notification for", "MENU_LABEL_STREAMING": "Livestreaming", - "MENU_LABEL_EXTRA_JVM_ARGUMENTS": "Extra JVM Arguments", + "MENU_LABEL_EXTRA_JVM_ARGUMENTS": "Extra Arguments", "GAME_PREV_SAVE_WAS_LOADED1": "The most recently saved game was corrupted.", "GAME_PREV_SAVE_WAS_LOADED2": "The previously saved game was loaded.", "GAME_MORE_RECENT_AUTOSAVE1": "The Autosave is more recent than the manual save.", - "GAME_MORE_RECENT_AUTOSAVE2": "Please select the saved game you want to load:" + "GAME_MORE_RECENT_AUTOSAVE2": "Please select the saved game you wish to play:", + "MENU_IO_MANUAL_SAVE": "Manual Save", + "MENU_IO_AUTOSAVE": "Autosave" } \ No newline at end of file diff --git a/assets/locales/isIC/terrarum.json b/assets/locales/isIC/terrarum.json index ff209b067..73059eb35 100644 --- a/assets/locales/isIC/terrarum.json +++ b/assets/locales/isIC/terrarum.json @@ -23,7 +23,7 @@ "MENU_LABEL_PASTE_FROM_CLIPBOARD": "Límdu frá klemmuspjald", "MENU_OPTIONS_PERFORMANCE": "Afköst", "MENU_LABEL_DELETE": "Eyða", - "MENU_OPTIONS_JVM_HEAP_MAX": "Hámarks JVM hrúguminni", + "MENU_OPTIONS_JVM_HEAP_MAX": "Hámarks hrúguminni", "MENU_OPTIONS_AUTOSAVE": "Sjálfvirk vistun", "CONTEXT_TIME_MINUTE_PLURAL": "Mínútur" } \ No newline at end of file diff --git a/assets/locales/koKR/terrarum.json b/assets/locales/koKR/terrarum.json index 0d7224d8d..3b7bc438f 100644 --- a/assets/locales/koKR/terrarum.json +++ b/assets/locales/koKR/terrarum.json @@ -12,6 +12,8 @@ "GAME_32BIT_WARNING1": "32비트 버전의 Java를 사용중인 것 같습니다.", "GAME_32BIT_WARNING2": "아래 링크에서 최신 64비트 Java를 내려받아 설치해주세요.", "GAME_32BIT_WARNING3": "https://www.java.com/ko/download/", + "GAME_APPLE_ROSETTA_WARNING1": "Apple Silicon이 탑재된 Mac을 사용 중이지만 x86 빌드의 게임을 실행 중입니다.", + "GAME_APPLE_ROSETTA_WARNING2": "최적의 성능과 게임 경험을 위해 Apple Silicon용 빌드의 게임을 이용해 주십시오.", "MENU_OPTION_STREAMERS_LAYOUT": "채팅창 오버레이", "MENU_LABEL_RESTART_REQUIRED": "재시작 필요", "MENU_LABEL_KEYBOARD_LAYOUT": "자판 배열", @@ -27,11 +29,18 @@ "MENU_LABEL_PASTE_FROM_CLIPBOARD": "복사한 텍스트 붙여넣기", "MENU_OPTIONS_PERFORMANCE": "성능", "MENU_LABEL_DELETE": "삭제", - "MENU_OPTIONS_JVM_HEAP_MAX": "최대 JVM 힙 메모리", + "MENU_OPTIONS_JVM_HEAP_MAX": "최대 힙 메모리", "MENU_OPTIONS_AUTOSAVE": "자동 저장", "CONTEXT_TIME_MINUTE_PLURAL": "분", "CONTEXT_TIME_SECOND_PLURAL": "초", "MENU_LABEL_SYSTEM_INFO": "시스템 정보", "MENU_OPTIONS_NOTIFICATION_DISPLAY_DURATION": "알림 표시 시간", - "MENU_LABEL_STREAMING": "실시간 방송" + "MENU_LABEL_STREAMING": "실시간 방송", + "MENU_LABEL_EXTRA_JVM_ARGUMENTS": "추가 명령 인수", + "GAME_PREV_SAVE_WAS_LOADED1": "가장 최근에 저장된 게임이 손상되었습니다.", + "GAME_PREV_SAVE_WAS_LOADED2": "이전에 저장된 게임을 불러왔습니다.", + "GAME_MORE_RECENT_AUTOSAVE1": "자동 저장된 게임이 수동으로 저장한 게임보다 더 최신입니다.", + "GAME_MORE_RECENT_AUTOSAVE2": "불러올 게임을 선택해주십시오.", + "MENU_IO_MANUAL_SAVE": "수동 저장", + "MENU_IO_AUTOSAVE": "자동 저장" } diff --git a/src/net/torvald/terrarum/SavegameCollection.kt b/src/net/torvald/terrarum/SavegameCollection.kt index 79865e018..675f0ac5a 100644 --- a/src/net/torvald/terrarum/SavegameCollection.kt +++ b/src/net/torvald/terrarum/SavegameCollection.kt @@ -139,14 +139,15 @@ class SavegameCollectionPair(player: SavegameCollection?, world: SavegameCollect fun moreRecentAutosaveAvailable() = (status == 2) fun saveAvaliable() = (status > 0) - fun getManualSave(): Pair? { + fun getManualSave(): DiskPair? { if (status == 0) return null - return manualPlayer to manualWorld + return DiskPair(manualPlayer, manualWorld) } - fun getAutoSave(): Pair? { + fun getAutoSave(): DiskPair? { if (status != 2) return null - return autoPlayer to autoWorld + return DiskPair(autoPlayer, autoWorld) } +} -} \ No newline at end of file +data class DiskPair(val player: DiskSkimmer, val world: DiskSkimmer) \ No newline at end of file diff --git a/src/net/torvald/terrarum/modulebasegame/ui/UILoadSavegame.kt b/src/net/torvald/terrarum/modulebasegame/ui/UILoadSavegame.kt index 307028feb..68587573a 100644 --- a/src/net/torvald/terrarum/modulebasegame/ui/UILoadSavegame.kt +++ b/src/net/torvald/terrarum/modulebasegame/ui/UILoadSavegame.kt @@ -6,43 +6,23 @@ import com.badlogic.gdx.graphics.* import com.badlogic.gdx.graphics.g2d.SpriteBatch import com.badlogic.gdx.graphics.g2d.TextureRegion import com.badlogic.gdx.graphics.glutils.FrameBuffer -import com.badlogic.gdx.graphics.glutils.ShapeRenderer +import com.badlogic.gdx.utils.Disposable import com.badlogic.gdx.utils.GdxRuntimeException -import com.badlogic.gdx.utils.JsonReader -import com.jme3.math.FastMath -import net.torvald.unicode.EMDASH import net.torvald.unicode.getKeycapConsole import net.torvald.unicode.getKeycapPC import net.torvald.terrarum.* import net.torvald.terrarum.App.printdbg import net.torvald.terrarum.langpack.Lang -import net.torvald.terrarum.modulebasegame.ui.UIInventoryFull.Companion.CELL_COL import net.torvald.terrarum.savegame.ByteArray64InputStream -import net.torvald.terrarum.savegame.ByteArray64Reader -import net.torvald.terrarum.savegame.DiskSkimmer import net.torvald.terrarum.savegame.EntryFile -import net.torvald.terrarum.serialise.Common -import net.torvald.terrarum.serialise.SaveLoadError import net.torvald.terrarum.modulebasegame.serialise.LoadSavegame -import net.torvald.terrarum.savegame.VDFileID.BODYPART_TO_ENTRY_MAP -import net.torvald.terrarum.savegame.VDFileID.SAVEGAMEINFO -import net.torvald.terrarum.savegame.VDFileID.SPRITEDEF -import net.torvald.terrarum.spriteassembler.ADProperties -import net.torvald.terrarum.spriteassembler.ADProperties.Companion.EXTRA_HEADROOM_X -import net.torvald.terrarum.spriteassembler.ADProperties.Companion.EXTRA_HEADROOM_Y -import net.torvald.terrarum.spriteassembler.AssembleFrameBase -import net.torvald.terrarum.spriteassembler.AssembleSheetPixmap -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.JsonFetcher -import net.torvald.terrarum.utils.forEachSiblings +import net.torvald.terrarum.ui.* import net.torvald.terrarumsansbitmap.gdx.TextureRegionPack import java.time.Instant import java.time.format.DateTimeFormatter import java.util.* import java.util.zip.GZIPInputStream +import kotlin.collections.ArrayList import kotlin.math.roundToInt @@ -122,6 +102,63 @@ class UILoadSavegame(val remoCon: UIRemoCon) : Advanceable() { var mode = 0; private set// 0: show players, 1: show worlds + private val MODE_SELECT = 0 + private val MODE_SELECT_AFTER = 1 + private val MODE_SAVE_MULTIPLE_CHOICES = 2 + private val MODE_LOAD_DA_SHIT_ALREADY = 255 + private val MODE_SAVE_DAMAGED = 256 + + private lateinit var loadables: SavegameCollectionPair + + private lateinit var loadManualThumbButton: UIItemImageButton + private lateinit var loadAutoThumbButton: UIItemImageButton + + private val disposablePool = ArrayList() + + private fun DiskPair.getThumbnail(): TextureRegion { + return this.world.requestFile(-2).let { file -> + CommonResourcePool.getAsTextureRegion("terrarum-defaultsavegamethumb") + + if (file != null) { + val zippedTga = (file.contents as EntryFile).bytes + val gzin = GZIPInputStream(ByteArray64InputStream(zippedTga)) + val tgaFileContents = gzin.readAllBytes(); gzin.close() + val pixmap = Pixmap(tgaFileContents, 0, tgaFileContents.size) + TextureRegion(Texture(pixmap)).also { + disposablePool.add(it.texture) + // do cropping and resizing + it.setRegion( + (pixmap.width - imageButtonW*2) / 2, + (pixmap.height - imageButtonH*2) / 2, + imageButtonW * 2, + imageButtonH * 2 + ) + } + } + else { + CommonResourcePool.getAsTextureRegion("terrarum-defaultsavegamethumb") + } + } + } + + private val altSelDrawW = 640 + private val altSelHdrawW = altSelDrawW / 2 + private val altSelDrawH = 480 + private val imageButtonW = 300 + private val imageButtonH = 240 + private val altSelDrawY = ((App.scr.height - altSelDrawH)/2) + private val altSelQdrawW = altSelDrawW / 4 + private val altSelQQQdrawW = altSelDrawW * 3 / 4 + + private fun getDrawTextualInfoFun(disks: DiskPair): (UIItem, SpriteBatch) -> Unit { + val lastPlayedStamp = Instant.ofEpochSecond(disks.player.getLastModifiedTime()) + .atZone(TimeZone.getDefault().toZoneId()) + .format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")) + return { item: UIItem, batch: SpriteBatch -> + App.fontSmallNumbers.draw(batch, lastPlayedStamp, item.posX + 5f, item.posY + 3f) + } + } + override fun advanceMode() { mode += 1 uiScroll = 0f @@ -133,31 +170,84 @@ class UILoadSavegame(val remoCon: UIRemoCon) : Advanceable() { printdbg(this, "savelist mode: $mode") // look for recently played world - if (mode == 1) { + if (mode == MODE_SELECT_AFTER) { // select the most recent loadable save by comparing manual and autosaves, NOT JUST going with loadable() printdbg(this, "Load playerUUID: ${UILoadGovernor.playerUUID}, worldUUID: ${UILoadGovernor.worldUUID}") - val loadables = SavegameCollectionPair(App.savegamePlayers[UILoadGovernor.playerUUID], App.savegameWorlds[UILoadGovernor.worldUUID]) + loadables = SavegameCollectionPair(App.savegamePlayers[UILoadGovernor.playerUUID], App.savegameWorlds[UILoadGovernor.worldUUID]) - var loadAuto = false - if (loadables.moreRecentAutosaveAvailable()) { - // TODO make choice for load manual or auto, if available + mode = if (loadables.moreRecentAutosaveAvailable()) { + // make choice for load manual or auto, if available + val autoThumb = loadables.getAutoSave()!!.getThumbnail() + val manualThumb = loadables.getManualSave()!!.getThumbnail() + + loadManualThumbButton = UIItemImageButton(this, manualThumb, + initialX = (Toolkit.drawWidth - altSelDrawW)/2 + altSelQdrawW - imageButtonW/2, + initialY = altSelDrawY + 120, + width = imageButtonW, + height = imageButtonH, + imageDrawWidth = imageButtonW, + imageDrawHeight = imageButtonH, + highlightable = false, + useBorder = true, + ).also { it.extraDrawOp = getDrawTextualInfoFun(loadables.getManualSave()!!) } + loadAutoThumbButton = UIItemImageButton(this, autoThumb, + initialX = (Toolkit.drawWidth - altSelDrawW)/2 + altSelQQQdrawW - imageButtonW/2, + initialY = altSelDrawY + 120, + width = imageButtonW, + height = imageButtonH, + imageDrawWidth = imageButtonW, + imageDrawHeight = imageButtonH, + highlightable = false, + useBorder = true, + ).also { it.extraDrawOp = getDrawTextualInfoFun(loadables.getAutoSave()!!) } + + MODE_SAVE_MULTIPLE_CHOICES } else if (!loadables.saveAvaliable()) { - // TODO show save is damaged and cannot be loaded - return + // show save is damaged and cannot be loaded + MODE_SAVE_DAMAGED } + else { + val (p, w) = loadables.getManualSave()!! + UILoadGovernor.playerDisk = p; UILoadGovernor.worldDisk = w - val (p, w) = if (loadAuto) loadables.getAutoSave()!! else loadables.getManualSave()!! - UILoadGovernor.playerDisk = p; UILoadGovernor.worldDisk = w + if (loadables.newerSaveIsDamaged) { + UILoadGovernor.previousSaveWasLoaded = true + } - if (loadables.newerSaveIsDamaged) { - // TODO queue message: GAME_PREV_SAVE_WAS_LOADED +// MODE_LOAD_DA_SHIT_ALREADY + + + // test codes // + + val autoThumb = loadables.getManualSave()!!.getThumbnail() + val manualThumb = loadables.getManualSave()!!.getThumbnail() + + loadManualThumbButton = UIItemImageButton(this, manualThumb, + initialX = (Toolkit.drawWidth - altSelDrawW)/2 + altSelQdrawW - imageButtonW/2, + initialY = altSelDrawY + 120, + width = imageButtonW, + height = imageButtonH, + imageDrawWidth = imageButtonW, + imageDrawHeight = imageButtonH, + highlightable = false, + useBorder = true, + ).also { it.extraDrawOp = getDrawTextualInfoFun(loadables.getManualSave()!!) } + loadAutoThumbButton = UIItemImageButton(this, autoThumb, + initialX = (Toolkit.drawWidth - altSelDrawW)/2 + altSelQQQdrawW - imageButtonW/2, + initialY = altSelDrawY + 120, + width = imageButtonW, + height = imageButtonH, + imageDrawWidth = imageButtonW, + imageDrawHeight = imageButtonH, + highlightable = false, + useBorder = true, + ).also { it.extraDrawOp = getDrawTextualInfoFun(loadables.getManualSave()!!) } + + MODE_SAVE_MULTIPLE_CHOICES } - - mode += 1 - } } @@ -178,7 +268,7 @@ class UILoadSavegame(val remoCon: UIRemoCon) : Advanceable() { savegamesCount += 1 } catch (e: Throwable) { - System.err.println("[UILoadDemoSavefiles] Error while loading Player '${skimmer.diskFile.absolutePath}'") + System.err.println("[UILoadSavegame] Error while loading Player '${skimmer.diskFile.absolutePath}'") e.printStackTrace() } } @@ -210,14 +300,14 @@ class UILoadSavegame(val remoCon: UIRemoCon) : Advanceable() { init { // this UI will NOT persist; the parent of the mode1Node must be set using an absolute value (e.g. treeRoot, not remoCon.currentRemoConContents) - //printdbg(this, "UILoadDemoSaveFiles called, from:") + //printdbg(this, "UILoadSavegame called, from:") //printStackTrace(this) mode1Node.parent = remoCon.treeRoot mode2Node.parent = mode1Node - mode1Node.data = "MENU_MODE_SINGLEPLAYER : net.torvald.terrarum.modulebasegame.ui.UILoadDemoSavefiles" - mode2Node.data = "MENU_MODE_SINGLEPLAYER : net.torvald.terrarum.modulebasegame.ui.UILoadDemoSavefiles" + mode1Node.data = "MENU_MODE_SINGLEPLAYER : net.torvald.terrarum.modulebasegame.ui.UILoadSavegame" + mode2Node.data = "MENU_MODE_SINGLEPLAYER : net.torvald.terrarum.modulebasegame.ui.UILoadSavegame" // printdbg(this, "mode1Node parent: ${mode1Node.parent?.data}") // will be 'null' because the parent is the root node // printdbg(this, "mode1Node data: ${mode1Node.data}") @@ -229,8 +319,7 @@ class UILoadSavegame(val remoCon: UIRemoCon) : Advanceable() { } override fun updateUI(delta: Float) { - - if (mode < 2) { + if (mode == MODE_SELECT) { if (oldMode != mode) { modeChangedHandler(mode) @@ -270,7 +359,7 @@ class UILoadSavegame(val remoCon: UIRemoCon) : Advanceable() { override fun renderUI(batch: SpriteBatch, camera: Camera) { - if (mode == 2) { + if (mode == MODE_LOAD_DA_SHIT_ALREADY) { loadFired += 1 // to hide the "flipped skybox" artefact batch.end() @@ -287,7 +376,7 @@ class UILoadSavegame(val remoCon: UIRemoCon) : Advanceable() { LoadSavegame(UILoadGovernor.playerDisk!!, UILoadGovernor.worldDisk) } } - else { + else if (mode == MODE_SELECT) { batch.end() val cells = getCells() @@ -362,6 +451,24 @@ class UILoadSavegame(val remoCon: UIRemoCon) : Advanceable() { batch.begin() } + else if (mode == MODE_SAVE_MULTIPLE_CHOICES) { + // "The Autosave is more recent than the manual save" + val tw1 = App.fontGame.getWidth(Lang["GAME_MORE_RECENT_AUTOSAVE1"]) + val tw2 = App.fontGame.getWidth(Lang["GAME_MORE_RECENT_AUTOSAVE2"]) + App.fontGame.draw(batch, Lang["GAME_MORE_RECENT_AUTOSAVE1"], ((Toolkit.drawWidth - tw1)/2).toFloat(), altSelDrawY + 0f) + App.fontGame.draw(batch, Lang["GAME_MORE_RECENT_AUTOSAVE2"], ((Toolkit.drawWidth - tw2)/2).toFloat(), altSelDrawY + 24f) + + val twm = App.fontGame.getWidth(Lang["MENU_IO_MANUAL_SAVE"]) + val twa = App.fontGame.getWidth(Lang["MENU_IO_AUTOSAVE"]) + + App.fontGame.draw(batch, Lang["MENU_IO_MANUAL_SAVE"], ((Toolkit.drawWidth - altSelDrawW)/2).toFloat() + altSelQdrawW - twm/2, altSelDrawY + 80f) + App.fontGame.draw(batch, Lang["MENU_IO_AUTOSAVE"], ((Toolkit.drawWidth - altSelDrawW)/2).toFloat() + altSelQQQdrawW - twa/2, altSelDrawY + 80f) + + + // draw thumbnail-buttons + loadAutoThumbButton.render(batch, camera) + loadManualThumbButton.render(batch, camera) + } } @@ -384,17 +491,17 @@ class UILoadSavegame(val remoCon: UIRemoCon) : Advanceable() { } override fun touchDown(screenX: Int, screenY: Int, pointer: Int, button: Int): Boolean { - getCells().forEach { it.touchDown(screenX, screenY, pointer, button) } + if (mode == MODE_SELECT) getCells().forEach { it.touchDown(screenX, screenY, pointer, button) } return true } override fun touchUp(screenX: Int, screenY: Int, pointer: Int, button: Int): Boolean { - getCells().forEach { it.touchUp(screenX, screenY, pointer, button) } + if (mode == MODE_SELECT) getCells().forEach { it.touchUp(screenX, screenY, pointer, button) } return true } override fun scrolled(amountX: Float, amountY: Float): Boolean { - if (this.isVisible) { + if (this.isVisible && mode == MODE_SELECT) { val cells = getCells() if (amountY <= -1f && scrollTarget > 0) { @@ -421,6 +528,9 @@ class UILoadSavegame(val remoCon: UIRemoCon) : Advanceable() { override fun dispose() { try { shapeRenderer.dispose() } catch (e: IllegalArgumentException) {} try { sliderFBO.dispose() } catch (e: IllegalArgumentException) {} + disposablePool.forEach { + try { it.dispose() } catch (e: GdxRuntimeException) {} + } } override fun resize(width: Int, height: Int) { diff --git a/src/net/torvald/terrarum/modulebasegame/ui/UINewCharacter.kt b/src/net/torvald/terrarum/modulebasegame/ui/UINewCharacter.kt index 88fff0612..3aace11b3 100644 --- a/src/net/torvald/terrarum/modulebasegame/ui/UINewCharacter.kt +++ b/src/net/torvald/terrarum/modulebasegame/ui/UINewCharacter.kt @@ -81,10 +81,13 @@ class UINewCharacter(val remoCon: UIRemoCon) : UICanvas() { }, "TerrarumBasegameNewCharcterSaveThread") - savingThread.start() + +// savingThread.join() + + remoCon.openUI(UINewWorld(remoCon, savingThread)) // let UINewWorld handle the character file generation } backButton.clickOnceListener = { _,_ -> - remoCon.openUI(UILoadDemoSavefiles(remoCon, 0)) + remoCon.openUI(UILoadSavegame(remoCon)) } addUIitem(nameInput) @@ -99,7 +102,7 @@ class UINewCharacter(val remoCon: UIRemoCon) : UICanvas() { if (returnedFromChargen) { returnedFromChargen = false - remoCon.openUI(UILoadDemoSavefiles(remoCon, 1)) // 0 to go back (Terraria's behav), set variables up and 1 to choose world + remoCon.openUI(UILoadSavegame(remoCon)) } } diff --git a/src/net/torvald/terrarum/modulebasegame/ui/UINewWorld.kt b/src/net/torvald/terrarum/modulebasegame/ui/UINewWorld.kt index 26854eed4..8cdb98528 100644 --- a/src/net/torvald/terrarum/modulebasegame/ui/UINewWorld.kt +++ b/src/net/torvald/terrarum/modulebasegame/ui/UINewWorld.kt @@ -30,6 +30,12 @@ import net.torvald.terrarum.utils.RandomWordsName */ class UINewWorld(val remoCon: UIRemoCon) : UICanvas() { + private var newPlayerCreationThread = Thread {} + + constructor(remoCon: UIRemoCon, playerCreationThread: Thread) : this(remoCon) { + newPlayerCreationThread = playerCreationThread + } + private val hugeTex = TextureRegion(Texture(ModMgr.getGdxFile("basegame", "gui/huge.png"))) private val largeTex = TextureRegion(Texture(ModMgr.getGdxFile("basegame", "gui/large.png"))) private val normalTex = TextureRegion(Texture(ModMgr.getGdxFile("basegame", "gui/normal.png"))) @@ -87,6 +93,11 @@ class UINewWorld(val remoCon: UIRemoCon) : UICanvas() { init { goButton.clickOnceListener = { _, _ -> + + // after the save is complete, proceed to new world generation + newPlayerCreationThread.join() + + // printdbg(this, "generate! Size=${sizeSelector.selection}, Name=${nameInput.getTextOrPlaceholder()}, Seed=${seedInput.getTextOrPlaceholder()}") val ingame = TerrarumIngame(App.batch) @@ -112,7 +123,7 @@ class UINewWorld(val remoCon: UIRemoCon) : UICanvas() { } backButton.clickOnceListener = { _, _ -> - remoCon.openUI(UILoadDemoSavefiles(remoCon, 1)) + remoCon.openUI(UILoadSavegame(remoCon)) } addUIitem(sizeSelector) diff --git a/src/net/torvald/terrarum/modulebasegame/ui/UIPerformanceControlPanel.kt b/src/net/torvald/terrarum/modulebasegame/ui/UIPerformanceControlPanel.kt index 41b4e072a..d9c4def48 100644 --- a/src/net/torvald/terrarum/modulebasegame/ui/UIPerformanceControlPanel.kt +++ b/src/net/torvald/terrarum/modulebasegame/ui/UIPerformanceControlPanel.kt @@ -31,7 +31,7 @@ class UIPerformanceControlPanel(remoCon: UIRemoCon?) : UICanvas() { arrayOf("", { Lang["MENU_OPTIONS_GAMEPLAY"] }, "h1"), arrayOf("autosaveinterval", { Lang["MENU_OPTIONS_AUTOSAVE"] + " (${Lang["CONTEXT_TIME_MINUTE_PLURAL"]})" }, "spinnerimul,5,120,5,60000"), arrayOf("notificationshowuptime", { Lang["MENU_OPTIONS_NOTIFICATION_DISPLAY_DURATION"] + " (${Lang["CONTEXT_TIME_SECOND_PLURAL"]})" }, "spinnerimul,2,10,1,1000"), - arrayOf("", { Lang["MENU_OPTIONS_PERFORMANCE"] }, "h1"), + arrayOf("", { Lang["MENU_LABEL_JVM_DNT"] }, "h1"), arrayOf("jvm_xmx", { Lang["MENU_OPTIONS_JVM_HEAP_MAX"] + " (GB)" }, "spinner,2,32,1"), arrayOf("jvm_extra_cmd", { Lang["MENU_LABEL_EXTRA_JVM_ARGUMENTS"] }, "typein"), arrayOf("", { "(${Lang["MENU_LABEL_RESTART_REQUIRED"]})" }, "p"), @@ -70,7 +70,7 @@ class UIPerformanceControlPanel(remoCon: UIRemoCon?) : UICanvas() { private val hrule = CommonResourcePool.getAsTextureRegionPack("gui_hrule") private val spinnerWidth = 140 - private val typeinWidth = 320 + private val typeinWidth = 240 private val drawX = (Toolkit.drawWidth - width) / 2 private val drawY = (App.scr.height - height) / 2 diff --git a/src/net/torvald/terrarum/modulebasegame/ui/UITitleModules.kt b/src/net/torvald/terrarum/modulebasegame/ui/UITitleModules.kt index f22f03881..bacf1202f 100644 --- a/src/net/torvald/terrarum/modulebasegame/ui/UITitleModules.kt +++ b/src/net/torvald/terrarum/modulebasegame/ui/UITitleModules.kt @@ -88,7 +88,7 @@ class UITitleModules(val remoCon: UIRemoCon) : UICanvas() { savegamesCount += 1 } catch (e: Throwable) { - System.err.println("[UILoadDemoSavefiles] Error while loading module info for '$s'") + System.err.println("[UITitleModules] Error while loading module info for '$s'") e.printStackTrace() } } diff --git a/src/net/torvald/terrarum/ui/UIItemImageButton.kt b/src/net/torvald/terrarum/ui/UIItemImageButton.kt index f4f12e7a1..180c15251 100644 --- a/src/net/torvald/terrarum/ui/UIItemImageButton.kt +++ b/src/net/torvald/terrarum/ui/UIItemImageButton.kt @@ -5,6 +5,7 @@ import com.badlogic.gdx.graphics.Color import com.badlogic.gdx.graphics.g2d.SpriteBatch import com.badlogic.gdx.graphics.g2d.TextureRegion import net.torvald.terrarum.BlendMode +import net.torvald.terrarum.abs import net.torvald.terrarum.blendNormalStraightAlpha /** @@ -33,14 +34,24 @@ open class UIItemImageButton( initialX: Int, initialY: Int, + /** this does NOT resize the image; use imageDrawWidth to actually resize the image */ override val width: Int = image.regionWidth, + /** this does NOT resize the image; use imageDrawHeight to actually resize the image */ override val height: Int = image.regionHeight, /** When clicked, toggle its "lit" status */ - var highlightable: Boolean + var highlightable: Boolean, + /** Changes the appearance to use a border instead of colour-changing image for highlighter */ + val useBorder: Boolean = false, + + /** Image won't be place at right position if `image.regionWidth != imageDrawWidth`; define the `width` argument to avoid the issue */ + val imageDrawWidth: Int = image.regionWidth, + /** Image won't be place at right position if `image.regionHeight != imageDrawHeight`; define the `height` argument to avoid the issue */ + val imageDrawHeight: Int = image.regionHeight, ) : UIItem(parent, initialX, initialY) { var highlighted = false + var extraDrawOp: (UIItem, SpriteBatch) -> Unit = { _,_ -> } override fun render(batch: SpriteBatch, camera: Camera) { // draw background @@ -60,15 +71,22 @@ open class UIItemImageButton( Toolkit.fillArea(batch, posX.toFloat(), posY.toFloat(), width.toFloat(), height.toFloat()) } + blendNormalStraightAlpha(batch) // draw image - blendNormalStraightAlpha(batch) + batch.color = if (highlighted) highlightCol + else if (mouseUp) activeCol + else Toolkit.Theme.COL_INACTIVE + if (useBorder) { + Toolkit.drawBoxBorder(batch, posX - 1f, posY - 1f, width + 2f, height + 2f) + batch.color = Color.WHITE + } + batch.draw(image, (posX + (width - imageDrawWidth) / 2).toFloat(), (posY + (height - imageDrawHeight) / 2).toFloat(), imageDrawWidth.toFloat(), imageDrawHeight.toFloat()) batch.color = if (highlighted) highlightCol else if (mouseUp) activeCol else inactiveCol - - batch.draw(image, (posX + (width - image.regionWidth) / 2).toFloat(), (posY + (height - image.regionHeight) / 2).toFloat()) + extraDrawOp(this, batch) } override fun dispose() {