From 4343137b823cc7130d0177f170503a84a2be47de Mon Sep 17 00:00:00 2001 From: Xander Lenstra <71121390+xlenstra@users.noreply.github.com> Date: Tue, 21 Sep 2021 19:26:14 +0200 Subject: [PATCH] Save the sources of uniques with the uniques themselves (#5281) --- .../com/unciv/logic/trade/TradeEvaluation.kt | 2 +- core/src/com/unciv/models/ruleset/Belief.kt | 3 ++- core/src/com/unciv/models/ruleset/Building.kt | 7 ++++- core/src/com/unciv/models/ruleset/Era.kt | 5 ++-- core/src/com/unciv/models/ruleset/Nation.kt | 3 ++- core/src/com/unciv/models/ruleset/Policy.kt | 3 ++- .../com/unciv/models/ruleset/RuinReward.kt | 3 ++- core/src/com/unciv/models/ruleset/Ruleset.kt | 3 ++- .../unciv/models/ruleset/tech/Technology.kt | 3 ++- .../com/unciv/models/ruleset/tile/Terrain.kt | 3 ++- .../models/ruleset/tile/TileImprovement.kt | 3 ++- .../unciv/models/ruleset/tile/TileResource.kt | 3 ++- .../com/unciv/models/ruleset/unique/Unique.kt | 2 +- .../unciv/models/ruleset/unique/UniqueType.kt | 26 +++++++++++++++++-- .../com/unciv/models/ruleset/unit/BaseUnit.kt | 3 ++- .../unciv/models/ruleset/unit/Promotion.kt | 3 ++- .../com/unciv/models/ruleset/unit/UnitType.kt | 3 ++- 17 files changed, 59 insertions(+), 19 deletions(-) diff --git a/core/src/com/unciv/logic/trade/TradeEvaluation.kt b/core/src/com/unciv/logic/trade/TradeEvaluation.kt index 45598a25be..9c46494ba4 100644 --- a/core/src/com/unciv/logic/trade/TradeEvaluation.kt +++ b/core/src/com/unciv/logic/trade/TradeEvaluation.kt @@ -254,7 +254,7 @@ class TradeEvaluation { fun distanceCityTradeModifier(civInfo: CivilizationInfo, capitalcity: CityInfo, city: CityInfo): Int{ val distanceBetweenCities = capitalcity.getCenterTile().aerialDistanceTo(city.getCenterTile()) - if (distanceBetweenCities < 500) return 0 + if (distanceBetweenCities < 500) return 0 return min(50, (500 - distanceBetweenCities) * civInfo.getEraNumber()) } diff --git a/core/src/com/unciv/models/ruleset/Belief.kt b/core/src/com/unciv/models/ruleset/Belief.kt index 01df7ec323..56d8494959 100644 --- a/core/src/com/unciv/models/ruleset/Belief.kt +++ b/core/src/com/unciv/models/ruleset/Belief.kt @@ -2,6 +2,7 @@ package com.unciv.models.ruleset import com.unciv.UncivGame import com.unciv.models.ruleset.unique.Unique +import com.unciv.models.ruleset.unique.UniqueTarget import com.unciv.models.stats.INamed import com.unciv.models.translations.tr import com.unciv.ui.civilopedia.FormattedLine @@ -12,7 +13,7 @@ class Belief : INamed, ICivilopediaText, IHasUniques { override var name: String = "" var type: BeliefType = BeliefType.None override var uniques = ArrayList() - override val uniqueObjects: List by lazy { uniques.map { Unique(it) } } + override val uniqueObjects: List by lazy { uniques.map { Unique(it, UniqueTarget.Belief, name) } } override var civilopediaText = listOf() diff --git a/core/src/com/unciv/models/ruleset/Building.kt b/core/src/com/unciv/models/ruleset/Building.kt index 29e9774c59..ff28db4fd6 100644 --- a/core/src/com/unciv/models/ruleset/Building.kt +++ b/core/src/com/unciv/models/ruleset/Building.kt @@ -8,6 +8,7 @@ import com.unciv.models.Counter import com.unciv.models.ruleset.tile.ResourceType import com.unciv.models.ruleset.tile.TileImprovement import com.unciv.models.ruleset.unique.Unique +import com.unciv.models.ruleset.unique.UniqueTarget import com.unciv.models.ruleset.unique.UniqueTriggerActivation import com.unciv.models.ruleset.unique.UniqueType import com.unciv.models.stats.NamedStats @@ -66,7 +67,11 @@ class Building : NamedStats(), INonPerpetualConstruction, ICivilopediaText { var uniqueTo: String? = null var quote: String = "" override var uniques = ArrayList() - override val uniqueObjects: List by lazy { uniques.map { Unique(it) } } + override val uniqueObjects: List by lazy { + uniques.map { + Unique(it, if (isAnyWonder()) UniqueTarget.Wonder else UniqueTarget.Building, name) + } + } private var replacementTextForUniques = "" override var civilopediaText = listOf() diff --git a/core/src/com/unciv/models/ruleset/Era.kt b/core/src/com/unciv/models/ruleset/Era.kt index 7f365d2b51..84ea77bddd 100644 --- a/core/src/com/unciv/models/ruleset/Era.kt +++ b/core/src/com/unciv/models/ruleset/Era.kt @@ -4,6 +4,7 @@ import com.badlogic.gdx.graphics.Color import com.unciv.logic.civilization.CityStateType import com.unciv.logic.civilization.diplomacy.RelationshipLevel import com.unciv.models.ruleset.unique.Unique +import com.unciv.models.ruleset.unique.UniqueTarget import com.unciv.models.stats.INamed import com.unciv.ui.utils.colorFromRGB @@ -32,12 +33,12 @@ class Era : INamed, IHasUniques { var iconRGB: List? = null override var uniques: ArrayList = arrayListOf() - override val uniqueObjects: List by lazy { uniques.map { Unique(it) } } + override val uniqueObjects: List by lazy { uniques.map { Unique(it, UniqueTarget.Era, name) } } private fun initBonuses(bonusMap: Map>): Map> { val objectMap = HashMap>() for ((cityStateType, bonusList) in bonusMap) { - objectMap[CityStateType.valueOf(cityStateType)] = bonusList.map { Unique(it) } + objectMap[CityStateType.valueOf(cityStateType)] = bonusList.map { Unique(it, UniqueTarget.CityState) } } return objectMap } diff --git a/core/src/com/unciv/models/ruleset/Nation.kt b/core/src/com/unciv/models/ruleset/Nation.kt index 088bbfa772..84213d6f49 100644 --- a/core/src/com/unciv/models/ruleset/Nation.kt +++ b/core/src/com/unciv/models/ruleset/Nation.kt @@ -5,6 +5,7 @@ import com.unciv.Constants import com.unciv.UncivGame import com.unciv.logic.civilization.CityStateType import com.unciv.models.ruleset.unique.Unique +import com.unciv.models.ruleset.unique.UniqueTarget import com.unciv.models.stats.INamed import com.unciv.models.translations.squareBraceRegex import com.unciv.models.translations.tr @@ -43,7 +44,7 @@ class Nation : INamed, ICivilopediaText, IHasUniques { lateinit var outerColor: List var uniqueName = "" override var uniques = ArrayList() - override val uniqueObjects: List by lazy { uniques.map { Unique(it) } } + override val uniqueObjects: List by lazy { uniques.map { Unique(it, UniqueTarget.Nation, name) } } var uniqueText = "" var innerColor: List? = null var startBias = ArrayList() diff --git a/core/src/com/unciv/models/ruleset/Policy.kt b/core/src/com/unciv/models/ruleset/Policy.kt index b55f96958b..c25a125876 100644 --- a/core/src/com/unciv/models/ruleset/Policy.kt +++ b/core/src/com/unciv/models/ruleset/Policy.kt @@ -1,6 +1,7 @@ package com.unciv.models.ruleset import com.unciv.models.ruleset.unique.Unique +import com.unciv.models.ruleset.unique.UniqueTarget import com.unciv.models.stats.INamed import com.unciv.models.translations.tr import com.unciv.ui.civilopedia.FormattedLine @@ -11,7 +12,7 @@ open class Policy : INamed, IHasUniques, ICivilopediaText { override lateinit var name: String override var uniques: ArrayList = ArrayList() - override val uniqueObjects: List by lazy { uniques.map { Unique(it) } } + override val uniqueObjects: List by lazy { uniques.map { Unique(it, UniqueTarget.Policy, name) } } var row: Int = 0 var column: Int = 0 var requires: ArrayList? = null diff --git a/core/src/com/unciv/models/ruleset/RuinReward.kt b/core/src/com/unciv/models/ruleset/RuinReward.kt index 0b26510849..d8a03a5289 100644 --- a/core/src/com/unciv/models/ruleset/RuinReward.kt +++ b/core/src/com/unciv/models/ruleset/RuinReward.kt @@ -1,6 +1,7 @@ package com.unciv.models.ruleset import com.unciv.models.ruleset.unique.Unique +import com.unciv.models.ruleset.unique.UniqueTarget import com.unciv.models.stats.INamed import com.unciv.ui.civilopedia.FormattedLine import com.unciv.ui.civilopedia.ICivilopediaText @@ -10,7 +11,7 @@ class RuinReward : INamed, ICivilopediaText, IHasUniques { val notification: String = "" override var uniques = ArrayList() @delegate:Transient // Defense in depth against mad modders - override val uniqueObjects: List by lazy { uniques.map { Unique(it) } } + override val uniqueObjects: List by lazy { uniques.map { Unique(it, UniqueTarget.Ruins, name) } } val excludedDifficulties: List = listOf() val weight: Int = 1 diff --git a/core/src/com/unciv/models/ruleset/Ruleset.kt b/core/src/com/unciv/models/ruleset/Ruleset.kt index 1dd5d0bcb7..d6bd5034a0 100644 --- a/core/src/com/unciv/models/ruleset/Ruleset.kt +++ b/core/src/com/unciv/models/ruleset/Ruleset.kt @@ -12,6 +12,7 @@ import com.unciv.models.ruleset.tile.Terrain import com.unciv.models.ruleset.tile.TileImprovement import com.unciv.models.ruleset.tile.TileResource import com.unciv.models.ruleset.unique.Unique +import com.unciv.models.ruleset.unique.UniqueTarget import com.unciv.models.ruleset.unique.UniqueType import com.unciv.models.ruleset.unit.BaseUnit import com.unciv.models.ruleset.unit.Promotion @@ -153,7 +154,7 @@ class Ruleset { try { modOptions = jsonParser.getFromJson(ModOptions::class.java, modOptionsFile) } catch (ex: Exception) {} - modOptions.uniqueObjects = modOptions.uniques.map { Unique(it) } + modOptions.uniqueObjects = modOptions.uniques.map { Unique(it, UniqueTarget.ModOptions) } } val techFile = folderHandle.child("Techs.json") diff --git a/core/src/com/unciv/models/ruleset/tech/Technology.kt b/core/src/com/unciv/models/ruleset/tech/Technology.kt index ce6e608dd6..d6d2ff0c0d 100644 --- a/core/src/com/unciv/models/ruleset/tech/Technology.kt +++ b/core/src/com/unciv/models/ruleset/tech/Technology.kt @@ -7,6 +7,7 @@ import com.unciv.models.ruleset.Building import com.unciv.models.ruleset.IHasUniques import com.unciv.models.ruleset.Ruleset import com.unciv.models.ruleset.unique.Unique +import com.unciv.models.ruleset.unique.UniqueTarget import com.unciv.models.translations.tr import com.unciv.models.ruleset.unit.BaseUnit import com.unciv.models.stats.INamed @@ -22,7 +23,7 @@ class Technology: INamed, ICivilopediaText, IHasUniques { var cost: Int = 0 var prerequisites = HashSet() override var uniques = ArrayList() - override val uniqueObjects: List by lazy { uniques.map { Unique(it) } } + override val uniqueObjects: List by lazy { uniques.map { Unique(it, UniqueTarget.Tech, name) } } var column: TechColumn? = null // The column that this tech is in the tech tree var row: Int = 0 diff --git a/core/src/com/unciv/models/ruleset/tile/Terrain.kt b/core/src/com/unciv/models/ruleset/tile/Terrain.kt index 180563c871..a6bb8d737b 100644 --- a/core/src/com/unciv/models/ruleset/tile/Terrain.kt +++ b/core/src/com/unciv/models/ruleset/tile/Terrain.kt @@ -6,6 +6,7 @@ import com.unciv.models.ruleset.Belief import com.unciv.models.ruleset.IHasUniques import com.unciv.models.ruleset.Ruleset import com.unciv.models.ruleset.unique.Unique +import com.unciv.models.ruleset.unique.UniqueTarget import com.unciv.models.stats.NamedStats import com.unciv.ui.civilopedia.FormattedLine import com.unciv.ui.civilopedia.ICivilopediaText @@ -28,7 +29,7 @@ class Terrain : NamedStats(), ICivilopediaText, IHasUniques { /** Uniques (Properties such as Temp/humidity, Fresh water, elevation, rough, defense, Natural Wonder specials) */ override var uniques = ArrayList() - override val uniqueObjects: List by lazy { uniques.map { Unique(it) } } + override val uniqueObjects: List by lazy { uniques.map { Unique(it, UniqueTarget.Terrain, name) } } /** Natural Wonder weight: probability to be picked */ var weight = 10 diff --git a/core/src/com/unciv/models/ruleset/tile/TileImprovement.kt b/core/src/com/unciv/models/ruleset/tile/TileImprovement.kt index 660aefb13d..f7ad2800c8 100644 --- a/core/src/com/unciv/models/ruleset/tile/TileImprovement.kt +++ b/core/src/com/unciv/models/ruleset/tile/TileImprovement.kt @@ -8,6 +8,7 @@ import com.unciv.logic.map.RoadStatus import com.unciv.models.ruleset.IHasUniques import com.unciv.models.ruleset.Ruleset import com.unciv.models.ruleset.unique.Unique +import com.unciv.models.ruleset.unique.UniqueTarget import com.unciv.models.stats.NamedStats import com.unciv.models.translations.tr import com.unciv.ui.civilopedia.FormattedLine @@ -22,7 +23,7 @@ class TileImprovement : NamedStats(), ICivilopediaText, IHasUniques { var techRequired: String? = null var uniqueTo:String? = null override var uniques = ArrayList() - override val uniqueObjects: List by lazy { uniques.map { Unique(it) } } + override val uniqueObjects: List by lazy { uniques.map { Unique(it, UniqueTarget.Improvement, name) } } val shortcutKey: Char? = null val turnsToBuild: Int = 0 // This is the base cost. diff --git a/core/src/com/unciv/models/ruleset/tile/TileResource.kt b/core/src/com/unciv/models/ruleset/tile/TileResource.kt index 84dd409625..23c4dc82f7 100644 --- a/core/src/com/unciv/models/ruleset/tile/TileResource.kt +++ b/core/src/com/unciv/models/ruleset/tile/TileResource.kt @@ -4,6 +4,7 @@ import com.unciv.models.ruleset.Belief import com.unciv.models.ruleset.IHasUniques import com.unciv.models.ruleset.Ruleset import com.unciv.models.ruleset.unique.Unique +import com.unciv.models.ruleset.unique.UniqueTarget import com.unciv.models.stats.NamedStats import com.unciv.models.stats.Stats import com.unciv.ui.civilopedia.FormattedLine @@ -19,7 +20,7 @@ class TileResource : NamedStats(), ICivilopediaText, IHasUniques { @Deprecated("As of 3.16.16 - replaced by uniques") var unique: String? = null override var uniques: ArrayList = arrayListOf() - override val uniqueObjects: List by lazy { uniques.map { Unique(it) } } + override val uniqueObjects: List by lazy { uniques.map { Unique(it, UniqueTarget.Resource, name) } } override var civilopediaText = listOf() diff --git a/core/src/com/unciv/models/ruleset/unique/Unique.kt b/core/src/com/unciv/models/ruleset/unique/Unique.kt index af2f37234c..3a74da8fee 100644 --- a/core/src/com/unciv/models/ruleset/unique/Unique.kt +++ b/core/src/com/unciv/models/ruleset/unique/Unique.kt @@ -7,7 +7,7 @@ import com.unciv.logic.civilization.CivilizationInfo import com.unciv.models.ruleset.Ruleset -class Unique(val text:String) { +class Unique(val text: String, val sourceObjectType: UniqueTarget? = null, val sourceObjectName: String? = null) { /** This is so the heavy regex-based parsing is only activated once per unique, instead of every time it's called * - for instance, in the city screen, we call every tile unique for every tile, which can lead to ANRs */ val placeholderText = text.getPlaceholderText() diff --git a/core/src/com/unciv/models/ruleset/unique/UniqueType.kt b/core/src/com/unciv/models/ruleset/unique/UniqueType.kt index 782c9c7cb6..504ba8550e 100644 --- a/core/src/com/unciv/models/ruleset/unique/UniqueType.kt +++ b/core/src/com/unciv/models/ruleset/unique/UniqueType.kt @@ -4,14 +4,36 @@ import com.unciv.models.ruleset.Ruleset import com.unciv.models.translations.getPlaceholderParameters import com.unciv.models.translations.getPlaceholderText -enum class UniqueTarget{ +enum class UniqueTarget { /** Buildings, units, nations, policies, religions, techs etc. * Basically anything caught by CivInfo.getMatchingUniques. */ Global, + + // Civilization-specific + Nation, + Era, + Tech, + Policy, + Belief, + + // City-specific Building, + Wonder, + + // Unit-specific Unit, + UnitType, + Promotion, + + // Tile-specific + Terrain, Improvement, - CityState + Resource, + Ruins, + + // Other + CityState, + ModOptions, } enum class UniqueType(val text:String, vararg target: UniqueTarget) { diff --git a/core/src/com/unciv/models/ruleset/unit/BaseUnit.kt b/core/src/com/unciv/models/ruleset/unit/BaseUnit.kt index bd49bf3074..335d540f97 100644 --- a/core/src/com/unciv/models/ruleset/unit/BaseUnit.kt +++ b/core/src/com/unciv/models/ruleset/unit/BaseUnit.kt @@ -7,6 +7,7 @@ import com.unciv.logic.civilization.CivilizationInfo import com.unciv.logic.map.MapUnit import com.unciv.models.ruleset.Ruleset import com.unciv.models.ruleset.unique.Unique +import com.unciv.models.ruleset.unique.UniqueTarget import com.unciv.models.ruleset.unique.UniqueType import com.unciv.models.stats.INamed import com.unciv.models.stats.Stat @@ -40,7 +41,7 @@ class BaseUnit : INamed, INonPerpetualConstruction, ICivilopediaText { var requiredTech: String? = null private var requiredResource: String? = null override var uniques = ArrayList() // Can not be a hashset as that would remove doubles - override val uniqueObjects: List by lazy { uniques.map { Unique(it) } } + override val uniqueObjects: List by lazy { uniques.map { Unique(it, UniqueTarget.Unit, name) } } private var replacementTextForUniques = "" var promotions = HashSet() var obsoleteTech: String? = null diff --git a/core/src/com/unciv/models/ruleset/unit/Promotion.kt b/core/src/com/unciv/models/ruleset/unit/Promotion.kt index 9024da6c73..efc790e37c 100644 --- a/core/src/com/unciv/models/ruleset/unit/Promotion.kt +++ b/core/src/com/unciv/models/ruleset/unit/Promotion.kt @@ -3,6 +3,7 @@ package com.unciv.models.ruleset.unit import com.unciv.models.ruleset.IHasUniques import com.unciv.models.ruleset.Ruleset import com.unciv.models.ruleset.unique.Unique +import com.unciv.models.ruleset.unique.UniqueTarget import com.unciv.models.stats.INamed import com.unciv.models.translations.tr import com.unciv.ui.civilopedia.FormattedLine @@ -22,7 +23,7 @@ class Promotion : INamed, ICivilopediaText, IHasUniques { if (effect.isNotEmpty()) yield(effect) yieldAll(uniques) } - override val uniqueObjects: List by lazy { uniquesWithEffect().map { Unique(it) }.toList() } + override val uniqueObjects: List by lazy { uniquesWithEffect().map { Unique(it, UniqueTarget.Promotion, name) }.toList() } override var civilopediaText = listOf() diff --git a/core/src/com/unciv/models/ruleset/unit/UnitType.kt b/core/src/com/unciv/models/ruleset/unit/UnitType.kt index 02385633f7..f45559aefe 100644 --- a/core/src/com/unciv/models/ruleset/unit/UnitType.kt +++ b/core/src/com/unciv/models/ruleset/unit/UnitType.kt @@ -2,6 +2,7 @@ package com.unciv.models.ruleset.unit import com.unciv.models.ruleset.IHasUniques import com.unciv.models.ruleset.unique.Unique +import com.unciv.models.ruleset.unique.UniqueTarget import com.unciv.models.stats.INamed @@ -23,7 +24,7 @@ class UnitType() : INamed, IHasUniques { private val unitMovementType: UnitMovementType? by lazy { if (movementType == null) null else UnitMovementType.valueOf(movementType!!) } override var uniques: ArrayList = ArrayList() - override val uniqueObjects: List by lazy { uniques.map { Unique(it) } } + override val uniqueObjects: List by lazy { uniques.map { Unique(it, UniqueTarget.Unit, name) } } constructor(name: String, domain: String? = null) : this() { this.name = name