From bb8c9d317598e22aac2a3d9d812a85ef69b553cc Mon Sep 17 00:00:00 2001 From: yairm210 Date: Sun, 26 Sep 2021 17:16:50 +0300 Subject: [PATCH] More unique typing --- core/src/com/unciv/logic/city/CityInfo.kt | 3 +++ core/src/com/unciv/logic/city/CityStats.kt | 16 +++++++--------- core/src/com/unciv/logic/map/TileInfo.kt | 2 +- .../unciv/logic/map/UnitMovementAlgorithms.kt | 1 - .../models/ruleset/unique/UniqueParameterType.kt | 8 ++++++++ .../unciv/models/ruleset/unique/UniqueType.kt | 11 +++++++++++ 6 files changed, 30 insertions(+), 11 deletions(-) diff --git a/core/src/com/unciv/logic/city/CityInfo.kt b/core/src/com/unciv/logic/city/CityInfo.kt index 051591b76e..f9cc493234 100644 --- a/core/src/com/unciv/logic/city/CityInfo.kt +++ b/core/src/com/unciv/logic/city/CityInfo.kt @@ -391,6 +391,9 @@ class CityInfo { fun containsBuildingUnique(unique: String) = cityConstructions.getBuiltBuildings().any { it.uniques.contains(unique) } + fun containsBuildingUnique(uniqueType: UniqueType) = + cityConstructions.getBuiltBuildings().flatMap { it.uniqueObjects }.any { it.isOfType(uniqueType) } + fun getGreatPersonPointsForNextTurn(): HashMap> { val sourceToGPP = HashMap>() diff --git a/core/src/com/unciv/logic/city/CityStats.kt b/core/src/com/unciv/logic/city/CityStats.kt index 429f350ed9..c92d502250 100644 --- a/core/src/com/unciv/logic/city/CityStats.kt +++ b/core/src/com/unciv/logic/city/CityStats.kt @@ -44,7 +44,7 @@ class CityStats(val cityInfo: CityInfo) { val stats = Stats() for (cell in cityInfo.tilesInRange .filter { cityInfo.location == it.position || cityInfo.isWorked(it) || - it.getTileImprovement()?.hasUnique("Tile provides yield without assigned population")==true && it.owningCity == cityInfo }) + it.getTileImprovement()?.hasUnique(UniqueType.TileProvidesYieldWithoutPopulation)==true && it.owningCity == cityInfo }) stats.add(cell.getTileStats(cityInfo, cityInfo.civInfo)) return stats } @@ -127,13 +127,11 @@ class CityStats(val cityInfo: CityInfo) { if (bonus.isOfType(UniqueType.CityStateStatsPerCity) && cityInfo.matchesFilter(bonus.params[1]) && bonus.conditionalsApply(otherCiv, cityInfo) - ) { - stats.add(bonus.stats) - } + ) stats.add(bonus.stats) } } - for (unique in cityInfo.civInfo.getMatchingUniques("[]% [] from City-States")) { + for (unique in cityInfo.civInfo.getMatchingUniques(UniqueType.BonusStatsFromCityStates)) { stats[Stat.valueOf(unique.params[1])] *= unique.params[0].toPercent() } } @@ -170,17 +168,17 @@ class CityStats(val cityInfo: CityInfo) { private fun getGrowthBonusFromPoliciesAndWonders(): Float { var bonus = 0f // "[amount]% growth [cityFilter]" - for (unique in cityInfo.getMatchingUniques("[]% growth []")) { + for (unique in cityInfo.getMatchingUniques(UniqueType.GrowthPercentBonus)) { if (!unique.conditionalsApply(cityInfo.civInfo, cityInfo)) continue if (cityInfo.matchesFilter(unique.params[1])) bonus += unique.params[0].toFloat() } // Deprecated since 3.16.14 - for (unique in cityInfo.getMatchingUniques("+[]% growth []")) { + for (unique in cityInfo.getMatchingUniques(UniqueType.GrowthPercentBonusPositive)) { if (cityInfo.matchesFilter(unique.params[1])) bonus += unique.params[0].toFloat() } - for (unique in cityInfo.getMatchingUniques("+[]% growth [] when not at war")) + for (unique in cityInfo.getMatchingUniques(UniqueType.GrowthPercentBonusWhenNotAtWar)) if (cityInfo.matchesFilter(unique.params[1]) && !cityInfo.civInfo.isAtWar()) bonus += unique.params[0].toFloat() // @@ -189,7 +187,7 @@ class CityStats(val cityInfo: CityInfo) { fun hasExtraAnnexUnhappiness(): Boolean { if (cityInfo.civInfo.civName == cityInfo.foundingCiv || cityInfo.isPuppet) return false - return !cityInfo.containsBuildingUnique("Remove extra unhappiness from annexed cities") + return !cityInfo.containsBuildingUnique(UniqueType.RemoveAnnexUnhappiness) } fun getStatsOfSpecialist(specialistName: String): Stats { diff --git a/core/src/com/unciv/logic/map/TileInfo.kt b/core/src/com/unciv/logic/map/TileInfo.kt index 250ac8bb25..dc3b84d836 100644 --- a/core/src/com/unciv/logic/map/TileInfo.kt +++ b/core/src/com/unciv/logic/map/TileInfo.kt @@ -203,7 +203,7 @@ open class TileInfo { fun isWorked(): Boolean = getWorkingCity() != null fun providesYield() = getCity() != null && (isCityCenter() || isWorked() - || getTileImprovement()?.hasUnique("Tile provides yield without assigned population") == true) + || getTileImprovement()?.hasUnique(UniqueType.TileProvidesYieldWithoutPopulation) == true) fun isLocked(): Boolean { val workingCity = getWorkingCity() diff --git a/core/src/com/unciv/logic/map/UnitMovementAlgorithms.kt b/core/src/com/unciv/logic/map/UnitMovementAlgorithms.kt index 8a0160228a..5b6fc9bf98 100644 --- a/core/src/com/unciv/logic/map/UnitMovementAlgorithms.kt +++ b/core/src/com/unciv/logic/map/UnitMovementAlgorithms.kt @@ -456,7 +456,6 @@ class UnitMovementAlgorithms(val unit:MapUnit) { unit.currentMovement -= distanceToTiles[lastReachedEnterableTile]!!.totalDistance if (unit.currentMovement < Constants.minimumMovementEpsilon) unit.currentMovement = 0f // silly floats which are "almost zero" - // const Epsilon, anyone? } // The .toList() here is because we have a sequence that's running on the units in the tile, diff --git a/core/src/com/unciv/models/ruleset/unique/UniqueParameterType.kt b/core/src/com/unciv/models/ruleset/unique/UniqueParameterType.kt index f2e14bbeb3..048b0ba61a 100644 --- a/core/src/com/unciv/models/ruleset/unique/UniqueParameterType.kt +++ b/core/src/com/unciv/models/ruleset/unique/UniqueParameterType.kt @@ -3,6 +3,7 @@ package com.unciv.models.ruleset.unique import com.unciv.models.ruleset.Ruleset import com.unciv.models.ruleset.tile.ResourceType import com.unciv.models.ruleset.tile.TerrainType +import com.unciv.models.stats.Stat // parameterName values should be compliant with autogenerated values in TranslationFileWriter.generateStringsFromJSONs // Eventually we'll merge the translation generation to take this as the source of that @@ -51,6 +52,13 @@ enum class UniqueParameterType(val parameterName:String) { return null } }, + StatName("stat"){ + override fun getErrorSeverity(parameterText: String, ruleset: Ruleset): + UniqueType.UniqueComplianceErrorSeverity? { + if (Stat.values().any { it.name == parameterText }) return null + return UniqueType.UniqueComplianceErrorSeverity.RulesetInvariant + } + }, CityFilter("cityFilter"){ override fun getErrorSeverity(parameterText: String, ruleset: Ruleset): UniqueType.UniqueComplianceErrorSeverity? { diff --git a/core/src/com/unciv/models/ruleset/unique/UniqueType.kt b/core/src/com/unciv/models/ruleset/unique/UniqueType.kt index 70870f1269..ed34736b5d 100644 --- a/core/src/com/unciv/models/ruleset/unique/UniqueType.kt +++ b/core/src/com/unciv/models/ruleset/unique/UniqueType.kt @@ -69,6 +69,17 @@ enum class UniqueType(val text:String, vararg targets: UniqueTarget) { FreeUnits("[amount] units cost no maintenance", UniqueTarget.Global), UnitMaintenanceDiscount("[amount]% maintenance costs for [mapUnitFilter] units", UniqueTarget.Global), + BonusStatsFromCityStates("[amount]% [stat] from City-States", UniqueTarget.Global), + RemoveAnnexUnhappiness("Remove extra unhappiness from annexed cities", UniqueTarget.Building), + + GrowthPercentBonus("[amount]% growth [cityFilter]", UniqueTarget.Global), + @Deprecated("As of 3.16.14", ReplaceWith("[amount]% growth [cityFilter]"), DeprecationLevel.WARNING) + GrowthPercentBonusPositive("+[amount]% growth [cityFilter]", UniqueTarget.Global), + @Deprecated("As of 3.16.14", ReplaceWith("[amount]% growth [cityFilter] "), DeprecationLevel.WARNING) + GrowthPercentBonusWhenNotAtWar("+[amount]% growth [cityFilter] when not at war", UniqueTarget.Global), + + TileProvidesYieldWithoutPopulation("Tile provides yield without assigned population", UniqueTarget.Improvement), + @Deprecated("As of 3.16.16", ReplaceWith("[amount]% maintenance costs for [mapUnitFilter] units"), DeprecationLevel.WARNING) DecreasedUnitMaintenanceCostsByFilter("-[amount]% [mapUnitFilter] unit maintenance costs"), // No conditional support