You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Per the #309 spike, this is the unblocked path and should go first — the catalogue is stuck behind a .usmap (#318), the saves need nothing.
Outworld Station saves are plain GVAS with tagged properties: field names, type names (StrProperty, StructProperty, ArrayProperty, EnumProperty, …) and full struct/enum paths are all inline. No mappings file, no game-specific container tricks — materially simpler than the Satisfactory v1.2 TOC/Data-Blob work that produced ADR-0014.
Ships as ErpForFactoryGames.OutworldStation.Saves from a standalone repo, per ADR-0029 — blocked on #315 for the actual publish, but development doesn't have to wait.
What's in the file
Verified against a live session (Auto_Save_0097, 17 MB, saved mid-play 2026-08-09):
Generic GVAS reader: header, then the tagged-property stream. Cover Str/Name/Text, Int/Int64/Float/Double/Bool/Byte, Enum, Struct, Array, Map, Object/SoftObject.
Strip Blueprint GUID suffixes from property names — fields serialise as GameName_3_0E6C2502453… (_<index>_<32 hex>). The stable key is the prefix.
Handle the save-set layout: <Session>###<SaveName>.sav (world state), <Session>#DATA.sav (session metadata), and global Blueprints.sav / Progression.sav / Settings.sav.
Resilience posture from the SatisfactorySaveNet v60 fix: one unparseable value must not abort the whole save. Surface unknown types as warnings and keep going.
Map into the game-agnostic IFactoryStateProvider port (ADR-0010, ADR-0014) rather than inventing a parallel contract.
Save-path resolution per ADR-0011: ERP_OUTWORLD_STATION_SAVE_PATH → user setting → appsettings → autodetect %LocalAppData%\OutworldStation\Saved\SaveGames\.
Round-trip test fixture from a real save, with counts verified against the in-game production overview.
Bonus: this partially unblocks the catalogue
The save names every recipe id actually in use, plus machine and resource-node classes. That's a derived partial catalogue — not authoritative, but enough to prove planner integration while DT_ProcessRecipes stays locked behind #318.
Per the #309 spike, this is the unblocked path and should go first — the catalogue is stuck behind a
.usmap(#318), the saves need nothing.Outworld Station saves are plain
GVASwith tagged properties: field names, type names (StrProperty,StructProperty,ArrayProperty,EnumProperty, …) and full struct/enum paths are all inline. No mappings file, no game-specific container tricks — materially simpler than the Satisfactory v1.2 TOC/Data-Blob work that produced ADR-0014.Ships as
ErpForFactoryGames.OutworldStation.Savesfrom a standalone repo, per ADR-0029 — blocked on #315 for the actual publish, but development doesn't have to wait.What's in the file
Verified against a live session (
Auto_Save_0097, 17 MB, saved mid-play 2026-08-09):GVAS, engine++UE5+Release-5.4, internal projectSpaceSalvageStationCurrentRecipe,IsProcessing,Process_Progress,Process_Time,EModuleMaxFactoryAmount::Recipe_X_{5,10,25}BP_Asteroid_{Ice,Gold,Titanium,Tungsten,GasPlant},BP_EnvironmentObject_{Gasplant_Node,..._OreNode}07_ALLOY_PRODUCTION,10_URANIUM_PROCESSING,13_NEUTRONIUM_PROCESSING, …Scope
Str/Name/Text,Int/Int64/Float/Double/Bool/Byte,Enum,Struct,Array,Map,Object/SoftObject.GameName_3_0E6C2502453…(_<index>_<32 hex>). The stable key is the prefix.<Session>###<SaveName>.sav(world state),<Session>#DATA.sav(session metadata), and globalBlueprints.sav/Progression.sav/Settings.sav.IFactoryStateProviderport (ADR-0010, ADR-0014) rather than inventing a parallel contract.ERP_OUTWORLD_STATION_SAVE_PATH→ user setting →appsettings→ autodetect%LocalAppData%\OutworldStation\Saved\SaveGames\.Bonus: this partially unblocks the catalogue
The save names every recipe id actually in use, plus machine and resource-node classes. That's a derived partial catalogue — not authoritative, but enough to prove planner integration while
DT_ProcessRecipesstays locked behind #318.Out of scope