Demo / Year-1 — Combat economy + character stats (lab dials)
Status: Implemented (FS + mock Lab + docs / kanban) · 2026-10-26
Scope: Arbitrary but playable defaults for Ultimate / Skill Energy / attribute feeds; Demo Mod dials; FS TBD fills.
Out of scope: Final balance pass · Ordnance charge table rewrite · Full-game economy · shipping UMG polish beyond Mod mock pattern
Authority: FS-HUD-001/007 · FS-VIT-002 · FS-CMB-004/006 · FS-PRG-002 · OmniVisor GDD vol. 15 · prior Demo Mod OV37 pattern
Locks from review:
- Streak math: Approach A — multiplier applies to each kill while inside the streak window (spree snowballs).
- STR: A + C — melee impact (ED% + knockback) and encumber soft (cuts Heavy armor / 2H move penalty). No heavy-equip threshold. No STR gun-recoil path this pass (option B deferred).
1. Three meters (do not merge)
Section titled “1. Three meters (do not merge)”| Meter | HUD seat | Role |
|---|---|---|
| Ultimate | Center-top Shiv (W_TFA_UltimateGlyph) |
Player-spent; kill-charged + light passive; streak ramp A |
| Skill / Arms Energy | Top-right (W_TFA_EnergyHotbar) |
Combat skills + tentacles spend; regen + kill sip; softer streak A |
| Kinetic Flow | Thin ring on Shiv | Combo tiers already locked (FS-CMB-004); unchanged |
Ordnance keeps its own charges (FS-PRG-006) — does not drain Skill Energy.
2. Streak math (Approach A)
Section titled “2. Streak math (Approach A)”Shared idea for Ultimate and Skill Energy:
- On each kill, look at kills in the last
StreakWindowSec(including this one). streakCount = kills_in_window(min 1).mult = min(StreakCap, 1 + (streakCount - 1) * StreakStep).- Credit for this kill =
BasePerKill * mult(then clamp to meter max).
Idle gaps > window reset streak to 1 on the next kill.
Ultimate and Energy may share one window dial or use separate windows (defaults below share 6 s).
3. Ultimate — Demo defaults
Section titled “3. Ultimate — Demo defaults”| Dial | Default | Notes |
|---|---|---|
UltBasePerKill |
8% | Solo kill credit before mult |
UltPassivePerSec |
0.4%/s | In-combat only (Demo: “in combat” = damaged or dealt damage in last 8 s) |
UltStreakWindowSec |
6 | |
UltStreakStep |
+0.25× | Per extra kill in window |
UltStreakCap |
2.5× |
Example: kills at t=0, 1.5, 3.0 s → credits ≈ 8%, then 8%×1.25=10%, then 8%×1.50=12%. Spend at 100% → flame dies then facet collapse (FS-HUD-007).
4. Skill / Arms Energy — Demo defaults
Section titled “4. Skill / Arms Energy — Demo defaults”| Dial | Default | Notes |
|---|---|---|
EnergyMax |
100 | |
EnergyRegenPerSec |
4/s | Always (or combat-gated later) |
EnergyPerKill |
6 | Sip before mult |
EnergyStreakWindowSec |
6 | |
EnergyStreakStep |
+0.2× | Softer than Ult |
EnergyStreakCap |
2.0× |
Example cast costs (placeholders until per-skill tables): Field skill 25 · tentacle verb 15–40. Defensive tentacles may restore Energy (existing FS vibe).
Pickups still accelerate fill (FS-VIT-002 / TBD-011 form).
5. Attributes — what they do
Section titled “5. Attributes — what they do”Assignable on Character I (FS-PRG-002). Points per level remain TBD-018; Demo Mod can set absolute STR…WIS for lab.
| Stat | Feeds | Demo dials (defaults) | Example 10 → 40 pts |
|---|---|---|---|
| STR | A: Melee ED% + knockback/stagger distance. C: Resist Heavy armor / 2H move-speed penalty (never blocks equip). | StrMeleeEdPerPt +1.5%/pt · StrKnockbackPerPt +2%/pt · StrEncumberResistPerPt −0.5% penalty/pt (cap resist 100% of penalty) |
Melee ED +15%→+60%; Heavy set −12% move becomes −7%→−0% as STR rises |
| DEX | AR, handling feel, weapon swap ms, light move | DexArPerPt +2 AR/pt · DexSwapMsPerPt −8 ms/pt (floor e.g. 200 ms) · DexMovePctPerPt +0.15%/pt |
Swap snappier; +1.5%→+6% move |
| CON | Max Health, trauma duration resist | ConHpPerPt +12 HP/pt · ConTraumaPctPerPt −0.4%/pt |
Base 200 +120→+480 HP |
| INT | Skill Energy max, skill CD shave | IntEnergyMaxPerPt +1/pt · IntSkillCdPctPerPt −0.3%/pt |
Energy max 110→140 |
| WIS | Aura upkeep discount, tentacle Energy cost | WisAuraUpkeepPctPerPt −0.5%/pt · WisTentCostPctPerPt −0.4%/pt |
Cheaper auras / tentacles |
Not attribute-driven: Frame cadence (RPM / charge / draw ms), Impact bands, AA baselines — stay Frame / gunfeel (FS-GUN-007/008). DEX may shave swap/equip presentation, not rewrite cadence tables.
Flow Overclocked +30% move stays Flow-only; soft-cap stack with DEX move in a later pass if needed.
Encumber baseline (Demo): Heavy armor weight class and/or 2H gun/melee apply a flat move penalty (e.g. −12% Heavy armor, −8% 2H) before STR resist. Light/Med = 0. Exact penalty dials: EncumberHeavyArmorPct, EncumberTwoHandPct.
6. Demo Mod GUI
Section titled “6. Demo Mod GUI”1080p / UE lock: Lab is dense. Ship subtabs + tab-body ScrollBox (chrome fixed — tabs + OK/Back always on screen). Do not stack Live + all Ult dials + all Energy dials (or Raw + every formula + every readout) into one non-scrolling panel. Same Mod pattern as OV37 doll edit.
New OV37-adjacent lab surface (global or per-session; not per-doll seat). Two editable layers on Attributes — both required:
| Layer | What you edit | Examples |
|---|---|---|
| 1 — Raw stats | Character instance STR / DEX / CON / INT / WIS integers (sandbox may ignore level budget / TBD-018) | Set CON = 10 → 40 and Max HP readout jumps using current formula dials |
| 2 — Formula dials | What each point does in game (the §5 per-pt / encumber baseline dials) | Raise ConHpPerPt 12 → 20; same CON 40 now yields more HP |
Derived readouts always recompute from raw × formulas (Max HP, melee ED%, knockback, encumber net move %, swap ms, Energy max, aura/tent cost discounts). Changing either layer refreshes readouts immediately.
Combat economy — subtabs (body scrolls):
- Live: Ult % · Energy · streak counts · Simulate kill / clear
- Ultimate: §3 dials only
- Energy: §4 dials only
Attributes — subtabs (body scrolls):
- Raw: five integer inputs (STR…WIS), wide range for lab (e.g. 0–100). Character level shown RO → owned by Encounter.
- Formulas: all §5 dials +
EncumberHeavyArmorPct/EncumberTwoHandPct - Readouts (RO): Max HP · melee ED% · knockback% · encumber net move · swap ms · Energy max · INT CD% · WIS discounts
- Presets optional later (Glass / Tank / Handler) — may write raw and/or formulas
Encounter / difficulty — subtabs (body scrolls). Simulates level gap + PowerΔ + hardness:
- Levels:
CharacterLevel(alvl) ·EnemyLevel(dlvl) ·RecommendedLevel(ARL) · Difficulty tier (FS-PRD-005: Operative 0 / Veteran −40 / ApexThreat −100 non-kinetic resist). Level ratio RO. Open-world default enemy = character (FS-CMP-006); lab may unpin for pinnacle / under-level. - Power: MobOffset · EffectiveDelta · OutgoingPowerMul · IncomingPowerMul (FS-DMG-009 — nearest-integer knots; soft overlevel / harsh underlevel). CtH stays alvl/dlvl-only; Difficulty stays resist-only.
- Hit: Lab AR / enemy DR → live
ChanceToHit%= clamp(200 × AR/(AR+DR) × alvl/(alvl+dlvl), 5, 95) (FS-DMG-002). - Resists: Player resist (pre-diff) · Enemy resist · Pierce → player effective resist (after difficulty drop) · enemy effective · outgoing/incoming elemental multipliers (FS-DMG-004/005). Apex hardness = player resists crater.
Full game (not Demo Lab): Difficulty tier, monster level policy, and RecommendedLevel (ARL) are area-authored — the sector / dungeon / raid owns them (FS-PRD-005 · FS-CMP-006 · FS-DMG-009). Lab Difficulty / ARL dials are sandbox overrides only; shipping play does not pick difficulty on Create Character or as a global menu that ignores the area. Spec: 2026-10-26-level-power-delta-design.md.
Affix totals — RO subtabs (body scrolls). Sum equipped doll prefixes+suffixes; not a per-affix dump:
- Damage: always Kinetic + Thermal + Cryo + Arc + Toxin + Isotopic + Fission + Plasma + Void Damage% (+ Melee/Kinetic ED%).
- Resists: Kinetic DR + each energy Resist; Guard adds to every energy resist line.
- Other: AR · Stability · IAS · Life Steal · Max Health · Credits Find.
Group × band → sandbox magnitude (FS-DMG-001). Reopen after doll edits to refresh.
Lab independence (intentional): Encounter PlayerResist / Lab AR·DR are hardness / CtH dials — they do not auto-import Affix totals. Affix totals show gear stack; Encounter simulates difficulty gap. A later pass may offer “Pull from Affix totals” if needed.
Not in mock this pass: Ult/Energy passive regen over wall-clock time (dials exist; Live sim is kill-credit only).
Same Mod gate (bDemoModEnabled); session overrides; Esc/Cancel discard; OK commit. External builds strip/hide.
Export / Import / Promote (required): Mod must dump dials and piece overrides to their own files (not one opaque blob). Schema tfa-demo-mod/v1 — tfa-lab-formulas.json · tfa-lab-economy.json · tfa-lab-raw.json · tfa-lab-encounter.json · tfa-piece-<seat>-<id>.json (+ optional manifest). Mock: demo_mod_mock.html Download / Import. Promote CLI: python promote_demo_mod.py <exports> → DT_TFA_CombatEconomy · DA_TFA_AttrFormulas · kits + DemoKitGunfeel.csv. Catalog: docs/inventory/demo-mod-export.md. UMG same schema when wired; editor import of promoted files still Need.
Authority — server owns combat numbers
Section titled “Authority — server owns combat numbers”| Phase | What happens |
|---|---|
| Lab testing (Mod ON) | Player edits dials in W_TFA_DemoMod → OK sends a request (RPC / message) to server or listen-host. Server checks Mod gate + team-only allowlist → applies session overrides on authoritative components (Ult/Energy rates, raw/formula attrs, encounter alvl/dlvl/ARL/Difficulty + PowerΔ for sim, kit affix/gunfeel fills). Clients get replicated readouts only. Prediction may show HUD; apply of damage / CtH / PowerΔ / charge / resist penalty stays server-side (FS-ARCH-013, docs/04). |
| Done testing → ship | Team exports locked numbers to split JSON (above) then promotes into cooked data (not “keep sending Mod”). Examples: DT/UDA rows for FS-CMB-007 rates · FS-PRG-002 per-pt formulas · area Difficulty + monster policy + RecommendedLevel (FS-PRD-005 / FS-CMP-006 / FS-DMG-009) · Frame/gunfeel CSV. Optional editor “Promote to data” stays team-only. Then strip/gate Mod for external — runtime no longer accepts those RPCs. |
Affix totals are derived RO on the client for lab visibility; shipping power still comes from server-evaluated item instances + data tables, never from a client-stacked summary packet.
7. Docs / FS / kanban (implement pass)
Section titled “7. Docs / FS / kanban (implement pass)”- FS — Fill Ultimate / Energy charge rates + streak A; attribute feed table (FS-PRG-002 expand); register any new TBD for pickup form if still open (TBD-011). Close or annotate missing Ultimate-rate TBD.
- docs/22-demo.md + item/combat inventory note — Mod Combat economy + Attributes sections.
- Kanban Demo — card for Combat economy + stats dials (NEED mock → UMG); tie OmniVisor Energy/Ult seats.
- Mock — extend
demo_mod_mockwith economy + attributes panels. - Architecture — short note that economy dials live under Demo Mod / TFACombat, not OmniVisor authority.
8. Acceptance
Section titled “8. Acceptance”- Three kills inside 6 s increase Ult credit per kill (Approach A visible on readout).
- Energy regenerates and gains a smaller streak sip on kills.
- Raising raw STR increases melee ED% / knockback and reduces Heavy/2H move penalty; every kit still equippable at STR 0.
- Raising raw CON raises Max HP readout; DEX lowers swap ms floor.
- Changing a formula dial (e.g.
ConHpPerPt) with raw stats held fixed changes the same readouts — both layers are editable. - Raising enemy level above character level drops
ChanceToHit%at fixed AR/DR; switching Difficulty to Veteran/Apex drops player effective resist. - Affix totals lists each Kinetic + 8 energy Damage% and each Resist (Guard stacks into all energy resists) — not one line per affix.
- Mod OFF → dials unreachable; Ladder play unaffected by tuner chrome.
Non-goals
Section titled “Non-goals”Final Ladder balance · merging Flow into Energy · STR gun-recoil (B) · attribute-authored bow draw ms.