diff --git a/core/src/com/unciv/logic/automation/unit/WorkerAutomation.kt b/core/src/com/unciv/logic/automation/unit/WorkerAutomation.kt index a1d59cc9cf..3c25a7a3c6 100644 --- a/core/src/com/unciv/logic/automation/unit/WorkerAutomation.kt +++ b/core/src/com/unciv/logic/automation/unit/WorkerAutomation.kt @@ -321,7 +321,7 @@ class WorkerAutomation( if (tile.improvementInProgress != null) return ruleSet.tileImprovements[tile.improvementInProgress!!] val potentialTileImprovements = ruleSet.tileImprovements.filter { - (it.value.uniqueTo == null || it.value.uniqueTo == unit.civ.civName) + (it.value.uniqueTo == null || unit.civ.matchesFilter(it.value.uniqueTo!!)) && unit.canBuildImprovement(it.value, tile) && tile.improvementFunctions.canBuildImprovement(it.value, civInfo) } diff --git a/core/src/com/unciv/logic/civilization/transients/CivInfoTransientCache.kt b/core/src/com/unciv/logic/civilization/transients/CivInfoTransientCache.kt index 75b98cdcc7..acee439d71 100644 --- a/core/src/com/unciv/logic/civilization/transients/CivInfoTransientCache.kt +++ b/core/src/com/unciv/logic/civilization/transients/CivInfoTransientCache.kt @@ -77,7 +77,7 @@ class CivInfoTransientCache(val civInfo: Civilization) { } for (improvement in ruleset.tileImprovements.values) - if (improvement.uniqueTo == civInfo.civName) + if (improvement.uniqueTo != null && civInfo.matchesFilter(improvement.uniqueTo!!)) uniqueImprovements.add(improvement) for (unit in ruleset.units.values) { diff --git a/core/src/com/unciv/logic/map/tile/TileImprovementFunctions.kt b/core/src/com/unciv/logic/map/tile/TileImprovementFunctions.kt index aa0e43e353..fd5b1b5b43 100644 --- a/core/src/com/unciv/logic/map/tile/TileImprovementFunctions.kt +++ b/core/src/com/unciv/logic/map/tile/TileImprovementFunctions.kt @@ -44,7 +44,7 @@ class TileImprovementFunctions(val tile: Tile) { fun getImprovementBuildingProblems(improvement: TileImprovement, civInfo: Civilization): Sequence = sequence { val stateForConditionals = StateForConditionals(civInfo, tile = tile) - if (improvement.uniqueTo != null && improvement.uniqueTo != civInfo.civName) + if (improvement.uniqueTo != null && !civInfo.matchesFilter(improvement.uniqueTo!!)) yield(ImprovementBuildingProblem.WrongCiv) if (civInfo.cache.uniqueImprovements.any { it.replaces == improvement.name }) yield(ImprovementBuildingProblem.Replaced) diff --git a/core/src/com/unciv/ui/objectdescriptions/TechnologyDescriptions.kt b/core/src/com/unciv/ui/objectdescriptions/TechnologyDescriptions.kt index b1b97103cd..2512e20f48 100644 --- a/core/src/com/unciv/ui/objectdescriptions/TechnologyDescriptions.kt +++ b/core/src/com/unciv/ui/objectdescriptions/TechnologyDescriptions.kt @@ -42,7 +42,7 @@ object TechnologyDescriptions { lineList.addAll( getAffectedImprovements(name, ruleset) - .filter { it.improvement.uniqueTo == null || it.improvement.uniqueTo == viewingCiv.civName } + .filter { it.improvement.uniqueTo == null || viewingCiv.matchesFilter(it.improvement.uniqueTo!!) } .map { it.getText() } ) @@ -79,7 +79,7 @@ object TechnologyDescriptions { val tileImprovements = ruleset.tileImprovements.values.asSequence() .filter { it.techRequired == name } - .filter { it.uniqueTo == null || it.uniqueTo == viewingCiv.civName } + .filter { it.uniqueTo == null || viewingCiv.matchesFilter(it.uniqueTo!!) } .toList() if (tileImprovements.isNotEmpty()) lineList += "{Tile improvements enabled}: " + tileImprovements.joinToString { it.name.tr() } @@ -93,7 +93,6 @@ object TechnologyDescriptions { fun getTechEnabledIcons(tech: Technology, viewingCiv: Civilization, techIconSize: Float) = sequence { val ruleset = viewingCiv.gameInfo.ruleset val techName = tech.name - val civName = viewingCiv.civName for (unit in getEnabledUnits(techName, ruleset, viewingCiv)) { yield(ImageGetter.getConstructionPortrait(unit.name, techIconSize)) @@ -131,14 +130,14 @@ object TechnologyDescriptions { for (improvement in ruleset.tileImprovements.values.asSequence() .filter { it.techRequired == techName } - .filter { it.uniqueTo == null || it.uniqueTo == civName } + .filter { it.uniqueTo == null || viewingCiv.matchesFilter(it.uniqueTo!!) } ) { yield(ImageGetter.getImprovementPortrait(improvement.name, techIconSize)) } for (improvement in ruleset.tileImprovements.values.asSequence() .filter { it.uniqueObjects.any { u -> u.allParams.contains(techName) } } - .filter { it.uniqueTo == null || it.uniqueTo == civName } + .filter { it.uniqueTo == null || viewingCiv.matchesFilter(it.uniqueTo!!) } ) { yield(ImageGetter.getUniquePortrait(improvement.name, techIconSize)) } @@ -284,7 +283,7 @@ object TechnologyDescriptions { getFilteredBuildings(ruleset, civInfo) { true } + ruleset.tileResources.values.asSequence() + ruleset.tileImprovements.values.filter { - it.uniqueTo == null || it.uniqueTo == civInfo?.civName + it.uniqueTo == null || civInfo?.matchesFilter(it.uniqueTo!!) == true } ).filter { obj: RulesetStatsObject -> obj.getMatchingUniques(UniqueType.ObsoleteWith).any { it.params[0] == techName } diff --git a/tests/src/com/unciv/logic/map/TileImprovementConstructionTests.kt b/tests/src/com/unciv/logic/map/TileImprovementConstructionTests.kt index c86025999c..1725bba757 100644 --- a/tests/src/com/unciv/logic/map/TileImprovementConstructionTests.kt +++ b/tests/src/com/unciv/logic/map/TileImprovementConstructionTests.kt @@ -56,7 +56,10 @@ class TileImprovementConstructionTests { tile.setTransients() if (improvement.uniqueTo != null) { - civInfo.setNameForUnitTests(improvement.uniqueTo!!) + civInfo = testGame.addCiv(improvement.uniqueTo!!) + for (tech in testGame.ruleset.technologies.values) + civInfo.tech.addTechnology(tech.name) + city.civ = civInfo } val canBeBuilt = tile.improvementFunctions.canBuildImprovement(improvement, civInfo) @@ -92,7 +95,12 @@ class TileImprovementConstructionTests { for (improvement in testGame.ruleset.tileImprovements.values) { if (!improvement.uniques.contains("Can only be built on [Coastal] tiles")) continue - civInfo.setNameForUnitTests(improvement.uniqueTo ?: "OtherCiv") + if (improvement.uniqueTo != null) { + civInfo = testGame.addCiv(improvement.uniqueTo!!) + for (tech in testGame.ruleset.technologies.values) + civInfo.tech.addTechnology(tech.name) + city.civ = civInfo + } val canBeBuilt = coastalTile.improvementFunctions.canBuildImprovement(improvement, civInfo) Assert.assertTrue(improvement.name, canBeBuilt) } diff --git a/tests/src/com/unciv/testing/TestGame.kt b/tests/src/com/unciv/testing/TestGame.kt index 20039a8279..75d32d8eba 100644 --- a/tests/src/com/unciv/testing/TestGame.kt +++ b/tests/src/com/unciv/testing/TestGame.kt @@ -142,7 +142,7 @@ class TestGame { // Add 1 tech to the player so the era is computed correctly civInfo.tech.addTechnology(ruleset.technologies.values.minBy { it.era() }.name) if (cityStateType != null) { - civInfo.cityStateFunctions.initCityState(ruleset, "Ancient era", emptyList()) + civInfo.cityStateFunctions.initCityState(ruleset, "Ancient era", emptySequence()) } return civInfo }