diff --git a/core/src/com/unciv/logic/civilization/managers/PolicyManager.kt b/core/src/com/unciv/logic/civilization/managers/PolicyManager.kt index 7a43002500..82edb83b28 100644 --- a/core/src/com/unciv/logic/civilization/managers/PolicyManager.kt +++ b/core/src/com/unciv/logic/civilization/managers/PolicyManager.kt @@ -139,6 +139,23 @@ class PolicyManager : IsPartOfGameInfoSerialization { // from https://forums.civfanatics.com/threads/the-number-crunching-thread.389702/ // round down to nearest 5 fun getCultureNeededForNextPolicy(): Int { + return getPolicyCultureCost(numberOfAdoptedPolicies) + } + + fun getCultureRefundMap(policiesToRemove: List, refundPercentage: Int): Map { + var policyCostInput = numberOfAdoptedPolicies + + val policyMap = mutableMapOf() + + for (policy in policiesToRemove) { + policyCostInput-- + policyMap.put(policy, getPolicyCultureCost(policyCostInput)) + } + + return policyMap.toMap() + } + + fun getPolicyCultureCost(numberOfAdoptedPolicies: Int): Int { var policyCultureCost = 25 + (numberOfAdoptedPolicies * 6).toDouble().pow(1.7) // https://civilization.fandom.com/wiki/Map_(Civ5) val worldSizeModifier = with(civInfo.gameInfo.tileMap.mapParameters.mapSize) { diff --git a/core/src/com/unciv/models/ruleset/unique/UniqueTriggerActivation.kt b/core/src/com/unciv/models/ruleset/unique/UniqueTriggerActivation.kt index a1fd513801..836ca3dc95 100644 --- a/core/src/com/unciv/models/ruleset/unique/UniqueTriggerActivation.kt +++ b/core/src/com/unciv/models/ruleset/unique/UniqueTriggerActivation.kt @@ -316,6 +316,33 @@ object UniqueTriggerActivation { true } } + + UniqueType.OneTimeRemovePolicyRefund -> { + val policyFilter = unique.params[0] + val refundPercentage = unique.params[1].toInt() + val policiesToRemove = civInfo.policies.adoptedPolicies + .mapNotNull { civInfo.gameInfo.ruleset.policies[it] } + .filter { it.matchesFilter(policyFilter) } + if (policiesToRemove.isEmpty()) return null + + val policiesToRemoveMap = civInfo.policies.getCultureRefundMap(policiesToRemove, refundPercentage) + + return { + for (policy in policiesToRemoveMap){ + civInfo.policies.removePolicy(policy.key) + civInfo.policies.addCulture(policy.value) + + val notificationText = getNotificationText( + notification, triggerNotificationText, + "You lose the [${policy.key.name}] Policy. [${policy.value}] Culture has been refunded" + ) + if (notificationText != null) + civInfo.addNotification(notificationText, PolicyAction(policy.key.name), NotificationCategory.General, NotificationIcon.Culture) + } + true + } + } + UniqueType.OneTimeEnterGoldenAge, UniqueType.OneTimeEnterGoldenAgeTurns -> { return { if (unique.type == UniqueType.OneTimeEnterGoldenAgeTurns) civInfo.goldenAges.enterGoldenAge(unique.params[0].toInt()) diff --git a/core/src/com/unciv/models/ruleset/unique/UniqueType.kt b/core/src/com/unciv/models/ruleset/unique/UniqueType.kt index 30049160ad..bfd2f36859 100644 --- a/core/src/com/unciv/models/ruleset/unique/UniqueType.kt +++ b/core/src/com/unciv/models/ruleset/unique/UniqueType.kt @@ -773,6 +773,7 @@ enum class UniqueType( OneTimeDiscoverTech("Discover [tech]", UniqueTarget.Triggerable), OneTimeAdoptPolicy("Adopt [policy]", UniqueTarget.Triggerable), OneTimeRemovePolicy("Remove [policy]", UniqueTarget.Triggerable), + OneTimeRemovePolicyRefund("Remove [policy] and refund [amount]% of its cost", UniqueTarget.Triggerable), OneTimeFreeTech("Free Technology", UniqueTarget.Triggerable), // used in Buildings OneTimeAmountFreeTechs("[positiveAmount] Free Technologies", UniqueTarget.Triggerable), // used in Policy OneTimeFreeTechRuins("[positiveAmount] free random researchable Tech(s) from the [era]", UniqueTarget.Triggerable), diff --git a/docs/Modders/uniques.md b/docs/Modders/uniques.md index 8f522725cb..57a7f82546 100644 --- a/docs/Modders/uniques.md +++ b/docs/Modders/uniques.md @@ -77,6 +77,11 @@ Simple unique parameters are explained by mouseover. Complex parameters are expl Applicable to: Triggerable +??? example "Remove [policy] and refund [amount]% of its cost" + Example: "Remove [Oligarchy] and refund [3]% of its cost" + + Applicable to: Triggerable + ??? example "Free Technology" Applicable to: Triggerable