diff --git a/src/net/torvald/terrarum/gameworld/GameWorld.kt b/src/net/torvald/terrarum/gameworld/GameWorld.kt index 99486f9a3..2f869a999 100644 --- a/src/net/torvald/terrarum/gameworld/GameWorld.kt +++ b/src/net/torvald/terrarum/gameworld/GameWorld.kt @@ -8,7 +8,6 @@ import net.torvald.terrarum.serialise.ReadLayerDataLzma import org.dyn4j.geometry.Vector2 typealias BlockAddress = Long -typealias BlockDamage = Float open class GameWorld { @@ -42,8 +41,10 @@ open class GameWorld { /** Tilewise spawn point */ var spawnY: Int - val wallDamages: HashMap - val terrainDamages: HashMap + val wallDamages: HashMap + val terrainDamages: HashMap + val fluidTypes: HashMap + val fluidFills: HashMap //public World physWorld = new World( new Vec2(0, -Terrarum.game.gravitationalAccel) ); //physics @@ -74,8 +75,10 @@ open class GameWorld { layerTerrainLowBits = PairedMapLayer(width, height) layerWallLowBits = PairedMapLayer(width, height) - wallDamages = HashMap() - terrainDamages = HashMap() + wallDamages = HashMap() + terrainDamages = HashMap() + fluidTypes = HashMap() + fluidFills = HashMap() // temperature layer: 2x2 is one cell //layerThermal = MapLayerHalfFloat(width, height, averageTemperature) @@ -100,6 +103,8 @@ open class GameWorld { wallDamages = layerData.wallDamages terrainDamages = layerData.terrainDamages + fluidTypes = layerData.fluidTypes + fluidFills = layerData.fluidFills spawnX = layerData.spawnX spawnY = layerData.spawnY diff --git a/src/net/torvald/terrarum/serialise/ReadLayerDataLzma.kt b/src/net/torvald/terrarum/serialise/ReadLayerDataLzma.kt index 343f96d05..d1cace49e 100644 --- a/src/net/torvald/terrarum/serialise/ReadLayerDataLzma.kt +++ b/src/net/torvald/terrarum/serialise/ReadLayerDataLzma.kt @@ -3,7 +3,6 @@ package net.torvald.terrarum.serialise import com.badlogic.gdx.utils.compression.Lzma import net.torvald.terrarum.AppLoader.printdbg import net.torvald.terrarum.gameworld.BlockAddress -import net.torvald.terrarum.gameworld.BlockDamage import net.torvald.terrarum.gameworld.MapLayer import net.torvald.terrarum.gameworld.PairedMapLayer import net.torvald.terrarum.realestate.LandUtil @@ -155,8 +154,10 @@ internal object ReadLayerDataLzma { val spawnPoint = LandUtil.resolveBlockAddr(width, spawnAddress) - val terrainDamages = HashMap() - val wallDamages = HashMap() + val terrainDamages = HashMap() + val wallDamages = HashMap() + val fluidTypes = HashMap() + val fluidFills = HashMap() // parse terrain damages for (c in 0 until payloadBytes["TdMG"]!!.size step 10) { @@ -179,6 +180,9 @@ internal object ReadLayerDataLzma { wallDamages[tileAddr.toLittleInt48()] = value.toLittleFloat() } + + // TODO parse fluid(Types|Fills) + return LayerData( MapLayer(width, height, payloadBytes["WALL_MSB"]!!), @@ -189,7 +193,7 @@ internal object ReadLayerDataLzma { spawnPoint.first, spawnPoint.second, - wallDamages, terrainDamages + wallDamages, terrainDamages, fluidTypes, fluidFills ) } @@ -209,8 +213,10 @@ internal object ReadLayerDataLzma { val spawnX: Int, val spawnY: Int, - val wallDamages: HashMap, - val terrainDamages: HashMap + val wallDamages: HashMap, + val terrainDamages: HashMap, + val fluidTypes: HashMap, + val fluidFills: HashMap ) private fun ByteArray.shiftLeftBy(size: Int, fill: Byte = 0.toByte()) { diff --git a/src/net/torvald/terrarum/worlddrawer/LightmapRendererNew.kt b/src/net/torvald/terrarum/worlddrawer/LightmapRendererNew.kt index dafdd42ee..d1be611f4 100644 --- a/src/net/torvald/terrarum/worlddrawer/LightmapRendererNew.kt +++ b/src/net/torvald/terrarum/worlddrawer/LightmapRendererNew.kt @@ -188,13 +188,13 @@ object LightmapRenderer { /** * Updating order: - * +--------+ +--+-----+ +-----+--+ +--------+ - + * ,--------. ,--+-----. ,-----+--. ,--------. - * |↘ | | | 3| |3 | | | ↙| ↕︎ overscan_open / overscan_opaque * | +-----+ | | 2 | | 2 | | +-----+ | - depending on the noop_mask * | |1 | → | |1 | → | 1| | → | 1| | * | | 2 | | +-----+ +-----+ | | 2 | | * | | 3| |↗ | | ↖| |3 | | - * +--+-----+ +--------+ +--------+ +-----+--+ + * `--+-----' `--------' `--------' `-----+--' * round: 1 2 3 4 * for all lightmap[y][x] */ diff --git a/work_files/GameDesign/FLUID_SIMULATION.md b/work_files/GameDesign/FLUID_SIMULATION.md new file mode 100644 index 000000000..199ea350f --- /dev/null +++ b/work_files/GameDesign/FLUID_SIMULATION.md @@ -0,0 +1,12 @@ +#### Before we begin, please read following articles: + +- Celluar Automata https://w-shadow.com/blog/2009/09/01/simple-fluid-simulation/ +- Pressure sim in DF http://www.gamasutra.com/view/feature/131954/interview_the_making_of_dwarf_.php + +### Serialisation +- FluidType: Hashed list of BlockAddress, Int +- FluidFill: Hashed list of BlockAddress, Float32 + +### Notes +- By doing this, you don’t need 16 blocks to represent a water; you only need 1 block for all kinds of fluids +- Storing the overfill (treat water as compressible) is important, will work as a temporary storage until the overfill is resolved, and rim of the update area will always be overfilled before they get updated