From b35d5d312141150c792bef042591feb6c79ebc57 Mon Sep 17 00:00:00 2001 From: GGGuenni Date: Wed, 5 May 2021 16:48:47 +0200 Subject: [PATCH] changed hill to terrain Feature (#3707) * changed hill to terrain Feature * Update Terrains.json * Update Terrains.json * Snow with capital S * Fixed tests failing * Added check for ruleset supports hill as terrain feature --- .../jsons/Civ V - Vanilla/Terrains.json | 21 ++++++++++--------- core/src/com/unciv/logic/map/TileInfo.kt | 15 ++++++++++++- .../logic/map/mapgenerator/MapGenerator.kt | 9 ++++---- .../map/TileImprovementConstructionTests.kt | 1 + .../logic/map/UnitMovementAlgorithmsTests.kt | 1 + 5 files changed, 32 insertions(+), 15 deletions(-) diff --git a/android/assets/jsons/Civ V - Vanilla/Terrains.json b/android/assets/jsons/Civ V - Vanilla/Terrains.json index e73467695f..69e62987ed 100644 --- a/android/assets/jsons/Civ V - Vanilla/Terrains.json +++ b/android/assets/jsons/Civ V - Vanilla/Terrains.json @@ -60,16 +60,6 @@ "RGB": [ 123, 202, 226], "uniques": ["Fresh water"] }, - { - "name": "Hill", - "type": "Land", - "production": 2, - "movementCost": 2, - "overrideStats": true, - "defenceBonus": 0.25, - "RGB": [105,125,72], - "uniques": ["Rough terrain"] - }, { "name": "Mountain", "type": "Land", @@ -86,6 +76,17 @@ }, // Terrain features + { + "name": "Hill", + "type": "TerrainFeature", + "production": 2, + "movementCost": 2, + "overrideStats": true, + "defenceBonus": 0.25, + "RGB": [105,125,72], + "occursOn": ["Tundra","Plains","Grassland","Desert","Snow"], + "uniques": ["Rough terrain"] + }, { "name": "Forest", "type": "TerrainFeature", diff --git a/core/src/com/unciv/logic/map/TileInfo.kt b/core/src/com/unciv/logic/map/TileInfo.kt index 4b7afcfab4..49eda41cfd 100644 --- a/core/src/com/unciv/logic/map/TileInfo.kt +++ b/core/src/com/unciv/logic/map/TileInfo.kt @@ -74,7 +74,7 @@ open class TileInfo { var roadStatus = RoadStatus.None var turnsToImprovement: Int = 0 - fun isHill() = baseTerrain == Constants.hill || terrainFeatures.contains(Constants.hill) + fun isHill() = terrainFeatures.contains(Constants.hill) var hasBottomRightRiver = false var hasBottomRiver = false @@ -560,6 +560,7 @@ open class TileInfo { fun setTerrainTransients() { convertTerrainFeatureToArray() + convertHillToTerrainFeature() if (!ruleset.terrains.containsKey(baseTerrain)) throw Exception() baseTerrainObject = ruleset.terrains[baseTerrain]!! @@ -658,5 +659,17 @@ open class TileInfo { improvement = improvementObject.name } + private fun convertHillToTerrainFeature(){ + if (baseTerrain == Constants.hill && + ruleset.terrains[Constants.hill]?.type == TerrainType.TerrainFeature){ + baseTerrain = Constants.grassland + //We have to add hill as first terrain feature + val copy = terrainFeatures.toTypedArray() + terrainFeatures.clear() + terrainFeatures.add(Constants.hill) + terrainFeatures.addAll(copy) + } + } + //endregion } diff --git a/core/src/com/unciv/logic/map/mapgenerator/MapGenerator.kt b/core/src/com/unciv/logic/map/mapgenerator/MapGenerator.kt index b6b9a4908a..70e0bd82a4 100644 --- a/core/src/com/unciv/logic/map/mapgenerator/MapGenerator.kt +++ b/core/src/com/unciv/logic/map/mapgenerator/MapGenerator.kt @@ -189,7 +189,7 @@ class MapGenerator(val ruleset: Ruleset) { when { elevation <= 0.5 -> tile.baseTerrain = Constants.plains - elevation <= 0.7 -> tile.baseTerrain = Constants.hill + elevation <= 0.7 -> tile.terrainFeatures.add(Constants.hill) elevation <= 1.0 -> tile.baseTerrain = Constants.mountain } tile.setTerrainTransients() @@ -258,12 +258,13 @@ class MapGenerator(val ruleset: Ruleset) { private fun spawnVegetation(tileMap: TileMap) { val vegetationSeed = randomness.RNG.nextInt().toDouble() val candidateTerrains = Constants.vegetation.flatMap{ ruleset.terrains[it]!!.occursOn } - for (tile in tileMap.values.asSequence().filter { it.baseTerrain in candidateTerrains && it.terrainFeatures.isEmpty() - && (!it.isHill() || Constants.hill in candidateTerrains) }) { + //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) - tile.terrainFeatures.add(Constants.vegetation.filter { ruleset.terrains[it]!!.occursOn.contains(tile.baseTerrain) }.random(randomness.RNG)) + tile.terrainFeatures.add(Constants.vegetation.filter { ruleset.terrains[it]!!.occursOn.contains(tile.getLastTerrain().name) }.random(randomness.RNG)) } } /** diff --git a/tests/src/com/unciv/logic/map/TileImprovementConstructionTests.kt b/tests/src/com/unciv/logic/map/TileImprovementConstructionTests.kt index 1ba3dc6fdc..b40c03156b 100644 --- a/tests/src/com/unciv/logic/map/TileImprovementConstructionTests.kt +++ b/tests/src/com/unciv/logic/map/TileImprovementConstructionTests.kt @@ -40,6 +40,7 @@ class TileImprovementConstructionTests { for (improvement in ruleSet.tileImprovements.values) { val terrain = improvement.terrainsCanBeBuiltOn.firstOrNull() ?: continue tile.baseTerrain = terrain + tile.terrainFeatures.clear() tile.setTransients() if (improvement.uniqueTo != null) civInfo.civName = improvement.uniqueTo!! val canBeBuilt = tile.canBuildImprovement(improvement, civInfo) diff --git a/tests/src/com/unciv/logic/map/UnitMovementAlgorithmsTests.kt b/tests/src/com/unciv/logic/map/UnitMovementAlgorithmsTests.kt index 2135064af9..4d5adfbfe4 100644 --- a/tests/src/com/unciv/logic/map/UnitMovementAlgorithmsTests.kt +++ b/tests/src/com/unciv/logic/map/UnitMovementAlgorithmsTests.kt @@ -44,6 +44,7 @@ class UnitMovementAlgorithmsTests { fun canPassThroughPassableTerrains() { for (terrain in ruleSet.terrains.values) { tile.baseTerrain = terrain.name + tile.terrainFeatures.clear() tile.setTransients() unit.baseUnit = BaseUnit().apply { unitType = UnitType.Melee }