38 lines
1.3 KiB
GDScript
38 lines
1.3 KiB
GDScript
class_name FallbackLibrary
|
|
extends RefCounted
|
|
## Authored degraded-DM fallback text (charter §13). The client shows one of
|
|
## these lines on ANY failure, in the Narrator's voice — never an error. If the
|
|
## content file is missing or malformed the library returns a hardcoded
|
|
## constant, so the fallback itself cannot fail.
|
|
|
|
const PATH := "res://content/fallback/narrator.json"
|
|
const LAST_RESORT := "The chamber is cold. Something waits in the dark."
|
|
|
|
var _lines: Array = []
|
|
|
|
|
|
func _init(path := PATH) -> void:
|
|
_lines = _load(path)
|
|
|
|
|
|
func narrator_line() -> String:
|
|
return str(_lines[0]) if not _lines.is_empty() else LAST_RESORT
|
|
|
|
|
|
static func _load(path: String) -> Array:
|
|
if not FileAccess.file_exists(path):
|
|
return []
|
|
var text := FileAccess.get_file_as_string(path)
|
|
# Use the instance API, not JSON.parse_string(): the static convenience
|
|
# method pushes an engine-level error on malformed input, which is noisy
|
|
# and (in this project's test config) turns a handled failure into a
|
|
# reported test error. The instance parse() just returns an Error code.
|
|
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("narrator", [])
|
|
return lines if typeof(lines) == TYPE_ARRAY else []
|