From a6bacca0b7b9bec36935590feb46867268448dd3 Mon Sep 17 00:00:00 2001 From: SeventhM <127357473+SeventhM@users.noreply.github.com> Date: Sun, 22 Dec 2024 00:13:19 -0800 Subject: [PATCH] Add unique for increased improvement rates rather than decreased build times (#12680) * Add unique for increased improvement rates rather than decreased build times * Fix uniques * Ruleset text * Treat mad modder divide by zero --- .../assets/jsons/Civ V - Gods & Kings/Buildings.json | 2 +- .../assets/jsons/Civ V - Gods & Kings/Policies.json | 2 +- android/assets/jsons/Civ V - Vanilla/Buildings.json | 2 +- android/assets/jsons/Civ V - Vanilla/Policies.json | 2 +- .../com/unciv/models/ruleset/tile/TileImprovement.kt | 12 +++++++++--- .../com/unciv/models/ruleset/unique/UniqueType.kt | 1 + 6 files changed, 14 insertions(+), 7 deletions(-) diff --git a/android/assets/jsons/Civ V - Gods & Kings/Buildings.json b/android/assets/jsons/Civ V - Gods & Kings/Buildings.json index bb90963636..8a3ae0cfb2 100644 --- a/android/assets/jsons/Civ V - Gods & Kings/Buildings.json +++ b/android/assets/jsons/Civ V - Gods & Kings/Buildings.json @@ -171,7 +171,7 @@ "culture": 1, "greatPersonPoints": {"Great Engineer": 1}, "isWonder": true, - "uniques": ["[-25]% construction time for [All] improvements","[2] free [Worker] units appear"], + "uniques": ["Can build [all] improvements at a [+25]% rate","[2] free [Worker] units appear"], "requiredTech": "Masonry", "quote": "'O, let not the pains of death which come upon thee enter into my body. I am the god Tem, and I am the foremost part of the sky, and the power which protecteth me is that which is with all the gods forever.' - The Book of the Dead, translated by Sir Ernest Alfred Wallis Budge" }, diff --git a/android/assets/jsons/Civ V - Gods & Kings/Policies.json b/android/assets/jsons/Civ V - Gods & Kings/Policies.json index 4687fe960b..b8ce19313f 100644 --- a/android/assets/jsons/Civ V - Gods & Kings/Policies.json +++ b/android/assets/jsons/Civ V - Gods & Kings/Policies.json @@ -93,7 +93,7 @@ { "name": "Citizenship", "uniques": [ - "[-25]% construction time for [All] improvements", + "Can build [all] improvements at a [+25]% rate", "Free [Worker] appears", "[-100]% weight to this choice for AI decisions" ], diff --git a/android/assets/jsons/Civ V - Vanilla/Buildings.json b/android/assets/jsons/Civ V - Vanilla/Buildings.json index d135732952..81296df36c 100644 --- a/android/assets/jsons/Civ V - Vanilla/Buildings.json +++ b/android/assets/jsons/Civ V - Vanilla/Buildings.json @@ -152,7 +152,7 @@ "culture": 1, "greatPersonPoints": {"Great Engineer": 1}, "isWonder": true, - "uniques": ["[-25]% construction time for [All] improvements","[2] free [Worker] units appear"], + "uniques": ["Can build [all] improvements at a [+25]% rate","[2] free [Worker] units appear"], "requiredTech": "Masonry", "quote": "'O, let not the pains of death which come upon thee enter into my body. I am the god Tem, and I am the foremost part of the sky, and the power which protecteth me is that which is with all the gods forever.' - The Book of the Dead, translated by Sir Ernest Alfred Wallis Budge" }, diff --git a/android/assets/jsons/Civ V - Vanilla/Policies.json b/android/assets/jsons/Civ V - Vanilla/Policies.json index 8c759ff06f..dbf87b4f45 100644 --- a/android/assets/jsons/Civ V - Vanilla/Policies.json +++ b/android/assets/jsons/Civ V - Vanilla/Policies.json @@ -93,7 +93,7 @@ { "name": "Citizenship", "uniques": [ - "[-25]% construction time for [All] improvements", + "Can build [all] improvements at a [+25]% rate", "Free [Worker] appears" ], "row": 1, diff --git a/core/src/com/unciv/models/ruleset/tile/TileImprovement.kt b/core/src/com/unciv/models/ruleset/tile/TileImprovement.kt index 5597e77f0d..fee6f6ca3f 100644 --- a/core/src/com/unciv/models/ruleset/tile/TileImprovement.kt +++ b/core/src/com/unciv/models/ruleset/tile/TileImprovement.kt @@ -31,10 +31,16 @@ class TileImprovement : RulesetStatsObject() { fun getTurnsToBuild(civInfo: Civilization, unit: MapUnit): Int { val state = StateForConditionals(civInfo, unit = unit) + val buildSpeedUniques = unit.getMatchingUniques(UniqueType.SpecificImprovementTime, state, checkCivInfoUniques = true) - .filter { matchesFilter(it.params[1], state) } - return buildSpeedUniques - .fold(turnsToBuild.toFloat() * civInfo.gameInfo.speed.improvementBuildLengthModifier) { calculatedTurnsToBuild, unique -> + .filter { matchesFilter(it.params[1], state) } + val buildSpeedIncreases = unit.getMatchingUniques(UniqueType.ImprovementTimeIncrease, state, checkCivInfoUniques = true) + .filter { matchesFilter(it.params[0], state) } + val increase = buildSpeedIncreases.sumOf { it.params[1].toDouble() }.toFloat().toPercent() + val buildTime = if (increase == 0f) 0f + else (civInfo.gameInfo.speed.improvementBuildLengthModifier * turnsToBuild / increase) + + return buildSpeedUniques.fold(buildTime) { calculatedTurnsToBuild, unique -> calculatedTurnsToBuild * unique.params[0].toPercent() }.roundToInt() .coerceAtLeast(1) diff --git a/core/src/com/unciv/models/ruleset/unique/UniqueType.kt b/core/src/com/unciv/models/ruleset/unique/UniqueType.kt index f2bada66e1..b87fa7c550 100644 --- a/core/src/com/unciv/models/ruleset/unique/UniqueType.kt +++ b/core/src/com/unciv/models/ruleset/unique/UniqueType.kt @@ -133,6 +133,7 @@ enum class UniqueType( RoadMaintenance("[relativeAmount]% maintenance on road & railroads", UniqueTarget.Global), NoImprovementMaintenanceInSpecificTiles("No Maintenance costs for improvements in [tileFilter] tiles", UniqueTarget.Global), SpecificImprovementTime("[relativeAmount]% construction time for [improvementFilter] improvements", UniqueTarget.Global, UniqueTarget.Unit), + ImprovementTimeIncrease("Can build [improvementFilter] improvements at a [relativeAmount]% rate", UniqueTarget.Global, UniqueTarget.Unit), /// Building Maintenance GainFreeBuildings("Gain a free [buildingName] [cityFilter]", UniqueTarget.Global, UniqueTarget.Triggerable,