diff --git a/src/net/torvald/terrarum/modulebasegame/ui/UILoadAutosave.kt b/src/net/torvald/terrarum/modulebasegame/ui/UILoadAutosave.kt index 118405b9f..2c9b1206f 100644 --- a/src/net/torvald/terrarum/modulebasegame/ui/UILoadAutosave.kt +++ b/src/net/torvald/terrarum/modulebasegame/ui/UILoadAutosave.kt @@ -1,10 +1,26 @@ package net.torvald.terrarum.modulebasegame.ui import com.badlogic.gdx.graphics.Camera +import com.badlogic.gdx.graphics.Pixmap +import com.badlogic.gdx.graphics.Texture import com.badlogic.gdx.graphics.g2d.SpriteBatch +import com.badlogic.gdx.graphics.g2d.TextureRegion import net.torvald.terrarum.App +import net.torvald.terrarum.CommonResourcePool +import net.torvald.terrarum.DiskPair +import net.torvald.terrarum.SavegameCollectionPair +import net.torvald.terrarum.langpack.Lang +import net.torvald.terrarum.savegame.ByteArray64InputStream +import net.torvald.terrarum.savegame.EntryFile +import net.torvald.terrarum.savegame.VDFileID import net.torvald.terrarum.ui.Toolkit import net.torvald.terrarum.ui.UICanvas +import net.torvald.terrarum.ui.UIItem +import net.torvald.terrarum.ui.UIItemImageButton +import java.time.Instant +import java.time.format.DateTimeFormatter +import java.util.* +import java.util.zip.GZIPInputStream /** * Created by minjaesong on 2023-07-05. @@ -14,16 +30,134 @@ class UILoadAutosave(val full: UILoadSavegame) : UICanvas() { override var width: Int = Toolkit.drawWidth override var height: Int = App.scr.height + + 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 lateinit var loadManualThumbButton: UIItemImageButton + private lateinit var loadAutoThumbButton: UIItemImageButton + + override fun show() { + super.show() + + val loadables = SavegameCollectionPair(App.savegamePlayers[UILoadGovernor.playerUUID], App.savegameWorlds[UILoadGovernor.worldUUID]) + 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()!!) + it.clickOnceListener = { _,_ -> + loadables.getManualSave()!!.let { + UILoadGovernor.playerDisk = it.player + UILoadGovernor.worldDisk = it.world + } + } + } + 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()!!) + it.clickOnceListener = { _,_ -> + loadables.getAutoSave()!!.let { + UILoadGovernor.playerDisk = it.player + UILoadGovernor.worldDisk = it.world + } + } + } + + } + override fun updateUI(delta: Float) { - TODO("Not yet implemented") + if (::loadAutoThumbButton.isInitialized) loadAutoThumbButton.update(delta) + if (::loadManualThumbButton.isInitialized) loadManualThumbButton.update(delta) } override fun renderUI(batch: SpriteBatch, camera: Camera) { - TODO("Not yet implemented") + // "The Autosave is more recent than the manual save" + Toolkit.drawTextCentered(batch, App.fontGame, Lang["GAME_MORE_RECENT_AUTOSAVE1"], Toolkit.drawWidth, 0, altSelDrawY) + Toolkit.drawTextCentered(batch, App.fontGame, Lang["GAME_MORE_RECENT_AUTOSAVE2"], Toolkit.drawWidth, 0, altSelDrawY + 24) + // Manual Save Autosave + Toolkit.drawTextCentered(batch, App.fontGame, Lang["MENU_IO_MANUAL_SAVE"], altSelHdrawW, (Toolkit.drawWidth - altSelDrawW)/2, altSelDrawY + 80) + Toolkit.drawTextCentered(batch, App.fontGame, Lang["MENU_IO_AUTOSAVE"], altSelHdrawW, Toolkit.drawWidth/2, altSelDrawY + 80) + + if (::loadAutoThumbButton.isInitialized) loadAutoThumbButton.render(batch, camera) + if (::loadManualThumbButton.isInitialized) loadManualThumbButton.render(batch, camera) } override fun dispose() { - TODO("Not yet implemented") + if (::loadAutoThumbButton.isInitialized) loadAutoThumbButton.dispose() + if (::loadManualThumbButton.isInitialized) loadManualThumbButton.dispose() } + + private fun DiskPair.getThumbnail(): TextureRegion { + return this.player.requestFile(VDFileID.PLAYER_SCREENSHOT).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 { + App.disposables.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") + } + } + } + + override fun touchDown(screenX: Int, screenY: Int, pointer: Int, button: Int): Boolean { + super.touchDown(screenX, screenY, pointer, button) + if (::loadAutoThumbButton.isInitialized) loadAutoThumbButton.touchDown(screenX, screenY, pointer, button) + if (::loadManualThumbButton.isInitialized) loadManualThumbButton.touchDown(screenX, screenY, pointer, button) + return true + } + + override fun touchUp(screenX: Int, screenY: Int, pointer: Int, button: Int): Boolean { + super.touchUp(screenX, screenY, pointer, button) + if (::loadAutoThumbButton.isInitialized) loadAutoThumbButton.touchUp(screenX, screenY, pointer, button) + if (::loadManualThumbButton.isInitialized) loadManualThumbButton.touchUp(screenX, screenY, pointer, button) + return true + } + + 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) + } + } } \ No newline at end of file diff --git a/src/net/torvald/terrarum/modulebasegame/ui/UILoadManage.kt b/src/net/torvald/terrarum/modulebasegame/ui/UILoadManage.kt index 6e6779f53..f30fb2a5e 100644 --- a/src/net/torvald/terrarum/modulebasegame/ui/UILoadManage.kt +++ b/src/net/torvald/terrarum/modulebasegame/ui/UILoadManage.kt @@ -1,10 +1,13 @@ package net.torvald.terrarum.modulebasegame.ui import com.badlogic.gdx.graphics.Camera +import com.badlogic.gdx.graphics.Color import com.badlogic.gdx.graphics.g2d.SpriteBatch import net.torvald.terrarum.App +import net.torvald.terrarum.langpack.Lang import net.torvald.terrarum.ui.Toolkit import net.torvald.terrarum.ui.UICanvas +import net.torvald.terrarum.ui.UIItemTextButton /** * Created by minjaesong on 2023-07-05. @@ -14,12 +17,51 @@ class UILoadManage(val full: UILoadSavegame) : UICanvas() { override var width: Int = Toolkit.drawWidth override var height: Int = App.scr.height + private val goButtonWidth = 180 + private val drawX = (Toolkit.drawWidth - 480) / 2 + private val drawY = (App.scr.height - 480) / 2 + private val buttonRowY = drawY + 480 - 24 + private val corruptedBackButton = UIItemTextButton(this, "MENU_LABEL_BACK", (Toolkit.drawWidth - goButtonWidth) / 2, buttonRowY, goButtonWidth, true, alignment = UIItemTextButton.Companion.Alignment.CENTRE, hasBorder = true) + private val confirmCancelButton = UIItemTextButton(this, "MENU_LABEL_CANCEL", drawX + (240 - goButtonWidth) / 2, buttonRowY, goButtonWidth, true, alignment = UIItemTextButton.Companion.Alignment.CENTRE, hasBorder = true) + private val confirmDeleteButton = UIItemTextButton(this, "MENU_LABEL_DELETE", drawX + 240 + (240 - goButtonWidth) / 2, buttonRowY, goButtonWidth, true, alignment = UIItemTextButton.Companion.Alignment.CENTRE, hasBorder = true, inactiveCol = Toolkit.Theme.COL_RED, activeCol = Toolkit.Theme.COL_REDD) + + private var mode = 0 + + private val MODE_INIT = 0 + private val MODE_DELETE = 16 // are you sure? + private val MODE_RENAME = 32 // show rename dialogue + + init { + corruptedBackButton.clickOnceListener = { _,_ -> full.remoCon.openUI(UILoadSavegame(full.remoCon)) } + confirmCancelButton.clickOnceListener = { _,_ -> full.remoCon.openUI(UILoadSavegame(full.remoCon)) } + confirmDeleteButton.clickOnceListener = { _,_ -> + val pu = full.buttonSelectedForDeletion!!.playerUUID + val wu = full.buttonSelectedForDeletion!!.worldUUID + App.savegamePlayers[pu]?.moveToRecycle(App.recycledPlayersDir)?.let { + App.sortedPlayers.remove(pu) + App.savegamePlayers.remove(pu) + App.savegamePlayersName.remove(pu) + } + // don't delete the world please + full.remoCon.openUI(UILoadSavegame(full.remoCon)) + } + } + + override fun updateUI(delta: Float) { TODO("Not yet implemented") } override fun renderUI(batch: SpriteBatch, camera: Camera) { - TODO("Not yet implemented") + if (mode == MODE_DELETE) { + Toolkit.drawTextCentered(batch, App.fontGame, Lang["MENU_LABEL_SAVE_WILL_BE_DELETED"], Toolkit.drawWidth, 0, titleTopGradEnd + cellInterval - 46) + Toolkit.drawTextCentered(batch, App.fontGame, Lang["MENU_LABEL_ARE_YOU_SURE"], Toolkit.drawWidth, 0, titleTopGradEnd + cellInterval + SAVE_CELL_HEIGHT + 36) + + full.buttonSelectedForDeletion!!.render(batch, camera) + + confirmCancelButton.render(batch, camera) + confirmDeleteButton.render(batch, camera) + } } override fun dispose() { diff --git a/src/net/torvald/terrarum/modulebasegame/ui/UILoadSavegame.kt b/src/net/torvald/terrarum/modulebasegame/ui/UILoadSavegame.kt index 2a8a4cb47..127b19dfa 100644 --- a/src/net/torvald/terrarum/modulebasegame/ui/UILoadSavegame.kt +++ b/src/net/torvald/terrarum/modulebasegame/ui/UILoadSavegame.kt @@ -97,78 +97,28 @@ class UILoadSavegame(val remoCon: UIRemoCon) : Advanceable() { internal var showSpinner = false -// private val playerCells = ArrayList() - - var mode = 0 // 0: show players, 1: show worlds - private set(value) { - touchLatched = true - field = value - } - - 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 val MODE_SAVE_DELETE = 512 - private val MODE_SAVE_DELETE_CONFIRM = 513 - - private var buttonSelectedForDeletion: UIItemPlayerCells? = null + internal var buttonSelectedForDeletion: UIItemPlayerCells? = null private val goButtonWidth = 180 private val drawX = (Toolkit.drawWidth - 480) / 2 private val drawY = (App.scr.height - 480) / 2 private val buttonRowY = drawY + 480 - 24 - private val corruptedBackButton = UIItemTextButton(this, "MENU_LABEL_BACK", (Toolkit.drawWidth - goButtonWidth) / 2, buttonRowY, goButtonWidth, true, alignment = UIItemTextButton.Companion.Alignment.CENTRE, hasBorder = true) - private val confirmCancelButton = UIItemTextButton(this, "MENU_LABEL_CANCEL", drawX + (240 - goButtonWidth) / 2, buttonRowY, goButtonWidth, true, alignment = UIItemTextButton.Companion.Alignment.CENTRE, hasBorder = true) - private val confirmDeleteButton = UIItemTextButton(this, "MENU_LABEL_DELETE", drawX + 240 + (240 - goButtonWidth) / 2, buttonRowY, goButtonWidth, true, alignment = UIItemTextButton.Companion.Alignment.CENTRE, hasBorder = true, inactiveCol = Toolkit.Theme.COL_RED, activeCol = Toolkit.Theme.COL_REDD) 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.player.requestFile(PLAYER_SCREENSHOT).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 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 val altSelQQQdrawW = altSelDrawW * 3 / 4*/ private val transitionalListing = UILoadList(this) private val transitionalAutosave = UILoadAutosave(this) private val transitionalManage = UILoadManage(this) - private val transitionalNewCharacter = UILoadNewCharacter(this) + private val transitionalNewCharacter = UINewCharacter(remoCon) private val transitionPanel = UIItemHorizontalFadeSlide( this, (width - internalWidth) / 2, @@ -184,29 +134,9 @@ class UILoadSavegame(val remoCon: UIRemoCon) : Advanceable() { } - 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) - } - } init { - corruptedBackButton.clickOnceListener = { _,_ -> remoCon.openUI(UILoadSavegame(remoCon)) } - confirmCancelButton.clickOnceListener = { _,_ -> remoCon.openUI(UILoadSavegame(remoCon)) } - confirmDeleteButton.clickOnceListener = { _,_ -> - val pu = buttonSelectedForDeletion!!.playerUUID - val wu = buttonSelectedForDeletion!!.worldUUID - App.savegamePlayers[pu]?.moveToRecycle(App.recycledPlayersDir)?.let { - App.sortedPlayers.remove(pu) - App.savegamePlayers.remove(pu) - App.savegamePlayersName.remove(pu) - } - // don't delete the world please - remoCon.openUI(UILoadSavegame(remoCon)) - } + } override fun advanceMode(button: UIItem) { @@ -231,48 +161,6 @@ class UILoadSavegame(val remoCon: UIRemoCon) : Advanceable() { 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()!!) - it.clickOnceListener = { _,_ -> - loadables.getManualSave()!!.let { - UILoadGovernor.playerDisk = it.player - UILoadGovernor.worldDisk = it.world - } - mode = MODE_LOAD_DA_SHIT_ALREADY - } - } - 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()!!) - it.clickOnceListener = { _,_ -> - loadables.getAutoSave()!!.let { - UILoadGovernor.playerDisk = it.player - UILoadGovernor.worldDisk = it.world - } - mode = MODE_LOAD_DA_SHIT_ALREADY - } - } - MODE_SAVE_MULTIPLE_CHOICES } else if (!loadables.saveAvaliable()) {