Skip to content

Demo Mod — equipped doll item specs + affixes

Authority: FS-LOD-001 (equipped slots) · FS-GUI-004 (Inspect plate) · FS-CRF-009 (Rewrite affix grammar) · FS-GUN-012 (Demo Mod session / no mesh) · Character I mock pools in tfa_gdd_html/js/gui.js.
Interactive: tfa_gdd_html/figures/demo_mod_mock.html
Rule: Team modification system for the Demo sandbox (pre-art + Ladder launch). Session overrides. No mesh Refit. No Gear bag this pass.
Must be switchable OFF (bDemoModEnabled) so devs / playtests run combat without the tuner overlay. External default OFF. Ladder may zero affix deltas in live Ladder — Mod still edits them for lab when ON.
Export: Split JSON per concern (gunfeel pieces · lab formulas · economy · raw · encounter) — demo-mod-export.md.


Category chips filter the list:

Category Contents
Weapons W1 · W2 · W3 · W4 · Wrist · PhysShield (filled and empty seats)
Armor Helm · Chest · Gloves · Belt · Boots (filled and empty)
Jewelry / ES EnergyShield · Ring1 · Ring2 · Amulet (filled and empty)
Specials Always 4 hard-coded Demo kits — names/numbers TBA (not Final trees)
Ordnance Always 4 hard-coded Demo kits — TBA
Tentacles Always 4 hard-coded Demo kits — TBA
Lab Session-wide (not a doll seat): Combat economy · Flow · Singularity · Attributes · Encounter · Affix totals

Doll lists show every seat in the section (filled and empty). Per-row equip ON/OFF writes session fillOverrides (null = unequipped) — real empty seats, not mute. Isolate snapshots the current fill, unequips every other doll seat, keeps the selected seat. Restore kit reapplies that snapshot, or clears overrides to the scenario default if no snapshot. Re-equip uses seat kit memory (last kit on that seat), else first kit from kitCatalogForSeat. Affix totals / OmniVisor ammo / export read effectiveFill only. Hard-coded ability kits always show 4 rows (no seat toggle this pass). Never the full armory catalog. Never bag tiles / ammo bricks. Section tabs must switch while Mod is ON (Esc only leaves edit — does not gate Mod).

Kit catalogs (ranged vs melee): Buckets stay separate in KIT_CATALOG (ranged · melee · armor · …). Seats resolve via SEAT_CATALOG_KEYS (arrays). W1–W4 are ["ranged"] today; set DEMO_ALLOW_MELEE_ON_W = true (or append "melee" to those keys) when the melee pass starts — Equipped-kit picker already groups Ranged / Melee optgroups. Wrist stays ["melee"] only. Do not merge catalogs into one flat weapons list.

Lab — Combat economy + Flow + Attributes

Section titled “Lab — Combat economy + Flow + Attributes”

1080p / UE: fixed chrome (title · tabs · OK/Back); tab body = ScrollBox — never a wall of rows past the viewport.

Row Edits Authority
Combat economy Ult / Skill Energy dials + live Ult% · Energy · streak count · Simulate kill FS-CMB-007 · FS-VIT-002
Flow · Singularity Subtabs asymmetric · second · burst · singularity. Asymmetric Flow kill credits (melee +2 · gun body +1 · headshot +2) · Overclocked/Singularity thresholds · second meter = Kinetic Flow (≠ Ult / ≠ Energy; no fourth meter) · full Burst Storm art set id / count / kick · Singularity bullet-time / Force TPP · TBD-056 Health-only dump. Export tfa-lab-flow.json. FS-CMB-004/005 · bible ch. 22 Demo full
Attributes Raw STR…WIS integers and per-pt formula dials; derived Max HP / melee ED% / encumber / swap ms / Energy max / WIS discounts. Character level RO → Encounter. FS-PRG-002
Encounter / difficulty Subtabs Levels · Hit · Resists. Lab override: CharacterLevel / EnemyLevel / Difficulty. Full game: area owns Difficulty tier + monster level policy (not Create Character). 1080p scroll. FS-DMG-002 · FS-PRD-005 · FS-CMP-006 · FS-DMG-004/005
Affix totals RO subtabs Damage · Resists · Other. Always lists FS-DMG-001 channels (Kinetic + 8 energy damage%; Kinetic DR + 8 energy resists). Guard stacks into every energy resist. Other = AR / IAS / Life Steal / etc. Not a per-affix dump. 1080p scroll. Demo lab group×band magnitudes

Spec: docs/superpowers/specs/2026-10-26-demo-combat-economy-stats-design.md · Flow: 2026-10-26-singularity-one-flow-two-verbs-design.md. Economy / Flow / encounter dials live under Demo Mod / TFACombat — not OmniVisor authority.


Subtabs (1080p / UE lock: tab body = ScrollBox; chrome fixed — title, tabs, OK/Back always reachable; never grow a wall of rows past the viewport). Specials / Ordnance / Tentacles stay TBA stubs (no kit catalog). Lab uses the same rule with its own subtabs (Combat economy: Live · Ultimate · Energy; Flow · Singularity: asymmetric · second · burst · singularity; Attributes: Raw · Formulas · Readouts).

Tab Contents
Stats Seat RO · Equipped kit · Name (locked) · Unique name (editable Legendary/Unique/Apex only) · Type · Quality · Kind auto · Trait (all) · Origin (L/U/Apex) · Set ID (Unique/Apex) · Field Spec slots (guns + melee: Rare 1 · Legendary 2 · Unique 3 · Apex 4 — demo-mod-field-specs.md) · Shiv Spec (Unique/Apex guns + melee · 1 socket · per-name TBD — demo-mod-shiv-specs.md) · plate
Affixes Demo ladder: Common 0+0 · Uncommon 1 OR 1 (xor) · Augmented 1+1 · Rare 2+2 · L/U/Apex 3+3 (clamped on open/OK)
Sockets Open wells by Quality (Common/Uncommon 2 · Aug 3 · Rare 4 · Legendary 5 · Unique/Apex 6; editable 0–6) · Phonon/Gem/Jewel · Artifact Unique/Apex only · Chord Common + Phonon order
Gunfeel Guns only — AA / Bloom / RangeStat / Mag / Optic or Counterweight → Mag OK refreshes OmniVisor ammo. MagSize is kit-owned (Adaptive min/default/max per kit × MagFamily; HC ≠ Auto); reserve from kit row — demo-fake-modular-optics-mags.md

Quality locks: Name always RO. Unique name + Artifact locked below their gates. Affix rows = Quality caps only; Uncommon locks the other side once one side is filled. Stale extra rows cannot survive reopen.

Verb lane (FS-ITM-010 2026-11-13d): Seat-aware Trait columns. Guns: Common none · Uncommon Verb · Augmented Feed+Verb · Rare Bullets+Feed+Verb · L/U/Apex +Plate — fields traitVerbId / traitFeedId / traitBulletsId / traitPlateId (+ mags); Feed label = MagFamily + ” Spec”. Armor/shields: same curve with Shell·Stride·Brace·Verb — fields traitShellId / traitStrideId / traitBraceId / traitVerbId (+ mags); AT-01…120 filtered by tfa_armor_trait_column_map_v1.json. Jewelry: no Trait columns. Unique originId; Apex also originId2. Legendary never Origin. Rare never Set. Catalog: tfa_trait_origin_catalog_v1.json.

Name modes: Common/Uncommon/Augmented → affix-built. Rare → GDD First Word + Second Word (lexicon dropdowns). Legendary/Unique/Apex → hand-authored Unique name (not the Rare lexicon).

Kit change resets plate / affixes / sockets / gunfeel to that kit’s defaults (session fill override; no mesh). Ranged Equipped-kit picker lists Receiver × Frame kits (auto_adaptive, hc_aggressive, …) with Frame-band MagSize/reserve per Frame Mag band. OK merges identity + plate + affixes + sockets + kitId into session. Esc / Back / Cancel discard.


Verb lane + Set schema (session override / export)

Section titled “Verb lane + Set schema (session override / export)”
traitId: string // all qualities that use the verb lane (C→Apex)
traitMag: number // playtest magnitude for traitId (Demo Mod dial)
originId: string // L/U/Apex only; empty below Legendary
originMag: number // playtest magnitude for originId (L/U/Apex)
setId: string // Unique/Apex only; empty otherwise
setPieceIndex: number // 0 when no setId; mock piece index / owned-count hint for Inspect pips
fieldSpecId1..4: string // guns + melee Rare→Apex (FS-ITM-014); empty when locked
shivSpecId: string // Unique/Apex guns + melee (FS-ITM-015); SHIV-TBD until nameplate authored
familiarityXp: number // use XP while equipped (FS-ITM-013)
masterworkRank: number // 0|1 craft-only (FS-CRF-012)

Quality gating is enforced on Quality change, OK commit, and committed overlay apply (clampVerbLane · clampFieldSpecs · clampShivSpec). Inspect (#ins-verb) shows Trait; L/U/Apex also show Origin; Unique/Apex also show Set pips 2–6.


{ side: "prefix"|"suffix", group: string, name: string, band: "low"|"mid"|"high"|"" }

Band UI: Band dropdown appears only when group is set (affix present). Options are low · mid · high only — no empty. Clearing the group clears band; picking a group with empty band defaults to mid.

Pools (mock source): PREFIX_POOL / SUFFIX_POOL (+ sigil groups) from gui.js. Demo Mod dropdowns filter names by selected group.

Side Example groups
Prefix Kinetic Output · Targeting Lock · Combat Grade · Thermal · Cryo · Arc · Toxin · Isotopic · Fission · Plasma · Void (damage) · Plating
Suffix Life Steal · IAS · Vital · Strength · Credits / Gold Find · Guard (All Resist → all 8 energy) · Thermal…Void Resist (per channel)

Kind Editable plate fields
Gun Impact · Range · Stability · Handling · Reload · Mag/Cell · Recoil · Accuracy; cadence string RO
Melee Damage · Block · Speed · Knockback · Channel
Armor ArmorValue · KineticResist · EnergyResistBias (mock)
Phys Shield Block · Bash (mock); no Mag/Optic
Energy Shield Barrier · GuardBias (mock)
Jewelry AttributeBias · YieldBias (mock small plate)

Guns also keep Fake Mag → HUD ammo (OV38 / FS-AMMO-001).


Online Ladder may flatten / zero affix deltas for match fairness. Demo Mod still exposes affix editors for team lab; banner on mock: “Ladder zeroes affix deltas in live Ladder — Mod lab only.”


Gear bag · Crafting · Refit Install mesh · Rewrite etch costs · Bore spend · armor/weapon socket parity · weapon trackers · Unreal W_TFA_DemoMod shipping.

Jewelry/ES Artifact + Phonon Chord sandbox is in scope on the mock (see docs/superpowers/specs/2026-10-26-demo-mod-jewelry-sockets-design.md).