Skip to content

Outworld Station save parser (GVAS) — ErpForFactoryGames.OutworldStation.Saves #317

Description

@ChrisonSimtian

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):

  • Header: GVAS, engine ++UE5+Release-5.4, internal project SpaceSalvageStation
  • Per-machine production state: CurrentRecipe, IsProcessing, Process_Progress, Process_Time, EModuleMaxFactoryAmount::Recipe_X_{5,10,25}
  • Resource nodes: BP_Asteroid_{Ice,Gold,Titanium,Tungsten,GasPlant}, BP_EnvironmentObject_{Gasplant_Node,..._OreNode}
  • Progression ids: 07_ALLOY_PRODUCTION, 10_URANIUM_PROCESSING, 13_NEUTRONIUM_PROCESSING, …

Scope

  • 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.

Out of scope

Metadata

Metadata

Assignees

No one assigned

    Labels

    enhancementNew feature or request

    Type

    No type

    Projects

    No projects

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions