Skip to content

22 — Demo (multiplayer Ladder vertical slice)

Single engineering authority for the Demo. GDD owns product prose; this chapter owns locks and the demo5.8 build order. Do not maintain a second full Demo plan in the host repo — host Docs/ stubs point here.

Design authority (product): GDD Demo — Multiplayer Ladder Vertical Slice (demo-multiplayer-ladder in tfa_gdd_html).
Host: E:\Dev\Local copies\5.8_terra_demo (Lyra 5.8 + ADDON).
How to program: 26-howto-program-demo.md · Full game sibling 25-howto-program-full-game.md.
This is not Full-game Year-1 (campaign, trees, monetary, modular Refit) — see 20-critical-path.md.

How Ladder GDD + this plan + kanban combine (read this first)

Section titled “How Ladder GDD + this plan + kanban combine (read this first)”

They are one Demo, three layers — not three competing plans:

Layer Where Owns Does not own
1. Product (what / why) GDD demo-multiplayer-ladder Fantasy, slice loop, HUD/armory/Mod/abilities/combat intent, exit gates in design language C++ paths, plugin enablement, phase order on demo5.8
2. Engineering (how / when) This chapter (22) Locks copied for builders, host inventory, hybrid camera/net, build order A→K, Have/Need Full GDD catalogs / stills
3. Tracking (status) Kanban project Demo (Demo board) Cards / checklists / blocked [art] etc. New product rules (edit GDD or ch. 22 instead)
flowchart LR
  GDD["GDD Demo Ladder<br/>demo-multiplayer-ladder"] -->|"product locks"| PB["Bible ch. 22<br/>this plan"]
  PB -->|"phases A→K"| Host["demo5.8 build"]
  PB -->|"same exit"| KB["Kanban Demo board"]
  GDD -->|"scope text on cards"| KB

Same Ladder loop in all three: Boot → Online → loadout → Ladder match → fight → Match Results freeze → ladder update → requeue. Ch. 22 phases A–J build the fight/HUD/loadout spine that makes that loop real; phase K closes the online Ladder exit. GDD demo-exit = ch. 22 Ladder exit gate = kanban Demo exit cards.

GDD section → this chapter → build phase → kanban

Section titled “GDD section → this chapter → build phase → kanban”
GDD id / title Covered in ch. 22 Build phase Kanban (Demo project)
demo-what · What Demo is § Intent + product locks — demo-ladder scope tasks
demo-cut · What Demo is not § Explicit non-goals · out-of-scope diagram — cuts on cards (trees/money/campaign)
demo-loop · Vertical slice loop Product lock Pure Ladder · § Ladder exit gate K (session + Results); A–J feed the fight demo-ladder A Scaffold / session · Ladder hooks
demo-hud-gui · HUD and Demo GUIs § HUD / OmniVisor placeholders · Mod UI G OV shell · I Demo Mod Demo HUD / loadout cards
demo-armory · Fixed armory set Fixed one-weapon lock · weapons/art marking H Weapons / armory cards
demo-modkit · Demo Mod kit § Demo Mod UI · gate OFF external I Demo Mod cards
demo-abilities · Hard-coded specials § Hard-coded special abilities H Specials / kits cards
demo-combat · Combat bar Asymmetric Flow · second meter · full Burst Storm · Melee Drive · hybrid cam · AA · Phys Shield · guns B–F, Eg, Fb · D Flow Combat / camera / weapons cards
demo-kanban · Demo kanban Points here + 21-module-kanban.md — This board
demo-sandboxes-tba · Sandboxes B/C Product lock TBA — do not gate exit after K stretch / TBA cards
demo-exit · Exit gates § Ladder exit gate table K Exit / green cards

Today’s additions (inventory audit, look-vs-body, OV placeholders, Phys Shield naming, AimAssist/SKG/Carbon on-disk truth) live in layer 2 so builders know what is on demo5.8 — they do not replace the GDD Ladder chapter; they implement it.

Share without full GDD: send ch. 22 + Demo kanban (see share note in Anchors). Product prose stays optional; the combination table above is the join.


Demo = pre-art systems sandbox + multiplayer Ladder launch slice. Devs ship combat / HUD / loadout / match loop before final artwork. Fixed complete one-weapon kits (placeholders OK). OmniVisor is the in-match HUD shell you see everything through (Flow, ammo, loadout cues, Case plates, Demo Mod when gate ON). Demo Mod is the optional team tuner under that shell — switchable OFF (bDemoModEnabled / CVar / package strip) for external playtests. Not Solo campaign, not final skill trees, not economy, not mesh Refit.

Lock Meaning
Pre-art sandbox Systems / Firehand / HUD / loadout work with placeholder meshes — art swaps later without forking Demo
Pure Ladder Boot → Online → loadout → Ladder match → fight → Match Results freeze → ladder update → requeue
OmniVisor HUD Presentation shell for combat + Mod plates; stays for external playtest. Art incomplete — Demo ships placeholders (blocks / temp chrome / labeled slots); do not block Phase G or Ladder exit on final OV stills / Fire Shiv stamps. Swap real assets later without forking the shell
Fixed armory (one-weapon) Capped Demo pool of complete melee + ranged weapons (DT_TFA_DemoArmory) authored as Receiver × Frame data kits (Adaptive / Aggressive / … · Frame-band MagSize) — not mesh Refit / part Installs
Demo Mod (OFF by default external) Team-only: equipped-doll specs / affixes / gunfeel / Fake Mag / Lab. Hotkey O only when gate ON
Mod sections Weapons · Armor · Jewelry/ES · Specials ×4 · Ordnance ×4 · Tentacles ×4 (TBA placeholders — not Final trees)
Loadout hotkeys Stance / seat keys (FS-LOD-004) work with Mod OFF
Hard-coded specials Fixed kits per Demo archetype — 4 specials · 4 ordnance · 4 tentacles; names TBA
Kinetic Flow · Singularity (Demo full) In Demo (not deferred): Asymmetric Flow fuel · second meter (= Kinetic Flow) · full Burst Storm art. Melee Drive + Precision Fire feed Singularity per Spec fuel table; Ultimate stays separate (FS-CMB-006). Approach A = Ult/Energy streak only (FS-CMB-007) — not Flow. Do not treat equal-+1 / placeholder Burst as the Demo ceiling. Spec: 2026-10-26-singularity-one-flow-two-verbs-design.md · FS-CMB-002…006 · pack gaps 2026-11-05-pack-design-gaps.md
Melee Drive build Studio foundation on host now (TFAMelee Plugify GFP; camera/stance on TFACombat spine) — phases below. Self-contained Bible implementer path (GAS / Plugify; deferred until foundation): tutorials/melee-drive-guns-singularity.md
Air Melee Drive In Demo: Jump / double-jump air → Square legal; reuse ground directional slash montages; no root motion / Motion Warp in air. Downward slash when art exists — not Demo exit. Spec: 2026-11-02-air-melee-drive-design.md · FS-CMB-002. Singularity stays grounded (FS-CMB-005)
Dedicated melee No gun-butt bash in Demo spine
Hybrid camera Gun/ADS = True FPP (same skeletal mesh; local bone-hide head/torso/legs/feet — arms+gun only); melee / Singularity / Strike-from-gun = Wide TPP (FS-CAM-001…005 · FS-CAM-002)
Look vs body Camera = mouse/RS only; move = keys/LS; mesh anims (e.g. jump flip) never drive camera — see § Look vs move vs body anim
Net / anim Local FPP never kills TPP for remotes — OwnerNoSee + same-mesh bone-hide only; montages on TPP AnimInstance (FS-ARCH-013 · FS-CAM-002). ADS: local = TrueFPP FOV + optic / sight aim; remotes see TPP ADS pose (FS-GUN-013)
Guns path (current) ShooterCore / Lyra until Firehand; SKG off until Firehand designed (or explicit unlock). Dual fire stacks forbidden
Aim assist Product AA = AimAssistSystem (Plugins/ProAimAs71c3b70340fcV10/) — Enabled in .uproject. Precision Fire only — not melee magnet. Distinct from ShooterCore’s stock Lyra AA
Phys Shield Hand-held board (LOAD OUT) — not Energy Shield / Barrier. Upstream: TangoAlphaDev/BallisticShield. Absorb into TFACombat. No ADS while in-hand. Bash / block = the fire button on the shield’s hand side (default shield left → LT/RMB: tap bash · hold block) — FS-LOD-009. Inactive board = no bash/block. Energy Shield = always-on vital + ES doll seat
Wrist + Phys Shield Never in-hand together (FS-LOD-004/006). Key 1 = Wrist alone; Phys Shield pairs only with 1H gun (Hold 2) or 1H melee from W-slots (Hold 4). Both seats may be equipped on the doll; only one active pair at a time
Flow dump (TBD-056) Locked: Health-only dump (Shield/Armor chips forgiven). Do not reintroduce any-damage defaults in Demo C++
Parkour Carbon Motion Warp after combat spine. Upstream: ParkourSystem/Character — absorb needed code into TFACombat / ADDON (not a ParkourSystem plugin). WILL NOT USE: Tic-Tac and all Carbon Vault* / mantle. Space = contextual Wall Run / Jump / wall jump-off / air double jump; opposite double-tap = wall-to-wall dash (see § Wall Run · opposite dash)
No LyraGame fork GFP / ADDON only (FS-ARCH-010)
Kanban Project Demo on tracker board
Sandboxes B/C (TBA) Per-player item design · Fireteam vs AI — do not gate Ladder exit

Regular / casual MP is stretch after Ladder exit.


Equipped vs active (in-hand) vs inactive — define “holstered”

Section titled “Equipped vs active (in-hand) vs inactive — define “holstered””

TFA has no hip-holster fantasy. The BallisticShield QuickBar reference may say holstered; product language is below. Aligns with FS-LOD-006 (“equipped but not in-hand”).

Term Meaning Player-facing
Equipped Item occupies a doll / LOAD OUT seat (W1–W4, Wrist, Phys Shield, armor, ES, jewelry, …) Shows on paper doll / OV36 / loadout
Active / in-hand Current stance pair — the piece(s) you can fire, strike, block, or bash with right now Visible in hands (TPP body; TrueFPP shows arms+gun via same-mesh bone-hide)
Inactive (code may say holstered / stowed) Equipped but not in the active pair — no fire / strike / block / bash from that piece until you stance into it May hide in-hand mesh or use a stowed attach; not a required hip holster socket

Rule: Every combat piece you fight with is first equipped. Stance keys (FS-LOD-004) only change which equipped pieces are active. Unequip = leave the seat empty (bag / clear), not “holster.”

Seat / piece Equipped Active Inactive
W1–W4 gun or 1H/2H melee On a W seat In current stance (solo, dual, hybrid, or shield pair) Other W pieces stay equipped; no attack from them
Wrist Wrist seat filled Key 1 only — solo Wrist stance Equipped but idle whenever stance ≠ Wrist
Phys Shield Phys Shield seat filled Only in Gun + Phys Shield (Hold 2) or Melee + Phys Shield (Hold 4) with a legal 1H partner Equipped, not in-hand → no block/bash (FS-LOD-006)
Energy Shield ES seat (Barrier / Aegis) Always contributing vital — not an in-hand weapon N/A as “inactive weapon”; not toggled by stance the way Phys Shield is
2H in a W seat Equipped If that 2H is the active draw → locks duals / hybrids / Phys Shield pair Stowed 2H in another slot does not lock 1H draws (FS-LOD-006)
Input Active Inactive (still equipped)
Tap 2 (solo gun) That 1H gun Other W pieces; Phys Shield if equipped; Wrist if equipped
Hold 2 → Gun + Phys Shield 1H gun + Phys Shield in-hand Other W / Wrist; no ADS
Tap 4 (solo 1H melee) That melee Phys Shield equipped but not in-hand
Hold 4 → Melee + Phys Shield 1H melee (W-slot, not Wrist) + Phys Shield Wrist must not be the melee partner
Key 1 Wrist razors only Phys Shield cannot be in-hand (hard lock)
Tap 6 hybrid Named gun + melee Phys Shield not in that pair

Implementation note (BallisticShield / QuickBar)

Section titled “Implementation note (BallisticShield / QuickBar)”

Upstream repo: TangoAlphaDev/BallisticShield (LyraQuickBarComponent for ballistic / Phys Shield). Map reference bSpecialHolstered / “holstered item” APIs to bPhysShieldInactive / not in-hand`. Replicate active vs inactive; keep Phys Shield equipped on the seat the whole time unless the player clears the seat. Same idea for guns: unequipped from hands ≠ removed from W1–W4.

Upstream origins (Carbon · BallisticShield)

Section titled “Upstream origins (Carbon · BallisticShield)”
System Upstream (canonical) What we use Local mirror (when restored)
Carbon parkour github.com/TangoAlphaDev/ParkourSystem · Character/ Pattern + selected sources — cut Tic-Tac (§ Carbon port cuts) _compare/ParkourSystem-main/ (+ Content/ParkourAnimations/ for anim feed)
Phys Shield github.com/TangoAlphaDev/BallisticShield QuickBar / inactive-seat pattern Docs/Reference/BallisticShield/

Absorb rule (MASTER): Upstream repos are reference only. Ship by copying / adapting needed code into our TF GFPs (TFA* · ADDON as temporary glue). Do not install ParkourSystem or BallisticShield as Plugins/ · do not keep a live UBT dependency on those repos · do not overwrite LyraGame QuickBar. Rename into TFA types (UTFA*, GA_Hero_*, etc.) as you port.

Upstream Target GFP (lasting home) Scratch host OK?
Carbon WallRun* / MotionWarp path (Vault* WILL NOT USE) TFACombat (movement verbs) — parkour content may start under ADDON then move ADDON until Phase J absorb
BallisticShield QuickBar / Phys Shield draw-stow TFACombat (loadout / stance / Phys Shield seat) Thin ADDON glue only if needed for early Fb

Disk truth (2026-10-30): Both demo5.8 and 5.8_terra_demo are missing the local mirrors above. Re-clone into _compare / Docs/Reference for reading before Phase Fb / J — then absorb into TF plugins, do not leave as a third-party plugin. Prefer 5.8_terra_demo.


flowchart TB
  subgraph demo [Demo product]
    Ladder[Ladder vertical slice]
    OV[OmniVisor HUD shell]
    Armory[Fixed one-weapon armory]
    Kits[Hard-coded special kits]
    Flow[Kinetic Flow Singularity]
    Melee[Melee Drive]
    Guns[Precision Fire]
  end
  subgraph mod [Team only]
    Tuner[Demo Mod O-key]
  end
  subgraph host [5.8_terra_demo Plugify]
    ADDON[ADDON TerraFirma]
    Core[TFACore]
    Combat[TFACombat spine]
    MeleeGFP[TFAMelee]
    SingGFP[TFASingularity]
    Weap[TFAWeapons]
    SC[ShooterCore until Firehand]
    AA[AimAssistSystem enabled]
  end
  subgraph outScope [Not in Demo]
    Campaign[Solo campaign]
    Trees[Final skill trees]
    Money[Monetary]
    Modular[Modular parts]
    SKGoff[SKG until Firehand]
  end
  OV --> Ladder
  Armory --> Ladder
  Kits --> Ladder
  Flow --> Ladder
  Melee --> Flow
  Guns --> Flow
  Tuner --> OV
  ADDON --> Core
  Core --> Combat
  Combat --> MeleeGFP
  Combat --> SingGFP
  Combat --> Weap
  MeleeGFP --> Melee
  SingGFP --> Flow
  Weap --> Guns
  Combat --> OV
  SC --> Guns
  AA --> Guns
  SKGoff -.->|shelved| Guns

In Demo Out of Demo
Ladder vertical slice (required exit) Solo campaign / Part 1 / Earth hub
OmniVisor HUD + Demo loadout GUI Full Character I economy / Forge / trees
Fixed one-weapon armory (melee + ranged) as Receiver × Frame data kits Mesh Refit / part Installs / live Forge of Receiver×Frame on an existing drop
Demo Mod (team, O) — off for external Demo Mod visible to outside playtesters
Hard-coded special ability kits TFAProgression tree spend
Melee Drive + Precision Fire · Singularity climax Merging Ultimate into Flow (FS-CMB-006)
Asymmetric Flow · second meter (= Flow) · full Burst Storm art Ult/Energy Approach A–only / placeholder Burst Storm as Demo exit
Melee Drive foundation on host (build phases) Treating Melee Drive tutorial as blocking Demo exit
Carbon WallRun* (Phase J) WILL NOT USE: Tic-Tac · all Vault* / VaultHigh* / mantle (TicTacTrace · vault classifiers — never port)
AimAssistSystem for Precision Fire Ambient melee magnet
Match Results + ladder hooks Monetary / Crafting / campaign
Host: Docker DS + EOS stack Trust P9b / full Career as Demo exit
SKG on disk, not enabled Enabling SKG without Firehand / dual fire stacks

Do not start for Demo: MonetaryPlatform, TFAEconomy, TFAProgression trees, TFACrafting, TFAWorld campaign, modular gun/melee parts — 20-critical-path.md.


Weapons lock — no mesh modularity in Demo

Section titled “Weapons lock — no mesh modularity in Demo”
  • One weapon = one complete kit. No socketed parts / Refit mesh swaps for Demo loadouts.
  • Fake-modular lab: Demo Mod may override Mag / Optic / Range / Zoom data — mesh fixed (FS-GUN-012). inventory/demo-fake-modular-optics-mags.md.
  • Placeholders OK if marked; must still fire / swing.

  • OmniVisor: HUD shell — Flow, ammo, vitals, Counter cues, Mod plates when gate ON. Systems compose under it; Mod is not a disconnected app.
  • Stay for external: OmniVisor + loadout GUI + fixed armory. Mod gate OFF / stripped.
  • Demo Mod (W_TFA_DemoMod): team tuner. bDemoModEnabled default false external.

OmniVisor assets (placeholders — locked)

Section titled “OmniVisor assets (placeholders — locked)”

Final OmniVisor art is not complete. Demo Phase G and Ladder exit use placeholders only. Do not wait on OV lock PNGs, Fire Shiv stamps, or Case plate polish.

Rule Meaning
Placeholder OK Solid/simple UMG panels, temp fonts, labeled slots (Flow / AMMO / vitals / Counter / Mod). Mark [placeholder] in widget names or comments
Wire data first Bind real Flow, ammo, vitals, Counter, loadout cues — chrome can look unfinished
No invented final art Do not GenerateImage / invent Fire Shiv marks as “final.” When real stamps land, swap textures/materials under the same widget tree
GDD stills ov1.jpg, OV36–38, etc. remain target reference, not a Demo blocking dependency
Exit bar “OmniVisor HUD readable” = data readable on placeholders, not art-complete

Stills: OV36 ov36_demo_mod.jpg · OV37 ov37_demo_mod_edit.jpg · OV38 ov38_demo_hud_ammo.jpg. Interactive: tfa_gdd_html/figures/demo_mod_mock.html. Specs: inventory/demo-mod-item-specs.md.

Piece Spec
Gate bDemoModEnabled. OFF = tuner unreachable; play + loadout keys still work
Open O only when gate ON
OV36 Seats: W1–W4 · Wrist · Phys Shield · Helm · Chest · Gloves · Belt · Boots · Energy Shield · Ring1 · Ring2 · Amulet + Lab (lists filled + empty). Per-seat equip ON/OFF (fillOverrides; empty = unequipped, not mute) · Isolate / Restore kit. Kit catalogs: separate ranged / melee buckets; ranged = Receiver × Frame kits (auto_adaptive, hc_aggressive, …); W1–W4 ranged-only until DEMO_ALLOW_MELEE_ON_W. No Gear bag
OV37 Stats · Affixes · Sockets · Gunfeel (guns). Equipped kit picker Ranged / Melee optgroups (Frame kits). Field Spec slots on guns + melee (FS-ITM-014: Rare 1 · Legendary 2 · Unique 3 · Apex 4). Shiv Spec on Unique/Apex guns + melee (FS-ITM-015: 1 socket · per-name TBD). MagSize/reserve Frame-band per Frame + Field Spec deltas (guns). Name / Quality rules per item-specs. No mesh
Lab Combat economy · Flow · Singularity (Asymmetric Flow · second meter · Burst Storm) · Attributes · Encounter/PowerΔ · Affix totals (FS-DMG-001 channels)
1080p Fixed chrome; tab body = UMG ScrollBox — Lab Flow uses subtabs asymmetric · second · burst · singularity
HUD ammo Mag OK → OmniVisor AMMO / MagFamily (OV38)
Authority Server owns truth; client requests only
Promote Export tfa-demo-mod/v1 → demo-mod-export.md · promote_demo_mod.py

Fixed kits per archetype (Ultimate + specials / tentacles / ordnance). Server grants on sandbox enter — no tree UI.

Sandbox Intent
A (current) Shared Demo Mod / Lab
B (TBA) Per-player item design
C (TBA) Fireteam vs AI (Logic Driver Pro / TFAAI)

B/C do not gate Ladder exit.

Not a Demo sandbox: Cinematic Benchmark is a separate Year-1 product (entitled UE showcase + Motion Matching + Benchmark score submit). See 28-cinematic-benchmark.md. It does not gate Ladder exit and is not sandbox A/B/C.


Prove Notes
Session boot into Ladder EOS / Lyra online
OmniVisor HUD readable Stays external — placeholders OK (art incomplete)
Loadout from fixed one-weapon armory Not modular / not loot
Melee + ranged kits playable Placeholders OK if marked
Hard-coded specials fire No tree UI
Flow / Singularity combat bar Asymmetric Flow + second meter (= Flow) wired; melee + gun path to Singularity
Melee Drive; Singularity auto TPP Full Burst Storm art (not placeholder-as-exit)
Hybrid FPP/TPP + remotes see TPP body AC-CAM / AC-NET
Demo Mod O when ON; unreachable external Hide/strip
Match Results + ladder update Career chrome can wait

Exit: 2+ players Ladder green with HUD + armory + Flow/Singularity + hybrid camera + Mod-off external → Demo done.


Status Rule
Placeholder OK Stand-in mesh; swap later without code fork
Art marked (FPS-15) Still in Demo pool; kanban [art]

GFP / module Owns (Plugify target — remake on 5.8_terra_demo)
ADDON ATerraFirmaCharacter, experience, MotionWarp, Carbon later — glue only
TFACore Tags / messages / interfaces (Boot Active with ADDON)
TFACombat (spine) Camera director, stance, vitality, shared ASC host, hit-auth spine
TFAMelee MeleeDrive / MeleeStrike / Counter / ANS / melee DAs (Plugify)
TFASingularity Kinetic Flow + Singularity climax (Plugify; message-driven)
TFAWeapons Gun data / Firehand / Demo Mod; depends ShooterCore + AimAssistSystem (Plugify)
TFAOmniVisor In-game HUD (replaces legacy TFAAwakening name for product HUD)
ShooterCore Live fire / kills until Firehand
AimAssistSystem Enabled — Precision Fire AA
SKGShooterFramework On disk — not in .uproject until Firehand / unlock
Phys Shield BallisticShield QuickBar pattern → ADDON/TFA port
TFAOnline (later) Ladder session

Dependency: Sibling GFPs do not #include each other — Core messages only. ADDON does not own Melee/Flow/guns. See 02-gfp-cookbook.md Plugify lock.

Host inventory (demo5.8) — enumerated audit

Section titled “Host inventory (demo5.8) — enumerated audit”

Project file: E:\Dev\projects\demo5.8\Lyra_5p8.uproject
Audit date lock: treat this table as the Demo plan truth for “what’s on disk vs what’s wired.” Re-check paths before claiming a Phase gate.

1. Marketplace / product plugins (Plugins/)

Section titled “1. Marketplace / product plugins (Plugins/)”
# Name Path In .uproject? Enabled? Demo role Phase
1 AimAssistSystem Plugins/ProAimAs71c3b70340fcV10/ (AimAssistSystem.uplugin) Yes True Product Precision Fire AA (not ShooterCore’s stock Lyra AA) Eg (wire); listed Enabled from A
2 SKGShooterFramework Plugins/FPSFirstc0c0ff9d1ea1V12/ (SKGShooterFramework.uplugin) No Off (locked) Future FPS runtime under Firehand — do not enable After Firehand / explicit unlock
3 AnimationWarping Engine / project plugin Yes True Warping support for melee + parkour MotionWarp C, J
4 AnimationLocomotionLibrary Engine / project plugin Yes True Locomotion helper with warping C, J

2. Game Feature plugins (Plugins/GameFeatures/)

Section titled “2. Game Feature plugins (Plugins/GameFeatures/)”
# Name Path In .uproject Plugins list? .uplugin EnabledByDefault Demo role Phase
5 ADDON Plugins/GameFeatures/ADDON/ No (discovered under GameFeatures) True Character / experience / MotionWarp glue — not combat dump A → J
6 TFACore Plugins/GameFeatures/TFACore/ No REMAKE Contracts only — Boot Active with ADDON C
7 TFACombat (spine) Plugins/GameFeatures/TFACombat/ No REMAKE Camera / stance / vitality / ASC host B → D
8 TFAMelee Plugins/GameFeatures/TFAMelee/ No REMAKE Melee Drive (Plugify) E
9 TFASingularity Plugins/GameFeatures/TFASingularity/ No REMAKE Flow + Singularity (Plugify) E
10 TFAWeapons Plugins/GameFeatures/TFAWeapons/ No REMAKE Gun data / Firehand / Demo Mod (Plugify) F / H
11 TFAOmniVisor Plugins/GameFeatures/TFAOmniVisor/ No MISSING In-game HUD placeholders (product name; not legacy TFAAwakening) G–I
12 ShooterCore Plugins/GameFeatures/ShooterCore/ Yes False (forced on via uproject) Live fire / kill credit until Firehand E (gun→Flow); current guns
13 ShooterMaps / ShooterExplorer / ShooterTests Plugins/GameFeatures/… Yes (Maps/Explorer/Tests) per plugin Lyra shooter support / tests — keep; not TFA product —

Note: Prior demo5.8 may still show a fat TFACombat / TFAAwakening tree — do not port; remake Plugify GFPs on 5.8_terra_demo (gfp-status.md). Experience must activate Demo GFPs — folder present ≠ match loads them.

3. Reference packs (Docs/Reference/) — pattern sources, not live plugins

Section titled “3. Reference packs (Docs/Reference/) — pattern sources, not live plugins”
# Pack On disk Contents Not present Demo role Phase
11 BallisticShield (= TFA Phys Shield) Need restore — was Docs/Reference/BallisticShield/ Upstream: TangoAlphaDev/BallisticShield. Local mirror = QuickBar .cpp/.h + zip + README. Not a marketplace / Fab plugin No Plugins/ install expected — reference code only, not a shippable Phys Shield GFP Re-vendor from GitHub → port into ADDON/TFA — never overwrite LyraGame QuickBar; code “holstered” = inactive Fb
12 AimAssistSystem notes Check host Pointer to live plugin path + product vs ShooterCore AA No zip (plugin is installed at #1) Docs only Eg
# Drop Path On disk? Demo role Phase
13 Carbon / ParkourSystem _compare/ParkourSystem-main/ Need restore (missing on demo5.8 + 5.8_terra_demo 2026-10-30) Upstream: ParkourSystem — we took Character/ (CarbonParkourComponent, parkour GA/DA/types, notifies). Not a Plugins/ plugin; compare/scratch only. Phase J port onto ADDON / TerraFirma; cut Tic-Tac. Re-clone before J J (later)
14 Engine MotionWarping Engine plugin (not vendored under host Plugins/) Use with AnimationWarping (#3) Host for vault / wall-run / strike warp C, J
# Content Path On disk? Demo role Phase
15 ParkourAnimations Content/ParkourAnimations/ Yes (~600+ assets) Anim feed for Phase J Carbon port J
16 RollDodgeDash source zip Content/RollDodgeDashSet/SourceFiles.zip Yes Ancillary motion set — not Demo spine gate optional
17 OmniVisor final art GDD stills (ov1, OV36–38, Fire Shiv stamps) Target refs only Incomplete — Demo uses placeholders (ch. 22 § OmniVisor assets) G

6. Explicitly missing / not yet ported (plan debt)

Section titled “6. Explicitly missing / not yet ported (plan debt)”
# Expected Status Action
18 Full BallisticShield marketplace plugin N/A — none exists / none expected. Upstream is the GitHub QuickBar repo (#11) Do not hunt Fab. Re-vendor from BallisticShield then port into ADDON/TFA (Fb)
18b Local BallisticShield + Carbon mirrors Missing on live hosts Clone into 5.8_terra_demo/Docs/Reference/BallisticShield/ and _compare/ParkourSystem-main/ (Character sources) before Fb / J
19 SKG in .uproject Intentionally absent Keep off until Firehand
20 TFAOnline / Ladder session GFP Need (later) Phase K
21 Final OmniVisor chrome Incomplete Placeholders through G–K

Not plan debt (still planning): Do not add “install CarbonParkour under Plugins/” or “vendor a Carbon zip under Docs/Reference/” as missing work now. Inventory for parkour is #13 (_compare slice) + #15 (anims) + cut notes README. Phase J decides the port — no plugin install expected during planning.

Doc mention Actual location Size / note
BallisticShield github.com/TangoAlphaDev/BallisticShield → vendor Docs/Reference/BallisticShield/ QuickBar sources only (not marketplace)
AimAssist “zip” None — live plugin #1 README in Docs/Reference/AimAssistSystem/ when present
Parkour / Carbon ParkourSystem/Character → _compare/ParkourSystem-main/ Anims: Content/ParkourAnimations/ · cut notes: Docs/Reference/CarbonParkour/README.md
SKG Plugin folder #2, not a Docs zip Off

Carbon port cuts (Phase J) — WILL NOT USE (Tic-Tac + Vault*)

Section titled “Carbon port cuts (Phase J) — WILL NOT USE (Tic-Tac + Vault*)”

Sample enum in _compare/.../CarbonParkourTypes.h. TFA (Full + Demo) does not ship Tic-Tac or parkour Vault / Mantle. When porting, delete or never register these paths — do not leave dead TicTacTrace / vault classifiers ticking. Cite FS-MOV-003.

Keep (absorb) WILL NOT USE (never port)
WallRunLeft · WallRunRight · WallRunOver · WallRunOn All Vault* · VaultXShort/Short/Medium/Long/On · VaultHigh*
Wall Run GA + MotionWarp continuous wall stick (FS-MOV-004) VaultTicTacLeft · VaultTicTacRight · TicTacLeft/Right/On
TicTacTrace / CachedTicTac* / WarpTargetTicTac / bTicTacOffset / VaultSolution vault branches
Any Content anims authored only for Vault or Tic-Tac · GA_Hero_Vault · MOVE_TFA_Vault · TFA.World.Vaultable

Port rule: Side-hit / height classification must fall through to WallRun* or plain Jump — never Vault* or Tic-Tac. Do not spend art budget on vault / Tic-Tac montages.

Wall Run · opposite dash · wall jump-off (Demo / GDD lock)

Section titled “Wall Run · opposite dash · wall jump-off (Demo / GDD lock)”

Shared Space (Jump / parkour): One key — Space (pad Cross / A). Context picks the verb. Does not give Space ownership of Dodge / Slide / Crouch / Vault (FS-INP-001 · FS-MOV-003 WILL NOT USE).

Context Space does
Near a low ledge / former “vaultable” prop Jump only — WILL NOT USE Vault (FS-MOV-003)
Near / contact TFA.World.WallRunnable (or WallWalkable tag — same family) at sprint / legal enter Enter Wall Run on that side
Already Wall Running Wall jump-off — leave the wall with exit momentum (FS-MOV-004)
Air, after wall jump-off (air-jump charge available) Double jump along the wall-exit direction (not a free midair redirect). Mesh flip OK; Look unchanged
No wall / post-exit context Normal Jump (incl. double-jump flip mesh-only — look rule unchanged)

Wall Run persistence: Once entered, Wall Run continues while valid wall contact (not a hold-to-stick Wall Walk). Release Space does not cancel. Ends on: leave surface / fail / WallRunMaxDuration timeout / wall jump-off / auto peel (lookahead miss or turn gate). Opposite-wall dash jump keeps Wall Run alive on the new wall (see below). Spec: docs/superpowers/specs/2026-11-02-wall-run-curve-end-design.md.

Lookahead / curve / turn gate: While attached, probe ahead along the wall tangent (WallRunLookaheadDistance lab default 2.0 m · WallRunLookaheadSamples 4). No tagged wall ahead → auto peel (same exit as wall jump-off) before walking off the lip. If wall-normal delta > MaxWallTurnDegrees (lab default 45°) → auto peel. Under the gate → curve follow (re-stick normal; no timer reset). Turn / lookahead dials are not DEX-scaled. Demo Mod Lab › Parkour exposes them for playtest.

Wall Run timer: Counts down while attached. Lab / Demo default WallRunMaxDuration = 3.0 s (parkour DA + Demo Mod Lab › Parkour dial). Fresh enter = full. Successful opposite-wall dash jump resets the timer to full. Failed / out-of-range dash does not reset. DEX (and parkour affixes) scale effective duration — Mod exposes %/pt dials.

Wall jump-off + directional double jump:

Rule Lock
Wall → air While Wall Running, Space = jump off the wall (ends Wall Run; keeps exit momentum)
Air → double jump Press Space again → one double jump in the same direction as the wall jump-off
Not Free midair redirect onto look/stick alone · parkour Vault (WILL NOT USE) · opposite-wall dash jump (that stays double-tap opposite)
Camera Double-jump flip is mesh only — see § Look vs move vs body anim

Opposite-wall dash jump (wall-to-wall):

Rule Lock
Input Double-tap move toward the opposite side of the current Wall Run (same double-tap family as Dodge FS-MOV-001, contextual while wall-running) — not Space
Feel Dash jump across the gap (short airborne transfer), then stick Wall Run on the far wall
Example Wall Run Left → double-tap Right → dash-jump to a Right wall
Range Opposite wall must be within MaxWallDashDistance — lab / Demo default 6.0 m (parkour DA + Demo Mod Lab › Parkour). DEX / parkour affixes scale effective distance
Success Attach to far wall → continue Wall Run on that side → reset Wall Run timer to full
Fail No opposite wall in range → no transfer (no free mid-air teleport); timer unchanged. Default = stay on current run or natural fall if contact lost
Same-side double-tap Does not wall-to-wall (not “dash deeper into” the wall you are on)
Ground Double-tap remains Dodge — only wall-run context remaps opposite double-tap to dash jump

Not Tic-Tac / Vault: Controlled distance-gated dash jump between two walls — not Carbon Tic-Tac or Vault* montages (WILL NOT USE).

FS cite: FS-MOV-004 (Space enter Wall Run; continuous; timer + dash-jump reset; wall jump-off; directional post-exit double jump) · FS-MOV-003 WILL NOT USE · double-tap axis FS-MOV-001 · verb non-overlap FS-INP-001.


One authored character skeletal mesh — no separate arms-only asset (FS-CAM-002). Dual components + OwnerNoSee, not dual art meshes.

Mode Local Remote
TrueFPP Eye cam ~105° on control rotation. FPP view component: same skeletal asset; bone-hide head, torso/body, pelvis, legs, feet so only arms + gun stay visible. TPP component: full body, bOwnerNoSee = true (optional Cast Hidden Shadow proxy if self-shadow breaks). Prefer bone / section hide — not material alpha as the primary hide. ADS: TrueFPP weapon FOV + Sight / Scope aim (FS-GUN-013) — look-through allowed for ScopeShort / ScopeLong Full TPP body + gun montages; ADS: remotes see TPP ADS / cheek-weld pose (local ADS FOV / optic view is not shared)
WideTPP Spring-arm / Lyra TPP; show full TPP; stop bone-hide / hide or idle the FPP view component Same TPP body
Shift-Out Blend to TrueFPP in 0.2 s; blocked if ADS-locked —

Forbidden: SetHiddenInGame on TPP for perspective (hides body for everyone). Networked montages + equipment stay on TPP AnimInstance / sockets. FPP-biased upper overlays (later) stay on the same skeleton.

Look vs move vs body anim (no camera flip)

Section titled “Look vs move vs body anim (no camera flip)”

Lock (FS-CAM-006): Camera orientation is always mouse / right-stick look (FS-INP Look) in both TrueFPP and WideTPP. Locomotion is always move keys / left-stick. The body may rotate, flip, twist, or somersault for any reason — double-jump flip, melee / gun attack montages, dodge/roll, Wall Run re-stick, root motion — and that motion is mesh-only. It must never:

  • Rotate, pitch, roll, or re-aim the gameplay camera
  • Steal or freeze mouse / RS look
  • Copy mesh orientation into control rotation

During the flip / attack, the camera keeps facing the aim it had (and any new mouse deltas the player adds). Player look input remains live for the whole animation unless a later explicit CC / ability camera mode says otherwise (Singularity may grant a temporary ability camera — it must restore free look after).

Channel Owner Must not
Look / camera Mouse or RS → control rotation (pitch + yaw the player aims) — always Follow mesh root, flip somersault, melee/gun attack twist, jump montage, dodge/roll, or Wall Run mesh / curve re-stick
Move (ground / air) WASD / LS — relative to camera yaw (not pitch) Steal look; ignore move input while flipping unless a separate CC rule says so
Move (Wall Run) WASD / LS — wall-locked along tangent / wall plane (FS-MOV-004) Follow camera yaw; peel from look alone
Body (local + remotes) AnimInstance / montage on TPP mesh (and local FPP view component / bone-hide when TrueFPP) Write camera FOV, blend, or control rotation

TrueFPP: View is eye / control rotation. If the body (or visible arms) flips during a jump or attack, the camera does not roll or pitch with the spine — aim stays where the mouse left it; mouse still steers.

WideTPP: Spring-arm follows the capsule / pawn, not flipping mesh bones. Remotes still see the flip / attack on your TPP body; their screen is their own mouse look on their pawn.

Remotes never use your camera. They only need replicated movement + TPP anim. Your flip / attack is visible on your mesh; it does not “send” a tumbling camera.

Examples

Situation Camera Body
Walk + mouse look Tracks mouse Locomotion facing per move / aim rules (camera-yaw relative)
Double jump, 2nd jump = flip Stays on mouse aim — no flip follow; mouse still live Mesh plays flip; remotes see it
Any attack montage that twists / spins the mesh (FPP or TPP) Stays on pre-attack aim + live mouse / RS Attack anim on mesh only
Wall Run + free look Stance owns FPP/TPP (FS-CAM-001); mouse free; no soft follow toward wall Runs along wall tangent (W wall-locked); look does not steer path
Melee strike montage Stance camera (WideTPP) still mouse-look yaw/pitch Attack anim on TPP; no auto magnet
Singularity / takedown May use ability camera mode if granted Separate from jump-flip rule; ability stack still must not leave look stuck after

Wall Run camera/move: docs/superpowers/specs/2026-11-02-wall-run-camera-move-design.md.

Implementation cue: Do not parent the gameplay camera to animated bones for jump / flip / attack. Keep bUseControllerRotationYaw / look on the controller (or equivalent); play body rotation as mesh-only (or root motion that does not copy into camera rotation). Same rule in FPP and TPP.


Build order (demo5.8) — follow in sequence

Section titled “Build order (demo5.8) — follow in sequence”

Each phase ends in a gate before the next.

Phase Goal Gate
A Host / GFP ADDON + TFACore Boot Active; AimAssist Enabled; do not enable SKG; register Plugify GFP slots Editor boots sandbox; Core links
B Camera + dual-component + movement foundation TFACombat spine: UTFACameraDirector TrueFPP/WideTPP; same skeletal mesh; OwnerNoSee TPP; local bone-hide head/torso/legs/feet in TrueFPP (arms+gun only); look vs body; baseline locomotion + Space verb map — see § Vault · Wall Run · opposite dash · wall jump-off Local hybrid feel; remotes see TPP; Space≠Dodge/Slide; look never follows mesh flip
C Melee Drive TFAMelee Plugify: MeleeDrive, Strike, ANS, MotionWarp (ground only), cone on Attack, air = same slash set / no warp, 1H/2H/Wrist stubs Cone AC; air AC; server GE; 2-client damage
D Flow + Singularity TFASingularity Plugify: Asymmetric Flow + second meter (= Flow); Overclocked; auto Singularity; full Burst Storm art; subscribe TFA.Combat.KillConfirmed Mix path → Singularity with full bursts; Flow ring readable on HUD
E Counter + gun→Flow Counter in TFAMelee; gun kill credit → Flow messages; ShooterCore until Firehand Counter / gun Flow fuels
Eg AimAssistSystem Wire AA for TrueFPP guns only AA on guns; no melee Tick magnet
F Loadout / stance FS-LOD keys 1/4/5/Hold4/2/3/6/7; 2H locks Stance flips camera; Strike gated
Fb Phys Shield Read BallisticShield → absorb QuickBar pattern into TFACombat Phys Shield seat; TPP mesh; active vs inactive — no BallisticShield .uplugin Draw/stow replicates; ADS locked Gun+Phys Shield; ES vital unchanged
G OmniVisor shell Flow/ammo/vitals through OV (placeholder chrome OK — art incomplete) Readable without Mod; no final OV art required
H Armory + specials DT_TFA_DemoArmory + hard-coded kits Pick kits; specials fire
I Demo Mod W_TFA_DemoMod OV36→37; Lab; export; gate OFF safe; ON edits session; server auth
J Carbon parkour port Read ParkourSystem/Character → absorb WallRun* only into TFACombat (+ WallRun anims; ADDON scratch OK first); Phase B verb map; WILL NOT USE Tic-Tac and Vault*; no ParkourSystem .uplugin Tunable distance; remotes see body; does not replace doing camera+movement in Phase B
K Ladder exit Online + Results + Mod-off external Demo done
A → B (camera + movement) → C → D → E → Eg → F → Fb → G → H → I → J (Carbon port) → K

Kanban order: after host/ADDON, do demo-hybrid-camera then demo-movement-input before combat/Flow/Mod cards. demo-carbon-parkour stays Phase J (port/polish), not a gate that delays B.

Detail types (GA names, DA paths) live in host implementation; this table is the program order.


Buildability audit (demo5.8) — can make vs cannot

Section titled “Buildability audit (demo5.8) — can make vs cannot”

Audit date: 2026-10-27 · Sources: this chapter · Demo kanban · FS · on-disk host scan.
Rule: Design lock ≠ shippable. If content, GFP, or studio foundation is missing, mark cannot even when GDD/FS describe the fantasy.

Slice Why Kanban / phase
Host / ADDON boot, experience wiring ADDON hero, L_TestMap, GFP trees present A · demo-host / demo-addon
Hybrid camera wiring UTFACameraDirector on TFACombat spine (remake on live host; still FPS-first playable until wired) B · demo-hybrid-camera
Baseline Roll / Slide / WallRun ADDON GAs on disk (GA_Hero_Roll / Slide / WallRun) + parkour anim pack B (partial) · demo-movement-input
Live gun fire / kills ShooterCore Enabled — Demo gun path until Firehand E (gun half) · armory placeholders
AimAssist plugin AimAssistSystem Enabled in .uproject — needs wire for Precision Fire only Eg · demo-aimassist-wire
Phys Shield port BallisticShield → Docs/Reference/BallisticShield/ (not marketplace) Fb · demo-phys-shield
OmniVisor placeholder shell Prior demo5.8 had UTFAOmniVisorWidget under legacy TFAAwakening — remake under TFAOmniVisor Plugify GFP on 5.8_terra_demo. Final art not required. G · demo-hud-gui
Demo Mod UMG from HTML mock Mock + export/promote docs exist I · demo-modkit
Docs / verb locks FS-INP/MOV/CAM · GDD · Firehand stack note Planning complete
Slice Limit
Gun → Flow credit Can hook ShooterCore kills into a Flow counter without melee
Space Vault WILL NOT USE (FS-MOV-003) — do not add GA_Hero_Vault / Vaultable tags
Wall jump-off / opposite dash / continuous Wall Run Spec locked; WallRun GA exists but not full FS-MOV-004 behavior
Firehand Bus Design + CSV/scaffold intent; no runtime Bus — stay on ShooterCore
Loadout 1–7 Spec locked; needs stance machine on pawn (after camera)

Cannot make yet (blocked — missing foundation / content / GFP)

Section titled “Cannot make yet (blocked — missing foundation / content / GFP)”
Slice Blocker What is missing
Melee Drive (playable Melee Drive) No Melee Drive foundation delivered Melee Drive = header only (TFAMeleeDriveCombatComponent.h, no .cpp). Melee Drive tutorial DEFERRED until own foundation ships. Almost no TFA melee montages/ANS (ShooterCore has tiny GA_Melee only). Family DAs / strike GAs not built. Do not pretend Phase C is buildable from design prose alone.
Flow → Singularity (Demo exit bar) Depends on melee verb + Burst Storm Melee half blocked (above). Full Burst Storm art is a Demo lock (DA_TFA_SingularityBursts) — without authored burst content, Singularity exit fails even if Flow counter stubs.
Counter Needs Melee Drive + AI window Phase E after C
TFACore shared tags/messages GFP missing under Plugins/GameFeatures/ Needed for Plugify Combat / Melee / Singularity / Weapons messaging
SKG gun runtime Locked off until Firehand Plugin on disk; not in Demo fire path
Carbon as installed plugin Never — absorb into TF GFPs Compare #13 + anims #15; Phase J copies code into TFACombat/ADDON
Ladder Online / Results TFAOnline / session GFP later Phase K
Final OmniVisor / family SKs / modular Refit / trees / economy Out of Demo or [art] blocked Explicit non-goals
  1. Do B first (camera + movement you can advance).
  2. Do not start C–D as if melee were ready — unblock Melee Drive with a real foundation (strike montages + Melee Drive .cpp + family DA + MotionWarp on Attack) before Singularity Demo exit.
  3. Guns/AA/Phys Shield/OV placeholders/Mod can proceed on the non-melee spine once B is green.
  4. Carbon / SKG / Ladder stay later.

  • GDD Demo chapter + kanban Demo project
  • Flow / Singularity: Demo includes Asymmetric Flow · second meter · full Burst Storm art (was Out-of-Demo; flipped into Demo)
  • Demo Mod HTML mock + item-specs / export docs
  • Host analysis notes; unified build order this chapter
  • AimAssistSystem enabled in .uproject; SKG shelved by lock
  • Upstream origins locked: ParkourSystem/Character · BallisticShield
  • Host inventory enumerated (§1–7): plugins, GFPs, zips, Carbon compare, missing debt, phase map
  • Demo kanban seed synced: build order A→K, host inventory, Phys Shield, AimAssist wire, Carbon J, Lab Flow, OV placeholders, look-vs-body, full Burst Storm exit
  • Live host 5.8_terra_demo Lyra 5.8 + Docker DS + ADDON hero / L_TestMap (legacy demo5.8 pointer may be missing)
  • Live fire = ShooterCore (no SKG in .uproject)
  • Target GFP trees: ADDON · TFACore · TFACombat spine · TFAMelee · TFASingularity · TFAWeapons · TFAOmniVisor (Plugify — remake + experience activation)
  • AimAssistSystem plugin Enabled (§1 #1); SKG on disk Off (#2)
  • OmniVisor placeholder policy locked; Placeholder mesh policy + FPS-15 flags
  • ParkourAnimations content may still exist on host (Content/ParkourAnimations/) — verify before J
  • Re-vendor BallisticShield + ParkourSystem/Character from GitHub onto 5.8_terra_demo (local mirrors currently missing) — #18b
  • Hybrid FPP/TPP director + dual-component (same mesh) net + movement foundation (Phase B — before combat); Carbon port remains Phase J
  • TFACombat spine + TFAMelee (Drive/Counter) + TFASingularity (Flow→climax) — Plugify remake (C–E)
  • AimAssistSystem wired for Precision Fire (Eg)
  • Loadout / Phys Shield: absorb BallisticShield into TFACombat (F–Fb)
  • OmniVisor placeholder shell + Demo armory + hard-coded kits + Demo Mod UMG (G–I); final OV art later (#23)
  • Demo Mod Lab › Parkour dials: WallRunMaxDuration 3.0 s · MaxWallDashDistance 6.0 m (+ DEX %/pt) · MaxWallTurnDegrees 45 · WallRunLookaheadDistance 2.0 m · WallRunLookaheadSamples 4 — playtest then promote
  • ATFAGameState / ATFAPlayerState under TFACore (ownership: 03-pawn-composition.md)
  • Carbon: absorb ParkourSystem/Character into TFACombat/ADDON (Phase J) — never a Carbon Plugins/ entry
  • Ladder / TFAOnline + Mod-off external (K) (#22)
  • Firehand Bus before any SKG enable (#21)
  • Keep Full game ch. 20 for Solo / trees / monetary / modular weapons
  • Full enumerated inventory: § Host inventory above

Forking LyraGame · enabling SKG pre-Firehand · dual ShooterCore+SKG fire · modular mesh Refit · final trees / monetary · ambient melee pull · Mod ON for external · second bible/host Demo plan narrative · treating Cinematic Benchmark as this Ladder exit · full-body Pose Search that wipes Lyra upper/lower Linked Layers. (TBD-056 Health-only is locked — do not invent alternate dump math in C++.)

In Demo (extra card): Motion Matching / Pose Search lower-body loco with Lyra upper/lower split — kanban demo-motion-matching · full tutorial docs/tutorials/motion-matching-demo-and-full.md (Demo + Full) · design docs/superpowers/specs/2026-11-02-motion-matching-full-design.md. Wall Run MM: L/R cycle while stuck; Pose Search only at enter/exit into ground loco — 2026-11-07-wall-run-motion-matching-design.md.