From 93aa06bc99b15f3014fc015029b87826e1b5f2e0 Mon Sep 17 00:00:00 2001 From: Yair Morgenstern Date: Sat, 24 Oct 2020 22:38:44 +0300 Subject: [PATCH] terrain.occursOn is now an arrayList - helps with definition checking and generally simplifies things --- .../logic/map/mapgenerator/MapGenerator.kt | 12 +++++----- .../mapgenerator/NaturalWonderGenerator.kt | 24 +++++++++---------- core/src/com/unciv/models/ruleset/Ruleset.kt | 16 ++++++------- .../com/unciv/models/ruleset/tile/Terrain.kt | 4 ++-- core/src/com/unciv/ui/CivilopediaScreen.kt | 2 +- .../ui/mapeditor/TileEditorOptionsTable.kt | 6 ++--- 6 files changed, 32 insertions(+), 32 deletions(-) diff --git a/core/src/com/unciv/logic/map/mapgenerator/MapGenerator.kt b/core/src/com/unciv/logic/map/mapgenerator/MapGenerator.kt index aa06ac54f8..6f7c47736b 100644 --- a/core/src/com/unciv/logic/map/mapgenerator/MapGenerator.kt +++ b/core/src/com/unciv/logic/map/mapgenerator/MapGenerator.kt @@ -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) { 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 && (!it.isHill() || Constants.hill in candidateTerrains) }) { val vegetation = (randomness.getPerlinNoise(tile, vegetationSeed, scale = 3.0, nOctaves = 1) + 1.0) / 2.0 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) { 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 }) { if (randomness.RNG.nextDouble() <= tileMap.mapParameters.rareFeaturesRichness) { - val possibleFeatures = rareFeatures.filter { it.occursOn != null && it.occursOn.contains(tile.baseTerrain) - && (!tile.isHill() || it.occursOn.contains(Constants.hill) )} + val possibleFeatures = rareFeatures.filter { it.occursOn.contains(tile.baseTerrain) + && (!tile.isHill() || it.occursOn.contains(Constants.hill)) } if (possibleFeatures.any()) tile.terrainFeature = possibleFeatures.random(randomness.RNG).name } diff --git a/core/src/com/unciv/logic/map/mapgenerator/NaturalWonderGenerator.kt b/core/src/com/unciv/logic/map/mapgenerator/NaturalWonderGenerator.kt index bda569ee5e..342ac599bf 100644 --- a/core/src/com/unciv/logic/map/mapgenerator/NaturalWonderGenerator.kt +++ b/core/src/com/unciv/logic/map/mapgenerator/NaturalWonderGenerator.kt @@ -79,7 +79,7 @@ class NaturalWonderGenerator(val ruleset: Ruleset){ private fun spawnBarringerCrater(tileMap: TileMap) { val wonder = ruleset.terrains[Constants.barringerCrater]!! 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.count{ neighbor -> neighbor.getBaseTerrain().name == Constants.mountain } <= 2 && 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) { val wonder = ruleset.terrains[Constants.mountFuji]!! 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.desert } && it.neighbors.none { neighbor -> neighbor.getBaseTerrain().name == Constants.mountain } @@ -113,7 +113,7 @@ class NaturalWonderGenerator(val ruleset: Ruleset){ private fun spawnGrandMesa(tileMap: TileMap) { val wonder = ruleset.terrains[Constants.grandMesa]!! 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.none { neighbor -> neighbor.getBaseTerrain().name == Constants.grassland } && it.neighbors.count { neighbor -> neighbor.getBaseTerrain().name == Constants.mountain } <= 2 @@ -129,13 +129,13 @@ class NaturalWonderGenerator(val ruleset: Ruleset){ private fun spawnGreatBarrierReef(tileMap: TileMap) { val wonder = ruleset.terrains[Constants.greatBarrierReef]!! 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.7 && it.neighbors.all {neighbor -> neighbor.isWater} && it.neighbors.any {neighbor -> neighbor.resource == null && neighbor.improvement == null - && wonder.occursOn!!.contains(neighbor.getLastTerrain().name) + && wonder.occursOn.contains(neighbor.getLastTerrain().name) && neighbor.neighbors.all{ it.isWater } } } @@ -143,7 +143,7 @@ class NaturalWonderGenerator(val ruleset: Ruleset){ if (location != null) { val location2 = location.neighbors .filter { it.resource == null && it.improvement == null - && wonder.occursOn!!.contains(it.getLastTerrain().name) + && wonder.occursOn.contains(it.getLastTerrain().name) && it.neighbors.all{ it.isWater } } .toList().random() @@ -160,7 +160,7 @@ class NaturalWonderGenerator(val ruleset: Ruleset){ private fun spawnKrakatoa(tileMap: TileMap) { val wonder = ruleset.terrains[Constants.krakatoa]!! 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.none { neighbor -> neighbor.getLastTerrain().name == Constants.ice } } @@ -186,7 +186,7 @@ class NaturalWonderGenerator(val ruleset: Ruleset){ private fun spawnRockOfGibraltar(tileMap: TileMap) { val wonder = ruleset.terrains[Constants.rockOfGibraltar]!! 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.count { neighbor -> neighbor.getBaseTerrain().name == Constants.mountain } == 1 } @@ -221,7 +221,7 @@ class NaturalWonderGenerator(val ruleset: Ruleset){ private fun spawnOldFaithful(tileMap: TileMap) { val wonder = ruleset.terrains[Constants.oldFaithful]!! 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 || neighbor.isHill() @@ -239,7 +239,7 @@ class NaturalWonderGenerator(val ruleset: Ruleset){ private fun spawnCerroDePotosi(tileMap: TileMap) { val wonder = ruleset.terrains[Constants.cerroDePotosi]!! 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() } } @@ -252,7 +252,7 @@ class NaturalWonderGenerator(val ruleset: Ruleset){ private fun spawnElDorado(tileMap: TileMap) { val wonder = ruleset.terrains[Constants.elDorado]!! 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 } } @@ -265,7 +265,7 @@ class NaturalWonderGenerator(val ruleset: Ruleset){ private fun spawnFountainOfYouth(tileMap: TileMap) { val wonder = ruleset.terrains[Constants.fountainOfYouth]!! 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) } diff --git a/core/src/com/unciv/models/ruleset/Ruleset.kt b/core/src/com/unciv/models/ruleset/Ruleset.kt index a8c7f586aa..179eba4d0f 100644 --- a/core/src/com/unciv/models/ruleset/Ruleset.kt +++ b/core/src/com/unciv/models/ruleset/Ruleset.kt @@ -258,8 +258,8 @@ class Ruleset { lines += "${resource.name} revealed by tech ${resource.revealedBy} which does not exist!" if (resource.improvement != null && !tileImprovements.containsKey(resource.improvement!!)) lines += "${resource.name} improved by improvement ${resource.improvement} which does not exist!" - for(terrain in resource.terrainsCanBeFoundOn) - if(!terrains.containsKey(terrain)) + for (terrain in resource.terrainsCanBeFoundOn) + if (!terrains.containsKey(terrain)) lines += "${resource.name} can be found on terrain $terrain which does not exist!" } @@ -270,12 +270,12 @@ class Ruleset { if (!terrains.containsKey(terrain)) lines += "${improvement.name} can be built on terrain $terrain which does not exist!" } -// -// for(terrain in terrains.values){ -// for(baseTerrain in terrain.occursOn) -// if (!terrains.containsKey(baseTerrain)) -// lines += "${improvement.name} can be built on terrain $terrain which does not exist!" -// } + + for (terrain in terrains.values) { + for (baseTerrain in terrain.occursOn) + if (!terrains.containsKey(baseTerrain)) + lines += "${terrain.name} occurs on terrain $baseTerrain which does not exist!" + } for (tech in technologies.values) { for (prereq in tech.prerequisites) { diff --git a/core/src/com/unciv/models/ruleset/tile/Terrain.kt b/core/src/com/unciv/models/ruleset/tile/Terrain.kt index d459693e1e..43cf363123 100644 --- a/core/src/com/unciv/models/ruleset/tile/Terrain.kt +++ b/core/src/com/unciv/models/ruleset/tile/Terrain.kt @@ -20,7 +20,7 @@ class Terrain : NamedStats() { var unbuildable = false /** For terrain features */ - val occursOn: Collection? = null + val occursOn = ArrayList() /** Used by Natural Wonders: it is the baseTerrain on top of which the Natural Wonder is placed */ val turnsInto: String? = null @@ -48,7 +48,7 @@ class Terrain : NamedStats() { fun getDescription(ruleset: Ruleset): String { val sb = StringBuilder() sb.appendln(this.clone().toString()) - if (occursOn != null) + if (occursOn.isNotEmpty()) sb.appendln("Occurs on [${occursOn.joinToString(", ") { it.tr() }}]".tr()) if (turnsInto != null) diff --git a/core/src/com/unciv/ui/CivilopediaScreen.kt b/core/src/com/unciv/ui/CivilopediaScreen.kt index 2e11b0e7b7..e826f1cf2d 100644 --- a/core/src/com/unciv/ui/CivilopediaScreen.kt +++ b/core/src/com/unciv/ui/CivilopediaScreen.kt @@ -149,7 +149,7 @@ class CivilopediaScreen(ruleset: Ruleset) : CameraStageBaseScreen() { } TerrainType.TerrainFeature -> { tileInfo.terrainFeature = terrain.name - tileInfo.baseTerrain = terrain.occursOn?.last() ?: Constants.grassland + tileInfo.baseTerrain = terrain.occursOn.lastOrNull() ?: Constants.grassland } else -> tileInfo.baseTerrain = terrain.name diff --git a/core/src/com/unciv/ui/mapeditor/TileEditorOptionsTable.kt b/core/src/com/unciv/ui/mapeditor/TileEditorOptionsTable.kt index df4bc8d027..dc4858f297 100644 --- a/core/src/com/unciv/ui/mapeditor/TileEditorOptionsTable.kt +++ b/core/src/com/unciv/ui/mapeditor/TileEditorOptionsTable.kt @@ -359,7 +359,7 @@ class TileEditorOptionsTable(val mapEditorScreen: MapEditorScreen): Table(Camera val terrainObject = ruleset.terrains[terrain]!! if (terrainObject.type == TerrainType.TerrainFeature) { tileInfo.baseTerrain = - if (terrainObject.occursOn != null) terrainObject.occursOn.first() + if (terrainObject.occursOn.isNotEmpty()) terrainObject.occursOn.first() else "Grassland" tileInfo.terrainFeature = terrain } else tileInfo.baseTerrain = terrain @@ -379,7 +379,7 @@ class TileEditorOptionsTable(val mapEditorScreen: MapEditorScreen): Table(Camera val tileInfo = TileInfo() if (terrain.type == TerrainType.TerrainFeature) { tileInfo.baseTerrain = when { - terrain.occursOn != null -> terrain.occursOn.first() + terrain.occursOn.isNotEmpty() -> terrain.occursOn.first() else -> "Grassland" } tileInfo.terrainFeature = terrain.name @@ -493,7 +493,7 @@ class TileEditorOptionsTable(val mapEditorScreen: MapEditorScreen): Table(Camera if (tileInfo.terrainFeature != null) { 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 } if (tileInfo.resource != null) {