Improvement uniqueTo can apply to civ *filters*

This commit is contained in:
yairm210 2024-08-14 21:50:39 +03:00
parent 8ddc8a3e8b
commit b587bfa591
6 changed files with 19 additions and 12 deletions

View File

@ -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)
}

View File

@ -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) {

View File

@ -44,7 +44,7 @@ class TileImprovementFunctions(val tile: Tile) {
fun getImprovementBuildingProblems(improvement: TileImprovement, civInfo: Civilization): Sequence<ImprovementBuildingProblem> = 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)

View File

@ -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 }

View File

@ -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)
}

View File

@ -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
}