From 2891d0466e3c135b78185ce2eb070cae91c1be73 Mon Sep 17 00:00:00 2001 From: minjaesong Date: Wed, 29 Sep 2021 12:38:08 +0900 Subject: [PATCH] initial savefile generation of the newgame --- .../gui/savegame_thumb_placeholder.png | 3 + .../torvald/terrarum/CommonResourcePool.kt | 8 +- src/net/torvald/terrarum/IngameInstance.kt | 2 + .../torvald/terrarum/gameworld/GameWorld.kt | 1 + .../terrarum/modulebasegame/TerrarumIngame.kt | 62 +- .../terrarum/modulebasegame/console/Save.kt | 2 +- .../gameactors/FixtureStorageChest.kt | 10 +- .../gameactors/PlayerBuilderTestSubject1.kt | 4 +- .../modulebasegame/ui/UICheatDetected.kt | 7 +- .../modulebasegame/ui/UIInventoryEscMenu.kt | 7 +- .../modulebasegame/ui/UIInventoryFull.kt | 10 +- .../ui/UIItemInventoryItemGrid.kt | 4 +- .../modulebasegame/ui/UILoadDemoSavefiles.kt | 19 +- .../modulebasegame/ui/UIProxyNewRandomGame.kt | 3 +- .../modulebasegame/worldgenerator/Worldgen.kt | 20 +- .../terrarum/serialise/GameSavingThread.kt | 23 +- .../terrarum/serialise/WriteSavegame.kt | 26 +- src/net/torvald/terrarum/tvd/VDUtil.kt | 1 - src/net/torvald/terrarum/tvd/VirtualDisk.kt | 2 +- src/net/torvald/terrarum/ui/ConsoleWindow.kt | 11 +- .../torvald/terrarum/utils/RandomWordsName.kt | 1314 +++++++++++++++++ 21 files changed, 1456 insertions(+), 83 deletions(-) create mode 100644 assets/graphics/gui/savegame_thumb_placeholder.png create mode 100644 src/net/torvald/terrarum/utils/RandomWordsName.kt diff --git a/assets/graphics/gui/savegame_thumb_placeholder.png b/assets/graphics/gui/savegame_thumb_placeholder.png new file mode 100644 index 000000000..105bd8f12 --- /dev/null +++ b/assets/graphics/gui/savegame_thumb_placeholder.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:6c106b0a9cbc4d3f5cd1438e4c83b8fe0f223fa687702a7ff7c1d0bab4ae2c2c +size 583 diff --git a/src/net/torvald/terrarum/CommonResourcePool.kt b/src/net/torvald/terrarum/CommonResourcePool.kt index 89e084af2..6a5c6dedd 100644 --- a/src/net/torvald/terrarum/CommonResourcePool.kt +++ b/src/net/torvald/terrarum/CommonResourcePool.kt @@ -14,7 +14,7 @@ object CommonResourcePool { private val loadingList = Queue() private val pool = HashMap() - private val poolKillFun = HashMap Unit)?>() + private val poolKillFun = HashMap Unit)?>() //private val typesMap = HashMap>() private var loadCounter = -1 // using counters so that the loading can be done on separate thread (gg if the asset requires GL context to be loaded) val loaded: Boolean // see if there's a thing to load @@ -77,7 +77,7 @@ object CommonResourcePool { * - com.badlogic.gdx.graphics.g2d.TextureRegion * - net.torvald.UnsafePtr */ - fun addToLoadingList(identifier: String, loadFunction: () -> Any, destroyFunction: (() -> Unit)?) { + fun addToLoadingList(identifier: String, loadFunction: () -> Any, destroyFunction: ((Any) -> Unit)?) { // check if resource is already there if (!resourceExists(identifier)) { loadingList.addFirst(ResourceLoadingDescriptor(identifier, loadFunction, destroyFunction)) @@ -128,7 +128,7 @@ object CommonResourcePool { u is Texture -> u.dispose() u is TextureRegion -> u.texture.dispose() u is UnsafePtr -> u.destroy() - else -> poolKillFun[name]?.invoke() + else -> poolKillFun[name]?.invoke(u) } } catch (e: Throwable) { @@ -140,6 +140,6 @@ object CommonResourcePool { private data class ResourceLoadingDescriptor( val name: String, val loadfun: () -> Any, - val killfun: (() -> Unit)? = null + val killfun: ((Any) -> Unit)? = null ) } \ No newline at end of file diff --git a/src/net/torvald/terrarum/IngameInstance.kt b/src/net/torvald/terrarum/IngameInstance.kt index 66342f1c9..2cfc839b0 100644 --- a/src/net/torvald/terrarum/IngameInstance.kt +++ b/src/net/torvald/terrarum/IngameInstance.kt @@ -45,6 +45,8 @@ open class IngameInstance(val batch: SpriteBatch) : Screen { lateinit var savegameArchive: VirtualDisk internal set + var savegameNickname: String = "SplinesReticulated" + internal set var screenZoom = 1.0f val ZOOM_MAXIMUM = 4.0f diff --git a/src/net/torvald/terrarum/gameworld/GameWorld.kt b/src/net/torvald/terrarum/gameworld/GameWorld.kt index ca1dd5e6e..c5f49e58b 100644 --- a/src/net/torvald/terrarum/gameworld/GameWorld.kt +++ b/src/net/torvald/terrarum/gameworld/GameWorld.kt @@ -126,6 +126,7 @@ open class GameWorld() : Disposable { this.width = width this.height = height + // preliminary spawn points this.spawnX = width / 2 this.spawnY = 200 diff --git a/src/net/torvald/terrarum/modulebasegame/TerrarumIngame.kt b/src/net/torvald/terrarum/modulebasegame/TerrarumIngame.kt index 1afb08860..01251791e 100644 --- a/src/net/torvald/terrarum/modulebasegame/TerrarumIngame.kt +++ b/src/net/torvald/terrarum/modulebasegame/TerrarumIngame.kt @@ -32,19 +32,18 @@ import net.torvald.terrarum.modulebasegame.worldgenerator.RoguelikeRandomiser import net.torvald.terrarum.modulebasegame.worldgenerator.Worldgen import net.torvald.terrarum.modulebasegame.worldgenerator.WorldgenParams import net.torvald.terrarum.realestate.LandUtil -import net.torvald.terrarum.serialise.Common -import net.torvald.terrarum.serialise.LoadSavegame -import net.torvald.terrarum.serialise.ReadActor -import net.torvald.terrarum.serialise.WriteMeta +import net.torvald.terrarum.serialise.* import net.torvald.terrarum.tvda.VDUtil import net.torvald.terrarum.tvda.VirtualDisk import net.torvald.terrarum.ui.UICanvas +import net.torvald.terrarum.utils.RandomWordsName import net.torvald.terrarum.weather.WeatherMixer import net.torvald.terrarum.worlddrawer.BlocksDrawer import net.torvald.terrarum.worlddrawer.FeaturesDrawer import net.torvald.terrarum.worlddrawer.WorldCamera import net.torvald.util.CircularArray import org.khelekore.prtree.PRTree +import java.io.File import java.util.concurrent.locks.ReentrantLock import kotlin.math.roundToInt @@ -231,7 +230,8 @@ open class TerrarumIngame(batch: SpriteBatch) : IngameInstance(batch) { data class NewWorldParameters( val width: Int, val height: Int, - val worldGenSeed: Long + val worldGenSeed: Long, + val savegameName: String // other worldgen options ) { init { @@ -278,7 +278,7 @@ open class TerrarumIngame(batch: SpriteBatch) : IngameInstance(batch) { Terrarum.itemCodex.loadFromSave(codices.item) Terrarum.apocryphas = HashMap(codices.apocryphas) - + savegameNickname = codices.disk.getDiskNameString(Common.CHARSET) } } @@ -293,6 +293,32 @@ open class TerrarumIngame(batch: SpriteBatch) : IngameInstance(batch) { actorNowPlaying = getActorByID(Terrarum.PLAYER_REF_ID) as IngamePlayer } + private fun postInitForNewGame() { + // go to spawn position + printdbg(this, "World Spawn position: (${world.spawnX}, ${world.spawnY})") + +// setTheRealGamerFirstTime(PlayerBuilderSigrid()) + setTheRealGamerFirstTime(PlayerBuilderTestSubject1()) +// setTheRealGamerFirstTime(PlayerBuilderWerebeastTest()) + + savegameArchive = VDUtil.createNewDisk( + 1L shl 60, + savegameNickname, + Common.CHARSET + ) + + actorNowPlaying!!.setPosition( + world.spawnX * TILE_SIZED, + world.spawnY * TILE_SIZED + ) + + // make initial savefile +// pause() + WriteSavegame.immediate(savegameArchive, File(App.defaultSaveDir, savegameNickname), this) { +// resume() + } + } + /** * Init instance by creating new world */ @@ -324,6 +350,8 @@ open class TerrarumIngame(batch: SpriteBatch) : IngameInstance(batch) { historicalFigureIDBucket = ArrayList() + + savegameNickname = worldParams.savegameName } KeyToggler.forceSet(Input.Keys.Q, false) @@ -333,17 +361,7 @@ open class TerrarumIngame(batch: SpriteBatch) : IngameInstance(batch) { /** Load rest of the game with GL context */ fun postInit() { - if (actorNowPlaying == null) { - //setTheRealGamerFirstTime(PlayerBuilderSigrid()) - setTheRealGamerFirstTime(PlayerBuilderTestSubject1()) -// setTheRealGamerFirstTime(PlayerBuilderWerebeastTest()) - - savegameArchive = VDUtil.createNewDisk( - 1L shl 60, - actorNowPlaying!!.actorValue.getAsString(AVKey.NAME) ?: "Player ${App.getTIME_T()}", - Common.CHARSET - ) - } + actorNowPlaying!! // null check, just in case... MegaRainGovernor // invoke MegaRain Governor @@ -529,11 +547,7 @@ open class TerrarumIngame(batch: SpriteBatch) : IngameInstance(batch) { if (!gameFullyLoaded) { if (gameLoadMode == GameLoadMode.CREATE_NEW) { - // go to spawn position - actorNowPlaying?.setPosition( - world.spawnX * TILE_SIZED, - world.spawnY * TILE_SIZED - ) + postInitForNewGame() } else if (gameLoadMode == GameLoadMode.LOAD_FROM) { postInitForLoadFromSave(gameLoadInfoPayload as Codices) @@ -541,7 +555,6 @@ open class TerrarumIngame(batch: SpriteBatch) : IngameInstance(batch) { postInit() - gameFullyLoaded = true } @@ -1054,10 +1067,11 @@ open class TerrarumIngame(batch: SpriteBatch) : IngameInstance(batch) { } override fun pause() { - // TODO no pause when off-focus on desktop + paused = true } override fun resume() { + paused = false } override fun hide() { diff --git a/src/net/torvald/terrarum/modulebasegame/console/Save.kt b/src/net/torvald/terrarum/modulebasegame/console/Save.kt index 6822cf90c..4ca708f0d 100644 --- a/src/net/torvald/terrarum/modulebasegame/console/Save.kt +++ b/src/net/torvald/terrarum/modulebasegame/console/Save.kt @@ -56,7 +56,7 @@ object Save : ConsoleCommand { } override fun printUsage() { - Echo("Usage: save ") + Echo("Usage: save ") } } \ No newline at end of file diff --git a/src/net/torvald/terrarum/modulebasegame/gameactors/FixtureStorageChest.kt b/src/net/torvald/terrarum/modulebasegame/gameactors/FixtureStorageChest.kt index e54855983..63f68008a 100644 --- a/src/net/torvald/terrarum/modulebasegame/gameactors/FixtureStorageChest.kt +++ b/src/net/torvald/terrarum/modulebasegame/gameactors/FixtureStorageChest.kt @@ -235,20 +235,20 @@ internal class UIStorageChest : UICanvas( } override fun doOpening(delta: Float) { - Terrarum.ingame?.paused = true - (Terrarum.ingame as? TerrarumIngame)?.setTooltipMessage(null) + INGAME.pause() + INGAME.setTooltipMessage(null) } override fun doClosing(delta: Float) { - Terrarum.ingame?.paused = false - (Terrarum.ingame as? TerrarumIngame)?.setTooltipMessage(null) + INGAME.resume() + INGAME.setTooltipMessage(null) } override fun endOpening(delta: Float) { } override fun endClosing(delta: Float) { - (Terrarum.ingame as? TerrarumIngame)?.setTooltipMessage(null) // required! + INGAME.setTooltipMessage(null) // required! } diff --git a/src/net/torvald/terrarum/modulebasegame/gameactors/PlayerBuilderTestSubject1.kt b/src/net/torvald/terrarum/modulebasegame/gameactors/PlayerBuilderTestSubject1.kt index 0698ae090..3b7d7e017 100644 --- a/src/net/torvald/terrarum/modulebasegame/gameactors/PlayerBuilderTestSubject1.kt +++ b/src/net/torvald/terrarum/modulebasegame/gameactors/PlayerBuilderTestSubject1.kt @@ -34,7 +34,9 @@ object PlayerBuilderTestSubject1 { p.reassembleSprite(p.sprite!!, p.spriteGlow) p.setHitboxDimension(15, p.actorValue.getAsInt(AVKey.BASEHEIGHT) ?: ActorHumanoid.BASE_HEIGHT, 21, 0) - p.setPosition(3.0 * TILE_SIZE, 3.0 * TILE_SIZE) + // ingame must teleport the player to the spawn point + // see `TerrarumIngame.render` +// p.setPosition(3.0 * TILE_SIZE, 3.0 * TILE_SIZE) PlayerBuilderSigrid.fillTestInventory(p.inventory) diff --git a/src/net/torvald/terrarum/modulebasegame/ui/UICheatDetected.kt b/src/net/torvald/terrarum/modulebasegame/ui/UICheatDetected.kt index cd8693749..2e39a5be9 100644 --- a/src/net/torvald/terrarum/modulebasegame/ui/UICheatDetected.kt +++ b/src/net/torvald/terrarum/modulebasegame/ui/UICheatDetected.kt @@ -4,10 +4,7 @@ import com.badlogic.gdx.graphics.Camera import com.badlogic.gdx.graphics.Color import com.badlogic.gdx.graphics.OrthographicCamera import com.badlogic.gdx.graphics.g2d.SpriteBatch -import net.torvald.terrarum.App -import net.torvald.terrarum.Second -import net.torvald.terrarum.Terrarum -import net.torvald.terrarum.fillRect +import net.torvald.terrarum.* import net.torvald.terrarum.langpack.Lang import net.torvald.terrarum.ui.Toolkit import net.torvald.terrarum.ui.UICanvas @@ -51,7 +48,7 @@ class UICheatDetected : UICanvas() { } override fun doOpening(delta: Float) { - Terrarum.ingame?.paused = true + INGAME.pause() } override fun doClosing(delta: Float) { diff --git a/src/net/torvald/terrarum/modulebasegame/ui/UIInventoryEscMenu.kt b/src/net/torvald/terrarum/modulebasegame/ui/UIInventoryEscMenu.kt index b865de7f9..761f732ec 100644 --- a/src/net/torvald/terrarum/modulebasegame/ui/UIInventoryEscMenu.kt +++ b/src/net/torvald/terrarum/modulebasegame/ui/UIInventoryEscMenu.kt @@ -85,8 +85,13 @@ class UIInventoryEscMenu(val full: UIInventoryFull) : UICanvas() { screen = 3; gameMenuButtons.deselect() full.handler.lockToggle() full.lockTransition() + // make backup of the old save + File(App.defaultSaveDir, INGAME.savegameNickname).copyTo( + File(App.defaultSaveDir, INGAME.savegameNickname+".1"), // don't use .bak as it's used by the savecracker + true + ) // save the game - WriteSavegame(INGAME.savegameArchive, File(App.defaultSaveDir, "${App.getTIME_T()}"), Terrarum.ingame!! as TerrarumIngame) { + WriteSavegame(INGAME.savegameArchive, File(App.defaultSaveDir, INGAME.savegameNickname), Terrarum.ingame!! as TerrarumIngame) { // callback: System.gc() screen = 0 diff --git a/src/net/torvald/terrarum/modulebasegame/ui/UIInventoryFull.kt b/src/net/torvald/terrarum/modulebasegame/ui/UIInventoryFull.kt index b3a18e99d..9f9b2f01a 100644 --- a/src/net/torvald/terrarum/modulebasegame/ui/UIInventoryFull.kt +++ b/src/net/torvald/terrarum/modulebasegame/ui/UIInventoryFull.kt @@ -275,20 +275,20 @@ class UIInventoryFull( override fun doOpening(delta: Float) { - Terrarum.ingame?.paused = true - (Terrarum.ingame as? TerrarumIngame)?.setTooltipMessage(null) + INGAME.pause() + INGAME.setTooltipMessage(null) } override fun doClosing(delta: Float) { - Terrarum.ingame?.paused = false - (Terrarum.ingame as? TerrarumIngame)?.setTooltipMessage(null) + INGAME.resume() + INGAME.setTooltipMessage(null) } override fun endOpening(delta: Float) { } override fun endClosing(delta: Float) { - (Terrarum.ingame as? TerrarumIngame)?.setTooltipMessage(null) // required! + INGAME.setTooltipMessage(null) // required! MinimapComposer.revalidateAll() } diff --git a/src/net/torvald/terrarum/modulebasegame/ui/UIItemInventoryItemGrid.kt b/src/net/torvald/terrarum/modulebasegame/ui/UIItemInventoryItemGrid.kt index c1109cca0..77796a097 100644 --- a/src/net/torvald/terrarum/modulebasegame/ui/UIItemInventoryItemGrid.kt +++ b/src/net/torvald/terrarum/modulebasegame/ui/UIItemInventoryItemGrid.kt @@ -374,7 +374,7 @@ class UIItemInventoryItemGrid( // set tooltip accordingly if (isCompactMode && it.item != null && it.mouseUp && !tooltipSet) { - (Terrarum.ingame as? TerrarumIngame)?.setTooltipMessage( + INGAME.setTooltipMessage( if (INVEN_DEBUG_MODE) { it.item?.name + " (${it.item?.originalID}${if (it.item?.originalID == it.item?.dynamicID) "" else "/${it.item?.dynamicID}"})" } @@ -387,7 +387,7 @@ class UIItemInventoryItemGrid( } if (!tooltipSet) { - (Terrarum.ingame as? TerrarumIngame)?.setTooltipMessage(null) + INGAME.setTooltipMessage(null) } diff --git a/src/net/torvald/terrarum/modulebasegame/ui/UILoadDemoSavefiles.kt b/src/net/torvald/terrarum/modulebasegame/ui/UILoadDemoSavefiles.kt index db1fcaa08..3fd11a151 100644 --- a/src/net/torvald/terrarum/modulebasegame/ui/UILoadDemoSavefiles.kt +++ b/src/net/torvald/terrarum/modulebasegame/ui/UILoadDemoSavefiles.kt @@ -1,5 +1,6 @@ package net.torvald.terrarum.modulebasegame.ui +import com.badlogic.gdx.Gdx import com.badlogic.gdx.Input import com.badlogic.gdx.graphics.* import com.badlogic.gdx.graphics.g2d.SpriteBatch @@ -10,6 +11,7 @@ import net.torvald.getKeycapConsole import net.torvald.getKeycapPC import net.torvald.terrarum.* import net.torvald.terrarum.langpack.Lang +import net.torvald.terrarum.serialise.Common import net.torvald.terrarum.serialise.LoadSavegame import net.torvald.terrarum.serialise.ReadMeta import net.torvald.terrarum.tvda.ByteArray64InputStream @@ -27,6 +29,13 @@ import kotlin.math.roundToInt */ class UILoadDemoSavefiles : UICanvas() { + init { + CommonResourcePool.addToLoadingList("terrarum-defaultsavegamethumb") { + TextureRegion(Texture(Gdx.files.internal("assets/graphics/gui/savegame_thumb_placeholder.png"))) + } + CommonResourcePool.loadAll() + } + override var width: Int get() = App.scr.width set(value) {} @@ -277,7 +286,7 @@ class UIItemDemoSaveCells( override val height: Int = HEIGHT private lateinit var thumbPixmap: Pixmap - private lateinit var thumb: TextureRegion + private var thumb: TextureRegion? = null private val grad = CommonResourcePool.getAsTexture("title_halfgrad") private val meta = ReadMeta(disk) @@ -309,7 +318,7 @@ class UIItemDemoSaveCells( val thumbTex = Texture(thumbPixmap) thumbTex.setFilter(Texture.TextureFilter.Linear, Texture.TextureFilter.Linear) thumb = TextureRegion(thumbTex) - thumb.setRegion(0, (thumbTex.height - 2 * height) / 2, width * 2, height * 2) + thumb!!.setRegion(0, (thumbTex.height - 2 * height) / 2, width * 2, height * 2) } catch (e: NullPointerException) { // use stock texture @@ -335,7 +344,7 @@ class UIItemDemoSaveCells( // draw thumbnail batch.color = Color.WHITE blendNormal(batch) - batch.draw(thumb, x, y + height, width.toFloat(), -height.toFloat()) + batch.draw(thumb ?: CommonResourcePool.getAsTextureRegion("terrarum-defaultsavegamethumb"), x, y + height, width.toFloat(), -height.toFloat()) // draw gradient blendMul(batch) batch.draw(grad, x + width.toFloat(), y, -width.toFloat(), height.toFloat()) @@ -350,14 +359,14 @@ class UIItemDemoSaveCells( // file size App.fontSmallNumbers.draw(batch, "${disk.usedBytes.ushr(10)} KiB", x + 3f, y + height - 16f) // savegame name -// App.fontGame.draw(batch, disk.getDiskNameString(Common.CHARSET), x + 3f, y + 1f) + App.fontGame.draw(batch, disk.getDiskNameString(Common.CHARSET), x + 3f, y + 1f) super.render(batch, camera) batch.color = Color.WHITE } override fun dispose() { - thumb.texture.dispose() + thumb?.texture?.dispose() thumbPixmap.dispose() } diff --git a/src/net/torvald/terrarum/modulebasegame/ui/UIProxyNewRandomGame.kt b/src/net/torvald/terrarum/modulebasegame/ui/UIProxyNewRandomGame.kt index 2c75e5c28..2297b8450 100644 --- a/src/net/torvald/terrarum/modulebasegame/ui/UIProxyNewRandomGame.kt +++ b/src/net/torvald/terrarum/modulebasegame/ui/UIProxyNewRandomGame.kt @@ -10,6 +10,7 @@ import net.torvald.terrarum.Terrarum import net.torvald.terrarum.modulebasegame.TerrarumIngame import net.torvald.terrarum.modulebasegame.WorldgenLoadScreen import net.torvald.terrarum.ui.UICanvas +import net.torvald.terrarum.utils.RandomWordsName /** * Created by minjaesong on 2018-12-08. @@ -38,7 +39,7 @@ class UIProxyNewRandomGame : UICanvas() { val ingame = TerrarumIngame(App.batch) - val worldParam = TerrarumIngame.NewWorldParameters(2880, 1350, HQRNG().nextLong()) + val worldParam = TerrarumIngame.NewWorldParameters(2880, 1350, HQRNG().nextLong(), RandomWordsName(4)) // val worldParam = TerrarumIngame.NewWorldParameters(2880, 1350, 0x51621D) // val worldParam = TerrarumIngame.NewWorldParameters(6030, 1800, HQRNG().nextLong()) // small diff --git a/src/net/torvald/terrarum/modulebasegame/worldgenerator/Worldgen.kt b/src/net/torvald/terrarum/modulebasegame/worldgenerator/Worldgen.kt index d102c0050..fea5ef5ff 100644 --- a/src/net/torvald/terrarum/modulebasegame/worldgenerator/Worldgen.kt +++ b/src/net/torvald/terrarum/modulebasegame/worldgenerator/Worldgen.kt @@ -2,6 +2,7 @@ package net.torvald.terrarum.modulebasegame.worldgenerator import net.torvald.terrarum.App import net.torvald.terrarum.App.printdbg +import net.torvald.terrarum.BlockCodex import net.torvald.terrarum.gameworld.GameWorld /** @@ -30,7 +31,7 @@ object Worldgen { for (i in jobs.indices) { - printdbg(this, "Worldgen: job #$i") + printdbg(this, "Worldgen: job #${i+1}") val it = jobs[i] @@ -38,6 +39,23 @@ object Worldgen { it.theWork.getDone() } + // determine spawn point + world.spawnX = 0 + world.spawnY = 180 + // go up? + if (BlockCodex[world.getTileFromTerrain(world.spawnX, world.spawnY)].isSolid) { + // go up! + while (BlockCodex[world.getTileFromTerrain(world.spawnX, world.spawnY)].isSolid) { + world.spawnY -= 1 + } + } + else { + // go down! + while (!BlockCodex[world.getTileFromTerrain(world.spawnX, world.spawnY)].isSolid) { + world.spawnY += 1 + } + } + printdbg(this, "Generation job finished") } diff --git a/src/net/torvald/terrarum/serialise/GameSavingThread.kt b/src/net/torvald/terrarum/serialise/GameSavingThread.kt index 5c8647807..9aacea8ee 100644 --- a/src/net/torvald/terrarum/serialise/GameSavingThread.kt +++ b/src/net/torvald/terrarum/serialise/GameSavingThread.kt @@ -1,5 +1,6 @@ package net.torvald.terrarum.serialise +import com.badlogic.gdx.graphics.Pixmap import net.torvald.gdx.graphics.PixmapIO2 import net.torvald.terrarum.* import net.torvald.terrarum.console.Echo @@ -13,7 +14,7 @@ import java.util.zip.GZIPOutputStream /** * Created by minjaesong on 2021-09-14. */ -class GameSavingThread(val disk: VirtualDisk, val outFile: File, val ingame: TerrarumIngame, val callback: () -> Unit) : Runnable { +class GameSavingThread(val disk: VirtualDisk, val outFile: File, val ingame: TerrarumIngame, val hasThumbnail: Boolean, val callback: () -> Unit) : Runnable { /** * Will happily overwrite existing entry @@ -29,8 +30,10 @@ class GameSavingThread(val disk: VirtualDisk, val outFile: File, val ingame: Ter private val actorProgressMultiplier = 1f override fun run() { - while (!IngameRenderer.fboRGBexportedLatch) { - Thread.sleep(1L) + if (hasThumbnail) { + while (!IngameRenderer.fboRGBexportedLatch) { + Thread.sleep(1L) + } } val actorsList = listOf(ingame.actorContainerActive, ingame.actorContainerInactive).flatMap { it.filter { WriteWorld.actorAcceptable(it) } } @@ -58,12 +61,14 @@ class GameSavingThread(val disk: VirtualDisk, val outFile: File, val ingame: Ter val meta = DiskEntry(-1, 0, creation_t, time_t, metaContent) addFile(disk, meta) + if (hasThumbnail) { + PixmapIO2._writeTGA(gzout, IngameRenderer.fboRGBexport, true, true) + IngameRenderer.fboRGBexport.dispose() - PixmapIO2._writeTGA(gzout, IngameRenderer.fboRGBexport, true, true) - IngameRenderer.fboRGBexport.dispose() - val thumbContent = EntryFile(tgaout.toByteArray64()) - val thumb = DiskEntry(-2, 0, creation_t, time_t, thumbContent) - addFile(disk, thumb) + val thumbContent = EntryFile(tgaout.toByteArray64()) + val thumb = DiskEntry(-2, 0, creation_t, time_t, thumbContent) + addFile(disk, thumb) + } WriteSavegame.saveProgress += 1f @@ -157,7 +162,7 @@ class GameSavingThread(val disk: VirtualDisk, val outFile: File, val ingame: Ter Echo ("${ccW}Game saved with size of $ccG${outFile.length()}$ccW bytes") - IngameRenderer.fboRGBexportedLatch = false + if (hasThumbnail) IngameRenderer.fboRGBexportedLatch = false WriteSavegame.savingStatus = 255 diff --git a/src/net/torvald/terrarum/serialise/WriteSavegame.kt b/src/net/torvald/terrarum/serialise/WriteSavegame.kt index 2174e4c23..27075422c 100644 --- a/src/net/torvald/terrarum/serialise/WriteSavegame.kt +++ b/src/net/torvald/terrarum/serialise/WriteSavegame.kt @@ -1,5 +1,6 @@ package net.torvald.terrarum.serialise +import com.badlogic.gdx.Gdx import com.badlogic.gdx.graphics.Pixmap import net.torvald.terrarum.* import net.torvald.terrarum.App.printdbg @@ -27,16 +28,6 @@ object WriteSavegame { @Volatile var saveProgress = 0f @Volatile var saveProgressMax = 1f - /** - * Will happily overwrite existing entry - */ - private fun addFile(disk: VirtualDisk, file: DiskEntry) { - disk.entries[file.entryID] = file - file.parentEntryID = 0 - val dir = VDUtil.getAsDirectory(disk, 0) - if (!dir.contains(file.entryID)) dir.add(file.entryID) - } - operator fun invoke(disk: VirtualDisk, outFile: File, ingame: TerrarumIngame, callback: () -> Unit = {}) { savingStatus = 0 @@ -57,9 +48,21 @@ object WriteSavegame { } IngameRenderer.fboRGBexportRequested = true - val savingThread = Thread(GameSavingThread(disk, outFile, ingame, callback), "TerrarumBasegameGameSaveThread") + val savingThread = Thread(GameSavingThread(disk, outFile, ingame, true, callback), "TerrarumBasegameGameSaveThread") savingThread.start() + // it is caller's job to keep the game paused or keep a "save in progress" ui up + // use field 'savingStatus' to know when the saving is done + } + + + fun immediate(disk: VirtualDisk, outFile: File, ingame: TerrarumIngame, callback: () -> Unit = {}) { + savingStatus = 0 + + Echo("Immediate save fired") + + val savingThread = Thread(GameSavingThread(disk, outFile, ingame, false, callback), "TerrarumBasegameGameSaveThread") + savingThread.start() // it is caller's job to keep the game paused or keep a "save in progress" ui up // use field 'savingStatus' to know when the saving is done @@ -68,6 +71,7 @@ object WriteSavegame { + /** * Load and setup the game for the first load. * diff --git a/src/net/torvald/terrarum/tvd/VDUtil.kt b/src/net/torvald/terrarum/tvd/VDUtil.kt index 145fdc2f3..43ba75735 100644 --- a/src/net/torvald/terrarum/tvd/VDUtil.kt +++ b/src/net/torvald/terrarum/tvd/VDUtil.kt @@ -37,7 +37,6 @@ object VDUtil { } fun dumpToRealMachine(disk: VirtualDisk, outfile: File) { - if (!outfile.exists()) outfile.createNewFile() outfile.writeBytes64(disk.serialize().array) } diff --git a/src/net/torvald/terrarum/tvd/VirtualDisk.kt b/src/net/torvald/terrarum/tvd/VirtualDisk.kt index 9e2f0426e..407bf5907 100644 --- a/src/net/torvald/terrarum/tvd/VirtualDisk.kt +++ b/src/net/torvald/terrarum/tvd/VirtualDisk.kt @@ -127,7 +127,7 @@ class VirtualDisk( var isReadOnly: Boolean set(value) { extraInfoBytes[0] = (extraInfoBytes[0] and 0xFE.toByte()) or value.toBit() } get() = capacity == 0L || (extraInfoBytes.size > 0 && extraInfoBytes[0].and(1) == 1.toByte()) - fun getDiskNameString(charset: Charset) = String(diskName, charset) + fun getDiskNameString(charset: Charset) = diskName.toCanonicalString(charset) val root: DiskEntry get() = entries[0]!! diff --git a/src/net/torvald/terrarum/ui/ConsoleWindow.kt b/src/net/torvald/terrarum/ui/ConsoleWindow.kt index 34e2caff4..b6e102043 100644 --- a/src/net/torvald/terrarum/ui/ConsoleWindow.kt +++ b/src/net/torvald/terrarum/ui/ConsoleWindow.kt @@ -10,7 +10,6 @@ import net.torvald.terrarum.console.Authenticator import net.torvald.terrarum.console.CommandInterpreter import net.torvald.terrarum.gameactors.AVKey import net.torvald.terrarum.langpack.Lang -import net.torvald.terrarum.modulebasegame.TerrarumIngame import net.torvald.util.CircularArray @@ -208,7 +207,7 @@ class ConsoleWindow : UICanvas() { } override fun doOpening(delta: Float) { - Terrarum.ingame?.paused = true + Terrarum.ingame?.pause() /*openingTimeCounter += delta drawOffY = MovementInterpolator.fastPullOut(openingTimeCounter.toFloat() / openCloseTime.toFloat(), -height.toFloat(), 0f @@ -216,7 +215,7 @@ class ConsoleWindow : UICanvas() { } override fun doClosing(delta: Float) { - Terrarum.ingame?.paused = false + Terrarum.ingame?.resume() /*openingTimeCounter += delta drawOffY = MovementInterpolator.fastPullOut(openingTimeCounter.toFloat() / openCloseTime.toFloat(), 0f, -height.toFloat() @@ -224,14 +223,14 @@ class ConsoleWindow : UICanvas() { } override fun endOpening(delta: Float) { - Terrarum.ingame?.paused = true + Terrarum.ingame?.pause() drawOffY = 0f openingTimeCounter = 0f } override fun endClosing(delta: Float) { - (Terrarum.ingame as? TerrarumIngame)?.setTooltipMessage(null) - Terrarum.ingame?.paused = false + Terrarum.ingame?.setTooltipMessage(null) + Terrarum.ingame?.resume() drawOffY = -height.toFloat() openingTimeCounter = 0f } diff --git a/src/net/torvald/terrarum/utils/RandomWordsName.kt b/src/net/torvald/terrarum/utils/RandomWordsName.kt new file mode 100644 index 000000000..424e9e1ac --- /dev/null +++ b/src/net/torvald/terrarum/utils/RandomWordsName.kt @@ -0,0 +1,1314 @@ +package net.torvald.terrarum.utils + +/** + * Created by minjaesong on 2021-09-29. + */ +object RandomWordsName { + + operator fun invoke(wordCount: Int): String { + val sb = StringBuilder() + repeat(wordCount) { + sb.append(words.random()) + } + return "$sb" + } + + // wordlist cannot be too long as there's 64 kb limit for a Java class + private val words = """Acid +Acorn +Acre +Acts +Afar +Affix +Aged +Agent +Agile +Aging +Agony +Ahead +Aide +Aids +Aim +Ajar +Alarm +Alias +Alibi +Alien +Alike +Alive +Aloe +Aloft +Aloha +Alone +Amend +Amino +Ample +Amuse +Angel +Anger +Angle +Ankle +Apple +April +Apron +Aqua +Area +Arena +Argue +Arise +Armed +Armor +Army +Aroma +Array +Arson +Art +Ashen +Ashes +Atlas +Atom +Attic +Audio +Avert +Avoid +Awake +Award +Awoke +Axis +Bacon +Badge +Bagel +Baggy +Baked +Baker +Balmy +Banjo +Barge +Barn +Bash +Basil +Bask +Batch +Bath +Baton +Bats +Blade +Blank +Blast +Blaze +Bleak +Blend +Bless +Blimp +Blink +Bloat +Blob +Blog +Blot +Blunt +Blurt +Blush +Boast +Boat +Body +Boil +Bok +Bolt +Boned +Boney +Bonus +Bony +Book +Booth +Boots +Boss +Botch +Both +Boxer +Breed +Bribe +Brick +Bride +Brim +Bring +Brink +Brisk +Broad +Broil +Broke +Brook +Broom +Brush +Buck +Bud +Buggy +Bulge +Bulk +Bully +Bunch +Bunny +Bunt +Bush +Bust +Busy +Buzz +Cable +Cache +Cadet +Cage +Cake +Calm +Cameo +Canal +Candy +Cane +Canon +Cape +Card +Cargo +Carol +Carry +Carve +Case +Cash +Cause +Cedar +Chain +Chair +Chant +Chaos +Charm +Chase +Cheek +Cheer +Chef +Chess +Chest +Chew +Chief +Chili +Chill +Chip +Chomp +Chop +Chow +Chuck +Chump +Chunk +Churn +Chute +Cider +Cinch +City +Civic +Civil +Clad +Claim +Clamp +Clap +Clash +Clasp +Class +Claw +Clay +Clean +Clear +Cleat +Cleft +Clerk +Click +Cling +Clink +Clip +Cloak +Clock +Clone +Cloth +Cloud +Clump +Coach +Coast +Coat +Cod +Coil +Coke +Cola +Cold +Colt +Coma +Come +Comic +Comma +Cone +Cope +Copy +Coral +Cork +Cost +Cot +Couch +Cough +Cover +Cozy +Craft +Cramp +Crane +Crank +Crate +Crave +Crawl +Crazy +Creme +Crepe +Crept +Crib +Cried +Crisp +Crook +Crop +Cross +Crowd +Crown +Crumb +Crush +Crust +Cub +Cult +Cupid +Cure +Curl +Curry +Curse +Curve +Curvy +Cushy +Cut +Cycle +Dab +Dad +Daily +Dairy +Daisy +Dance +Dandy +Darn +Dart +Dash +Data +Date +Dawn +Deaf +Deal +Dean +Debit +Debt +Debug +Decaf +Decal +Decay +Deck +Decor +Decoy +Deed +Delay +Denim +Dense +Dent +Depth +Derby +Desk +Dial +Diary +Dice +Dig +Dill +Dime +Dimly +Diner +Dingy +Disco +Dish +Disk +Ditch +Ditzy +Dizzy +Dock +Dodge +Doing +Doll +Dome +Donor +Donut +Dose +Dot +Dove +Down +Dowry +Doze +Drab +Drama +Drank +Draw +Dress +Dried +Drift +Drill +Drive +Drone +Droop +Drove +Drown +Drum +Dry +Duck +Duct +Dude +Dug +Duke +Duo +Dusk +Dust +Duty +Dwarf +Dwell +Eagle +Early +Earth +Easel +East +Eaten +Eats +Ebay +Ebony +Ebook +Echo +Edge +Eel +Eject +Elbow +Elder +Elf +Elk +Elm +Elope +Elude +Elves +Email +Emit +Empty +Emu +Enter +Entry +Envoy +Equal +Erase +Error +Erupt +Essay +Etch +Evade +Even +Evict +Evil +Evoke +Exact +Exit +Fable +Faced +Fact +Fade +Fall +False +Fancy +Fang +Fax +Feast +Feed +Femur +Fence +Fend +Ferry +Fetal +Fetch +Fever +Fiber +Fifth +Fifty +Film +Filth +Final +Finch +Fit +Five +Flag +Flaky +Flame +Flap +Flask +Fled +Flick +Fling +Flint +Flip +Flirt +Float +Flock +Flop +Floss +Flyer +Foam +Foe +Fog +Foil +Folic +Folk +Food +Fool +Found +Fox +Foyer +Frail +Frame +Fray +Fresh +Fried +Frill +Frisk +From +Front +Frost +Froth +Frown +Froze +Fruit +Gag +Gains +Gala +Game +Gap +Gas +Gave +Gear +Gecko +Geek +Gem +Genre +Gift +Gig +Gills +Given +Giver +Glad +Glass +Glide +Gloss +Glove +Glow +Glue +Goal +Going +Golf +Gong +Good +Gooey +Goofy +Gore +Gown +Grab +Grain +Grant +Grape +Graph +Grasp +Grass +Grave +Gravy +Gray +Green +Greet +Grew +Grid +Grief +Grill +Grip +Grit +Groom +Grope +Growl +Grub +Grunt +Guide +Gulf +Gulp +Gummy +Guru +Gush +Gut +Guy +Habit +Half +Halo +Halt +Happy +Harm +Hash +Hasty +Hatch +Hate +Haven +Hazel +Hazy +Heap +Heat +Heave +Hedge +Hefty +Help +Herbs +Hers +Hub +Hug +Hula +Hull +Human +Humid +Hump +Hung +Hunk +Hunt +Hurry +Hurt +Hush +Hut +Ice +Icing +Icon +Icy +Igloo +Image +Ion +Iron +Islam +Issue +Item +Ivory +Ivy +Jab +Jam +Jaws +Jazz +Jeep +Jelly +Jet +Jiffy +Job +Jog +Jolly +Jolt +Jot +Joy +Judge +Juice +Juicy +July +Jumbo +Jump +Junky +Juror +Jury +Keep +Keg +Kept +Kick +Kilt +King +Kite +Kitty +Kiwi +Knee +Knelt +Koala +Kung +Ladle +Lady +Lair +Lake +Lance +Land +Lapel +Large +Lash +Lasso +Last +Latch +Late +Lazy +Left +Legal +Lemon +Lend +Lens +Lent +Level +Lever +Lid +Life +Lift +Lilac +Lily +Limb +Limes +Line +Lint +Lion +Lip +List +Lived +Liver +Lunar +Lunch +Lung +Lurch +Lure +Lurk +Lying +Lyric +Mace +Maker +Malt +Mama +Mango +Manor +Many +Map +March +Mardi +Marry +Mash +Match +Mate +Math +Moan +Mocha +Moist +Mold +Mom +Moody +Mop +Morse +Most +Motor +Motto +Mount +Mouse +Mousy +Mouth +Move +Movie +Mower +Mud +Mug +Mulch +Mule +Mull +Mumbo +Mummy +Mural +Muse +Music +Musky +Mute +Nacho +Nag +Nail +Name +Nanny +Nap +Navy +Near +Neat +Neon +Nerd +Nest +Net +Next +Niece +Ninth +Nutty +Oak +Oasis +Oat +Ocean +Oil +Old +Olive +Omen +Onion +Only +Ooze +Opal +Open +Opera +Opt +Otter +Ouch +Ounce +Outer +Oval +Oven +Owl +Ozone +Pace +Pagan +Pager +Palm +Panda +Panic +Pants +Panty +Paper +Park +Party +Pasta +Patch +Path +Patio +Payer +Pecan +Penny +Pep +Perch +Perky +Perm +Pest +Petal +Petri +Petty +Photo +Plank +Plant +Plaza +Plead +Plot +Plow +Pluck +Plug +Plus +Poach +Pod +Poem +Poet +Pogo +Point +Poise +Poker +Polar +Polio +Polka +Polo +Pond +Pony +Poppy +Pork +Poser +Pouch +Pound +Pout +Power +Prank +Press +Print +Prior +Prism +Prize +Probe +Prong +Proof +Props +Prude +Prune +Pry +Pug +Pull +Pulp +Pulse +Puma +Punch +Punk +Pupil +Puppy +Purr +Purse +Push +Putt +Quack +Quake +Query +Quiet +Quill +Quilt +Quit +Quota +Quote +Rabid +Race +Rack +Radar +Radio +Raft +Rage +Raid +Rail +Rake +Rally +Ramp +Ranch +Range +Rank +Rant +Rash +Raven +Reach +React +Ream +Rebel +Recap +Relax +Relay +Relic +Remix +Repay +Repel +Reply +Rerun +Reset +Rhyme +Rice +Rich +Ride +Rigid +Rigor +Rinse +Riot +Ripen +Rise +Risk +Ritzy +Rival +River +Roast +Robe +Robin +Rock +Rogue +Roman +Romp +Rope +Rover +Royal +Ruby +Rug +Ruin +Rule +Runny +Rush +Rust +Rut +Sadly +Sage +Said +Saint +Salad +Salon +Salsa +Salt +Same +Sandy +Santa +Satin +Sauna +Saved +Savor +Sax +Say +Scale +Scam +Scan +Scare +Scarf +Scary +Scoff +Scold +Scoop +Scoot +Scope +Score +Scorn +Scout +Scowl +Scrap +Scrub +Scuba +Scuff +Sect +Sedan +Self +Send +Sepia +Serve +Set +Seven +Shack +Shade +Shady +Shaft +Shaky +Sham +Shape +Share +Sharp +Shed +Sheep +Sheet +Shelf +Shell +Shine +Shiny +Ship +Shirt +Shock +Shop +Shore +Shout +Shove +Shown +Showy +Shred +Shrug +Shun +Shush +Shut +Shy +Sift +Silk +Silly +Silo +Sip +Siren +Sixth +Size +Skate +Skew +Skid +Skier +Skies +Skip +Skirt +Skit +Sky +Slab +Slack +Slain +Slam +Slang +Slash +Slate +Slaw +Sled +Sleek +Sleep +Sleet +Slept +Slice +Slick +Slimy +Sling +Slip +Slit +Slob +Slot +Slug +Slum +Slurp +Slush +Small +Smash +Smell +Smile +Smirk +Smog +Snack +Snap +Snare +Snarl +Sneak +Sneer +Sniff +Snore +Snort +Snout +Snowy +Snub +Snuff +Speak +Speed +Spend +Spent +Spew +Spied +Spill +Spiny +Spoil +Spoke +Spoof +Spool +Spoon +Sport +Spot +Spout +Spray +Spree +Spur +Squad +Squat +Squid +Stack +Staff +Stage +Stain +Stall +Stamp +Stand +Stank +Stark +Start +Stash +State +Stays +Steam +Steep +Stem +Step +Stew +Stick +Sting +Stir +Stock +Stole +Stomp +Stony +Stood +Stool +Stoop +Stop +Storm +Stout +Stove +Straw +Stray +Strut +Stuck +Stud +Stuff +Stump +Stung +Stunt +Suds +Sugar +Sulk +Surf +Sushi +Swab +Swan +Swarm +Sway +Swear +Sweat +Sweep +Swell +Swept +Swim +Swing +Swipe +Swirl +Swoop +Swore +Syrup +Tacky +Taco +Tag +Take +Tall +Talon +Tamer +Tank +Taper +Taps +Tarot +Tart +Task +Taste +Tasty +Taunt +Thank +Thaw +Theft +Theme +Thigh +Thing +Think +Thong +Thorn +Those +Throb +Thud +Thumb +Thump +Thus +Tiara +Tidal +Tidy +Tiger +Tile +Tilt +Tint +Tiny +Trace +Track +Trade +Train +Trait +Trap +Trash +Tray +Treat +Tree +Trek +Trend +Trial +Tribe +Trick +Trio +Trout +Truce +Truck +Trump +Trunk +Try +Tug +Tulip +Tummy +Turf +Tusk +Tutor +Tutu +Tux +Tweak +Tweet +Twice +Twine +Twins +Twirl +Twist +Uncle +Uncut +Undo +Unify +Union +Unit +Untie +Upon +Upper +Urban +Used +User +Usher +Utter +Value +Vapor +Vegan +Venue +Verse +Vest +Veto +Vice +Video +View +Viral +Virus +Visa +Visor +Vixen +Vocal +Voice +Void +Volt +Voter +Vowel +Wad +Wafer +Wager +Wages +Wagon +Wake +Walk +Wand +Wasp +Watch +Water +Wavy +Wheat +Whiff +Whole +Whoop +Wick +Widen +Widow +Width +Wife +Wifi +Wilt +Wimp +Wind +Wing +Wink +Wipe +Wired +Wiry +Wise +Wish +Wispy +Wok +Wolf +Womb +Wool +Woozy +Word +Work +Worry +Wound +Woven +Wrath +Wreck +Wrist +Xerox +Yahoo +Yam +Yard +Year +Yeast +Yelp +Yield +Yoyo +Yodel +Yoga +Yoyo +Yummy +Zebra +Zero +Zesty +Zippy +Zone +Zoom""".split('\n').toHashSet() + +} \ No newline at end of file