Demo fake-modular — Mag / Sight / Scope / Zoom (data only)
Authority: FS-GUN-012 · Range meters FS-GUN-011 · sockets FS-GUN-006 · Demo one-weapon Frame kits docs/22-demo.md · Field Specs demo-mod-field-specs.md · Shiv Specs demo-mod-shiv-specs.md.
Rule: Demo Mod session overrides feel only. No mesh Refit. Full-game sockets stay Year-1+.
UI: OV36 = kits on this character only → OV37 edit → OK updates OmniVisor ammo (demo_mod_mock.html, OV38).
Contract
Section titled “Contract”- Hotkey O →
W_TFA_DemoMod. Gate / strip for external. - CURRENT + INPUT (and dropdowns for enums). OK commits session; Esc/Cancel discards.
- Derived readouts: hip FalloffStart/End_m, ZoomMult, ADS FalloffStart/End_m (kinetics only).
- Never edit: Fire Mode · Cadence · AA Mag/Stick/Rot/Strafe · damage / hit auth.
MagFamily (Clip / Mag)
Section titled “MagFamily (Clip / Mag)”| MagFamily | Typical Receivers | Session feel |
|---|---|---|
| Box | Auto, Pulse, Scout, SMG, Machine Gun, Heavy, Gatling | Mag size / reload bias |
| Tube | Shotgun | Capacity / reload |
| Drum | Shotgun / MG specialty | High Mag, slower reload |
| Cylinder | Hand Cannon | Chamber count / reload |
| Cell | Fusion, Linear Fusion, Trace | Charge / beam sustain |
| Quiver | Bow, Crossbow | Draw-adjacent capacity |
Allowlist (Demo):
| Receiver | Legal MagFamily |
|---|---|
| Auto, Pulse, Scout, SMG, Machine Gun, Heavy Gun, Gatling (any) | Box, Drum |
| Shotgun | Tube, Drum, Box |
| Hand Cannon | Cylinder |
| Sidearm | Box |
| Fusion, Linear Fusion, Trace | Cell |
| Bow, Crossbow | Quiver |
| Grenade Launcher | Box (breech feed soft) |
| Rocket | Box (tube feed soft) |
| Sniper | Box |
Mod rows: MagFamily · MagSize · ReloadSpeed.
MagSize is Frame-kit-owned (Frame-band Demo): each ranged kit is Receiver × Frame (auto_adaptive, hc_aggressive, …). MagSize / reserve follow FS-GUN-009 Mag band (explicit Demo integers — not TBD-IMR-FLOAT). MagFamily change snaps MagSize to that kit’s family default; edits clamp to kit×family min/max. Legacy ids (auto, hc, …) alias the primary Frame kit. Authority: mock GUN_FRAME_ROWS / MAG_SIZE_TABLE in tfa_gdd_html/figures/demo_mod_mock_data.js.
Primary Frame defaults (sample):
| Kit id | Frame | MagSize | Reserve | MagFamily |
|---|---|---|---|---|
| auto_adaptive | Adaptive | 40 | 280 | Box |
| auto_rapid | Rapid-Fire | 52 | 364 | Box |
| pulse_rapid | Rapid-Fire | 36 | 216 | Box |
| scout_precision | Precision | 13 | 91 | Box |
| hc_adaptive | Adaptive | 11 | 88 | Cylinder |
| hc_aggressive | Aggressive | 8 | 64 | Cylinder |
| sidearm_adaptive | Adaptive | 15 | 105 | Box |
| smg_adaptive | Adaptive | 37 | 252 | Box |
| sg_aggressive | Aggressive | 5 | 15 | Tube |
| sg_rapid | Rapid-Fire | 7 | 21 | Tube |
| heavy_adaptive | Adaptive | 55 | 165 | Box |
| gl_adaptive | Adaptive | 1 | 9 | Box |
Full Frame list (40 ranged kits) lives in the mock KIT_CATALOG.ranged / RANGED_KIT_IDS.
HUD: After OK, OmniVisor AMMO in-mag count = MagSize; clip family label = MagFamily; reserve = kit reserve. Active character seat drives the readout (OV38). Mesh never changes.
OpticKind — Sight ≠ Scope
Section titled “OpticKind — Sight ≠ Scope”| OpticKind | Meaning | ZoomAdd default band |
|---|---|---|
| Sight | Iron / reflex / holo / RDS / bow sight | +0.0 … +0.3 |
| ScopeShort | Short tube / mid prism / ACOG-ish | +0.4 … +0.9 |
| ScopeLong | Long tube / sniper glass | +1.0 … +5.0 |
Receiver BaseZoom + allowlist
Section titled “Receiver BaseZoom + allowlist”| Receiver / key | BaseZoom (×) | Allowed OpticKind | OpticMin–Max (×) | Notes |
|---|---|---|---|---|
| Hand Cannon | 1.5 | Sight | 1.5–1.8 | No scopes |
| Sidearm | 1.2 | Sight | 1.2–1.5 | No scopes |
| Auto | 1.5 | Sight, ScopeShort | 1.5–2.4 | No ScopeLong |
| Rifle × Gatling | 1.5 | Sight, ScopeShort | 1.5–2.4 | Same Sight pack as Auto |
| Bow | 1.5 | Sight | 1.5–1.8 | No tube scope |
| Crossbow | 1.7 | Sight, ScopeShort | 1.7–2.6 | Has sights |
| Pulse | 1.7 | Sight, ScopeShort | 1.7–2.6 | |
| Scout | 2.0 | Sight, ScopeShort | 2.0–2.9 | No sniper tube |
| SMG | 1.25 | Sight, ScopeShort | 1.25–2.0 | Has sights |
| Shotgun | 1.2 | Sight | 1.2–1.5 | Zoom does not re-author pellet fan |
| Sniper | 4.0 | ScopeShort, ScopeLong | 4.0–9.0 | No Sight |
| Fusion | 1.5 | Sight, ScopeShort | 1.5–2.4 | Has sights |
| Linear Fusion | 2.0 | Sight, ScopeShort | 2.0–2.9 | |
| Trace | 1.5 | Sight, ScopeShort | 1.5–2.4 | |
| Machine Gun | 1.5 | Sight, ScopeShort | 1.5–2.4 | Has sights |
| Machine Gun × Gatling | 1.5 | Sight, ScopeShort | 1.5–2.4 | Same Sight pack as Machine Gun |
| Heavy Gun | — | None | — | Counterweight replaces Optic |
| Heavy Gun × Gatling | — | None | — | Counterweight replaces Optic |
| Grenade Launcher | 1.4 | Sight only | 1.4–1.7 | Arc / Velocity — no ZoomMult falloff |
| Rocket | 2.0 | Sight, ScopeShort | 2.0–2.8 | Velocity-primary (soft) |
Heavy Counterweight (no sights)
Section titled “Heavy Counterweight (no sights)”Five-pack: Barrel · Mag · Counterweight · Brace · Grip.
| Field | Meaning |
|---|---|
| CounterweightBias | Tip settle / forward-mass (session dial in Demo Mod) |
| Kickback / Stability | May bias; never AA / Zoom / cadence |
Hard reject: any OpticKind on Heavy / Heavy Gatling. Hard reject: Counterweight on Rifle or MG Gatling.
Grenade Launcher — Sight + arc fire
Section titled “Grenade Launcher — Sight + arc fire”- Fire Mode SingleShot; projectile is arc / Velocity-primary (not kinetic bullet falloff).
- OpticKind Sight only — acquisition / reticle help.
- Do not apply
ADS_FalloffStart_m = HipStart_m × ZoomMult. Treat ZoomMult = 1.0 for falloff; soft RangeStat + Velocity own engage distance. - Demo Mod: show read-only “Arc / Velocity” note; ZoomAdd hidden or N/A.
ScopeShort vs ScopeLong ZoomAdd presets (where scopes allowed)
Section titled “ScopeShort vs ScopeLong ZoomAdd presets (where scopes allowed)”| Preset | OpticKind | ZoomAdd | Typical use |
|---|---|---|---|
| Reflex / iron | Sight | 0.0 | HC, Sidearm, Shotgun, GL default |
| Holo / RDS | Sight | 0.2 | Auto / Pulse / MG / Fusion close |
| Mid prism / short tube | ScopeShort | 0.6 | Auto / Scout / Rifle Gatling mid |
| ACOG-ish | ScopeShort | 0.9 | Pulse / Scout top short |
| Combat scope | ScopeLong | 1.5 | Sniper short-long |
| Marksman long | ScopeLong | 3.0 | Sniper mid-long |
| Anti-materiel glass | ScopeLong | 5.0 | Sniper max |
ADS formula (kinetics with Optic)
Section titled “ADS formula (kinetics with Optic)”EffectiveStat = clamp(RangeStat + BarrelRangeDelta, 0, 100)HipStart_m, HipEnd_m = ReceiverCurve(EffectiveStat) // FS-GUN-011ZoomMult = clamp(BaseZoom + ZoomAdd, OpticMin, OpticMax)ADS_FalloffStart_m = HipStart_m × ZoomMultADS_FalloffEnd_m = HipEnd_m × ZoomMultExceptions: GL = no ZoomMult falloff. Heavy / Heavy Gatling = no Optic (Counterweight). Year-1 Zoom does not rewrite AA.
TrueFPP ADS — weapon FOV + optic aim (FS-GUN-013)
Section titled “TrueFPP ADS — weapon FOV + optic aim (FS-GUN-013)”Sight / ScopeShort / ScopeLong drive TrueFPP weapon ADS: gameplay camera FOV from ZoomMult + gun raise / optic presentation (TrueFPP weapon ADS feel). OmniVisor is chrome around ADS — not the zoom authority. HUD-only digital zoom without weapon / optic aim is retired.
| OpticKind | Local ADS presentation |
|---|---|
| Sight | Mild FOV; iron / reflex / holo / RDS on the gun |
| ScopeShort | Mid FOV; look-through short tube / prism / ACOG-style |
| ScopeLong | Heavy FOV; look-through long-tube / sniper glass (optic socket / overlay allowed) |
Watching another player ADS: remotes see that pawn’s TPP ADS / cheek-weld pose. They do not share the local ADS FOV or look-through optic view.
Demo Mod field order (append) — on OV37 after weapon select
Section titled “Demo Mod field order (append) — on OV37 after weapon select”After OV36 Enter weapon:
- Range: RangeStat · BarrelRangeDelta · Hip Start/End_m (read-only)
- Fake Mag: MagFamily · MagSize · ReloadSpeed
- Fake Optic or Counterweight (Heavy): OpticKind · ZoomAdd · ZoomMult · ADS meters — or CounterweightBias
- GL: Sight + arc/Velocity read-only
Footer: Back · OK · Cancel. Mesh never changes.
Worked examples
Section titled “Worked examples”- Auto Adaptive RangeStat 50 → hip Start ≈ 19.2 m; ScopeShort +0.6 → ZoomMult 2.1 → ADS ≈ 40.3 m.
- Rifle Gatling uses Auto Sight pack. MG Gatling uses MG Sight pack.
- Heavy Gun: no Sight; CounterweightBias only.
- GL Sight: hip meters for soft RangeStat only; ADS falloff multiplier = 1.0.