newer terragen test wip

This commit is contained in:
minjaesong
2024-09-23 01:41:13 +09:00
parent e14c832028
commit a2dc001909
12 changed files with 525 additions and 18 deletions

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@@ -9,13 +9,17 @@
"19";"19";"19";"BLOCK_STONE_BRICKS";"0.1252";"0.1252";"0.1252";"0.1252";"48";"2400";"ROCK";"1";"1";"N/A";"0";"4";"16";"0.0000";"0.0000";"0.0000";"0.0000";"0.0";"STONE"
"20";"20";"20";"BLOCK_STONE_DEEP";"0.1252";"0.1252";"0.1252";"0.1252";"80";"2400";"ROCK";"1";"1";"N/A";"0";"4";"16";"0.0000";"0.0000";"0.0000";"0.0000";"0.0";"ROCK,NATURA,OREBEARING,DEEPROCK,BRICKROCK"
"21";"21";"21";"BLOCK_STONE_MARBLE";"0.1252";"0.1252";"0.1252";"0.1252";"48";"2400";"ROCK";"1";"1";"N/A";"0";"4";"16";"0.0000";"0.0000";"0.0000";"0.0000";"0.1";"ROCK,NATURAL,DEEPROCK"
"22";"22";"22";"BLOCK_BRICKS";"0.1252";"0.1252";"0.1252";"0.1252";"48";"2400";"BRCK";"1";"1";"N/A";"0";"4";"16";"0.0000";"0.0000";"0.0000";"0.0000";"0.1";"ROCK,NATURAL,DEEPROCK"
"22";"22";"22";"BLOCK_STONE_ORTHOCLASE";"0.1252";"0.1252";"0.1252";"0.1252";"48";"2400";"ROCK";"1";"1";"N/A";"0";"4";"16";"0.0000";"0.0000";"0.0000";"0.0000";"0.0";"ROCK,NATURAL,OREBEARING,SHALLOWROCK,BRICKROCK"
"23";"23";"23";"BLOCK_STONE";"0.1252";"0.1252";"0.1252";"0.1252";"48";"2400";"ROCK";"1";"1";"N/A";"0";"4";"16";"0.0000";"0.0000";"0.0000";"0.0000";"0.0";"ROCK,NATURAL,OREBEARING,SHALLOWROCK,BRICKROCK"
"24";"24";"24";"BLOCK_STONE";"0.1252";"0.1252";"0.1252";"0.1252";"48";"2400";"ROCK";"1";"1";"N/A";"0";"4";"16";"0.0000";"0.0000";"0.0000";"0.0000";"0.0";"ROCK,NATURAL,OREBEARING,SHALLOWROCK,BRICKROCK"
"25";"25";"25";"BLOCK_STONE_BASALT";"0.1252";"0.1252";"0.1252";"0.1252";"48";"2400";"ROCK";"1";"1";"N/A";"0";"4";"16";"0.0000";"0.0000";"0.0000";"0.0000";"0.0";"ROCK,NATURAL,OREBEARING,SHALLOWROCK,BRICKROCK"
# dirts
"32";"32";"32";"BLOCK_DIRT";"0.1252";"0.1252";"0.1252";"0.1252";"12";"1400";"DIRT";"1";"1";"N/A";"0";"4";"16";"0.0000";"0.0000";"0.0000";"0.0000";"0.0";"DIRT,NATURAL,CULTIVABLE"
"33";"32";"32";"BLOCK_GRASS";"0.1252";"0.1252";"0.1252";"0.1252";"12";"1400";"GRSS";"1";"0";"N/A";"0";"0";"16";"0.0000";"0.0000";"0.0000";"0.0000";"0.0";"GRASS,NATURAL,CULTIVABLE"
"34";"34";"34";"BLOCK_GRASSWALL";"0.1252";"0.1252";"0.1252";"0.1252";"12";"1400";"GRSS";"1";"1";"N/A";"0";"0";"16";"0.0000";"0.0000";"0.0000";"0.0000";"0.0";"GRASS,NATURAL"
"35";"item@basegame:25";"item@basegame:25";"BLOCK_CLAY";"0.1252";"0.1252";"0.1252";"0.1252";"12";"1700";"DIRT";"1";"1";"N/A";"0";"4";"16";"0.0000";"0.0000";"0.0000";"0.0000";"0.0";"DIRT,NATURAL"
"36";"36";"36";"BLOCK_BRICKS";"0.1252";"0.1252";"0.1252";"0.1252";"48";"2400";"BRCK";"1";"1";"N/A";"0";"4";"16";"0.0000";"0.0000";"0.0000";"0.0000";"0.1";"ROCK,NATURAL,DEEPROCK"
#"35";"35";"35";"BLOCK_FOLIAGE_GREEN";"0.1252";"0.1252";"0.1252";"0.1252";"12";"1400";"GRSS";"1";"1";"N/A";"0";"0";"16";"0.0000";"0.0000";"0.0000";"0.0000";"0.0";"GRASS,NATURAL"
#"36";"36";"36";"BLOCK_FOLIAGE_LIME";"0.1252";"0.1252";"0.1252";"0.1252";"12";"1400";"GRSS";"1";"1";"N/A";"0";"0";"16";"0.0000";"0.0000";"0.0000";"0.0000";"0.0";"GRASS,NATURAL"
#"37";"37";"37";"BLOCK_FOLIAGE_GOLD";"0.1252";"0.1252";"0.1252";"0.1252";"12";"1400";"GRSS";"1";"1";"N/A";"0";"0";"16";"0.0000";"0.0000";"0.0000";"0.0000";"0.0";"GRASS,NATURAL"
Can't render this file because it contains an unexpected character in line 19 and column 2.

View File

@@ -14,8 +14,8 @@
[1, 3, "$BRICKROCK"]
]
},
/* brocks */
"basegame:22": {
/* bricks */
"basegame:36": {
"workbench": "",
"ingredients": [
[1, 2, "item@basegame:56"]

View File

@@ -0,0 +1,439 @@
package com.sudoplay.joise.module
import com.sudoplay.joise.ModuleInstanceMap
import com.sudoplay.joise.ModuleMap
import com.sudoplay.joise.ModulePropertyMap
import java.util.*
/**
* Created by minjaesong on 2024-09-22.
*/
class TerrarumModuleCombiner : Module() {
enum class CombinerType {
ADD, MULT, MAX, MIN, AVG, VECTORISE
}
protected var sources: Array<ScalarParameter?> = arrayOfNulls(MAX_SOURCES)
protected var type: CombinerType? = null
fun ModuleCombiner(type: CombinerType?) {
this.type = type
}
fun ModuleCombiner() {
// serialization
}
fun setSource(index: Int, source: Module?) {
sources[index] = ScalarParameter(source)
}
fun setSource(index: Int, source: Double) {
sources[index] = ScalarParameter(source)
}
fun clearAllSources() {
for (i in 0 until MAX_SOURCES) {
sources[i] = null
}
}
/**
* Noise values from empty indices will be substituted with NaN
*/
fun getVectorise(x: Double, y: Double, z: Double): List<Double> {
return when (type) {
CombinerType.VECTORISE -> vectorGet(x, y, z)
else -> throw UnsupportedOperationException("Use get")
}
}
fun vectorGet(x: Double, y: Double, z: Double): List<Double> {
return sources.map { it?.get(x, y, z) ?: Double.NaN }
}
override fun get(x: Double, y: Double): Double {
return when (type) {
CombinerType.ADD -> addGet(x, y)
CombinerType.AVG -> avgGet(x, y)
CombinerType.MAX -> maxGet(x, y)
CombinerType.MIN -> minGet(x, y)
CombinerType.MULT -> multGet(x, y)
CombinerType.VECTORISE -> throw UnsupportedOperationException("Use getVector")
else -> 0.0
}
}
override fun get(x: Double, y: Double, z: Double): Double {
return when (type) {
CombinerType.ADD -> addGet(x, y, z)
CombinerType.AVG -> avgGet(x, y, z)
CombinerType.MAX -> maxGet(x, y, z)
CombinerType.MIN -> minGet(x, y, z)
CombinerType.MULT -> multGet(x, y, z)
CombinerType.VECTORISE -> throw UnsupportedOperationException("Use getVector")
else -> 0.0
}
}
override fun get(x: Double, y: Double, z: Double, w: Double): Double {
return when (type) {
CombinerType.ADD -> addGet(x, y, z, w)
CombinerType.AVG -> avgGet(x, y, z, w)
CombinerType.MAX -> maxGet(x, y, z, w)
CombinerType.MIN -> minGet(x, y, z, w)
CombinerType.MULT -> multGet(x, y, z, w)
CombinerType.VECTORISE -> throw UnsupportedOperationException("Use getVector")
else -> 0.0
}
}
override fun get(x: Double, y: Double, z: Double, w: Double, u: Double, v: Double): Double {
return when (type) {
CombinerType.ADD -> addGet(x, y, z, w, u, v)
CombinerType.AVG -> avgGet(x, y, z, w, u, v)
CombinerType.MAX -> maxGet(x, y, z, w, u, v)
CombinerType.MIN -> minGet(x, y, z, w, u, v)
CombinerType.MULT -> multGet(x, y, z, w, u, v)
CombinerType.VECTORISE -> throw UnsupportedOperationException("Use getVector")
else -> 0.0
}
}
// ==========================================================================
// = ADD
// ==========================================================================
protected fun addGet(x: Double, y: Double): Double {
var value = 0.0
for (i in 0 until MAX_SOURCES) {
if (sources[i] != null) value += sources[i]!![x, y]
}
return value
}
protected fun addGet(x: Double, y: Double, z: Double): Double {
var value = 0.0
for (i in 0 until MAX_SOURCES) {
if (sources[i] != null) value += sources[i]!![x, y, z]
}
return value
}
protected fun addGet(x: Double, y: Double, z: Double, w: Double): Double {
var value = 0.0
for (i in 0 until MAX_SOURCES) {
if (sources[i] != null) value += sources[i]!![x, y, z, w]
}
return value
}
protected fun addGet(
x: Double, y: Double, z: Double, w: Double, u: Double,
v: Double
): Double {
var value = 0.0
for (i in 0 until MAX_SOURCES) {
if (sources[i] != null) value += sources[i]!![x, y, z, w, u, v]
}
return value
}
// ==========================================================================
// = AVG
// ==========================================================================
protected fun avgGet(x: Double, y: Double): Double {
var count = 0
var value = 0.0
for (i in 0 until MAX_SOURCES) {
if (sources[i] != null) {
value += sources[i]!![x, y]
count++
}
}
if (count == 0) return 0.0
return value / count.toDouble()
}
protected fun avgGet(x: Double, y: Double, z: Double): Double {
var count = 0
var value = 0.0
for (i in 0 until MAX_SOURCES) {
if (sources[i] != null) {
value += sources[i]!![x, y, z]
count++
}
}
if (count == 0) return 0.0
return value / count.toDouble()
}
protected fun avgGet(x: Double, y: Double, z: Double, w: Double): Double {
var count = 0
var value = 0.0
for (i in 0 until MAX_SOURCES) {
if (sources[i] != null) {
value += sources[i]!![x, y, z, w]
count++
}
}
if (count == 0) return 0.0
return value / count.toDouble()
}
protected fun avgGet(
x: Double, y: Double, z: Double, w: Double, u: Double,
v: Double
): Double {
var count = 0
var value = 0.0
for (i in 0 until MAX_SOURCES) {
if (sources[i] != null) {
value += sources[i]!![x, y, z, w, u, v]
count++
}
}
if (count == 0) return 0.0
return value / count.toDouble()
}
// ==========================================================================
// = MAX
// ==========================================================================
protected fun maxGet(x: Double, y: Double): Double {
var mx: Double
var c = 0
while (c < MAX_SOURCES && sources[c] == null) {
c++
}
if (c == MAX_SOURCES) return 0.0
mx = sources[c]!![x, y]
for (d in c until MAX_SOURCES) {
if (sources[d] != null) {
val `val` = sources[d]!![x, y]
if (`val` > mx) mx = `val`
}
}
return mx
}
protected fun maxGet(x: Double, y: Double, z: Double): Double {
var mx: Double
var c = 0
while (c < MAX_SOURCES && sources[c] == null) {
c++
}
if (c == MAX_SOURCES) return 0.0
mx = sources[c]!![x, y, z]
for (d in c until MAX_SOURCES) {
if (sources[d] != null) {
val `val` = sources[d]!![x, y, z]
if (`val` > mx) mx = `val`
}
}
return mx
}
protected fun maxGet(x: Double, y: Double, z: Double, w: Double): Double {
var mx: Double
var c = 0
while (c < MAX_SOURCES && sources[c] == null) {
c++
}
if (c == MAX_SOURCES) return 0.0
mx = sources[c]!![x, y, z, w]
for (d in c until MAX_SOURCES) {
if (sources[d] != null) {
val `val` = sources[d]!![x, y, z, w]
if (`val` > mx) mx = `val`
}
}
return mx
}
protected fun maxGet(
x: Double, y: Double, z: Double, w: Double, u: Double,
v: Double
): Double {
var mx: Double
var c = 0
while (c < MAX_SOURCES && sources[c] == null) {
c++
}
if (c == MAX_SOURCES) return 0.0
mx = sources[c]!![x, y, z, w, u, v]
for (d in c until MAX_SOURCES) {
if (sources[d] != null) {
val `val` = sources[d]!![x, y, z, w, u, v]
if (`val` > mx) mx = `val`
}
}
return mx
}
// ==========================================================================
// = MIN
// ==========================================================================
protected fun minGet(x: Double, y: Double): Double {
var mn: Double
var c = 0
while (c < MAX_SOURCES && sources[c] == null) {
c++
}
if (c == MAX_SOURCES) return 0.0
mn = sources[c]!![x, y]
for (d in c until MAX_SOURCES) {
if (sources[d] != null) {
val `val` = sources[d]!![x, y]
if (`val` < mn) mn = `val`
}
}
return mn
}
protected fun minGet(x: Double, y: Double, z: Double): Double {
var mn: Double
var c = 0
while (c < MAX_SOURCES && sources[c] == null) {
c++
}
if (c == MAX_SOURCES) return 0.0
mn = sources[c]!![x, y, z]
for (d in c until MAX_SOURCES) {
if (sources[d] != null) {
val `val` = sources[d]!![x, y, z]
if (`val` < mn) mn = `val`
}
}
return mn
}
protected fun minGet(x: Double, y: Double, z: Double, w: Double): Double {
var mn: Double
var c = 0
while (c < MAX_SOURCES && sources[c] == null) {
c++
}
if (c == MAX_SOURCES) return 0.0
mn = sources[c]!![x, y, z, w]
for (d in c until MAX_SOURCES) {
if (sources[d] != null) {
val `val` = sources[d]!![x, y, z, w]
if (`val` < mn) mn = `val`
}
}
return mn
}
protected fun minGet(
x: Double, y: Double, z: Double, w: Double, u: Double,
v: Double
): Double {
var mn: Double
var c = 0
while (c < MAX_SOURCES && sources[c] == null) {
c++
}
if (c == MAX_SOURCES) return 0.0
mn = sources[c]!![x, y, z, w, u, v]
for (d in c until MAX_SOURCES) {
if (sources[d] != null) {
val `val` = sources[d]!![x, y, z, w, u, v]
if (`val` < mn) mn = `val`
}
}
return mn
}
// ==========================================================================
// = MULT
// ==========================================================================
protected fun multGet(x: Double, y: Double): Double {
var value = 1.0
for (i in 0 until MAX_SOURCES) {
if (sources[i] != null) value *= sources[i]!![x, y]
}
return value
}
protected fun multGet(x: Double, y: Double, z: Double): Double {
var value = 1.0
for (i in 0 until MAX_SOURCES) {
if (sources[i] != null) value *= sources[i]!![x, y, z]
}
return value
}
protected fun multGet(x: Double, y: Double, z: Double, w: Double): Double {
var value = 1.0
for (i in 0 until MAX_SOURCES) {
if (sources[i] != null) value *= sources[i]!![x, y, z, w]
}
return value
}
protected fun multGet(
x: Double, y: Double, z: Double, w: Double, u: Double,
v: Double
): Double {
var value = 1.0
for (i in 0 until MAX_SOURCES) {
if (sources[i] != null) value *= sources[i]!![x, y, z, w, u, v]
}
return value
}
override fun _writeToMap(map: ModuleMap) {
val props = ModulePropertyMap(this)
writeEnum("type", type, props)
for (i in 0 until MAX_SOURCES) {
writeScalar("source$i", sources[i], props, map)
}
map[id] = props
}
override fun buildFromPropertyMap(
props: ModulePropertyMap,
map: ModuleInstanceMap
): Module {
readEnum("type", "setType", CombinerType::class.java, props)
var name: String
var o: Any?
for (i in 0 until MAX_SOURCES) {
o = props["source$i"]
if (o != null) {
name = o.toString()
setSource(i, map[name])
}
}
return this
}
}

View File

@@ -12,8 +12,12 @@ object Block {
const val STONE_QUARRIED = "basegame:17"
const val STONE_TILE_WHITE = "basegame:18"
const val STONE_BRICKS = "basegame:19"
const val STONE_SLATE = "basegame:20"
const val STONE_GNEISS = "basegame:20"
const val STONE_MARBLE = "basegame:21"
const val STONE_ORTHOCLASE = "basegame:22"
const val STONE_PLAGIOCLASE = "basegame:23"
const val STONE_MICROCLINE = "basegame:24"
const val STONE_BASALT = "basegame:25"
const val DIRT = "basegame:32"
const val GRASS = "basegame:33"

View File

@@ -5,6 +5,7 @@ import com.sudoplay.joise.module.*
import net.torvald.random.HQRNG
import net.torvald.terrarum.LoadScreenBase
import net.torvald.terrarum.blockproperties.Block
import net.torvald.terrarum.gameitems.ItemID
import net.torvald.terrarum.gameworld.GameWorld
import net.torvald.terrarum.modulebasegame.worldgenerator.Worldgen.getClampedHeight
import net.torvald.terrarum.realestate.LandUtil.CHUNK_H
@@ -34,7 +35,7 @@ class Terragen(world: GameWorld, isFinal: Boolean, val groundScalingCached: Modu
private val groundDepthBlock = listOf(
Block.AIR, Block.DIRT, Block.STONE, Block.STONE_SLATE
Block.AIR, Block.DIRT, Block.STONE, Block.STONE_GNEISS
)
private fun Double.tiered(tiers: List<Double>): Int {
@@ -229,7 +230,10 @@ class Terragen(world: GameWorld, isFinal: Boolean, val groundScalingCached: Modu
}
interface TerragenParams {
val version: Long
val terragenTiers: List<Double>
val terragenTiles: List<ItemID>
val featureSize: Double
val lowlandScaleOffset: Double // linearly alters the height
val highlandScaleOffset: Double // linearly alters the height
@@ -245,10 +249,15 @@ interface TerragenParams {
val caveBlockageSelectThre: Double // adjust cave closing-up strength. Lower = more closing
val rockBandCutoffFreq: Double
val lavaShapeFreg: Double }
val lavaShapeFreg: Double
}
data class TerragenParamsAlpha1(
override val terragenTiers: List<Double> = listOf(.0, .5, 1.0, 2.5, 11.0 * 9999),
override val version: Long = 0L,
override val terragenTiers: List<Double> = listOf(.0, .5, 1.0, 2.5),
override val terragenTiles: List<ItemID> = listOf(Block.AIR, Block.DIRT, Block.STONE, Block.STONE_GNEISS),
override val featureSize: Double = 333.0,
override val lowlandScaleOffset: Double = -0.65, // linearly alters the height
@@ -268,10 +277,36 @@ data class TerragenParamsAlpha1(
override val rockBandCutoffFreq: Double = 4.0,
override val lavaShapeFreg: Double = 0.03,
) : TerragenParams
data class TerragenParamsAlpha2(
override val terragenTiers: List<Double> = listOf(.0, .5, 1.5, 4.2, 11.0 * 9999),
override val version: Long = 0x0000_000004_000004,
// override val terragenTiers: List<Double> = listOf(.0, .5, 1.5, 4.2),
override val terragenTiers: List<Double> = listOf(.0, .5, 1.0, 1.1, 1.2, 1.3, 1.4, 1.5, 2.0, 3.0, 4.0, 5.0, 6.0, 6.25, 6.50, 6.75, 7.0, 8.0, 9.0, 10.0, 11.0),
override val terragenTiles: List<ItemID> = listOf(Block.AIR, Block.DIRT,
Block.STONE, // 1.0
Block.SANDSTONE, // 1.1
Block.STONE_MICROCLINE, // 1.2
Block.STONE_ORTHOCLASE, // 1.3
Block.STONE_MARBLE, // 1.4
Block.STONE, // 1.5
Block.STONE_MICROCLINE, // 2.0
Block.STONE_PLAGIOCLASE, // 3.0
Block.STONE, // 4.0
Block.STONE_ORTHOCLASE, // 5.0
Block.STONE_MICROCLINE, // 6.0
Block.STONE_MARBLE, // 6.25
Block.STONE, // 6.50
Block.STONE_MARBLE, // 6.75
Block.STONE_PLAGIOCLASE, // 7.0
Block.STONE, // 8.0
Block.STONE_BASALT, // 9.0
Block.STONE, // 10.0
Block.STONE_GNEISS, // 11.0
),
override val featureSize: Double = 333.0,
override val lowlandScaleOffset: Double = -0.65, // linearly alters the height

View File

@@ -22,6 +22,7 @@ import net.torvald.random.HQRNG
import net.torvald.terrarum.FlippingSpriteBatch
import net.torvald.terrarum.blockproperties.Block
import net.torvald.terrarum.concurrent.ThreadExecutor
import net.torvald.terrarum.gameitems.ItemID
import net.torvald.terrarum.inUse
import net.torvald.terrarum.modulebasegame.worldgenerator.BiomegenParams
import net.torvald.terrarum.modulebasegame.worldgenerator.TerragenParams
@@ -43,6 +44,8 @@ const val NOISEBOX_WIDTH = 90 * 18
const val NOISEBOX_HEIGHT = 90 * 26
const val TWO_PI = Math.PI * 2
//const val WORLDGEN_YOFF = 0
//const val WORLDGEN_YOFF = 1500
const val WORLDGEN_YOFF = 5400 - NOISEBOX_HEIGHT
/**
@@ -398,12 +401,15 @@ internal class TerragenTest(val params: TerragenParams) : NoiseMaker {
Color(0.97f, 0.6f, 0.56f, 1f)
)
private val groundDepthBlockWall = listOf(
/*private val groundDepthBlockWall = listOf(
Block.AIR, Block.DIRT, Block.STONE, Block.STONE_SLATE, Block.STONE_SLATE
)
private val groundDepthBlockTERR = ArrayList(groundDepthBlockWall).also {
it[it.lastIndex] = Block.AIR
}
}*/
private val groundDepthBlockWall = params.terragenTiles
private val groundDepthBlockTERR = groundDepthBlockWall
private fun Double.tiered(tiers: List<Double>): Int {
tiers.reversed().forEachIndexed { index, it ->
@@ -418,8 +424,13 @@ internal class TerragenTest(val params: TerragenParams) : NoiseMaker {
Block.AIR to Color(0f, 0f, 0f, 1f),
Block.DIRT to Color(0.588f, 0.45f, 0.3f, 1f),
Block.STONE to Color(0.4f, 0.4f, 0.4f, 1f),
Block.STONE_SLATE to Color(0.2f, 0.2f, 0.2f, 1f),
Block.STONE_MARBLE to Color(0.8f, 0.8f, 0.8f, 1f)
Block.STONE_GNEISS to Color(0.2f, 0.2f, 0.2f, 1f),
Block.STONE_MARBLE to Color(0.8f, 0.8f, 0.8f, 1f),
Block.STONE_ORTHOCLASE to Color(0xa3836bff.toInt()),
Block.STONE_PLAGIOCLASE to Color(0xaa998fff.toInt()),
Block.STONE_MICROCLINE to Color(0x9ea3adff.toInt()),
Block.STONE_BASALT to Color(0x3f3e3fff.toInt()),
Block.SANDSTONE to Color(0xe0c688ff.toInt())
)
private val COPPER_ORE = 0x00e9c8ff.toInt()
@@ -445,6 +456,8 @@ internal class TerragenTest(val params: TerragenParams) : NoiseMaker {
private val terragenYscaling = (NOISEBOX_HEIGHT / 2400.0).pow(0.75)
private val terragenTiers = (params.terragenTiers).map { it * terragenYscaling } // pow 1.0 for 1-to-1 scaling; 0.75 is used to make deep-rock layers actually deep for huge world size
private fun ItemID.isRock() = this.substringAfter(':').toInt() in 16 until 32
override fun draw(x: Int, y: Int, noiseValue: List<Double>, outTex: Pixmap) {
val terr = noiseValue[0].tiered(terragenTiers)
val cave = if (noiseValue[1] < 0.5) 0 else 1
@@ -470,20 +483,20 @@ internal class TerragenTest(val params: TerragenParams) : NoiseMaker {
outTex.drawPixel(x, y,
if (water) WATER
else if (waterShell) {
if ((terrBlockNoAir == Block.STONE || terrBlockNoAir == Block.STONE_SLATE))
if (terrBlockNoAir.isRock())
ore ?: blockToCol[terrBlockNoAir]!!.toRGBA()
else
blockToCol[terrBlockNoAir]!!.toRGBA()
}
else if (oil) OIL
else if (oilShell) {
if ((terrBlockNoAir == Block.STONE || terrBlockNoAir == Block.STONE_SLATE))
if (terrBlockNoAir.isRock())
ore ?: blockToCol[terrBlockNoAir]!!.toRGBA()
else
blockToCol[terrBlockNoAir]!!.toRGBA()
}
else if (lava) LAVA
else if (ore != null && (terrBlock == Block.STONE || terrBlock == Block.STONE_SLATE)) ore
else if (ore != null && (terrBlock.isRock())) ore
else if (wallBlock == Block.AIR && terrBlock == Block.AIR) BACK
else blockToCol[terrBlock]!!.toRGBA()
)