Source object names for users unified

This commit is contained in:
Yair Morgenstern
2024-01-15 21:09:46 +02:00
parent 7f3be9dce2
commit b09354a042
5 changed files with 24 additions and 25 deletions

View File

@ -22,7 +22,7 @@ object BattleDamage {
UniqueTarget.Unit -> "Unit ability" UniqueTarget.Unit -> "Unit ability"
UniqueTarget.Nation -> "National ability" UniqueTarget.Nation -> "National ability"
UniqueTarget.Global -> GlobalUniques.getUniqueSourceDescription(unique) UniqueTarget.Global -> GlobalUniques.getUniqueSourceDescription(unique)
else -> "[${unique.sourceObjectName}] ([${unique.sourceObjectType?.name}])" else -> "[${unique.sourceObjectName}] ([${unique.getSourceNameForUser()}])"
}.tr() }.tr()
if (unique.conditionals.isEmpty()) return source if (unique.conditionals.isEmpty()) return source
@ -91,7 +91,7 @@ object BattleDamage {
// https://steamcommunity.com/sharedfiles/filedetails/?id=326411722#464287 // https://steamcommunity.com/sharedfiles/filedetails/?id=326411722#464287
val effect = unique.params[0].toInt() - 3 * distance val effect = unique.params[0].toInt() - 3 * distance
if (effect > 0) if (effect > 0)
modifiers.add("${unique.sourceObjectName} (${unique.sourceObjectType})", effect) modifiers.add("${unique.sourceObjectName} (${unique.getSourceNameForUser()})", effect)
} }
//https://www.carlsguides.com/strategy/civilization5/war/combatbonuses.php //https://www.carlsguides.com/strategy/civilization5/war/combatbonuses.php

View File

@ -1,10 +1,8 @@
package com.unciv.logic.city package com.unciv.logic.city
import com.unciv.Constants
import com.unciv.logic.map.tile.RoadStatus import com.unciv.logic.map.tile.RoadStatus
import com.unciv.models.Counter import com.unciv.models.Counter
import com.unciv.models.ruleset.Building import com.unciv.models.ruleset.Building
import com.unciv.models.ruleset.GlobalUniques
import com.unciv.models.ruleset.IConstruction import com.unciv.models.ruleset.IConstruction
import com.unciv.models.ruleset.INonPerpetualConstruction import com.unciv.models.ruleset.INonPerpetualConstruction
import com.unciv.models.ruleset.ModOptionsConstants import com.unciv.models.ruleset.ModOptionsConstants
@ -168,7 +166,7 @@ class CityStats(val city: City) {
if (!city.matchesFilter(unique.params[1])) continue if (!city.matchesFilter(unique.params[1])) continue
growthSources.add( growthSources.add(
getSourceNameForUnique(unique), unique.getSourceNameForUser(),
Stats(food = unique.params[0].toFloat() / 100f * totalFood) Stats(food = unique.params[0].toFloat() / 100f * totalFood)
) )
} }
@ -212,7 +210,7 @@ class CityStats(val city: City) {
if (unique.sourceObjectType==UniqueTarget.CityState) if (unique.sourceObjectType==UniqueTarget.CityState)
for (multiplierUnique in cityStateStatsMultipliers) for (multiplierUnique in cityStateStatsMultipliers)
stats[Stat.valueOf(multiplierUnique.params[1])] *= multiplierUnique.params[0].toPercent() stats[Stat.valueOf(multiplierUnique.params[1])] *= multiplierUnique.params[0].toPercent()
sourceToStats.addStats(stats, getSourceNameForUnique(unique), unique.sourceObjectName ?: "") sourceToStats.addStats(stats, unique.getSourceNameForUser(), unique.sourceObjectName ?: "")
} }
for (unique in city.getMatchingUniques(UniqueType.StatsPerCity)) for (unique in city.getMatchingUniques(UniqueType.StatsPerCity))
@ -223,7 +221,7 @@ class CityStats(val city: City) {
for (unique in city.getMatchingUniques(UniqueType.StatsPerPopulation)) for (unique in city.getMatchingUniques(UniqueType.StatsPerPopulation))
if (city.matchesFilter(unique.params[2])) { if (city.matchesFilter(unique.params[2])) {
val amountOfEffects = (city.population.population / unique.params[1].toInt()).toFloat() val amountOfEffects = (city.population.population / unique.params[1].toInt()).toFloat()
sourceToStats.addStats(unique.stats.times(amountOfEffects), getSourceNameForUnique(unique), unique.sourceObjectName ?: "") sourceToStats.addStats(unique.stats.times(amountOfEffects), unique.getSourceNameForUser(), unique.sourceObjectName ?: "")
} }
for (unique in city.getMatchingUniques(UniqueType.StatsFromCitiesOnSpecificTiles)) for (unique in city.getMatchingUniques(UniqueType.StatsFromCitiesOnSpecificTiles))
@ -235,18 +233,6 @@ class CityStats(val city: City) {
return sourceToStats return sourceToStats
} }
private fun getSourceNameForUnique(unique: Unique): String {
return when (unique.sourceObjectType) {
null -> ""
UniqueTarget.Global -> GlobalUniques.getUniqueSourceDescription(unique)
UniqueTarget.Wonder -> "Wonders"
UniqueTarget.Building -> "Buildings"
UniqueTarget.Policy -> "Policies"
UniqueTarget.CityState -> Constants.cityStates
else -> unique.sourceObjectType.name
}
}
private fun getStatPercentBonusesFromGoldenAge(isGoldenAge: Boolean): Stats { private fun getStatPercentBonusesFromGoldenAge(isGoldenAge: Boolean): Stats {
val stats = Stats() val stats = Stats()
if (isGoldenAge) { if (isGoldenAge) {
@ -260,7 +246,7 @@ class CityStats(val city: City) {
val sourceToStats = StatTreeNode() val sourceToStats = StatTreeNode()
fun addUniqueStats(unique:Unique, stat:Stat, amount:Float) { fun addUniqueStats(unique:Unique, stat:Stat, amount:Float) {
sourceToStats.addStats(Stats().add(stat, amount), getSourceNameForUnique(unique), unique.sourceObjectName ?: "") sourceToStats.addStats(Stats().add(stat, amount), unique.getSourceNameForUser(), unique.sourceObjectName ?: "")
} }
for (unique in city.getMatchingUniques(UniqueType.StatPercentBonus)) { for (unique in city.getMatchingUniques(UniqueType.StatPercentBonus)) {
@ -554,7 +540,7 @@ class CityStats(val city: City) {
val removedAmount = newFinalStatList.values.sumOf { it[statToBeRemoved].toDouble() } val removedAmount = newFinalStatList.values.sumOf { it[statToBeRemoved].toDouble() }
newFinalStatList.add( newFinalStatList.add(
getSourceNameForUnique(unique), unique.getSourceNameForUser(),
Stats().apply { this[statToBeRemoved] = -removedAmount.toFloat() } Stats().apply { this[statToBeRemoved] = -removedAmount.toFloat() }
) )
} }
@ -605,7 +591,7 @@ class CityStats(val city: City) {
// Note that negative food will also be nullified. Pretty sure that's conform civ V, but haven't checked. // Note that negative food will also be nullified. Pretty sure that's conform civ V, but haven't checked.
val amountToRemove = -newFinalStatList.values.sumOf { it[Stat.Food].toDouble() } val amountToRemove = -newFinalStatList.values.sumOf { it[Stat.Food].toDouble() }
newFinalStatList.add( newFinalStatList.add(
getSourceNameForUnique(growthNullifyingUnique), growthNullifyingUnique.getSourceNameForUser(),
Stats(food = amountToRemove.toFloat()) Stats(food = amountToRemove.toFloat())
) )
} }

View File

@ -309,7 +309,7 @@ class CivInfoStatsForNextTurn(val civInfo: Civilization) {
for (unique in civInfo.getMatchingUniques(UniqueType.Stats)) for (unique in civInfo.getMatchingUniques(UniqueType.Stats))
if (unique.sourceObjectType != UniqueTarget.Building && unique.sourceObjectType != UniqueTarget.Wonder) if (unique.sourceObjectType != UniqueTarget.Building && unique.sourceObjectType != UniqueTarget.Wonder)
statMap.add(unique.sourceObjectType!!.name, unique.stats) statMap.add(unique.getSourceNameForUser(), unique.stats)
for (unique in civInfo.getMatchingUniques(UniqueType.StatsPerStat)) { for (unique in civInfo.getMatchingUniques(UniqueType.StatsPerStat)) {
val amount = civInfo.getStatReserve(Stat.valueOf(unique.params[2])) / unique.params[1].toInt() val amount = civInfo.getStatReserve(Stat.valueOf(unique.params[2])) / unique.params[1].toInt()

View File

@ -292,7 +292,7 @@ class CivInfoTransientCache(val civInfo: Civilization) {
resourceBonusPercentage += unique.params[0].toFloat() / 100 resourceBonusPercentage += unique.params[0].toFloat() / 100
for (cityStateAlly in civInfo.getKnownCivs().filter { it.getAllyCiv() == civInfo.civName }) { for (cityStateAlly in civInfo.getKnownCivs().filter { it.getAllyCiv() == civInfo.civName }) {
for (resourceSupply in cityStateAlly.cityStateFunctions.getCityStateResourcesForAlly()) { for (resourceSupply in cityStateAlly.cityStateFunctions.getCityStateResourcesForAlly()) {
if (resourceSupply.resource.hasUnique(UniqueType.CannotBeTraded, StateForConditionals(civInfo))) continue if (resourceSupply.resource.hasUnique(UniqueType.CannotBeTraded, StateForConditionals(cityStateAlly))) continue
val newAmount = (resourceSupply.amount * resourceBonusPercentage).toInt() val newAmount = (resourceSupply.amount * resourceBonusPercentage).toInt()
cityStateProvidedResources.add(resourceSupply.copy(amount = newAmount)) cityStateProvidedResources.add(resourceSupply.copy(amount = newAmount))
} }
@ -306,7 +306,7 @@ class CivInfoTransientCache(val civInfo: Civilization) {
val resource = civInfo.gameInfo.ruleset.tileResources[unique.params[1]]!! val resource = civInfo.gameInfo.ruleset.tileResources[unique.params[1]]!!
newDetailedCivResources.add( newDetailedCivResources.add(
resource, resource,
unique.sourceObjectType?.name ?: "", unique.getSourceNameForUser(),
(unique.params[0].toFloat() * civInfo.getResourceModifier(resource)).toInt() (unique.params[0].toFloat() * civInfo.getResourceModifier(resource)).toInt()
) )
} }

View File

@ -7,6 +7,7 @@ import com.unciv.logic.battle.MapUnitCombatant
import com.unciv.logic.city.City import com.unciv.logic.city.City
import com.unciv.logic.civilization.Civilization import com.unciv.logic.civilization.Civilization
import com.unciv.logic.civilization.managers.ReligionState import com.unciv.logic.civilization.managers.ReligionState
import com.unciv.models.ruleset.GlobalUniques
import com.unciv.models.ruleset.Ruleset import com.unciv.models.ruleset.Ruleset
import com.unciv.models.ruleset.validation.UniqueValidator import com.unciv.models.ruleset.validation.UniqueValidator
import com.unciv.models.stats.Stat import com.unciv.models.stats.Stat
@ -72,6 +73,18 @@ class Unique(val text: String, val sourceObjectType: UniqueTarget? = null, val s
fun getDeprecationAnnotation(): Deprecated? = type?.getDeprecationAnnotation() fun getDeprecationAnnotation(): Deprecated? = type?.getDeprecationAnnotation()
fun getSourceNameForUser(): String {
return when (sourceObjectType) {
null -> ""
UniqueTarget.Global -> GlobalUniques.getUniqueSourceDescription(this)
UniqueTarget.Wonder -> "Wonders"
UniqueTarget.Building -> "Buildings"
UniqueTarget.Policy -> "Policies"
UniqueTarget.CityState -> Constants.cityStates
else -> sourceObjectType.name
}
}
fun getReplacementText(ruleset: Ruleset): String { fun getReplacementText(ruleset: Ruleset): String {
val deprecationAnnotation = getDeprecationAnnotation() ?: return "" val deprecationAnnotation = getDeprecationAnnotation() ?: return ""
val replacementUniqueText = deprecationAnnotation.replaceWith.expression val replacementUniqueText = deprecationAnnotation.replaceWith.expression