Make event choices ruleset objects, with standard "uniques" field

This commit is contained in:
yairm210
2024-09-05 21:00:30 +03:00
parent 4146a16e31
commit 84efb797a3
5 changed files with 31 additions and 17 deletions

View File

@ -105,7 +105,7 @@
"choices": [ "choices": [
{ {
"text":"Got it", "text":"Got it",
"triggeredUniques": ["Mark tutorial [Meet another civilization] complete"], "uniques": ["Mark tutorial [Meet another civilization] complete"],
}, },
] ]
}, },

View File

@ -2,14 +2,8 @@ package com.unciv.models.ruleset
import com.unciv.logic.civilization.Civilization import com.unciv.logic.civilization.Civilization
import com.unciv.logic.map.mapunit.MapUnit import com.unciv.logic.map.mapunit.MapUnit
import com.unciv.models.ruleset.unique.Conditionals import com.unciv.models.ruleset.unique.*
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.ui.components.input.KeyCharAndCode import com.unciv.ui.components.input.KeyCharAndCode
import com.unciv.ui.screens.civilopediascreen.FormattedLine
import com.unciv.ui.screens.civilopediascreen.ICivilopediaText import com.unciv.ui.screens.civilopediascreen.ICivilopediaText
@ -39,27 +33,35 @@ class Event : RulesetObject() {
getMatchingUniques(UniqueType.Unavailable, stateForConditionals).none() getMatchingUniques(UniqueType.Unavailable, stateForConditionals).none()
} }
class EventChoice : ICivilopediaText { class EventChoice : ICivilopediaText, RulesetObject() {
var text = "" var text = ""
override var civilopediaText = listOf<FormattedLine>() override fun getUniqueTarget() = UniqueTarget.Event
override fun makeLink() = "" override fun makeLink() = ""
/** Keyboard support - not user-rebindable, mod control only. Will be [parsed][KeyCharAndCode.parse], so Gdx key names will work. */ /** Keyboard support - not user-rebindable, mod control only. Will be [parsed][KeyCharAndCode.parse], so Gdx key names will work. */
val keyShortcut = "" val keyShortcut = ""
var triggeredUniques = ArrayList<String>() var triggeredUniques = ArrayList<String>()
val triggeredUniqueObjects by lazy { triggeredUniques.map { Unique(it) } } val triggeredUniqueObjects by lazy { triggeredUniques.map { Unique(it) } }
var conditions = ArrayList<String>() var conditions = ArrayList<String>()
val conditionObjects by lazy { conditions.map { Unique(it) } } val conditionObjects by lazy { conditions.map { Unique(it) } }
fun matchesConditions(stateForConditionals: StateForConditionals) = fun matchesConditions(stateForConditionals: StateForConditionals): Boolean {
conditionObjects.all { Conditionals.conditionalApplies(null, it, stateForConditionals) } 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 { fun triggerChoice(civ: Civilization, unit: MapUnit? = null): Boolean {
var success = false var success = false
val stateForConditionals = StateForConditionals(civ, unit = unit) 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 if (UniqueTriggerActivation.triggerUnique(unique, civ, unit = unit)) success = true
return success return success
} }

View File

@ -55,9 +55,7 @@ enum class RulesetFile(val filename: String,
CityStateTypes("CityStateTypes.json", getUniques = CityStateTypes("CityStateTypes.json", getUniques =
{ cityStateTypes.values.asSequence().flatMap { it.allyBonusUniqueMap.getAllUniques() + it.friendBonusUniqueMap.getAllUniques() } }), { cityStateTypes.values.asSequence().flatMap { it.allyBonusUniqueMap.getAllUniques() + it.friendBonusUniqueMap.getAllUniques() } }),
Personalities("Personalities.json", { personalities.values.asSequence() }), Personalities("Personalities.json", { personalities.values.asSequence() }),
Events("Events.json", {events.values.asSequence()}, Events("Events.json", {events.values.asSequence() + events.values.flatMap { it.choices }}),
{ events.values.asSequence().flatMap { it.uniqueObjects } +
events.values.asSequence().flatMap { it.choices.flatMap { it.triggeredUniqueObjects } }}),
GlobalUniques("GlobalUniques.json", { sequenceOf(globalUniques) }), GlobalUniques("GlobalUniques.json", { sequenceOf(globalUniques) }),
ModOptions("ModOptions.json", getUniques = { modOptions.uniqueObjects.asSequence() }), ModOptions("ModOptions.json", getUniques = { modOptions.uniqueObjects.asSequence() }),
Speeds("Speeds.json", { speeds.values.asSequence() }), Speeds("Speeds.json", { speeds.values.asSequence() }),

View File

@ -59,6 +59,7 @@ enum class UniqueTarget(
CityState(inheritsFrom = Global), CityState(inheritsFrom = Global),
ModOptions, ModOptions,
Event, Event,
EventChoice(inheritsFrom = Triggerable),
// Modifiers // Modifiers
Conditional("Modifiers that can be added to other uniques to limit when they will be active", modifierType = ModifierType.Conditional), Conditional("Modifiers that can be added to other uniques to limit when they will be active", modifierType = ModifierType.Conditional),

View File

@ -238,8 +238,21 @@ class RulesetValidator(val ruleset: Ruleset) {
// An Event is not a IHasUniques, so not suitable as sourceObject // An Event is not a IHasUniques, so not suitable as sourceObject
for (event in ruleset.events.values) { for (event in ruleset.events.values) {
for (choice in event.choices) { for (choice in event.choices) {
for (unique in choice.conditionObjects + choice.triggeredUniqueObjects) for (unique in choice.conditionObjects + choice.triggeredUniqueObjects)
lines += uniqueValidator.checkUnique(unique, tryFixUnknownUniques, null, true) 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)
} }
} }
} }