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).
File kinds (own files)
Section titled “File kinds (own files)”| 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.
Mock UI
Section titled “Mock UI”- 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.
Promote path (CLI — Done)
Section titled “Promote path (CLI — Done)”# validate onlypython promote_demo_mod.py data/demo_mod_exports/fixtures --dry-run
# write cooked targetspython promote_demo_mod.py data/demo_mod_exports/fixtures --out data/promoted/smokepython 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/.
UE handoff (still Need)
Section titled “UE handoff (still Need)”| 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 |
Non-goals
Section titled “Non-goals”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.