From 72418972fd4eb11ee2f10fd99cf54a7c7ae52cf0 Mon Sep 17 00:00:00 2001 From: SeventhM <127357473+SeventhM@users.noreply.github.com> Date: Thu, 6 Mar 2025 10:20:36 -0800 Subject: [PATCH] Add a filter for religions (#13016) * Add a filter for religions * whoops * Convert if chain to jvm switch statement * Introduce inverse conditional * Irrelevant optimization: Checking if it is in the ruleset and returning null it unnecessary with mapNotNull * Add belief names to filter * Docs --- core/src/com/unciv/models/Religion.kt | 34 ++++++++++++++++--- .../models/ruleset/unique/Conditionals.kt | 8 +++++ .../ruleset/unique/UniqueParameterType.kt | 13 +++++++ .../unciv/models/ruleset/unique/UniqueType.kt | 2 ++ docs/Modders/Unique-parameters.md | 14 ++++++++ 5 files changed, 67 insertions(+), 4 deletions(-) diff --git a/core/src/com/unciv/models/Religion.kt b/core/src/com/unciv/models/Religion.kt index 3b8643d204..8e4867cd14 100644 --- a/core/src/com/unciv/models/Religion.kt +++ b/core/src/com/unciv/models/Religion.kt @@ -2,8 +2,11 @@ package com.unciv.models import com.unciv.logic.GameInfo import com.unciv.logic.IsPartOfGameInfoSerialization +import com.unciv.logic.MultiFilter +import com.unciv.logic.civilization.Civilization import com.unciv.models.ruleset.Belief import com.unciv.models.ruleset.BeliefType +import com.unciv.models.ruleset.unique.StateForConditionals import com.unciv.models.ruleset.unique.UniqueMap import com.unciv.models.ruleset.unique.UniqueType import com.unciv.models.stats.INamed @@ -76,10 +79,7 @@ class Religion() : INamed, IsPartOfGameInfoSerialization { private fun mapToExistingBeliefs(beliefs: Set): Sequence { val rulesetBeliefs = gameInfo.ruleset.beliefs - return beliefs.asSequence().mapNotNull { - if (it !in rulesetBeliefs) null - else rulesetBeliefs[it]!! - } + return beliefs.asSequence().mapNotNull { rulesetBeliefs[it] } } fun getBeliefs(beliefType: BeliefType): Sequence { @@ -114,6 +114,32 @@ class Religion() : INamed, IsPartOfGameInfoSerialization { fun getFounder() = gameInfo.getCivilization(foundingCivName) + fun matchesFilter(filter: String, state: StateForConditionals = StateForConditionals.IgnoreConditionals, civ: Civilization? = null): Boolean { + return MultiFilter.multiFilter(filter, { matchesSingleFilter(it, state, civ) }) + } + + private fun matchesSingleFilter(filter: String, state: StateForConditionals = StateForConditionals.IgnoreConditionals, civ: Civilization? = null): Boolean { + val foundingCiv = getFounder() + when (filter) { + "any" -> return true + "major" -> return isMajorReligion() + "enhanced" -> return isEnhancedReligion() + "your" -> return civ == foundingCiv + "foreign" -> return civ != null && civ != foundingCiv + "enemy" -> { + val known = civ != null && civ.knows(foundingCiv) + return known && civ!!.isAtWarWith(foundingCiv) + } + else -> { + if (filter == name) return true + if (filter in getBeliefs(BeliefType.Any).map { it.name }) return true + if (founderBeliefUniqueMap.hasMatchingUnique(filter, state)) return true + if (followerBeliefUniqueMap.hasMatchingUnique(filter, state)) return true + return false + } + } + } + private fun unlockedBuildingsPurchasable(): List { return getAllBeliefsOrdered().flatMap { belief -> belief.getMatchingUniques(UniqueType.BuyBuildingsWithStat).map { it.params[0] } + diff --git a/core/src/com/unciv/models/ruleset/unique/Conditionals.kt b/core/src/com/unciv/models/ruleset/unique/Conditionals.kt index 3df7ea765f..5d03f77be1 100644 --- a/core/src/com/unciv/models/ruleset/unique/Conditionals.kt +++ b/core/src/com/unciv/models/ruleset/unique/Conditionals.kt @@ -194,6 +194,14 @@ object Conditionals { UniqueType.ConditionalInThisCity -> state.relevantCity != null UniqueType.ConditionalCityFilter -> checkOnCity { matchesFilter(conditional.params[0], state.relevantCiv) } UniqueType.ConditionalCityConnected -> checkOnCity { isConnectedToCapital() } + UniqueType.ConditionalCityReligion -> checkOnCity { + religion.getMajorityReligion() + ?.matchesFilter(conditional.params[0], state, state.relevantCiv) == true + } + UniqueType.ConditionalCityNotReligion -> checkOnCity { + religion.getMajorityReligion() + ?.matchesFilter(conditional.params[0], state, state.relevantCiv) != true + } UniqueType.ConditionalCityMajorReligion -> checkOnCity { religion.getMajorityReligion()?.isMajorReligion() == true } UniqueType.ConditionalCityEnhancedReligion -> checkOnCity { diff --git a/core/src/com/unciv/models/ruleset/unique/UniqueParameterType.kt b/core/src/com/unciv/models/ruleset/unique/UniqueParameterType.kt index 1e00e5b902..44de009564 100644 --- a/core/src/com/unciv/models/ruleset/unique/UniqueParameterType.kt +++ b/core/src/com/unciv/models/ruleset/unique/UniqueParameterType.kt @@ -510,6 +510,19 @@ enum class UniqueParameterType( Belief("belief", "God of War", "The name of any belief") { override fun getKnownValuesForAutocomplete(ruleset: Ruleset) = ruleset.beliefs.keys }, + + /**Used by [UniqueType.ConditionalCityReligion]*/ + ReligionFilter("religionFilter", "major") { + override val staticKnownValues = setOf("any", "major", "enhanced", "your", "foreign","enemy") + override fun isKnownValue(parameterText: String, ruleset: Ruleset): Boolean { + return when (parameterText) { + in staticKnownValues -> true + in ruleset.religions -> true + in ruleset.beliefs -> true + else -> ruleset.beliefs.values.any { it.hasTagUnique(parameterText) } + } + } + }, /** Used by [UniqueType.FreeExtraBeliefs] and its any variant, see ReligionManager.getBeliefsToChooseAt* functions */ FoundingOrEnhancing("foundingOrEnhancing", "founding", "`founding` or `enhancing`", "Prophet Action Filters", diff --git a/core/src/com/unciv/models/ruleset/unique/UniqueType.kt b/core/src/com/unciv/models/ruleset/unique/UniqueType.kt index 0e65297dfa..82226086e4 100644 --- a/core/src/com/unciv/models/ruleset/unique/UniqueType.kt +++ b/core/src/com/unciv/models/ruleset/unique/UniqueType.kt @@ -742,6 +742,8 @@ enum class UniqueType( ConditionalInThisCity("in this city", UniqueTarget.Conditional), ConditionalCityFilter("in [cityFilter] cities", UniqueTarget.Conditional), ConditionalCityConnected("in cities connected to the capital", UniqueTarget.Conditional), + ConditionalCityReligion("in cities with a [religionFilter] religion", UniqueTarget.Conditional), + ConditionalCityNotReligion("in cities not following a [religionFilter] religion", UniqueTarget.Conditional), ConditionalCityMajorReligion("in cities with a major religion", UniqueTarget.Conditional), ConditionalCityEnhancedReligion("in cities with an enhanced religion", UniqueTarget.Conditional), ConditionalCityThisReligion("in cities following our religion", UniqueTarget.Conditional), diff --git a/docs/Modders/Unique-parameters.md b/docs/Modders/Unique-parameters.md index 03a2f9f497..913069a5dd 100644 --- a/docs/Modders/Unique-parameters.md +++ b/docs/Modders/Unique-parameters.md @@ -171,6 +171,20 @@ Allowed values: - `Followers of the Majority Religion` or `Followers of this Religion`, both of which only apply when this religion is the majority religion in that city - Specialist names +## religionFilter + +For filtering specific relgions + +- `any` +- `major` +- `enhanced` +- `your` +- `foriegn` +- `enemy` +- The name of a relgion symbol +- The name of a belief +- A unique of a belief the religion has + ## policyFilter Allowed values: