pub struct SaveState {
pub version: u16,
pub globals: BTreeMap<String, Value>,
pub global_ids: BTreeMap<String, DefinitionId>,
pub visits: Vec<VisitEntry>,
pub turns: Vec<VisitEntry>,
pub turn_index: u32,
pub rng_seed: i32,
pub previous_random: i32,
pub suspended: Option<SuspendedFlow>,
}Expand description
A persistent, name-keyed snapshot of a story’s game state.
Globals are keyed by variable name; visit/turn counts by scope
DefinitionId (which serializes as a stable "$tt_hash" string), with an
advisory author path attached when the scope is named.
Fields§
§version: u16Save-format version (see SAVE_FORMAT_VERSION).
globals: BTreeMap<String, Value>Global variables by name. BTreeMap for deterministic serialization.
global_ids: BTreeMap<String, DefinitionId>Each saved global’s compiled DefinitionId at save time, keyed by
the same name as Self::globals (M-3 rehydration miss-path lookup,
docs/modules-spec.md §5). A VAR/CONST/LIST living in a declared
module hashes its identity as (module, name), so a bare name alone
can’t reconstruct the id a #@was alias-table entry was compiled
against — this is the “module qualifier” the miss path needs,
round-tripped as the id itself rather than the module name, so no
hashing scheme has to be re-derived at load time. Consulted only when
a saved global’s name no longer matches any current global slot;
absent entries (older saves predating this field) simply fall back
to the pre-M-3 unknown-global report, same tolerant-of-patches
behavior as before. #[serde(default)] so an older save missing
this field entirely still deserializes.
visits: Vec<VisitEntry>Visit counts by scope id, sorted by id for deterministic output.
turns: Vec<VisitEntry>Turn-since counts by scope id, sorted by id.
turn_index: u32Global turn index.
rng_seed: i32RNG seed.
previous_random: i32Last drawn random value (so the RNG sequence resumes correctly).
suspended: Option<SuspendedFlow>This flow’s FlowFrame when parked mid-tunnel/mid-await
(docs/flow-suspension-spec.md §2/§9, FS-1). Absent when the flow
isn’t suspended — an ordinary save at a turn boundary, choice, or
-> END has no execution position to capture, same as before this
field existed. #[serde(default)] so an older save predating this
field still deserializes; skip_serializing_if keeps an unsuspended
save’s wire form byte-identical to before (no "suspended": null
noise).