Skip to content

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).

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.


Shared idea for Ultimate and Skill Energy:

  1. On each kill, look at kills in the last StreakWindowSec (including this one).
  2. streakCount = kills_in_window (min 1).
  3. mult = min(StreakCap, 1 + (streakCount - 1) * StreakStep).
  4. 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).


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).


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).


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.


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.

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.


  1. 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.
  2. docs/22-demo.md + item/combat inventory note — Mod Combat economy + Attributes sections.
  3. Kanban Demo — card for Combat economy + stats dials (NEED mock → UMG); tie OmniVisor Energy/Ult seats.
  4. Mock — extend demo_mod_mock with economy + attributes panels.
  5. Architecture — short note that economy dials live under Demo Mod / TFACombat, not OmniVisor authority.

  1. Three kills inside 6 s increase Ult credit per kill (Approach A visible on readout).
  2. Energy regenerates and gains a smaller streak sip on kills.
  3. Raising raw STR increases melee ED% / knockback and reduces Heavy/2H move penalty; every kit still equippable at STR 0.
  4. Raising raw CON raises Max HP readout; DEX lowers swap ms floor.
  5. Changing a formula dial (e.g. ConHpPerPt) with raw stats held fixed changes the same readouts — both layers are editable.
  6. Raising enemy level above character level drops ChanceToHit% at fixed AR/DR; switching Difficulty to Veteran/Apex drops player effective resist.
  7. Affix totals lists each Kinetic + 8 energy Damage% and each Resist (Guard stacks into all energy resists) — not one line per affix.
  8. Mod OFF → dials unreachable; Ladder play unaffected by tuner chrome.

Final Ladder balance · merging Flow into Energy · STR gun-recoil (B) · attribute-authored bow draw ms.