class_name ConsideringPhrases extends RefCounted ## Authored "the GM is thinking" lines (charter §13 — even loading is content). ## Pure: cycles a phrase pool in order on a running index that is instance state ## (spec decision 4 — the indicator reuses one instance so the first phrase varies ## turn to turn without randomness). A missing/malformed file degrades to one ## hardcoded constant, so the indicator itself cannot fail. const PATH := "res://content/considering.json" const LAST_RESORT := "The Master considers your words." var _pool: Array = [] var _index: int = 0 func _init(path := PATH) -> void: _pool = _load(path) func next() -> String: if _pool.is_empty(): return LAST_RESORT var phrase := str(_pool[_index % _pool.size()]) _index += 1 return phrase static func _load(path: String) -> Array: if not FileAccess.file_exists(path): return [] var text := FileAccess.get_file_as_string(path) # Instance parse() (not JSON.parse_string) so malformed input returns an # Error code instead of the engine error the test config promotes to a fail. var json := JSON.new() if json.parse(text) != OK: return [] var data = json.get_data() if typeof(data) != TYPE_DICTIONARY: return [] var lines = data.get("considering", []) return lines if typeof(lines) == TYPE_ARRAY else []