From 5484576640e39bd1ea6ca63b7bfdc71e81664b89 Mon Sep 17 00:00:00 2001 From: Yair Morgenstern Date: Sat, 18 Nov 2023 22:27:47 +0200 Subject: [PATCH] Modding: Added "non-[filter]" and multi-value filtering to Terrain filter --- core/src/com/unciv/logic/map/tile/Tile.kt | 7 +++- .../ruleset/unique/UniqueParameterType.kt | 37 +++++++++++++------ 2 files changed, 31 insertions(+), 13 deletions(-) diff --git a/core/src/com/unciv/logic/map/tile/Tile.kt b/core/src/com/unciv/logic/map/tile/Tile.kt index 729cefd12a..468f90a6a5 100644 --- a/core/src/com/unciv/logic/map/tile/Tile.kt +++ b/core/src/com/unciv/logic/map/tile/Tile.kt @@ -4,6 +4,7 @@ import com.badlogic.gdx.math.Vector2 import com.unciv.Constants import com.unciv.GUI import com.unciv.logic.IsPartOfGameInfoSerialization +import com.unciv.logic.MultiFilter import com.unciv.logic.city.City import com.unciv.logic.civilization.Civilization import com.unciv.logic.civilization.PlayerType @@ -477,8 +478,12 @@ open class Tile : IsPartOfGameInfoSerialization { return improvement == null && filter == "unimproved" } - /** Implements [UniqueParameterType.TerrainFilter][com.unciv.models.ruleset.unique.UniqueParameterType.TerrainFilter] */ 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) { "All" -> true baseTerrain -> true diff --git a/core/src/com/unciv/models/ruleset/unique/UniqueParameterType.kt b/core/src/com/unciv/models/ruleset/unique/UniqueParameterType.kt index 275154b0b7..176b928508 100644 --- a/core/src/com/unciv/models/ruleset/unique/UniqueParameterType.kt +++ b/core/src/com/unciv/models/ruleset/unique/UniqueParameterType.kt @@ -321,22 +321,35 @@ enum class UniqueParameterType( /** Implemented by [Tile.matchesTerrainFilter][com.unciv.logic.map.tile.Tile.matchesTerrainFilter] */ TerrainFilter("terrainFilter", Constants.freshWaterFilter, null, "Terrain Filters") { - private val knownValues = setOf("All", - Constants.coastal, Constants.river, "Open terrain", "Rough terrain", "Water resource", - "Foreign Land", "Foreign", "Friendly Land", "Friendly", "Enemy Land", "Enemy", - "Featureless", Constants.freshWaterFilter, "non-fresh water", "Natural Wonder", - "Impassable", "Land", "Water") + + private val knownValues = setOf( + "All", + Constants.coastal, Constants.river, "Open terrain", "Rough terrain", "Water resource", + "Foreign Land", "Foreign", "Friendly Land", "Friendly", "Enemy Land", "Enemy", + "Featureless", Constants.freshWaterFilter, "non-fresh water", "Natural Wonder", + "Impassable", "Land", "Water" + ) + ResourceType.values().map { it.name + " resource" } - override fun getErrorSeverity(parameterText: String, ruleset: Ruleset) = when(parameterText) { - in knownValues -> null - in ruleset.terrains -> null - in ruleset.tileResources -> null - in ruleset.terrains.values.asSequence().flatMap { it.uniques } -> null - in ruleset.tileResources.values.asSequence().flatMap { it.uniques } -> null - else -> UniqueType.UniqueParameterErrorSeverity.PossibleFilteringUnique + + override fun getErrorSeverity(parameterText: String, ruleset: Ruleset): UniqueType.UniqueParameterErrorSeverity? { + val isKnown = MultiFilter.multiFilter(parameterText, {isKnownValue(it, ruleset)}, true) + if (isKnown) return null + return 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) = parameterText in ruleset.terrains || parameterText != "All" && parameterText in knownValues + override fun getTranslationWriterStringsForOutput() = knownValues },