From bdefb7894cfbc1007676c9f112ffb222cb48b5a9 Mon Sep 17 00:00:00 2001 From: yairm210 Date: Sun, 19 Sep 2021 21:15:26 +0300 Subject: [PATCH] cityInfo.getMAtchingUniques accepts uniqueType --- core/src/com/unciv/logic/city/CityInfo.kt | 25 +++++++++++++++++-- core/src/com/unciv/logic/city/CityReligion.kt | 9 ++----- .../unciv/logic/civilization/CivInfoStats.kt | 8 +++--- .../logic/civilization/CivilizationInfo.kt | 4 +-- 4 files changed, 31 insertions(+), 15 deletions(-) diff --git a/core/src/com/unciv/logic/city/CityInfo.kt b/core/src/com/unciv/logic/city/CityInfo.kt index 62ef29d81a..71e4723a62 100644 --- a/core/src/com/unciv/logic/city/CityInfo.kt +++ b/core/src/com/unciv/logic/city/CityInfo.kt @@ -711,11 +711,32 @@ class CityInfo { } } + // Finds matching uniques provided from both local and non-local sources. + fun getMatchingUniques( + uniqueType: UniqueType, + // We might have this cached to avoid concurrency problems. If we don't, just get it directly + localUniques: Sequence = getLocalMatchingUniques(uniqueType), + ): Sequence { + // The localUniques might not be filtered when passed as a parameter, so we filter it anyway + // The time loss shouldn't be that large I don't think + return civInfo.getMatchingUniques(uniqueType, this) + + localUniques.filter { + it.isOfType(uniqueType) + && it.params.none { param -> param == "in other cities" } + } + } + // Matching uniques provided by sources in the city itself fun getLocalMatchingUniques(placeholderText: String): Sequence { return cityConstructions.builtBuildingUniqueMap.getUniques(placeholderText) .filter { it.params.none { param -> param == "in other cities" } } + - religion.getMatchingUniques(placeholderText) + religion.getUniques().filter { it.placeholderText == placeholderText } + } + + fun getLocalMatchingUniques(uniqueType: UniqueType): Sequence { + return cityConstructions.builtBuildingUniqueMap.getUniques(uniqueType) + .filter { it.params.none { param -> param == "in other cities" } } + + religion.getUniques().filter { it.isOfType(uniqueType) } } // Get all uniques that originate from this city @@ -731,7 +752,7 @@ class CityInfo { } - fun getMatchingUniquesWithNonLocalEffectsByEnum(uniqueType: UniqueType): Sequence { + fun getMatchingUniquesWithNonLocalEffects(uniqueType: UniqueType): Sequence { return cityConstructions.builtBuildingUniqueMap.getUniques(uniqueType) .filter { it.params.none { param -> param == "in this city" } } // Note that we don't query religion here, as those only have local effects (for now at least) diff --git a/core/src/com/unciv/logic/city/CityReligion.kt b/core/src/com/unciv/logic/city/CityReligion.kt index 2c1b910716..fdfc340f89 100644 --- a/core/src/com/unciv/logic/city/CityReligion.kt +++ b/core/src/com/unciv/logic/city/CityReligion.kt @@ -62,14 +62,9 @@ class CityInfoReligionManager { val majorityReligion = getMajorityReligion() ?: return sequenceOf() return majorityReligion.getFollowerUniques() } + - fun getMatchingUniques(unique: String): Sequence { - return getUniques().filter { it.placeholderText == unique } - } - - fun getPressures(): Counter { - return pressures.clone() - } + fun getPressures(): Counter = pressures.clone() private fun clearAllPressures() { pressures.clear() diff --git a/core/src/com/unciv/logic/civilization/CivInfoStats.kt b/core/src/com/unciv/logic/civilization/CivInfoStats.kt index 1631825e21..a3580370a0 100644 --- a/core/src/com/unciv/logic/civilization/CivInfoStats.kt +++ b/core/src/com/unciv/logic/civilization/CivInfoStats.kt @@ -21,7 +21,7 @@ class CivInfoStats(val civInfo: CivilizationInfo) { private fun getUnitMaintenance(): Int { val baseUnitCost = 0.5f var freeUnits = 3 - for (unique in civInfo.getMatchingUniquesByEnum(UniqueType.FreeUnits)) { + for (unique in civInfo.getMatchingUniques(UniqueType.FreeUnits)) { if (!unique.conditionalsApply(civInfo)) continue freeUnits += unique.params[0].toInt() } @@ -36,7 +36,7 @@ class CivInfoStats(val civInfo: CivilizationInfo) { var numberOfUnitsToPayFor = max(0f, unitsToPayFor.count().toFloat() - freeUnits) - for (unique in civInfo.getMatchingUniquesByEnum(UniqueType.UnitMaintenanceDiscount)) { + for (unique in civInfo.getMatchingUniques(UniqueType.UnitMaintenanceDiscount)) { if (!unique.conditionalsApply(civInfo)) continue val numberOfUnitsWithDiscount = min( numberOfUnitsToPayFor, @@ -45,14 +45,14 @@ class CivInfoStats(val civInfo: CivilizationInfo) { numberOfUnitsToPayFor -= numberOfUnitsWithDiscount * unique.params[0].toFloat() / 100f } - for (unique in civInfo.getMatchingUniquesByEnum(UniqueType.DecreasedUnitMaintenanceCostsByFilter)) { + for (unique in civInfo.getMatchingUniques(UniqueType.DecreasedUnitMaintenanceCostsByFilter)) { val numberOfUnitsWithDiscount = min( numberOfUnitsToPayFor, unitsToPayFor.count { it.matchesFilter(unique.params[1]) }.toFloat() ) numberOfUnitsToPayFor -= numberOfUnitsWithDiscount * unique.params[0].toFloat() / 100f } - for (unique in civInfo.getMatchingUniquesByEnum(UniqueType.DecreasedUnitMaintenanceCostsGlobally)) { + for (unique in civInfo.getMatchingUniques(UniqueType.DecreasedUnitMaintenanceCostsGlobally)) { numberOfUnitsToPayFor *= 1f - unique.params[0].toFloat() / 100f } diff --git a/core/src/com/unciv/logic/civilization/CivilizationInfo.kt b/core/src/com/unciv/logic/civilization/CivilizationInfo.kt index afe98560bf..349c5ce6e9 100644 --- a/core/src/com/unciv/logic/civilization/CivilizationInfo.kt +++ b/core/src/com/unciv/logic/civilization/CivilizationInfo.kt @@ -317,11 +317,11 @@ class CivilizationInfo { fun hasUnique(unique: String) = getMatchingUniques(unique).any() /** Destined to replace getMatchingUniques, gradually, as we fill the enum */ - fun getMatchingUniquesByEnum(uniqueType: UniqueType, cityToIgnore: CityInfo?=null): Sequence { + fun getMatchingUniques(uniqueType: UniqueType, cityToIgnore: CityInfo?=null): Sequence { val ruleset = gameInfo.ruleSet return nation.uniqueObjects.asSequence().filter { it.matches(uniqueType, ruleset) } + cities.asSequence().filter { it != cityToIgnore }.flatMap { city -> - city.getMatchingUniquesWithNonLocalEffectsByEnum(uniqueType) + city.getMatchingUniquesWithNonLocalEffects(uniqueType) } + policies.policyUniques.getUniques(uniqueType) + tech.techUniques.getUniques(uniqueType) +