From 238e30b86cfe673a1c85f1154b702feb7be63963 Mon Sep 17 00:00:00 2001 From: yairm210 Date: Wed, 14 Aug 2024 20:27:54 +0300 Subject: [PATCH] Building uniqueTo can apply to civ *filters* --- core/src/com/unciv/logic/city/City.kt | 2 +- .../logic/civilization/transients/CivInfoTransientCache.kt | 2 +- core/src/com/unciv/models/ruleset/Building.kt | 2 +- core/src/com/unciv/models/ruleset/nation/Nation.kt | 3 ++- .../unciv/ui/objectdescriptions/TechnologyDescriptions.kt | 3 ++- .../unciv/ui/screens/civilopediascreen/FormattedLine.kt | 7 +++---- 6 files changed, 10 insertions(+), 9 deletions(-) diff --git a/core/src/com/unciv/logic/city/City.kt b/core/src/com/unciv/logic/city/City.kt index 4e501744a8..b356b9ec45 100644 --- a/core/src/com/unciv/logic/city/City.kt +++ b/core/src/com/unciv/logic/city/City.kt @@ -164,7 +164,7 @@ class City : IsPartOfGameInfoSerialization, INamed { val indicatorBuildings = getRuleset().buildings.values.asSequence() .filter { it.hasUnique(UniqueType.IndicatesCapital) } - val civSpecificBuilding = indicatorBuildings.firstOrNull { it.uniqueTo == civ.civName } + val civSpecificBuilding = indicatorBuildings.firstOrNull { it.uniqueTo != null && civ.matchesFilter(it.uniqueTo!!) } return civSpecificBuilding ?: indicatorBuildings.firstOrNull() } diff --git a/core/src/com/unciv/logic/civilization/transients/CivInfoTransientCache.kt b/core/src/com/unciv/logic/civilization/transients/CivInfoTransientCache.kt index 53224d393c..33ca17489c 100644 --- a/core/src/com/unciv/logic/civilization/transients/CivInfoTransientCache.kt +++ b/core/src/com/unciv/logic/civilization/transients/CivInfoTransientCache.kt @@ -71,7 +71,7 @@ class CivInfoTransientCache(val civInfo: Civilization) { } for (building in ruleset.buildings.values) { - if (building.uniqueTo == civInfo.civName) { + if (building.uniqueTo != null && civInfo.matchesFilter(building.uniqueTo!!)) { uniqueBuildings.add(building) } } diff --git a/core/src/com/unciv/models/ruleset/Building.kt b/core/src/com/unciv/models/ruleset/Building.kt index e4342664ec..6eab08dcaa 100644 --- a/core/src/com/unciv/models/ruleset/Building.kt +++ b/core/src/com/unciv/models/ruleset/Building.kt @@ -342,7 +342,7 @@ class Building : RulesetStatsObject(), INonPerpetualConstruction { } } - if (uniqueTo != null && uniqueTo != civ.civName) + if (uniqueTo != null && !civ.matchesFilter(uniqueTo!!)) yield(RejectionReasonType.UniqueToOtherNation.toInstance("Unique to $uniqueTo")) if (civ.cache.uniqueBuildings.any { it.replaces == name }) diff --git a/core/src/com/unciv/models/ruleset/nation/Nation.kt b/core/src/com/unciv/models/ruleset/nation/Nation.kt index 00ea61689d..ed55baccfe 100644 --- a/core/src/com/unciv/models/ruleset/nation/Nation.kt +++ b/core/src/com/unciv/models/ruleset/nation/Nation.kt @@ -192,7 +192,8 @@ class Nation : RulesetObject() { private fun getUniqueBuildingsText(ruleset: Ruleset) = sequence { for (building in ruleset.buildings.values) { - if (building.uniqueTo != name) continue + if (building.uniqueTo == null) continue + if (!matchesFilter(building.uniqueTo!!)) continue if (building.isHiddenFromCivilopedia(ruleset)) continue yield(FormattedLine(separator = true)) yield(FormattedLine("{${building.name}} -", link = building.makeLink())) diff --git a/core/src/com/unciv/ui/objectdescriptions/TechnologyDescriptions.kt b/core/src/com/unciv/ui/objectdescriptions/TechnologyDescriptions.kt index 5e70d74f93..01867e6fa4 100644 --- a/core/src/com/unciv/ui/objectdescriptions/TechnologyDescriptions.kt +++ b/core/src/com/unciv/ui/objectdescriptions/TechnologyDescriptions.kt @@ -312,7 +312,8 @@ object TechnologyDescriptions { return ruleset.buildings.values.asSequence() .filter { predicate(it) // expected to be the most selective, thus tested first - && (it.uniqueTo == civInfo?.civName || it.uniqueTo == null && civInfo?.getEquivalentBuilding(it) == it) + && (it.uniqueTo != null && civInfo?.matchesFilter(it.uniqueTo!!) == true + || it.uniqueTo == null && civInfo?.getEquivalentBuilding(it) == it) && !it.isHiddenFromCivilopedia(ruleset) } } diff --git a/core/src/com/unciv/ui/screens/civilopediascreen/FormattedLine.kt b/core/src/com/unciv/ui/screens/civilopediascreen/FormattedLine.kt index 4d4b66536e..2bafb2136e 100644 --- a/core/src/com/unciv/ui/screens/civilopediascreen/FormattedLine.kt +++ b/core/src/com/unciv/ui/screens/civilopediascreen/FormattedLine.kt @@ -12,7 +12,6 @@ import com.badlogic.gdx.scenes.scene2d.utils.TextureRegionDrawable import com.badlogic.gdx.utils.Align import com.unciv.Constants import com.unciv.UncivGame -import com.unciv.logic.UncivShowableException import com.unciv.models.metadata.BaseRuleset import com.unciv.models.ruleset.Ruleset import com.unciv.models.ruleset.RulesetCache @@ -329,16 +328,16 @@ class FormattedLine ( private fun renderExtraImage(labelWidth: Float): Table { val table = Table(BaseScreen.skin) - fun getExtraImage(): Image { + fun getExtraImage(): Image? { if (ImageGetter.imageExists(extraImage)) return if (centered) ImageGetter.getDrawable(extraImage).cropToContent() else ImageGetter.getImage(extraImage) val externalImage = ImageGetter.findExternalImage(extraImage) - ?: throw UncivShowableException("Extra image '[$extraImage]' not found") // logged in catch below + ?: return null return ImageGetter.getExternalImage(externalImage) } try { - val image = getExtraImage() + val image = getExtraImage() ?: return table // limit larger cordinate to a given max size val maxSize = if (imageSize.isNaN()) labelWidth else imageSize val (width, height) = if (image.width > image.height)