terrain.occursOn is now an arrayList - helps with definition checking and generally simplifies things

This commit is contained in:
Yair Morgenstern 2020-10-24 22:38:44 +03:00
parent c85b51474c
commit 93aa06bc99
6 changed files with 32 additions and 32 deletions

View File

@ -237,21 +237,21 @@ class MapGenerator(val ruleset: Ruleset) {
} }
/** /**
* [MapParameters.vegetationOccurrance] is the threshold for vegetation spawn * [MapParameters.vegetationRichness] is the threshold for vegetation spawn
*/ */
private fun spawnVegetation(tileMap: TileMap) { private fun spawnVegetation(tileMap: TileMap) {
val vegetationSeed = randomness.RNG.nextInt().toDouble() val vegetationSeed = randomness.RNG.nextInt().toDouble()
val candidateTerrains = Constants.vegetation.flatMap{ ruleset.terrains[it]!!.occursOn!! } val candidateTerrains = Constants.vegetation.flatMap{ ruleset.terrains[it]!!.occursOn }
for (tile in tileMap.values.asSequence().filter { it.baseTerrain in candidateTerrains && it.terrainFeature == null for (tile in tileMap.values.asSequence().filter { it.baseTerrain in candidateTerrains && it.terrainFeature == null
&& (!it.isHill() || Constants.hill in candidateTerrains) }) { && (!it.isHill() || Constants.hill in candidateTerrains) }) {
val vegetation = (randomness.getPerlinNoise(tile, vegetationSeed, scale = 3.0, nOctaves = 1) + 1.0) / 2.0 val vegetation = (randomness.getPerlinNoise(tile, vegetationSeed, scale = 3.0, nOctaves = 1) + 1.0) / 2.0
if (vegetation <= tileMap.mapParameters.vegetationRichness) if (vegetation <= tileMap.mapParameters.vegetationRichness)
tile.terrainFeature = Constants.vegetation.filter { ruleset.terrains[it]!!.occursOn!!.contains(tile.baseTerrain) }.random(randomness.RNG) tile.terrainFeature = Constants.vegetation.filter { ruleset.terrains[it]!!.occursOn.contains(tile.baseTerrain) }.random(randomness.RNG)
} }
} }
/** /**
* [MapParameters.rareFeaturesProbability] is the probability of spawning a rare feature * [MapParameters.rareFeaturesRichness] is the probability of spawning a rare feature
*/ */
private fun spawnRareFeatures(tileMap: TileMap) { private fun spawnRareFeatures(tileMap: TileMap) {
val rareFeatures = ruleset.terrains.values.filter { val rareFeatures = ruleset.terrains.values.filter {
@ -259,8 +259,8 @@ class MapGenerator(val ruleset: Ruleset) {
} }
for (tile in tileMap.values.asSequence().filter { it.terrainFeature == null }) { for (tile in tileMap.values.asSequence().filter { it.terrainFeature == null }) {
if (randomness.RNG.nextDouble() <= tileMap.mapParameters.rareFeaturesRichness) { if (randomness.RNG.nextDouble() <= tileMap.mapParameters.rareFeaturesRichness) {
val possibleFeatures = rareFeatures.filter { it.occursOn != null && it.occursOn.contains(tile.baseTerrain) val possibleFeatures = rareFeatures.filter { it.occursOn.contains(tile.baseTerrain)
&& (!tile.isHill() || it.occursOn.contains(Constants.hill) )} && (!tile.isHill() || it.occursOn.contains(Constants.hill)) }
if (possibleFeatures.any()) if (possibleFeatures.any())
tile.terrainFeature = possibleFeatures.random(randomness.RNG).name tile.terrainFeature = possibleFeatures.random(randomness.RNG).name
} }

View File

@ -79,7 +79,7 @@ class NaturalWonderGenerator(val ruleset: Ruleset){
private fun spawnBarringerCrater(tileMap: TileMap) { private fun spawnBarringerCrater(tileMap: TileMap) {
val wonder = ruleset.terrains[Constants.barringerCrater]!! val wonder = ruleset.terrains[Constants.barringerCrater]!!
val suitableLocations = tileMap.values.filter { it.resource == null && it.improvement == null val suitableLocations = tileMap.values.filter { it.resource == null && it.improvement == null
&& wonder.occursOn!!.contains(it.getLastTerrain().name) && wonder.occursOn.contains(it.getLastTerrain().name)
&& it.neighbors.none { neighbor -> neighbor.getBaseTerrain().name == Constants.grassland } && it.neighbors.none { neighbor -> neighbor.getBaseTerrain().name == Constants.grassland }
&& it.neighbors.count{ neighbor -> neighbor.getBaseTerrain().name == Constants.mountain } <= 2 && it.neighbors.count{ neighbor -> neighbor.getBaseTerrain().name == Constants.mountain } <= 2
&& it.neighbors.count{ neighbor -> neighbor.getBaseTerrain().name == Constants.mountain || neighbor.isHill() } <= 4 && it.neighbors.count{ neighbor -> neighbor.getBaseTerrain().name == Constants.mountain || neighbor.isHill() } <= 4
@ -95,7 +95,7 @@ class NaturalWonderGenerator(val ruleset: Ruleset){
private fun spawnMountFuji(tileMap: TileMap) { private fun spawnMountFuji(tileMap: TileMap) {
val wonder = ruleset.terrains[Constants.mountFuji]!! val wonder = ruleset.terrains[Constants.mountFuji]!!
val suitableLocations = tileMap.values.filter { it.resource == null && it.improvement == null val suitableLocations = tileMap.values.filter { it.resource == null && it.improvement == null
&& wonder.occursOn!!.contains(it.getLastTerrain().name) && wonder.occursOn.contains(it.getLastTerrain().name)
&& it.neighbors.none { neighbor -> neighbor.getBaseTerrain().name == Constants.tundra } && it.neighbors.none { neighbor -> neighbor.getBaseTerrain().name == Constants.tundra }
&& it.neighbors.none { neighbor -> neighbor.getBaseTerrain().name == Constants.desert } && it.neighbors.none { neighbor -> neighbor.getBaseTerrain().name == Constants.desert }
&& it.neighbors.none { neighbor -> neighbor.getBaseTerrain().name == Constants.mountain } && it.neighbors.none { neighbor -> neighbor.getBaseTerrain().name == Constants.mountain }
@ -113,7 +113,7 @@ class NaturalWonderGenerator(val ruleset: Ruleset){
private fun spawnGrandMesa(tileMap: TileMap) { private fun spawnGrandMesa(tileMap: TileMap) {
val wonder = ruleset.terrains[Constants.grandMesa]!! val wonder = ruleset.terrains[Constants.grandMesa]!!
val suitableLocations = tileMap.values.filter { it.resource == null && it.improvement == null val suitableLocations = tileMap.values.filter { it.resource == null && it.improvement == null
&& wonder.occursOn!!.contains(it.getLastTerrain().name) && wonder.occursOn.contains(it.getLastTerrain().name)
&& it.neighbors.count{ neighbor -> neighbor.isHill() } >= 2 && it.neighbors.count{ neighbor -> neighbor.isHill() } >= 2
&& it.neighbors.none { neighbor -> neighbor.getBaseTerrain().name == Constants.grassland } && it.neighbors.none { neighbor -> neighbor.getBaseTerrain().name == Constants.grassland }
&& it.neighbors.count { neighbor -> neighbor.getBaseTerrain().name == Constants.mountain } <= 2 && it.neighbors.count { neighbor -> neighbor.getBaseTerrain().name == Constants.mountain } <= 2
@ -129,13 +129,13 @@ class NaturalWonderGenerator(val ruleset: Ruleset){
private fun spawnGreatBarrierReef(tileMap: TileMap) { private fun spawnGreatBarrierReef(tileMap: TileMap) {
val wonder = ruleset.terrains[Constants.greatBarrierReef]!! val wonder = ruleset.terrains[Constants.greatBarrierReef]!!
val suitableLocations = tileMap.values.filter { it.resource == null && it.improvement == null val suitableLocations = tileMap.values.filter { it.resource == null && it.improvement == null
&& wonder.occursOn!!.contains(it.getLastTerrain().name) && wonder.occursOn.contains(it.getLastTerrain().name)
&& abs(it.latitude) > tileMap.maxLatitude * 0.1 && abs(it.latitude) > tileMap.maxLatitude * 0.1
&& abs(it.latitude) < tileMap.maxLatitude * 0.7 && abs(it.latitude) < tileMap.maxLatitude * 0.7
&& it.neighbors.all {neighbor -> neighbor.isWater} && it.neighbors.all {neighbor -> neighbor.isWater}
&& it.neighbors.any {neighbor -> && it.neighbors.any {neighbor ->
neighbor.resource == null && neighbor.improvement == null neighbor.resource == null && neighbor.improvement == null
&& wonder.occursOn!!.contains(neighbor.getLastTerrain().name) && wonder.occursOn.contains(neighbor.getLastTerrain().name)
&& neighbor.neighbors.all{ it.isWater } } && neighbor.neighbors.all{ it.isWater } }
} }
@ -143,7 +143,7 @@ class NaturalWonderGenerator(val ruleset: Ruleset){
if (location != null) { if (location != null) {
val location2 = location.neighbors val location2 = location.neighbors
.filter { it.resource == null && it.improvement == null .filter { it.resource == null && it.improvement == null
&& wonder.occursOn!!.contains(it.getLastTerrain().name) && wonder.occursOn.contains(it.getLastTerrain().name)
&& it.neighbors.all{ it.isWater } } && it.neighbors.all{ it.isWater } }
.toList().random() .toList().random()
@ -160,7 +160,7 @@ class NaturalWonderGenerator(val ruleset: Ruleset){
private fun spawnKrakatoa(tileMap: TileMap) { private fun spawnKrakatoa(tileMap: TileMap) {
val wonder = ruleset.terrains[Constants.krakatoa]!! val wonder = ruleset.terrains[Constants.krakatoa]!!
val suitableLocations = tileMap.values.filter { it.resource == null && it.improvement == null val suitableLocations = tileMap.values.filter { it.resource == null && it.improvement == null
&& wonder.occursOn!!.contains(it.getLastTerrain().name) && wonder.occursOn.contains(it.getLastTerrain().name)
&& it.neighbors.any { neighbor -> neighbor.getBaseTerrain().name == Constants.coast } && it.neighbors.any { neighbor -> neighbor.getBaseTerrain().name == Constants.coast }
&& it.neighbors.none { neighbor -> neighbor.getLastTerrain().name == Constants.ice } && it.neighbors.none { neighbor -> neighbor.getLastTerrain().name == Constants.ice }
} }
@ -186,7 +186,7 @@ class NaturalWonderGenerator(val ruleset: Ruleset){
private fun spawnRockOfGibraltar(tileMap: TileMap) { private fun spawnRockOfGibraltar(tileMap: TileMap) {
val wonder = ruleset.terrains[Constants.rockOfGibraltar]!! val wonder = ruleset.terrains[Constants.rockOfGibraltar]!!
val suitableLocations = tileMap.values.filter { it.resource == null && it.improvement == null val suitableLocations = tileMap.values.filter { it.resource == null && it.improvement == null
&& wonder.occursOn!!.contains(it.getLastTerrain().name) && wonder.occursOn.contains(it.getLastTerrain().name)
&& it.neighbors.any { neighbor -> neighbor.getBaseTerrain().name == Constants.coast } && it.neighbors.any { neighbor -> neighbor.getBaseTerrain().name == Constants.coast }
&& it.neighbors.count { neighbor -> neighbor.getBaseTerrain().name == Constants.mountain } == 1 && it.neighbors.count { neighbor -> neighbor.getBaseTerrain().name == Constants.mountain } == 1
} }
@ -221,7 +221,7 @@ class NaturalWonderGenerator(val ruleset: Ruleset){
private fun spawnOldFaithful(tileMap: TileMap) { private fun spawnOldFaithful(tileMap: TileMap) {
val wonder = ruleset.terrains[Constants.oldFaithful]!! val wonder = ruleset.terrains[Constants.oldFaithful]!!
val suitableLocations = tileMap.values.filter { it.resource == null && it.improvement == null val suitableLocations = tileMap.values.filter { it.resource == null && it.improvement == null
&& wonder.occursOn!!.contains(it.getLastTerrain().name) && wonder.occursOn.contains(it.getLastTerrain().name)
&& it.neighbors.count { neighbor -> neighbor.getBaseTerrain().name == Constants.mountain } <= 4 && it.neighbors.count { neighbor -> neighbor.getBaseTerrain().name == Constants.mountain } <= 4
&& it.neighbors.count { neighbor -> neighbor.getBaseTerrain().name == Constants.mountain || && it.neighbors.count { neighbor -> neighbor.getBaseTerrain().name == Constants.mountain ||
neighbor.isHill() neighbor.isHill()
@ -239,7 +239,7 @@ class NaturalWonderGenerator(val ruleset: Ruleset){
private fun spawnCerroDePotosi(tileMap: TileMap) { private fun spawnCerroDePotosi(tileMap: TileMap) {
val wonder = ruleset.terrains[Constants.cerroDePotosi]!! val wonder = ruleset.terrains[Constants.cerroDePotosi]!!
val suitableLocations = tileMap.values.filter { it.resource == null && it.improvement == null val suitableLocations = tileMap.values.filter { it.resource == null && it.improvement == null
&& wonder.occursOn!!.contains(it.getLastTerrain().name) && wonder.occursOn.contains(it.getLastTerrain().name)
&& it.neighbors.any { neighbor -> neighbor.isHill() } && it.neighbors.any { neighbor -> neighbor.isHill() }
} }
@ -252,7 +252,7 @@ class NaturalWonderGenerator(val ruleset: Ruleset){
private fun spawnElDorado(tileMap: TileMap) { private fun spawnElDorado(tileMap: TileMap) {
val wonder = ruleset.terrains[Constants.elDorado]!! val wonder = ruleset.terrains[Constants.elDorado]!!
val suitableLocations = tileMap.values.filter { it.resource == null && it.improvement == null val suitableLocations = tileMap.values.filter { it.resource == null && it.improvement == null
&& wonder.occursOn!!.contains(it.getLastTerrain().name) && wonder.occursOn.contains(it.getLastTerrain().name)
&& it.neighbors.any { neighbor -> neighbor.getLastTerrain().name == Constants.jungle } && it.neighbors.any { neighbor -> neighbor.getLastTerrain().name == Constants.jungle }
} }
@ -265,7 +265,7 @@ class NaturalWonderGenerator(val ruleset: Ruleset){
private fun spawnFountainOfYouth(tileMap: TileMap) { private fun spawnFountainOfYouth(tileMap: TileMap) {
val wonder = ruleset.terrains[Constants.fountainOfYouth]!! val wonder = ruleset.terrains[Constants.fountainOfYouth]!!
val suitableLocations = tileMap.values.filter { it.resource == null && it.improvement == null val suitableLocations = tileMap.values.filter { it.resource == null && it.improvement == null
&& wonder.occursOn!!.contains(it.getLastTerrain().name) } && wonder.occursOn.contains(it.getLastTerrain().name) }
trySpawnOnSuitableLocation(suitableLocations, wonder) trySpawnOnSuitableLocation(suitableLocations, wonder)
} }

View File

@ -258,8 +258,8 @@ class Ruleset {
lines += "${resource.name} revealed by tech ${resource.revealedBy} which does not exist!" lines += "${resource.name} revealed by tech ${resource.revealedBy} which does not exist!"
if (resource.improvement != null && !tileImprovements.containsKey(resource.improvement!!)) if (resource.improvement != null && !tileImprovements.containsKey(resource.improvement!!))
lines += "${resource.name} improved by improvement ${resource.improvement} which does not exist!" lines += "${resource.name} improved by improvement ${resource.improvement} which does not exist!"
for(terrain in resource.terrainsCanBeFoundOn) for (terrain in resource.terrainsCanBeFoundOn)
if(!terrains.containsKey(terrain)) if (!terrains.containsKey(terrain))
lines += "${resource.name} can be found on terrain $terrain which does not exist!" lines += "${resource.name} can be found on terrain $terrain which does not exist!"
} }
@ -270,12 +270,12 @@ class Ruleset {
if (!terrains.containsKey(terrain)) if (!terrains.containsKey(terrain))
lines += "${improvement.name} can be built on terrain $terrain which does not exist!" lines += "${improvement.name} can be built on terrain $terrain which does not exist!"
} }
//
// for(terrain in terrains.values){ for (terrain in terrains.values) {
// for(baseTerrain in terrain.occursOn) for (baseTerrain in terrain.occursOn)
// if (!terrains.containsKey(baseTerrain)) if (!terrains.containsKey(baseTerrain))
// lines += "${improvement.name} can be built on terrain $terrain which does not exist!" lines += "${terrain.name} occurs on terrain $baseTerrain which does not exist!"
// } }
for (tech in technologies.values) { for (tech in technologies.values) {
for (prereq in tech.prerequisites) { for (prereq in tech.prerequisites) {

View File

@ -20,7 +20,7 @@ class Terrain : NamedStats() {
var unbuildable = false var unbuildable = false
/** For terrain features */ /** For terrain features */
val occursOn: Collection<String>? = null val occursOn = ArrayList<String>()
/** Used by Natural Wonders: it is the baseTerrain on top of which the Natural Wonder is placed */ /** Used by Natural Wonders: it is the baseTerrain on top of which the Natural Wonder is placed */
val turnsInto: String? = null val turnsInto: String? = null
@ -48,7 +48,7 @@ class Terrain : NamedStats() {
fun getDescription(ruleset: Ruleset): String { fun getDescription(ruleset: Ruleset): String {
val sb = StringBuilder() val sb = StringBuilder()
sb.appendln(this.clone().toString()) sb.appendln(this.clone().toString())
if (occursOn != null) if (occursOn.isNotEmpty())
sb.appendln("Occurs on [${occursOn.joinToString(", ") { it.tr() }}]".tr()) sb.appendln("Occurs on [${occursOn.joinToString(", ") { it.tr() }}]".tr())
if (turnsInto != null) if (turnsInto != null)

View File

@ -149,7 +149,7 @@ class CivilopediaScreen(ruleset: Ruleset) : CameraStageBaseScreen() {
} }
TerrainType.TerrainFeature -> { TerrainType.TerrainFeature -> {
tileInfo.terrainFeature = terrain.name tileInfo.terrainFeature = terrain.name
tileInfo.baseTerrain = terrain.occursOn?.last() ?: Constants.grassland tileInfo.baseTerrain = terrain.occursOn.lastOrNull() ?: Constants.grassland
} }
else -> else ->
tileInfo.baseTerrain = terrain.name tileInfo.baseTerrain = terrain.name

View File

@ -359,7 +359,7 @@ class TileEditorOptionsTable(val mapEditorScreen: MapEditorScreen): Table(Camera
val terrainObject = ruleset.terrains[terrain]!! val terrainObject = ruleset.terrains[terrain]!!
if (terrainObject.type == TerrainType.TerrainFeature) { if (terrainObject.type == TerrainType.TerrainFeature) {
tileInfo.baseTerrain = tileInfo.baseTerrain =
if (terrainObject.occursOn != null) terrainObject.occursOn.first() if (terrainObject.occursOn.isNotEmpty()) terrainObject.occursOn.first()
else "Grassland" else "Grassland"
tileInfo.terrainFeature = terrain tileInfo.terrainFeature = terrain
} else tileInfo.baseTerrain = terrain } else tileInfo.baseTerrain = terrain
@ -379,7 +379,7 @@ class TileEditorOptionsTable(val mapEditorScreen: MapEditorScreen): Table(Camera
val tileInfo = TileInfo() val tileInfo = TileInfo()
if (terrain.type == TerrainType.TerrainFeature) { if (terrain.type == TerrainType.TerrainFeature) {
tileInfo.baseTerrain = when { tileInfo.baseTerrain = when {
terrain.occursOn != null -> terrain.occursOn.first() terrain.occursOn.isNotEmpty() -> terrain.occursOn.first()
else -> "Grassland" else -> "Grassland"
} }
tileInfo.terrainFeature = terrain.name tileInfo.terrainFeature = terrain.name
@ -493,7 +493,7 @@ class TileEditorOptionsTable(val mapEditorScreen: MapEditorScreen): Table(Camera
if (tileInfo.terrainFeature != null) { if (tileInfo.terrainFeature != null) {
val terrainFeature = tileInfo.getTerrainFeature()!! val terrainFeature = tileInfo.getTerrainFeature()!!
if(terrainFeature.occursOn!=null && !terrainFeature.occursOn.contains(tileInfo.baseTerrain)) if(terrainFeature.occursOn.isNotEmpty() && !terrainFeature.occursOn.contains(tileInfo.baseTerrain))
tileInfo.terrainFeature=null tileInfo.terrainFeature=null
} }
if (tileInfo.resource != null) { if (tileInfo.resource != null) {