world portal: autogenerating returning portal

This commit is contained in:
minjaesong
2024-01-31 23:18:12 +09:00
parent 62d30fb6e9
commit 55bb33b4ce
6 changed files with 60 additions and 15 deletions

View File

@@ -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<ActorID>,
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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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
}