mirror of
https://github.com/yairm210/Unciv.git
synced 2025-09-29 06:51:30 -04:00
Converted all stat percent uniques to be iterated on efficiently once! (#6004)
This also makes a specific unique which was previously 'nation-only' to be applicable generally
This commit is contained in:
parent
080fc245d8
commit
bebc2c7e21
@ -121,21 +121,6 @@ class CityStats(val cityInfo: CityInfo) {
|
|||||||
return stats
|
return stats
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun getStatPercentBonusesFromNationUnique(currentConstruction: IConstruction): Stats {
|
|
||||||
val stats = Stats()
|
|
||||||
|
|
||||||
stats.add(getStatPercentBonusesFromUniques(currentConstruction, cityInfo.civInfo.nation.uniqueObjects.asSequence()))
|
|
||||||
|
|
||||||
if (currentConstruction is Building
|
|
||||||
&& cityInfo.civInfo.cities.isNotEmpty()
|
|
||||||
&& cityInfo.civInfo.getCapital().cityConstructions.builtBuildings.contains(currentConstruction.name)
|
|
||||||
&& cityInfo.civInfo.hasUnique("+25% Production towards any buildings that already exist in the Capital")
|
|
||||||
) {
|
|
||||||
stats.production += 25f
|
|
||||||
}
|
|
||||||
|
|
||||||
return stats
|
|
||||||
}
|
|
||||||
|
|
||||||
private fun getStatPercentBonusesFromPuppetCity(): Stats {
|
private fun getStatPercentBonusesFromPuppetCity(): Stats {
|
||||||
val stats = Stats()
|
val stats = Stats()
|
||||||
@ -243,64 +228,60 @@ class CityStats(val cityInfo: CityInfo) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
private fun getStatsPercentBonusesFromUniquesBySource():StatMap {
|
private fun getStatsPercentBonusesFromUniquesBySource(currentConstruction: IConstruction):StatMap {
|
||||||
val sourceToStats = StatMap()
|
val sourceToStats = StatMap()
|
||||||
fun addUniqueStats(unique: Unique, statsToAdd:Stats) =
|
fun addUniqueStats(unique: Unique, stat:Stat, amount:Float) =
|
||||||
sourceToStats.add(unique.sourceObjectType?.name ?: "", statsToAdd)
|
sourceToStats.add(unique.sourceObjectType?.name ?: "",
|
||||||
|
Stats().add(stat, amount))
|
||||||
|
|
||||||
for (unique in cityInfo.getMatchingUniques(UniqueType.StatPercentBonus)) {
|
for (unique in cityInfo.getMatchingUniques(UniqueType.StatPercentBonus)) {
|
||||||
addUniqueStats(unique, Stats().add(Stat.valueOf(unique.params[1]), unique.params[0].toFloat()))
|
addUniqueStats(unique, Stat.valueOf(unique.params[1]), unique.params[0].toFloat())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
for (unique in cityInfo.getMatchingUniques(UniqueType.StatPercentBonusCities)) {
|
||||||
|
if (cityInfo.matchesFilter(unique.params[2]))
|
||||||
|
addUniqueStats(unique, Stat.valueOf(unique.params[1]), unique.params[0].toFloat())
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
val uniquesToCheck =
|
||||||
|
if (currentConstruction is Building && currentConstruction.isAnyWonder()) {
|
||||||
|
cityInfo.getMatchingUniques(UniqueType.PercentProductionWonders)
|
||||||
|
} else if (currentConstruction is Building && !currentConstruction.isAnyWonder()) {
|
||||||
|
cityInfo.getMatchingUniques(UniqueType.PercentProductionBuildings)
|
||||||
|
} else if (currentConstruction is BaseUnit) {
|
||||||
|
cityInfo.getMatchingUniques(UniqueType.PercentProductionUnits)
|
||||||
|
} else { // Science/Gold production
|
||||||
|
sequenceOf()
|
||||||
|
}
|
||||||
|
|
||||||
|
for (unique in uniquesToCheck) {
|
||||||
|
if (constructionMatchesFilter(currentConstruction, unique.params[1])
|
||||||
|
&& cityInfo.matchesFilter(unique.params[2])
|
||||||
|
)
|
||||||
|
addUniqueStats(unique, Stat.Production, unique.params[0].toFloat())
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
for (unique in cityInfo.getMatchingUniques(UniqueType.StatPercentFromReligionFollowers))
|
||||||
|
addUniqueStats(unique, Stat.valueOf(unique.params[1]),
|
||||||
|
min(
|
||||||
|
unique.params[0].toFloat() * cityInfo.religion.getFollowersOfMajorityReligion(),
|
||||||
|
unique.params[2].toFloat()
|
||||||
|
))
|
||||||
|
|
||||||
|
if (currentConstruction is Building
|
||||||
|
&& cityInfo.civInfo.cities.isNotEmpty()
|
||||||
|
&& cityInfo.civInfo.getCapital().cityConstructions.builtBuildings.contains(currentConstruction.name))
|
||||||
|
for(unique in cityInfo.getMatchingUniques("+25% Production towards any buildings that already exist in the Capital"))
|
||||||
|
addUniqueStats(unique, Stat.Production, 25f)
|
||||||
|
|
||||||
renameStatmapKeys(sourceToStats)
|
renameStatmapKeys(sourceToStats)
|
||||||
|
|
||||||
return sourceToStats
|
return sourceToStats
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun getStatPercentBonusesFromUniques(currentConstruction: IConstruction, uniqueSequence: Sequence<Unique>): Stats {
|
|
||||||
|
|
||||||
val stats = Stats()
|
|
||||||
val uniqueMap = UniqueMapTyped()
|
|
||||||
for (unique in uniqueSequence) uniqueMap.addUnique(unique)
|
|
||||||
// Since this is sometimes run from a different thread (getConstructionButtonDTOs),
|
|
||||||
// this helps mitigate concurrency problems.
|
|
||||||
|
|
||||||
|
|
||||||
for (unique in uniqueMap.getUniques(UniqueType.StatPercentBonusCities)) {
|
|
||||||
if (!unique.conditionalsApply(cityInfo.civInfo, cityInfo)) continue
|
|
||||||
if (cityInfo.matchesFilter(unique.params[2]))
|
|
||||||
stats.add(Stat.valueOf(unique.params[1]), unique.params[0].toFloat())
|
|
||||||
}
|
|
||||||
|
|
||||||
val uniquesToCheck =
|
|
||||||
if (currentConstruction is Building && currentConstruction.isAnyWonder()) {
|
|
||||||
uniqueMap.getUniques(UniqueType.PercentProductionWonders)
|
|
||||||
} else if (currentConstruction is Building && !currentConstruction.isAnyWonder()) {
|
|
||||||
uniqueMap.getUniques(UniqueType.PercentProductionBuildings)
|
|
||||||
} else if (currentConstruction is BaseUnit) {
|
|
||||||
uniqueMap.getUniques(UniqueType.PercentProductionUnits)
|
|
||||||
} else { // Science/Gold production
|
|
||||||
sequenceOf()
|
|
||||||
}
|
|
||||||
for (unique in uniquesToCheck) {
|
|
||||||
if (!unique.conditionalsApply(cityInfo.civInfo, cityInfo)) continue
|
|
||||||
if (constructionMatchesFilter(currentConstruction, unique.params[1]) && cityInfo.matchesFilter(unique.params[2]))
|
|
||||||
stats.production += unique.params[0].toInt()
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
for (unique in uniqueMap.getUniques(UniqueType.StatPercentFromReligionFollowers))
|
|
||||||
stats.add(
|
|
||||||
Stat.valueOf(unique.params[1]),
|
|
||||||
min(
|
|
||||||
unique.params[0].toFloat() * cityInfo.religion.getFollowersOfMajorityReligion(),
|
|
||||||
unique.params[2].toFloat()
|
|
||||||
)
|
|
||||||
)
|
|
||||||
|
|
||||||
return stats
|
|
||||||
}
|
|
||||||
|
|
||||||
private fun getStatPercentBonusesFromUnitSupply(): Stats {
|
private fun getStatPercentBonusesFromUnitSupply(): Stats {
|
||||||
val stats = Stats()
|
val stats = Stats()
|
||||||
val supplyDeficit = cityInfo.civInfo.stats().getUnitSupplyDeficit()
|
val supplyDeficit = cityInfo.civInfo.stats().getUnitSupplyDeficit()
|
||||||
@ -457,19 +438,12 @@ class CityStats(val cityInfo: CityInfo) {
|
|||||||
val newStatPercentBonusList = StatMap()
|
val newStatPercentBonusList = StatMap()
|
||||||
|
|
||||||
newStatPercentBonusList["Golden Age"] = getStatPercentBonusesFromGoldenAge(cityInfo.civInfo.goldenAges.isGoldenAge())
|
newStatPercentBonusList["Golden Age"] = getStatPercentBonusesFromGoldenAge(cityInfo.civInfo.goldenAges.isGoldenAge())
|
||||||
newStatPercentBonusList["Policies"] = getStatPercentBonusesFromUniques(currentConstruction, cityInfo.civInfo.policies.policyUniques.getAllUniques())
|
|
||||||
newStatPercentBonusList["Buildings"] = getStatPercentBonusesFromUniques(currentConstruction, localBuildingUniques)
|
|
||||||
.plus(cityInfo.cityConstructions.getStatPercentBonuses()) // This function is to be deprecated but it'll take a while.
|
.plus(cityInfo.cityConstructions.getStatPercentBonuses()) // This function is to be deprecated but it'll take a while.
|
||||||
newStatPercentBonusList["Wonders"] = getStatPercentBonusesFromUniques(currentConstruction, cityInfo.civInfo.getCivWideBuildingUniques(cityInfo))
|
|
||||||
newStatPercentBonusList["Railroads"] = getStatPercentBonusesFromRailroad() // Name chosen same as tech, for translation, but theoretically independent
|
newStatPercentBonusList["Railroads"] = getStatPercentBonusesFromRailroad() // Name chosen same as tech, for translation, but theoretically independent
|
||||||
val resourceUniques = cityInfo.civInfo.getCivResources().asSequence().flatMap { it.resource.uniqueObjects }
|
|
||||||
newStatPercentBonusList["Resources"] = getStatPercentBonusesFromUniques(currentConstruction, resourceUniques)
|
|
||||||
newStatPercentBonusList["National ability"] = getStatPercentBonusesFromNationUnique(currentConstruction)
|
|
||||||
newStatPercentBonusList["Puppet City"] = getStatPercentBonusesFromPuppetCity()
|
newStatPercentBonusList["Puppet City"] = getStatPercentBonusesFromPuppetCity()
|
||||||
newStatPercentBonusList["Religion"] = getStatPercentBonusesFromUniques(currentConstruction, cityInfo.religion.getUniques())
|
|
||||||
newStatPercentBonusList["Unit Supply"] = getStatPercentBonusesFromUnitSupply()
|
newStatPercentBonusList["Unit Supply"] = getStatPercentBonusesFromUnitSupply()
|
||||||
|
|
||||||
for((source, stats) in getStatsPercentBonusesFromUniquesBySource())
|
for ((source, stats) in getStatsPercentBonusesFromUniquesBySource(currentConstruction))
|
||||||
newStatPercentBonusList.add(source, stats)
|
newStatPercentBonusList.add(source, stats)
|
||||||
|
|
||||||
if (UncivGame.Current.superchargedForDebug) {
|
if (UncivGame.Current.superchargedForDebug) {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user