From 1069b0933ea54f5ca18a12c9204f8ea6754a23bd Mon Sep 17 00:00:00 2001 From: Yair Morgenstern Date: Tue, 19 Apr 2022 15:25:33 +0300 Subject: [PATCH] Added "Vegetation" unique so that vegetation spawn is not limited to just jungle and forest (#6569) --- .../assets/jsons/Civ V - Gods & Kings/Terrains.json | 4 ++-- android/assets/jsons/Civ V - Vanilla/Terrains.json | 4 ++-- .../com/unciv/logic/map/mapgenerator/MapGenerator.kt | 10 ++++++---- core/src/com/unciv/models/ruleset/unique/UniqueType.kt | 2 ++ .../com/unciv/ui/worldscreen/bottombar/BattleTable.kt | 4 ++-- 5 files changed, 14 insertions(+), 10 deletions(-) diff --git a/android/assets/jsons/Civ V - Gods & Kings/Terrains.json b/android/assets/jsons/Civ V - Gods & Kings/Terrains.json index c735512021..f79365381b 100644 --- a/android/assets/jsons/Civ V - Gods & Kings/Terrains.json +++ b/android/assets/jsons/Civ V - Gods & Kings/Terrains.json @@ -178,7 +178,7 @@ "unbuildable": true, "defenceBonus": 0.25, "occursOn": ["Tundra","Plains","Grassland","Hill"], - "uniques": ["Rough terrain", + "uniques": ["Rough terrain", "Vegetation", "Provides a one-time Production bonus to the closest city when cut down", "Blocks line-of-sight from tiles at same elevation", "[25]% Chance to be destroyed by nukes", @@ -202,7 +202,7 @@ "defenceBonus": 0.25, "occursOn": ["Plains","Grassland"], "uniques": [ - "Rough terrain", + "Rough terrain", "Vegetation", "Blocks line-of-sight from tiles at same elevation", "[25]% Chance to be destroyed by nukes", "[-1] to Fertility for Map Generation", diff --git a/android/assets/jsons/Civ V - Vanilla/Terrains.json b/android/assets/jsons/Civ V - Vanilla/Terrains.json index 355d0ef11d..ecc4290aad 100644 --- a/android/assets/jsons/Civ V - Vanilla/Terrains.json +++ b/android/assets/jsons/Civ V - Vanilla/Terrains.json @@ -179,7 +179,7 @@ "defenceBonus": 0.25, "occursOn": ["Tundra","Plains","Grassland","Hill"], "uniques": [ - "Rough terrain", + "Rough terrain", "Vegetation", "Provides a one-time Production bonus to the closest city when cut down", "Blocks line-of-sight from tiles at same elevation", "[25]% Chance to be destroyed by nukes", @@ -204,7 +204,7 @@ "defenceBonus": 0.25, "occursOn": ["Plains","Grassland"], "uniques": [ - "Rough terrain", + "Rough terrain", "Vegetation", "Blocks line-of-sight from tiles at same elevation", "[25]% Chance to be destroyed by nukes", "[-1] to Fertility for Map Generation", diff --git a/core/src/com/unciv/logic/map/mapgenerator/MapGenerator.kt b/core/src/com/unciv/logic/map/mapgenerator/MapGenerator.kt index 8674505187..fc311e64de 100644 --- a/core/src/com/unciv/logic/map/mapgenerator/MapGenerator.kt +++ b/core/src/com/unciv/logic/map/mapgenerator/MapGenerator.kt @@ -509,15 +509,17 @@ class MapGenerator(val ruleset: Ruleset) { */ private fun spawnVegetation(tileMap: TileMap) { val vegetationSeed = randomness.RNG.nextInt().toDouble() - val candidateTerrains = Constants.vegetation.mapNotNull { ruleset.terrains[it] }.flatMap{ it.occursOn } - //Checking it.baseTerrain in candidateTerrains to make sure forest does not spawn on desert hill + val vegetationTerrains = (Constants.vegetation.mapNotNull { ruleset.terrains[it] } + + ruleset.terrains.values.filter { it.hasUnique(UniqueType.Vegetation) }).toHashSet() + val candidateTerrains = vegetationTerrains.flatMap{ it.occursOn } + // Checking it.baseTerrain in candidateTerrains to make sure forest does not spawn on desert hill for (tile in tileMap.values.asSequence().filter { it.baseTerrain in candidateTerrains && it.getLastTerrain().name in candidateTerrains }) { val vegetation = (randomness.getPerlinNoise(tile, vegetationSeed, scale = 3.0, nOctaves = 1) + 1.0) / 2.0 if (vegetation <= tileMap.mapParameters.vegetationRichness) { - val randomVegetation = Constants.vegetation.filter { ruleset.terrains[it]!!.occursOn.contains(tile.getLastTerrain().name) }.random(randomness.RNG) - tile.addTerrainFeature(randomVegetation) + val randomVegetation = vegetationTerrains.filter { it.occursOn.contains(tile.getLastTerrain().name) }.random(randomness.RNG) + tile.addTerrainFeature(randomVegetation.name) } } } diff --git a/core/src/com/unciv/models/ruleset/unique/UniqueType.kt b/core/src/com/unciv/models/ruleset/unique/UniqueType.kt index 56da3220ff..bb25bdb3dd 100644 --- a/core/src/com/unciv/models/ruleset/unique/UniqueType.kt +++ b/core/src/com/unciv/models/ruleset/unique/UniqueType.kt @@ -522,6 +522,8 @@ enum class UniqueType(val text: String, vararg targets: UniqueTarget, val flags: TerrainGrantsPromotion("Grants [promotion] ([comment]) to adjacent [mapUnitFilter] units for the rest of the game", UniqueTarget.Terrain), GrantsCityStrength("[amount] Strength for cities built on this terrain", UniqueTarget.Terrain), ProductionBonusWhenRemoved("Provides a one-time Production bonus to the closest city when cut down", UniqueTarget.Terrain), + Vegetation("Vegetation", UniqueTarget.Terrain, flags = UniqueFlag.setOfHiddenToUsers), + TileProvidesYieldWithoutPopulation("Tile provides yield without assigned population", UniqueTarget.Terrain, UniqueTarget.Improvement), NullifyYields("Nullifies all other stats this tile provides", UniqueTarget.Terrain), diff --git a/core/src/com/unciv/ui/worldscreen/bottombar/BattleTable.kt b/core/src/com/unciv/ui/worldscreen/bottombar/BattleTable.kt index ed06bc4034..c5253ea131 100644 --- a/core/src/com/unciv/ui/worldscreen/bottombar/BattleTable.kt +++ b/core/src/com/unciv/ui/worldscreen/bottombar/BattleTable.kt @@ -263,10 +263,10 @@ class BattleTable(val worldScreen: WorldScreen): Table() { } worldScreen.stage.addAction(Actions.sequence( object : FloatAction(0f, 1f, 0.3f, Interpolation.sine) { - override fun update(percent: Float)=updateRedPercent(percent) + override fun update(percent: Float) = updateRedPercent(percent) }, object : FloatAction(0f, 1f, 0.3f, Interpolation.sine) { - override fun update(percent: Float)=updateRedPercent(1-percent) + override fun update(percent: Float) = updateRedPercent(1 - percent) } )) }