FINALLY removed CivInfo.getMatchingUniques(String)!

This commit is contained in:
Yair Morgenstern 2022-02-27 16:57:21 +02:00
parent db1304ee35
commit 6bbab8a394
12 changed files with 35 additions and 49 deletions

View File

@ -209,7 +209,7 @@ object BattleDamage {
private fun getTileSpecificModifiers(unit: MapUnitCombatant, tile: TileInfo): Counter<String> { private fun getTileSpecificModifiers(unit: MapUnitCombatant, tile: TileInfo): Counter<String> {
val modifiers = Counter<String>() val modifiers = Counter<String>()
for (unique in unit.getCivInfo().getMatchingUniques("+[]% Strength if within [] tiles of a []")) { for (unique in unit.getCivInfo().getMatchingUniques(UniqueType.StrengthWithinTilesOfTile)) {
if (tile.getTilesInDistance(unique.params[1].toInt()) if (tile.getTilesInDistance(unique.params[1].toInt())
.any { it.matchesFilter(unique.params[2]) } .any { it.matchesFilter(unique.params[2]) }
) )

View File

@ -442,9 +442,9 @@ class CityInfo {
if (!civInfo.getDiplomacyManager(otherCiv).hasFlag(DiplomacyFlags.DeclarationOfFriendship)) if (!civInfo.getDiplomacyManager(otherCiv).hasFlag(DiplomacyFlags.DeclarationOfFriendship))
continue continue
for (ourUnique in civInfo.getMatchingUniques("When declaring friendship, both parties gain a []% boost to great person generation")) for (ourUnique in civInfo.getMatchingUniques(UniqueType.GreatPersonBoostWithFriendship))
allGppPercentageBonus += ourUnique.params[0].toInt() allGppPercentageBonus += ourUnique.params[0].toInt()
for (theirUnique in otherCiv.getMatchingUniques("When declaring friendship, both parties gain a []% boost to great person generation")) for (theirUnique in otherCiv.getMatchingUniques(UniqueType.GreatPersonBoostWithFriendship))
allGppPercentageBonus += theirUnique.params[0].toInt() allGppPercentageBonus += theirUnique.params[0].toInt()
} }
@ -837,13 +837,6 @@ class CityInfo {
} }
} }
// Get all matching uniques that don't apply to only this city
fun getMatchingUniquesWithNonLocalEffects(placeholderText: String): Sequence<Unique> {
return cityConstructions.builtBuildingUniqueMap.getUniques(placeholderText)
.filter { !it.isLocalEffect }
// Note that we don't query religion here, as those only have local effects
}
fun getMatchingUniquesWithNonLocalEffects(uniqueType: UniqueType, stateForConditionals: StateForConditionals): Sequence<Unique> { fun getMatchingUniquesWithNonLocalEffects(uniqueType: UniqueType, stateForConditionals: StateForConditionals): Sequence<Unique> {
return cityConstructions.builtBuildingUniqueMap.getUniques(uniqueType) return cityConstructions.builtBuildingUniqueMap.getUniques(uniqueType)

View File

@ -401,11 +401,6 @@ class CityStats(val cityInfo: CityInfo) {
var unhappinessFromCitizens = cityInfo.population.population.toFloat() var unhappinessFromCitizens = cityInfo.population.population.toFloat()
var unhappinessFromSpecialists = cityInfo.population.getNumberOfSpecialists().toFloat() var unhappinessFromSpecialists = cityInfo.population.getNumberOfSpecialists().toFloat()
// Deprecated since 3.16.11
for (unique in civInfo.getMatchingUniques("Specialists only produce []% of normal unhappiness"))
unhappinessFromSpecialists *= (1f - unique.params[0].toFloat() / 100f)
//
for (unique in cityInfo.getMatchingUniques(UniqueType.UnhappinessFromSpecialistsPercentageChange)) { for (unique in cityInfo.getMatchingUniques(UniqueType.UnhappinessFromSpecialistsPercentageChange)) {
if (cityInfo.matchesFilter(unique.params[1])) if (cityInfo.matchesFilter(unique.params[1]))
unhappinessFromSpecialists *= unique.params[0].toPercent() unhappinessFromSpecialists *= unique.params[0].toPercent()

View File

@ -79,7 +79,7 @@ class CivInfoStats(val civInfo: CivilizationInfo) {
// just to go over them once is a waste of memory - there are low-end phones who don't have much ram // just to go over them once is a waste of memory - there are low-end phones who don't have much ram
val ignoredTileTypes = val ignoredTileTypes =
civInfo.getMatchingUniques("No Maintenance costs for improvements in [] tiles") civInfo.getMatchingUniques(UniqueType.NoImprovementMaintenanceInSpecificTiles)
.map { it.params[0] }.toHashSet() // needs to be .toHashSet()ed, .map { it.params[0] }.toHashSet() // needs to be .toHashSet()ed,
// Because we go over every tile in every city and check if it's in this list, which can get real heavy. // Because we go over every tile in every city and check if it's in this list, which can get real heavy.
@ -165,7 +165,7 @@ class CivInfoStats(val civInfo: CivilizationInfo) {
} }
} }
for (unique in civInfo.getMatchingUniques("[]% [] from City-States")) { for (unique in civInfo.getMatchingUniques(UniqueType.StatBonusPercentFromCityStates)) {
cityStateBonus[Stat.valueOf(unique.params[1])] *= unique.params[0].toPercent() cityStateBonus[Stat.valueOf(unique.params[1])] *= unique.params[0].toPercent()
} }
@ -345,7 +345,7 @@ class CivInfoStats(val civInfo: CivilizationInfo) {
// Just in case // Just in case
if (cityStatesHappiness > 0) { if (cityStatesHappiness > 0) {
for (unique in civInfo.getMatchingUniques("[]% [] from City-States")) { for (unique in civInfo.getMatchingUniques(UniqueType.StatBonusPercentFromCityStates)) {
if (unique.params[1] == Stat.Happiness.name) if (unique.params[1] == Stat.Happiness.name)
cityStatesHappiness *= unique.params[0].toPercent() cityStatesHappiness *= unique.params[0].toPercent()
} }

View File

@ -405,27 +405,6 @@ class CivilizationInfo {
yieldAll(gameInfo.ruleSet.globalUniques.getMatchingUniques(uniqueType, stateForConditionals)) yieldAll(gameInfo.ruleSet.globalUniques.getMatchingUniques(uniqueType, stateForConditionals))
} }
fun getMatchingUniques(uniqueTemplate: String, cityToIgnore: CityInfo? = null) = sequence {
yieldAll(nation.getMatchingUniques(uniqueTemplate))
yieldAll(cities.asSequence()
.filter { it != cityToIgnore }
.flatMap { city -> city.getMatchingUniquesWithNonLocalEffects(uniqueTemplate) }
)
yieldAll(policies.policyUniques.getUniques(uniqueTemplate))
yieldAll(tech.techUniques.getUniques(uniqueTemplate))
yieldAll(temporaryUniques.asSequence()
.map { it.uniqueObject }
.filter { it.placeholderText == uniqueTemplate }
)
yieldAll(getEra().getMatchingUniques(uniqueTemplate).asSequence())
if (religionManager.religion != null)
yieldAll(religionManager.religion!!.getFounderUniques()
.asSequence()
.filter { it.placeholderText == uniqueTemplate }
)
yieldAll(gameInfo.ruleSet.globalUniques.getMatchingUniques(uniqueTemplate))
}
//region Units //region Units
fun getCivUnitsSize(): Int = units.size fun getCivUnitsSize(): Int = units.size
@ -1141,7 +1120,7 @@ class CivilizationInfo {
placedUnit.setupAbilityUses(cityToAddTo) placedUnit.setupAbilityUses(cityToAddTo)
} }
for (unique in getMatchingUniques("Land units may cross [] tiles after the first [] is earned")) { for (unique in getMatchingUniques(UniqueType.LandUnitsCrossTerrainAfterUnitGained)) {
if (unit.matchesFilter(unique.params[1])) { if (unit.matchesFilter(unique.params[1])) {
passThroughImpassableUnlocked = true // Update the cached Boolean passThroughImpassableUnlocked = true // Update the cached Boolean
passableImpassables.add(unique.params[0]) // Add to list of passable impassables passableImpassables.add(unique.params[0]) // Add to list of passable impassables

View File

@ -109,7 +109,7 @@ class ReligionManager {
(200 + 100 * greatProphetsEarned * (greatProphetsEarned + 1) / 2f) * (200 + 100 * greatProphetsEarned * (greatProphetsEarned + 1) / 2f) *
civInfo.gameInfo.gameParameters.gameSpeed.modifier civInfo.gameInfo.gameParameters.gameSpeed.modifier
for (unique in civInfo.getMatchingUniques("[]% Faith cost of generating Great Prophet equivalents")) for (unique in civInfo.getMatchingUniques(UniqueType.FaithCostOfGreatProphetChange))
faithCost *= unique.params[0].toPercent() faithCost *= unique.params[0].toPercent()
return faithCost.toInt() return faithCost.toInt()

View File

@ -323,7 +323,7 @@ class TechManager {
} }
} }
for (unique in civInfo.getMatchingUniques("Receive free [] when you discover []")) { for (unique in civInfo.getMatchingUniques(UniqueType.RecieveFreeUnitWhenDiscoveringTech)) {
if (unique.params[1] != techName) continue if (unique.params[1] != techName) continue
civInfo.addUnit(unique.params[0]) civInfo.addUnit(unique.params[0])
} }

View File

@ -239,7 +239,7 @@ class DiplomacyManager() {
restingPoint += unique.params[0].toInt() restingPoint += unique.params[0].toInt()
if (civInfo.cities.any()) // no capital if no cities if (civInfo.cities.any()) // no capital if no cities
for (unique in otherCiv().getMatchingUniques("Resting point for Influence with City-States following this religion []")) for (unique in otherCiv().getMatchingUniques(UniqueType.RestingPointOfCityStatesFollowingReligionChange))
if (otherCiv().religionManager.religion?.name == civInfo.getCapital().religion.getMajorityReligionName()) if (otherCiv().religionManager.religion?.name == civInfo.getCapital().religion.getMajorityReligionName())
restingPoint += unique.params[0].toInt() restingPoint += unique.params[0].toInt()
@ -270,7 +270,7 @@ class DiplomacyManager() {
modifierPercent -= 25f // 25% slower degrade when sharing a religion modifierPercent -= 25f // 25% slower degrade when sharing a religion
for (civ in civInfo.gameInfo.civilizations.filter { it.isMajorCiv() && it != otherCiv()}) { for (civ in civInfo.gameInfo.civilizations.filter { it.isMajorCiv() && it != otherCiv()}) {
for (unique in civ.getMatchingUniques("Influence of all other civilizations with all city-states degrades []% faster")) { for (unique in civ.getMatchingUniques(UniqueType.OtherCivsCityStateRelationsDegradeFaster)) {
modifierPercent += unique.params[0].toFloat() modifierPercent += unique.params[0].toFloat()
} }
} }

View File

@ -26,6 +26,7 @@ class Unique(val text: String, val sourceObjectType: UniqueTarget? = null, val s
else Stats.parse(firstStatParam) else Stats.parse(firstStatParam)
} }
val conditionals: List<Unique> = text.getConditionals() val conditionals: List<Unique> = text.getConditionals()
val isTriggerable = type != null && type.targetTypes.contains(UniqueTarget.Triggerable) val isTriggerable = type != null && type.targetTypes.contains(UniqueTarget.Triggerable)
// <for [amount] turns]> in effect makes any unique become a triggerable unique // <for [amount] turns]> in effect makes any unique become a triggerable unique
|| conditionals.any { it.type == UniqueType.ConditionalTimedUnique } || conditionals.any { it.type == UniqueType.ConditionalTimedUnique }
@ -237,7 +238,7 @@ class UniqueMap: HashMap<String, ArrayList<Unique>>() {
this[unique.placeholderText]!!.add(unique) this[unique.placeholderText]!!.add(unique)
} }
fun getUniques(placeholderText: String): Sequence<Unique> { private fun getUniques(placeholderText: String): Sequence<Unique> {
return this[placeholderText]?.asSequence() ?: emptySequence() return this[placeholderText]?.asSequence() ?: emptySequence()
} }

View File

@ -246,6 +246,23 @@ enum class UniqueType(val text: String, vararg targets: UniqueTarget, val flags:
ChanceToRecruitNavalBarbarian("50% chance of capturing defeated Barbarian naval units and earning 25 Gold", 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), TripleGoldFromEncampmentsAndCities("Receive triple Gold from Barbarian encampments and pillaging Cities", UniqueTarget.Global),
CitiesAreRazedXTimesFaster("Cities are razed [amount] times as fast", UniqueTarget.Global), CitiesAreRazedXTimesFaster("Cities are razed [amount] times as fast", UniqueTarget.Global),
GreatPersonBoostWithFriendship("When declaring friendship, both parties gain a [amount]% boost to great person generation", UniqueTarget.Global),
NoImprovementMaintenanceInSpecificTiles("No Maintenance costs for improvements in [tileFilter] tiles", UniqueTarget.Global),
OtherCivsCityStateRelationsDegradeFaster("Influence of all other civilizations with all city-states degrades [amount]% faster", UniqueTarget.Global),
LandUnitsCrossTerrainAfterUnitGained("Land units may cross [terrainName] tiles after the first [baseUnitFilter] is earned", UniqueTarget.Global),
GainInfluenceWithUnitGiftToCityState("Gain [amount] Influence with a [baseUnitFilter] gift to a City-State", UniqueTarget.Global),
FaithCostOfGreatProphetChange("[amount]% Faith cost of generating Great Prophet equivalents", UniqueTarget.Global),
RestingPointOfCityStatesFollowingReligionChange("Resting point for Influence with City-States following this religion [amount]", UniqueTarget.Global),
// Todo can be replaced with a <within [amount] tiles of a [tileFilter] tile> conditional
StrengthWithinTilesOfTile("+[amount]% Strength if within [amount] tiles of a [tileFilter]", UniqueTarget.Global),
StatBonusPercentFromCityStates("[amount]% [stat] from City-States", UniqueTarget.Global),
ProvidesGoldWheneverGreatPersonExpended("Provides a sum of gold each time you spend a Great Person", UniqueTarget.Global),
ProvidesStatsWheneverGreatPersonExpended("[stats] whenever a Great Person is expended", UniqueTarget.Global),
// Acts as a trigger - this should be generalized somehow but the current setup does not allow this
// It would currently mean cycling through EVERY unique type to find ones with a specific conditional...
RecieveFreeUnitWhenDiscoveringTech("Receive free [baseUnitFilter] when you discover [tech]", UniqueTarget.Global),
EnablesOpenBorders("Enables Open Borders agreements", UniqueTarget.Global), EnablesOpenBorders("Enables Open Borders agreements", UniqueTarget.Global),
// Should the 'R' in 'Research agreements' be capitalized? // Should the 'R' in 'Research agreements' be capitalized?
@ -599,6 +616,7 @@ enum class UniqueType(val text: String, vararg targets: UniqueTarget, val flags:
ConditionalFirstCivToResearch("if no other Civilization has researched this", UniqueTarget.Conditional), ConditionalFirstCivToResearch("if no other Civilization has researched this", UniqueTarget.Conditional),
ConditionalTech("after discovering [tech]", UniqueTarget.Conditional), ConditionalTech("after discovering [tech]", UniqueTarget.Conditional),
ConditionalNoTech("before discovering [tech]", UniqueTarget.Conditional), ConditionalNoTech("before discovering [tech]", UniqueTarget.Conditional),
ConditionalWhenTech("upon discovering [tech]", UniqueTarget.Conditional),
ConditionalPolicy("after adopting [policy]", UniqueTarget.Conditional), ConditionalPolicy("after adopting [policy]", UniqueTarget.Conditional),
ConditionalNoPolicy("before adopting [policy]", UniqueTarget.Conditional), ConditionalNoPolicy("before adopting [policy]", UniqueTarget.Conditional),
ConditionalBuildingBuilt("if [buildingName] is constructed", UniqueTarget.Conditional), ConditionalBuildingBuilt("if [buildingName] is constructed", UniqueTarget.Conditional),

View File

@ -243,7 +243,7 @@ class DiplomacyScreen(val viewingCiv:CivilizationInfo): BaseScreen() {
val bonusStrings = ArrayList<String>() val bonusStrings = ArrayList<String>()
for (bonus in bonuses) { for (bonus in bonuses) {
var improved = false var improved = false
for (unique in viewingCiv.getMatchingUniques("[]% [] from City-States")) { for (unique in viewingCiv.getMatchingUniques(UniqueType.StatBonusPercentFromCityStates)) {
val boostAmount = unique.params[0].toPercent() val boostAmount = unique.params[0].toPercent()
val boostedStat = Stat.valueOf(unique.params[1]) val boostedStat = Stat.valueOf(unique.params[1])
when (bonus.type) { when (bonus.type) {

View File

@ -711,10 +711,10 @@ object UnitActions {
val civInfo = unit.civInfo val civInfo = unit.civInfo
val gainedStats = Stats() val gainedStats = Stats()
for (unique in civInfo.getMatchingUniques("Provides a sum of gold each time you spend a Great Person")) { for (unique in civInfo.getMatchingUniques(UniqueType.ProvidesGoldWheneverGreatPersonExpended)) {
gainedStats.gold += (100 * civInfo.gameInfo.gameParameters.gameSpeed.modifier).toInt() gainedStats.gold += (100 * civInfo.gameInfo.gameParameters.gameSpeed.modifier).toInt()
} }
for (unique in civInfo.getMatchingUniques("[] whenever a Great Person is expended")) { for (unique in civInfo.getMatchingUniques(UniqueType.ProvidesStatsWheneverGreatPersonExpended)) {
gainedStats.add(unique.stats) gainedStats.add(unique.stats)
} }
@ -804,7 +804,7 @@ object UnitActions {
val giftAction = { val giftAction = {
if (recipient.isCityState()) { if (recipient.isCityState()) {
for (unique in unit.civInfo.getMatchingUniques("Gain [] Influence with a [] gift to a City-State")) { for (unique in unit.civInfo.getMatchingUniques(UniqueType.GainInfluenceWithUnitGiftToCityState)) {
if (unit.matchesFilter(unique.params[1])) { if (unit.matchesFilter(unique.params[1])) {
recipient.getDiplomacyManager(unit.civInfo) recipient.getDiplomacyManager(unit.civInfo)
.addInfluence(unique.params[0].toFloat() - 5f) .addInfluence(unique.params[0].toFloat() - 5f)