mirror of
https://github.com/yairm210/Unciv.git
synced 2025-07-28 13:48:49 +07:00
Added trigger conditions framework!
This commit is contained in:
@ -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
|
||||
|
@ -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() {
|
||||
|
@ -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)
|
||||
|
@ -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>()
|
||||
}
|
||||
|
@ -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) }
|
||||
}
|
||||
|
||||
|
||||
|
@ -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),
|
||||
|
||||
|
Reference in New Issue
Block a user