diff --git a/src/net/torvald/terrarum/LoadScreenBase.kt b/src/net/torvald/terrarum/LoadScreenBase.kt index c2df6f03b..e2327e554 100644 --- a/src/net/torvald/terrarum/LoadScreenBase.kt +++ b/src/net/torvald/terrarum/LoadScreenBase.kt @@ -8,6 +8,7 @@ import net.torvald.terrarum.gamecontroller.TerrarumKeyboardEvent import net.torvald.terrarum.langpack.Lang import net.torvald.terrarum.modulebasegame.TerrarumIngame import net.torvald.util.CircularArray +import java.util.concurrent.atomic.AtomicLong open class LoadScreenBase : ScreenAdapter(), Disposable, TerrarumGamescreen { @@ -26,6 +27,8 @@ open class LoadScreenBase : ScreenAdapter(), Disposable, TerrarumGamescreen { var camera = OrthographicCamera(App.scr.wf, App.scr.hf) + var progress = AtomicLong(0L) // generic variable, interpretation will vary by the screen + override fun show() { messages.clear() doContextChange = false diff --git a/src/net/torvald/terrarum/modulebasegame/FancyWorldReadLoadScreen.kt b/src/net/torvald/terrarum/modulebasegame/FancyWorldReadLoadScreen.kt index 3a3704b76..84b3d2944 100644 --- a/src/net/torvald/terrarum/modulebasegame/FancyWorldReadLoadScreen.kt +++ b/src/net/torvald/terrarum/modulebasegame/FancyWorldReadLoadScreen.kt @@ -3,17 +3,19 @@ package net.torvald.terrarum.modulebasegame import com.badlogic.gdx.graphics.Color import com.badlogic.gdx.graphics.Texture import net.torvald.terrarum.* +import net.torvald.terrarum.App.printdbg import net.torvald.terrarum.gameworld.GameWorld import net.torvald.terrarum.realestate.LandUtil.CHUNK_W import net.torvald.terrarum.ui.Toolkit import net.torvald.terrarumsansbitmap.gdx.TextureRegionPack import kotlin.math.roundToInt +import kotlin.math.roundToLong import kotlin.math.sqrt /** * Created by minjaesong on 2023-10-30. */ -class FancyWorldReadLoadScreen(screenToBeLoaded: IngameInstance, private val worldwidth: Int, private val worldheight: Int, override var preLoadJob: (LoadScreenBase) -> Unit) : LoadScreenBase() { +open class FancyWorldReadLoadScreen(screenToBeLoaded: IngameInstance, private val worldwidth: Int, private val worldheight: Int, override var preLoadJob: (LoadScreenBase) -> Unit) : LoadScreenBase() { init { CommonResourcePool.addToLoadingList("basegame-gui-loadscrlayer01") { @@ -29,9 +31,6 @@ class FancyWorldReadLoadScreen(screenToBeLoaded: IngameInstance, private val wor override var screenToLoad: IngameInstance? = screenToBeLoaded - private val world: GameWorld // must use Getter, as the field WILL BE redefined by the TerrarumIngame.enterCreateNewWorld() ! - get() = screenToLoad!!.world - val ratio = worldwidth * sqrt(2.0 / (worldwidth.sqr() + worldheight.sqr())) // world size is always wider than tall val htilesCount = worldwidth / CHUNK_W @@ -58,8 +57,6 @@ class FancyWorldReadLoadScreen(screenToBeLoaded: IngameInstance, private val wor TextureRegionPack(it, visibleTileSize, imgYoff + previewHeight, gapSize, 0, xoff, 0) } - var chunksLoaded = 0 // only increments when all the chunks were loaded - override fun render(delta: Float) { gdxClearAndEnableBlend(.063f, .070f, .086f, 1f) @@ -69,7 +66,8 @@ class FancyWorldReadLoadScreen(screenToBeLoaded: IngameInstance, private val wor val previewY = (App.scr.height - previewHeight.times(1.5f)).div(2f).roundToFloat() Toolkit.drawBoxBorder(it, previewX.toInt()-1, previewY.toInt()-1, previewWidth+2, previewHeight+2) - drawTiles(it, getStage(), getProgress(), previewX, previewY - imgYoff) + val prog = progress.get() + drawTiles(it, getStage(prog), getProgress(prog), previewX, previewY - imgYoff) val text = messages.getHeadElem() ?: "" App.fontGame.draw(it, @@ -83,20 +81,38 @@ class FancyWorldReadLoadScreen(screenToBeLoaded: IngameInstance, private val wor super.render(delta) } - private fun getProgress(): Int { - return (chunksLoaded.toDouble() / vtilesCount).roundToInt() + protected open fun getProgress(progress: Long): Int { + return ((progress / 3.0) / vtilesCount).roundToInt() } - private fun getStage(): Int { + protected open fun getStage(progress: Long): Int { return 2 // fixed value for Read screen } - private fun drawTiles(batch: FlippingSpriteBatch, layerCount: Int, tileCount: Int, x: Float, y: Float) { + protected open fun drawTiles(batch: FlippingSpriteBatch, layerCount: Int, tileCount: Int, x: Float, y: Float) { for (layer in 0 until layerCount) { -// for (i in 0 until if (layer == layerCount - 1) tileCount else htilesCount) { for (i in 0 until tileCount) { batch.draw(tiles[layer].get(i, 0), x + i * tileSize, y) } } } -} \ No newline at end of file +} + +class FancyWorldgenLoadScreen(screenToBeLoaded: IngameInstance, private val worldwidth: Int, private val worldheight: Int) : FancyWorldReadLoadScreen(screenToBeLoaded, worldwidth, worldheight, {}) { + + override fun getProgress(progress: Long): Int { + return ((progress and 0xFFFFFF_FFFFFFL) / CHUNK_W).toInt() + } + + override fun getStage(progress: Long): Int { + return (progress ushr 48).toInt() + 1 + } + + override fun drawTiles(batch: FlippingSpriteBatch, layerCount: Int, tileCount: Int, x: Float, y: Float) { + for (layer in 0 until layerCount) { + for (i in 0 until if (layer == layerCount - 1) tileCount else htilesCount) { + batch.draw(tiles[layer].get(i, 0), x + i * tileSize, y) + } + } + } +} diff --git a/src/net/torvald/terrarum/modulebasegame/TerrarumIngame.kt b/src/net/torvald/terrarum/modulebasegame/TerrarumIngame.kt index 484d29366..eebfc300e 100644 --- a/src/net/torvald/terrarum/modulebasegame/TerrarumIngame.kt +++ b/src/net/torvald/terrarum/modulebasegame/TerrarumIngame.kt @@ -490,7 +490,7 @@ open class TerrarumIngame(batch: FlippingSpriteBatch) : IngameInstance(batch) { //WorldGenerator.SEED = worldParams.worldGenSeed //WorldGenerator.generateMap() Worldgen.attachMap(world, WorldgenParams(worldParams.worldGenSeed)) - Worldgen.generateMap() + Worldgen.generateMap(App.getLoadScreen()) historicalFigureIDBucket = ArrayList() diff --git a/src/net/torvald/terrarum/modulebasegame/gameactors/FixtureWorldPortal.kt b/src/net/torvald/terrarum/modulebasegame/gameactors/FixtureWorldPortal.kt index 7e9f53a1d..ffc55f77d 100644 --- a/src/net/torvald/terrarum/modulebasegame/gameactors/FixtureWorldPortal.kt +++ b/src/net/torvald/terrarum/modulebasegame/gameactors/FixtureWorldPortal.kt @@ -1,27 +1,18 @@ package net.torvald.terrarum.modulebasegame.gameactors import com.badlogic.gdx.graphics.g2d.SpriteBatch -import net.torvald.random.XXHash64 import net.torvald.spriteanimation.SheetSpriteAnimation import net.torvald.terrarum.* import net.torvald.terrarum.App.printdbg import net.torvald.terrarum.gameactors.AVKey import net.torvald.terrarum.langpack.Lang +import net.torvald.terrarum.modulebasegame.FancyWorldgenLoadScreen import net.torvald.terrarum.modulebasegame.TerrarumIngame -import net.torvald.terrarum.modulebasegame.WorldgenLoadScreen -import net.torvald.terrarum.modulebasegame.gameactors.FixtureInventory.Companion.CAPACITY_MODE_WEIGHT import net.torvald.terrarum.modulebasegame.gameitems.FixtureItemBase import net.torvald.terrarum.modulebasegame.serialise.LoadSavegame -import net.torvald.terrarum.modulebasegame.serialise.ReadActor -import net.torvald.terrarum.modulebasegame.ui.UILoadGovernor import net.torvald.terrarum.modulebasegame.ui.UIWorldPortal -import net.torvald.terrarum.savegame.ByteArray64Reader import net.torvald.terrarum.savegame.DiskSkimmer -import net.torvald.terrarum.savegame.VDFileID -import net.torvald.terrarum.serialise.Common import net.torvald.terrarumsansbitmap.gdx.TextureRegionPack -import org.dyn4j.geometry.Vector2 -import java.util.HashMap /** * Created by minjaesong on 2023-05-28. @@ -99,7 +90,7 @@ class FixtureWorldPortal : Electric { ingame.gameLoadMode = TerrarumIngame.GameLoadMode.CREATE_NEW Terrarum.setCurrentIngameInstance(ingame) - val loadScreen = WorldgenLoadScreen(ingame, wx, wy) + val loadScreen = FancyWorldgenLoadScreen(ingame, wx, wy) App.setLoadScreen(loadScreen) } } diff --git a/src/net/torvald/terrarum/modulebasegame/serialise/WriteSavegame.kt b/src/net/torvald/terrarum/modulebasegame/serialise/WriteSavegame.kt index e8b2ea7e2..d9807b63a 100644 --- a/src/net/torvald/terrarum/modulebasegame/serialise/WriteSavegame.kt +++ b/src/net/torvald/terrarum/modulebasegame/serialise/WriteSavegame.kt @@ -199,8 +199,8 @@ object LoadSavegame { val chunkXY = LandUtil.chunkNumToChunkXY(world, chunk.toInt()) ReadWorld.decodeChunkToLayer(chunkFile.getContent(), worldLayer[layer]!!, chunkXY.x, chunkXY.y) + loadscreen.progress.getAndAdd(1) } - it.chunksLoaded += 1 } loadscreen.addMessage("Updating Block Mappings...") diff --git a/src/net/torvald/terrarum/modulebasegame/ui/UINewWorld.kt b/src/net/torvald/terrarum/modulebasegame/ui/UINewWorld.kt index 5fadfc6b6..3ab0b73de 100644 --- a/src/net/torvald/terrarum/modulebasegame/ui/UINewWorld.kt +++ b/src/net/torvald/terrarum/modulebasegame/ui/UINewWorld.kt @@ -10,9 +10,9 @@ import net.torvald.random.XXHash64 import net.torvald.terrarum.* import net.torvald.terrarum.App.printdbg import net.torvald.terrarum.langpack.Lang +import net.torvald.terrarum.modulebasegame.FancyWorldgenLoadScreen import net.torvald.terrarum.modulebasegame.TerrarumIngame import net.torvald.terrarum.modulebasegame.TerrarumIngame.Companion.NEW_WORLD_SIZE -import net.torvald.terrarum.modulebasegame.WorldgenLoadScreen import net.torvald.terrarum.modulebasegame.gameactors.IngamePlayer import net.torvald.terrarum.modulebasegame.serialise.LoadSavegame import net.torvald.terrarum.savegame.ByteArray64Reader @@ -197,7 +197,7 @@ class UINewWorld(val remoCon: UIRemoCon) : UICanvas() { ingame.gameLoadMode = TerrarumIngame.GameLoadMode.CREATE_NEW Terrarum.setCurrentIngameInstance(ingame) - val loadScreen = WorldgenLoadScreen(ingame, wx, wy) + val loadScreen = FancyWorldgenLoadScreen(ingame, wx, wy) App.setLoadScreen(loadScreen) } else { diff --git a/src/net/torvald/terrarum/modulebasegame/ui/UIProxyNewRandomGame.kt b/src/net/torvald/terrarum/modulebasegame/ui/UIProxyNewRandomGame.kt index 604111137..78d540e53 100644 --- a/src/net/torvald/terrarum/modulebasegame/ui/UIProxyNewRandomGame.kt +++ b/src/net/torvald/terrarum/modulebasegame/ui/UIProxyNewRandomGame.kt @@ -1,6 +1,5 @@ package net.torvald.terrarum.modulebasegame.ui -import com.badlogic.gdx.graphics.Camera import com.badlogic.gdx.graphics.OrthographicCamera import com.badlogic.gdx.graphics.g2d.SpriteBatch import net.torvald.random.HQRNG @@ -8,9 +7,8 @@ import net.torvald.terrarum.App import net.torvald.terrarum.App.printdbg import net.torvald.terrarum.Second import net.torvald.terrarum.Terrarum +import net.torvald.terrarum.modulebasegame.FancyWorldgenLoadScreen import net.torvald.terrarum.modulebasegame.TerrarumIngame -import net.torvald.terrarum.modulebasegame.WorldgenLoadScreen -import net.torvald.terrarum.modulebasegame.gameactors.PlayerBuilderTestSubject1 import net.torvald.terrarum.modulebasegame.gameactors.PlayerBuilderWerebeastTest import net.torvald.terrarum.ui.UICanvas import net.torvald.terrarum.utils.RandomWordsName @@ -57,7 +55,7 @@ class UIProxyNewRandomGame(val remoCon: UIRemoCon) : UICanvas() { Terrarum.setCurrentIngameInstance(ingame) //LoadScreen.screenToLoad = ingame //AppLoader.setScreen(LoadScreen) - val loadScreen = WorldgenLoadScreen(ingame, worldParam.newWorldParams.width, worldParam.newWorldParams.height) + val loadScreen = FancyWorldgenLoadScreen(ingame, worldParam.newWorldParams.width, worldParam.newWorldParams.height) App.setLoadScreen(loadScreen) } diff --git a/src/net/torvald/terrarum/modulebasegame/ui/UIWorldPortalSearch.kt b/src/net/torvald/terrarum/modulebasegame/ui/UIWorldPortalSearch.kt index 051a017b9..4d437bed8 100644 --- a/src/net/torvald/terrarum/modulebasegame/ui/UIWorldPortalSearch.kt +++ b/src/net/torvald/terrarum/modulebasegame/ui/UIWorldPortalSearch.kt @@ -1,6 +1,5 @@ package net.torvald.terrarum.modulebasegame.ui -import com.badlogic.gdx.graphics.Camera import com.badlogic.gdx.graphics.Color import com.badlogic.gdx.graphics.OrthographicCamera import com.badlogic.gdx.graphics.Texture @@ -9,20 +8,13 @@ import com.badlogic.gdx.graphics.g2d.TextureRegion import net.torvald.random.HQRNG import net.torvald.random.XXHash64 import net.torvald.terrarum.* -import net.torvald.terrarum.gamecontroller.TerrarumKeyboardEvent import net.torvald.terrarum.langpack.Lang import net.torvald.terrarum.modulebasegame.TerrarumIngame -import net.torvald.terrarum.modulebasegame.WorldgenLoadScreen import net.torvald.terrarum.modulebasegame.gameactors.FixtureWorldPortal -import net.torvald.terrarum.modulebasegame.gameactors.IngamePlayer -import net.torvald.terrarum.modulebasegame.serialise.ReadActor import net.torvald.terrarum.modulebasegame.ui.UIInventoryFull.Companion.INVENTORY_CELLS_OFFSET_Y import net.torvald.terrarum.modulebasegame.worldgenerator.Worldgen import net.torvald.terrarum.realestate.LandUtil -import net.torvald.terrarum.savegame.ByteArray64Reader -import net.torvald.terrarum.savegame.VDFileID import net.torvald.terrarum.savegame.VirtualDisk -import net.torvald.terrarum.serialise.Common import net.torvald.terrarum.ui.* import net.torvald.terrarum.utils.RandomWordsName import kotlin.math.roundToInt diff --git a/src/net/torvald/terrarum/modulebasegame/worldgenerator/Biomegen.kt b/src/net/torvald/terrarum/modulebasegame/worldgenerator/Biomegen.kt index 2705e07bb..334864ef8 100644 --- a/src/net/torvald/terrarum/modulebasegame/worldgenerator/Biomegen.kt +++ b/src/net/torvald/terrarum/modulebasegame/worldgenerator/Biomegen.kt @@ -3,6 +3,7 @@ package net.torvald.terrarum.modulebasegame.worldgenerator import com.sudoplay.joise.Joise import com.sudoplay.joise.module.* import net.torvald.terrarum.App +import net.torvald.terrarum.LoadScreenBase import net.torvald.terrarum.blockproperties.Block import net.torvald.terrarum.concurrent.ThreadExecutor import net.torvald.terrarum.concurrent.sliceEvenly @@ -25,7 +26,9 @@ class Biomegen(world: GameWorld, seed: Long, params: Any) : Gen(world, seed, par private val YHEIGHT_MAGIC = 2800.0 / 3.0 private val YHEIGHT_DIVISOR = 2.0 / 7.0 - override fun getDone() { + override fun getDone(loadscreen: LoadScreenBase) { +// loadscreen.progress.set((loadscreen.progress.get() + 0x1_000000_000000L) and 0x7FFF_000000_000000L) + threadExecutor.renew() (0 until world.width).sliceEvenly(genSlices).map { xs -> threadExecutor.submit { diff --git a/src/net/torvald/terrarum/modulebasegame/worldgenerator/Oregen.kt b/src/net/torvald/terrarum/modulebasegame/worldgenerator/Oregen.kt index 02716b3bb..3a2c0a767 100644 --- a/src/net/torvald/terrarum/modulebasegame/worldgenerator/Oregen.kt +++ b/src/net/torvald/terrarum/modulebasegame/worldgenerator/Oregen.kt @@ -2,16 +2,13 @@ package net.torvald.terrarum.modulebasegame.worldgenerator import com.sudoplay.joise.Joise import com.sudoplay.joise.module.* -import net.torvald.terrarum.BlockCodex -import net.torvald.terrarum.Point2i +import net.torvald.terrarum.* import net.torvald.terrarum.blockproperties.Block import net.torvald.terrarum.concurrent.sliceEvenly import net.torvald.terrarum.gameworld.GameWorld import net.torvald.terrarum.modulebasegame.TerrarumIngame import net.torvald.terrarum.modulebasegame.worldgenerator.Terragen.Companion.YHEIGHT_DIVISOR import net.torvald.terrarum.modulebasegame.worldgenerator.Terragen.Companion.YHEIGHT_MAGIC -import net.torvald.terrarum.sqr -import net.torvald.terrarum.toInt import net.torvald.terrarum.utils.OrePlacement import net.torvald.terrarum.worlddrawer.BlocksDrawer import kotlin.math.cos @@ -27,7 +24,9 @@ class Oregen(world: GameWorld, private val caveAttenuateBiasScaled: ModuleScaleD private val threadExecutor = TerrarumIngame.worldgenThreadExecutor private val genSlices = max(threadExecutor.threadCount, world.width / 9) - override fun getDone() { + override fun getDone(loadscreen: LoadScreenBase) { + loadscreen.progress.set((loadscreen.progress.get() + 0x1_000000_000000L) and 0x7FFF_000000_000000L) + threadExecutor.renew() (0 until world.width).sliceEvenly(genSlices).mapIndexed { i, xs -> threadExecutor.submit { @@ -37,6 +36,7 @@ class Oregen(world: GameWorld, private val caveAttenuateBiasScaled: ModuleScaleD val sampleOffset = world.width / 8.0 draw(x, localJoise, sampleTheta, sampleOffset) } + loadscreen.progress.addAndGet((xs.last - xs.first + 1).toLong()) } } diff --git a/src/net/torvald/terrarum/modulebasegame/worldgenerator/OregenAutotiling.kt b/src/net/torvald/terrarum/modulebasegame/worldgenerator/OregenAutotiling.kt index 9ec41aab5..a75ad6172 100644 --- a/src/net/torvald/terrarum/modulebasegame/worldgenerator/OregenAutotiling.kt +++ b/src/net/torvald/terrarum/modulebasegame/worldgenerator/OregenAutotiling.kt @@ -1,6 +1,7 @@ package net.torvald.terrarum.modulebasegame.worldgenerator import net.torvald.random.XXHash64 +import net.torvald.terrarum.LoadScreenBase import net.torvald.terrarum.Point2i import net.torvald.terrarum.concurrent.sliceEvenly import net.torvald.terrarum.gameitems.ItemID @@ -22,7 +23,7 @@ class OregenAutotiling(world: GameWorld, seed: Long, val tilingModes: HashMap threadExecutor.submit { diff --git a/src/net/torvald/terrarum/modulebasegame/worldgenerator/Terragen.kt b/src/net/torvald/terrarum/modulebasegame/worldgenerator/Terragen.kt index cdad6b9f3..0fdb4042e 100644 --- a/src/net/torvald/terrarum/modulebasegame/worldgenerator/Terragen.kt +++ b/src/net/torvald/terrarum/modulebasegame/worldgenerator/Terragen.kt @@ -4,6 +4,7 @@ import com.sudoplay.joise.Joise import com.sudoplay.joise.module.* import net.torvald.random.XXHash32 import net.torvald.terrarum.App.printdbg +import net.torvald.terrarum.LoadScreenBase import net.torvald.terrarum.blockproperties.Block import net.torvald.terrarum.concurrent.sliceEvenly import net.torvald.terrarum.gameworld.GameWorld @@ -30,7 +31,9 @@ class Terragen(world: GameWorld, val highlandLowlandSelectCache: ModuleCache, se private val dirtStoneDitherSize = 3 // actual dither size will be double of this value private val stoneSlateDitherSize = 4 - override fun getDone() { + override fun getDone(loadscreen: LoadScreenBase) { + loadscreen.progress.set(0L) + threadExecutor.renew() (0 until world.width).sliceEvenly(genSlices).mapIndexed { i, xs -> threadExecutor.submit { @@ -40,6 +43,7 @@ class Terragen(world: GameWorld, val highlandLowlandSelectCache: ModuleCache, se val sampleOffset = world.width / 8.0 draw(x, localJoise, sampleTheta, sampleOffset) } + loadscreen.progress.addAndGet((xs.last - xs.first + 1).toLong()) } } diff --git a/src/net/torvald/terrarum/modulebasegame/worldgenerator/Worldgen.kt b/src/net/torvald/terrarum/modulebasegame/worldgenerator/Worldgen.kt index 0e2fd0572..0c11d63a5 100644 --- a/src/net/torvald/terrarum/modulebasegame/worldgenerator/Worldgen.kt +++ b/src/net/torvald/terrarum/modulebasegame/worldgenerator/Worldgen.kt @@ -5,6 +5,7 @@ import net.torvald.random.XXHash64 import net.torvald.terrarum.App import net.torvald.terrarum.App.* import net.torvald.terrarum.BlockCodex +import net.torvald.terrarum.LoadScreenBase import net.torvald.terrarum.gameitems.ItemID import net.torvald.terrarum.gameworld.GameWorld import kotlin.math.roundToLong @@ -58,7 +59,7 @@ object Worldgen { ).filter(tagFilter) } - fun generateMap() { + fun generateMap(loadscreen: LoadScreenBase) { highlandLowlandSelectCache = getHighlandLowlandSelectCache(params.terragenParams, params.seed) caveAttenuateBiasScaled = getCaveAttenuateBiasScaled(highlandLowlandSelectCache, params.terragenParams) @@ -71,7 +72,7 @@ object Worldgen { val it = jobs[i] App.getLoadScreen().addMessage(it.loadingScreenName) - it.theWork.getDone() + it.theWork.getDone(loadscreen) } // determine spawn point @@ -257,7 +258,7 @@ object Worldgen { } abstract class Gen(val world: GameWorld, val seed: Long, val params: Any? = null) { - open fun getDone() { } // trying to use different name so that it won't be confused with Runnable or Callable + open fun getDone(loadscreen: LoadScreenBase) { } // trying to use different name so that it won't be confused with Runnable or Callable } data class WorldgenParams(