diff --git a/src/net/torvald/terrarum/gameworld/GameWorld.kt b/src/net/torvald/terrarum/gameworld/GameWorld.kt index 42f2fcf1e..bddc223b0 100644 --- a/src/net/torvald/terrarum/gameworld/GameWorld.kt +++ b/src/net/torvald/terrarum/gameworld/GameWorld.kt @@ -85,6 +85,12 @@ open class GameWorld( //layers @Transient lateinit open var layerWall: BlockLayer @Transient lateinit open var layerTerrain: BlockLayer + val layerOres = HashedOres() // damage to the block follows `terrainDamages` + val wallDamages = HashArray() + val terrainDamages = HashArray() + val layerFluids = HashedFluidTypeAndFills(); + + //val layerThermal: MapLayerHalfFloat // in Kelvins //val layerFluidPressure: MapLayerHalfFloat // (milibar - 1000) @@ -102,10 +108,7 @@ open class GameWorld( } var portalPoint: Point2i? = null - val wallDamages = HashArray() - val terrainDamages = HashArray() - val fluidTypes = HashedFluidType() - val fluidFills = HashArray() + /** * Single block can have multiple conduits, different types of conduits are stored separately. @@ -358,8 +361,7 @@ open class GameWorld( terrainDamages.remove(blockAddr) if (BlockCodex[itemID].isSolid) { - fluidFills.remove(blockAddr) - fluidTypes.remove(blockAddr) + layerFluids.remove(blockAddr) } // fluid tiles-item should be modified so that they will also place fluid onto their respective map @@ -669,13 +671,10 @@ open class GameWorld( if (fill > WorldSimulator.FLUID_MIN_MASS) { //setTileTerrain(x, y, fluidTypeToBlock(fluidType)) - fluidFills[addr] = fill - fluidTypes[addr] = fluidType + layerFluids[addr] = Fill(fluidType, fill) } else { - fluidFills.remove(addr) - fluidTypes.remove(addr) - + layerFluids.remove(addr) } @@ -688,8 +687,8 @@ open class GameWorld( fun getFluid(x: Int, y: Int): FluidInfo { val addr = LandUtil.getBlockAddr(this, x, y) - val fill = fluidFills[addr] - val type = fluidTypes[addr] + val type = layerFluids[addr]?.item + val fill = layerFluids[addr]?.amount return if (type == null) FluidInfo(Fluid.NULL, 0f) else FluidInfo(type, fill!!) } diff --git a/src/net/torvald/terrarum/serialise/Common.kt b/src/net/torvald/terrarum/serialise/Common.kt index b67eb76e5..eff34fc29 100644 --- a/src/net/torvald/terrarum/serialise/Common.kt +++ b/src/net/torvald/terrarum/serialise/Common.kt @@ -4,6 +4,7 @@ import com.badlogic.gdx.utils.Json import com.badlogic.gdx.utils.JsonValue import com.badlogic.gdx.utils.JsonWriter import net.torvald.random.HQRNG +import net.torvald.terrarum.App.printdbg import net.torvald.terrarum.TerrarumAppConfiguration import net.torvald.terrarum.console.EchoError import net.torvald.terrarum.gameworld.BlockLayer @@ -265,6 +266,28 @@ object Common { return WeatherMixer.weatherDict[jsonData.asString()]!! } }) + // Fill + jsoner.setSerializer(Fill::class.java, object : Json.Serializer { + override fun write(json: Json, obj: Fill, knownType: Class<*>?) { + json.writeValue("${obj.item};${obj.amount}") + } + + override fun read(json: Json, jsonData: JsonValue, type: Class<*>?): Fill { + val csv = jsonData.asString().split(',') + return Fill(csv[0], csv[1].toFloat()) + } + }) + // OrePlacement + jsoner.setSerializer(OrePlacement::class.java, object : Json.Serializer { + override fun write(json: Json, obj: OrePlacement, knownType: Class<*>?) { + json.writeValue("${obj.item};${obj.tilePlacement}") + } + + override fun read(json: Json, jsonData: JsonValue, type: Class<*>?): OrePlacement { + val csv = jsonData.asString().split(',') + return OrePlacement(csv[0], csv[1].toInt()) + } + }) } diff --git a/src/net/torvald/terrarum/utils/HashArray.kt b/src/net/torvald/terrarum/utils/HashArray.kt index ea8fc7ace..bd667ac91 100644 --- a/src/net/torvald/terrarum/utils/HashArray.kt +++ b/src/net/torvald/terrarum/utils/HashArray.kt @@ -1,6 +1,8 @@ package net.torvald.terrarum.utils +import com.badlogic.gdx.utils.Json +import com.badlogic.gdx.utils.JsonValue import net.torvald.terrarum.gameactors.ActorValue import net.torvald.terrarum.gameitems.ItemID import net.torvald.terrarum.gameworld.BlockAddress @@ -17,7 +19,6 @@ class HashArray: HashMap() // primitives are working just fine tho // Oh for the fucks sake fuck you everyone; json shit won't work with generics class WiringGraphMap: HashMap() -class HashedFluidType: HashMap() class HashedWirings: HashMap() class HashedWiringGraph: HashMap() class MetaModuleCSVPair: HashMap() @@ -47,3 +48,15 @@ class PlayerLastStatus() { @JvmInline value class ZipCodedStr(val doc: String = "") { override fun toString() = doc } + +@Deprecated( + "Unused and only exists for the savegame compatibility", + ReplaceWith("HashedFluidTypeAndFills") +) class HashedFluidType: HashMap() + + +data class Fill(var item: ItemID, var amount: Float) +data class OrePlacement(var item: ItemID, var tilePlacement: Int) + +class HashedFluidTypeAndFills: HashMap() +class HashedOres: HashMap() \ No newline at end of file