diff --git a/assets/mods/basegame/blocks/blocks.csv b/assets/mods/basegame/blocks/blocks.csv index c3e0f977a..a5e2fed0d 100644 --- a/assets/mods/basegame/blocks/blocks.csv +++ b/assets/mods/basegame/blocks/blocks.csv @@ -28,16 +28,16 @@ "51";"51";"51";"BLOCK_PLANK_ROSEWOOD";"0.1252";"0.1252";"0.1252";"0.1252";"17";"900";"WOOD";"1";"1";"N/A";"0";"0";"16";"0.0000";"0.0000";"0.0000";"0.0000";"N/A";"N/A";"0.0";"WOOD,NORANDTILE" # small punchable trees -"64";"64";"64";"BLOCK_TRUNK_NORMAL";"0.0312";"0.0312";"0.0312";"0.0312";"16";"740";"WOOD";"0";"0";"N/A";"0";"0";"16";"0.0000";"0.0000";"0.0000";"0.0000";"N/A";"N/A";"0.0";"TREE,TREESMALL,NATURAL" -"65";"65";"65";"BLOCK_TRUNK_EBONY";"0.0312";"0.0312";"0.0312";"0.0312";"19";"1200";"WOOD";"0";"0";"N/A";"0";"0";"16";"0.0000";"0.0000";"0.0000";"0.0000";"N/A";"N/A";"0.0";"TREE,TREESMALL,NATURAL" -"66";"66";"66";"BLOCK_TRUNK_BIRCH";"0.0312";"0.0312";"0.0312";"0.0312";"15";"670";"WOOD";"0";"0";"N/A";"0";"0";"16";"0.0000";"0.0000";"0.0000";"0.0000";"N/A";"N/A";"0.0";"TREE,TREESMALL,NATURAL" -"67";"67";"67";"BLOCK_TRUNK_ROSEWOOD";"0.0312";"0.0312";"0.0312";"0.0312";"17";"900";"WOOD";"0";"0";"N/A";"0";"0";"16";"0.0000";"0.0000";"0.0000";"0.0000";"N/A";"N/A";"0.0";"TREE,TREESMALL,NATURAL" +"64";"64";"64";"BLOCK_TRUNK_NORMAL";"0.0312";"0.0312";"0.0312";"0.0312";"16";"740";"WOOD";"0";"0";"N/A";"0";"0";"16";"0.0000";"0.0000";"0.0000";"0.0000";"N/A";"N/A";"0.0";"TREE,TREETRUNK,TREESMALL,NATURAL" +"65";"65";"65";"BLOCK_TRUNK_EBONY";"0.0312";"0.0312";"0.0312";"0.0312";"19";"1200";"WOOD";"0";"0";"N/A";"0";"0";"16";"0.0000";"0.0000";"0.0000";"0.0000";"N/A";"N/A";"0.0";"TREE,TREETRUNK,TREESMALL,NATURAL" +"66";"66";"66";"BLOCK_TRUNK_BIRCH";"0.0312";"0.0312";"0.0312";"0.0312";"15";"670";"WOOD";"0";"0";"N/A";"0";"0";"16";"0.0000";"0.0000";"0.0000";"0.0000";"N/A";"N/A";"0.0";"TREE,TREETRUNK,TREESMALL,NATURAL" +"67";"67";"67";"BLOCK_TRUNK_ROSEWOOD";"0.0312";"0.0312";"0.0312";"0.0312";"17";"900";"WOOD";"0";"0";"N/A";"0";"0";"16";"0.0000";"0.0000";"0.0000";"0.0000";"N/A";"N/A";"0.0";"TREE,TREETRUNK,TREESMALL,NATURAL" # large non-punchable trees -"72";"72";"72";"BLOCK_TRUNK_NORMAL";"0.0312";"0.0312";"0.0312";"0.0312";"16";"740";"WOOD";"0";"0";"N/A";"0";"0";"16";"0.0000";"0.0000";"0.0000";"0.0000";"N/A";"N/A";"0.0";"TREE,TREELARGE,NATURAL" -"73";"73";"73";"BLOCK_TRUNK_EBONY";"0.0312";"0.0312";"0.0312";"0.0312";"19";"1200";"WOOD";"0";"0";"N/A";"0";"0";"16";"0.0000";"0.0000";"0.0000";"0.0000";"N/A";"N/A";"0.0";"TREE,TREELARGE,NATURAL" -"74";"74";"74";"BLOCK_TRUNK_BIRCH";"0.0312";"0.0312";"0.0312";"0.0312";"15";"670";"WOOD";"0";"0";"N/A";"0";"0";"16";"0.0000";"0.0000";"0.0000";"0.0000";"N/A";"N/A";"0.0";"TREE,TREELARGE,NATURAL" -"75";"75";"75";"BLOCK_TRUNK_ROSEWOOD";"0.0312";"0.0312";"0.0312";"0.0312";"17";"900";"WOOD";"0";"0";"N/A";"0";"0";"16";"0.0000";"0.0000";"0.0000";"0.0000";"N/A";"N/A";"0.0";"TREE,TREELARGE,NATURAL" +"72";"72";"72";"BLOCK_TRUNK_NORMAL";"0.0312";"0.0312";"0.0312";"0.0312";"16";"740";"WOOD";"0";"0";"N/A";"0";"0";"16";"0.0000";"0.0000";"0.0000";"0.0000";"N/A";"N/A";"0.0";"TREE,TREETRUNK,TREELARGE,NATURAL" +"73";"73";"73";"BLOCK_TRUNK_EBONY";"0.0312";"0.0312";"0.0312";"0.0312";"19";"1200";"WOOD";"0";"0";"N/A";"0";"0";"16";"0.0000";"0.0000";"0.0000";"0.0000";"N/A";"N/A";"0.0";"TREE,TREETRUNK,TREELARGE,NATURAL" +"74";"74";"74";"BLOCK_TRUNK_BIRCH";"0.0312";"0.0312";"0.0312";"0.0312";"15";"670";"WOOD";"0";"0";"N/A";"0";"0";"16";"0.0000";"0.0000";"0.0000";"0.0000";"N/A";"N/A";"0.0";"TREE,TREETRUNK,TREELARGE,NATURAL" +"75";"75";"75";"BLOCK_TRUNK_ROSEWOOD";"0.0312";"0.0312";"0.0312";"0.0312";"17";"900";"WOOD";"0";"0";"N/A";"0";"0";"16";"0.0000";"0.0000";"0.0000";"0.0000";"N/A";"N/A";"0.0";"TREE,TREETRUNK,TREELARGE,NATURAL" # sabulous "80";"80";"80";"BLOCK_SAND";"0.1252";"0.1252";"0.1252";"0.1252";"24";"2400";"SAND";"1";"0";"0";"0";"4";"16";"0.0000";"0.0000";"0.0000";"0.0000";"N/A";"N/A";"0.06";"SAND,NATURAL,WARM" diff --git a/src/net/torvald/terrarum/modulebasegame/console/ExportMap.kt b/src/net/torvald/terrarum/modulebasegame/console/ExportMap.kt index a70fcdc34..f67763319 100644 --- a/src/net/torvald/terrarum/modulebasegame/console/ExportMap.kt +++ b/src/net/torvald/terrarum/modulebasegame/console/ExportMap.kt @@ -53,7 +53,9 @@ internal object ExportMap : ConsoleCommand { val colFore = (App.tileMaker.terrainTileColourMap.get(terr) ?: throw NullPointerException("nullterr $terr")).toByteArray() val colWall = (App.tileMaker.terrainTileColourMap.get(wall) ?: throw NullPointerException("nullwall $wall")).cpy().mul(WALL_OVERLAY).toByteArray() - val colArray = if (ore != Block.AIR) colOre else if (BlockCodex[terr].isSolid) colFore else colWall + val terrProp = BlockCodex[terr] + + val colArray = if (ore != Block.AIR) colOre else if (terrProp.isSolid || terrProp.hasTag("TREE")) colFore else colWall for (i in 0..2) { diff --git a/src/net/torvald/terrarum/modulebasegame/worldgenerator/Treegen.kt b/src/net/torvald/terrarum/modulebasegame/worldgenerator/Treegen.kt index cbc200557..38745746d 100644 --- a/src/net/torvald/terrarum/modulebasegame/worldgenerator/Treegen.kt +++ b/src/net/torvald/terrarum/modulebasegame/worldgenerator/Treegen.kt @@ -46,40 +46,27 @@ class Treegen(world: GameWorld, seed: Long, params: TreegenParams, val biomeMap: private fun makeGrassMap(xs: IntProgression): Array> { - val STRIDE = 4 val r = Array>(xs.last - xs.first + 1) { emptyList() } for (x in xs) { val ys = ArrayList() - var y = 0 + var y = 1 + var tileUp = world.getTileFromTerrain(x, y - 1) + var tile = world.getTileFromTerrain(x, y) + var tileProp = BlockCodex[tile] while (y < 800) { - val tile = world.getTileFromTerrain(x, y) - val tileProp = BlockCodex[tile] - if (tileProp.hasAnyTagOf("ROCK", "STONE")) break - if (tile == Block.GRASS) { + if (tile == Block.GRASS && tileUp == Block.AIR) { ys.add(y) } - // if dirt was hit, climb back up until a grass is seen - else if (tile == Block.DIRT) { - var yi = 1 - var tile0 = world.getTileFromTerrain(x, y - yi) - var found = false - while (tile0 == Block.DIRT || yi < STRIDE) { - tile0 = world.getTileFromTerrain(x, y - yi) - if (tile0 == Block.GRASS) found = true - yi += 1 - } - // filter duplicates - if (found && (ys.isEmpty() || ys.last() != y - yi)) { - ys.add(y - yi) - } - } + y += 1 - y += STRIDE + tileUp = tile + tile = world.getTileFromTerrain(x, y) + tileProp = BlockCodex[tile] } r[x - xs.first] = ys @@ -98,7 +85,7 @@ class Treegen(world: GameWorld, seed: Long, params: TreegenParams, val biomeMap: val grad2 = yRight - y if ((grad1 * grad2).absoluteValue <= 1) { - printdbg(this, "Trying to plant tree at $x, $y") +// printdbg(this, "Trying to plant tree at $x, $y") val rnd = Math.random() val biome = biomeMap[LandUtil.getBlockAddr(world, x, y)] ?: 0 @@ -123,10 +110,14 @@ class Treegen(world: GameWorld, seed: Long, params: TreegenParams, val biomeMap: var growCnt = 1 if (size == 1) { - var heightSum = 5+3+2+1 + var heightSum = 5+3+2 // check for minimum height - if ((1..heightSum).any { BlockCodex[world.getTileFromTerrain(x, y - it)].isSolid }) { - printdbg(this, "Ceiling not tall enough, aborting") + val chkM1 = (2..heightSum).any { BlockCodex[world.getTileFromTerrain(x, y - it)].isSolid } + val chk0 = (1..heightSum).any { BlockCodex[world.getTileFromTerrain(x, y - it)].isSolid } + val chkP1 = (2..heightSum).any { BlockCodex[world.getTileFromTerrain(x, y - it)].isSolid } + + if (chkM1 || chk0 || chkP1) { + printdbg(this, "Ceiling not tall enough at $x, $y, aborting") return } @@ -141,38 +132,53 @@ class Treegen(world: GameWorld, seed: Long, params: TreegenParams, val biomeMap: // } // while ((1..heightSum).none { BlockCodex[world.getTileFromTerrain(x, y - it)].isSolid }) - printdbg(this, "Planting tree; params: $stem, $bulb1, $bulb2, $bulb3") + printdbg(this, "Planting tree at $x, $y; params: $stem, $bulb1, $bulb2, $bulb3") // trunk for (i in 0 until stem) { for (xi in -1..+1) { - world.setTileTerrain(x + xi, y - growCnt, if (xi == 0) trunk else Block.AIR, true) + if (xi != 0) { + val tileHere = world.getTileFromTerrain(x + xi, y - growCnt) + if (BlockCodex[tileHere].hasTag("TREETRUNK")) + world.setTileTerrain(x + xi, y - growCnt, Block.AIR, true) + } + else { + world.setTileTerrain(x + xi, y - growCnt, trunk, true) + } } growCnt += 1 } // bulb base for (x in x-2..x+2) { - world.setTileTerrain(x, y - growCnt, foliage, true) + val tileHere = world.getTileFromTerrain(x, y - growCnt) + if (BlockCodex[tileHere].hasTag("INCONSEQUENTIAL")) + world.setTileTerrain(x, y - growCnt, foliage, true) } growCnt += 1 // bulb 1 for (i in 0 until bulb1) { for (x in x-3..x+3) { - world.setTileTerrain(x, y - growCnt, foliage, true) + val tileHere = world.getTileFromTerrain(x, y - growCnt) + if (BlockCodex[tileHere].hasTag("INCONSEQUENTIAL")) + world.setTileTerrain(x, y - growCnt, foliage, true) } growCnt += 1 } // bulb 2 for (i in 0 until bulb2) { for (x in x-2..x+2) { - world.setTileTerrain(x, y - growCnt, foliage, true) + val tileHere = world.getTileFromTerrain(x, y - growCnt) + if (BlockCodex[tileHere].hasTag("INCONSEQUENTIAL")) + world.setTileTerrain(x, y - growCnt, foliage, true) } growCnt += 1 } // bulb 3 for (i in 0 until bulb3) { for (x in x-1..x+1) { - world.setTileTerrain(x, y - growCnt, foliage, true) + val tileHere = world.getTileFromTerrain(x, y - growCnt) + if (BlockCodex[tileHere].hasTag("INCONSEQUENTIAL")) + world.setTileTerrain(x, y - growCnt, foliage, true) } growCnt += 1 } diff --git a/src/net/torvald/terrarum/worlddrawer/BlocksDrawer.kt b/src/net/torvald/terrarum/worlddrawer/BlocksDrawer.kt index f32ec9a77..0a1736f86 100644 --- a/src/net/torvald/terrarum/worlddrawer/BlocksDrawer.kt +++ b/src/net/torvald/terrarum/worlddrawer/BlocksDrawer.kt @@ -906,7 +906,7 @@ internal object BlocksDrawer { fun isPlatform(b: ItemID) = App.tileMaker.getRenderTag(b).connectionType == CreateTileAtlas.RenderTag.CONNECT_WALL_STICKER_CONNECT_SELF //fun isBlendMul(b: Int) = TILES_BLEND_MUL.contains(b) fun isTreeFoliage(b: ItemID) = BlockCodex[b].hasAllTagOf("TREE", "LEAVES") - fun isTreeTrunk(b: ItemID) = BlockCodex[b].let { it.hasTag("TREE") && !it.hasTag("LEAVES") } + fun isTreeTrunk(b: ItemID) = BlockCodex[b].hasAllTagOf("TREE", "TREETRUNK") fun tileInCamera(x: Int, y: Int) = x >= WorldCamera.x.div(TILE_SIZE) && y >= WorldCamera.y.div(TILE_SIZE) &&