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.
OV36 — equipped doll list
Section titled “OV36 — equipped doll list”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.
OV37 — edit (all doll seats)
Section titled “OV37 — edit (all doll seats)”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 LegendaryoriginMag: number // playtest magnitude for originId (L/U/Apex)setId: string // Unique/Apex only; empty otherwisesetPieceIndex: number // 0 when no setId; mock piece index / owned-count hint for Inspect pipsfieldSpecId1..4: string // guns + melee Rare→Apex (FS-ITM-014); empty when lockedshivSpecId: string // Unique/Apex guns + melee (FS-ITM-015); SHIV-TBD until nameplate authoredfamiliarityXp: 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.
Affix row schema
Section titled “Affix row schema”{ 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) |
Stat plate by class
Section titled “Stat plate by class”| 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).
Ladder note
Section titled “Ladder note”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.”
Out of scope (this pass)
Section titled “Out of scope (this pass)”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).