worldgen: sand patch

This commit is contained in:
minjaesong
2023-11-10 14:59:20 +09:00
parent 74eb5f648d
commit f5c004104e
9 changed files with 70 additions and 38 deletions

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@@ -5,13 +5,9 @@ import com.sudoplay.joise.module.*
import net.torvald.terrarum.App
import net.torvald.terrarum.LoadScreenBase
import net.torvald.terrarum.blockproperties.Block
import net.torvald.terrarum.concurrent.ThreadExecutor
import net.torvald.terrarum.concurrent.sliceEvenly
import net.torvald.terrarum.gameworld.GameWorld
import net.torvald.terrarum.gameworld.fmod
import net.torvald.terrarum.modulebasegame.TerrarumIngame
import kotlin.math.cos
import kotlin.math.max
import kotlin.math.sin
/**
@@ -73,7 +69,8 @@ class Biomegen(world: GameWorld, seed: Long, params: Any) : Gen(world, seed, par
}
private fun draw(x: Int, y: Int, noiseValue: List<Double>, world: GameWorld) {
val control = noiseValue[0].coerceIn(0.0, 0.99999).times(slices).toInt().coerceIn(0 until slices)
val control1 = noiseValue[0].coerceIn(0.0, 0.99999).times(slices).toInt().coerceAtMost(slices - 1)
val control2 = noiseValue[1].coerceIn(0.0, 0.99999).times(9).toInt().coerceAtMost(9 - 1)
if (y > 0) {
val tileThis = world.getTileFromTerrain(x, y)
@@ -81,41 +78,76 @@ class Biomegen(world: GameWorld, seed: Long, params: Any) : Gen(world, seed, par
val nearbyTerr = nearbyArr.map { world.getTileFromTerrain(x + it.first, y + it.second) }
val nearbyWall = nearbyArr.map { world.getTileFromWall(x + it.first, y + it.second) }
when (control) {
val grassRock = when (control1) {
0 -> { // woodlands
if (tileThis == Block.DIRT && nearbyTerr.any { it == Block.AIR } && nearbyWall.any { it == Block.AIR }) {
world.setTileTerrain(x, y, Block.GRASS, true)
Block.GRASS to null
}
else null to null
}
1 -> { // shrublands
if (tileThis == Block.DIRT && nearbyTerr.any { it == Block.AIR } && nearbyWall.any { it == Block.AIR }) {
world.setTileTerrain(x, y, Block.GRASS, true)
Block.GRASS to null
}
else null to null
}
2, 3 -> { // plains
if (tileThis == Block.DIRT && nearbyTerr.any { it == Block.AIR } && nearbyWall.any { it == Block.AIR }) {
world.setTileTerrain(x, y, Block.GRASS, true)
Block.GRASS to null
}
else null to null
}
/*3 -> { // sands
if (tileThis == Block.DIRT && (nearbyTerr[BT] == Block.STONE || nearbyTerr[BT] == Block.AIR)) {
world.setTileTerrain(x, y, Block.SANDSTONE)
world.setTileTerrain(x, y, Block.SANDSTONE, true)
}
else if (tileThis == Block.DIRT) {
world.setTileTerrain(x, y, Block.SAND)
world.setTileTerrain(x, y, Block.SAND, true)
}
}*/
4 -> { // rockylands
if (tileThis == Block.DIRT || tileThis == Block.STONE_QUARRIED) {
world.setTileTerrain(x, y, Block.STONE, true)
world.setTileWall(x, y, Block.STONE, true)
Block.STONE to Block.STONE
}
else null to null
}
else -> null to null
}
val sandNull = when (control2) {
8 -> {
if (tileThis == Block.DIRT && (nearbyTerr[BT] == Block.AIR)) {
Block.SANDSTONE to null
}
else if (tileThis == Block.DIRT) {
Block.SAND to null
}
else null to null
}
else -> null to null
}
val outTile = if (grassRock.first == Block.STONE)
grassRock
else if (sandNull.first != null)
sandNull
else grassRock
if (outTile.first != null)
world.setTileTerrain(x, y, outTile.first!!, true)
if (outTile.second != null)
world.setTileWall(x, y, outTile.second!!, true)
}
}
private fun getGenerator(seed: Long, params: BiomegenParams): List<Joise> {
return listOf(
makeRandomSpotties("TERRA", params.featureSize1),
makeRandomSpotties("SABLUM", params.featureSize2),
)
}
private fun makeRandomSpotties(shakeValue: String, featureSize: Double): Joise {
//val biome = ModuleBasisFunction()
//biome.setType(ModuleBasisFunction.BasisType.SIMPLEX)
@@ -125,14 +157,14 @@ class Biomegen(world: GameWorld, seed: Long, params: Any) : Gen(world, seed, par
it.setAllSourceBasisTypes(ModuleBasisFunction.BasisType.SIMPLEX)
it.setNumOctaves(4)
it.setFrequency(1.0)
it.seed = seed shake 0x7E22A
it.seed = seed shake shakeValue
}
val scaleDomain = ModuleScaleDomain().also {
it.setSource(fractal)
it.setScaleX(1.0 / params.featureSize) // adjust this value to change features size
it.setScaleY(1.0 / params.featureSize)
it.setScaleZ(1.0 / params.featureSize)
it.setScaleX(1.0 / featureSize) // adjust this value to change features size
it.setScaleY(1.0 / featureSize)
it.setScaleZ(1.0 / featureSize)
}
val scale = ModuleScaleOffset().also {
@@ -142,12 +174,12 @@ class Biomegen(world: GameWorld, seed: Long, params: Any) : Gen(world, seed, par
}
val last = scale
return listOf(Joise(last))
return Joise(last)
}
}
data class BiomegenParams(
val featureSize: Double = 80.0
val featureSize1: Double = 80.0,
val featureSize2: Double = 120.0
)

View File

@@ -43,7 +43,7 @@ class Oregen(world: GameWorld, private val caveAttenuateBiasScaled: ModuleScaleD
*/
private fun getGenerator(seed: Long): List<Joise> {
return ores.map {
Joise(generateOreVeinModule(caveAttenuateBiasScaled, seed shake it.tile, it.freq, it.power, it.scale, it.ratio))
generateOreVeinModule(caveAttenuateBiasScaled, seed shake it.tile, it.freq, it.power, it.scale, it.ratio)
}
}
@@ -83,7 +83,7 @@ class Oregen(world: GameWorld, private val caveAttenuateBiasScaled: ModuleScaleD
}
}
private fun generateOreVeinModule(caveAttenuateBiasScaled: ModuleScaleDomain, seed: Long, freq: Double, pow: Double, scale: Double, ratio: Double): Module {
private fun generateOreVeinModule(caveAttenuateBiasScaled: ModuleScaleDomain, seed: Long, freq: Double, pow: Double, scale: Double, ratio: Double): Joise {
val oreShape = ModuleFractal().also {
it.setType(ModuleFractal.FractalType.RIDGEMULTI)
it.setAllSourceBasisTypes(ModuleBasisFunction.BasisType.GRADIENT)
@@ -147,7 +147,7 @@ class Oregen(world: GameWorld, private val caveAttenuateBiasScaled: ModuleScaleD
it.setFalloff(0.0)
}
return oreSelect
return Joise(oreSelect)
}
}

View File

@@ -298,9 +298,9 @@ internal object BiomeMaker : NoiseMaker {
val scaleDomain = ModuleScaleDomain().also {
it.setSource(fractal)
it.setScaleX(1.0 / params.featureSize) // adjust this value to change features size
it.setScaleY(1.0 / params.featureSize)
it.setScaleZ(1.0 / params.featureSize)
it.setScaleX(1.0 / params.featureSize1) // adjust this value to change features size
it.setScaleY(1.0 / params.featureSize1)
it.setScaleZ(1.0 / params.featureSize1)
}
val scale = ModuleScaleOffset().also {