mirror of
https://github.com/yairm210/Unciv.git
synced 2025-08-03 12:37:42 -04:00
chore(purity): TileImprovement
This commit is contained in:
parent
f45fe20ab0
commit
01a4025287
@ -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
|
||||
|
@ -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<FormattedLine> =
|
||||
ImprovementDescriptions.getCivilopediaTextLines(this, ruleset)
|
||||
|
||||
@Readonly
|
||||
fun getConstructorUnits(ruleset: Ruleset): List<BaseUnit> {
|
||||
//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<BaseUnit> {
|
||||
return ruleset.units.values.asSequence()
|
||||
.filter { unit ->
|
||||
|
@ -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
|
||||
|
Loading…
x
Reference in New Issue
Block a user