From 84efb797a3a69cc3459e72571214092ca03e01e4 Mon Sep 17 00:00:00 2001 From: yairm210 Date: Thu, 5 Sep 2024 21:00:30 +0300 Subject: [PATCH] Make event choices ruleset objects, with standard "uniques" field --- .../jsons/Civ V - Gods & Kings/Events.json | 2 +- core/src/com/unciv/models/ruleset/Event.kt | 28 ++++++++++--------- core/src/com/unciv/models/ruleset/Ruleset.kt | 4 +-- .../models/ruleset/unique/UniqueTarget.kt | 1 + .../ruleset/validation/RulesetValidator.kt | 13 +++++++++ 5 files changed, 31 insertions(+), 17 deletions(-) diff --git a/android/assets/jsons/Civ V - Gods & Kings/Events.json b/android/assets/jsons/Civ V - Gods & Kings/Events.json index a09b734290..3ac587df9f 100644 --- a/android/assets/jsons/Civ V - Gods & Kings/Events.json +++ b/android/assets/jsons/Civ V - Gods & Kings/Events.json @@ -105,7 +105,7 @@ "choices": [ { "text":"Got it", - "triggeredUniques": ["Mark tutorial [Meet another civilization] complete"], + "uniques": ["Mark tutorial [Meet another civilization] complete"], }, ] }, diff --git a/core/src/com/unciv/models/ruleset/Event.kt b/core/src/com/unciv/models/ruleset/Event.kt index 85ad25cb67..d19770d7a9 100644 --- a/core/src/com/unciv/models/ruleset/Event.kt +++ b/core/src/com/unciv/models/ruleset/Event.kt @@ -2,14 +2,8 @@ package com.unciv.models.ruleset import com.unciv.logic.civilization.Civilization import com.unciv.logic.map.mapunit.MapUnit -import com.unciv.models.ruleset.unique.Conditionals -import com.unciv.models.ruleset.unique.StateForConditionals -import com.unciv.models.ruleset.unique.Unique -import com.unciv.models.ruleset.unique.UniqueTarget -import com.unciv.models.ruleset.unique.UniqueTriggerActivation -import com.unciv.models.ruleset.unique.UniqueType +import com.unciv.models.ruleset.unique.* import com.unciv.ui.components.input.KeyCharAndCode -import com.unciv.ui.screens.civilopediascreen.FormattedLine import com.unciv.ui.screens.civilopediascreen.ICivilopediaText @@ -39,27 +33,35 @@ class Event : RulesetObject() { getMatchingUniques(UniqueType.Unavailable, stateForConditionals).none() } -class EventChoice : ICivilopediaText { +class EventChoice : ICivilopediaText, RulesetObject() { var text = "" - override var civilopediaText = listOf() + override fun getUniqueTarget() = UniqueTarget.Event override fun makeLink() = "" /** Keyboard support - not user-rebindable, mod control only. Will be [parsed][KeyCharAndCode.parse], so Gdx key names will work. */ val keyShortcut = "" - + var triggeredUniques = ArrayList() val triggeredUniqueObjects by lazy { triggeredUniques.map { Unique(it) } } var conditions = ArrayList() val conditionObjects by lazy { conditions.map { Unique(it) } } - fun matchesConditions(stateForConditionals: StateForConditionals) = - conditionObjects.all { Conditionals.conditionalApplies(null, it, stateForConditionals) } + fun matchesConditions(stateForConditionals: StateForConditionals): Boolean { + if (conditionObjects.any { !Conditionals.conditionalApplies(null, it, stateForConditionals) }) + return false + if (hasUnique(UniqueType.Unavailable, stateForConditionals)) return false + if (getMatchingUniques(UniqueType.OnlyAvailable, StateForConditionals.IgnoreConditionals) + .any { !it.conditionalsApply(stateForConditionals) }) + return false + return true + } fun triggerChoice(civ: Civilization, unit: MapUnit? = null): Boolean { var success = false val stateForConditionals = StateForConditionals(civ, unit = unit) - for (unique in triggeredUniqueObjects.flatMap { it.getMultiplied(stateForConditionals) }) + val triggerUniques = uniqueObjects.filter { it.isTriggerable } + triggeredUniqueObjects + for (unique in triggerUniques.flatMap { it.getMultiplied(stateForConditionals) }) if (UniqueTriggerActivation.triggerUnique(unique, civ, unit = unit)) success = true return success } diff --git a/core/src/com/unciv/models/ruleset/Ruleset.kt b/core/src/com/unciv/models/ruleset/Ruleset.kt index 8665442f95..6f537e254a 100644 --- a/core/src/com/unciv/models/ruleset/Ruleset.kt +++ b/core/src/com/unciv/models/ruleset/Ruleset.kt @@ -55,9 +55,7 @@ enum class RulesetFile(val filename: String, CityStateTypes("CityStateTypes.json", getUniques = { cityStateTypes.values.asSequence().flatMap { it.allyBonusUniqueMap.getAllUniques() + it.friendBonusUniqueMap.getAllUniques() } }), Personalities("Personalities.json", { personalities.values.asSequence() }), - Events("Events.json", {events.values.asSequence()}, - { events.values.asSequence().flatMap { it.uniqueObjects } + - events.values.asSequence().flatMap { it.choices.flatMap { it.triggeredUniqueObjects } }}), + Events("Events.json", {events.values.asSequence() + events.values.flatMap { it.choices }}), GlobalUniques("GlobalUniques.json", { sequenceOf(globalUniques) }), ModOptions("ModOptions.json", getUniques = { modOptions.uniqueObjects.asSequence() }), Speeds("Speeds.json", { speeds.values.asSequence() }), diff --git a/core/src/com/unciv/models/ruleset/unique/UniqueTarget.kt b/core/src/com/unciv/models/ruleset/unique/UniqueTarget.kt index 7e7ec0bb7e..30d73782cf 100644 --- a/core/src/com/unciv/models/ruleset/unique/UniqueTarget.kt +++ b/core/src/com/unciv/models/ruleset/unique/UniqueTarget.kt @@ -59,6 +59,7 @@ enum class UniqueTarget( CityState(inheritsFrom = Global), ModOptions, Event, + EventChoice(inheritsFrom = Triggerable), // Modifiers Conditional("Modifiers that can be added to other uniques to limit when they will be active", modifierType = ModifierType.Conditional), diff --git a/core/src/com/unciv/models/ruleset/validation/RulesetValidator.kt b/core/src/com/unciv/models/ruleset/validation/RulesetValidator.kt index 9b1461b379..16466ef387 100644 --- a/core/src/com/unciv/models/ruleset/validation/RulesetValidator.kt +++ b/core/src/com/unciv/models/ruleset/validation/RulesetValidator.kt @@ -238,8 +238,21 @@ class RulesetValidator(val ruleset: Ruleset) { // An Event is not a IHasUniques, so not suitable as sourceObject for (event in ruleset.events.values) { for (choice in event.choices) { + for (unique in choice.conditionObjects + choice.triggeredUniqueObjects) lines += uniqueValidator.checkUnique(unique, tryFixUnknownUniques, null, true) + + if (choice.conditions.isNotEmpty()) + lines.add("Event choice 'conditions' field is deprecated, " + + "please replace with 'Only available' or 'Not availble' uniques in 'uniques' field", + errorSeverityToReport = RulesetErrorSeverity.WarningOptionsOnly, choice) + + if (choice.triggeredUniques.isNotEmpty()) + lines.add("Event choice 'triggered uniques' field is deprecated, " + + "please place the triggers in the 'uniques' field", + errorSeverityToReport = RulesetErrorSeverity.WarningOptionsOnly, choice) + + uniqueValidator.checkUniques(choice, lines, true, tryFixUnknownUniques) } } }