8var failed_reactions := {}
10var reaction_history := []
14func record_discovery(reaction:Dictionary) -> void:
15 var result_id = str(reaction.get(
"result",
""))
18 var entry = discoveries.get(result_id, {}).duplicate(true)
19 entry[
"id"] = result_id
20 entry[
"state"] =
"discovered"
21 entry[
"reaction_key"] = str(reaction.get(
"key",
""))
22 entry[
"inputs"] = reaction.get(
"inputs", []).duplicate(true)
23 entry[
"description"] = str(reaction.get(
"description", entry.get(
"description",
"")))
24 entry[
"uses"] = int(entry.get(
"uses", 0)) + 1
25 discoveries[result_id] = entry
29 "inputs": entry.get(
"inputs", []).duplicate(true),
30 "catalysts": reaction.get(
"catalysts", []).duplicate(true),
31 "message": str(entry.get(
"description",
"")),
37func record_failure(reaction_attempt:Dictionary) -> void:
38 var key = str(reaction_attempt.get(
"key",
""))
41 failed_reactions[key] = {
43 "inputs": reaction_attempt.get(
"inputs", []).duplicate(true),
44 "catalysts": reaction_attempt.get(
"catalysts", []).duplicate(true),
45 "message": str(reaction_attempt.get(
"message",
"No stable reaction."))
50 "inputs": reaction_attempt.get(
"inputs", []).duplicate(true),
51 "catalysts": reaction_attempt.get(
"catalysts", []).duplicate(true),
52 "message": str(reaction_attempt.get(
"message",
"No stable reaction.")),
57func add_note(category:String, text:String) -> void:
61 "created_at": Time.get_unix_time_from_system()
65func has_discovery(id:String) -> bool:
66 return discoveries.has(id)
69func get_discoveries() -> Array:
70 return discoveries.values()
73func get_failures() -> Array:
74 return failed_reactions.values()
77func get_reaction_history(filters := {}) -> Array:
79 for entry
in reaction_history:
80 if _matches_filters(entry, filters):
81 entries.append(entry.duplicate(true))
85func get_collection_entries(filters := {}) -> Array:
87 for discovery
in get_discoveries():
88 var row = discovery.duplicate(true)
89 row[
"type"] =
"discovery"
90 row[
"title"] = str(row.get(
"id",
"")).capitalize()
91 row[
"subtitle"] =
" + ".join(row.get(
"inputs", []))
93 if _matches_filters(row, filters):
95 for failure
in get_failures():
96 var row = failure.duplicate(true)
97 row[
"id"] = str(row.get(
"key",
""))
98 row[
"type"] =
"failure"
99 row[
"title"] =
"Failed: %s" %
" + ".join(row.get(
"inputs", []))
100 row[
"subtitle"] = str(row.get(
"message",
"No stable reaction."))
101 row[
"locked"] = false
102 if _matches_filters(row, filters):
105 var row = note.duplicate(true)
106 row[
"id"] =
"%s:%s" % [str(row.get(
"category",
"note")), str(row.get(
"created_at",
""))]
108 row[
"title"] = str(row.get(
"category",
"Note")).capitalize()
109 row[
"subtitle"] = str(row.get(
"text",
""))
110 row[
"locked"] = false
111 if _matches_filters(row, filters):
116func get_state() -> Dictionary:
118 "discoveries": discoveries.duplicate(true),
119 "failed_reactions": failed_reactions.duplicate(true),
120 "notes": notes.duplicate(true),
121 "reaction_history": reaction_history.duplicate(true)
125func apply_state(state:Dictionary) -> void:
126 discoveries = state.get(
"discoveries", {}).duplicate(true)
127 failed_reactions = state.get(
"failed_reactions", {}).duplicate(true)
128 notes = state.get(
"notes", []).duplicate(true)
129 reaction_history = state.get(
"reaction_history", []).duplicate(true)
134 failed_reactions.clear()
136 reaction_history.clear()
139func _record_history(entry:Dictionary) -> void:
140 var row = entry.duplicate(true)
141 row[
"created_at"] = Time.get_unix_time_from_system()
142 reaction_history.push_front(row)
145func _matches_filters(entry:Dictionary, filters:Dictionary) -> bool:
146 var type_filter = str(filters.get(
"type",
"all"))
147 if type_filter !=
"all" and str(entry.get(
"type",
"")) != type_filter:
149 var query = str(filters.get(
"query",
"")).strip_edges().to_lower()
153 str(entry.get(
"id",
"")),
154 str(entry.get(
"key",
"")),
155 str(entry.get(
"title",
"")),
156 str(entry.get(
"subtitle",
"")),
157 str(entry.get(
"message",
"")),
158 " ".join(entry.get(
"inputs", [])),
159 " ".join(entry.get(
"catalysts", []))
161 return " ".join(haystack).to_lower().contains(query)