RapidGameFramework
Reusable Godot managers for data-driven small games
Loading...
Searching...
No Matches
interaction_trigger_manager.gd
Go to the documentation of this file.
1extends RefCounted
2
3
7
8const ConditionEvaluator = preload("res://scripts/systems/conditionEvaluator/condition_evaluator.gd")
9
10var triggers := {}
11var triggered := {}
12var condition_evaluator = ConditionEvaluator.new()
13
14
15
16func configure(next_triggers:Array = [], state:Dictionary = {}) -> void:
17 triggers.clear()
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:
21 continue
22 var trigger = normalize_trigger(raw_trigger)
23 var id = str(trigger.get("id", ""))
24 if id != "":
25 triggers[id] = trigger
26
27
28
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 []
36 return normalized
37
38
39
40func evaluate(event:String, context:Dictionary = {}) -> Array:
41 var fired := []
42 for id in triggers.keys():
43 var trigger = triggers[id]
44 if str(trigger.get("event", "")) != event:
45 continue
46 if bool(trigger.get("once", true)) and bool(triggered.get(id, false)):
47 continue
48 if not condition_evaluator.matches(trigger.get("conditions", {}), context):
49 continue
50 triggered[id] = true
51 fired.append(_fire_result(trigger, context))
52 return fired
53
54
55
56func has_triggered(trigger_id:String) -> bool:
57 return bool(triggered.get(trigger_id, false))
58
59
60
61func get_state() -> Dictionary:
62 return {"triggered": triggered.duplicate(true)}
63
64
65
66func apply_state(state:Dictionary) -> void:
67 triggered = state.get("triggered", {}).duplicate(true) if state.get("triggered", {}) is Dictionary else {}
68
69
70func _fire_result(trigger:Dictionary, context:Dictionary) -> Dictionary:
71 return {
72 "id": str(trigger.get("id", "")),
73 "event": str(trigger.get("event", "")),
74 "effects": trigger.get("effects", []).duplicate(true),
75 "context": context.duplicate(true)
76 }