From 01a40252871c9f4adc25f4be55452f2235588d25 Mon Sep 17 00:00:00 2001 From: yairm210 Date: Thu, 31 Jul 2025 18:21:04 +0300 Subject: [PATCH] chore(purity): TileImprovement --- build.gradle.kts | 1 + .../com/unciv/models/ruleset/tile/TileImprovement.kt | 11 +++++++++-- .../ui/screens/civilopediascreen/ICivilopediaText.kt | 3 ++- 3 files changed, 12 insertions(+), 3 deletions(-) diff --git a/build.gradle.kts b/build.gradle.kts index f14bbfdc5f..4869f46e6e 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -69,6 +69,7 @@ allprojects { "kotlin.Array.get", "kotlin.collections.mutableSetOf", "kotlin.collections.withIndex", // applicable to sequence as well + "kotlin.collections.intersect", ) wellKnownPureClasses = setOf( "java.util.Locale", // moved diff --git a/core/src/com/unciv/models/ruleset/tile/TileImprovement.kt b/core/src/com/unciv/models/ruleset/tile/TileImprovement.kt index ed25558b7b..47c36c39c5 100644 --- a/core/src/com/unciv/models/ruleset/tile/TileImprovement.kt +++ b/core/src/com/unciv/models/ruleset/tile/TileImprovement.kt @@ -14,6 +14,7 @@ import com.unciv.models.ruleset.unit.BaseUnit import com.unciv.ui.components.extensions.toPercent import com.unciv.ui.objectdescriptions.ImprovementDescriptions import com.unciv.ui.screens.civilopediascreen.FormattedLine +import yairm210.purity.annotations.LocalState import yairm210.purity.annotations.Readonly import kotlin.math.roundToInt @@ -30,6 +31,7 @@ class TileImprovement : RulesetStatsObject() { override fun legacyRequiredTechs() = if (techRequired == null) emptySequence() else sequenceOf(techRequired!!) + @Readonly fun getTurnsToBuild(civInfo: Civilization, unit: MapUnit): Int { val state = GameContext(civInfo, unit = unit) @@ -103,6 +105,7 @@ class TileImprovement : RulesetStatsObject() { override fun getCivilopediaTextLines(ruleset: Ruleset): List = ImprovementDescriptions.getCivilopediaTextLines(this, ruleset) + @Readonly fun getConstructorUnits(ruleset: Ruleset): List { //todo Why does this have to be so complicated? A unit's "Can build [Land] improvements on tiles" // creates the _justified_ expectation that an improvement it can build _will_ have @@ -112,10 +115,11 @@ class TileImprovement : RulesetStatsObject() { val canOnlyFilters = getMatchingUniques(UniqueType.CanOnlyBeBuiltOnTile) .map { it.params[0].run { if (this == "Coastal") "Land" else this } }.toSet() + val cannotFilters = getMatchingUniques(UniqueType.CannotBuildOnTile).map { it.params[0] }.toSet() val resourcesImprovedByThis = ruleset.tileResources.values.filter { it.isImprovedBy(name) } - val expandedTerrainsCanBeBuiltOn = sequence { + @LocalState val expandedTerrainsCanBeBuiltOn = sequence { yieldAll(terrainsCanBeBuiltOn) yieldAll(terrainsCanBeBuiltOn.asSequence().mapNotNull { ruleset.terrains[it] }.flatMap { it.occursOn.asSequence() }) if (hasUnique(UniqueType.CanOnlyImproveResource)) @@ -127,7 +131,7 @@ class TileImprovement : RulesetStatsObject() { } }.filter { it !in cannotFilters }.toMutableSet() - val terrainsCanBeBuiltOnTypes = sequence { + @LocalState val terrainsCanBeBuiltOnTypes = sequence { yieldAll(expandedTerrainsCanBeBuiltOn.asSequence() .mapNotNull { ruleset.terrains[it]?.type }) yieldAll( @@ -135,12 +139,14 @@ class TileImprovement : RulesetStatsObject() { .filter { it.name in expandedTerrainsCanBeBuiltOn }) }.filter { it.name !in cannotFilters }.toMutableSet() + if (canOnlyFilters.isNotEmpty() && canOnlyFilters.intersect(expandedTerrainsCanBeBuiltOn).isEmpty()) { expandedTerrainsCanBeBuiltOn.clear() if (terrainsCanBeBuiltOnTypes.none { it.name in canOnlyFilters }) terrainsCanBeBuiltOnTypes.clear() } + @Readonly fun matchesBuildImprovementsFilter(filter: String) = matchesFilter(filter) || filter in expandedTerrainsCanBeBuiltOn || @@ -156,6 +162,7 @@ class TileImprovement : RulesetStatsObject() { }.toList() } + @Readonly fun getCreatingUnits(ruleset: Ruleset): List { return ruleset.units.values.asSequence() .filter { unit -> diff --git a/core/src/com/unciv/ui/screens/civilopediascreen/ICivilopediaText.kt b/core/src/com/unciv/ui/screens/civilopediascreen/ICivilopediaText.kt index c43f235bdf..4d96e9c3bb 100644 --- a/core/src/com/unciv/ui/screens/civilopediascreen/ICivilopediaText.kt +++ b/core/src/com/unciv/ui/screens/civilopediascreen/ICivilopediaText.kt @@ -7,6 +7,7 @@ import com.unciv.models.ruleset.Ruleset import com.unciv.models.ruleset.RulesetObject import com.unciv.models.stats.INamed import com.unciv.ui.objectdescriptions.uniquesToCivilopediaTextLines +import yairm210.purity.annotations.Readonly /** Addon common to most ruleset game objects managing civilopedia display * @@ -100,7 +101,7 @@ interface ICivilopediaText { * the correct [CivilopediaCategories] member. `entryname` must equal the * [ruleset object name][RulesetObject] as defined by the [INamed] interface. */ - fun makeLink(): String + @Readonly fun makeLink(): String /** Overrides alphabetical sorting in Civilopedia * @param ruleset The current ruleset in case the function needs to do lookups