Forest chopping moddability (#13072)

* Update ModConstants.kt

* Update UniqueType.kt

* Update TileImprovementFunctions.kt

* Update Terrains.json

* Update Terrains.json

* Update TileImprovementFunctions.kt

* Update TileImprovementFunctions.kt

* Update TileImprovementFunctions.kt

* Update Terrains.json

* Update Terrains.json

* Update UniqueType.kt

* Update TileImprovementFunctions.kt

* Update TileImprovementFunctions.kt

* Update TileImprovementFunctions.kt

* Update TileImprovementFunctions.kt

* Update TileImprovementFunctions.kt

* Update TileImprovementFunctions.kt

* Game speed modifier

* Add meta modifier (WIP)

* Update

* Update UniqueType.kt

* Rename

* Float

* Revert modifier

* Update Unique.kt

* Update TileImprovementFunctions.kt

* Update TileImprovementFunctions.kt
This commit is contained in:
EmperorPinguin 2025-03-25 10:37:31 +01:00 committed by GitHub
parent c3e44daa4c
commit 1c03133fdc
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
4 changed files with 17 additions and 10 deletions

View File

@ -188,7 +188,7 @@
"defenceBonus": 0.25, "defenceBonus": 0.25,
"occursOn": ["Tundra","Plains","Grassland","Hill"], "occursOn": ["Tundra","Plains","Grassland","Hill"],
"uniques": ["Rough terrain", "Vegetation", "uniques": ["Rough terrain", "Vegetation",
"Provides a one-time Production bonus to the closest city when cut down", "Provides a one-time bonus of [+30 Production] to the closest city when cut down <(modified by game speed)>",
"Blocks line-of-sight from tiles at same elevation", "Blocks line-of-sight from tiles at same elevation",
"[25]% Chance to 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 [30]% [Forest] tiles, with priority [3]",

View File

@ -188,7 +188,7 @@
"occursOn": ["Tundra","Plains","Grassland","Hill"], "occursOn": ["Tundra","Plains","Grassland","Hill"],
"uniques": [ "uniques": [
"Rough terrain", "Vegetation", "Rough terrain", "Vegetation",
"Provides a one-time Production bonus to the closest city when cut down", "Provides a one-time bonus of [+30 Production] to the closest city when cut down <(modified by game speed)>",
"Blocks line-of-sight from tiles at same elevation", "Blocks line-of-sight from tiles at same elevation",
"[25]% Chance to 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 [30]% [Forest] tiles, with priority [3]",

View File

@ -10,6 +10,7 @@ import com.unciv.models.ruleset.tile.TileImprovement
import com.unciv.models.ruleset.unique.StateForConditionals import com.unciv.models.ruleset.unique.StateForConditionals
import com.unciv.models.ruleset.unique.UniqueTriggerActivation import com.unciv.models.ruleset.unique.UniqueTriggerActivation
import com.unciv.models.ruleset.unique.UniqueType import com.unciv.models.ruleset.unique.UniqueType
import com.unciv.models.stats.Stats
/** Reason why an Improvement cannot be built by a given civ */ /** Reason why an Improvement cannot be built by a given civ */
@ -312,20 +313,26 @@ class TileImprovementFunctions(val tile: Tile) {
val closestCity = civ.cities.minByOrNull { it.getCenterTile().aerialDistanceTo(tile) } val closestCity = civ.cities.minByOrNull { it.getCenterTile().aerialDistanceTo(tile) }
?: return ?: return
val distance = closestCity.getCenterTile().aerialDistanceTo(tile) val distance = closestCity.getCenterTile().aerialDistanceTo(tile)
var productionPointsToAdd = if (distance == 1) 20 else 20 - (distance - 2) * 5 if (distance > 5) return
if (tile.owningCity == null || tile.owningCity!!.civ != civ) productionPointsToAdd = var stats = Stats()
productionPointsToAdd * 2 / 3 for (unique in tile.getTerrainMatchingUniques(UniqueType.ProductionBonusWhenRemoved)) {
if (productionPointsToAdd > 0) { if (unique.isModifiedByGameSpeed())
closestCity.cityConstructions.addProductionPoints(productionPointsToAdd) stats.add(unique.stats * civ.gameInfo.speed.modifier)
else stats.add(unique.stats)
}
if (stats.isEmpty()) return
if (distance != 1) stats *= (6 - distance) / 4f
if (tile.owningCity == null || tile.owningCity!!.civ != civ) stats *= 2 / 3f
for ((stat, value) in stats) {
closestCity.addStat(stat, value.toInt())
val locations = LocationAction(tile.position, closestCity.location) val locations = LocationAction(tile.position, closestCity.location)
civ.addNotification( civ.addNotification(
"Clearing a [$removedTerrainFeature] has created [$productionPointsToAdd] Production for [${closestCity.name}]", "Clearing a [$removedTerrainFeature] has created [${stats.toStringForNotifications()}] for [${closestCity.name}]",
locations, NotificationCategory.Production, NotificationIcon.Construction locations, NotificationCategory.Production, NotificationIcon.Construction
) )
} }
} }
/** Marks tile as target tile for a building with a [UniqueType.CreatesOneImprovement] unique */ /** Marks tile as target tile for a building with a [UniqueType.CreatesOneImprovement] unique */
fun markForCreatesOneImprovement(improvement: String) { fun markForCreatesOneImprovement(improvement: String) {
tile.stopWorkingOnImprovement() tile.stopWorkingOnImprovement()

View File

@ -562,7 +562,7 @@ enum class UniqueType(
DamagesContainingUnits("Units ending their turn on this terrain take [amount] damage", UniqueTarget.Terrain), DamagesContainingUnits("Units ending their turn on this terrain take [amount] damage", UniqueTarget.Terrain),
TerrainGrantsPromotion("Grants [promotion] ([comment]) to adjacent [mapUnitFilter] units for the rest of the game", UniqueTarget.Terrain), 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), 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), ProductionBonusWhenRemoved("Provides a one-time bonus of [stats] to the closest city when cut down", UniqueTarget.Terrain, flags = setOf(UniqueFlag.AcceptsSpeedModifier)),
Vegetation("Vegetation", UniqueTarget.Terrain, UniqueTarget.Improvement, flags = UniqueFlag.setOfHiddenToUsers), // Improvement included because use as tileFilter works Vegetation("Vegetation", UniqueTarget.Terrain, UniqueTarget.Improvement, flags = UniqueFlag.setOfHiddenToUsers), // Improvement included because use as tileFilter works