diff --git a/src/net/torvald/terrarum/modulebasegame/TerrarumIngame.kt b/src/net/torvald/terrarum/modulebasegame/TerrarumIngame.kt index 2d0848acc..2c3de822f 100644 --- a/src/net/torvald/terrarum/modulebasegame/TerrarumIngame.kt +++ b/src/net/torvald/terrarum/modulebasegame/TerrarumIngame.kt @@ -322,16 +322,18 @@ open class TerrarumIngame(batch: FlippingSpriteBatch) : IngameInstance(batch) { } data class NewGameParams( - val player: IngamePlayer, - val newWorldParams: NewWorldParameters + val player: IngamePlayer, + val newWorldParams: NewWorldParameters, + val callbackAfterLoad: (TerrarumIngame) -> Unit + ) data class NewWorldParameters( - val width: Int, - val height: Int, - val worldGenSeed: Long, - val savegameName: String - // other worldgen options + val width: Int, + val height: Int, + val worldGenSeed: Long, + val savegameName: String + // other worldgen options ) { init { if (width % LandUtil.CHUNK_W != 0 || height % LandUtil.CHUNK_H != 0) { @@ -353,10 +355,11 @@ open class TerrarumIngame(batch: FlippingSpriteBatch) : IngameInstance(batch) { val actors: List, val player: IngamePlayer, val worldGenver: Long, - val playerGenver: Long + val playerGenver: Long, + val callbackAfterLoad: (TerrarumIngame) -> Unit ) - + private var loadCallback: ((TerrarumIngame) -> Unit)? = null /** * Init instance by loading saved world @@ -378,6 +381,8 @@ open class TerrarumIngame(batch: FlippingSpriteBatch) : IngameInstance(batch) { // feed info to the worldgen Worldgen.attachMap(world, WorldgenParams(world.generatorSeed)) } + + loadCallback = codices.callbackAfterLoad } /** Load rest of the game with GL context */ @@ -547,6 +552,8 @@ open class TerrarumIngame(batch: FlippingSpriteBatch) : IngameInstance(batch) { } KeyToggler.forceSet(Input.Keys.Q, false) + + loadCallback = newGameParams.callbackAfterLoad } val ingameController = IngameController(this) @@ -666,6 +673,16 @@ open class TerrarumIngame(batch: FlippingSpriteBatch) : IngameInstance(batch) { KeyToggler.forceSet(Input.Keys.F2, false) + + if (loadCallback != null) { + try { + loadCallback!!(this) + } + catch (e: Throwable) { + e.printStackTrace() + } + loadCallback = null + } }// END enter diff --git a/src/net/torvald/terrarum/modulebasegame/gameactors/FixtureWorldPortal.kt b/src/net/torvald/terrarum/modulebasegame/gameactors/FixtureWorldPortal.kt index e3263c65c..0c7d69513 100644 --- a/src/net/torvald/terrarum/modulebasegame/gameactors/FixtureWorldPortal.kt +++ b/src/net/torvald/terrarum/modulebasegame/gameactors/FixtureWorldPortal.kt @@ -4,6 +4,7 @@ import com.badlogic.gdx.graphics.g2d.SpriteBatch import net.torvald.spriteanimation.SheetSpriteAnimation import net.torvald.terrarum.* import net.torvald.terrarum.App.printdbg +import net.torvald.terrarum.blockproperties.Block import net.torvald.terrarum.gameactors.AVKey import net.torvald.terrarum.langpack.Lang import net.torvald.terrarum.modulebasegame.FancyWorldgenLoadScreen @@ -19,6 +20,10 @@ import net.torvald.terrarumsansbitmap.gdx.TextureRegionPack */ class FixtureWorldPortal : Electric { + companion object { + const val ITEMID = "item@basegame:320" + } + constructor() : super( BlockBox(BlockBox.NO_COLLISION, 5, 2), nameFun = { Lang["ITEM_WORLD_PORTAL"] }, @@ -85,7 +90,29 @@ class FixtureWorldPortal : Electric { printdbg(this, "generate for teleportation! Size=${wx}x${wy}, Name=$name, Seed=$seed") val ingame = TerrarumIngame(App.batch) - val worldParam = TerrarumIngame.NewGameParams(player, it.worldLoadParam) + val worldParam = TerrarumIngame.NewGameParams(player, it.worldLoadParam) { ingame -> + val world = ingame.world + + // flatten terrain + for (x in world.spawnX - 2..world.spawnX + 2) { + // clear ceiling + for (y in world.spawnY - 2..world.spawnY - 1) { + world.setTileTerrain(x, y, Block.AIR, true) + } + // fill bottom + for (y in world.spawnY..world.spawnY + 2) { + if (!BlockCodex[world.getTileFromTerrain(x, y)].isSolid) { + world.setTileTerrain(x, y, Block.DIRT, true) + } + } + } + + // spawn a world portal + printdbg(this, "Portal new world callback; spawning portal at ${world.spawnX}, ${world.spawnY - 1}") + FixtureWorldPortal().spawn(world.spawnX, world.spawnY - 1, player.uuid) + printdbg(this, "Spawn complete") + + } ingame.gameLoadInfoPayload = worldParam ingame.gameLoadMode = TerrarumIngame.GameLoadMode.CREATE_NEW diff --git a/src/net/torvald/terrarum/modulebasegame/serialise/WriteSavegame.kt b/src/net/torvald/terrarum/modulebasegame/serialise/WriteSavegame.kt index 52cd0772c..792a9ce95 100644 --- a/src/net/torvald/terrarum/modulebasegame/serialise/WriteSavegame.kt +++ b/src/net/torvald/terrarum/modulebasegame/serialise/WriteSavegame.kt @@ -181,7 +181,7 @@ object LoadSavegame { val actors = world.actors.distinct() - val worldParam = TerrarumIngame.Codices(newIngame.worldDisk, world, actors, player, worldGenver, playerGenver) + val worldParam = TerrarumIngame.Codices(newIngame.worldDisk, world, actors, player, worldGenver, playerGenver) {} newIngame.gameLoadInfoPayload = worldParam diff --git a/src/net/torvald/terrarum/modulebasegame/ui/UINewWorld.kt b/src/net/torvald/terrarum/modulebasegame/ui/UINewWorld.kt index ad6d93b3b..6b0c22c63 100644 --- a/src/net/torvald/terrarum/modulebasegame/ui/UINewWorld.kt +++ b/src/net/torvald/terrarum/modulebasegame/ui/UINewWorld.kt @@ -183,7 +183,7 @@ class UINewWorld(val remoCon: UIRemoCon) : UICanvas() { player, TerrarumIngame.NewWorldParameters( wx, wy, seed, nameInput.getTextOrPlaceholder() ) - ) + ) {} ingame.gameLoadInfoPayload = worldParam ingame.gameLoadMode = TerrarumIngame.GameLoadMode.CREATE_NEW diff --git a/src/net/torvald/terrarum/modulebasegame/ui/UIProxyNewRandomGame.kt b/src/net/torvald/terrarum/modulebasegame/ui/UIProxyNewRandomGame.kt index 1571c3aa4..fcc512d1b 100644 --- a/src/net/torvald/terrarum/modulebasegame/ui/UIProxyNewRandomGame.kt +++ b/src/net/torvald/terrarum/modulebasegame/ui/UIProxyNewRandomGame.kt @@ -42,7 +42,7 @@ class UIProxyNewRandomGame(val remoCon: UIRemoCon) : UICanvas() { // PlayerBuilderTestSubject1(), PlayerBuilderWerebeastTest(), 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 65215cc16..cbdfefc6e 100644 --- a/src/net/torvald/terrarum/modulebasegame/worldgenerator/Worldgen.kt +++ b/src/net/torvald/terrarum/modulebasegame/worldgenerator/Worldgen.kt @@ -7,6 +7,7 @@ import com.sudoplay.joise.module.* import net.torvald.random.XXHash64 import net.torvald.terrarum.* import net.torvald.terrarum.App.* +import net.torvald.terrarum.blockproperties.Block import net.torvald.terrarum.gameitems.ItemID import net.torvald.terrarum.gameworld.BlockAddress import net.torvald.terrarum.gameworld.GameWorld @@ -198,8 +199,8 @@ object Worldgen { val y = posY val yUp = posY - 1 val tile = BlockCodex[world.getTileFromTerrain(x, y)] - val tileUp = BlockCodex[world.getTileFromTerrain(x, yUp)] - if (tile.isSolid && !tileUp.isSolid) + val tileUp = world.getTileFromTerrain(x, yUp) + if (tile.isSolid && tileUp == Block.AIR) flatness += 1 }