City stats performance boost - converted list iterations to nice map retrievals :)

This commit is contained in:
yairm210
2021-11-03 14:29:01 +02:00
parent 0a0881d5bd
commit ff389e0238
2 changed files with 18 additions and 14 deletions

View File

@ -9,6 +9,7 @@ import com.unciv.models.ruleset.Building
import com.unciv.models.ruleset.ModOptionsConstants import com.unciv.models.ruleset.ModOptionsConstants
import com.unciv.models.ruleset.unique.StateForConditionals import com.unciv.models.ruleset.unique.StateForConditionals
import com.unciv.models.ruleset.unique.Unique import com.unciv.models.ruleset.unique.Unique
import com.unciv.models.ruleset.unique.UniqueMapTyped
import com.unciv.models.ruleset.unique.UniqueType import com.unciv.models.ruleset.unique.UniqueType
import com.unciv.models.ruleset.unit.BaseUnit import com.unciv.models.ruleset.unit.BaseUnit
import com.unciv.models.stats.Stat import com.unciv.models.stats.Stat
@ -231,10 +232,12 @@ class CityStats(val cityInfo: CityInfo) {
private fun getStatPercentBonusesFromUniques(currentConstruction: IConstruction, uniqueSequence: Sequence<Unique>): Stats { private fun getStatPercentBonusesFromUniques(currentConstruction: IConstruction, uniqueSequence: Sequence<Unique>): Stats {
val stats = Stats() val stats = Stats()
val uniques = uniqueSequence.toList().asSequence() val uniques = uniqueSequence.toList().asSequence()
val uniqueMap = UniqueMapTyped()
for (unique in uniques) uniqueMap.addUnique(unique)
// Since this is sometimes run from a different thread (getConstructionButtonDTOs), // Since this is sometimes run from a different thread (getConstructionButtonDTOs),
// this helps mitigate concurrency problems. // this helps mitigate concurrency problems.
for (unique in uniques.filter { it.isOfType(UniqueType.StatPercentBonus) }) { for (unique in uniqueMap.getUniques(UniqueType.StatPercentBonus)) {
if (!unique.conditionalsApply(cityInfo.civInfo, cityInfo)) continue if (!unique.conditionalsApply(cityInfo.civInfo, cityInfo)) continue
stats.add(Stat.valueOf(unique.params[1]), unique.params[0].toFloat()) stats.add(Stat.valueOf(unique.params[1]), unique.params[0].toFloat())
} }
@ -248,12 +251,12 @@ class CityStats(val cityInfo: CityInfo) {
// Deprecated since 3.17.10 // Deprecated since 3.17.10
// Params: "+[amount]% [Stat] [cityFilter]", pretty crazy amirite // Params: "+[amount]% [Stat] [cityFilter]", pretty crazy amirite
// For instance "+[50]% [Production] [in all cities] // For instance "+[50]% [Production] [in all cities]
for (unique in uniques.filter { it.isOfType(UniqueType.StatPercentBonusCitiesDeprecated) }) for (unique in uniqueMap.getUniques(UniqueType.StatPercentBonusCitiesDeprecated))
if (cityInfo.matchesFilter(unique.params[2])) if (cityInfo.matchesFilter(unique.params[2]))
stats.add(Stat.valueOf(unique.params[1]), unique.params[0].toFloat()) stats.add(Stat.valueOf(unique.params[1]), unique.params[0].toFloat())
// //
for (unique in uniques.filter { it.isOfType(UniqueType.StatPercentBonusCities) }) { for (unique in uniqueMap.getUniques(UniqueType.StatPercentBonusCities)) {
if (!unique.conditionalsApply(StateForConditionals(civInfo = cityInfo.civInfo, cityInfo = cityInfo))) continue if (!unique.conditionalsApply(StateForConditionals(civInfo = cityInfo.civInfo, cityInfo = cityInfo))) continue
if (cityInfo.matchesFilter(unique.params[2])) if (cityInfo.matchesFilter(unique.params[2]))
stats.add(Stat.valueOf(unique.params[1]), unique.params[0].toFloat()) stats.add(Stat.valueOf(unique.params[1]), unique.params[0].toFloat())
@ -261,11 +264,11 @@ class CityStats(val cityInfo: CityInfo) {
val uniquesToCheck = val uniquesToCheck =
if (currentConstruction is Building && currentConstruction.isAnyWonder()) { if (currentConstruction is Building && currentConstruction.isAnyWonder()) {
uniques.filter { it.isOfType(UniqueType.PercentProductionWonders) } uniqueMap.getUniques(UniqueType.PercentProductionWonders)
} else if (currentConstruction is Building && !currentConstruction.isAnyWonder()) { } else if (currentConstruction is Building && !currentConstruction.isAnyWonder()) {
uniques.filter { it.isOfType(UniqueType.PercentProductionBuildings) } uniqueMap.getUniques(UniqueType.PercentProductionBuildings)
} else if (currentConstruction is BaseUnit) { } else if (currentConstruction is BaseUnit) {
uniques.filter { it.isOfType(UniqueType.PercentProductionUnits) } uniqueMap.getUniques(UniqueType.PercentProductionUnits)
} else { // Science/Gold production } else { // Science/Gold production
sequenceOf() sequenceOf()
} }
@ -277,29 +280,29 @@ class CityStats(val cityInfo: CityInfo) {
// Deprecated since 3.17.10 // Deprecated since 3.17.10
if (currentConstruction is Building && !currentConstruction.isAnyWonder()) if (currentConstruction is Building && !currentConstruction.isAnyWonder())
for (unique in uniques.filter { it.isOfType(UniqueType.PercentProductionStatBuildings) }) { for (unique in uniqueMap.getUniques(UniqueType.PercentProductionStatBuildings)) {
val stat = Stat.valueOf(unique.params[1]) val stat = Stat.valueOf(unique.params[1])
if (currentConstruction.isStatRelated(stat)) if (currentConstruction.isStatRelated(stat))
stats.production += unique.params[0].toInt() stats.production += unique.params[0].toInt()
} }
for (unique in uniques.filter { it.isOfType(UniqueType.PercentProductionConstructions) }) { for (unique in uniqueMap.getUniques(UniqueType.PercentProductionConstructions)) {
if (constructionMatchesFilter(currentConstruction, unique.params[1])) if (constructionMatchesFilter(currentConstruction, unique.params[1]))
stats.production += unique.params[0].toInt() stats.production += unique.params[0].toInt()
} }
// Used for specific buildings (e.g. +100% Production when constructing a Factory) // Used for specific buildings (e.g. +100% Production when constructing a Factory)
for (unique in uniques.filter { it.isOfType(UniqueType.PercentProductionBuildingName) }) { for (unique in uniqueMap.getUniques(UniqueType.PercentProductionBuildingName)) {
if (constructionMatchesFilter(currentConstruction, unique.params[1])) if (constructionMatchesFilter(currentConstruction, unique.params[1]))
stats.production += unique.params[0].toInt() stats.production += unique.params[0].toInt()
} }
// "+[amount]% Production when constructing [constructionFilter] [cityFilter]" // "+[amount]% Production when constructing [constructionFilter] [cityFilter]"
for (unique in uniques.filter { it.isOfType(UniqueType.PercentProductionConstructionsCities) }) { for (unique in uniqueMap.getUniques(UniqueType.PercentProductionConstructionsCities)) {
if (constructionMatchesFilter(currentConstruction, unique.params[1]) && cityInfo.matchesFilter(unique.params[2])) if (constructionMatchesFilter(currentConstruction, unique.params[1]) && cityInfo.matchesFilter(unique.params[2]))
stats.production += unique.params[0].toInt() stats.production += unique.params[0].toInt()
} }
// "+[amount]% Production when constructing [unitFilter] units [cityFilter]" // "+[amount]% Production when constructing [unitFilter] units [cityFilter]"
for (unique in uniques.filter { it.isOfType(UniqueType.PercentProductionUnitsDeprecated) }) { for (unique in uniqueMap.getUniques(UniqueType.PercentProductionUnitsDeprecated)) {
if (constructionMatchesFilter(currentConstruction, unique.params[1]) && cityInfo.matchesFilter(unique.params[2])) if (constructionMatchesFilter(currentConstruction, unique.params[1]) && cityInfo.matchesFilter(unique.params[2]))
stats.production += unique.params[0].toInt() stats.production += unique.params[0].toInt()
} }
@ -307,6 +310,7 @@ class CityStats(val cityInfo: CityInfo) {
// Deprecated since 3.17.1 // Deprecated since 3.17.1
if (cityInfo.civInfo.getHappiness() >= 0) { if (cityInfo.civInfo.getHappiness() >= 0) {
// todo convert to uniquetype
for (unique in uniques.filter { it.placeholderText == "[]% [] while the empire is happy"}) for (unique in uniques.filter { it.placeholderText == "[]% [] while the empire is happy"})
stats.add(Stat.valueOf(unique.params[1]), unique.params[0].toFloat()) stats.add(Stat.valueOf(unique.params[1]), unique.params[0].toFloat())
} }

View File

@ -224,9 +224,9 @@ object UnitActions {
if (unit.isCivilian() || !unit.promotions.canBePromoted()) return if (unit.isCivilian() || !unit.promotions.canBePromoted()) return
// promotion does not consume movement points, so we can do it always // promotion does not consume movement points, so we can do it always
actionList += UnitAction(UnitActionType.Promote, actionList += UnitAction(UnitActionType.Promote,
action = { action = {
UncivGame.Current.setScreen(PromotionPickerScreen(unit)) UncivGame.Current.setScreen(PromotionPickerScreen(unit))
}.takeIf { unit.currentMovement > 0 && unit.attacksThisTurn == 0 }) }.takeIf { unit.currentMovement > 0 && unit.attacksThisTurn == 0 })
} }
private fun addSetupAction(unit: MapUnit, actionList: ArrayList<UnitAction>) { private fun addSetupAction(unit: MapUnit, actionList: ArrayList<UnitAction>) {