Added trigger conditions framework!

This commit is contained in:
Yair Morgenstern
2023-01-16 21:05:59 +02:00
parent 83f5784f1e
commit cbd7f7ac5c
8 changed files with 77 additions and 36 deletions

View File

@ -486,6 +486,17 @@ class CivilizationInfo : IsPartOfGameInfoSerialization {
yieldAll(gameInfo.ruleSet.globalUniques.getMatchingUniques(uniqueType, stateForConditionals))
}
fun getTriggeredUniques(trigger: UniqueType, stateForConditionals: StateForConditionals = StateForConditionals(this)) : Sequence<Unique> = sequence{
yieldAll(nation.uniqueMap.getTriggeredUniques(trigger, stateForConditionals))
yieldAll(cities.asSequence()
.flatMap { city -> city.cityConstructions.builtBuildingUniqueMap.getTriggeredUniques(trigger, stateForConditionals) }
)
yieldAll(policies.policyUniques.getTriggeredUniques(trigger, stateForConditionals))
yieldAll(tech.techUniques.getTriggeredUniques(trigger, stateForConditionals))
yieldAll(getEra().uniqueMap.getTriggeredUniques (trigger, stateForConditionals))
yieldAll(gameInfo.ruleSet.globalUniques.uniqueMap.getTriggeredUniques(trigger, stateForConditionals))
}
//region Units
fun getCivUnitsSize(): Int = units.size

View File

@ -342,6 +342,11 @@ class TechManager : IsPartOfGameInfoSerialization {
for (unique in era.uniqueObjects)
UniqueTriggerActivation.triggerCivwideUnique(unique, civInfo)
}
val triggerableUniques = civInfo.getTriggeredUniques(UniqueType.TriggerUponResearch)
for (unique in triggerableUniques)
if (unique.conditionals.any {it.type == UniqueType.TriggerUponResearch && it.params[0] == techName})
UniqueTriggerActivation.triggerCivwideUnique(unique, civInfo)
}
fun updateEra() {

View File

@ -86,8 +86,7 @@ class Religion() : INamed, IsPartOfGameInfoSerialization {
}
private fun getUniquesOfBeliefs(beliefs: HashSet<String>): Sequence<Unique> {
val result = mapToExistingBeliefs(beliefs).asSequence().flatMap { it.uniqueObjects }
return result
return mapToExistingBeliefs(beliefs).asSequence().flatMap { it.uniqueObjects }
}
fun getFollowerUniques() = getUniquesOfBeliefs(followerBeliefs)

View File

@ -2,6 +2,7 @@ package com.unciv.models.ruleset
import com.unciv.models.ruleset.unique.IHasUniques
import com.unciv.models.ruleset.unique.Unique
import com.unciv.models.ruleset.unique.UniqueMap
import com.unciv.models.stats.INamed
import com.unciv.models.stats.NamedStats
import com.unciv.ui.civilopedia.FormattedLine
@ -18,10 +19,13 @@ abstract class RulesetObject: IRulesetObject {
else uniques.map { Unique(it, getUniqueTarget(), name) }
}
@delegate:Transient
override val uniqueMap: Map<String, List<Unique>> by lazy {
if (uniques.isEmpty()) emptyMap()
else uniqueObjects.groupBy { it.placeholderText }
override val uniqueMap: UniqueMap by lazy {
if (uniques.isEmpty()) UniqueMap()
val newUniqueMap = UniqueMap()
newUniqueMap.addUniques(uniqueObjects)
newUniqueMap
}
override var civilopediaText = listOf<FormattedLine>()
override fun toString() = name
}
@ -39,5 +43,6 @@ abstract class RulesetStatsObject: NamedStats(), IRulesetObject {
if (uniques.isEmpty()) emptyMap()
else uniqueObjects.groupBy { it.placeholderText }
}
override var civilopediaText = listOf<FormattedLine>()
}

View File

@ -125,6 +125,9 @@ class Unique(val text: String, val sourceObjectType: UniqueTarget? = null, val s
state: StateForConditionals
): Boolean {
if (condition.type!!.targetTypes.contains(UniqueTarget.TriggerCondition))
return true // not a filtering condition
fun ruleset() = state.civInfo!!.gameInfo.ruleSet
val relevantUnit by lazy {
@ -322,6 +325,10 @@ class UniqueMap: HashMap<String, ArrayList<Unique>>() {
.filter { it.conditionalsApply(state) }
fun getAllUniques() = this.asSequence().flatMap { it.value.asSequence() }
fun getTriggeredUniques(trigger: UniqueType, stateForConditionals: StateForConditionals) =
getAllUniques().filter { it.conditionals.any { it.type == trigger } }
.filter { it.conditionalsApply(stateForConditionals) }
}

View File

@ -50,7 +50,7 @@ enum class UniqueTarget(val inheritsFrom: UniqueTarget? = null) {
CityState(Global),
ModOptions,
Conditional,
TriggerCondition
TriggerCondition(Global)
;
fun canAcceptUniqueTarget(uniqueTarget: UniqueTarget): Boolean {
@ -696,6 +696,13 @@ enum class UniqueType(val text: String, vararg targets: UniqueTarget, val flags:
//endregion
///////////////////////////////////////// region TRIGGERS /////////////////////////////////////////
TriggerUponResearch("upon discovering [tech]", UniqueTarget.TriggerCondition),
//endregion
///////////////////////////////////////////// region META /////////////////////////////////////////////
HiddenWithoutReligion("Hidden when religion is disabled", UniqueTarget.Unit, UniqueTarget.Building, UniqueTarget.Ruins, flags = UniqueFlag.setOfHiddenToUsers),