Skip to content

Demo Mod — Export / Import / Promote

Scope: Session dials and piece overrides leave the HTML mock (and later W_TFA_DemoMod) as one file per concern, then promote into cooked data (DT / UDA / CSV).
Interactive: tfa_gdd_html/figures/demo_mod_mock.html
Schema: tfa-demo-mod/v1
Promote CLI: python promote_demo_mod.py <exports> [--out data/promoted/<run>]


Lab formulas, Ult/Energy rates, gunfeel, and doll overrides must not stay trapped in the Mod session. Export → review → Promote to data (team-only). Shipping builds read cooked rows only (FS-GUN-012 · combat-economy design §6).


Kind Filename pattern Payload
lab-formulas tfa-lab-formulas.json Attribute per-pt + encumber dials (FS-PRG-002)
lab-economy tfa-lab-economy.json Ult / Skill Energy streak dials (FS-CMB-007)
lab-flow tfa-lab-flow.json Asymmetric Flow · second meter · Burst Storm / Singularity (FS-CMB-004/005)
lab-parkour tfa-lab-parkour.json WallRunMaxDuration · MaxWallDashDistance · MaxWallTurnDegrees · lookahead distance/samples · DEX %/pt on duration/dash (FS-MOV-004)
lab-raw tfa-lab-raw.json STR…WIS integers (lab sandbox)
lab-encounter tfa-lab-encounter.json alvl / dlvl / ARL / Difficulty / PowerΔ / CtH dials
piece tfa-piece-<seat>-<id>.json One committed (or draft) doll override — plate · affixes · gunfeel · kit/quality/sockets
manifest tfa-export-manifest.json Index of split files + fillOverrides / ammo meta

Envelope (every file):

{
"schema": "tfa-demo-mod/v1",
"kind": "lab-formulas",
"exportedAt": "ISO-8601",
"scenarioId": "…",
"payload": { }
}

Everything (split files) downloads the manifest, then the six lab files (economy · flow · parkour · raw · formulas · encounter), then each committed piece — browsers may ask to allow multiple downloads.


  • OV36 list: Export dropdown + Download · Import file… (multi-select JSON).
  • OV37 edit: Export this (current draft, including unsaved gunfeel / formulas).

Import merges into session state (lab layers or committed[key]). Does not auto-cook Unreal data.


Terminal window
# validate only
python promote_demo_mod.py data/demo_mod_exports/fixtures --dry-run
# write cooked targets
python promote_demo_mod.py data/demo_mod_exports/fixtures --out data/promoted/smoke
python promote_demo_mod.py path/to/exports # → data/promoted/<utc-stamp>/
Export kind Cooked artifact Ship?
lab-economy DT_TFA_CombatEconomy.json Yes — Ult/Energy rates (FS-CMB-007)
lab-flow DT_TFA_FlowSingularity.json (or DA Burst Storm table) Yes — Asymmetric Flow / second meter / Burst Storm (FS-CMB-004/005)
lab-parkour DT_TFA_ParkourLabDefaults.json → parkour DA Yes — WallRun 3.0 s / dash 6.0 m / turn 45° / lookahead 2.0 m·4 + DEX on duration/dash (FS-MOV-004)
lab-formulas DA_TFA_AttrFormulas.json Yes — per-pt feeds (FS-PRG-002)
lab-raw DT_TFA_LabAttrRaw.json No — character sandbox only
lab-encounter DT_TFA_EncounterLabDefaults.json No as global — area owns Difficulty/ARL
piece kits/<seat>__<id>.json + gunfeel/DemoKitGunfeel.csv Yes — kit fill / gunfeel columns

Each run also writes REPORT.md + promote-manifest.json. Fixtures: data/demo_mod_exports/fixtures/.

Step Notes
Same schema from UMG W_TFA_DemoMod Export writes the same tfa-demo-mod/v1 files
Editor import Team imports promoted JSON/CSV into DT/UDA / UDA_TFA_GunFrames columns
External Mod gated OFF — no export RPCs; runtime uses cooked data only

Silent C++ defaults from a half-imported file · client-owned damage/cadence · replacing area-authored Difficulty with a global JSON drop · auto-cooking .uasset without the editor.