diff --git a/core/src/com/unciv/logic/civilization/CivInfoStats.kt b/core/src/com/unciv/logic/civilization/CivInfoStats.kt index 384ebcdfa1..ae9f56e089 100644 --- a/core/src/com/unciv/logic/civilization/CivInfoStats.kt +++ b/core/src/com/unciv/logic/civilization/CivInfoStats.kt @@ -6,6 +6,7 @@ import com.unciv.models.metadata.BASE_GAME_DURATION_TURNS import com.unciv.models.ruleset.BeliefType import com.unciv.models.ruleset.Policy import com.unciv.models.ruleset.Unique +import com.unciv.models.ruleset.UniqueType import com.unciv.models.ruleset.tile.ResourceType import com.unciv.models.stats.Stat import com.unciv.models.stats.StatMap @@ -22,7 +23,7 @@ class CivInfoStats(val civInfo: CivilizationInfo) { private fun getUnitMaintenance(): Int { val baseUnitCost = 0.5f var freeUnits = 3 - for (unique in civInfo.getMatchingUniques("[] units cost no maintenance")) { + for (unique in civInfo.getMatchingUniquesByEnum(UniqueType.FreeUnits)) { freeUnits += unique.params[0].toInt() } diff --git a/core/src/com/unciv/logic/map/MapUnit.kt b/core/src/com/unciv/logic/map/MapUnit.kt index 8107f0d236..0df7532e70 100644 --- a/core/src/com/unciv/logic/map/MapUnit.kt +++ b/core/src/com/unciv/logic/map/MapUnit.kt @@ -943,6 +943,8 @@ class MapUnit { return filter.removePrefix("{").removeSuffix("}").split("} {") .all { matchesFilter(it) } return when (filter) { + // todo: unit filters should be adjectives, fitting "[filterType] units" + // This means converting "wounded units" to "Wounded", "Barbarians" to "Barbarian" "Wounded", "wounded units" -> health < 100 "Barbarians", "Barbarian" -> civInfo.isBarbarian() "City-State" -> civInfo.isCityState() diff --git a/core/src/com/unciv/models/ruleset/Unique.kt b/core/src/com/unciv/models/ruleset/Unique.kt index 2dcc5d5db7..982d73ed47 100644 --- a/core/src/com/unciv/models/ruleset/Unique.kt +++ b/core/src/com/unciv/models/ruleset/Unique.kt @@ -15,11 +15,29 @@ enum class UniqueParameterType(val parameterName:String) { else null } }, - UnitFilter("unitType") { + MapUnitFilter("mapUnitFilter"){ + val knownValues = setOf("Wounded", "Barbarians", "City-State", "Embarked", "Non-City") override fun getErrorType(parameterText: String, ruleset: Ruleset): UniqueType.UniqueComplianceErrorSeverity? { - if(ruleset.unitTypes.containsKey(parameterText) || unitTypeStrings.contains(parameterText)) return null - return UniqueType.UniqueComplianceErrorSeverity.RulesetSpecific + if (parameterText in knownValues) return null + return BaseUnitFilter.getErrorType(parameterText, ruleset) + } + }, + BaseUnitFilter("baseUnitFilter"){ + // As you can see there is a difference between these and what's in unitTypeStrings (for translation) - + // the goal is to unify, but for now this is the "real" list + val knownValues = setOf("Melee", "Ranged", "Civilian", "Military", "Land", "Water", "Air", + "non-air", "Nuclear Weapon", "Great Person", "Religious") + override fun getErrorType(parameterText: String, ruleset: Ruleset): + UniqueType.UniqueComplianceErrorSeverity? { + if (parameterText in knownValues) return null + if (ruleset.unitTypes.containsKey(parameterText)) return null + if (ruleset.units.containsKey(parameterText)) return null + + // We could add a giant hashset of all uniques used by units, + // so we could accept that unique-targeting uniques are OK. Maybe later. + + return UniqueType.UniqueComplianceErrorSeverity.WarningOnly } }, Unknown("param") { diff --git a/core/src/com/unciv/models/ruleset/unit/BaseUnit.kt b/core/src/com/unciv/models/ruleset/unit/BaseUnit.kt index 96dd1da06e..ad7a96545e 100644 --- a/core/src/com/unciv/models/ruleset/unit/BaseUnit.kt +++ b/core/src/com/unciv/models/ruleset/unit/BaseUnit.kt @@ -493,11 +493,13 @@ class BaseUnit : INamed, INonPerpetualConstruction, ICivilopediaText { "non-air" -> !movesLikeAirUnits() "Nuclear Weapon" -> isNuclearWeapon() + // "Great" should be deprecated, replaced by "Great Person". "Great Person", "Great" -> isGreatPerson() "Religious" -> uniques.contains("Religious Unit") else -> { if (getType().matchesFilter(filter)) return true if ( + // Uniques using these kinds of filters should be deprecated and replaced ith adjective-only parameters filter.endsWith(" units") // "military units" --> "Military", using invariant locale && matchesFilter(filter.removeSuffix(" units").lowercase().replaceFirstChar { it.uppercaseChar() })