From 9595247d3bdcfefdc0a6f56a2022b223bd18d705 Mon Sep 17 00:00:00 2001 From: Yair Morgenstern Date: Sun, 20 Feb 2022 21:17:58 +0200 Subject: [PATCH] Finished unique typing for CivInfo.hasUnique() and removed string version! Damn but there are a LOT of uniques that have accumulated over time --- core/src/com/unciv/logic/battle/Battle.kt | 4 ++-- .../com/unciv/logic/city/CityInfoConquestFunctions.kt | 2 +- core/src/com/unciv/logic/city/CityStats.kt | 4 ++-- core/src/com/unciv/logic/civilization/CivInfoStats.kt | 2 +- .../logic/civilization/CivInfoTransientUpdater.kt | 6 +++--- .../com/unciv/logic/civilization/CivilizationInfo.kt | 1 - .../com/unciv/logic/civilization/ReligionManager.kt | 2 +- core/src/com/unciv/logic/map/MapUnit.kt | 2 +- core/src/com/unciv/models/ruleset/unique/UniqueType.kt | 10 +++++++++- 9 files changed, 20 insertions(+), 13 deletions(-) diff --git a/core/src/com/unciv/logic/battle/Battle.kt b/core/src/com/unciv/logic/battle/Battle.kt index 9900df2a5b..18f9fa0f5f 100644 --- a/core/src/com/unciv/logic/battle/Battle.kt +++ b/core/src/com/unciv/logic/battle/Battle.kt @@ -338,7 +338,7 @@ object Battle { // German unique - needs to be checked before we try to move to the enemy tile, since the encampment disappears after we move in if (defender.isDefeated() - && attacker.getCivInfo().hasUnique("67% chance to earn 25 Gold and recruit a Barbarian unit from a conquered encampment") + && attacker.getCivInfo().hasUnique(UniqueType.ChanceToRecruitBarbarianFromEncampment) && Random().nextDouble() < 0.67) { attacker.getCivInfo().placeUnitNearTile(attackedTile.position, defender.getName()) attacker.getCivInfo().addGold(25) @@ -350,7 +350,7 @@ object Battle { } // Similarly, Ottoman unique - if (attacker.getCivInfo().hasUnique("50% chance of capturing defeated Barbarian naval units and earning 25 Gold") + if (attacker.getCivInfo().hasUnique(UniqueType.ChanceToRecruitNavalBarbarian) && defender.isDefeated() && defender is MapUnitCombatant && defender.unit.baseUnit.isWaterUnit() diff --git a/core/src/com/unciv/logic/city/CityInfoConquestFunctions.kt b/core/src/com/unciv/logic/city/CityInfoConquestFunctions.kt index a00e8a453c..ea305a746a 100644 --- a/core/src/com/unciv/logic/city/CityInfoConquestFunctions.kt +++ b/core/src/com/unciv/logic/city/CityInfoConquestFunctions.kt @@ -26,7 +26,7 @@ class CityInfoConquestFunctions(val city: CityInfo){ val baseGold = 20 + 10 * city.population.population + tileBasedRandom.nextInt(40) val turnModifier = max(0, min(50, city.civInfo.gameInfo.turns - city.turnAcquired)) / 50f val cityModifier = if (city.containsBuildingUnique("Doubles Gold given to enemy if city is captured")) 2f else 1f - val conqueringCivModifier = if (conqueringCiv.hasUnique("Receive triple Gold from Barbarian encampments and pillaging Cities")) 3f else 1f + val conqueringCivModifier = if (conqueringCiv.hasUnique(UniqueType.TripleGoldFromEncampmentsAndCities)) 3f else 1f val goldPlundered = baseGold * turnModifier * cityModifier * conqueringCivModifier return goldPlundered.toInt() diff --git a/core/src/com/unciv/logic/city/CityStats.kt b/core/src/com/unciv/logic/city/CityStats.kt index 1f85a24394..e8770b2651 100644 --- a/core/src/com/unciv/logic/city/CityStats.kt +++ b/core/src/com/unciv/logic/city/CityStats.kt @@ -90,7 +90,7 @@ class CityStats(val cityInfo: CityInfo) { stats.gold = civInfo.getCapital().population.population * 0.15f + cityInfo.population.population * 1.1f - 1 // Calculated by http://civilization.wikia.com/wiki/Trade_route_(Civ5) for (unique in cityInfo.getMatchingUniques(UniqueType.StatsFromTradeRoute)) stats.add(unique.stats) - if (civInfo.hasUnique("Gold from all trade routes +25%")) stats.gold *= 1.25f // Machu Picchu speciality + if (civInfo.hasUnique(UniqueType.GoldBonusFromTradeRouts)) stats.gold *= 1.25f // Machu Picchu speciality } return stats } @@ -107,7 +107,7 @@ class CityStats(val cityInfo: CityInfo) { fun getScienceConversionRate(): Float { var conversionRate = 1 / 4f - if (cityInfo.civInfo.hasUnique("Production to science conversion in cities increased by 33%")) + if (cityInfo.civInfo.hasUnique(UniqueType.ProductionToScienceConversionBonus)) conversionRate *= 1.33f return conversionRate } diff --git a/core/src/com/unciv/logic/civilization/CivInfoStats.kt b/core/src/com/unciv/logic/civilization/CivInfoStats.kt index 22e8009829..00f1e1068d 100644 --- a/core/src/com/unciv/logic/civilization/CivInfoStats.kt +++ b/core/src/com/unciv/logic/civilization/CivInfoStats.kt @@ -291,7 +291,7 @@ class CivInfoStats(val civInfo: CivilizationInfo) { } } - if (civInfo.hasUnique("Provides 1 happiness per 2 additional social policies adopted")) { + if (civInfo.hasUnique(UniqueType.HappinessPer2Policies)) { if (!statMap.containsKey("Policies")) statMap["Policies"] = 0f statMap["Policies"] = statMap["Policies"]!! + civInfo.policies.getAdoptedPolicies() diff --git a/core/src/com/unciv/logic/civilization/CivInfoTransientUpdater.kt b/core/src/com/unciv/logic/civilization/CivInfoTransientUpdater.kt index a367d83abb..84d35f5dcb 100644 --- a/core/src/com/unciv/logic/civilization/CivInfoTransientUpdater.kt +++ b/core/src/com/unciv/logic/civilization/CivInfoTransientUpdater.kt @@ -117,7 +117,7 @@ class CivInfoTransientUpdater(val civInfo: CivilizationInfo) { if (civInfo.naturalWonders.contains(tile.naturalWonder)) continue civInfo.discoverNaturalWonder(tile.naturalWonder!!) - civInfo.addNotification("We have discovered [" + tile.naturalWonder + "]!", tile.position, "StatIcons/Happiness") + civInfo.addNotification("We have discovered [${tile.naturalWonder}]!", tile.position, "StatIcons/Happiness") var goldGained = 0 val discoveredNaturalWonders = civInfo.gameInfo.civilizations.filter { it != civInfo && it.isMajorCiv() } @@ -133,7 +133,7 @@ class CivInfoTransientUpdater(val civInfo: CivilizationInfo) { if (goldGained > 0) { civInfo.addGold(goldGained) - civInfo.addNotification("We have received [" + goldGained + "] Gold for discovering [" + tile.naturalWonder + "]", NotificationIcon.Gold) + civInfo.addNotification("We have received [$goldGained] Gold for discovering [${tile.naturalWonder}]", NotificationIcon.Gold) } } @@ -141,7 +141,7 @@ class CivInfoTransientUpdater(val civInfo: CivilizationInfo) { fun updateHasActiveGreatWall() { civInfo.hasActiveGreatWall = !civInfo.tech.isResearched("Dynamite") && - civInfo.hasUnique("Enemy land units must spend 1 extra movement point when inside your territory (obsolete upon Dynamite)") + civInfo.hasUnique(UniqueType.EnemyLandUnitsSpendExtraMovement) } diff --git a/core/src/com/unciv/logic/civilization/CivilizationInfo.kt b/core/src/com/unciv/logic/civilization/CivilizationInfo.kt index bedc269c49..39f47ae78a 100644 --- a/core/src/com/unciv/logic/civilization/CivilizationInfo.kt +++ b/core/src/com/unciv/logic/civilization/CivilizationInfo.kt @@ -375,7 +375,6 @@ class CivilizationInfo { fun hasUnique(uniqueType: UniqueType, stateForConditionals: StateForConditionals = StateForConditionals(this)) = getMatchingUniques(uniqueType, stateForConditionals).any() - fun hasUnique(unique: String) = getMatchingUniques(unique).any() // Does not return local uniques, only global ones. /** Destined to replace getMatchingUniques, gradually, as we fill the enum */ diff --git a/core/src/com/unciv/logic/civilization/ReligionManager.kt b/core/src/com/unciv/logic/civilization/ReligionManager.kt index 95449ebadd..b683561fbd 100644 --- a/core/src/com/unciv/logic/civilization/ReligionManager.kt +++ b/core/src/com/unciv/logic/civilization/ReligionManager.kt @@ -121,7 +121,7 @@ class ReligionManager { if (getGreatProphetEquivalent() == null) return false if (storedFaith < faithForNextGreatProphet()) return false if (!civInfo.isMajorCiv()) return false - if (civInfo.hasUnique("May not generate great prophet equivalents naturally")) return false + if (civInfo.hasUnique(UniqueType.MAyNotGenerateGreatProphet)) return false return true } diff --git a/core/src/com/unciv/logic/map/MapUnit.kt b/core/src/com/unciv/logic/map/MapUnit.kt index e95be8ae85..3809c1f5f3 100644 --- a/core/src/com/unciv/logic/map/MapUnit.kt +++ b/core/src/com/unciv/logic/map/MapUnit.kt @@ -904,7 +904,7 @@ class MapUnit { var goldGained = civInfo.getDifficulty().clearBarbarianCampReward * civInfo.gameInfo.gameParameters.gameSpeed.modifier - if (civInfo.hasUnique("Receive triple Gold from Barbarian encampments and pillaging Cities")) + if (civInfo.hasUnique(UniqueType.TripleGoldFromEncampmentsAndCities)) goldGained *= 3f civInfo.addGold(goldGained.toInt()) diff --git a/core/src/com/unciv/models/ruleset/unique/UniqueType.kt b/core/src/com/unciv/models/ruleset/unique/UniqueType.kt index d599ab43e7..83eaafe993 100644 --- a/core/src/com/unciv/models/ruleset/unique/UniqueType.kt +++ b/core/src/com/unciv/models/ruleset/unique/UniqueType.kt @@ -96,6 +96,7 @@ enum class UniqueType(val text: String, vararg targets: UniqueTarget, val flags: AllStatsPercentFromObject("[amount]% Yield from every [tileFilter]", UniqueTarget.FollowerBelief, UniqueTarget.Global), StatPercentFromReligionFollowers("[amount]% [stat] from every follower, up to [amount]%", UniqueTarget.FollowerBelief), BonusStatsFromCityStates("[amount]% [stat] from City-States", UniqueTarget.Global), + GoldBonusFromTradeRouts("Gold from all trade routes +25%", UniqueTarget.Global), NullifiesStat("Nullifies [stat] [cityFilter]", UniqueTarget.Global), NullifiesGrowth("Nullifies Growth [cityFilter]", UniqueTarget.Global), @@ -165,7 +166,7 @@ enum class UniqueType(val text: String, vararg targets: UniqueTarget, val flags: UnhappinessFromPopulationPercentageChange("[amount]% unhappiness from population [cityFilter]", UniqueTarget.Global, UniqueTarget.FollowerBelief), UnhappinessFromSpecialistsPercentageChange("[amount]% unhappiness from specialists [cityFilter]", UniqueTarget.Global, UniqueTarget.FollowerBelief), FoodConsumptionBySpecialists("[amount]% Food consumption by specialists [cityFilter]", UniqueTarget.Global, UniqueTarget.FollowerBelief), - + HappinessPer2Policies("Provides 1 happiness per 2 additional social policies adopted", UniqueTarget.Global), ExcessHappinessToGlobalStat("[amount]% of excess happiness converted to [stat]", UniqueTarget.Global), BorderGrowthPercentage("[amount]% Culture cost of natural border growth [cityFilter]", UniqueTarget.Global, UniqueTarget.FollowerBelief), @@ -224,6 +225,9 @@ enum class UniqueType(val text: String, vararg targets: UniqueTarget, val flags: DoubleHappinessFromNaturalWonders("Double Happiness from Natural Wonders", UniqueTarget.Global), EnablesConstructionOfSpaceshipParts("Enables construction of Spaceship parts", UniqueTarget.Global), + EnemyLandUnitsSpendExtraMovement("Enemy land units must spend 1 extra movement point when inside your territory (obsolete upon Dynamite)", UniqueTarget.Global), + + ProductionToScienceConversionBonus("Production to science conversion in cities increased by 33%", UniqueTarget.Global), // Misc national uniques NotifiedOfBarbarianEncampments("Notified of new Barbarian encampments", UniqueTarget.Global), @@ -233,6 +237,10 @@ enum class UniqueType(val text: String, vararg targets: UniqueTarget, val flags: UnhappinessFromCitiesDoubled("Unhappiness from number of Cities doubled", UniqueTarget.Global), GreatGeneralProvidesDoubleCombatBonus("Great General provides double combat bonus", UniqueTarget.Global), TechBoostWhenScientificBuildingsBuiltInCapital("Receive a tech boost when scientific buildings/wonders are built in capital", UniqueTarget.Global), + MAyNotGenerateGreatProphet("May not generate great prophet equivalents naturally", UniqueTarget.Global), + ChanceToRecruitBarbarianFromEncampment("67% chance to earn 25 Gold and recruit a Barbarian unit from a conquered encampment", UniqueTarget.Global), + ChanceToRecruitNavalBarbarian("50% chance of capturing defeated Barbarian naval units and earning 25 Gold", UniqueTarget.Global), + TripleGoldFromEncampmentsAndCities("Receive triple Gold from Barbarian encampments and pillaging Cities", UniqueTarget.Global), EnablesOpenBorders("Enables Open Borders agreements", UniqueTarget.Global), // Should the 'R' in 'Research agreements' be capitalized?