RapidGameFramework
Reusable Godot managers for data-driven small games
Loading...
Searching...
No Matches
alchemy_manager.gd
Go to the documentation of this file.
1extends RefCounted
2
3
6
7const DataCacheManager = preload("res://scripts/systems/dataCacheManager/data_cache_manager.gd")
8
9var elements := {}
10var compounds := {}
11var reactions := {}
12var data_cache_manager = DataCacheManager.new()
13
14
15
16func load_definitions(file_path:String) -> void:
17 elements.clear()
18 compounds.clear()
19 load_definition_data(data_cache_manager.load_json(file_path))
20
21
22
23func load_definition_data(data) -> void:
24 elements.clear()
25 compounds.clear()
26 if not data is Dictionary:
27 return
28 for element in data.get("elements", []):
29 if element is Dictionary:
30 var id = str(element.get("id", ""))
31 if id != "":
32 elements[id] = element.duplicate(true)
33 for compound in data.get("compounds", []):
34 if compound is Dictionary:
35 var id = str(compound.get("id", ""))
36 if id != "":
37 compounds[id] = compound.duplicate(true)
38
39
40
41func load_reactions(file_path:String) -> void:
42 reactions.clear()
43 load_reaction_data(data_cache_manager.load_json(file_path))
44
45
46
47func get_cache_stats() -> Dictionary:
48 return data_cache_manager.get_cache_stats()
49
50
51
52func load_reaction_data(data) -> void:
53 reactions.clear()
54 if not data is Dictionary:
55 return
56 for reaction in data.get("reactions", []):
57 if not reaction is Dictionary:
58 continue
59 var inputs = reaction.get("inputs", [])
60 if not inputs is Array or inputs.is_empty():
61 continue
62 reactions[_reaction_key(inputs, reaction.get("catalysts", []))] = reaction.duplicate(true)
63
64
65
66func attempt_reaction(inputs:Array, catalysts:Array = []) -> Dictionary:
67 var key = _reaction_key(inputs, catalysts)
68 if reactions.has(key):
69 var reaction = reactions[key].duplicate(true)
70 reaction["success"] = true
71 reaction["key"] = key
72 return reaction
73 return {
74 "success": false,
75 "key": key,
76 "inputs": _normalized_list(inputs),
77 "catalysts": _normalized_list(catalysts),
78 "message": "No stable reaction discovered."
79 }
80
81
82func get_definition(id:String) -> Dictionary:
83 if elements.has(id):
84 return elements[id].duplicate(true)
85 if compounds.has(id):
86 return compounds[id].duplicate(true)
87 return {}
88
89
90func get_all_definitions() -> Dictionary:
91 return {
92 "elements": elements.duplicate(true),
93 "compounds": compounds.duplicate(true)
94 }
95
96
97func get_reactions() -> Array:
98 var rows := []
99 for reaction in reactions.values():
100 rows.append(reaction.duplicate(true))
101 rows.sort_custom(func(a, b): return str(a.get("id", "")) < str(b.get("id", "")))
102 return rows
103
104
105func get_state() -> Dictionary:
106 return {
107 "elements": elements.duplicate(true),
108 "compounds": compounds.duplicate(true),
109 "reactions": reactions.duplicate(true)
110 }
111
112
113func apply_state(state:Dictionary) -> void:
114 elements = state.get("elements", {}).duplicate(true)
115 compounds = state.get("compounds", {}).duplicate(true)
116 reactions = state.get("reactions", {}).duplicate(true)
117
118
119func _reaction_key(inputs:Array, catalysts:Array = []) -> String:
120 var normalized_inputs = _normalized_list(inputs)
121 var normalized_catalysts = _normalized_list(catalysts)
122 var key = "+".join(normalized_inputs)
123 if not normalized_catalysts.is_empty():
124 key += "|catalysts:" + "+".join(normalized_catalysts)
125 return key
126
127
128func _normalized_list(values:Array) -> Array:
129 var normalized = []
130 for value in values:
131 var text = str(value).strip_edges().to_lower()
132 if text != "":
133 normalized.append(text)
134 normalized.sort()
135 return normalized