diff --git a/core/src/com/unciv/logic/city/CityConstructions.kt b/core/src/com/unciv/logic/city/CityConstructions.kt index 2fc981638a..f175a18d87 100644 --- a/core/src/com/unciv/logic/city/CityConstructions.kt +++ b/core/src/com/unciv/logic/city/CityConstructions.kt @@ -345,6 +345,7 @@ class CityConstructions : IsPartOfGameInfoSerialization { city.civ.addNotification("No space available to place [${construction.name}] near [${city.name}]", city.location, NotificationCategory.Production, construction.name) } + city.civ.civConstructions.builtItemsWithIncreasingCost[construction.name] += 1 } } } diff --git a/core/src/com/unciv/logic/civilization/CivConstructions.kt b/core/src/com/unciv/logic/civilization/CivConstructions.kt index 6168c45b52..72d4126aec 100644 --- a/core/src/com/unciv/logic/civilization/CivConstructions.kt +++ b/core/src/com/unciv/logic/civilization/CivConstructions.kt @@ -21,6 +21,9 @@ class CivConstructions : IsPartOfGameInfoSerialization { /** Maps construction names to the amount of times bought */ val boughtItemsWithIncreasingPrice: Counter = Counter() + /** Maps construction names to the amount of times built */ + val builtItemsWithIncreasingCost: Counter = Counter() + /** Maps cities by id to a set of all free buildings by name they contain. * The building name is the Nation-specific equivalent if available. * Sources: [UniqueType.FreeStatBuildings] **and** [UniqueType.FreeSpecificBuildings] @@ -51,6 +54,7 @@ class CivConstructions : IsPartOfGameInfoSerialization { toReturn.freeStatBuildingsProvided.putAll(freeStatBuildingsProvided) toReturn.freeSpecificBuildingsProvided.putAll(freeSpecificBuildingsProvided) toReturn.boughtItemsWithIncreasingPrice.add(boughtItemsWithIncreasingPrice) // add copies + toReturn.builtItemsWithIncreasingCost.add(builtItemsWithIncreasingCost) return toReturn } diff --git a/core/src/com/unciv/models/ruleset/Building.kt b/core/src/com/unciv/models/ruleset/Building.kt index afd3a7d7e6..75297d2405 100644 --- a/core/src/com/unciv/models/ruleset/Building.kt +++ b/core/src/com/unciv/models/ruleset/Building.kt @@ -105,6 +105,9 @@ class Building : RulesetStatsObject(), INonPerpetualConstruction { override fun getProductionCost(civInfo: Civilization): Int { var productionCost = cost.toFloat() + for (unique in getMatchingUniques(UniqueType.CostIncreasesWhenBuilt, StateForConditionals(civInfo))) + productionCost += civInfo.civConstructions.builtItemsWithIncreasingCost[name] * unique.params[0].toInt() + for (unique in getMatchingUniques(UniqueType.CostIncreasesPerCity, StateForConditionals(civInfo))) productionCost += civInfo.cities.size * unique.params[0].toInt() diff --git a/core/src/com/unciv/models/ruleset/unique/UniqueType.kt b/core/src/com/unciv/models/ruleset/unique/UniqueType.kt index 38938f4550..6b9c7f5cbf 100644 --- a/core/src/com/unciv/models/ruleset/unique/UniqueType.kt +++ b/core/src/com/unciv/models/ruleset/unique/UniqueType.kt @@ -280,7 +280,8 @@ enum class UniqueType( ///////////////////////////////////////// region 03 BUILDING UNIQUES ///////////////////////////////////////// - CostIncreasesPerCity("Cost increases by [amount] per owned city", UniqueTarget.Building), + CostIncreasesPerCity("Cost increases by [amount] per owned city", UniqueTarget.Building, UniqueTarget.Unit), + CostIncreasesWhenBuilt("Cost increases by [amount] when built", UniqueTarget.Building, UniqueTarget.Unit), RequiresBuildingInAllCities("Requires a [buildingFilter] in all cities", UniqueTarget.Building), RequiresBuildingInSomeCities("Requires a [buildingFilter] in at least [amount] cities", UniqueTarget.Building), diff --git a/core/src/com/unciv/models/ruleset/unit/BaseUnitCost.kt b/core/src/com/unciv/models/ruleset/unit/BaseUnitCost.kt index 843f9527b7..f59487094a 100644 --- a/core/src/com/unciv/models/ruleset/unit/BaseUnitCost.kt +++ b/core/src/com/unciv/models/ruleset/unit/BaseUnitCost.kt @@ -11,6 +11,13 @@ class BaseUnitCost(val baseUnit: BaseUnit) { fun getProductionCost(civInfo: Civilization): Int { var productionCost = baseUnit.cost.toFloat() + + for (unique in baseUnit.getMatchingUniques(UniqueType.CostIncreasesPerCity, StateForConditionals(civInfo))) + productionCost += civInfo.cities.size * unique.params[0].toInt() + + for (unique in baseUnit.getMatchingUniques(UniqueType.CostIncreasesWhenBuilt, StateForConditionals(civInfo))) + productionCost += civInfo.civConstructions.builtItemsWithIncreasingCost[baseUnit.name] * unique.params[0].toInt() + if (civInfo.isCityState()) productionCost *= 1.5f productionCost *= if (civInfo.isHuman())