8const ConditionEvaluator = preload(
"res://scripts/systems/conditionEvaluator/condition_evaluator.gd")
12var condition_evaluator = ConditionEvaluator.new()
16func configure(next_triggers:Array = [], state:Dictionary = {}) -> void:
18 triggered = state.get(
"triggered", {}).duplicate(true)
if state.get(
"triggered", {})
is Dictionary
else {}
19 for raw_trigger
in next_triggers:
20 if not raw_trigger
is Dictionary:
22 var trigger = normalize_trigger(raw_trigger)
23 var id = str(trigger.get(
"id",
""))
25 triggers[id] = trigger
29func normalize_trigger(trigger:Dictionary) -> Dictionary:
30 var normalized = trigger.duplicate(true)
31 normalized[
"id"] = str(normalized.get(
"id",
""))
32 normalized[
"event"] = str(normalized.get(
"event",
"interact"))
33 normalized[
"once"] = bool(normalized.get(
"once", true))
34 normalized[
"conditions"] = normalized.get(
"conditions", {})
if normalized.get(
"conditions", {})
is Dictionary
else {}
35 normalized[
"effects"] = normalized.get(
"effects", [])
if normalized.get(
"effects", [])
is Array
else []
40func evaluate(event:String, context:Dictionary = {}) -> Array:
42 for id
in triggers.keys():
43 var trigger = triggers[id]
44 if str(trigger.get(
"event",
"")) != event:
46 if bool(trigger.get(
"once", true))
and bool(triggered.get(id, false)):
48 if not condition_evaluator.matches(trigger.get(
"conditions", {}), context):
51 fired.append(_fire_result(trigger, context))
56func has_triggered(trigger_id:String) -> bool:
57 return bool(triggered.get(trigger_id, false))
61func get_state() -> Dictionary:
62 return {
"triggered": triggered.duplicate(true)}
66func apply_state(state:Dictionary) -> void:
67 triggered = state.get(
"triggered", {}).duplicate(true)
if state.get(
"triggered", {})
is Dictionary
else {}
70func _fire_result(trigger:Dictionary, context:Dictionary) -> Dictionary:
72 "id": str(trigger.get(
"id",
"")),
73 "event": str(trigger.get(
"event",
"")),
74 "effects": trigger.get(
"effects", []).duplicate(true),
75 "context": context.duplicate(true)