From 0396b026fbc1c1b7f7d098d6663955e98d849adf Mon Sep 17 00:00:00 2001 From: minjaesong Date: Tue, 25 Jun 2019 23:30:22 +0900 Subject: [PATCH] fallable blocks actually falls --- assets/mods/basegame/blocks/blocks.csv | 3 ++ .../terrarum/blockproperties/BlockProp.kt | 2 +- .../gameworld/WorldSimulator.kt | 33 +++++++++++++++++++ 3 files changed, 37 insertions(+), 1 deletion(-) diff --git a/assets/mods/basegame/blocks/blocks.csv b/assets/mods/basegame/blocks/blocks.csv index 2b2265feb..8b5a74d46 100644 --- a/assets/mods/basegame/blocks/blocks.csv +++ b/assets/mods/basegame/blocks/blocks.csv @@ -141,6 +141,9 @@ # fv: vertical friction (boolean) # fr: horizontal friction. 0: frictionless, <16: slippery, 16: regular, >16: sticky # +# grav: Whether the block should fall through the empty space. N/A to not make it fall; +# 0 to fall immediately (e.g. Sand), nonzero to indicate that number of floating blocks can be supported (e.g. Scaffolding) +# # ## Illuminators ## # diff --git a/src/net/torvald/terrarum/blockproperties/BlockProp.kt b/src/net/torvald/terrarum/blockproperties/BlockProp.kt index f10df8f92..8665ad7d3 100644 --- a/src/net/torvald/terrarum/blockproperties/BlockProp.kt +++ b/src/net/torvald/terrarum/blockproperties/BlockProp.kt @@ -46,7 +46,7 @@ class BlockProp { var drop: Int = 0 - var maxSupport: Int? = null + var maxSupport: Int = -1 // couldn't use NULL at all... var friction: Int = 0 diff --git a/src/net/torvald/terrarum/modulebasegame/gameworld/WorldSimulator.kt b/src/net/torvald/terrarum/modulebasegame/gameworld/WorldSimulator.kt index 2d40cf69e..431f136f5 100644 --- a/src/net/torvald/terrarum/modulebasegame/gameworld/WorldSimulator.kt +++ b/src/net/torvald/terrarum/modulebasegame/gameworld/WorldSimulator.kt @@ -4,6 +4,7 @@ import com.badlogic.gdx.graphics.Color import net.torvald.aa.KDTree import net.torvald.terrarum.AppLoader import net.torvald.terrarum.Terrarum +import net.torvald.terrarum.blockproperties.Block import net.torvald.terrarum.blockproperties.BlockCodex import net.torvald.terrarum.blockproperties.Fluid import net.torvald.terrarum.gameactors.ActorWBMovable @@ -41,9 +42,13 @@ object WorldSimulator { // END OF FLUID-RELATED STUFFS + /** Top-left point */ var updateXFrom = 0 + /** Bottom-right point */ var updateXTo = 0 + /** Top-left point */ var updateYFrom = 0 + /** Bottom-right point */ var updateYTo = 0 val colourNone = Color(0x808080FF.toInt()) @@ -272,6 +277,34 @@ object WorldSimulator { } } }*/ + + // displace fallables (TODO implement blocks with fallable supports e.g. scaffolding) + // only displace SINGLE BOTTOMMOST block on single X-coord (this doesn't mean they must fall only one block) + // so that the "falling" should be visible to the end user + for (x in updateXFrom..updateXTo) { + var fallDownCounter = 0 + for (y in updateYTo downTo updateYFrom) { + val currentTile = world.getTileFromTerrain(x, y) + val prop = BlockCodex[currentTile] + val isSolid = prop.isSolid + val support = prop.maxSupport + val isFallable = support != -1 + + if (fallDownCounter != 0 && isFallable) { + // replace blocks + world.setTileTerrain(x, y, Block.AIR) + world.setTileTerrain(x, y + fallDownCounter, currentTile) + + break + } + else if (isSolid) { + fallDownCounter = 0 + } + else if (!isSolid && !isFallable) { + fallDownCounter += 1 + } + } + } }