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) {
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
}

View File

@ -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)
}

View File

@ -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) {

View File

@ -20,7 +20,7 @@ class Terrain : NamedStats() {
var unbuildable = false
/** 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 */
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)

View File

@ -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

View File

@ -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) {