mirror of
https://github.com/yairm210/Unciv.git
synced 2025-07-04 23:40:01 +07:00
Resolved #8200 - get correct civ-wide stats from City-States with the correct unique
This commit is contained in:
@ -269,13 +269,16 @@ class CivInfoStats(val civInfo: CivilizationInfo) {
|
|||||||
if (unique.isOfType(UniqueType.StatsFromGlobalFollowers))
|
if (unique.isOfType(UniqueType.StatsFromGlobalFollowers))
|
||||||
statMap.add(
|
statMap.add(
|
||||||
"Religion",
|
"Religion",
|
||||||
unique.stats * civInfo.religionManager.numberOfFollowersFollowingThisReligion(unique.params[2]).toFloat() / unique.params[1].toFloat()
|
unique.stats * civInfo.religionManager.numberOfFollowersFollowingThisReligion(
|
||||||
|
unique.params[2]
|
||||||
|
).toFloat() / unique.params[1].toFloat()
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
for (unique in civInfo.getMatchingUniques(UniqueType.StatsPerPolicies)) {
|
for (unique in civInfo.getMatchingUniques(UniqueType.StatsPerPolicies)) {
|
||||||
val amount = civInfo.policies.getAdoptedPolicies().count { !Policy.isBranchCompleteByName(it) } / unique.params[1].toInt()
|
val amount = civInfo.policies.getAdoptedPolicies()
|
||||||
|
.count { !Policy.isBranchCompleteByName(it) } / unique.params[1].toInt()
|
||||||
statMap.add("Policies", unique.stats.times(amount))
|
statMap.add("Policies", unique.stats.times(amount))
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -292,6 +295,14 @@ class CivInfoStats(val civInfo: CivilizationInfo) {
|
|||||||
|
|
||||||
statMap.add("Natural Wonders", statsPerNaturalWonder.times(civInfo.naturalWonders.size))
|
statMap.add("Natural Wonders", statsPerNaturalWonder.times(civInfo.naturalWonders.size))
|
||||||
|
|
||||||
|
if (statMap.contains(UniqueTarget.CityState.name)) {
|
||||||
|
for (unique in civInfo.getMatchingUniques(UniqueType.BonusStatsFromCityStates)) {
|
||||||
|
val bonusPercent = unique.params[0].toPercent()
|
||||||
|
val bonusStat = Stat.valueOf(unique.params[1])
|
||||||
|
statMap[UniqueTarget.CityState.name]!![bonusStat] *= bonusPercent
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return statMap
|
return statMap
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -81,7 +81,7 @@ open class Stats(
|
|||||||
}
|
}
|
||||||
|
|
||||||
/** Adds each value of another [Stats] instance to this one in place */
|
/** Adds each value of another [Stats] instance to this one in place */
|
||||||
fun add(other: Stats) {
|
fun add(other: Stats): Stats {
|
||||||
production += other.production
|
production += other.production
|
||||||
food += other.food
|
food += other.food
|
||||||
gold += other.gold
|
gold += other.gold
|
||||||
@ -89,6 +89,7 @@ open class Stats(
|
|||||||
culture += other.culture
|
culture += other.culture
|
||||||
happiness += other.happiness
|
happiness += other.happiness
|
||||||
faith += other.faith
|
faith += other.faith
|
||||||
|
return this
|
||||||
}
|
}
|
||||||
|
|
||||||
/** @return a new [Stats] instance containing the sum of its operands value by value */
|
/** @return a new [Stats] instance containing the sum of its operands value by value */
|
||||||
@ -239,9 +240,8 @@ open class Stats(
|
|||||||
|
|
||||||
class StatMap:LinkedHashMap<String,Stats>() {
|
class StatMap:LinkedHashMap<String,Stats>() {
|
||||||
fun add(source: String, stats: Stats) {
|
fun add(source: String, stats: Stats) {
|
||||||
if (!containsKey(source)) put(source, stats)
|
// We always clone to avoid touching the mutable stats of uniques
|
||||||
else put(source, get(source)!! + stats)
|
if (!containsKey(source)) put(source, stats.clone())
|
||||||
// This CAN'T be get(source)!!.add() because the initial stats we get are sometimes from other places -
|
else get(source)!!.add(stats)
|
||||||
// for instance the Cities is from the currentCityStats and if we add to that we change the value in the cities themselves!
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -26,7 +26,6 @@ import com.unciv.models.ruleset.Quest
|
|||||||
import com.unciv.models.ruleset.tile.ResourceType
|
import com.unciv.models.ruleset.tile.ResourceType
|
||||||
import com.unciv.models.ruleset.unique.Unique
|
import com.unciv.models.ruleset.unique.Unique
|
||||||
import com.unciv.models.ruleset.unique.UniqueType
|
import com.unciv.models.ruleset.unique.UniqueType
|
||||||
import com.unciv.models.stats.Stat
|
|
||||||
import com.unciv.models.translations.fillPlaceholders
|
import com.unciv.models.translations.fillPlaceholders
|
||||||
import com.unciv.models.translations.tr
|
import com.unciv.models.translations.tr
|
||||||
import com.unciv.ui.audio.MusicMood
|
import com.unciv.ui.audio.MusicMood
|
||||||
@ -48,7 +47,6 @@ import com.unciv.ui.utils.extensions.onClick
|
|||||||
import com.unciv.ui.utils.extensions.setFontSize
|
import com.unciv.ui.utils.extensions.setFontSize
|
||||||
import com.unciv.ui.utils.extensions.surroundWithCircle
|
import com.unciv.ui.utils.extensions.surroundWithCircle
|
||||||
import com.unciv.ui.utils.extensions.toLabel
|
import com.unciv.ui.utils.extensions.toLabel
|
||||||
import com.unciv.ui.utils.extensions.toPercent
|
|
||||||
import com.unciv.ui.utils.extensions.toTextButton
|
import com.unciv.ui.utils.extensions.toTextButton
|
||||||
import kotlin.math.floor
|
import kotlin.math.floor
|
||||||
import kotlin.math.roundToInt
|
import kotlin.math.roundToInt
|
||||||
@ -246,15 +244,13 @@ class DiplomacyScreen(
|
|||||||
}
|
}
|
||||||
diplomacyTable.row().padTop(15f)
|
diplomacyTable.row().padTop(15f)
|
||||||
|
|
||||||
var friendBonusText = "{When Friends:}\n".tr()
|
var friendBonusText = "When Friends:".tr()+"\n"
|
||||||
val friendBonusObjects = viewingCiv.cityStateFunctions.getCityStateBonuses(otherCiv.cityStateType, RelationshipLevel.Friend)
|
val friendBonusObjects = viewingCiv.cityStateFunctions.getCityStateBonuses(otherCiv.cityStateType, RelationshipLevel.Friend)
|
||||||
val friendBonusStrings = getAdjustedBonuses(friendBonusObjects)
|
friendBonusText += friendBonusObjects.joinToString(separator = "\n") { it.text.tr() }
|
||||||
friendBonusText += friendBonusStrings.joinToString(separator = "\n") { it.tr() }
|
|
||||||
|
|
||||||
var allyBonusText = "{When Allies:}\n".tr()
|
var allyBonusText = "When Allies:".tr()+"\n"
|
||||||
val allyBonusObjects = viewingCiv.cityStateFunctions.getCityStateBonuses(otherCiv.cityStateType, RelationshipLevel.Ally)
|
val allyBonusObjects = viewingCiv.cityStateFunctions.getCityStateBonuses(otherCiv.cityStateType, RelationshipLevel.Ally)
|
||||||
val allyBonusStrings = getAdjustedBonuses(allyBonusObjects)
|
allyBonusText += allyBonusObjects.joinToString(separator = "\n") { it.text.tr() }
|
||||||
allyBonusText += allyBonusStrings.joinToString(separator = "\n") { it.tr() }
|
|
||||||
|
|
||||||
val relationLevel = otherCivDiplomacyManager.relationshipLevel()
|
val relationLevel = otherCivDiplomacyManager.relationshipLevel()
|
||||||
if (relationLevel >= RelationshipLevel.Friend) {
|
if (relationLevel >= RelationshipLevel.Friend) {
|
||||||
@ -284,40 +280,9 @@ class DiplomacyScreen(
|
|||||||
return diplomacyTable
|
return diplomacyTable
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Given a list of [bonuses], returns a list of pretty strings with updated values for Siam-like uniques
|
fun fillUniquePlaceholders(unique:Unique, vararg strings: String):String {
|
||||||
* Assumes that each bonus contains only one stat type */
|
return unique.placeholderText.fillPlaceholders(*strings) + unique.conditionals.map { " <${it.text}>" }
|
||||||
private fun getAdjustedBonuses(bonuses: Sequence<Unique>): List<String> {
|
.joinToString("")
|
||||||
val bonusStrings = ArrayList<String>()
|
|
||||||
for (bonus in bonuses) {
|
|
||||||
var improved = false
|
|
||||||
for (unique in viewingCiv.getMatchingUniques(UniqueType.StatBonusPercentFromCityStates)) {
|
|
||||||
val boostAmount = unique.params[0].toPercent()
|
|
||||||
val boostedStat = Stat.valueOf(unique.params[1])
|
|
||||||
when (bonus.type) {
|
|
||||||
UniqueType.Stats -> { // "[+3 Faith]"
|
|
||||||
if (bonus.stats[boostedStat] > 0) {
|
|
||||||
bonusStrings.add(
|
|
||||||
bonus.text.fillPlaceholders(
|
|
||||||
(bonus.stats * boostAmount).toStringWithDecimals()))
|
|
||||||
improved = true
|
|
||||||
}
|
|
||||||
}
|
|
||||||
UniqueType.StatsPerCity -> { // "[+1 Food] [in every city]"
|
|
||||||
if (bonus.stats[boostedStat] > 0) {
|
|
||||||
bonusStrings.add(
|
|
||||||
bonus.text.fillPlaceholders(
|
|
||||||
(bonus.stats * boostAmount).toStringWithDecimals(), bonus.params[1]))
|
|
||||||
improved = true
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else -> Unit // To silence "exhaustive when" warning
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// No matching unique, add it unmodified
|
|
||||||
if (!improved)
|
|
||||||
bonusStrings.add(bonus.text)
|
|
||||||
}
|
|
||||||
return bonusStrings
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun getCityStateDiplomacyTable(otherCiv: CivilizationInfo): Table {
|
private fun getCityStateDiplomacyTable(otherCiv: CivilizationInfo): Table {
|
||||||
|
Reference in New Issue
Block a user