Modding: Added "non-[filter]" and multi-value filtering to Terrain filter

This commit is contained in:
Yair Morgenstern
2023-11-18 22:27:47 +02:00
parent 2a862aa895
commit 5484576640
2 changed files with 31 additions and 13 deletions

View File

@ -4,6 +4,7 @@ import com.badlogic.gdx.math.Vector2
import com.unciv.Constants import com.unciv.Constants
import com.unciv.GUI import com.unciv.GUI
import com.unciv.logic.IsPartOfGameInfoSerialization import com.unciv.logic.IsPartOfGameInfoSerialization
import com.unciv.logic.MultiFilter
import com.unciv.logic.city.City import com.unciv.logic.city.City
import com.unciv.logic.civilization.Civilization import com.unciv.logic.civilization.Civilization
import com.unciv.logic.civilization.PlayerType import com.unciv.logic.civilization.PlayerType
@ -477,8 +478,12 @@ open class Tile : IsPartOfGameInfoSerialization {
return improvement == null && filter == "unimproved" return improvement == null && filter == "unimproved"
} }
/** Implements [UniqueParameterType.TerrainFilter][com.unciv.models.ruleset.unique.UniqueParameterType.TerrainFilter] */
fun matchesTerrainFilter(filter: String, observingCiv: Civilization? = null): Boolean { fun matchesTerrainFilter(filter: String, observingCiv: Civilization? = null): Boolean {
return MultiFilter.multiFilter(filter, {matchesSingleTerrainFilter(it, observingCiv)})
}
/** Implements [UniqueParameterType.TerrainFilter][com.unciv.models.ruleset.unique.UniqueParameterType.TerrainFilter] */
fun matchesSingleTerrainFilter(filter: String, observingCiv: Civilization? = null): Boolean {
return when (filter) { return when (filter) {
"All" -> true "All" -> true
baseTerrain -> true baseTerrain -> true

View File

@ -321,22 +321,35 @@ enum class UniqueParameterType(
/** Implemented by [Tile.matchesTerrainFilter][com.unciv.logic.map.tile.Tile.matchesTerrainFilter] */ /** Implemented by [Tile.matchesTerrainFilter][com.unciv.logic.map.tile.Tile.matchesTerrainFilter] */
TerrainFilter("terrainFilter", Constants.freshWaterFilter, null, "Terrain Filters") { TerrainFilter("terrainFilter", Constants.freshWaterFilter, null, "Terrain Filters") {
private val knownValues = setOf("All", private val knownValues = setOf(
Constants.coastal, Constants.river, "Open terrain", "Rough terrain", "Water resource", "All",
"Foreign Land", "Foreign", "Friendly Land", "Friendly", "Enemy Land", "Enemy", Constants.coastal, Constants.river, "Open terrain", "Rough terrain", "Water resource",
"Featureless", Constants.freshWaterFilter, "non-fresh water", "Natural Wonder", "Foreign Land", "Foreign", "Friendly Land", "Friendly", "Enemy Land", "Enemy",
"Impassable", "Land", "Water") + "Featureless", Constants.freshWaterFilter, "non-fresh water", "Natural Wonder",
"Impassable", "Land", "Water"
) +
ResourceType.values().map { it.name + " resource" } ResourceType.values().map { it.name + " resource" }
override fun getErrorSeverity(parameterText: String, ruleset: Ruleset) = when(parameterText) {
in knownValues -> null override fun getErrorSeverity(parameterText: String, ruleset: Ruleset): UniqueType.UniqueParameterErrorSeverity? {
in ruleset.terrains -> null val isKnown = MultiFilter.multiFilter(parameterText, {isKnownValue(it, ruleset)}, true)
in ruleset.tileResources -> null if (isKnown) return null
in ruleset.terrains.values.asSequence().flatMap { it.uniques } -> null return UniqueType.UniqueParameterErrorSeverity.PossibleFilteringUnique
in ruleset.tileResources.values.asSequence().flatMap { it.uniques } -> null
else -> UniqueType.UniqueParameterErrorSeverity.PossibleFilteringUnique
} }
override fun isKnownValue(parameterText: String, ruleset: Ruleset): Boolean {
return when (parameterText) {
in knownValues -> true
in ruleset.terrains -> true
in ruleset.tileResources -> true
in ruleset.terrains.values.asSequence().flatMap { it.uniques } -> true
in ruleset.tileResources.values.asSequence().flatMap { it.uniques } -> true
else -> false
}
}
override fun isTranslationWriterGuess(parameterText: String, ruleset: Ruleset) = override fun isTranslationWriterGuess(parameterText: String, ruleset: Ruleset) =
parameterText in ruleset.terrains || parameterText != "All" && parameterText in knownValues parameterText in ruleset.terrains || parameterText != "All" && parameterText in knownValues
override fun getTranslationWriterStringsForOutput() = knownValues override fun getTranslationWriterStringsForOutput() = knownValues
}, },