From 1d0c94d2c59ca82174c66ad1e4f2a76cf45c31d5 Mon Sep 17 00:00:00 2001 From: Rob Loach Date: Sat, 20 Sep 2025 14:58:14 -0400 Subject: [PATCH] Add Adoped Policies by Civilizations --- .../unciv/models/ruleset/unique/Countables.kt | 17 +++++++++++++++++ docs/Modders/Unique-parameters.md | 2 ++ tests/src/com/unciv/uniques/CountableTests.kt | 12 ++++++++++++ 3 files changed, 31 insertions(+) diff --git a/core/src/com/unciv/models/ruleset/unique/Countables.kt b/core/src/com/unciv/models/ruleset/unique/Countables.kt index e70acfb2eb..24d7e33a43 100644 --- a/core/src/com/unciv/models/ruleset/unique/Countables.kt +++ b/core/src/com/unciv/models/ruleset/unique/Countables.kt @@ -164,6 +164,23 @@ enum class Countables( .map { text.fillPlaceholders(it) }.toSet() }, + FilteredPoliciesByCivs("Adopted [policyFilter] Policies by [civFilter] Civilizations") { + override fun eval(parameterText: String, gameContext: GameContext): Int? { + val (policyFilter, civFilter) = parameterText.getPlaceholderParameters().takeIf { it.size >= 2 } ?: return null + val civilizations = gameContext.gameInfo?.civilizations ?: return null + return civilizations + .filter { it.isAlive() && it.matchesFilter(civFilter, gameContext) } + .sumOf { it.policies.getAdoptedPoliciesMatching(policyFilter, gameContext).size } + } + override fun getErrorSeverity(parameterText: String, ruleset: Ruleset): UniqueType.UniqueParameterErrorSeverity? { + val params = parameterText.getPlaceholderParameters() + if (params.size < 2) return UniqueType.UniqueParameterErrorSeverity.RulesetInvariant + return UniqueParameterType.PolicyFilter.getErrorSeverity(params[0], ruleset) ?: + UniqueParameterType.CivFilter.getErrorSeverity(params[1], ruleset) + } + override fun getKnownValuesForAutocomplete(ruleset: Ruleset) = setOf() + }, + RemainingCivs("Remaining [civFilter] Civilizations") { override fun eval(parameterText: String, gameContext: GameContext): Int? { val filter = parameterText.getPlaceholderParameters()[0] diff --git a/docs/Modders/Unique-parameters.md b/docs/Modders/Unique-parameters.md index 491ab6425d..b1e3b76021 100644 --- a/docs/Modders/Unique-parameters.md +++ b/docs/Modders/Unique-parameters.md @@ -379,6 +379,8 @@ Allowed values: - Example: `Only available ` - `Adopted [policyFilter] Policies` - Example: `Only available ` +- `Adopted [policyFilter] Policies by [civFilter] Civilizations` + - Example: `Only available ` - `Remaining [civFilter] Civilizations` - Example: `Only available ` - `Owned [tileFilter] Tiles` diff --git a/tests/src/com/unciv/uniques/CountableTests.kt b/tests/src/com/unciv/uniques/CountableTests.kt index 34bb830e57..dee7eb57d6 100644 --- a/tests/src/com/unciv/uniques/CountableTests.kt +++ b/tests/src/com/unciv/uniques/CountableTests.kt @@ -244,6 +244,16 @@ class CountableTests { freePolicies++ adopt(taggedPolicyBranch) // Will be completed as it has no member policies } + + // Add a second Civilization + val civ2 = game.addCiv() + val city2 = game.addCity(civ2, game.tileMap[2,2]) + civ2.policies.run { + freePolicies += 2 + adopt(getPolicyByName("Tradition")) + adopt(getPolicyByName("Oligarchy")) + } + val tests = listOf( "Completed Policy branches" to 2, // Tradition and taggedPolicyBranch "Adopted [Tradition Complete] Policies" to 1, @@ -251,6 +261,8 @@ class CountableTests { "Adopted [Liberty Complete] Policies" to 0, "Adopted [[Liberty] branch] Policies" to 2, // Liberty has only 1 member adopted "Adopted [Some marker] Policies" to 1, + "Adopted [Some marker] Policies by [All] Civilizations" to 1, + "Adopted [Oligarchy] Policies by [All] Civilizations" to 2, ) for ((test, expected) in tests) { val actual = Countables.getCountableAmount(test, GameContext(civ))