From 367a4274365c788cbf268207b1d359cea7b7fbb2 Mon Sep 17 00:00:00 2001 From: Xander Lenstra <71121390+xlenstra@users.noreply.github.com> Date: Mon, 21 Mar 2022 20:05:54 +0100 Subject: [PATCH] Unified two uniques into one more descriptive unique (#6380) * Unified two uniques into one more descriptive unique * Fixed fallout generation & typo --- .../jsons/Civ V - Gods & Kings/Terrains.json | 24 +++++++------ .../jsons/Civ V - Vanilla/Terrains.json | 16 +++++---- core/src/com/unciv/logic/battle/Battle.kt | 36 ++++++++++++++----- .../unciv/models/ruleset/unique/UniqueType.kt | 19 +++++----- docs/Modders/uniques.md | 21 ++++++----- 5 files changed, 70 insertions(+), 46 deletions(-) diff --git a/android/assets/jsons/Civ V - Gods & Kings/Terrains.json b/android/assets/jsons/Civ V - Gods & Kings/Terrains.json index 51e3c73614..54c98a808f 100644 --- a/android/assets/jsons/Civ V - Gods & Kings/Terrains.json +++ b/android/assets/jsons/Civ V - Gods & Kings/Terrains.json @@ -181,7 +181,7 @@ "uniques": ["Rough terrain", "Provides a one-time Production bonus to the closest city when cut down", "Blocks line-of-sight from tiles at same elevation", - "Resistant to nukes", "Can be destroyed by nukes", + "[25]% Chance to be destroyed by nukes", "A Region is formed with at least [30]% [Forest] tiles, with priority [3]", "A Region is formed with at least [35]% [Forest] tiles and [Jungle] tiles, with priority [3]", "A Region can not contain more [Jungle] tiles than [Forest] tiles", @@ -201,16 +201,18 @@ "unbuildable": true, "defenceBonus": 0.25, "occursOn": ["Plains","Grassland"], - "uniques": ["Rough terrain", - "Blocks line-of-sight from tiles at same elevation", - "Resistant to nukes", "Can be destroyed by nukes", - "[-1] to Fertility for Map Generation", - "A Region is formed with at least [30]% [Jungle] tiles, with priority [2]", - "A Region is formed with at least [35]% [Jungle] tiles and [Forest] tiles, with priority [2]", - "A Region can not contain more [Forest] tiles than [Jungle] tiles", - "Considered [Food] when determining start locations ", - "Considered [Desirable] when determining start locations ", - "Every [33] tiles with this terrain will receive a major deposit of a strategic resource."] + "uniques": [ + "Rough terrain", + "Blocks line-of-sight from tiles at same elevation", + "[25]% Chance to be destroyed by nukes", + "[-1] to Fertility for Map Generation", + "A Region is formed with at least [30]% [Jungle] tiles, with priority [2]", + "A Region is formed with at least [35]% [Jungle] tiles and [Forest] tiles, with priority [2]", + "A Region can not contain more [Forest] tiles than [Jungle] tiles", + "Considered [Food] when determining start locations ", + "Considered [Desirable] when determining start locations ", + "Every [33] tiles with this terrain will receive a major deposit of a strategic resource." + ] }, { "name": "Marsh", diff --git a/android/assets/jsons/Civ V - Vanilla/Terrains.json b/android/assets/jsons/Civ V - Vanilla/Terrains.json index 2752bf9662..1936493f70 100644 --- a/android/assets/jsons/Civ V - Vanilla/Terrains.json +++ b/android/assets/jsons/Civ V - Vanilla/Terrains.json @@ -178,10 +178,11 @@ "unbuildable": true, "defenceBonus": 0.25, "occursOn": ["Tundra","Plains","Grassland","Hill"], - "uniques": ["Rough terrain", + "uniques": [ + "Rough terrain", "Provides a one-time Production bonus to the closest city when cut down", "Blocks line-of-sight from tiles at same elevation", - "Resistant to nukes", "Can be destroyed by nukes", + "[25]% Chance to be destroyed by nukes", "A Region is formed with at least [30]% [Forest] tiles, with priority [3]", "A Region is formed with at least [35]% [Forest] tiles and [Jungle] tiles, with priority [3]", "A Region can not contain more [Jungle] tiles than [Forest] tiles", @@ -189,7 +190,8 @@ "Considered [Production] when determining start locations", "Considered [Food] when determining start locations ", "Considered [Food] when determining start locations ", - "Every [39] tiles with this terrain will receive a major deposit of a strategic resource."], + "Every [39] tiles with this terrain will receive a major deposit of a strategic resource." + ], "civilopediaText": [{"text":"A Camp can be built here without cutting it down", "link":"Improvement/Camp"}] }, { @@ -201,16 +203,18 @@ "unbuildable": true, "defenceBonus": 0.25, "occursOn": ["Plains","Grassland"], - "uniques": ["Rough terrain", + "uniques": [ + "Rough terrain", "Blocks line-of-sight from tiles at same elevation", - "Resistant to nukes", "Can be destroyed by nukes", + "[25]% Chance to be destroyed by nukes", "[-1] to Fertility for Map Generation", "A Region is formed with at least [30]% [Jungle] tiles, with priority [2]", "A Region is formed with at least [35]% [Jungle] tiles and [Forest] tiles, with priority [2]", "A Region can not contain more [Forest] tiles than [Jungle] tiles", "Considered [Food] when determining start locations ", "Considered [Desirable] when determining start locations ", - "Every [33] tiles with this terrain will receive a major deposit of a strategic resource."] + "Every [33] tiles with this terrain will receive a major deposit of a strategic resource." + ] }, { "name": "Marsh", diff --git a/core/src/com/unciv/logic/battle/Battle.kt b/core/src/com/unciv/logic/battle/Battle.kt index 058a09d9fb..251a2ab438 100644 --- a/core/src/com/unciv/logic/battle/Battle.kt +++ b/core/src/com/unciv/logic/battle/Battle.kt @@ -648,7 +648,7 @@ object Battle { for (tile in hitTiles) { // Handle complicated effects - doNukeExplosion(attacker, tile, strength) + doNukeExplosionForTile(attacker, tile, strength) } // Instead of postBattleAction() just destroy the unit, all other functions are not relevant @@ -665,7 +665,7 @@ object Battle { } } - private fun doNukeExplosion(attacker: MapUnitCombatant, tile: TileInfo, nukeStrength: Int) { + private fun doNukeExplosionForTile(attacker: MapUnitCombatant, tile: TileInfo, nukeStrength: Int) { // https://forums.civfanatics.com/resources/unit-guide-modern-future-units-g-k.25628/ // https://www.carlsguides.com/strategy/civilization5/units/aircraft-nukes.ph // Testing done by Ravignir @@ -707,15 +707,33 @@ object Battle { tile.improvement = null } tile.roadStatus = RoadStatus.None - if (tile.isLand && !tile.isImpassible() && !tile.terrainFeatures.contains("Fallout")) { - val destructionChance = if (tile.hasUnique(UniqueType.ResistsNukes)) 0.25f - else 0.5f - if (Random().nextFloat() < destructionChance) { - for (terrainFeature in tile.terrainFeatureObjects) - if (terrainFeature.hasUnique(UniqueType.DestroyableByNukes)) - tile.removeTerrainFeature(terrainFeature.name) + if (tile.isLand && !tile.isImpassible()) { + if (tile.hasUnique(UniqueType.DestroyableByNukesChance)) { + for (terrainFeature in tile.terrainFeatureObjects) { + for (unique in terrainFeature.getMatchingUniques(UniqueType.DestroyableByNukesChance)) { + if (Random().nextFloat() < unique.params[0].toFloat() / 100f) { + tile.removeTerrainFeature(terrainFeature.name) + if (!tile.terrainFeatures.contains("Fallout") && !tile.hasUnique(UniqueType.Indestructible)) + tile.addTerrainFeature("Fallout") + } + } + } + } else if (Random().nextFloat() < 0.5f && !tile.terrainFeatures.contains("Fallout") && !tile.hasUnique(UniqueType.Indestructible)) { tile.addTerrainFeature("Fallout") } + if (!tile.hasUnique(UniqueType.DestroyableByNukes)) return; + + // Deprecated as of 3.19.19 -- If removed, the two successive `if`s above should be merged + val destructionChance = if (tile.hasUnique(UniqueType.ResistsNukes)) 0.25f + else 0.5f + if (Random().nextFloat() < destructionChance) { + for (terrainFeature in tile.terrainFeatureObjects) + if (terrainFeature.hasUnique(UniqueType.DestroyableByNukes)) + tile.removeTerrainFeature(terrainFeature.name) + if (!tile.hasUnique(UniqueType.Indestructible)) + tile.addTerrainFeature("Fallout") + } + // } } diff --git a/core/src/com/unciv/models/ruleset/unique/UniqueType.kt b/core/src/com/unciv/models/ruleset/unique/UniqueType.kt index 551941c146..1a8913ba5a 100644 --- a/core/src/com/unciv/models/ruleset/unique/UniqueType.kt +++ b/core/src/com/unciv/models/ruleset/unique/UniqueType.kt @@ -532,14 +532,6 @@ enum class UniqueType(val text: String, vararg targets: UniqueTarget, val flags: HasQuality("Considered [terrainQuality] when determining start locations", UniqueTarget.Terrain, flags = UniqueFlag.setOfHiddenToUsers), - ResourceWeighting("Generated with weight [amount]", UniqueTarget.Resource, flags = UniqueFlag.setOfHiddenToUsers), - MinorDepositWeighting("Minor deposits generated with weight [amount]", UniqueTarget.Resource, flags = UniqueFlag.setOfHiddenToUsers), - LuxuryWeightingForCityStates("Generated near City States with weight [amount]", UniqueTarget.Resource, flags = UniqueFlag.setOfHiddenToUsers), - LuxurySpecialPlacement("Special placement during map generation", UniqueTarget.Resource, flags = UniqueFlag.setOfHiddenToUsers), - ResourceFrequency("Generated on every [amount] tiles", UniqueTarget.Resource, flags = UniqueFlag.setOfHiddenToUsers), - - StrategicBalanceResource("Guaranteed with Strategic Balance resource option", UniqueTarget.Resource), - NoNaturalGeneration("Doesn't generate naturally", UniqueTarget.Terrain, UniqueTarget.Resource, flags = UniqueFlag.setOfHiddenToUsers), TileGenerationConditions("Occurs at temperature between [amount] and [amount] and humidity between [amount] and [amount]", UniqueTarget.Terrain, flags = UniqueFlag.setOfHiddenToUsers), OccursInChains("Occurs in chains at high elevations", UniqueTarget.Terrain, flags = UniqueFlag.setOfHiddenToUsers), @@ -548,7 +540,10 @@ enum class UniqueType(val text: String, vararg targets: UniqueTarget, val flags: RareFeature("Rare feature", UniqueTarget.Terrain), + DestroyableByNukesChance("[amount]% chance to be destroyed by nukes", UniqueTarget.Terrain), + @Deprecated("as of 3.19.19", ReplaceWith("[25]% chance to be destroyed by nukes")) ResistsNukes("Resistant to nukes", UniqueTarget.Terrain), + @Deprecated("as of 3.19.19", ReplaceWith("[50]% chance to be destroyed by nukes")) DestroyableByNukes("Can be destroyed by nukes", UniqueTarget.Terrain), FreshWater(Constants.freshWater, UniqueTarget.Terrain), @@ -557,7 +552,13 @@ enum class UniqueType(val text: String, vararg targets: UniqueTarget, val flags: /////// Resource uniques ResourceAmountOnTiles("Deposits in [tileFilter] tiles always provide [amount] resources", UniqueTarget.Resource), CityStateOnlyResource("Can only be created by Mercantile City-States", UniqueTarget.Resource), - + + ResourceWeighting("Generated with weight [amount]", UniqueTarget.Resource, flags = UniqueFlag.setOfHiddenToUsers), + MinorDepositWeighting("Minor deposits generated with weight [amount]", UniqueTarget.Resource, flags = UniqueFlag.setOfHiddenToUsers), + LuxuryWeightingForCityStates("Generated near City States with weight [amount]", UniqueTarget.Resource, flags = UniqueFlag.setOfHiddenToUsers), + LuxurySpecialPlacement("Special placement during map generation", UniqueTarget.Resource, flags = UniqueFlag.setOfHiddenToUsers), + ResourceFrequency("Generated on every [amount] tiles", UniqueTarget.Resource, flags = UniqueFlag.setOfHiddenToUsers), + StrategicBalanceResource("Guaranteed with Strategic Balance resource option", UniqueTarget.Resource), ////// Improvement uniques ImprovementBuildableByFreshWater("Can also be built on tiles adjacent to fresh water", UniqueTarget.Improvement), diff --git a/docs/Modders/uniques.md b/docs/Modders/uniques.md index abe4ff2404..69edb0c78c 100644 --- a/docs/Modders/uniques.md +++ b/docs/Modders/uniques.md @@ -1246,10 +1246,9 @@ Simple unique parameters are explained by mouseover. Complex parameters are expl ??? example "Rare feature" Applicable to: Terrain -??? example "Resistant to nukes" - Applicable to: Terrain +??? example "[amount]% chance to be destroyed by nukes" + Example: "[20]% chance to be destroyed by nukes" -??? example "Can be destroyed by nukes" Applicable to: Terrain ??? example "Fresh water" @@ -1324,6 +1323,14 @@ Simple unique parameters are explained by mouseover. Complex parameters are expl Applicable to: Improvement ## Resource uniques +??? example "Deposits in [tileFilter] tiles always provide [amount] resources" + Example: "Deposits in [Farm] tiles always provide [20] resources" + + Applicable to: Resource + +??? example "Can only be created by Mercantile City-States" + Applicable to: Resource + ??? example "Generated with weight [amount]" Example: "Generated with weight [20]" @@ -1350,14 +1357,6 @@ Simple unique parameters are explained by mouseover. Complex parameters are expl ??? example "Guaranteed with Strategic Balance resource option" Applicable to: Resource -??? example "Deposits in [tileFilter] tiles always provide [amount] resources" - Example: "Deposits in [Farm] tiles always provide [20] resources" - - Applicable to: Resource - -??? example "Can only be created by Mercantile City-States" - Applicable to: Resource - ## Ruins uniques ??? example "Free [baseUnitFilter] found in the ruins" Example: "Free [Melee] found in the ruins"