Terra Firma: Awakening — Functional Specification
Engine: Unreal Engine 5
Status: Engineering contract for Year 1 implementation
Companion locks: GDD (design truth) · Terra_Firma_FrontEnd_UI_UX_Spec.md (boot / menu / Command Deck)
Architecture map: Architecture Map
Does not replace: GDD catalogs (named bases, affix bible, Phonon recipes, Unique spreadsheet)
This document translates locked GDD systems into implementable Unreal Engine 5 requirements: actors, components, data, input, replication, and acceptance tests. Numeric bands that the GDD marks TBD stay TBD here. Pipeline shape, hard locks, and ownership of stats are not TBD.
0. Document contract
Section titled “0. Document contract”0.1 What this is
Section titled “0.1 What this is”A functional specification for the playable game: what the engine must do, who owns the data, and how a build is accepted. Every requirement is written so a programmer can implement it without inventing a second design.
0.2 Source-of-truth stack
Section titled “0.2 Source-of-truth stack”| Layer | Owns | File / volume |
|---|---|---|
| Product / FE flow | Boot, Solo vs Online pools, EOS, Command Deck, Tab Local / World maps, GUI locator, Esc | Terra_Firma_FrontEnd_UI_UX_Spec.md |
| Design | Fantasy, catalogs, formulas, figures | Master GDD + HTML reader tfa_gdd_html/ |
| This spec | Runtime behavior, UE5 mapping, acceptance | This file. Player economy: FS-PRD-007 + §16b FS-ECO |
| Balance sheets | Impact / Mag / Range bands, WSM, socket counts, XP curve | Separate data. Cadence numbers locked here (FS-GUN-007); Fire Mode + AA baseline on Receiver (FS-GUN-008) |
| Worldbuilding | Earth fiction, OmniVisor name, Spiritus Sight rarity | Terra_Firma_Earth_Worldbuilding.md |
Conflict rule: later volume lock wins over older GDD wording. Vol. 15 wins on HUD names (Field / Specialist / Siege). Vol. 16 + Character I win on attributes (STR / DEX / CON / INT / WIS; Energy is a pool). FE spec wins on Solo / Online save pools.
0.3 Requirement IDs
Section titled “0.3 Requirement IDs”FS-<SYS>-<nnn> — functional shall.
AC-<SYS>-<nnn> — acceptance check.
TBD-<nnn> — open lock that must not be invented in code (expose as data).
0.4 Recommended UE5 stack
Section titled “0.4 Recommended UE5 stack”Start from Lyra (CommonUI, Enhanced Input, modular experience, EOS hooks). Do not start a blank FPS template and re-derive menus.
| Need | UE5 system |
|---|---|
| Skills, Ultimates, auras, tentacles, grenades, procs | Gameplay Ability System (GAS) + Gameplay Effects + Gameplay Cues |
| Stance, channels, quality, vision, difficulty | Gameplay Tags |
| Tap / hold 1–7, double-tap dodge, contextual vault | Enhanced Input (chord + hold + tap-hold) |
| Front-end, Character I, Command Deck | CommonUI (UCommonActivatableWidget, UPrimaryGameLayout) |
| Online identity | Epic Online Services (EOS) |
| Item / frame / affix / gem tables | Primary Data Assets + Data Tables (not Blueprint-only bags) |
| Modular guns / melee | Actor Components + skeletal sockets; Niagara attach on frame sockets |
| Vision overlays | Post-process materials + custom stencil / custom depth |
| FPP ↔ TPP | Custom APlayerCameraManager + spring-arm TPP + view-target blend |
| Melee Drive | Motion Warping + root-motion windows; no homing magnet |
| Replication | Server-authoritative combat and inventory on Online; local authority on Solo |
1. Product scope
Section titled “1. Product scope”FS-PRD-001 — Game identity
Section titled “FS-PRD-001 — Game identity”Terra Firma: Awakening is a sci-fi action RPG: seamless first-person gun combat and third-person melee, ARPG item depth, procedural story dungeons, biomechanical tentacle progression, anti-FOMO cosmetics, Solo and Online integrity, Year 1 on Earth.
FS-PRD-002 — Realms vs rulesets
Section titled “FS-PRD-002 — Realms vs rulesets”Two orthogonal axes. Do not collapse them.
| Axis | Values | Owner |
|---|---|---|
| Realm | Solo Local · Online | FE spec. Separate character pools. Never transfer. |
| Ruleset | Story · Progressive Multiplayer · Competitive Ladder | Combat / loot. Same gunfeel baseline. Different Crit % and gear normalization. |
- Solo realm always runs Story ruleset.
- Online realm can run Story campaign, Progressive MP, Ladder, Raids (2 / 4 / 8), and special coop Vaults.
- Solo endgame uses authored SOLO OPS dungeons (Biolab Purge, Grid Collapse, System Purge, Core Collapse). No Raid. No special coop.
FS-PRD-003 — Year 1 playable race
Section titled “FS-PRD-003 — Year 1 playable race”Human only. Race is read-only on Create Character. Later years unlock races on that same screen.
FS-PRD-004 — Identity at create
Section titled “FS-PRD-004 — Identity at create”Order → Faction. Faction is derived from Order (not a free picker). Subclass is not chosen on Create Character. The Create Character widget (FE17) has no subclass control. Confirm writes the main class only (Enforcer / Arcwarden / Phantom). Subclasses are not a starting loadout; they open one after another as that class levels, in roster order (T1 then T2 then T3 then T4 then T5). Unlock levels live in data: TBD-029. Do not invent those levels in code.
| Order | Faction (main class) | Subclass unlock order |
|---|---|---|
| Fist | Enforcer | Berserker → Vanguard → Shock Trooper → Battle Master → Seraph |
| Magus | Arcwarden | Pyrocaster → Torrentcaller → Zypher → Cyromancer → Stormbringer |
| Hidden | Phantom | Infiltrator → Specialist → Wraith → Shadow → Ghost |
No class-specific item bases or paper-doll slots. All weapon and armor families are universal.
FS-PRD-005 — Difficulty tiers (resist penalty)
Section titled “FS-PRD-005 — Difficulty tiers (resist penalty)”| ID | Fiction | Non-kinetic resist penalty |
|---|---|---|
Difficulty.Operative |
Normal | 0 |
Difficulty.Veteran |
Nightmare | −40 |
Difficulty.ApexThreat |
Hell | −100; immunities common |
Authority (Full game): Difficulty tier is area-authored — same spirit as monster level (FS-CMP-006) and Recommended Level (ARL) for PowerΔ (FS-DMG-009). The space / sector / dungeon / raid row owns the active Difficulty.* tag and RecommendedLevel. It is not chosen on Create Character and not a global player preference that overrides the world.
Entering an area applies that area’s difficulty (resist penalty on non-kinetic channels — FS-DMG-005 step 3) and that area’s ARL for Level Power Delta. Leaving / transitioning updates to the destination area’s tier and ARL. Exact area→tier / ARL table rows and any override spaces (e.g. pinnacle): TBD-001 (data fill — model is locked).
Demo Mod Encounter / difficulty may dial the tier and ARL session-wide for lab sims only — does not change Full-game area authorship. Design: docs/superpowers/specs/2026-10-26-demo-combat-economy-stats-design.md · docs/superpowers/specs/2026-10-26-level-power-delta-design.md.
FS-PRD-006 — Anti-FOMO
Section titled “FS-PRD-006 — Anti-FOMO”Marketplace sells looks only (shaders, titles, hangar liveries). Seasons never vault. Power crafting is grind-honest, not shop-gated. Marketplace spend is LUMENAR (from BTUCOIN convert only; cash packs mint BTUCOIN 51/49 and do not grant LUMENAR). Play-earned Credits are for in-world vendors only — they do not buy Marketplace. Crowdfunding (CF) exclusives and Founding Club in-game rewards are the same rule: three stackable layers — Material (surface), Armor FX (overlay), Body prop (silhouette — wings, mantle, trails, shoulder pips) — plus titles, emotes, hangar / nameplate / VISION-chip chrome, weapon wraps, club tags / ranks / decals — looks only, never power (FS-ECO-012, GDD founding-clubs-cf-cosmetics). Materials / FX / props must not change light/heavy plate size or underarmor joint scale; body props grant no flight or glide. See FE spec §11 and FS-PRD-007 / FS-ECO.
FS-PRD-007 — Credits, BTUCOIN, and LUMENAR (locked)
Section titled “FS-PRD-007 — Credits, BTUCOIN, and LUMENAR (locked)”Three player-facing ledgers:
| Ledger | What | Spends on |
|---|---|---|
| Credits | Soft in-world currency, account-shared (EOS PUID Online · local profile Solo) | In-game vendors / world NPC transactions only — every character on the account spends/earns the same pool |
| BTUCOIN | Crypto ledger (was “Currency”). Player 49% of every mint on the EOS PUID | Convert → LUMENAR on Marketplace Wallet only. Never marketplace tender. Never vendor spend |
| LUMENAR | Soft marketplace currency — not crypto | Storefront + player listings (looks only) |
Character I title bar (W_TFA_IWallet): CREDITS chip · gap ≥ 16 px · BTUCOIN chip · gap · X. Two chips only — LUMENAR lives on Marketplace Wallet, not the I bar. Not bag tiles. Not a second pair on the Inventory header. Not the menu roll W_TFA_Credits.
Play grants Credits from stashes / caches, monster kills, boss kills, side missions, and milestones. Amounts: TBD-037. Credits Find affixes modify play grants only.
Play also mints BTUCOIN from daily tasks, weekly tasks, and hard objectives. Online pool only — they do not exist on Solo. They live with other game objectives: world markers and the Missions & Objects / Operations drawer on every Tab map (Local Map and World Map). Filter Tasks. Set as Primary tracks them. Grant tables are fiat (V) (TBD-039); mint (M = V / P) at settlement so BTUCOIN falls when market is above floor and LUMENAR stays flat on convert. Every BTUCOIN mint (play or fiat path) splits 51 / 49 — studio treasury / player. See FS-ECO-004 / FS-ECO-005 / FS-ECO-008 / FS-CMP-009.
Acquire LUMENAR: convert any portion of player 49% BTUCOIN → LUMENAR on Marketplace Wallet (FS-ECO-006) only. Irreversible. Rates: TBD-036. Cash / fiat Marketplace SKUs do not grant LUMENAR — they mint BTUCOIN at 51/49 (FS-ECO-003); the buyer converts to spend.
Of every BTUCOIN mint:
| Share | Owner |
|---|---|
| 51% | Studio treasury. Never the player wallet. |
| 49% | Player BTUCOINBalance (CryptoBalance) on that EOS PUID |
BTUCOIN display name is locked: BTUCOIN (TBD-034 closed). Price floor: TBD-035. Settlement (P) = max(floor, market). Play grants and cash mints size BTUCOIN as fiat value (V) / (P) so when market is above floor, fewer BTUCOIN mint; convert uses the same (P) so LUMENAR out stays flat for that (V). BTUCOIN does not buy SKUs or listings directly — convert to LUMENAR first. Credits do not buy Marketplace.
Year 1 is a studio ledger plus an external market-price feed. Do not invent an on-chain client. Runtime, widgets, replication, and acceptance: §16b FS-ECO. Chrome: FE spec §11.
2. Unreal architecture
Section titled “2. Unreal architecture”Architecture map (separate page): plugins · modules · classes · client/server · hit auth · threads — see Architecture Map.
2.1 Recommended module map
Section titled “2.1 Recommended module map”This table is the logical ownership map (class prefixes, tags, data). Physical packing is Lyra Game Feature Plugins — see §2.5. Do not fork LyraGame into UBT modules named TFACombat / TFAUI. Keep LyraGame as the host (experiences, pawn data, CommonUI layout, EOS hooks).
| Module | Responsibility | GFP packing (§2.5) |
|---|---|---|
TFA |
Game instance, experience definition, subsystem registry | Host LyraGame + TFACore / TFAMaps experiences |
TFACore |
Tags, channels, stance enums, shared types | TFACore |
TFACombat |
Camera engine, stance, vitality, shared combat ASC host, damage pipeline spine | TFACombat (thin) |
TFAMelee |
Melee Drive / freeflow verbs | TFAMelee (Plugify) |
TFASingularity |
Kinetic Flow meter + Singularity climax | TFASingularity (Plugify) |
TFAInventory |
15-slot doll, bags, sockets, artifacts, salvage, Credit chip on Inventory | TFACharacterI Runtime (split TFAInventory GFP only if C++ outgrows UI) |
TFAEconomy |
Credits grants, BTUCOIN ledger, LUMENAR ledger, cash→LUMENAR, convert BTUCOIN→LUMENAR | TFAEconomy |
TFAProgression |
XP, stats, trees, Customizable 4×4, tentacle sets | TFAProgression |
TFAWeapons |
Frames, parts, gunfeel, Firehand Bus, melee families | TFAWeapons |
TFAUI |
OmniVisor, Character I, Command Deck, Social (FE widgets may live here or in Frontend) | TFAOmniVisor + TFACharacterI + TFAFrontend |
TFAFrontend |
Intro, menu, mode, EOS, character select (FE spec §13) | TFAFrontend |
TFAWorld |
Vision volumes, vault/wall tags, encounter director, mission flags | TFAWorld + TFAVision |
TFAAI |
AI substrate: Logic Driver Pro host, fuzzy membership, Squad + Agent runners, difficulty profile DAs. Product brains (MP bots / monster packs / patrol) are separate LD asset families on this GFP | TFAAI |
TFAOnline |
EOS session, Connect Discord identity (FS-ID), server inventory, raid matchmaking, Ladder normalization, clan / fireteam / Discord invite tokens, Match Results snapshot + LastMatchRecap | TFAOnline |
2.2 Core classes (Lyra-shaped)
Section titled “2.2 Core classes (Lyra-shaped)”| Class | Role |
|---|---|
ATFAGameMode / ATFAGameState |
Ruleset, difficulty, match phase |
ATFAPlayerState |
Level, XP, stats, trees, loadout, realm pool ID |
ATFACharacter |
Movement, stance, mesh (FPP arms + TPP body), GAS avatar |
ATFAPlayerController |
Enhanced Input, camera requests, UI router |
UTFAAbilitySystemComponent |
Skills, auras, tentacles, Ultimate, grenades, Flow GEs |
UTFACameraDirector |
FPP / TPP / Shift-Out / takedown |
UTFALoadoutComponent |
Slots W1–W4, Wrist, Phys Shield, stance machine |
UTFAVitalityComponent |
Shield / Armor / Health + incoming pipeline |
UTFAVisionComponent |
Seven modes, one active |
UTFAInventoryComponent |
Bags + equipped 15 |
UTFACreditWalletComponent |
Per-character Credits. I title-bar chip. Vendors only — not Marketplace |
UTFACryptoLedger |
EOS-account BTUCOIN (player 49% share of every mint, including FS-ECO-008). Studio treasury is not this component |
UTFALumenarLedger |
EOS-account LUMENAR (marketplace soft currency). Cash grants + BTUCOIN convert. Storefront / listings debit |
UTFACraftingSubsystem |
Station-only recipes |
UTFAObjectiveSubsystem |
Active missions, sector objects, one Primary; drives GUI locator (pip + heading tape + tracker blip) |
ATFAAIController |
AI pawn controller; hosts Logic Driver Agent runner, perception / nav bridge (FS-AI-001) |
UTFAAISquadCoordinator |
One Squad / Team Logic Driver instance per team, pack, or patrol cell (FS-AI-003) |
UTFAFirehandBus |
Active weapon → reticle family, bloom, mag, brick |
2.3 Gameplay Tag taxonomy (locked roots)
Section titled “2.3 Gameplay Tag taxonomy (locked roots)”TFA.Stance.SoloGunTFA.Stance.SoloMeleeTFA.Stance.WristMeleeTFA.Stance.DualGunTFA.Stance.DualMeleeTFA.Stance.GunPhysShieldTFA.Stance.MeleePhysShieldTFA.Stance.HybridTFA.Stance.TwoHand
TFA.Channel.KineticTFA.Channel.ThermalTFA.Channel.CryoTFA.Channel.ArcTFA.Channel.ToxinTFA.Channel.IsotopicTFA.Channel.FissionTFA.Channel.PlasmaTFA.Channel.Void
TFA.Ammo.FieldTFA.Ammo.SpecialistTFA.Ammo.Siege
TFA.Vision.NormalTFA.Vision.InfraredTFA.Vision.HeatTFA.Vision.UltravioletTFA.Vision.SonarTFA.Vision.MotionTraceTFA.Vision.AetherSight
TFA.Quality.CommonTFA.Quality.UncommonTFA.Quality.AugmentedTFA.Quality.RareTFA.Quality.LegendaryTFA.Quality.UniqueTFA.Quality.Apex
TFA.Ruleset.StoryTFA.Ruleset.ProgressiveTFA.Ruleset.Ladder
TFA.Realm.SoloTFA.Realm.Online
TFA.Flow.Tier1TFA.Flow.OverclockedTFA.Flow.SingularityDo not add TFA.Channel.Anomalous or TFA.Channel.Magic. Removed.
2.4 Replication authority
Section titled “2.4 Replication authority”Same C++ for Solo and Online. Solo = listen / local authority (no dedicated process). Online = dedicated or listen server is the only writer of power. Do not ship a second Solo path that skips validation.
| Domain | Solo | Online |
|---|---|---|
| Movement, camera, local HUD | Client | Client predict; server reconcile pose |
| Damage, Flow, death, loot rolls | Local (same writers as Online) | Server |
| Inventory, sockets, craft, dismantle | Local save | Server; fail closed |
| Character create / delete / reset | Local pool | Server pool |
| Marketplace listings | Locked | Server |
| Marketplace owned cosmetics | Local unlock after EOS buy | Server + local cache |
| Credits | Local save | Server; fail closed |
| BTUCOIN ledger (player 49%) | N/A without EOS | Server on PUID; fail closed |
| LUMENAR ledger | Local unlock cache after EOS buy | Server on PUID; fail closed |
| Vision unlock + actor relevancy | Local | Server; overlay is client (TBD-028) |
| Chat send / flood | Local | Server RPC + rate limit (TBD-033) |
| Fireteam join, clan rank, invite consume | N/A or local stub | Server |
| Player report / Trust spectate / kick / ban | N/A | Server (FS-TRS). Discord webhook is worker-only. |
Server-authoritative (never trust the client packet as truth)
Section titled “Server-authoritative (never trust the client packet as truth)”Damage, hits, TTK, Flow, death, loot rolls. Mag / brick / Energy spend, ability commit, grenade spawn. Inventory add/remove, sockets, salvage, Apex Invoke, dismantle. Credits grants, LUMENAR cash grants, BTUCOIN mint 51/49, convert BTUCOIN→LUMENAR, LUMENAR spend. CF / Founding Club EntitlementFlags upsert and presentation unlocks (FS-ECO-012) — looks only; never Combat power. XP, Commit stats, tree nodes, subclass unlock. Mission complete, Primary objective, raid rewards. Character create/delete/reset, pool membership. Fireteam join policy, clan ranks, invite consume. Vision unlock and which actors exist in relevancy — do not send hidden hostiles the visor must not reveal (TBD-028).
Client RPCs are requests. The server simulates, validates against data tables, then replicates. There is no client “grant class” RPC that skips server Apex Invoke tables (TBD-030). Economy and Invoke fail closed.
Client-allowed (prediction / presentation; server reconciles)
Section titled “Client-allowed (prediction / presentation; server reconciles)”Camera, anim, recoil/bloom, ADS feel, stance mesh. OmniVisor chrome; chat compose (send is RPC). Character I layout; bag filter/sort of a replicated snapshot. Vision overlay materials for modes the server says are active. Frontend widgets, Game Settings, local Solo save file I/O. Audio, Niagara, cosmetics already owned.
Anti-cheat notes
Section titled “Anti-cheat notes”- Portable home: economy/marketplace fraud, statistical signal ingest, and case-log store hooks live in the MonetaryPlatform plugin’s public AntiCheat module (
UAntiCheatSubsystem). Lyra / TFACore enable that plugin and call the API without TFAEconomy (money adapter only). - Not in MonetaryPlatform: cheap Game Thread hit-auth (rewind / cadence / LOS) stays in TFACombat / TFAWeapons (FS-ARCH-013).
- HUD numbers (Credits, BTUCOIN, LUMENAR, ammo) can be spoofed locally. Persisted values change only after server ack.
- Speed / fly: Character Movement Component + server correction. Custom TFA move modes are simulated on the server (FS-MOV-005).
- ESP: relevancy + visor fog. Client stencil / post-process is not a data source.
- Discord AccessToken is never written to disk (FS-ID). EOS PUID is the identity.
- Player-facing Trust UI (report sheet, Trust overlay, ghost spectate chrome) and Discord pager: FS-TRS-001–FS-TRS-006. Those surfaces stay game-side; they submit into the platform case/signal API. Never on the Game Thread hit path.
FS-ARCH-013 — Hybrid hit auth (feel vs security)
Section titled “FS-ARCH-013 — Hybrid hit auth (feel vs security)”Terra Firma is an ultra-lethal FPS + melee hybrid (FS-CMB-001). TTK is one to three connects. A legit shot or Melee Drive that the server later rejects feels like the gun/melee is broken. Waiting a full RTT before muzzle flash, impact, or lunge connect is also broken. Balance: instant presentation, fast geometric auth, expensive cheat analysis off the hot path.
| Layer | Owns | Budget |
|---|---|---|
| Presentation | Client | Same frame as fire / strike: tracer, muzzle, melee trail, hit mark, impact FX. Predicted. |
| Power | Server | HP, death, Flow, loot, mag/brick/Energy. Never from the client packet alone. |
| Shot / strike request | Client → server RPC | Origin, aim/facing, timestamp, weapon/stance id. Not damage numbers. |
| Auth | Server Game Thread | Rewind target pose to shot time, cheap trace / melee capsule, LOS, cadence, mag. |
| Heuristics | Worker, then marshal into MonetaryPlatform AntiCheat | Aimbot / snap stats, replay, economy fraud signals. Must not delay the damage GE. |
Hitscan (Precision Fire): Client fires immediately. Server lag-compensates: rewind the victim to the shooter’s timestamp, line-trace, apply pipeline (FS-DMG-003). If auth fails, HP does not change; predicted hit marks / tracers may ghost-cancel.
Projectiles (SKG wrap in TFAWeapons): Client may predict a local projectile. Server-spawned projectile owns overlap. Do not let the client spawn a damaging actor.
Melee Drive (FS-CMB-002): Client plays the lunge immediately. Server validates inside the authored notify window against a reach capsule vs rewind pose. No magnet. Whiff on server is a miss (Flow reset rules still server).
Security that stays cheap (every shot / tick):
- Rate-limit requests to locked cadence (FS-GUN-007) plus a small jitter. Drop extras; do not queue a backlog.
- Reject impossible origin (not near replicated pawn), fire without mag/Energy, strike outside the melee window, traces through world without LOS.
- Prefer false accept of a geometrically plausible connect inside the rewind window over false reject of a real connect. TTK is too short to be stingy on rewind.
- Prefer hard reject of impossible packets over waiting for a second factor. Do not round-trip EOS, Discord, or HTTP to confirm a hit.
Security that is allowed to be slow: statistical anti-cheat, demo/replay, report / case pipeline via MonetaryPlatform AntiCheat. Those never sit on the Game Thread hit path (FS-ARCH-012).
Rewind window (max ms of pose history): TBD-041. Past that window the shot misses rather than killing through teleport. PvP uses the same path as PvE (FS-DMG-007 scalars stay data); do not add a second “slow secure” combat.
2.5 Game Feature Plugin map
Section titled “2.5 Game Feature Plugin map”Host project: Lyra 5.8 (demo5.8) plus marketplace SKGShooterFramework and AimAssistSystem. TFA packing uses Lyra’s existing plugin system:
- Always-on engine plugins (not Game Features):
CommonGame,CommonUser,GameSettings,UIExtension,GameplayMessageRouter,ModularGameplayActors,AsyncMixin, loading screens. - Game Feature Plugins under
Plugins/GameFeatures/,ExplicitlyLoaded, activated byULyraExperienceDefinition::GameFeaturesToEnableplusUGameFeatureAction(add components, widgets, abilities). - Content-only GFPs (maps / experiences) vs Runtime GFPs (code).
FS-ARCH-010 — GFP ownership
Section titled “FS-ARCH-010 — GFP ownership”Each TFA GFP is Plugins/GameFeatures/<Name>/<Name>.uplugin, Runtime module <Name>Runtime except TFAMaps (content-only). ExplicitlyLoaded: true, CanContainContent: true. Default Registered. Only TFACore and existing ADDON are Active at boot. Experiences enable the rest.
FS-ARCH-011 — Do not rip vendor / host
Section titled “FS-ARCH-011 — Do not rip vendor / host”| Keep | Why |
|---|---|
LyraGame / LyraEditor |
Experiences, pawn data, CommonUI layout, EOS hooks |
| ShooterCore / Explorer / Maps / Tests / TopDownArena | Reference until TFA experiences replace them |
| SKG + Aim Assist | Gun mesh, attachments, ballistics — wrap, do not rewrite |
| ADDON | SKG-on-Lyra glue only (ATerraFirmaCharacter, SKG components). Do not put inventory, HUD, economy, or GAS combat into ADDON — those systems live in their GFPs (TFAOmniVisor ships the HUD; Demo uses placeholder chrome until final art) |
New TFA systems do not go into ADDON. ADDON may depend on TFACore later.
| GFP | FS owners | Ships | Notes |
|---|---|---|---|
| TFACore | §2 tags/types | P0 | Shared tags, message structs, pawn data refs. No GAS combat. Boot Active contracts. |
| TFAFrontend | FE spec, FS-SES, FS-ID, FS-MCH chrome, FS-CAR chrome | P0 then P9 | Plugify — Intro, mode, create/select, Command Deck, settings, Results / Career / Triumphs / Ladder chrome. CommonUI only. |
| TFAOnline | FS-ID, FS-SES Online, P9 social, FS-MCH recap, FS-CAR rollups | P0 then P9 | Plugify — EOS Connect, Discord, fireteam/clan/invites, Match Results / History / career rollups. No combat. |
| TFATrust | FS-TRS | P9b | Plugify — Report / Trust overlay / ghost chrome. Cases in MonetaryPlatform AntiCheat; this GFP submits/displays. Depends Online + Frontend + MonetaryPlatform. |
| TFACombat | §4–5, §8–9 camera, input extras, movement modes, stance, vitality, shared combat ASC host | P1–P2 | Thin spine GFP. Components via Game Feature Actions. Does not own Melee Drive or Singularity implementations (those are sibling GFPs). |
| TFAMelee | FS-CMB-002 Melee Drive / freeflow verbs | P2 | Plugify — swappable melee. Publishes hit/kill messages via TFACore; no #include of TFAWeapons / TFASingularity. |
| TFASingularity | FS-CMB-004/005 Kinetic Flow + Singularity climax | P2 | Plugify — swappable climax. Subscribes to kill/Flow credit messages; Ultimate stays separate (FS-CMB-006). |
| TFAWeapons | Gun frames, Firehand Bus, SKG adaptors | P3 | Plugify — swappable guns. Calls SKG; cadence from data (FS-GUN-007). Publishes kill credit messages; no hard Singularity call. |
| TFAModular | Fake-modular / parts dials (FS-GUN-012) | P3+ | Optional split from TFAWeapons when modular Refit is a product surface; Demo may keep dials under TFAWeapons until then. |
| TFAOmniVisor | HUD, chat OV29/31/32, FE30 locator | P1 | Plugify — swappable in-game GUI. UIExtension into Lyra HUD host; message contracts only. |
| TFACharacterI | Character I, inspect, invoke presentation, inventory C++ until a split | P4 | Plugify — widgets; mutations via inventory/economy RPCs. |
| TFAProgression | XP, trees, 4×4, tentacles, ordnance | P5 | Plugify — GAS abilities granted from data. |
| TFACrafting | Crafting station | P6 | Plugify — server recipes only. |
| TFAEconomy | FS-ECO, Credits, BTUCOIN 51/49, LUMENAR, CF / Founding Club entitlement routes | P4b | Plugify — TFA money adapter only (enables MonetaryPlatform, grants, I chips, marketplace routes, entitlement-flag apply). Does not gate AntiCheat. No HUD widgets. Cosmetics presentation is Character I / Frontend / OmniVisor — never Combat power. |
| MonetaryPlatform | Ledgers · Marketplace Wallet · AntiCheat case store · EntitlementFlags | P4b prep | Portable .uplugin (not a GFP) — Plugify money product; omit/swap without forking TFA* gameplay. |
| TFAVision | Vision modes | P7 | Plugify — PP/stencil client; unlock + fog-of-war server (TBD-028). |
| TFAWorld | Objectives, missions, map drawers | P7–P8 | Plugify — encounter director, mission flags. Last match row is a drawer chip (FS-MCH-003), not a mission. Enables TFAAI. |
| TFAAI | FS-WLD-001, FS-AI-* | P7–P8 (Demo C earlier) | Plugify — Logic Driver Pro substrate; depends on TFACore. Does not own damage / gunfeel. |
| TFAMaps | Content-only like ShooterMaps | P0 hub then P8 | Plugify content GFP — Experiences list GameFeaturesToEnable. |
Dependency rule: downward only. UI GFPs talk to gameplay through Gameplay Message Router + interfaces on TFACore, not by including Combat headers.
Plugify (shall): Every major product surface ships as its own plug so an Experience can omit or replace it without editing LyraGame or sibling source. Complete set: ADDON (glue) · TFACore · TFAFrontend · TFAOmniVisor · TFACombat (spine) · TFAMelee · TFASingularity · TFAWeapons · TFAModular (optional) · TFACharacterI · TFAProgression · TFACrafting · TFAEconomy · TFATrust · TFAVision · TFAWorld · TFAAI · TFAOnline · TFAMaps · plus portable MonetaryPlatform (ledgers / AntiCheat / EntitlementFlags — not a GFP). Sibling GFPs shall not hard-include each other — only TFACore contracts + messages. Catalog MASTER: Programming Bible 02-gfp-cookbook.md Plugify lock · 02b-plugin-dependencies.md.
Phase mapping: P0 = Core + Frontend + Online + Maps hub. P1 = Combat spine (camera/move/stance) + OmniVisor. P2 = TFAMelee + TFASingularity (Flow/GAS climax). P3 = Weapons (+ optional TFAModular). P4 = CharacterI. P4b = Economy. P5–P9 as §21. TFAAI enables with world / encounter / bot-fill Experiences (P7–P8; Demo sandbox C may pull earlier for team prove).
2.6 Thread affinity
Section titled “2.6 Thread affinity”Unreal has one Game Thread that may mutate UObject / AActor. There is no second game thread. Workers exist (Task Graph, thread pool, loading, audio, RHI). Non-mission-critical work may run off the Game Thread if it uses a snapshot or an engine-async API and marshals results back (AsyncTask(ENamedThreads::GameThread, …)). Lyra AsyncMixin already covers async asset loads.
FS-ARCH-012 — Thread rules
Section titled “FS-ARCH-012 — Thread rules”Must stay on Game Thread: GAS activate / Gameplay Effect apply; movement / physics writes; replication; RPCs; inventory / economy / progression mutations; widget tree construct / tick that touches gameplay objects; spawning actors; changing collision.
Safe off Game Thread, then apply on Game Thread: EOS / HTTP, Discord OAuth, marketplace catalog, price feed; save serialize / compress; JSON parse; chat log disk, analytics, crash, screenshots, benchmark; inventory search on a copied array; procedural layout with a seed (commit actors on Game Thread); asset async load; engine systems already threaded (audio, Niagara, streaming, nav build).
Never apply Gameplay Effects, call an RPC, or write actor components from a worker.
Hit authentication (FS-ARCH-013) stays on the Game Thread and must stay a cheap rewind + trace / capsule. Do not move per-shot auth onto a worker “to be safer.”
FS-ARCH-014 — Tick discipline (Lyra 5.8)
Section titled “FS-ARCH-014 — Tick discipline (Lyra 5.8)”Lyra host practice (verified ALyraCharacter / ULyraHealthComponent on Engine 5.8): default PrimaryActorTick.bCanEverTick = false and bStartWithTickEnabled = false (same for components). Prefer no Tick. Power and world truth are server-owned; clients predict presentation and reconcile (FS-ARCH-013).
| Prefer | Avoid |
|---|---|
| Events / delegates / Gameplay Messages / Anim Notifies | Per-frame polls for “did X happen?” |
FTimerManager / GAS ability timers for delays & intervals |
Empty or low-value Tick / TickComponent on every pawn |
| GAS tags · attributes · GE durations | Client Tick that applies damage, Flow, loot, economy, inventory |
| CMC + Enhanced Input + Ability activation | Ambient magnet / AimAssist / target search every Tick (Demo: melee magnet forbidden) |
Server-only Tick only if proven needed (enable in BeginPlay when HasAuthority(), never in CDO ctor by Role) |
Enabling Tick on all clients “because the server needs it” |
| Replicate state; clients react | Client Tick that invents authority |
Shall:
- New TFA Actors / Components ship with Tick off unless a written note justifies every-frame work.
- Gameplay-changing logic runs under
HasAuthority()(or GASServerOnly/ server validate path). Clients may Tick presentation only (camera feel, local VFX bookkeeping) — never HP / Flow / mag / loot / Credits. - If server-only Tick is required: leave
bCanEverTickfalse in the constructor;SetActorTickEnabled(true)/SetComponentTickEnabled(true)inBeginPlaywhenHasAuthority(). Role is not reliable on the CDO. - Prefer Timer or event over Tick Interval “polls” for cooldowns, windows, and meters.
- GFP Actions that mutate gameplay check authority before apply (Lyra Game Feature Action pattern).
- Melee target pick / Counter window / Singularity fill never run as a client-wide Tick magnet (FS-CMB-002).
Empty enabled Ticks on many pawns burn client and listen-server frame time and can desync feel when clients run logic the server never sees.
AC-ARCH-001
Section titled “AC-ARCH-001”A new engineer can name the owning logical module, GFP, and class for camera, loadout, damage, inventory, HUD, Credits, BTUCOIN, and LUMENAR from this section without opening the GDD.
AC-ARCH-002
Section titled “AC-ARCH-002”A new engineer can name which GFP is Active at boot vs Experience-enabled, and can state whether Credits mutation, camera tick, and EOS HTTP run on the Game Thread or a worker.
AC-ARCH-003
Section titled “AC-ARCH-003”On a listen-server with ~80 ms one-way delay: fire a hitscan at a moving dummy and connect a Melee Drive. Muzzle / lunge present on the firing client the same frame. Dummy HP and Flow change only after server auth. A shot through a solid wall does not apply HP. Cadence spam above FS-GUN-007 is dropped.
AC-ARCH-004
Section titled “AC-ARCH-004”Sampled TFA Actor/Component constructors default Tick off. Any enabled Tick has a one-line authority note (server-only vs presentation-only). No combat power, Flow credit, or economy mutation runs from a non-authority Tick.
3. Session, identity, persistence
Section titled “3. Session, identity, persistence”Front-end screens, widget names, and flow edges are specified in the FE spec. This section is the runtime contract those screens drive.
FS-SES-001 — Save pools
Section titled “FS-SES-001 — Save pools”- Solo: local save, max 10, tagged
LOCAL. Never listed on Online. - Online: EOS + server slots, max 10. Never listed on Solo.
- Characters never transfer.
FS-SES-002 — Character record (minimum)
Section titled “FS-SES-002 — Character record (minimum)”CharacterId, Realm, DisplayName, Sex (Male|Female), AppearanceId,Order, Faction, UnlockedSubclassCount (0–5), ActiveSubclass (nullable), Race=Human,Level, XP, UnspentStatPoints, UnspentSkillPoints,Stats{STR,DEX,CON,INT,WIS},Equipped[15], LoadoutAssignments, Bags,Trees{Combat,Tentacles,Ordnance}, Customizable[4][4], ActiveLoadoutIndex,TentacleSets[3]{Unlocked, Mode Off|Def}, MechanicalArmsEquipped,CampaignFlags, LastTransform, CampaignComplete,Hangar, Collections, CodexKills, MarketplaceUnlocks,ClanId (Online only),LastMatchRecap (Online only; one frozen RAID / Vault / Ladder recap or empty)EOS account / Solo local profile (not the character record) stores CreditsBalance (int64 — shared across every character on that account; FS-ECO-001), BTUCOINBalance / CryptoBalance (player 49% of every BTUCOIN mint, including FS-ECO-008 play grants), LUMENARBalance, studio-treasury mint accounting, EntitlementFlags (CF titles / FX / materials / body props / club / hangar / nameplate / emote ids — FS-ECO-012), and a Discord link for invite delivery. Display name of the crypto token: BTUCOIN (TBD-034 closed).
Create defaults (Confirm on FE17): UnlockedSubclassCount = 0, ActiveSubclass = null. Faction is the origin main class. Multiclass Commit on a later class also starts that class at UnlockedSubclassCount = 0.
FS-SES-003 — Reset Campaign
Section titled “FS-SES-003 — Reset Campaign”Character Select only. Two-step confirm. Wipes story / location / campaign-complete. Keeps identity (including subclass unlock progress), gear, Collections, Codex, hangar, clan, marketplace unlocks, and LastMatchRecap (session flavor, not story). Not Delete. Not New Game+. Online is server-authoritative and fails closed. Credits, BTUCOIN, and LUMENAR live on the EOS account / Solo profile — not character fields — and are not wiped. Solo never has LastMatchRecap.
FS-SES-004 — Enter world
Section titled “FS-SES-004 — Enter world”| Condition | Load |
|---|---|
| New character | Tutorial / opening cinematic (Kailashia → playable after) |
| Existing | Last transform + mission flags |
| Online + campaign complete | Endgame hub on that character |
| After reset | Campaign start, kept gear |
FS-SES-005 — Pause vs play
Section titled “FS-SES-005 — Pause vs play”Pause is a session flag, not a widget type. Command Deck, Character I, Tab maps, Esc, Settings, Deck children, and the Crafting Page all share this policy.
- Hotkey I = Character screen I. Not a second HUD. Solo: pauses the local world. Online: overlay only.
- Esc = session menu. Solo: pauses. Online: overlay only; world does not pause. Esc title is PAUSED (Solo) or LIVE (Online).
- Command Deck = in-world top bar + child screens. Online: the Deck can be up while the session runs. Never pause GameState, the dedicated/listen server, or replicated actors.
- Tab = Map interface & GUI locator ping. In gameplay: Tap pings the Primary on the OmniVisor (quiet world pip + heading tape + tracker blip; name / meters for 4 s). Hold / Press opens contextual Map (Local Map on planet, World Map in orbit/station). Inside Map: Tab toggles between Local and World Map views. Fast travel: TBD-002. Maps follow the same pause policy. Exception: while OmniVisor chat compose is focused (
IMC_TFA_Chat), Tab cycles chat channels only — no ping, no map. - Enter (Online, in play, no overlay) opens OmniVisor chat compose (FS-HUD-010). Overlays (Deck, I, map, Esc) close compose without sending and keep Enter as UI. Solo has no chat widget.
- Crafting Page is Inventory → Gear maximize (
W_TFA_CraftingPage, FS-GUI-008). Forge fills everything except the paper doll and LOAD OUT; the Gear bag hides; Forge needs empty Gear slots; the world-mat rail and the recipe list each scroll. Hubs / field fabricators host the same page with a station bonus. Online overlay does not pause; spend lock is FS-CRF-001. - Overlay input (both realms): UI cursor on; move / look / fire / abilities off. Online: the pawn still simulates (damage, CC, death). OmniVisor Shield / Armor / Health stay readable under the glass.
- A hit does not auto-close Command Deck or I. Downed, death, or disconnect dumps the CommonUI overlay stack to OmniVisor death / respawn or the session-lost screen. Fireteam members are unaffected.
- CommonUI: Solo may use a pausing menu layer. Online must push the same widgets onto a non-pausing game overlay layer. Do not
SetGamePausedon an Online world.
AC-SES-003
Section titled “AC-SES-003”Online listen-server: open Command Deck → Marketplace while a dummy keeps firing. The dummy is not frozen. The pawn takes damage. OmniVisor vitals update under the overlay. Marketplace stays open on hit. On death, the overlay stack closes to OmniVisor death / respawn. Repeat in Solo: opening the Deck freezes the dummy until Resume.
FS-SES-006 — Create Character write
Section titled “FS-SES-006 — Create Character write”Runtime contract for the FE create screen. Widget chrome lives in the FE spec; this is what Confirm must persist.
- Required inputs: DisplayName (2–16, unique in pool), Sex (Male|Female), Appearance (FS-APP-001–004), Order (Fist|Magus|Hidden).
- Derived, not a picker: Faction from Order. Race = Human (Year 1, read-only).
- Forbidden on this screen: subclass picker, difficulty, corp.
- Persist: Order, Faction,
UnlockedSubclassCount = 0,ActiveSubclass = null. Combat tree grants the origin faction chip only. Subclass GAS nodes stay gated until TBD-029. - Return to Character Select with that slot selected, current pool only.
FS-APP-001 — Appearance product lock (Full game)
Section titled “FS-APP-001 — Appearance product lock (Full game)”Full game only. Demo keeps placeholder meshes and fake-modular dials — no Mutable / MetaHuman create path in the Demo Ladder slice.
AppearanceId on the character record is a structured appearance blob (face preset, groom ids, feature dials, hair/skin colors, tattoo slots) — not a forever-opaque int. Catalog row counts: TBD-057.
Player can
- Choose Sex: Male | Female (two fixed body bases; no other body types).
- Pick a premade MetaHuman face from the Year-1 catalog (not live MetaHuman Creator DNA sculpt in-game).
- Pick groom set(s): hair / brows / facial hair authored for that Sex.
- Nudge a small set of facial feature dials Mutable can drive (material params / limited baked reshape — not MH Creator blending).
- Set hair color and skin color.
- Apply tattoos on face and body (projectors / decals onto underarmor + head textures).
Player cannot
- Change body size, limb length, mass, or per-body-part scale.
- Resize underarmor joints or visible flesh when equipping Light / Medium / Heavy plates (FS-FX-004).
- Pick Race (Year 1 = Human, read-only).
- Pick Subclass, Difficulty, or Corp on create.
FE chrome: Create Character Appearance (W_TFA_Appearance / FE17). Runtime write on Confirm: FS-SES-006.
FS-APP-002 — Mesh stack (MetaHuman + Mutable)
Section titled “FS-APP-002 — Mesh stack (MetaHuman + Mutable)”TF player mesh stack (Full game):
- MetaHuman head — separate component recommended (do not merge the huge face skeleton into body).
- Body + underarmor — fixed Sex base; Mutable colors / tattoos / underarmor materials.
- Flare — skinned to flare bones only (only cloth besides underarmor).
- Armor plates — rigid pieces on
a_socket_*(FS-MESH-001). Plate meshes have no deformation bone chain of their own. - Body props / CF cosmetics — silhouette add-ons; never change plate size or underarmor joint scale (FS-ECO-012 / FS-FX-004).
Mutable is a mesh/texture assembly graph. Every attachable part must share a compatible skeleton whose attachment bones/sockets already exist on the host. Do not rely on Epic cloth-morph / body-shape clip for player armor plates.
GFP target: Create + Appearance UI → TFAFrontend; blob persist → TFACore; Mutable runtime → TFACore or thin TFAAppearance (Full game); plate equip visuals → TFACombat loadout apply; gun module mesh Refit → TFAWeapons (+ optional TFAModular).
FS-APP-003 — Appearance apply + post-create edit
Section titled “FS-APP-003 — Appearance apply + post-create edit”- On pawn spawn / Character Select enter world: apply the appearance blob to MetaHuman + Mutable parameters before first possess.
- Post-create Appearance edits (same dials as create) rewrite the blob and re-apply; Sex change is forbidden after Confirm (FS-SES-006 Sex is sticky).
- Solo and Online each persist their own blob on that character record. Cosmetics / shaders bought offline still apply through Appearance (FE store rules) — they do not rewrite Sex or face-catalog identity.
- Demo: Appearance picker may be stubbed / skipped; Confirm still requires Sex + Order + name.
FS-APP-004 — Weapon mesh Refit (Full game)
Section titled “FS-APP-004 — Weapon mesh Refit (Full game)”Align with FS-GUN-004 / FS-GUN-006:
- Class = Spine chassis skeleton; modules attach to Spine bones (
w_socket_*/w_module_*— FS-MESH-001). - Receiver seats on Spine before Barrel; Frame is data only (no chassis mesh).
- Accessory Refit swaps module meshes on Spine bones via Mutable CustomizableObject or SKG attach once Firehand wraps SKG (FS-GUN-005).
Demo remains fake-modular (stats / dials only; mesh unchanged) until Full-game mesh Refit ships (FS-GUN-012).
AC-APP-001
Section titled “AC-APP-001”Full-game Create: Sex Male → fixed male body; equip Light then Heavy chest — plate meshes change, underarmor joint scale unchanged. Face preset + groom + tattoo persist after quit/relaunch. Attempt body-scale dial: control absent. Demo Ladder slice: no Mutable dependency required to enter world.
AC-SES-001
Section titled “AC-SES-001”Create a Solo character, play, quit, relaunch: same slot, same gear, same location. That slot is invisible on the Online select after EOS login.
AC-SES-002
Section titled “AC-SES-002”Open Create Character (FE17). There is no subclass dropdown. Confirm Order of the Fist. Saved record: Faction = Enforcer, UnlockedSubclassCount = 0, ActiveSubclass null. Combat tab shows the Enforcer main class; T1–T5 exist as preview-only until their gates. Combat points on a gated subclass tree are rejected. Repeat Magus → Arcwarden and Hidden → Phantom. A create that writes a starting subclass (for example Vanguard) fails this test.
3.X Authentication and identity — Discord to EOS
Section titled “3.X Authentication and identity — Discord to EOS”EOS is the Online identity provider. Discord is an external credential on that PUID, not a second game account and not a second character pool. Username / password on W_TFA_EOSLogin stays. TFA (Screen B) stays on that path only.
Pipeline follows the EOS Connect Interface for external identity providers.
FS-ID-001 — Objective
Section titled “FS-ID-001 — Objective”Players authenticate, log in, and link game profiles with Discord credentials. Epic Online Services (EOS) remains the backend identity. Online characters stay on that PUID’s server pool. Solo characters never appear.
FS-ID-002 — Discord authorization (client)
Section titled “FS-ID-002 — Discord authorization (client)”- The game client initializes the shipped Discord SDK (Social SDK and/or Embedded App SDK). Both must yield a Discord OAuth2
AccessToken. - The player starts login or link. Discord OAuth2 consent opens.
- On success, Discord returns a short-lived
AccessTokento the client. - Do not persist that access token as a game password. Do not send it to TFA game servers as a session cookie; it is an EOS Connect credential only.
FS-ID-003 — EOS Connect login
Section titled “FS-ID-003 — EOS Connect login”The client calls EOS_Connect_Login.
| Parameter | Lock |
|---|---|
| External credential type | EOS_EExternalCredentialType::EOS_ECT_DISCORD_ACCESS_TOKEN |
| Token string | The Discord AccessToken from FS-ID-002 |
Do not invent another external credential type for Discord.
FS-ID-004 — User mapping
Section titled “FS-ID-004 — User mapping”| Scenario | EOS result | Client |
|---|---|---|
| A — Existing user | Discord ID already linked to an EOS Product User ID (PUID) | Complete login. Use the returned EOS session. Same Online character pool. |
| B — New user | EOS_InvalidUser (Discord ID unrecognized) and the client has no live PUID |
Call EOS_Connect_CreateUser with the ContinuanceToken. Provision a new PUID and automatically link this Discord identity. Online pool starts empty. |
| C — Link to live session | Player already has a PUID (username / password login, or prior Connect session) | Call EOS_Connect_LinkAccount with the Discord AccessToken. Do not CreateUser. Same PUID, same Online cards. This is the Social Discord pane. |
If Discord is already linked to a different PUID, fail closed. Do not silent-merge character pools. Surface: this Discord is already tied to another Terra Firma EOS user.
FS-ID-005 — Errors
Section titled “FS-ID-005 — Errors”- Expired Discord token: If
EOS_Connect_Login(or LinkAccount) fails because the external token expired, silently refresh the Discord OAuth2 token and retry the EOS call once. A second failure surfaces to the player. Do not loop. - Network timeout: Notify the player to check the connection to Discord Services, then wait for a player retry. Do not silent-spin.
- Other EOS failures (banned, service down) fail closed on the existing EOS login error chrome.
AC-ID-001
Section titled “AC-ID-001”Cold Online path: Continue with Discord. Scenario A returns the existing PUID and the same Online cards. Scenario B (EOS_InvalidUser) creates one PUID; Character Select is empty except Create. Username / password still reaches Character Select. Discord Continue does not open TFA Screen B.
AC-ID-002
Section titled “AC-ID-002”Log in with username / password (Ash Cantor pool). Social → Discord → Link. LinkAccount keeps the same PUID and HAVOC card. A CreateUser on that path fails this test.
FS-ID-006 — Stay signed in (this device)
Section titled “FS-ID-006 — Stay signed in (this device)”The player does Discord OAuth / username login once on a device. Later launches reuse a persisted EOS session for the same PUID.
| Store | Do | Do not |
|---|---|---|
| EOS Connect session / refresh for this PUID | OS secure storage (Windows Credential Manager / DPAPI or equivalent) | Game server as a cookie. Plaintext in an ini. |
| Discord OAuth refresh (Discord SDK persist) | Allowed, so the SDK can mint a new AccessToken without consent | Persist the short-lived Discord AccessToken |
| Username | Remember username (existing lock) | — |
| Password | Remember password only if username is also saved; warning shown | Store if Stay signed in is off and Remember password is off |
Launch (Online path):
- If local persist exists, attempt silent
EOS_Connect_Loginwith the persisted EOS credential (and/or a Discord AccessToken the SDK refreshed without UI). - Success → Character Select. No Screen A. No Discord consent. No TFA Screen B.
- Fail → drop persist, show Screen A. Discord Continue runs full FS-ID-002 again.
- After a successful interactive login, write persist if Stay signed in is on (default on).
Log Out of EOS deletes persist on this device. Next Online path is interactive. Discord revoke or EOS invalid refresh is the same as fail in step 3.
Do not invent a day-count. Refresh lifetime is EOS + Discord. Do not use EOS_ECT_DEVICEID_ACCESS_TOKEN as a stand-in — that would be a different identity.
AC-ID-003
Section titled “AC-ID-003”Continue with Discord, Stay signed in on, quit the client, Online again: Character Select with no Screen A and no Discord consent. Log Out, Online again: Screen A. Repeat username / password with Remember password: same skip until Log Out. A build that writes the Discord AccessToken to disk fails this test.
4. Hybrid Perspective camera
Section titled “4. Hybrid Perspective camera”The Dynamic Camera Engine is baseline kit. Phonons, Frames, and parts never retune FOV, blend, or Shift-Out.
FS-CAM-001 — Stance owns perspective
Section titled “FS-CAM-001 — Stance owns perspective”| Condition | Camera |
|---|---|
| Firearm is the active stance, or LT / RT pressed | FPP, tight high FOV (~105°) |
| Melee is the active equipped stance | Always TPP. Never remain in FPP. |
| Square / X Melee Strike while a gun is drawn | Pull to TPP for the strike |
| Special Takedown (Singularity) | Always TPP for the sequence |
| Shift-Out (LT during TPP melee follow-through) | Blend through the head into FPP in 0.2 s bullet-time |
There is no dedicated weapon-swap camera button.
FS-CAM-002 — FPP feel
Section titled “FS-CAM-002 — FPP feel”Precision / tactical. Firehand Bus reticle fully active. Bloom ring is the accuracy cone.
FS-CAM-003 — TPP feel
Section titled “FS-CAM-003 — TPP feel”Wide cinematic third-person, character-centered. Precision reticle dropped or softened. Shared OmniVisor chrome stays.
FS-CAM-004 — Shift-Out
Section titled “FS-CAM-004 — Shift-Out”During a TPP melee strike, holding LT pulls the camera through the back of the head into FPP before the melee animation ends. Window = 0.2 s micro time-dilation for a distant headshot. Does not exist if ADS is disabled for the current stance (dual-weapon, or any Phys Shield in-hand pair).
FS-CAM-005 — Forbidden owners
Section titled “FS-CAM-005 — Forbidden owners”These systems must not write camera FOV, blend time, or Shift-Out:
- Phonon Shards / Chords
- Modular parts
- Affixes
- Artifact Sets
- Vision modes (they tint; they do not change camera rig)
FS-CAM-006 — Look vs move vs body (no camera flip)
Section titled “FS-CAM-006 — Look vs move vs body (no camera flip)”Camera orientation is always mouse / right-stick Look (FS-INP) in both TrueFPP and WideTPP. Locomotion is always move keys / left-stick. The body may rotate, flip, twist, or somersault for any reason — double-jump flip, melee / gun attack montages, dodge/roll, Wall Run re-stick, root motion — and that motion is mesh-only. It must never:
- Rotate, pitch, roll, or re-aim the gameplay camera
- Steal or freeze mouse / RS look
- Copy mesh orientation into control rotation
During flip / attack, the camera keeps facing the aim it had (plus any new look deltas). Look input stays live for the whole animation unless a later explicit CC / ability camera mode says otherwise (Singularity may grant a temporary ability camera — it must restore free look after).
| Channel | Owner | Must not |
|---|---|---|
| Look / camera | Mouse or RS → control rotation (pitch + yaw) — always | Follow mesh root, flip somersault, melee/gun attack twist, jump montage, dodge/roll, or Wall Run mesh / curve re-stick |
| Move (ground / air) | WASD / LS — relative to camera yaw (not pitch) | Steal look; ignore move while flipping unless a separate CC rule says so |
| Move (Wall Run) | WASD / LS — wall-locked (FS-MOV-004) | Follow camera yaw; peel from look alone |
| Body (local + remotes) | AnimInstance / montage on TPP mesh (and local FPP view / bone-hide when TrueFPP — FS-CAM-002) | Write camera FOV, blend, or control rotation |
TrueFPP: eye / control rotation; if body or arms flip, camera does not roll/pitch with the spine. WideTPP: spring-arm follows capsule / pawn, not flipping mesh bones. Remotes never use your camera — only replicated movement + TPP anim. Dual-component net rules stay FS-CAM-002. ADS presentation stays FS-GUN-013.
AC-CAM-001
Section titled “AC-CAM-001”Draw a 1H gun → FPP. Tap 4 to a 1H melee → TPP and stay TPP. Fire LT/RT from melee via Shift-Out → FPP for 0.2 s then return per stance. Hold 2 into Gun + Phys Shield: LT does not ADS and Shift-Out does not open. Equip Phonon Chord → camera numbers unchanged. During a jump flip or melee montage, mouse look still steers; camera does not roll with the mesh (FS-CAM-006).
5. Input
Section titled “5. Input”FS-INP-001 — Non-overlapping verbs
Section titled “FS-INP-001 — Non-overlapping verbs”| Verb | Default (pad / key) | Notes |
|---|---|---|
| Move / sprint | LS / WASD; Toggle Sprint default (FS-INP-006) — not full-tilt stick sprint | |
| Look | RS / mouse | Both perspectives; never follows mesh flip (FS-CAM-006) |
| Melee Strike | Square / X | Directional lunge along stick facing |
| Vault | Space / Cross / A | Contextual — tagged ledge only (FS-MOV-003). Same key as Jump / Wall Run enter / wall jump-off / air double jump |
| Crouch | Circle / B / Ctrl | Sprint+Crouch = Slide. Not Wall Run. |
| Dodge | Double-tap move axis | Crouch+Dodge = Roll. While Wall Running: opposite-side double-tap = wall-to-wall dash (FS-MOV-004), not ground Dodge |
| Wall Run | Space / Cross / A (enter) | Contextual — sprint + tagged wall. Continues without hold. Binding was TBD-003 hold — superseded 2026-10-27 (Demo / GDD). |
| Wall jump-off | Space / Cross / A (while Wall Running) | Leaves the wall with exit momentum (FS-MOV-004). Not Vault. Not opposite-wall dash. |
| Double jump (post wall-exit) | Space / Cross / A (air, after wall jump-off) | One air jump along the wall-exit direction — not a free midair redirect (FS-MOV-004). Mesh flip may play; Look unchanged (FS-CAM / look-vs-body lock). |
| Precision Aim | LT / L2 | Instant FPP. HARD LOCK off in dual-weapon stances and while Physical Shield is in-hand (GunPhysShield / MeleePhysShield). Solo firearm / solo 2H gun only. Same gate as FS-LOD-007. When Phys Shield is in-hand on the left hand, this control is Phys Shield bash / block instead (see FS-LOD-009) — not ADS. |
| Weapon Discharge | RT / R2 | Instant FPP; fires firearm. When Phys Shield is in-hand on the right hand, this control is Phys Shield bash / block instead (FS-LOD-009) — partner 1H uses the opposite side. |
| Phys Shield bash | Same-side attack button as the hand holding the board | FS-LOD-009. Only while Phys Shield in-hand. |
| Vision cycle | D-pad Up / V |
Seven modes, wrap. V is Vision — not a hotbar key. |
| Loadout | Keys 1–7 · Hold RB / R1 stance wheel | Keyboard tap/hold per §7. Pad: hold RB → stance wheel (7 wedges) → RS aim → release RB commits (FS-INP-005). Playtest-provisional. |
| Character I | I · Hold Menu / Options |
Pad tap Menu = session Esc; hold Menu = Character I. |
| Map (Contextual) | Tab (Hold) / Hold View / Create | On planet: Local Map; Off planet: World Map. Not while chat compose is focused. |
| GUI locator ping | Tab (Tap) / M (Tap) / Tap View / Create |
Pulses Primary pip + tape + tracker; name / meters 4 s. Not while chat compose is focused. |
| Map Toggle (Local ↔ World) | Tab (Inside Map UI) | Same inside map on pad View. |
| Chat open | Enter (chat closed, Online, in play) | Pad: soft keyboard / platform chat path TBD-033. Solo: no chat. |
| Chat send | Enter (compose focused, no Shift) | Sends the line. Empty Enter closes without sending. |
| Chat newline | Shift+Enter | Inserts a line; keep typing. |
| Chat channel | Tab (compose focused) | Cycles Fireteam → Clan → Match → General → Proximity → Fireteam. Skip empty seats. Whisper is not Tab. |
| Session menu | Esc · Tap Menu / Options | Chat compose open: Esc closes chat without sending, does not open Esc. |
| Combat hotbar (6) | KB: Q·E·Z·X·C·F · Pad: Hold LB / L1 ability radial |
Keyboard taps cast slots. Pad: hold LB → 6-wedge radial (slots 1–6) → RS aim → release LB casts highlighted. Cancel: return stick to deadzone and release, or B/Circle while held. Contents = Ultimates and/or Combat skills (FS-GUI-005). Shared Shiv charge. Tentacles / grenades never. Playtest-provisional (FS-INP-005). |
| Grenade throw | G · Y / Triangle |
Tap = throw / start cook. Hold = cook if authored. Release = throw if cooking. |
| Reload | R · Tap RB / R1 |
Mag → reserve. Hold RB is stance wheel, not reload. |
| Interact | KB: E (shares hotbar 2) · Pad: D-pad Down |
Keyboard: Interact prompt legal → E prefers Interact. Pad: D-pad Down confirms Interact (hold-to-complete if authored) — not shared with the ability radial. Vault stays A/Cross / Space. |
| Tentacles Active / Inactive | T · RS click / R3 |
Toggle mounted tentacles on/off. Does not flip Off ↔ Def. |
Special Takedown has no button. It auto-fires at 30 combo.
FS-INP-005 — Gamepad defaults (playtest provisional)
Section titled “FS-INP-005 — Gamepad defaults (playtest provisional)”Xbox and DualSense share this map (Xbox name · DualSense name). Playtest may remap faces; keyboard stays authoritative for PC. Full Press/Hold/Release: Programming Bible docs/08-camera-input-movement.md § K pad table.
| Input | Tap | Hold | Release |
|---|---|---|---|
| LB / L1 | no-op | Open ability radial (hotbar 1–6) | Cast highlighted wedge (if any) |
| RB / R1 | Reload | Open stance wheel (loadout 1–7) | Commit highlighted stance |
| Y / Triangle | Grenade throw / cook start | Cook if authored | Throw if cooking |
| RS click / R3 | Tentacles Active ↔ Inactive | — | — |
| D-pad Up | Vision cycle | — | — |
| D-pad Down | Interact (when prompt legal) | Hold-to-complete if authored | Cancel hold-interact |
| D-pad Left / Right | Reserved playtest | — | — |
| View / Create | GUI locator ping | Open Local / World map | — |
| Menu / Options | Session Esc | Character I | — |
| A / Cross | Jump family (Vault / Wall Run / …) | — | Does not cancel Wall Run |
| B / Circle | Crouch / Slide gate | Stay crouched | End crouch per mode |
| X / Square | Melee Strike | — | — |
| LT / L2 · RT / R2 | ADS / Fire (shield bash per FS-LOD-009) | Sustain | End ADS / stop fire |
| LS | Move; click (L3) = Toggle Sprint (FS-INP-006) — not full-tilt sprint | — | — |
| RS | Look; while LB/RB held = radial / wheel aim | — | — |
Ability radial wedge order (clockwise from top): 1=Q · 2=E · 3=Z · 4=X · 5=C · 6=F. Empty wedges draw but do not cast.
FS-INP-002 — Enhanced Input mapping
Section titled “FS-INP-002 — Enhanced Input mapping”Implement as one Input Context for On-Foot (IMC_TFA_Default) plus a UI context (IMC_TFA_UI), Map context (IMC_TFA_Map), and Chat context (IMC_TFA_Chat).
IA_TFA_Map: Chorded Tap vs Hold action onTab(andM). Suppressed whileIMC_TFA_Chatis active.- Tap (
Triggered< hold threshold): BroadcastsOnPingPrimaryWaypointfromUTFAObjectiveSubsystem. Brightens the GUI locator:W_TFA_3DWaypoint(world pip) +W_TFA_HeadingTape+ tracker gold blip. Reveals name + meters for 4 s. Does not open the map. Does not draw a nameplate on the Firehand reticle. - Hold (
Triggered≥ hold threshold): Evaluates planetary context (IsPlayerOnPlanet()). If true, pushesW_TFA_LocalMap; if false, pushesW_TFA_WorldMapontoUPrimaryGameLayoutgame menu layer.
- Tap (
IA_TFA_MapToggle: InsideIMC_TFA_Map, pressingTabtriggersToggleMapPerspective()to switch smoothly betweenW_TFA_LocalMapandW_TFA_WorldMap.IMC_TFA_Chat: Pushed when Online compose is focused. Higher priority thanIMC_TFA_Defaultmap chords. Popped on send, empty Enter, Esc, or any overlay (Deck, I, map, Esc).IA_TFA_ChatOpen: Enter on foot, chat closed, Online, no overlay. Solo ignores.IA_TFA_ChatSend: Enter, no Shift. Empty body closes without send.IA_TFA_ChatNewline: Shift+Enter. Inserts a newline; compose stays open.IA_TFA_ChatChannel: Tab. Cycles Fireteam → Clan → Match → General → Proximity (wrap). Skip empty seats (ClanIdempty → skip Clan; outside matchmade activity → skip Match). Whisper is not Tab. Remember last Tab-cycle channel per PUID.IA_TFA_ChatClose: Esc. Closes compose without sending. Does not open the session menu.
- Hold threshold: 200 ms lab / Demo default on
UTFAInputConfig(was TBD-006 — locked 2026-10-30). Same value for loadout 2·4·6·7, Tab ping vs map, pad LB ability radial, pad RB stance wheel. Tunable in Demo Mod / data — do not hardcode magic numbers in GA graphs. Chat has a message limit; the number is TBA. Gamepad chat binds and flood rate also TBD-033.
FS-INP-003 — Mouse wheel
Section titled “FS-INP-003 — Mouse wheel”Follows current stance mode (FS-LOD-005). In Wrist / single gun / single melee, wheel runs the singles loop (Wrist + guns + melee — skip empty). Does not open a 1–7 strip on the play HUD. Does not enter Dual or Phys Shield.
FS-INP-004 — Press / Hold / Release state matrix
Section titled “FS-INP-004 — Press / Hold / Release state matrix”Every bound control shall define gameplay for Press, Hold, and Release (and context when the same key changes verb). The authoritative matrix lives in the Programming Bible: docs/08-camera-input-movement.md § Keymapping bible. Verb defaults in FS-INP-001, pad defaults in FS-INP-005 (playtest-provisional), sprint engage in FS-INP-006, loadout tap/hold in FS-LOD-004, and movement pairs in FS-MOV-* remain the shalls; the bible expands them to edge-complete states. Hold threshold 200 ms (was TBD-006). Open: pad chat TBD-033, D-pad Left/Right playtest reserve, parkour meter defaults via playtest. Do not invent alternate pad faces in C++ without updating FS-INP-005.
FS-INP-006 — Sprint engage (toggle default · Auto Sprint option)
Section titled “FS-INP-006 — Sprint engage (toggle default · Auto Sprint option)”Default binds
| Platform | Default | Notes |
|---|---|---|
| PC | Toggle Sprint on Left Shift | Remappable (FS-INP-001) |
| Pad | Toggle Sprint on LS click (L3) | Remappable |
| Hold Sprint | Separate remappable bind — unbound by default | Needed when the player wants hold-to-sprint for Slide / Wall Run enter gates without Toggle |
No full-tilt stick sprint. Move stick magnitude alone never enters sprint.
Toggle Sprint (Press): if not sprinting and grounded / legal → enter sprint; if already sprinting → exit sprint. Same for Shift and L3. Hold under Toggle default is —. Release under Toggle is no-op (sprint stays until cancel or second Press).
Hold Sprint (only when that bind is mapped): maintain sprint while held; Release exits sprint. Does not cancel an already-started Slide; does not cancel Wall Run (Wall Run is not hold-to-stick).
Sprint cancel (any engage path): stop move · ADS · Fire start · plain Crouch (not Slide) · illegal stance. Cancel clears sprint; does not peel Wall Run already attached.
Auto Sprint (Options → Controls): boolean, OFF by default. When ON, forward move past threshold while grounded / legal auto-enters sprint (no Shift / L3 required). Toggle Sprint still cancels / re-engages. Hold Sprint (if bound) still works. Slide and Wall Run enter gates still require the sprinting state — Auto Sprint can supply it. Same Options asset from Main Menu and Esc Settings (FE Spec).
AC-INP-001
Section titled “AC-INP-001”No single button owns Dodge, Vault, Slide, and Wall Run as unconditional verbs. Space may contextually Vault or enter Wall Run or Jump or wall jump-off or post-exit double jump — it never Dodges or Slides. Sprint+Crouch never Wall Runs. Double-tap+Crouch never Slides. Double-tap opposite during Wall Run is wall-to-wall dash, not ground Dodge. Space while Wall Running jumps off; it does not cancel by release and does not wall-to-wall dash. Default Left Shift / L3 Toggle Sprint engages without full-tilt stick; Auto Sprint OFF by default (FS-INP-006).
AC-INP-002 — Key edge coverage
Section titled “AC-INP-002 — Key edge coverage”In PIE on-foot (plus sampled chat / map / I): each control in the Programming Bible keymapping matrix matches its Press / Hold / Release rows. Space release never cancels Wall Run. Hold 2 / 4 / 6 / 7 and Tap counterparts match FS-LOD-004. Tab tap pings; Tab hold opens map; Tab in chat cycles channels only.
6. Movement
Section titled “6. Movement”Baseline for every operative in FPP and TPP, all rulesets. Affixes and skills may change distance, cooldown, or cost. They do not gate the verbs.
FS-MOV-001 — Dodge / Roll
Section titled “FS-MOV-001 — Dodge / Roll”- Double-tap Forward / Back / Left / Right → Dodge on that axis (world/camera-relative).
- Crouch held/pressed during that double-tap → Roll (same i-frame / recovery window; different anim and silhouette).
- Short displacement, not a teleport. Cannot chain infinitely. Recovery frames and stamina/Energy cost: TBD-007.
- Stamina / sprint reserve is not on the play HUD unless a later pass asks.
FS-MOV-002 — Slide
Section titled “FS-MOV-002 — Slide”Both required: moving at or above the slide threshold speed (SlideMinSpeed, lab default 750 cm/s, about 16.8 mph, a tunable dial — it is a speed threshold, not the Sprint button) and Crouch. Feet-first (boots lead). If below the threshold, Crouch only crouches. Crouch is hold-to-crouch, not a toggle (designer lock 2026-11-02): hold crouches, release stands. Once a Slide starts it runs to its end (SlideMaxDuration, lab default 1.25 s) — releasing Crouch mid-Slide does not stand up early (designer lock 2026-11-03); still holding after the Slide ends means crouch. Can chain into melee, dodge, or ADS (Slide-Fire Effectiveness applies).
FS-MOV-003 — Vault
Section titled “FS-MOV-003 — Vault”Near a vaultable tagged ledge / cover lip / low barrier, Space / Cross / A while moving into it (same physical key as Jump / Wall Run enter — context wins). Keep directional momentum. Pick a random clip from a small authored set. All clips share the same start / apex / land gameplay windows. Failed vaults do not soft-lock. When both vault and wall-run contexts are legal, prefer authored priority on the parkour DA (default: Vault if Vaultable dead-ahead; else Wall Run).
Tag: TFA.World.Vaultable.
FS-MOV-004 — Wall Run (was “Wall Walk”)
Section titled “FS-MOV-004 — Wall Run (was “Wall Walk”)”Enter: sprint speed and Space / Cross / A and contact / legal proximity with a tagged wall. Same Space as Vault / Jump — contextual. Sprinting into a wall without Space does nothing.
Persist: Wall Run continues while valid wall contact — not a hold-to-stick. Releasing Space does not cancel. Ends on leave surface / fail / Wall Run duration timeout (WallRunMaxDuration — data-driven; TBD default) / wall jump-off. Successful opposite-wall dash jump does not end Wall Run — see below.
Wall Run timer: Each Wall Run stint has a duration budget that counts down while attached. Fresh enter from ground/sprint starts the timer at full. A successful opposite-wall dash jump that attaches to the new wall resets the Wall Run timer to full. Failed / out-of-range dash does not reset. Wall jump-off ends the stint (timer discarded until next enter).
Wall jump-off: While Wall Running, Space / Cross / A peels the operative off the wall into air with exit momentum (away from / along the leave vector of that wall run). Ends Wall Run. Not Vault. Not opposite-wall dash jump.
Double jump after wall jump-off: In the air window after a wall jump-off, Space / Cross / A once more performs a double jump whose travel direction follows the wall-exit jump direction (carry the leave vector — do not grant a free midair redirect onto look/stick alone). Same mesh-only flip rule as normal double jump (camera / Look unchanged). Consumes the normal air-jump charge for that leave; landing or re-sticking to a wall refreshes per baseline jump rules. Ground / ordinary jump double-jump unchanged.
Opposite-wall dash jump (wall-to-wall): While Wall Running, double-tap move toward the opposite side (Left run → double-tap Right, and vice versa). Presentation is a dash jump across the gap (short airborne transfer, not ground Dodge). If an opposite tagged wall is within MaxWallDashDistance (data-driven; TBD default), the operative dash-jumps to that wall, continues Wall Run on the new side, and resets WallRunMaxDuration to full. Out of range → no transfer (no free teleport); timer unchanged. Same-side double-tap does not wall-to-wall. On ground, double-tap remains Dodge (FS-MOV-001). Not Space (Space while Wall Running = wall jump-off only).
Not Tic-Tac: Controlled distance-gated transfer — not Carbon Tic-Tac montages (Demo cut).
Tag: TFA.World.WallRunnable (alias / migrate TFA.World.WallWalkable).
FS-MOV-005 — Movement component
Section titled “FS-MOV-005 — Movement component”Extend Lyra / CMC with custom modes: MOVE_TFA_Slide, MOVE_TFA_WallRun (was WallWalk), MOVE_TFA_Vault, MOVE_TFA_Dodge, plus opposite-wall dash jump as a short transition that re-enters MOVE_TFA_WallRun on the far wall and resets the Wall Run duration timer, plus wall jump-off → airborne with a single directional double-jump charge. Do not overload MOVE_Flying for wall run.
AC-MOV-001
Section titled “AC-MOV-001”On an authored movement sandbox: Dodge, Roll, Slide, Vault, Wall Run each fire only from their input pair. Space enters Vault or Wall Run by context, never Dodge/Slide. While Wall Running, Space jumps off; a second Space in that air window double-jumps along the exit direction. Opposite double-tap during Wall Run dash-jumps only when the far wall is in MaxWallDashDistance, then continues Wall Run with the duration timer reset to full. Untagged walls never stick.
7. Loadout and stance
Section titled “7. Loadout and stance”FS-LOD-001 — Fifteen equipped slots
Section titled “FS-LOD-001 — Fifteen equipped slots”Weapon1, Weapon2, Weapon3, Weapon4, // guns or melee onlyWristMelee, // Wrist Razors / Blades only; hotkey 1PhysicalShield, // dedicated board; not a hotkey aloneHelm, Chest, Gloves, Belt, Boots,EnergyShield, // Barrier / Aegis only; always onRing1, Ring2, AmuletCharms / chips are bag power, not doll slots. Physical Shield is not a doll callout — it lives in LOAD OUT with W1–W4.
FS-LOD-002 — Assignments (player-configured)
Section titled “FS-LOD-002 — Assignments (player-configured)”- Wrist Melee → key 1
- Primary gun / Secondary gun → keys 2 / 3
- Primary melee / Secondary melee → keys 4 / 5
- Physical Shield → Hold 2 / Hold 4 cycles when filled
Not hard-locked to Weapon 1–4 index.
FS-LOD-003 — Default stance is always single
Section titled “FS-LOD-003 — Default stance is always single”Tap 2 / 3 / 4 / 5 selects that assignment and resets that family to single-wield.
FS-LOD-004 — Hotkeys
Section titled “FS-LOD-004 — Hotkeys”| Input | Result |
|---|---|
| 1 | Wrist Melee. Never pairs with Phys Shield. |
| Tap 2 | Primary gun, single |
| Hold 2 | Cycle Dual guns ↔ Gun + Phys Shield (skip empty steps) |
| Tap 3 | Secondary gun, single |
| Tap 4 | Primary melee, single |
| Hold 4 | Cycle Dual melee ↔ Melee + Phys Shield (skip empty steps) |
| Tap 5 | Secondary melee, single |
| Tap 6 | Primary gun + Primary melee |
| Hold 6 | Primary gun + Secondary melee |
| Tap 7 | Secondary gun + Primary melee |
| Hold 7 | Secondary gun + Secondary melee |
If Phys Shield empty, skip shield step. If only one valid 1H in that family, skip dual. Hybrids require both pieces 1H; else no-op.
FS-LOD-005 — Mouse wheel by mode
Section titled “FS-LOD-005 — Mouse wheel by mode”Singles loop (Wrist + weapons only — never dual, never Phys Shield, never hybrid). Skip empty / illegal. Order wraps:
Wrist → Primary gun → Secondary gun → Primary melee → Secondary melee
| Mode | Wheel |
|---|---|
| Wrist | Singles loop (above) |
| Single gun | Singles loop (above) — includes Wrist |
| Single melee | Singles loop (above) — includes Wrist |
| Gun + Phys Shield | Which 1H gun is paired (stays in shield stance; Wrist not in this loop — Tap 1 or leave shield first) |
| Melee + Phys Shield | Which 1H melee is paired (same; Wrist not in this loop) |
| Dual guns / dual melee | No-op |
| Hybrid | Four gun × melee combos |
Wheel does not activate Dual or Phys Shield — those stay Hold 2 / Hold 4 (FS-LOD-004). Do not fold Dual / Phys Shield into the singles mouse-wheel loop (fat-finger + ADS-off risk mid-fight). Pad Hold-RB stance wheel may still list every stance. Optional later: modifier+wheel for Dual/Shield only — not the default singles loop.
FS-LOD-006 — Hard locks
Section titled “FS-LOD-006 — Hard locks”- Wrist Melee + Physical Shield: never.
- Physical Shield alone: no combat stance.
- Dual + shield, or gun + melee + shield: impossible (three hands).
- Active 2H gun or 2H melee: lock duals, hybrids, and Phys Shield pair. Stowed 2H in another slot does not lock 1H draws.
- Energy Shield slot stays equipped and active in every stance.
- While Phys Shield is not in the active pair: equipped but not in-hand (no block / bash).
- ADS / Precision Aim / Shift-Out: HARD LOCK off for any dual-weapon stance and any Phys Shield in-hand pair (FS-LOD-007, FS-INP-001, FS-CAM-004).
FS-LOD-007 — ADS by stance
Section titled “FS-LOD-007 — ADS by stance”| Stance | ADS |
|---|---|
| Solo firearm, solo 2H gun | Allowed |
| Gun + Phys Shield | HARD LOCK: no ADS (shield in-hand) |
| Dual guns, Hybrid, Dual melee | HARD LOCK: no ADS |
| Solo melee, Wrist, Melee + Phys Shield | N/A (TPP melee; shield in-hand has no ADS) |
TFA.Stance.GunPhysShield and TFA.Stance.MeleePhysShield never admit Precision Aim, ADS reticle tighten, or Shift-Out. Dual-weapon gun stances: slower reload (tunable penalty).
FS-LOD-008 — Stance machine
Section titled “FS-LOD-008 — Stance machine”Implement UTFALoadoutComponent as an explicit state machine. Tags in §2.3 are the replicated stance. Weapon actors spawn / holster from state, not from raw key index.
FS-LOD-009 — Phys Shield hand side · bash / block
Section titled “FS-LOD-009 — Phys Shield hand side · bash / block”Hand rule: In GunPhysShield / MeleePhysShield, the 1H partner and the Phys Shield occupy opposite hands. Default: partner on right, shield on left (mirror / lefty preference may swap — data on pawn). Replicated hand tags drive mesh attach and input remap.
Bash / block button = the control on the shield’s side (not a third dedicated key):
| Shield hand | Pad | Mouse (PC) | Partner 1H uses |
|---|---|---|---|
| Left (default) | LT / L2 | RMB (ADS seat) | RT / R2 · LMB fire / melee strike |
| Right | RT / R2 | LMB | LT / L2 · RMB |
| State | Behavior (shield-side button only; board in-hand) |
|---|---|
| Press (tap) | Shield bash — short offensive bash GA |
| Hold | Block / guard (FBR frames — damage pipeline step) |
| Release | End block |
Inactive / unequipped board: no bash, no block (FS-LOD-006). ADS / Shift-Out stay hard-locked while any Phys Shield is in-hand — the shield-side button never opens ADS in these stances.
AC-LOD-001
Section titled “AC-LOD-001”Fill W1–W4 with two 1H guns and two 1H melee, plus Phys Shield. Prove every row in FS-LOD-004. Empty the shield and confirm Hold 2 / 4 skip the shield step. Draw a 2H and confirm 6 / 7 / shield pair no-op. Hold 2 into Gun + Phys Shield: LT / Precision Aim is refused (no ADS reticle tighten); tap LT (default left shield) bashes; hold LT blocks. Hold 4 into Melee + Phys Shield: same shield-side bash/block; no ADS/Shift-Out. Solo gun after Tap 2: ADS works again on LT/RMB.
8. Combat rhythm
Section titled “8. Combat rhythm”Ultra-lethal, high-speed. Not drawn-out trades.
FS-CMB-001 — TTK lock (baseline)
Section titled “FS-CMB-001 — TTK lock (baseline)”| Target | Melee (TPP) | Ranged (FPP) |
|---|---|---|
| Basic Grunt | 1 hit clean decap / slice | 1 head / 2 torso |
| Elite / Brawler | 2–3 balanced inputs | Break Shield / Armor first |
FS-CMB-002 — Melee Drive
Section titled “FS-CMB-002 — Melee Drive”Melee Strike = directional lunge / slash from Left Stick facing + camera. Range and connect are player spacing. No auto target pull. Cadence is player-driven (dash / vault / slide), not auto-leap radius doubling.
FS-CMB-003 — Precision Fire
Section titled “FS-CMB-003 — Precision Fire”Manual aim. Headshots neutralize when TTK rules allow. Gunfeel layer in §12. One shared baseline for all rulesets.
FS-CMB-004 — Kinetic Flow
Section titled “FS-CMB-004 — Kinetic Flow”Kill combo meter. Thin ring around the Terra Firma symbol. Flow and Ultimate are separate meters that both read kills.
| Tier | Combo | Effect |
|---|---|---|
| 1 | 0–15 | Baseline velocity |
| 2 Overclocked | 15–30 | +30% move speed; visor pulse |
| 3 Singularity | 30+ | 0.5 s bullet-time on the trigger kill; auto Special Takedown |
Kill credit / Demo combat bar: Melee Drive and Precision Fire both feed Kinetic Flow → Singularity (FS-CMB-005 Burst Storm). Demo lock (2026-10-27): Asymmetric Flow · second meter · full Burst Storm art are in the Ladder Demo (not deferred). Ultimate stays separate (FS-CMB-006). Design: docs/superpowers/specs/2026-10-26-singularity-one-flow-two-verbs-design.md · bible docs/22-demo.md.
Reset to Tier 1 / combo 0 when:
- Special Takedown resolves, or
- Whiff (strike empty air / miss execution window), or
- Damage break — interim: take any damage (legacy shall). Final rule open: TBD-056 (no freeflow Block input; options under review: Health-only dump · Shield/Armor forgiven · Health damage budget · soft decay / combo armor). Do not invent forgiveness numbers in C++ until TBD-056 locks.
Whiff reset applies 0.5 s stagger. Damage-break stagger follows the locked TBD-056 rule (interim: 0.5 s with any-damage dump).
Singularity is a climax, not a sustained state. One auto takedown → back to Tier 1.
FS-CMB-005 — Special Takedown / Singularity Burst Storm
Section titled “FS-CMB-005 — Special Takedown / Singularity Burst Storm”- No player button. No aim.
- Always TPP.
- Payload: 10 grounded radial varieties (random, repeats allowed) + Kinetic outward kick.
- Character stays grounded. No jump, hang-time, or aerial slam (reserved for Ultimates / authored combo skills).
- Burst length ≈ 0.2–0.45 s so varieties can chain.
- Knockback bands: 0–2 m heavy fly · 2–5 m stagger + slide · 5–8 m light push.
- Channels: Kinetic always present; others from the nine-channel set; Prism Storm may flicker multiple.
Implement as a GAS ability GA_TFA_SingularityTakedown granted to every operative. Variety table is data (DA_TFA_SingularityBursts).
FS-CMB-006 — Ultimate vs Singularity
Section titled “FS-CMB-006 — Ultimate vs Singularity”Ultimates are player-spent, charged on the Terra Firma symbol, empowered by the Customizable 4×4. Singularity is the Flow climax. Do not merge them.
FS-CMB-007 — Ultimate + Skill Energy kill economy (lab defaults)
Section titled “FS-CMB-007 — Ultimate + Skill Energy kill economy (lab defaults)”Streak math (Approach A): on each kill, streakCount = kills in the last window (including this kill, min 1). mult = min(Cap, 1 + (streakCount - 1) × Step). Credit for this kill = Base × mult (then clamp). Gap longer than the window resets streak to 1 on the next kill.
| Meter | Base / kill | Passive | Window | Step | Cap |
|---|---|---|---|---|---|
| Ultimate (Shiv %) | 8% | 0.4%/s in combat (dealt or took damage in last 8 s) | 6 s | +0.25× | 2.5× |
| Skill / Arms Energy | 6 | 4/s regen (EnergyMax 100 before INT) |
6 s | +0.2× | 2.0× |
Demo Mod may override these dials session-wide (docs/superpowers/specs/2026-10-26-demo-combat-economy-stats-design.md). Visual spend ladder unchanged (FS-HUD-007). Flow combo unchanged (FS-CMB-004).
AC-CMB-001
Section titled “AC-CMB-001”Chain 30 kills without a damage-break → auto TPP takedown → Flow = 0. Interim (TBD-056 open): one any-damage hit at combo 20 → Flow = 0 and 0.5 s stagger. When TBD-056 locks, re-run this AC against the chosen rule (Health-only / budget / soft decay / …). Confirm no takedown button exists in the Input Context. Three kills inside 6 s: Ultimate credits rise per kill (Approach A). Skill Energy gains a smaller streak sip on the same kills.
9. Damage and survivability
Section titled “9. Damage and survivability”FS-DMG-001 — Channels
Section titled “FS-DMG-001 — Channels”Kinetic plus eight energy: Thermal, Cryo, Arc, Toxin, Isotopic, Fission, Plasma, Void. Anomalous / Magic do not exist.
FS-DMG-002 — Chance to hit (kinetic melee / hybrid ballistic)
Section titled “FS-DMG-002 — Chance to hit (kinetic melee / hybrid ballistic)”ChanceToHit% = clamp( 200 × (AR / (AR + DR)) × (alvl / (alvl + dlvl)) , 5, 95 )Miss → 0 kinetic damage; on-striking procs do not fire. Ignore Target Defense / some skills skip or modify this roll. alvl / dlvl are character / monster level from §14 / FS-CMP-006. Demo Mod Encounter lab may set both for CtH / hardness sims.
Online: this roll runs on the server after geometric auth (FS-ARCH-013). The client must not apply ChanceToHit or damage. Presentation may show a predicted connect; a server miss ghosts the mark and deals 0.
FS-DMG-003 — Kinetic pipeline (order is the contract)
Section titled “FS-DMG-003 — Kinetic pipeline (order is the contract)”A BaseMin/Max → B flat min/max → C ED% bucket → D attribute %ED by weapon class → E skill multipliers → E2 Level Power Delta outgoing (OutgoingMul — FS-DMG-009) → F convert % physical to elemental → G Crit / Deadly Strike (double physical portion) → H on-hit (Crushing Blow, Open Wounds, Prevent Monster Heal) → I target mitigation → J Life / Energy steal from damage actually dealt.
Publish one ED model in data and do not hide it:
(Base + flat) × (1 + weaponED) × (1 + offWeaponED + attrs + auras) × skillMult × OutgoingMul
Elemental / skill outgoing (FS-DMG-004) also multiplies by OutgoingMul after skill damage is formed and before enemy resist application.
FS-DMG-004 — Elemental / skill damage
Section titled “FS-DMG-004 — Elemental / skill damage”EnemyEffectiveResist = EnemyResist − Pierce% − Mastery − LR analoguesIf EffectiveResist ≥ 100 → Immune (unless broken below 100)DamageDealt = SkillDamage × (1 − clamp(EffectiveResist, −∞, 99) / 100)Negative resist amplifies. Cryo chill/freeze; CBF negates freeze on player. Toxin is total damage over duration. Plasma is strong vs shields. Void has sparse natural resists.
FS-DMG-005 — Incoming to player (order is the contract)
Section titled “FS-DMG-005 — Incoming to player (order is the contract)”- Avoidance (Dodge / Avoid / Evade, miss vs monster AR)
- Block (Phys Shield in-hand + Dex; FBR frames)
- Difficulty resist penalty on non-kinetic channels
- Level Power Delta incoming (
IncomingMul— FS-DMG-009) — multiply remaining channel damage so Apex resist crater and underlevel glass stack - Clamp resist to cap (default 75% + max-resist items) for the eight energy channels
- Absorb flat / %
- DR flat / % on kinetic
- Energy Shield shifts % to Energy
- Armor / analogue pools
- Remainder to Shield then Armor then Health (HUD: blue / amber / red)
- Hit Recovery if damage ≥ threshold
Never merge Shield, Armor, and Health into one pool.
FS-DMG-006 — Crit % mode lock
Section titled “FS-DMG-006 — Crit % mode lock”| Ruleset | Crit % | Headshot TTK |
|---|---|---|
| Story | Enabled. Non-headshot can roll crit (+50% baseline). Crit+ on consecutive headshots. | Applies |
| Progressive MP | No Crit % from rolls, gear, or skills | Applies (aim / frame only) |
| Ladder | No Crit %; affix deltas flattened / zeroed | Applies |
Do not author separate aim-assist profiles per ruleset.
FS-DMG-007 — PvP
Section titled “FS-DMG-007 — PvP”Separate global PvP damage scalar. Leech / Crushing Blow reduced. Ladder kits normalized. Scalar value: TBD-008.
FS-DMG-008 — Tentacle damage
Section titled “FS-DMG-008 — Tentacle damage”- Offensive sets mirror the active weapon channel at an Energy cost. Coefficient × weapon hit after Step E (then Step E2 PowerΔ). Crit timing (before vs after): TBD-009 — pick one in data and lock it.
- Defensive sets do not deal damage; they add absorb / CC.
- Mechanical Arms use the same Offensive mirror at a reduced coefficient (TBD-010).
FS-DMG-009 — Level Power Delta (activity floor + asymmetric out/in)
Section titled “FS-DMG-009 — Level Power Delta (activity floor + asymmetric out/in)”Wrong-activity feel without a separate power-score number. Character Level is the only power number; activities publish Recommended Level (ARL).
MobOffset = clamp(dlvl − ARL, −3, +5)EffectiveDelta = (alvl − ARL) + MobOffsetOutgoingMul, IncomingMul = nearest-integer knot lookup on EffectiveDelta (data table)| Lever | Owns |
|---|---|
| ARL + PowerΔ | Damage dealt / taken scalars only |
| alvl vs dlvl | ChanceToHit only (FS-DMG-002) — unchanged |
| Difficulty | Non-kinetic resist penalty (FS-PRD-005) — unchanged |
Lab-default knots (tune in data; soft overlevel, harsh underlevel):
| EffectiveDelta | OutgoingMul | IncomingMul |
|---|---|---|
| ≤ −10 | 0.35 | 1.75 |
| −7 | 0.50 | 1.50 |
| −5 | 0.65 | 1.35 |
| −3 | 0.80 | 1.20 |
| −1 | 0.92 | 1.08 |
| 0 | 1.00 | 1.00 |
| +1 | 1.04 | 0.97 |
| +3 | 1.10 | 0.92 |
| +5 | 1.14 | 0.88 |
| ≥ +8 | 1.15 cap | 0.85 floor |
- PvP / Ladder: force both muls to 1.0.
- Story + Progressive MP PvE: apply.
- Band assumption until TBD-017: meaningful Δ ≈ ±10 on ~1–60 levels.
- Authorship: area / activity row owns
RecommendedLevelwith Difficulty and monster policy (FS-PRD-005 · FS-CMP-006). Demo Mod Encounter may override ARL for lab only. - Design:
docs/superpowers/specs/2026-10-26-level-power-delta-design.md.
FS-VIT-001 — Three bars
Section titled “FS-VIT-001 — Three bars”| HUD name | Color | Source |
|---|---|---|
| SHIELD | Blue | Energy Shield (Barrier / Aegis) slot; always on |
| ARMOR | Amber | Plate integrity |
| HEALTH | Red | Life / CON + Trauma Weave |
Overshield (tentacle / ability): tint Shield and Armor purple for the buff duration. Health stays red. Purple is a state tint, not a fourth bar.
FS-VIT-002 — Energy pool
Section titled “FS-VIT-002 — Energy pool”One Skill / Arms Energy pool for Combat skills and tentacles. Default max 100 (INT can raise max — FS-PRG-002). Regen 4/s; pickups accelerate. Kill sip 6 × streak mult (FS-CMB-007). Offensive casts and tentacle verbs drain it. Some Defensive tentacle skills may restore it. Ordnance does not drain it.
Pickup form (world bricks vs orbs vs both): TBD-011.
AC-DMG-001
Section titled “AC-DMG-001”Unit test the kinetic pipeline and incoming pipeline with a fixed spreadsheet example. Changing step order fails the test. A Story crit must not fire under Ladder tags. Include FS-DMG-009 PowerΔ: Δ = 0 → muls 1.0; known underlevel knot (e.g. −5) matches table; PvP / Ladder tags force muls to 1.0.
10. Vision modes
Section titled “10. Vision modes”FS-VIS-001 — Seven modes, one active
Section titled “FS-VIS-001 — Seven modes, one active”Baseline kit. Not Phonon-gated. Cycle wrap. Works in FPP and TPP. Illumination affix widens Normal Light; it is not an eighth mode.
| # | Mode | Function |
|---|---|---|
| 1 | Normal Light | Visible spectrum |
| 2 | Infrared | Low-light silhouette; not Heat |
| 3 | Heat | Thermal bloom (bodies, engines, discharge, footprints) |
| 4 | Ultraviolet | Stains, nanite residue, glyphs, tripwires |
| 5 | Sonar / Pulse Echo | Short-range ping; takes over bottom-left tracker disc |
| 6 | Motion Trace | Fading displacement trails |
| 7 | Aether Sight | Auras, Phonon signatures, tentacle draw |
Worldbuilding may call mode 7 Spiritus Sight. Ship GDD name Aether Sight until a global rename (TBD-012). Spiritus Sight remains rare / unstable fiction — not a second standard mode.
FS-VIS-002 — Implementation
Section titled “FS-VIS-002 — Implementation”UTFAVisionComponentreplicates the active tag.- Each mode is a post-process material + optional Niagara / custom-depth pass.
- Shared OmniVisor chrome must remain readable under every overlay.
- Author invisibility families so each has at least one strong mode and one weak mode.
- Pulse Echo grenade may temporarily take over the tracker disc (same seat as Sonar).
AC-VIS-001
Section titled “AC-VIS-001”Cycle 1→7→1. Only one pip lit. Overlay changes; Shield / Armor / Health / Terra Firma symbol stay readable. A cloaked actor tagged for IR is visible in IR and not in Normal.
11. OmniVisor play HUD
Section titled “11. OmniVisor play HUD”Illustrated lock: GDD vol. 15, figures OV1–OV11. Chat stills OV29 / OV31. Feel: dense sci-fi visor chrome, TFA-original marks. Not a GDD infographic.
FS-HUD-001 — Three player-locked anchors
Section titled “FS-HUD-001 — Three player-locked anchors”| Seat | Content |
|---|---|
| Top left | Shield / Armor / Health stacked |
| Center top | Terra Firma / Shiv mark is the Ultimate meter. Painted Shiv (inward horns, three side spikes, needle chin, inner mask lines). FE30 still shows it fire / red. No second Ultimate bar. No metal ring. Facet wireframe around the mark carries charge; flame on the mark at 100%. Vision chip under the symbol. Active Customizable loadout pip (1 of 4) next to the symbol. |
| Top right | Skill / Arms Energy. Three tentacle-set pips (Off / Def) + Active/Inactive read. Pre-gate: one Mechanical Arms pip. Compact combat hotbar (6 slots · Q/E/Z/X/C/F) + CDs under Energy — Ultimates and/or Combat-tree skills only; tentacles and grenades never. |
FS-HUD-002 — Always on
Section titled “FS-HUD-002 — Always on”- FPP: center reticle + bloom from Firehand Bus (weapon-linked, not one generic crosshair)
- Incoming-hit chevrons on visor rim
- World-space IFF brackets (friend / foe / squad)
- Bottom left: motion tracker / IFF disc (Sonar can take over). Online: faded chat log above this disc (FS-HUD-010); compose is contextual.
- Bottom right: weapon + mag / reserve / reload + Field / Specialist / Siege brick + grenade type/count + compact stance pip (solo / dual / shield / 2H). Reserve is the ammo counter (FS-AMMO-001).
- Physical Shield guard pip only when board is in-hand
FS-HUD-003 — Contextual
Section titled “FS-HUD-003 — Contextual”Active auras (few pips), proc / DoT / CC, Overclocked pulse, Singularity flare, Shift-Out frame, Dea comms text (no portrait billboard), GUI locator (quiet world pip; heading tape; tracker gold blip — name + {dist} m + elevation chevron only on Tap Tab / M ping), interact / vault prompt (OmniVisor chrome — not a Carbon widget; vault execute remains Space / Cross / A per FS-MOV-003; Interact confirm shares E with hotbar slot 2 — when prompt legal, Interact wins), Suit Cell / brownout, hit / headshot marks (Crit marks Story-only), Online chat compose (W_TFA_Chat — FS-HUD-010).
FS-HUD-004 — Stay off the play HUD
Section titled “FS-HUD-004 — Stay off the play HUD”Full 1–7 strip, compass rose, Skill GUI, paper doll, Crafting Page, Customizable 4×4, XP bar, a second Ultimate bar, Discord as a chat channel, a Command Deck chat tab, chat on Character screen I.
FS-HUD-005 — Target plate
Section titled “FS-HUD-005 — Target plate”Looked-at hostile: name / rank + Shield / Armor / Health. Grunt short; Elite longer; Boss stays up for the encounter. Player bars stay top-left. Miss vs AR/Def = miss tick, not a hit mark.
FS-HUD-006 — Charge reticle
Section titled “FS-HUD-006 — Charge reticle”Fusion, Linear, Trace, Wave, Bow, Support frame, Charged Strike: charge ring on the Firehand Bus reticle. Trace / Fusion vent is a pip on that ring.
FS-HUD-007 — Ultimate charge ladder
Section titled “FS-HUD-007 — Ultimate charge ladder”Empty 0% dead iron → ~25% few cyan traces on the facet cage → ~50% most facet lines + dull fire on the Shiv → ~75% hot outline, no full flame → 100% Shiv on fire. On spend: flame dies first, then facet collapse. Brand mark: painted Shiv only (figures/tf_shiv_logo.png, fire treatment tf_shiv_logo_fire.png). No gem housing on FE; play HUD cage is facet wireframe only. Triangle-eye never on game screens.
FS-HUD-008 — GUI locator (FE30 primary; FE28 / FE29 secondary)
Section titled “FS-HUD-008 — GUI locator (FE30 primary; FE28 / FE29 secondary)”FE26’s name + meters + rings on the reticle is the clutter anti-example. Primary never owns screen-center.
Primary lock — ship FE30. Quiet world pip + heading tape + tracker gold blip together. Still: fe30_waypoint_combo.png. Center-top Ultimate is the painted Shiv on fire.
Secondary options (thinner density; not the default ship):
- FE28 — world pip only (name still hidden until ping). Use when the tape would fight a cinematic / tutorial visor.
- FE29 — heading tape as the heading cue (gold Primary pip under the brow). Use when the world pip is off (e.g. target behind camera and you want tape-only).
Tracker gold blip on the existing IFF disc may stay in all three. Do not mix FE26 callouts into any option.
UTFAObjectiveSubsystem holds exactly one Primary. That Primary is the GUI locator source. It is not a second minimap and not a compass rose over the world.
FE30 default (always on while a Primary is set):
- Quiet world pip (
W_TFA_3DWaypoint): 8–12 px gold diamond projected onto the target in world space. Sits off the Firehand reticle. No name, no meters, no rings. - Heading tape (
W_TFA_HeadingTape): thin tick strip under the visor brow. Shiv Ultimate stays center-top; the tape runs behind / beside it. Gold pip = Primary heading. Off-FOV: pip parks at the tape end with a chevron. Not a compass rose painted over the world. - Tracker blip: gold diamond on the existing
W_TFA_TrackerDisc. Red blips stay hostiles. Not a second minimap. Sonar still takes over this disc.
Ping (Tap Tab / M, 4 s):
- Reveal name +
{dist} m+ elevation chevron (▲/▼if >3 m) next to the quiet pip, never on the reticle. - Brighten tape pip and tracker blip.
Off-FOV:
- World pip hides. Tape + tracker remain. Tiny rim tick on the visor ellipse (not a nameplate, not FE26’s visor-rim callout).
Hold Tab still opens the map. Clearing Primary hides all locator seats.
Lock: ship FE30. FE28 and FE29 are secondary options only. Do not ship FE26. Center-top Ultimate / Shiv is the painted horned mark (figures/tf_shiv_logo.png) — fire treatment tf_shiv_logo_fire.png. Never a new skull, helmet, or triangle-eye.
FS-HUD-009 — Widget map
Section titled “FS-HUD-009 — Widget map”| Widget | Seat |
|---|---|
W_TFA_OmniVisor |
Root play HUD |
W_TFA_Vitals |
Top left |
W_TFA_UltimateGlyph |
Center top |
W_TFA_VisionChip |
Under glyph |
W_TFA_EnergyHotbar |
Top right |
W_TFA_HeadingTape |
Under visor brow; gold Primary pip |
W_TFA_TrackerDisc |
Bottom left IFF disc + Primary gold blip |
W_TFA_WeaponAmmo |
Bottom right |
W_TFA_TargetPlate |
Look-at |
W_TFA_Comms |
Handler text (Dea). Not player chat. |
W_TFA_Chat |
Online player chat. Seat above the tracker, off the reticle. FS-HUD-010. |
W_TFA_3DWaypoint |
GUI locator — quiet world pip off reticle; ping reveals name |
Combat hotbar slot count: 6 (Q/E/Z/X/C/F) — was TBD-013, locked 2026-10-30 (F added same day; V remains Vision). Chat has a message limit (number TBA). Flood / gamepad: TBD-033.
FPP gun: reticle + bloom + three vitals + glyph + energy. Swap to melee: reticle softens, chrome remains. Dual-gun / Hybrid / Gun + Phys Shield: no ADS reticle tighten (FS-LOD-007). XP does not appear on the visor.
FS-AMMO-001 — Ammo counter, never a bag tile
Section titled “FS-AMMO-001 — Ammo counter, never a bag tile”World ammo bricks (Field / Specialist / Siege) auto-pickup into that brick’s reserve counter on W_TFA_WeaponAmmo (OmniVisor bottom right). They are never a bag tile — not Gear, not Socketables, not Artifacts, not a Crafting stack. Not Inspect. Not a stack in W_TFA_Bag_Gear. Dual Stack Cells, Frames, Blueprints, and Kha-Shards stay Crafting reagents / keys; they are not ammo.
Magazine is the gun mag. Reload pulls from reserve. Caps per brick: TBD-040. Do not invent numbers.
Pickup: overlapping a brick adds to that brick’s reserve until the cap. If the counter is already full, pickup fails closed — the brick stays on the ground. If adding would overflow, fill to cap and leave the remainder on the world brick. Player cannot pick up more until reserve drops (spend / reload).
Ordnance grenade charges are a different pool (FS-PRG). They are not ammo bricks.
AC-AMMO-001
Section titled “AC-AMMO-001”Walk a dummy Field brick while Field reserve is under cap: reserve ticks up; no Gear tile appears. Fill to cap, walk another Field brick: it stays in the world; bag unchanged. Open I → Gear: no ammo icons. Spend reserve under cap, walk the left brick: pickup resumes.
FS-HUD-010 — In-game chat (W_TFA_Chat)
Section titled “FS-HUD-010 — In-game chat (W_TFA_Chat)”Online OmniVisor only. Not a Command Deck tab. Not on Character screen I. Discord is not this chat and not a channel. Dea handler text stays on W_TFA_Comms.
Seat: lower-left, above the tracker disc, off the Firehand reticle. Last few log lines may stay faded while compose is closed. Solo: no widget.
GDD master: In-game Chat (#in-game-chat). Stills: OV29 compose (Fireteam / HAVOC team). OV31 Tab cycle. OV32 Shift+Enter new line. Lock plate: locks/lock_hud_chat.svg (keys + message limit TBA). Do not number a chat still OV30 (FE30 is the GUI locator). Do not invent a limit number or proximity meters on a still.
Channels. Tab cycle (wrap). Skip empty seats. Whisper is not in the Tab cycle. Remember last Tab-cycle channel per PUID. Whisper is sticky only while that DM thread is active; leaving Whisper returns to the last Tab-cycle channel.
| Channel | Audience | Tab cycle |
|---|---|---|
| Fireteam | Current fireteam only (example label HAVOC team). A fireteam of 1 still has this channel. | Yes |
| Clan | Every online member of your ClanId, including other instances. Send fails closed with no clan. |
Yes — skip if ClanId is empty |
| Match | Everyone registered in this matchmade activity (RAID / Vault / Ladder). Not the Social fireteam roster by itself. | Yes — only while in that activity |
| General | Everyone in the current instance. | Yes |
| Proximity | Online players within the server proximity radius. Radius meters stay TBA — do not invent a number. | Yes |
| Whisper | One target PUID. Chip shows the target display name. Open from a chat-log name, Social / instance row Whisper, or Match Results name. | No |
Tab order: Fireteam → Clan → Match → General → Proximity → wrap. From an active Whisper thread, Tab leaves Whisper and advances the Tab-cycle table from the last remembered Tab channel.
Input: FS-INP-002 IMC_TFA_Chat. Enter (closed) opens compose. Tab while compose is up cycles the table above (not Whisper). Enter sends. Shift+Enter inserts a newline and keeps typing. Empty Enter closes without sending. Esc closes without sending and does not open the session menu. Opening Deck, I, map, or Esc closes compose without sending. Overlay Enter is UI, not chat.
There is a chat message limit. The number is TBA (TBD-033). Do not invent a character count or flood rate. Compose must enforce the limit once that number lands. Gamepad chat binds stay on TBD-033. Proximity radius meters TBA. Server-authoritative. Ghost spectators never appear on any channel and cannot send.
AC-HUD-002
Section titled “AC-HUD-002”Online in play: Enter opens compose. Tab cycles Fireteam → Clan → Match → General → Proximity → Fireteam (skip empty seats; Whisper is not Tab). Shift+Enter inserts a second line; Enter then sends both. Empty Enter closes. Esc closes without sending and does not open Esc. With compose up, Tab does not ping and Hold Tab does not open the map. Overlay (I) closes compose. No ClanId: Tab skips Clan. Outside matchmade RAID / Vault / Ladder: Tab skips Match. Solo: Enter does not open chat. Discord is not a channel. Whisper opens only from a name / Whisper action.
12. Gunfeel and Firehand Bus
Section titled “12. Gunfeel and Firehand Bus”FS-GUN-001 — Baseline dials (Receiver AA + Frame kit)
Section titled “FS-GUN-001 — Baseline dials (Receiver AA + Frame kit)”Expose as independently tunable dials, not per ruleset:
Rotation, Strafing, Magnetism, Stickiness, Range Falloff, Bloom, Barrel Jump, Barrel Sway, Stability→magnetism degradation, Recoil, Kickback, Impact, Reload, Mag Size, Equip Speed, Airborne / Hip-Fire / Slide-Fire Effectiveness.
Ownership split:
| Owner | Owns |
|---|---|
| Class | Compatibility + Spine (one core chassis mesh / plate per Class; everything attaches to Spine) |
| Receiver (FS-GUN-008) | Fire Mode, cadence unit, default burst count (when Burst), AA baseline (Magnetism / Stickiness / Rotation / Strafing), reticle family, stance flags; art subclass body mesh (one per Type) that seats on the Class Frame |
| Frame archetype (FS-GUN-007, FS-GUN-009, FS-GUN-010, FS-GUN-011) | Exact cadence number (RPM / charge ms / draw ms + burst override when specialty), recoil pattern, Impact / Mag / Range band bias, RangeStat (0–100); on Class Shotgun (and pellet specialty Frames e.g. Spread Shot HC), Shot Type plus PelletCount / PelletSpreadBase when Shot Type = Spread. Look: none — chassis mesh is Class-owned |
| Accessory parts | Non-AA, non-cadence dials only (Range, Mag, Optic, Stock, Grip, …). Parts never rewrite AA baselines |
Cadence number is authored on the Frame × Receiver row (FS-GUN-007). It is exposed for Inspect / telemetry. It is not a part dial and not an affix dial. Fire Mode and cadence unit come from the Receiver — Frame cannot turn Auto into Charge.
Ladder zeroes affix deltas. Parts only delta the locked gunfeel set. Parts never own Rotation / Strafing / Magnetism / Stickiness. Parts never own Fire Mode or cadence. Nothing rewrites FOV / camera baseline.
FS-GUN-002 — Accuracy vs Stability
Section titled “FS-GUN-002 — Accuracy vs Stability”Accuracy = cone the bullets stay inside (Initial → Final). Bloom is the player-facing cone. Stability = how much the barrel itself moves and how fast magnetism radius degrades. Tune both; they are not the same stat. All projectiles stay inside the current cone. Shotgun Spread fans multiple pellets inside that cone; Shotgun Single fires one projectile like Rifle / Hand Cannon (FS-GUN-010).
Pellet fan vs Accuracy: PelletCount and PelletSpreadBase are not Accuracy/Bloom dials and not Aim Assist. They author how many projectiles leave the muzzle and how wide the fan is inside the current Accuracy → Bloom cone. Effective fan = clamp(PelletSpreadBase + Barrel PelletSpreadDelta) and must not exceed the current Accuracy cone.
FS-GUN-003 — Recoil patterns
Section titled “FS-GUN-003 — Recoil patterns”Authored per Frame / Receiver (learnable paths), not pure random. Parts change Recoil / Kickback magnitude; patterns stay frame-authored.
FS-GUN-004 — Class, Receiver (Type), and Frame
Section titled “FS-GUN-004 — Class, Receiver (Type), and Frame”Ranged Augmented / Rare guns use a four-layer taxonomy. Corp finish (C1–C5) is paint only — not structural. Player word for what Receiver authors is Type. For art / mesh, Receiver is the subclass body on the Class Frame (Sniper is a Rifle subclass kit — not a new Class).
| Layer | Word | Role |
|---|---|---|
| 1 | Corp | C1–C5 finish on Receiver and accessory parts (look only; mixed-corp allowed) |
| 2 | Class | Compatibility bucket + Spine (one core chassis mesh per Class; everything attaches to Spine). Gates which Receivers are legal. Identity key for a drop is Class × Receiver |
| 3 | Receiver | Required structural part that authors Type (Auto, Scout, Fusion, …) and the art subclass body mesh. Owns Fire Mode, cadence unit, AA baseline, Stance (FS-GUN-008). Seats onto the Class Spine. Replaces the old “Family = weapon type” word for guns. Most Types live in one Class. Gatling is multi-Class (Rifle / Machine Gun / Heavy Gun) with Class-specific Stance, kits, and scaled Receiver meshes |
| 4 | Frame (archetype) | Cadence-number kit inside that Type (FS-GUN-007). Intrinsic on the drop; cannot be swapped on an existing item. Does not own chassis art — Adaptive / Aggressive / … share the Class Spine |
Art / mesh lean lock (Year-1): Class owns Spine — one core chassis mesh per Class; everything attaches to the Spine. Frame archetype (Adaptive, Aggressive, Precision, Rapid-Fire, Lightweight, High-Impact, and specialties) is data only (cadence, I/M/R, recoil / gunfeel) and does not get its own chassis mesh. Receiver is the art subclass body (one mesh per Type) that seats onto that Class Spine before Barrel; on tip-share Classes it also owns barrel length and the universal Barrel tip socket. Gatling keeps three Class-scaled Receiver bodies (Rifle / Machine Gun / Heavy Gun). Shared kinetic Barrels (one Soft Object Path 5-pack) are allowlisted on Rifle Auto/Pulse/Scout/SMG + Hand Cannon + Sidearm + Machine Gun (non-Gatling) — fully shrouded. Player / Refit word stays Barrel; art handoff = barrel tip. Hand Cannon + Sidearm use Underlug (external densifier block under the barrel stub — Soft Object Path pack) instead of Brace — no Front Grip, no Stock, no Counterweight. Heavy / Rocket keep Brace; long-guns use Stock or Brace by Class. Shotgun, Sniper, Gatling×3, Heavy, GL Barrels stay keyed. Other modules: Mag / Stock|Brace / Optic / Grip / Front Grip (long-gun only) / Underlug (pistols) / Bow Stabilizer (Bow only) unless keyed (Sniper Optic; Coil / Rail / Emitter; Rocket Tube + Backblast Collar — not Warhead; Limbs / Prod; Cylinder; GL Year-1 Breech). Specialty Frame archetypes share the Class Spine. Sniper reuses Rifle Spine. See docs/superpowers/specs/2026-10-20-gun-art-lean-mesh-design.md.
Every Augmented / Rare firearm rolls a Receiver (Type) and a Frame. Neither is a Year-1 Refit Install. Changing Type = Forge a different Receiver × Frame key. Accessory Refit stays five sockets (FS-GUN-006, FS-CRF-008).
Adaptive Auto and Adaptive Hand Cannon share a Frame name and nothing else — they do not share RPM or Fire Mode (Auto = FullAuto; Hand Cannon = Semi). They sit on different Classes (Rifle vs Hand Cannon), so their Receivers never share an allowlist.
Heavy Gun (definition): man-portable 2H handheld support guns held like a handheld gatling (cradled / forward-mass pose — they do not have to be gatling guns). Occupies both hands (no Phys Shield while equipped). High Impact; slow Equip; large Mag; low strafe freedom. Class Receivers: Heavy Gun (general) and Gatling (rotating-barrel / spin-up). Not an LMG — that is Machine Gun Class.
Gatling (multi-Class Receiver): rotating-barrel / spin-up FullAuto Type. Legal on Rifle, Machine Gun, and Heavy Gun. Each Class × Gatling row is a separate data key (kits, AA, Stance do not cross). Rifle / Machine Gun Gatling may be 1H (dual-wield / Phys Shield rules follow 1H). Heavy Gun Gatling is Handheld2H only (gatling-hold pose; no 1H).
Class → Receiver map
| Class | Receivers (Type) |
|---|---|
| Rifle | Auto, Pulse, Scout, SMG, Sniper, Gatling |
| Hand Cannon | Hand Cannon |
| Sidearm | Sidearm |
| Shotgun | Shotgun |
| Machine Gun | Machine Gun, Gatling |
| Heavy Gun | Heavy Gun, Gatling |
| Grenade Launcher | Grenade Launcher |
| Rocket | Rocket |
| Bow | Bow |
| Crossbow | Crossbow |
| Directed Energy | Fusion, Linear Fusion, Trace |
Gates (hard): Class allowlists Receivers. Sibling platforms stay separate (Hand Cannon ≠ Sidearm, Rocket ≠ Grenade Launcher, Bow ≠ Crossbow). Heavy Gun ≠ Machine Gun for non-Gatling kits — a Heavy Gun Receiver never installs on Machine Gun Class. Gatling is the multi-Class exception: Rifle × Gatling, Machine Gun × Gatling, and Heavy Gun × Gatling are three keys; Stance / AA / accessory kits do not share across those rows. Directed Energy owns Fusion / Linear / Trace only. Forge, drop, and CSV import reject illegal Class × Receiver pairs.
Receiver → Frame: Frame rows key Class × Receiver × Frame when the Receiver name is multi-Class (Gatling); otherwise Receiver × Frame is enough. Specialty Frames stay scoped (Wave on Grenade Launcher, Spin-Up on each Class’s Gatling row, Heavy Sustained on Heavy Gun, …). Forge / drop / CSV reject illegal pairs.
Receiver → accessory kit: the five-pack (or specialty kit) keys off Receiver, not Class alone (FS-GUN-006).
Shared cores: Adaptive, Aggressive, Precision, Rapid-Fire, Lightweight, High-Impact. Not every Receiver ships every core. Specialty Frames per GDD Receiver lists (Support, bursts, Rocket-Assisted, Wave, Longbow, Braced Heavy, …). Legendary / Unique / Apex may use unique intrinsics.
Cadence number lock: FS-GUN-007. Fire Mode + AA: FS-GUN-008. Impact / Mag / Range bands: FS-GUN-009 (closes TBD-014 as qualitative bands). RangeStat 0–100 → meters: FS-GUN-011 (closes Range half of TBD-IMR-FLOAT). Shotgun Shot Type: FS-GUN-010. Demo fake-modular Mag/Optic/Zoom: FS-GUN-012. AA float map = TBD-AA-FLOAT; Impact / Mag floats remain TBD-IMR-FLOAT.
FS-GUN-005 — Firehand Bus
Section titled “FS-GUN-005 — Firehand Bus”UTFAFirehandBus IDs the Dual Armory mag and draws that gun’s reticle family from the Receiver (FS-GUN-008). Support Frame: charge on damage dealt; hip-fire at allies spends charge; ally-valid reticle when a teammate is under the aim point. Support heal vs Energy / mode locks: TBD-015.
Builder stack (lock): Firehand = TFA gun brain in TFAWeapons (active gun, reticle/bloom/mag/cadence data, Flow handoff). Now: live fire / kill credit = ShooterCore / Lyra. Later: wrap marketplace SKGShooterFramework (SKG) for FPS mesh / attach / ballistics presentation — do not enable SKG until Firehand is wired (no dual ShooterCore+SKG fire). GDD names the player-facing Bus; this row owns plugin join. Bible: docs/11-weapons-firehand-bus.md · docs/22-demo.md.
FS-GUN-006 — Modular part ownership
Section titled “FS-GUN-006 — Modular part ownership”| Socket | Primary variables |
|---|---|
| Barrel | Range, falloff, velocity; PelletSpreadDelta (choke — Spread Shotguns / pellet Frames only; ignored when Shot Type = Single; never changes PelletCount or Shot Type); Recoil / Jump |
| Magazine / Cell / Quiver | Mag size, reload |
| Optic | ADS acquisition, zoom, ADS initial accuracy. Absent on Heavy Gun / Heavy Gatling (see Counterweight) |
| Counterweight | Heavy Gun + Heavy Gatling only — replaces Optic socket. Tip settle / forward-mass / Kickback–Stability. No Zoom / AA |
| Stock / Brace | Stability, recoil control, sway, kickback. Stock on long guns. Brace on Heavy Gun / Heavy Gatling (Handheld2H cradle). Hand Cannon + Sidearm: Brace-class variables via Underlug (no shoulder stock). Linear Fusion uses Grip, not Brace. |
| Grip | Handling, equip, reload; airborne / hip / slide |
| Receiver specialty sockets | Coil, rail, emitter, tube, warhead, limbs, prod, string — per GDD Receiver kit. No Year-1 Bipod kit |
Receiver is the required structural part that sets Type (FS-GUN-004). It is not one of the five Year-1 Refit Install sockets. Accessory Refit installs Barrel / Mag / Optic or Counterweight / Stock|Brace / Grip (or that Receiver’s specialty five-pack). Heavy Gun / Heavy Gatling: Barrel · Mag · Counterweight · Brace · Grip.
Module pools (shared vs keyed) — Year-1 art / mesh budget lock:
- Shared per Class (one 5-pack): Mag (default), Stock or Brace, Optic / Sight or Counterweight (Heavy), Grip, Front Grip — unless a Receiver override applies.
- Shared kinetic Barrels (one Soft Object Path 5-pack): allowlisted on Rifle Auto/Pulse/Scout/SMG + Hand Cannon + Sidearm + Machine Gun (non-Gatling). Universal tip socket; Receiver owns length. Not Class-named lookalike copies. All five fully shrouded. Player / Refit = Barrel (art: barrel tip).
- Pistol Underlug (one Soft Object Path 5-pack): Hand Cannon + Sidearm external under-barrel densifier block — not Front Grip / Brace / Counterweight. Visible in profile. Heavy / Rocket keep Brace; long-guns Stock or Brace by Class.
- Keyed by Receiver (own 5-pack when geometry must differ): Barrel-slot family (Shotgun barrels; Sniper long tubes; Gatling rotor clusters at Rifle / MG / Heavy scales; Heavy barrels; Accel Coil / Accel Rail / Emitter; Rocket Tube + Backblast Collar; Bow Limbs; Crossbow Prod; GL wide-bore Barrel); mag-slot substitutes (HC Cylinder, GL Year-1 single-shot Breech — revolving drums Legendary+ later, Bow Quiver+String mix, DE Cell); Sniper long-range Optic 5-pack (never share Rifle core holo–mid optics); Heavy Counterweight 5-pack (replaces Optic on Heavy Gun / Heavy Gatling).
- Frame archetype never keys a new chassis mesh. Class Frame + Receiver body + shared/keyed module packs are the modular mesh inventory.
Rifle · Sniper accessory subclass: Sniper remains Class Rifle × Receiver Sniper (not a separate Class). Its accessory allowlist is a subclass kit under Rifle — long-lane Optic set plus precision Mag / Stock / Grip furniture (five-pack: Barrel · Mag · Optic · Stock · Grip). No Bipod socket / kit in Year-1. Forge / drop / CSV / Refit reject cross-install: core Rifle Optics (Auto / Pulse / Scout / SMG / Rifle Gatling = Auto Sight pack) on Sniper, and Sniper long-lane Optics on other Rifle Receivers. Sniper Barrel stays Class × Receiver–gated (≠ Scout / Auto / …).
C1–C5 finishes change look only. Mixed-corp kits allowed. Legendary / Unique / Apex are outside modular kits. Part identity and Refit: FS-CRF-008. Accelerator Coil / Bow String do not own charge ms / draw ms.
Optic vs Counterweight (Class × Receiver):
| Class × Receiver | Optic socket | Notes |
|---|---|---|
| Fusion, Crossbow, SMG, Machine Gun | Sight (ScopeShort allowlisted per inventory) | Keep sights |
| Rifle × Gatling | Same Sight pack as Auto (Sight · ScopeShort) | Inherit Rifle mid/close optic family |
| Machine Gun × Gatling | Same Sight pack as Machine Gun (Sight · ScopeShort) | Inherit MG optic family |
| Heavy Gun × Heavy Gun | None — socket = Counterweight | No Sight / Scope |
| Heavy Gun × Gatling | None — socket = Counterweight | No Sight / Scope |
| Grenade Launcher | Sight only (Year-1) | Arc / Velocity fire — see ADS exception below |
Counterweight (Heavy + Heavy Gatling fifth accessory): tip settle / forward-mass bias / Kickback–Stability (Handheld2H). Never AA, Fire Mode, cadence, or Zoom. Five-pack: Barrel · Mag · Counterweight · Brace · Grip (Counterweight replaces Optic; Brace stays). Hard reject Optic on Heavy / Heavy Gatling; hard reject Counterweight on Rifle/MG Gatling.
Grenade Launcher ADS: Sight improves aim acquisition / reticle. Does not use kinetic ADS_Falloff = Hip × ZoomMult. Engage distance = Velocity / arc + soft RangeStat (FS-GUN-011). Catalog: docs/inventory/demo-fake-modular-optics-mags.md.
Barrel slot catalog (Class × Receiver)
Two cases. Specialty first sockets still own Barrel variables (Range / falloff / velocity / pellet / Recoil / Jump) unless noted.
A — Socket name Barrel (not interchangeable across Class × Receiver)
| Class | Receiver | Barrel-slot part |
|---|---|---|
| Rifle | Auto, Pulse, Scout, SMG, Sniper | Barrel |
| Rifle | Gatling | Barrel (Rifle Gatling only) |
| Hand Cannon | Hand Cannon | Barrel |
| Sidearm | Sidearm | Barrel |
| Shotgun | Shotgun | Barrel |
| Machine Gun | Machine Gun | Barrel |
| Machine Gun | Gatling | Barrel (MG Gatling only) |
| Heavy Gun | Heavy Gun | Barrel |
| Heavy Gun | Gatling | Barrel (Heavy Gatling only) |
| Grenade Launcher | Grenade Launcher | Barrel |
B — Barrel slot replaced (specialty part; no Barrel install)
| Class | Receiver | Barrel-slot part |
|---|---|---|
| Directed Energy | Fusion | Accel Coil |
| Directed Energy | Linear Fusion | Accel Rail |
| Directed Energy | Trace | Emitter |
| Rocket | Rocket | Tube |
| Bow | Bow | Limbs |
| Crossbow | Crossbow | Prod / Limbs |
Auto Barrel does not fit Pulse. Rifle Gatling Barrel does not fit Heavy Gun Gatling or MG Gatling. Accel Coil does not fit Trace. Tube does not fit Grenade Launcher Barrel.
Melee sockets (exactly five on every melee family): Head → Damage / AR; Guard → Block; Haft → WSM; Weight (Pommel / Brace) → damage↔speed / knockback / tip settle; Core → channel bias. Glaives are melee-only (no projectile). Staff / Scepter caster sticks block AR / ED combat prefixes. Melee taxonomy is unchanged (no Class / Receiver stack).
No socket owns Fire Mode or cadence. Barrel / Mag / Optic / Stock / Grip / Receiver specialty sockets (including Accel Coil / Accel Rail / Emitter / Tube / Limbs / Prod) must not write RPM, charge time, draw time, or burst count. Accessory parts must not write Rotation / Strafing / Magnetism / Stickiness (FS-GUN-008).
FS-GUN-008 — Receiver Fire Mode + AA profile
Section titled “FS-GUN-008 — Receiver Fire Mode + AA profile”Every DA_TFA_GunReceiver row authors the fire-behavior shell. Exact cadence numbers stay on DA_TFA_GunFrame (FS-GUN-007).
Fire Mode enum: FullAuto · Burst · Semi · Charge · Beam · Draw · Pump · SingleShot.
| Field | Meaning |
|---|---|
| FireMode | How the trigger behaves |
| CadenceUnit | RPM / charge ms / draw ms (must match FireMode) |
| DefaultBurst | Burst size when FireMode = Burst (specialty Frames may override 2/3/4) |
| AA baseline | Magnetism / Stickiness / Rotation / Strafing bands (Low · Mid · Mid-High · High · Very High). Float map = TBD-AA-FLOAT |
| ReticleFamily | Drawn by Firehand Bus |
| Stance | 1H / 2H / Handheld2H (Heavy Gun Class — gatling-hold pose) |
AA exclusion: Receiver AA baselines never include PelletCount, PelletSpreadBase, PelletSpreadDelta, or RangeStat / falloff meters. Pellets = FS-GUN-010; Range = FS-GUN-011; Barrel deltas = FS-GUN-006.
Frames may bias Stability→magnetism degradation and recoil feel. Frames must not rewrite Receiver AA baselines or change Fire Mode (cannot turn Auto FullAuto into Charge). Sniper long-range Optics do not rewrite AA baselines (Optic owns ADS acquisition / zoom / initial accuracy only).
Receiver catalog — AA Mag / Stick / Rot / Strafe (canonical; design 2026-10-20-aa-impact-mag-range-bands-design.md):
| Class | Receiver | Fire Mode | Unit | Mag | Stick | Rot | Strafe | Notes |
|---|---|---|---|---|---|---|---|---|
| Rifle | Auto | FullAuto | RPM | Mid | Mid | Mid | Mid | Classic assault |
| Rifle | Pulse | Burst | RPM + burst | Mid-High | High | Mid | Mid | DefaultBurst = 3 |
| Rifle | Scout | Semi | RPM | High | Mid | Low | Low | Precision mid-lane |
| Rifle | SMG | FullAuto | RPM | Low | High | High | High | Close sticky hip |
| Rifle | Sniper | Semi | RPM | Very High | Low | Low | Low | ADS long-lane; optic subclass |
| Rifle | Gatling | FullAuto | RPM | Mid | High | Mid | Mid | 1H allowed |
| Hand Cannon | Hand Cannon | Semi | RPM | Mid | Mid | Mid | Mid | Brace; Burst = specialty Frame |
| Sidearm | Sidearm | Semi* | RPM | Low | High | High | High | *Rapid-Fire cores FullAuto |
| Shotgun | Shotgun | Pump* | RPM | High (short) | Mid | Mid | Mid | Mag Low past mid; *RF FullAuto; Shot Type on Frame (FS-GUN-010) |
| Machine Gun | Machine Gun | FullAuto | RPM | Mid | High | Low | Low | LMG; Stock |
| Machine Gun | Gatling | FullAuto | RPM | Mid | High | Low | Low | 1H allowed |
| Heavy Gun | Heavy Gun | FullAuto | RPM | Mid | Mid | Very Low | Very Low | Handheld2H |
| Heavy Gun | Gatling | FullAuto | RPM | Low | High | Very Low | Very Low | Handheld2H only |
| Grenade Launcher | Grenade Launcher | SingleShot | RPM | Mid | Low | Mid | Low | Arc |
| Rocket | Rocket | SingleShot | RPM | High | Very Low | Low | Low | Lock language |
| Bow | Bow | Draw | draw ms | High† | Low† | Mid | Low | †High Mag at full draw; Low while drawing |
| Crossbow | Crossbow | Draw‡ | draw ms | Mid-High | Mid | Mid | Mid | ‡Repeating Frame → Semi |
| Directed Energy | Fusion | Charge | charge ms | Mid§ | High§ | Mid | Mid | §Mid Mag while charging; High Stick on release |
| Directed Energy | Linear Fusion | Charge | charge ms | Very High | Low | Low | Low | Precision bolt |
| Directed Energy | Trace | Beam | RPM beam | Mid | High | Mid | Mid | No charge; continuous Cell |
FS-GUN-007 — Cadence lock (RPM / charge / draw)
Section titled “FS-GUN-007 — Cadence lock (RPM / charge / draw)”DA_TFA_GunFrame is keyed by Receiver × Frame, or Class × Receiver × Frame when the Receiver name is multi-Class (Gatling). Class, CadenceUnit, and Stance come from the Class × Receiver row (FS-GUN-008). Each row authors one cadence number in that unit. Runtime fire interval, charge duration, and draw duration read that field. Do not derive cadence from Impact, Mag Size, or parts. Do not change Fire Mode on the Frame row.
| Unit | Receivers (from Receiver CadenceUnit) |
|---|---|
| RPM | Auto, Pulse, Scout, Hand Cannon, SMG, Sidearm, Shotgun, Sniper, Trace (beam), Grenade Launcher, Rocket, Machine Gun, Heavy Gun, Gatling |
| Charge ms | Fusion, Linear Fusion |
| Draw ms | Bow, Crossbow |
Burst Frames author RPM and burst count (example: Pulse Adaptive Burst = 390 RPM · 3-burst). Default burst comes from Receiver; specialty Frames may override. Two Frames on the same Receiver must not share a cadence string. Designers may trim ±5% on the data asset; the uniqueness invariant still holds. Playtest must not collapse Adaptive Auto onto Adaptive Hand Cannon.
Ship bands (GDD Figure G5). Empty cell = that core is not in the Receiver pool.
| Receiver | Adaptive | Aggressive | Precision | Rapid-Fire | Lightweight | High-Impact |
|---|---|---|---|---|---|---|
| Auto | 600 RPM | — | 450 RPM | 720 RPM | 660 RPM | 360 RPM |
| Pulse | — | — | — | 540 RPM · 3-burst | 420 RPM · 3-burst | 340 RPM · 3-burst |
| Scout | 200 RPM | 120 RPM | 180 RPM | 260 RPM | 220 RPM | 150 RPM |
| Hand Cannon | 140 RPM | 120 RPM | 180 RPM | — | — | — |
| SMG | 800 RPM | — | 600 RPM | — | 950 RPM | — |
| Sidearm | 300 RPM | — | 260 RPM | 450 RPM | 360 RPM | — |
| Shotgun | — | 55 RPM | 65 RPM | 140 RPM | 100 RPM | — |
| Sniper | 90 RPM | 72 RPM | — | 140 RPM | — | — |
| Fusion | 660 ms charge | 740 ms charge | 780 ms charge | 500 ms charge | — | 960 ms charge |
| Linear Fusion | — | — | 533 ms charge · 1 bolt | — | — | — |
| Trace | 1000 RPM beam | — | — | — | — | — |
| Grenade Launcher | 90 RPM | — | 72 RPM | 150 RPM | 100 RPM | — |
| Rocket | 20 RPM | 25 RPM | 15 RPM | — | — | 12 RPM |
| Machine Gun | 450 RPM | 600 RPM | — | 900 RPM | — | 360 RPM |
| Bow | — | — | — | — | — | — |
| Heavy Gun | 420 RPM | 500 RPM | 360 RPM | — | — | 280 RPM |
| Gatling (Rifle) | 800 RPM | 950 RPM | — | 1100 RPM | — | 650 RPM |
| Gatling (Machine Gun) | 900 RPM | 1100 RPM | — | 1200 RPM | — | 700 RPM |
| Gatling (Heavy Gun) | 900 RPM | 1100 RPM | — | 1200 RPM | — | 700 RPM |
Specialty cadence (same uniqueness rule inside the Receiver):
| Receiver | Frame | Cadence |
|---|---|---|
| Auto | Support Frame | 520 RPM |
| Pulse | Heavy Burst (2) | 300 RPM · 2-burst |
| Pulse | Adaptive Burst (3) | 390 RPM · 3-burst |
| Pulse | Aggressive Burst (4) | 450 RPM · 4-burst |
| Pulse | Rocket-Assisted Pulse | 160 RPM · 3-burst |
| Hand Cannon | Spread Shot HC | 80 RPM |
| Hand Cannon | Heavy Burst HC | 260 RPM · 2-burst |
| Sidearm | Rocket-Assisted Sidearm | 90 RPM |
| Sidearm | Heavy Burst Sidearm | 325 RPM · 2-burst |
| Sidearm | Adaptive Burst Sidearm | 490 RPM · 3-burst |
| Shotgun | Pinpoint Slug Frame | 70 RPM |
| Sniper | Disruption Frame | 50 RPM |
| Fusion | Aggressive Fusion (Line Burst) | 800 ms charge |
| Linear Fusion | Adaptive Burst Linear | 640 ms charge · 3 bolts |
| Grenade Launcher | Compressed Wave Frame | 60 RPM |
| Grenade Launcher | Wave Frame | 80 RPM |
| Grenade Launcher | Double Fire Frame | 85 RPM |
| Grenade Launcher | Micro-Missile Frame | 110 RPM |
| Grenade Launcher | Area Denial Frame | 120 RPM · burst |
| Rocket | Precision Tracking Rocket | 18 RPM |
| Bow | Lightweight Bow (Recurve) | 540 ms draw |
| Bow | Precision Bow (Compound) | 684 ms draw |
| Bow | High-Impact Longbow | 760 ms draw |
| Crossbow | Lightweight Crossbow | 480 ms draw |
| Crossbow | Precision Crossbow | 620 ms draw |
| Crossbow | High-Impact Crossbow | 740 ms draw |
| Crossbow | Repeating Crossbow | 360 ms draw · semi |
| Heavy Gun | Heavy Burst | 240 RPM · 3-burst |
| Heavy Gun | Heavy Sustained | 550 RPM |
| Gatling (any Class) | Spin-Up | 400 RPM spool → Class Rapid-Fire cap |
| Gatling (any Class) | Rotor Sustained | Class Adaptive band sustained |
Inspect shows Class, Receiver (Type), Fire Mode, Frame, and the locked cadence string (example: Hand Cannon · Semi · Adaptive · 140 RPM). Firehand does not retune cadence or AA baseline.
FS-GUN-009 — Impact / Mag / Range bands (closes TBD-014)
Section titled “FS-GUN-009 — Impact / Mag / Range bands (closes TBD-014)”Frame-authored relative bands for Impact, Mag (or Cell / Quiver capacity bias), and Range. Cadence stays FS-GUN-007. AA stays FS-GUN-008. Band enum: Low · Mid · Mid-High · High · Very High. Triple format: Impact / Mag / Range. Empty cell = Frame not in that Receiver pool. Float map: Range → FS-GUN-011 / docs/inventory/weapon-range-falloff.md; Impact / Mag → TBD-IMR-FLOAT.
Parts may delta Mag / Range / Impact magnitude inside the locked gunfeel set; they do not rewrite Receiver AA. Within one Class × Receiver, two Frames must not share an identical I/M/R triple and an identical cadence string (cadence uniqueness remains primary).
Core Frames
| Receiver | Adaptive | Aggressive | Precision | Rapid-Fire | Lightweight | High-Impact |
|---|---|---|---|---|---|---|
| Auto | Mid / Mid / Mid | — | Mid-High / Low / High | Low / High / Mid | Low / Mid / Mid-High | High / Low / Mid |
| Pulse | — | — | — | Mid / High / Mid | Mid / Mid / Mid-High | High / Low / Mid |
| Scout | Mid-High / Mid / High | High / Low / Mid-High | High / Low / Very High | Mid / High / High | Mid / Mid / High | Very High / Very Low / High |
| Hand Cannon | High / Low / Mid | High / Very Low / Mid | Mid-High / Low / Mid-High | — | — | — |
| SMG | Low / High / Low | — | Mid / Mid / Mid | — | Very Low / Very High / Low | — |
| Sidearm | Low / Mid / Low | — | Mid / Low / Mid | Low / High / Low | Low / Mid-High / Low | — |
| Shotgun | — | Very High / Low / Very Low | High / Low / Low | Mid / High / Low | Mid / Mid / Low | — |
| Sniper | High / Low / Very High | Very High / Very Low / Very High | — | Mid / Mid / High | — | — |
| Fusion | Mid / Mid / Mid | Mid-High / Low / Mid | High / Low / Mid-High | Low / High / Mid | — | Very High / Very Low / Mid |
| Linear Fusion | — | — | Very High / Very Low / Very High | — | — | — |
| Trace | Mid / High / Mid | — | — | — | — | — |
| Grenade Launcher | Mid / Mid / Mid | — | High / Low / Mid-High | Low / High / Mid | Mid / Mid / Mid-High | — |
| Rocket | Very High / Very Low / Mid | High / Low / Mid | Very High / Very Low / High | — | — | Very High / Very Low / Mid-High |
| Machine Gun | Mid / High / Mid | Mid / Very High / Mid | — | Low / Very High / Mid | — | High / Mid / Mid |
| Bow | — | — | — | — | Mid / Mid / Mid | — |
| Crossbow | — | — | High / Low / Mid-High | — | Mid / Mid / Mid | High / Very Low / Mid |
| Heavy Gun | High / High / Mid | High / Very High / Mid | Very High / Mid / Mid-High | — | — | Very High / Mid / Mid |
| Gatling (Rifle) | Mid / Mid / Mid | Mid / High / Mid | — | Low / High / Mid | — | High / Low / Mid |
| Gatling (Machine Gun) | Mid / High / Mid | Mid / Very High / Mid | — | Low / Very High / Mid | — | High / Mid / Mid |
| Gatling (Heavy Gun) | High / High / Mid | High / Very High / Mid | — | Mid / Very High / Mid | — | Very High / Mid / Mid |
Specialty Frames (I / M / R)
| Class × Receiver | Frame | Impact / Mag / Range |
|---|---|---|
| Rifle × Auto | Support Frame | Low / Mid / Mid |
| Rifle × Pulse | Heavy Burst (2) | High / Low / Mid |
| Rifle × Pulse | Adaptive Burst (3) | Mid / Mid / Mid |
| Rifle × Pulse | Aggressive Burst (4) | Mid-High / Mid / Mid |
| Rifle × Pulse | Rocket-Assisted Pulse | High / Low / Mid-High |
| Hand Cannon × HC | Spread Shot HC | Mid / Low / Low |
| Hand Cannon × HC | Heavy Burst HC | High / Low / Mid |
| Sidearm × Sidearm | Rocket-Assisted Sidearm | High / Low / Mid |
| Sidearm × Sidearm | Heavy Burst Sidearm | Mid-High / Low / Mid |
| Sidearm × Sidearm | Adaptive Burst Sidearm | Mid / Mid / Low |
| Shotgun × Shotgun | Pinpoint Slug Frame | High / Low / Mid |
| Rifle × Sniper | Disruption Frame | Mid-High / Low / Very High |
| DE × Fusion | Aggressive Fusion (Line Burst) | High / Low / Mid |
| DE × Linear Fusion | Adaptive Burst Linear | High / Low / High |
| GL × GL | Compressed Wave Frame | Mid-High / Low / Mid |
| GL × GL | Wave Frame | Mid / Mid / Mid |
| GL × GL | Double Fire Frame | Mid / Mid-High / Mid |
| GL × GL | Micro-Missile Frame | Mid / High / Mid-High |
| GL × GL | Area Denial Frame | Mid / High / Low |
| Rocket × Rocket | Precision Tracking Rocket | Very High / Very Low / High |
| Bow × Bow | Lightweight Bow (Recurve) | Mid / Mid / Mid |
| Bow × Bow | Precision Bow (Compound) | High / Low / Mid-High |
| Bow × Bow | High-Impact Longbow | Very High / Very Low / High |
| Crossbow × Crossbow | Lightweight Crossbow | Mid / Mid / Mid |
| Crossbow × Crossbow | Precision Crossbow | High / Low / Mid-High |
| Crossbow × Crossbow | High-Impact Crossbow | Very High / Very Low / Mid |
| Crossbow × Crossbow | Repeating Crossbow | Mid / High / Mid |
| Heavy Gun × Heavy | Heavy Burst | High / Mid / Mid |
| Heavy Gun × Heavy | Heavy Sustained | Mid-High / Very High / Mid |
| Gatling (any Class) | Spin-Up | Mid / High / Mid (Class Mag tier follows that Class’s Gatling Adaptive Mag) |
| Machine Gun × MG | Rotor Sustained | Mid / Very High / Mid |
| Heavy Gun × Gatling | Spin-Up (Heavy) | High / Very High / Mid |
FS-GUN-011 — RangeStat 0–100 → falloff meters (closes Range half of TBD-IMR-FLOAT)
Section titled “FS-GUN-011 — RangeStat 0–100 → falloff meters (closes Range half of TBD-IMR-FLOAT)”Every DA_TFA_GunFrame row authors RangeStat (0–100). Meters are not universal: RangeStat = 100 on Shotgun is not the same distance as 100 on Sidearm or Scout. Each Receiver owns a hip-fire falloff curve. Firehand maps:
EffectiveStat = clamp(RangeStat + BarrelRangeDelta, 0, 100)FalloffStart_m = Start0 + (Start100 − Start0) × (EffectiveStat / 100)FalloffEnd_m = End0 + (End100 − End0) × (EffectiveStat / 100)Damage scales linearly from Start → End down to the Receiver damage floor %. Past End, floor holds. Hip curve authorship stays here. ADS multiplies hip meters by ZoomMult (FS-GUN-012 Demo fake-optic; Full-game Optic part later).
Ownership
| Field | Owner |
|---|---|
RangeStat |
Frame (DA_TFA_GunFrame) |
Curve endpoints (Start0/100, End0/100, floor %) |
Receiver (catalog in Programming Bible docs/inventory/weapon-range-falloff.md) |
| RangeStat / meter delta | Barrel (primary); Optic may bias ADS effective range later — never rewrite Receiver curve |
| AA Mag / Stick / Rot / Strafe | Never RangeStat or meters (FS-GUN-008) |
Qualitative Range band in FS-GUN-009 remains the design shorthand. Default RangeStat midpoints: Very Low≈15 · Low≈25 · Mid≈50 · Mid-High≈65 · High≈80 · Very High≈95. Shotgun Single (Pinpoint Slug) uses the Shotgun (Single / Slug) curve, not the Spread pellet curve (FS-GUN-010). Grenade Launcher / Rocket remain Velocity-primary; RangeStat soft-biases useful engage distance only.
Canonical tables (curves + every Receiver × Frame default): Programming Bible docs/inventory/weapon-range-falloff.md. Impact / Mag numeric floats stay TBD-IMR-FLOAT.
AC-GUN-005
Section titled “AC-GUN-005”Spawn Auto Adaptive and Sidearm Adaptive both at RangeStat 50: FalloffStart_m differs (Receiver curves). Spawn Shotgun Aggressive (Spread, low RangeStat) and Pinpoint Slug (Single, Mid RangeStat): Slug uses Single/Slug curve; Spread uses pellet curve. Swap Barrel on Auto: EffectiveStat may change; Receiver curve endpoints unchanged; AA Mag baseline unchanged. Fail CSV import if a Frame row omits RangeStat.
FS-GUN-012 — Demo fake-modular overrides (data only · no mesh)
Section titled “FS-GUN-012 — Demo fake-modular overrides (data only · no mesh)”Demo only. Pre-art sandbox + Ladder launch. W_TFA_DemoMod is a switchable team modification system (bDemoModEnabled; external default false). Hotkey O only when ON — OV36 lists paper-doll combat seats (W1–W4 · Wrist · Phys Shield · Helm · Chest · Gloves · Belt · Boots · Energy Shield · Ring1 · Ring2 · Amulet; category chips Weapons · Armor · Jewelry/ES · Specials ×4 TBA · Ordnance ×4 TBA · Tentacles ×4 TBA) → OV37 subtabs (1080p: body scrolls): Stats (Equipped kit + type/quality + locked Name + authored Unique name on Legendary/Unique/Apex + plate) · Affixes (Demo Quality ladder: Common 0+0 · Uncommon 1 prefix OR 1 suffix · Augmented 1+1 · Rare 2+2 · Legendary/Unique/Apex 3+3; clamp on open/commit — Full-game Rare ≤3+3 remains FS-ITM-002) · Sockets (Demo default open wells by Quality: Common/Uncommon 2 · Augmented 3 · Rare 4 · Legendary 5 · Unique/Apex 6; editable 0–6; Phonon/Gem/Jewel; Artifact Unique/Apex only; Phonon Chord on Common) · Gunfeel (guns: Mag / Optic or Counterweight / AA dials). Quality field locks: Name always RO; Unique name + Artifact locked below their Quality gates; affix rows only as Quality allows (Uncommon xor). Name modes: Common/Uncommon/Augmented affix-built; Rare GDD First Word + Second Word lexicon (family-gated); Legendary/Unique/Apex hand-authored Unique name (not the Rare lexicon). Kit change resets defaults for that seat (session fill; no mesh). OK on Fake Mag refreshes OmniVisor AMMO from MagSize / MagFamily (FS-AMMO-001, OV38). Catalog: docs/inventory/demo-mod-item-specs.md. Visual mesh never changes. This is not Full-game Refit / socket Install (FS-GUN-006, FS-CRF-008). External playtest builds strip / gate Mod (docs/22-demo.md).
OV36 seat on/off (session loadout test): Doll section lists show every seat (filled and empty). Per-row equip ON/OFF writes session fillOverrides (null = unequipped) — real empty seats, not mute. Isolate snapshots current fill, unequips every other doll seat, keeps the selected seat. Restore kit reapplies that snapshot, or clears overrides to the scenario default if none. Re-equip uses last kit on that seat, else first id from kitCatalogForSeat. Affix totals / OmniVisor ammo / export read effective fill only. Specials / Ordnance / Tentacles stay always-4 TBA stubs (no seat toggle). Enter piece refused on empty seats.
Kit catalogs (ranged vs melee): Pack mock KIT_CATALOG keeps separate buckets (ranged · melee · armor · …). Seats resolve via SEAT_CATALOG_KEYS (arrays of bucket keys). W1–W4 are ["ranged"] during the ranged pass; set DEMO_ALLOW_MELEE_ON_W = true (or append "melee" to those keys) when the melee pass starts. Wrist stays ["melee"] only. Equipped-kit picker groups Ranged / Melee optgroups — do not merge into one flat weapons list. Ranged kits are Receiver × Frame (auto_adaptive, hc_aggressive, sg_rapid, …) with Frame-band MagSize/reserve per Frame Mag band (FS-GUN-009); legacy ids (auto, hc, …) alias the primary Frame. Authority: docs/inventory/demo-mod-item-specs.md · docs/inventory/demo-fake-modular-optics-mags.md · mock tfa_gdd_html/figures/demo_mod_mock_data.js.
Hard gates: Overrides never rewrite Fire Mode, cadence, AA Mag/Stick/Rot/Strafe, damage auth, or hit auth. Client never owns those. OK commits; Esc/Cancel discards.
Export / Import / Promote: Team dumps session Lab dials and piece overrides to separate JSON files per concern (lab-formulas · lab-economy · lab-raw · lab-encounter · one piece file per seat/kit) under schema tfa-demo-mod/v1. Catalog: docs/inventory/demo-mod-export.md. Promote CLI: python promote_demo_mod.py <exports> → DT_TFA_CombatEconomy.json · DA_TFA_AttrFormulas.json · kits/*.json · gunfeel/DemoKitGunfeel.csv (lab-raw / encounter lab defaults are not shipping globals). Does not authorize client-owned combat numbers.
MagFamily (Clip / Mag — player word)
Section titled “MagFamily (Clip / Mag — player word)”Enum: Box · Tube · Drum · Cylinder · Cell · Quiver.
Mod may expose MagFamily + MagSize + ReloadSpeed as session dials. MagSize / reserve are Frame-kit-owned (Demo Frame-band integers per Receiver × Frame × MagFamily — e.g. hc_adaptive 11/88 ≠ hc_aggressive 8/64 ≠ auto_adaptive 40/280). MagFamily change snaps MagSize to that kit’s family default and clamps edits to kit×family min/max — never a global Box=30 preset. Catalog: Programming Bible docs/inventory/demo-fake-modular-optics-mags.md · mock GUN_FRAME_ROWS / MAG_SIZE_TABLE. Full-game Frame Mag floats stay TBD-IMR-FLOAT.
OpticKind (Sight ≠ Scope)
Section titled “OpticKind (Sight ≠ Scope)”Enum: Sight · ScopeShort · ScopeLong.
| Kind | Optic class | ZoomAdd band (Demo default) |
|---|---|---|
| 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 (Sniper only for high end) |
Optic allowlist + Counterweight (Full-game sockets · Demo Mod mirrors)
Section titled “Optic allowlist + Counterweight (Full-game sockets · Demo Mod mirrors)”- Fusion · Crossbow · SMG · Machine Gun: Sight (+ ScopeShort per catalog).
- Rifle × Gatling: Auto Sight pack. Machine Gun × Gatling: MG Sight pack.
- Heavy Gun × Heavy Gun / Heavy Gun × Gatling: no OpticKind — Counterweight dials only (tip settle / Kickback–Stability).
- Grenade Launcher: OpticKind Sight only; ZoomAdd ignored for falloff (fixed 1.0); arc/Velocity note read-only. No ScopeLong.
ADS zoom × falloff (ties FS-GUN-011)
Section titled “ADS zoom × falloff (ties FS-GUN-011)”HipStart_m / HipEnd_m = FS-GUN-011 curve(EffectiveRangeStat)ZoomMult = clamp(ReceiverBaseZoom + OpticZoomAdd, OpticMin, OpticMax)ADS_FalloffStart_m = HipStart_m × ZoomMultADS_FalloffEnd_m = HipEnd_m × ZoomMultReceiver BaseZoom + OpticKind allowlist: inventory doc. Grenade Launcher: Sight aids acquisition only — no Hip×ZoomMult falloff (arc / Velocity). Heavy / Heavy Gatling: no OpticKind. AA baselines stay FS-GUN-008.
Demo Mod rows (ranged kits)
Section titled “Demo Mod rows (ranged kits)”RangeStat · BarrelRangeDelta (optional) · FalloffStart/End_m (read-only hip) · MagFamily · MagSize · ReloadSpeed · OpticKind / ZoomAdd / ZoomMult / ADS meters or Counterweight dials (Heavy) · GL: Sight + arc/Velocity note (no ZoomMult falloff).
FS-GUN-013 — TrueFPP ADS (weapon FOV + optic aim)
Section titled “FS-GUN-013 — TrueFPP ADS (weapon FOV + optic aim)”Sight / ScopeShort / ScopeLong drive TrueFPP weapon ADS: gameplay camera FOV from ZoomMult + gun raise / optic presentation. 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.
Stance locks still apply (FS-LOD-007). Falloff meters while ADS remain FS-GUN-012 (Hip × ZoomMult) except Grenade Launcher / Heavy exceptions. Catalog: docs/inventory/demo-fake-modular-optics-mags.md.
AC-GUN-006
Section titled “AC-GUN-006”Character has Auto in W1 + Plate Chest: OV36 Weapons shows W1 Auto (and empty W seats as OFF); Armor shows every armor seat. Toggle W2 OFF → seat empty; affix totals / active gun ignore it. Isolate W1 → other doll seats empty; Restore kit → prior fill returns. Toggle empty W3 ON → first ranged catalog kit equips (melee kits still refused on W while DEMO_ALLOW_MELEE_ON_W is false). Enter Chest → OV37 Stats/Affixes: edit ArmorValue and a prefix band; OK persists session. Enter W1 → Stats: Equipped kit picker shows Ranged Frame kits (e.g. Auto Rifle · Adaptive, Hand Cannon · Aggressive); change auto_adaptive→hc_adaptive → MagSize 11 / reserve 88 (not Auto 40/280); swap to hc_aggressive → 8/64; OK → list shows Frame name (mesh unchanged). Enter auto_adaptive → Gunfeel: set RangeStat 50 → hip Start_m matches Auto curve; set OpticKind ScopeShort + ZoomAdd 0.6 → ADS Start = hip × (1.5+0.6); edit a Kinetic Output prefix name. Attempt OpticKind ScopeLong on Hand Cannon: refused (allowlist). Attempt MagFamily Cylinder on Auto: refused. Attempt OpticKind Sight on Heavy Gun: refused (Counterweight only). Rifle Gatling OpticKind follows Auto allowlist. GL Sight: ADS falloff meters stay hip×1.0 (arc). On Auto set MagFamily Drum → MagSize snaps to that Frame kit’s Drum default (not a global preset); MagSize 999 clamps to kit Drum max; OK: OmniVisor AMMO shows clamped MagSize / kit reserve, clip Drum (OV38); mesh unchanged; Firehand uses overrides. Jewelry Common + Phonon order matching a Demo Chord → Chord banner; Gem break → No Chord. Set Quality Uncommon → one prefix OR one suffix (other side locks); Augmented → 1+1; Rare → 2+2 + First/Second Word dropdowns (Name = e.g. Null Coil). Unique name + Artifact locked below gates. Set Quality Apex → 3+3, Unique name editable (hand-authored, not lexicon), Name mirrors Unique name, Artifact picker, default wells 6. Drop to Rare → Unique name cleared; lexicon Words return; affixes clamped to 2+2. Enter piece on an empty seat: refused until toggle ON. External build with Mod gated: O does nothing.
FS-GUN-010 — Shotgun Shot Type + pellet fan (Spread | Single)
Section titled “FS-GUN-010 — Shotgun Shot Type + pellet fan (Spread | Single)”Class Shotgun Frames author a Shot Type. This is orthogonal to Fire Mode (FS-GUN-008) and cadence (FS-GUN-007). It is not a player Refit toggle. The same pellet fields may be reused on specialty pellet Frames (e.g. Spread Shot HC).
Enum: Spread · Single.
| Shot Type | Projectile grammar | Pellet fields | Impact |
|---|---|---|---|
| Spread | Multi-pellet cone per trigger pull inside the Accuracy → Bloom cone (FS-GUN-002) | Frame PelletCount + PelletSpreadBase; Barrel PelletSpreadDelta (choke) |
Split across pellets (per-pellet Impact before resists) |
| Single | One projectile per trigger pull — same single-bullet grammar as Rifle / Hand Cannon / Sidearm / Scout | Force count = 1; ignore PelletSpreadBase and Barrel PelletSpreadDelta |
Full shot Impact on one hit |
DA_TFA_GunFrame fields (pellet / Shot Type):
| Field | Owner | Meaning |
|---|---|---|
ShotType |
Frame | Spread · Single. Required on Class Shotgun rows |
PelletCount |
Frame | Integer pellet count. Required when ShotType = Spread. Unused / forced to 1 when Single |
PelletSpreadBase |
Frame | Base fan size (band or float — numeric map later with TBD-style float sheet). Unused when Single |
DA_TFA_GunPart Barrel field:
| Field | Owner | Meaning |
|---|---|---|
PelletSpreadDelta |
Barrel (Shotgun keyed barrels; other pellet Frames when allowlisted) | Choke delta only. Ignored if equipped Shot Type = Single. Never changes PelletCount or ShotType |
Runtime (Firehand): EffectiveSpread = clamp(PelletSpreadBase + PelletSpreadDelta) and must stay inside the current Accuracy / Bloom cone. If ShotType = Single → one projectile; ignore spread fields. AA baselines never include PelletCount / PelletSpreadBase / PelletSpreadDelta (FS-GUN-008).
Year-1 Frame map (Shotgun × Shotgun):
| Frame | Shot Type | Cadence | Pellet fields |
|---|---|---|---|
| Aggressive | Spread | 55 RPM | Count + SpreadBase required (ints later) |
| Precision | Spread | 65 RPM | Count + SpreadBase required |
| Rapid-Fire | Spread | 140 RPM | Count + SpreadBase required |
| Lightweight | Spread | 100 RPM | Count + SpreadBase required |
| Pinpoint Slug Frame | Single | 70 RPM | Count = 1; spread N/A |
Future Shotgun Frames may author either Shot Type. Inspect shows Shot Type (and Pellet Count when Spread) beside Class · Receiver · Fire Mode · Frame · cadence.
Hard gates: Accessory parts never rewrite Shot Type or PelletCount (same invariant as Fire Mode). A Spread Frame cannot become Single by installing a Barrel; Barrel choke cannot change pellet count. DA_TFA_GunFrame rows for Class Shotgun must set ShotType; Spread rows must set PelletCount + PelletSpreadBase. Non-Shotgun Classes leave ShotType unset / N/A unless a specialty pellet Frame (Spread Shot HC) opts in. CSV import / Forge reject Shotgun rows with missing ShotType or Spread rows missing pellet fields. Firehand Bus branches: Spread → pellet fan inside Accuracy cone; Single → one projectile inside Accuracy cone.
Design authority: GDD Gun Family Frames · Shotgun · Aim Assist & Gunfeel (Accuracy / Bloom — pellet fan lock).
AC-GUN-001
Section titled “AC-GUN-001”Swap a barrel on an Augmented Auto: Recoil / Range change; Rotation assist, FOV, Fire Mode, and RPM do not. Same gun under Ladder tags: affix deltas ignored, frame baseline identical to Story.
AC-GUN-002
Section titled “AC-GUN-002”Spawn an Adaptive Auto (600 RPM) and an Adaptive Hand Cannon (140 RPM): both Inspect as Adaptive; fire intervals differ; Classes are Rifle vs Hand Cannon; Fire Modes are FullAuto vs Semi. Swap Mag / Barrel / Grip on the Auto: RPM stays 600; Receiver stays Auto; AA Magnetism baseline unchanged. Spawn High-Impact Auto (360 RPM) and Rapid-Fire Auto (720 RPM): cadences differ; both stay FullAuto Auto Receiver / Rifle Class. Spawn SMG and Sniper: both Class Rifle; SMG FullAuto, Sniper Semi. Spawn Fusion: Fire Mode Charge; Inspect shows charge ms; Frame Rapid-Fire Fusion = 500 ms still Charge. Fail the build if two DA_TFA_GunFrame rows on the same Receiver share Cadence. Fail if a Heavy Gun Frame row lists an Auto Receiver; if Sidearm Receiver lists Class Hand Cannon; if Rocket Receiver lists Class Grenade Launcher; if Crossbow Receiver lists Class Bow; if a Frame row sets FireMode Charge on an Auto Receiver.
AC-GUN-003
Section titled “AC-GUN-003”Spawn Heavy Gun Adaptive and Machine Gun Adaptive: different Classes and Receivers; Heavy Gun Stance = Handheld2H. Spawn Rifle × Gatling (1H allowed), Machine Gun × Gatling (1H allowed), and Heavy Gun × Gatling (Handheld2H only): three Class × Receiver keys; accessory kits do not cross. Attempt install of Rifle Gatling Barrel on Heavy Gun Gatling: refused. Attempt install of MG non-Gatling Barrel on Heavy Gun: refused. Open Inspect on Fusion: first accessory socket is Accel Coil (no Barrel). Open Inspect on Rocket: Tube. Open Inspect on Bow / Crossbow: Limbs / Prod/Limbs. Accel Coil Install on Trace refused. Spawn Hand Cannon and Sidearm: AA Stickiness bands differ (Sidearm High, HC Mid). Pulse Adaptive Burst Inspect shows Burst · 3; Pulse Heavy Burst (2) shows Burst · 2 without changing Receiver.
AC-GUN-004
Section titled “AC-GUN-004”Spawn Shotgun Aggressive (Spread) and Pinpoint Slug (Single): both Class Shotgun · Receiver Shotgun; Fire Mode remains Pump (or Rapid-Fire FullAuto when that Frame applies). Aggressive fires PelletCount pellets inside Accuracy cone; Slug fires one projectile. Swap Barrel on Aggressive: PelletSpreadDelta / Range may change; ShotType and PelletCount stay Frame-authored. AA Mag/Stick/Rot/Strafe unchanged by Barrel. Attempt to set ShotType on an Auto Frame row: rejected. Fail the build if a Shotgun DA_TFA_GunFrame row omits ShotType, or a Spread row omits PelletCount / PelletSpreadBase.
13. Character screen I and bags
Section titled “13. Character screen I and bags”FS-GUI-001 — One Character I screen, five tabs
Section titled “FS-GUI-001 — One Character I screen, five tabs”Hotkey I toggles. Tabs: Inventory · Combat · Tentacles · Ordnance · Channels. Tabs swap center only. Persistent: rotatable 3D paper doll, LOAD OUT (W1–W4 + PHYS SHIELD), stats strip (STR / DEX / CON / INT / WIS), Customizable 4×4, Shield / Armor / Health. Channels (W_TFA_I_Channels) is the scrollable damage / resist readout — not the attribute strip and not a skill tree. The Crafting Page (W_TFA_CraftingPage) is Inventory → Gear after maximize — not a sixth top tab, not an Inventory inner bag. Maximize layout is FS-GUI-008 (GDD still OV18).
When any I panel is maximized, Minimize (inward arrows) sits in the title bar left of the window X, same size, with a gap — never a wallet chip. Esc also restores. The red X still closes Character I.
Credits and BTUCOIN live on Character I persistent chrome — title bar only (W_TFA_IWallet). Layout, left → right: tabs (Inventory · Combat · Tentacles · Ordnance · Channels) · reserved gap · CREDITS chip · gap ≥ 16 px · BTUCOIN chip · gap · window X. Two sibling chips. They never overlap each other, never cover a tab, never cover the X. Not bag tiles. Not a second pair on the Inventory header. Not the menu roll W_TFA_Credits. LUMENAR is Marketplace Wallet only (FS-ECO-007 / FS-ECO-009) — not an I title-bar chip. BTUCOIN ticks from the player 49% of every BTUCOIN mint, including daily / weekly / hard-objective grants (FS-ECO-008).
No Map / Quests / social on I. Pause vs overlay is FS-SES-005 — this widget does not own world time.
FS-GUI-002 — Doll callouts
Section titled “FS-GUI-002 — Doll callouts”HELM head · AMULET neck · CHEST plate · BELT waist · BOOTS feet · GLOVES gauntlets · RING 1 / RING 2 hands (labels are Ring 1 / Ring 2, not Hands) · WRIST MELEE forearm razors (not a handheld knife) · ENERGY SHIELD Barrier field on torso (never a board).
FS-GUI-003 — Inventory inner bags
Section titled “FS-GUI-003 — Inventory inner bags”| Bag | Contents |
|---|---|
| Gear | Guns, armor. Click / right-click Inspect. No ammo. Ammo is FS-AMMO-001. Compact Forge chip auto-maximizes Forge (FS-GUI-008, OV18). Gear bag hides until Minimize. Forge needs empty Gear slots equal to the output (wide Frames = 2). Refit is Inspect (FS-CRF-008). |
| Socketables | Phonons, Gems, Jewels (one page) |
| Artifacts | Chips. Socket U/Apex. Sets are Unique / Apex item pieces (FS-ITM-004); Legendary never. Worn SetIDs are unlimited by count; only active Sets feed thresholds under ASBP (FS-ITM-004). The bag does not confer Set membership. |
FS-GUI-004 — Inspect
Section titled “FS-GUI-004 — Inspect”Up to 6 Phonon / Gem / Jewel sockets (hard cap). Birth count = base type + item level. Bore on Inspect spends Well Tap + Dual Stack Cells to open one more well, never a 7th (FS-CRF-010). Open empty wells draw numbered and take Phonons / Gems / Jewels. Unopened wells still draw to the 6 cap as locked (no drop), separate from parts. Artifact socket is not a Bore well. Inspect’s left column is a picker: Phonons / Gems / Jewels, plus an Artifacts tab on Unique / Apex. Drag an Artifact onto the Artifact socket (one per item). Click a filled well to return it. The Artifact tab is Inspect-only; Character I still has W_TFA_Bag_Artifacts (OV23). Unique / Apex Inspect may show authored Set name + piece index. Legendary Inspect never shows Set membership or an Artifact socket. Socketing or unsocketing an Artifact does not change Set piece status (FS-ITM-004). Weapon Inspect always shows the stat plate (Class + Receiver/Type + Frame + cadence string + Impact / Range / Stability / Handling / Reload / Mag or Cell / Recoil / Accuracy on guns; Damage / Block / Speed / Knockback / Channel on melee). Cadence and Impact are Frame — they do not ghost. Receiver and Class do not ghost. Unique / Apex also show one Artifact socket. Augmented / Rare guns show the structural Receiver (Type; not an Install target) and list five accessory part sockets with Refit on this Inspect (FS-CRF-008, FS-GUN-006): Barrel, Mag / Cell / Quiver, Optic, Stock / Brace, Grip. Melee lists Head, Guard, Haft, Weight, Core. Empty accessory sockets still draw (Receiver / melee-family baseline). Select an owned accessory variant to preview (stat plate ghosts + / −). Preview is free. Install writes one accessory socket and pays that socket’s Receiver / melee-family mix at the item’s rarity + Dual Stack Cells. Armor / jewelry / shields / Mechanical Arms / Legendary / Unique / Apex have no Refit and no Install. Dismantle previews yield first. Guns → unlock the matching Weapon Frame for that Receiver + Frame + rarity + mats, the Receiver finish key, and on Augmented / Rare each installed accessory variant. Melee → unlock the matching Weapon Frame for that melee family + Frame + rarity + mats, and on Augmented / Rare each installed part variant. Armor → unlock the matching Armor Blueprint for that armor type (slot × Light/Med/Heavy where it applies) + rarity + mats. That typed key stays accessible on the Crafting Page (FS-CRF-006). Socketed chips return to bag. Item is destroyed.
Rewrite is a separate Inspect chip (FS-CRF-009). Augmented / Rare guns, melee, armor, jewelry, and shields get Reroll and Change. Legendary / Unique / Apex get Reroll only — Change is hidden; empty wells cannot be filled. Mechanical Arms and Common never. Socketable jewel chips do not Rewrite.
Bore is a separate Inspect spend that opens one Phonon / Gem / Jewel well (FS-CRF-010). Well Tap is the reagent. Legendary / Unique / Apex may Bore up to 6. Chord bases and Mechanical Arms never.
Apex quality items expose Invoke Power on this full Inspect (socket) view only if the instance is world-found (FS-PRG-009). Crafted Apex (Crafting Page, Weapon Frame or Armor Blueprint + mats) does not. Legendary / Unique do not. Two-step confirm (break warning), then hold to invoke. If the item breaks, chips return to bag the same as dismantle — Invoke is not salvage (no Weapon Frame / Armor Blueprint).
Weapon trackers (FS-TRK-001): gun and melee Inspect only. Child strip W_TFA_Inspect_Trackers below the stat plate. Per item instance lifetime: Kills, Precision kills, Precision %, Assists, Damage dealt, Time equipped, Best kill streak. Server-owned on Online; local on Solo. Refit preview ghosts the stat plate — trackers do not ghost. Armor / jewelry / shields never draw trackers. Dismantle destroys the instance and its counts. Match Results expand rows show per-slot stats for that match only; Inspect shows lifetime on this item. Receiver / melee-family career totals on Collections → Weapons (FS-CAR-002).
FS-GUI-005 — Customizable dock + combat hotbar
Section titled “FS-GUI-005 — Customizable dock + combat hotbar”Customizable 4×4 (empowerment): 4 columns (loadouts L1–L4) × 4 rows (Ultimate 1–4). Drag learned Combat or Tentacle skills (or item-granted skills) from the tree tabs into cells — those skills empower that Ultimate in that loadout. Grenades cannot socket. Empty cells still draw. Active column highlighted; HUD pip is 1 of 4. Named Ultimate skills per subclass: TBD-016.
Combat hotbar (cast): six slots on Character I (mirrored under Energy on the play HUD). Drag Ultimate seats (rows from the dock / named Ultimates) and/or Combat-tree skills onto slots. Slot keys are fixed: Q · E · Z · X · C · F (FS-INP-001). A fast Ultimate recharge build can fill several slots with Ultimates; a slow recharge build can mix Combat skills for the interim. Tentacle skills never enter the hotbar — they mount on the Tentacles tab and toggle Active/Inactive with T. Grenades stay on Ordnance / G. V remains Vision, not a seventh hotbar key.
FS-GUI-006 — Tree tabs and Channels
Section titled “FS-GUI-006 — Tree tabs and Channels”- Combat: Offensive + Auras. Drag learned skills into the dock. Maximize expands the tree over the paper doll; stats and the Customizable dock stay.
- Tentacles: Set 1→2→3 (Off or Def per set). Pre-gate: Mechanical Arms in the center only; tree disabled. Maximize keeps the back doll and LOAD OUT.
- Ordnance: learn many, equip one. Stay out of the dock. Maximize keeps the front doll and grenade socket.
- Channels (
W_TFA_I_Channels): scrollable center list — Offense (Kinetic + eight energy), Defense (same nine resists), Core defenses (Shield / Armor / Health maxima, Barrier vs Phys Shield note, resist-cap reminder). Not a skill tree: scrollbar + wheel scroll only; no pan, no zoom. Maximize keeps the front doll and LOAD OUT; the list expands over stats and the dock. Exact outgoing-damage formula: data TBD. - Inventory maximize keeps the doll and LOAD OUT. Gear maximize is Forge filling the rest (FS-GUI-008, OV18). Socketables / Artifacts maximize is a full bag (OV26).
FS-GUI-007 — Widget map
Section titled “FS-GUI-007 — Widget map”| Widget | Notes |
|---|---|
W_TFA_CharacterI |
Root; CommonUI activatable |
W_TFA_PaperDoll |
Rotate; slot callouts |
W_TFA_LoadoutBar |
W1–W4 + Phys Shield |
W_TFA_StatsStrip |
STR DEX CON INT WIS + unspent |
W_TFA_CustomizableDock |
Persistent 4×4 |
W_TFA_Bag_Gear / _Socketables / _Artifacts |
Inventory inner bags only. Gear hides while Forge is open (FS-GUI-008). |
W_TFA_CraftingPage |
Child of Inventory maximize on Gear (OV18). Fills everything except doll and LOAD OUT; Gear bag hides. Occupancy used / cap on the workbench. Search + Armor / Weapons + Ranged / Melee + rarity; recipe list and world-mat rail each have their own scrollbar. Forge spends only if Gear bag has room. Same widget at hubs / field fabricators. |
W_TFA_CreditChip |
Do not ship a second pair. W_TFA_IWallet is the only I-screen wallet |
W_TFA_IWallet |
Title-bar pocket: CREDITS chip, gap, BTUCOIN chip, then (when a panel is maxed) Minimize left of X, then X. Persistent. Never overlaps tabs. GDD stills reserve this pocket empty, then paint the chips — never a wall-to-wall header. LUMENAR is Marketplace Wallet only |
W_TFA_Inspect |
Stat plate + chip sockets (open vs locked to cap 6) + Bore (Well Tap) + Artifact drop well on Unique / Apex + Refit preview / Install on Aug/Rare + Rewrite chip (Reroll+Change Aug/Rare; Reroll only L/U/Apex) + Apex Invoke + weapon trackers on guns / melee (FS-TRK-001) |
W_TFA_Inspect_Trackers |
Child of Inspect. Per-instance Kills / Precision kills / Precision % / Assists / Damage dealt / Time equipped / Best kill streak. Guns and melee only. (FS-TRK-001) |
W_TFA_MatchHistory |
Journey Match History + Social shortcut (FS-MCH-006) |
W_TFA_JourneyCareer |
Journey Career tab (FS-CAR-001) |
W_TFA_CollectionsMastery |
Collections Weapons tab (FS-CAR-002) |
W_TFA_Triumphs |
Journey Triumphs (FS-CAR-003) |
W_TFA_ModeAggregates |
Journey Modes (FS-CAR-004) |
W_TFA_LadderBoard |
Journey Ladder + queue read-only (FS-CAR-005) |
W_TFA_Inspect_Rewrite |
Child of Inspect. Reroll / Change one prefix or suffix. Etch pays. L/U/Apex: Reroll only — Change hidden. (FS-CRF-009) |
W_TFA_Inspect_Invoke |
Confirm + hold. Grants missing main classes (FS-PRG-009). |
W_TFA_Tree_Combat / _Tentacles / _Ordnance |
Center swap |
W_TFA_I_Channels |
Center swap. Scrollable offense / defense channel readout (OV35). Not a skill tree. |
FS-GUI-008 — Inventory maximize / Forge (OV18)
Section titled “FS-GUI-008 — Inventory maximize / Forge (OV18)”GDD still OV18. Compact Forge chip on the Gear header (or Inventory Maximize while Gear is selected) auto-maximizes Inventory.
Stay: paper doll, LOAD OUT, Inventory inner tabs (Gear / Socketables / Artifacts), Forge chip, W_TFA_IWallet.
Hide / yield: Gear bag (W_TFA_Bag_Gear); stats strip; Customizable dock; Shield / Armor / Health. W_TFA_CraftingPage fills everything other than the doll and LOAD OUT — not a 50/50 bag | workbench split.
Workbench chrome: search by name; Armor / Weapons chips; Ranged / Melee once Weapons is selected; rarity chip (All, or Common → Apex). World mats draw in a stack rail with its own scrollbar. Recipes scroll in their own column with its own scrollbar. Occupancy reads on the workbench (Gear bag used / cap). Not a Materials bag. Not a sixth top tab (Channels is the fifth).
Forge spend: output writes into the Gear bag. Refuse if that bag has fewer empty slots than the recipe needs (default 1; wide Frames 2) (FS-CRF-003). Dim the Forge control; a click does not write. Online combat / downed spend lock is FS-CRF-001.
Socketables / Artifacts maximize: full bag at slot size, no workbench (OV26). Inner-tab switch while Inventory is maxed on Gear restores Forge; switch off Gear hides the workbench and shows that bag.
Restore: Minimize (title bar, left of X) or Esc returns docked Inventory — Gear bag, stats, and dock visible again.
AC-GUI-001
Section titled “AC-GUI-001”Open I, rotate doll, switch all five top tabs: doll / LOAD OUT / dock / stats never rebuild. Switch Inventory inner tabs Gear / Socketables / Artifacts. Open Channels: center scrolls Offense / Defense / Core defenses; no tree pan or zoom. Open Inventory → Forge: auto-maximizes (FS-GUI-008, OV18); Forge fills everything except the paper doll and LOAD OUT; Gear bag is hidden; inner tabs and the Forge chip stay; occupancy reads on the workbench; the world-mat rail and the recipe list each have a scrollbar. Open Inspect on a Rare Trace: stat plate draws Class Directed Energy + Receiver Trace + Frame; five accessory part sockets (Barrel, Cell, Optic, Stock, Grip); Receiver is structural (not an Install target); chip sockets show open vs locked to cap 6 (lab starts HAB Trace at 2 of 6); Rewrite chip is visible; Bore is visible. Select Compensator: Range / Recoil ghost; Install is enabled; cadence string unchanged. Install writes Barrel. Bore spends Well Tap + Cells and opens one well; locked wells refuse chips; a 7th well is refused. Open Rewrite: select a filled prefix; Reroll + Etch writes a new name/band in the same group and does not change Frame, parts, or chips. Change on an empty suffix with a free sigil fills that well; a duplicate group is refused. Open Inspect on armor: no stat plate, no Refit, Rewrite is visible, Bore is visible. Open Inspect on Apex: stats + Artifact tab + Artifact socket + Invoke + Rewrite (Reroll only; Change hidden), no Refit, no Install, Bore is visible up to 6. Open Inspect on a Unique Set piece: Set name + piece index draw; Artifact well may be empty. Open Inspect on Legendary: Rewrite (Reroll only; Change hidden), no Artifact socket, no Set membership line. Drag an Artifact onto a Unique / Apex Artifact socket; numbered wells 1–6 refuse Artifacts and take Phonons / Gems / Jewels only. Attempt to socket an Artifact on Legendary: fail. Title bar shows CREDITS and BTUCOIN as two separate chips with a visible gap; neither covers Inventory / Combat / Tentacles / Ordnance / Channels; neither covers the X. Hip grenade slot is visible on the paper doll (Ordnance equip). Gear bag has no ammo tiles. Dismantle a socketed Rare: chips in Socketables / Artifacts, Frame/Blueprint granted on Crafting, item gone.
AC-GUI-002
Section titled “AC-GUI-002”Inspect a world-found Apex item while at least one main class is unowned: Invoke Power is visible. Inspect crafted Apex, Legendary / Unique / Rare: Invoke is hidden. With all three main classes owned: Invoke is hidden or disabled. Invoke confirm warns of break chance (TBD-030). After a successful grant, Combat chips show the new class(es) at the highest owned class level with Combat points equal to that class’s earned Combat budget. If the item breaks: chips in bag, item gone, no Frame/Blueprint. If it holds: item remains socketed. Server rejects Invoke on InvokeEligible = false (crafted stamp).
AC-GUI-003
Section titled “AC-GUI-003”Open I → Inventory → Forge (OV18 / FS-GUI-008): two columns only — doll + LOAD OUT left; Forge workbench fills the rest. No Gear grid. No stats strip. No Customizable dock. Inner tabs Gear / Socketables / Artifacts and the Forge chip stay. World-mat rail has its own scrollbar. Recipe list has its own scrollbar. Occupancy reads on the workbench. Forge with room writes into Gear. Fill the bag: Forge buttons dim; click is refused. Minimize (left of the window X) or Esc restores docked Gear bag + stats + dock. Switch to Socketables while still maxed: full bag, no workbench.
FS-GUI-009 — Secure Locker (W_TFA_SecureLocker)
Section titled “FS-GUI-009 — Secure Locker (W_TFA_SecureLocker)”Hub / station terminal only. Account overflow storage for unused equipment. Not a Character I top tab. Not the Armory foundry (discovered spines). Not Online coop Vault. Tab SKU expand: FS-ECO-014 (secure_locker_tab_slot).
Dual-pane chrome:
| Pane | Label | Grid |
|---|---|---|
| Left | CHARACTER GEAR (Gear · Socketables · Artifacts) | 10 × 6 = 60 cells |
| Right | SECURE LOCKER (selected tab) | 12 × 12 = 144 cells |
Center transfer rail: DEPOSIT → / ← WITHDRAW. Title bar: Account + realm chip + LUMENAR (Buy Tab) — not CREDITS / BTUCOIN I-bar chips. Six free tabs (rename + symbol + accent). More tabs cost LUMENAR. Occupancy reads tab used / 144.
Transfer:
- Deposit: select bag tile → DEPOSIT →; or drag bag → Locker (or onto a tab chip); right-click / double-click deposits to the active tab when space allows.
- Withdraw: select Locker tile → ← WITHDRAW; or reverse drag / double-click / right-click. Refuse if Gear lacks a free footprint rect (FS-GUI-010). Equipped seats must unequip to bag first.
- Search: name, type, quality, slot, sort; scope Current tab or All tabs. Search never moves items.
Account-bound per realm (Solo local · Online EOS PUID). Shared across that realm’s characters. Deposit / withdraw does not flip InvokeEligible. Online: server fail-closed outside hub, in combat, or downed.
Lab: #ux-secure-locker. Still: figures/secure_locker_hub.jpg. GDD: In-Game GUIs → Secure Locker.
AC-GUI-004
Section titled “AC-GUI-004”Open Secure Locker at a hub: left CHARACTER GEAR 10×6, right Locker 12×12, center DEPOSIT → / ← WITHDRAW. Deposit a chest (2×3) into a free Locker rect. Withdraw into a full Gear bag: refuse; bag unchanged. Buy Tab spends LUMENAR only. Outside hub / in combat: open refused.
FS-GUI-010 — Rectangular bag footprints
Section titled “FS-GUI-010 — Rectangular bag footprints”Multi-cell rectangular Gear footprints — not uniform 1×1 slots. Contract with FS-GUI-009, FS-AMMO-001, FS-GUI-008 / FS-CRF. Catalog: tfa_gdd_html/data/tfa_item_footprints_v2.json (+ cook CSV tfa_gdd_html/data/DT_TFA_ItemFootprints.csv → UE DT_TFA_ItemFootprints). Design: docs/superpowers/specs/2026-11-11-item-footprints-storage-design.md. Matrix still: figures/item_footprints_matrix.jpg.
| Surface | Holds | Size rule |
|---|---|---|
| Character I Gear / Secure Locker gear pane | Guns, melee, armor, jewelry, shields, Mechanical Arms, Refit modules | Authored W×H (modules always 1×1) |
| Socketables | Phonons, Gems, Jewels | 1×1 only |
| Artifacts | Artifact / Set chips | 1×1 only |
| Crafting rail (Forge) | Dual Stack Cells, Frames, Blueprints, world mats, Kha-Shards, Well Tap | Stack chips — not Gear cells |
| HUD counters | Field / Specialist / Siege ammo; Ordnance charges | Never a bag tile |
| Currency chips | Credits, BTUCOIN, LUMENAR | Never a bag tile — No Credits / BTUCOIN / LUMENAR tiles in bags |
Rules: rectangles only — no L / T / diagonal. Quality / Unique / Apex / sockets / affixes do not change size. Light / Med / Heavy armor = same footprint. 90° rotate on Gear / Locker. Forge / deposit needs a free rectangle.
Guns (Class × Receiver, unrotated examples): Sidearm / Hand Cannon 2×1 · Rifle SMG 2×2 · Rifle Auto / Pulse / Scout / Trace 3×1 · Shotgun | 3×2 · Sniper / Linear Fusion 4×1 · Crossbow 2×3 · Bow | 2×4 · DE Fusion / Machine Gun / Gatling / GL 3×2 · Heavy / Rocket / Crown 4×2.
Melee: wrist/dirk 1×2 · 1H 1×3 · staff 1×4 · 2H sword 2×3 · polearm 2×4.
Armor / jewelry: ring / amulet / Refit modules 1×1 · belt 2×1 · helm / gloves / boots / Energy Shield 2×2 · chest / Phys Shield / Mechanical Arms 2×3.
Grid sizes: Gear 10 × 6 = 60. Secure Locker tab 12 × 12 = 144.
Active Sets budget ASBP=6 multi-active is Year-1 ship surface (TBD-072 | Closed — ships multi-active; no single-Set Year-1 clamp).
14. Progression
Section titled “14. Progression”FS-PRG-001 — Character level
Section titled “FS-PRG-001 — Character level”XP from kills and completed tasks. Fill bar → +1 level. Level / unspent points live on I only (no visor XP bar). Level cap, XP curve, task vs kill weighting: TBD-017. Multiclass XP tax still applies when more than one main class is owned; it does not replace this loop. FS-PRG-009 Apex Invoke grants missing classes without the Combat-tab Unlock Commit; owning more than one class still applies the tax to later class XP.
FS-PRG-002 — Stat points
Section titled “FS-PRG-002 — Stat points”On level up, grant stat points (TBD-018 — the number that must be written before tuning). Manual assign on I. Working attributes and Year-1 / Demo lab feeds (dialable in Demo Mod — raw points and per-pt formulas):
| Stat | Feeds | Lab defaults (per point) |
|---|---|---|
| STR | Melee ED%; melee knockback/stagger; encumber soft (cuts Heavy armor / 2H move penalty — never blocks equip) | +1.5% melee ED · +2% knockback · −0.5% of encumber penalty (cap 100% of penalty) |
| DEX | AR; handling feel; weapon swap ms; light move % | +2 AR · −8 ms swap (floor 200 ms) · +0.15% move |
| CON | Max Health; trauma duration resist | Base HP 200 + +12 HP · −0.4% trauma |
| INT | Skill Energy max; skill CD shave | +1 Energy max · −0.3% skill CD |
| WIS | Aura upkeep discount; tentacle Energy cost | −0.5% aura upkeep · −0.4% tentacle cost |
Encumber baselines (before STR resist): Heavy armor −12% move · 2H gun/melee −8% move (Demo dials). Frame cadence (RPM / charge / draw ms) is not attribute-authored (FS-GUN-007). Flow Overclocked +30% move stays Flow-only (FS-CMB-004).
Energy is a pool, not a sixth assignable attribute. Older GDD volumes that say Vit / Energy-as-stat are superseded. Stat respec: TBD-019. Design: docs/superpowers/specs/2026-10-26-demo-combat-economy-stats-design.md.
FS-PRG-003 — Skill-tree points
Section titled “FS-PRG-003 — Skill-tree points”Separate budget from stat points. Grant per level: TBD-020. Limited respecs are the GDD direction for skills.
FS-PRG-004 — Combat tree
Section titled “FS-PRG-004 — Combat tree”One tree: offensive verbs + auras. Offensive drains Energy. Auras: per-skill upkeep / pulse / gain. Both can enter Customizable. Exact nodes per Order / Faction / Subclass: TBD-021.
Create grants the main class only (faction chip). UnlockedSubclassCount starts at 0. Subclass trees T1–T5 stay locked until their class-level gate. They open in roster order, one after another — T1, then T2, then T3, then T4, then T5. Never skip a tier. Never pick a subclass out of order. Never choose a subclass on Create Character. Thresholds: DT_TFA_SubclassUnlock (TBD-029). Combat tab: locked subclass tabs are preview-only; spend / refund / Use on a gated tree is rejected until that count increments.
When the origin (or multiclass) class level crosses the next TBD-029 row, increment UnlockedSubclassCount by 1 (cap 5) and set ActiveSubclass to that roster row if it was null. Reset Campaign keeps this count.
Combat-tab Unlock Commit starts that class at level 1, UnlockedSubclassCount = 0, and the usual XP tax. Apex Invoke is a separate grant path (FS-PRG-009).
FS-PRG-005 — Tentacles
Section titled “FS-PRG-005 — Tentacles”HARD LOCK: max 3 sets × 2 tentacles. Each set is Offensive or Defensive, never mixed inside a set. Unlock Set 1 → 2 → 3 by character level (thresholds TBD-022). Mixed loadouts across sets are valid.
Active / Inactive: mounted tentacles are either Active (deployed / usable) or Inactive (retracted). Toggle with T on-foot (FS-INP-001). This does not flip Offensive ↔ Defensive — skill polarity stays authored. Tentacles do not occupy the combat hotbar.
Mechanical Arms gate: before Set 1, Tentacle tree is disabled. Worn pair is Off or Def, one attribute, no Prefix/Suffix, lowest Tentacle skills only. Gate level ≤ Set 1. When Set 1 unlocks, Arms UI retires in favor of sets.
FS-PRG-006 — Ordnance
Section titled “FS-PRG-006 — Ordnance”One shared tree for every operative. Ordnance Core is free (unlocks HUD pip). Four families × three = twelve types. Learn many, equip one. After any three learned, equip one Ordnance mod. After any two learned, Support family unlocks.
| Family | Types |
|---|---|
| Impact | Kinetic Brick, Fission Cap, Plasma Skip |
| Adhere | Arc Spike, Isotopic Seed, Void Well |
| Deny | Thermal Fan, Cryo Canister, Toxin Bloom |
| Support | Barrier Charge, Pulse Echo, Soft Cover |
Mods: Quick Fuse · Heavy Payload (max charges 2→3, slower regen) · Channel Bleed.
Charges: own pool, max 2 (3 with Heavy Payload). One charge regenerates slowly. Field bricks / pickups refill the equipped type only. Does not drain Skill Energy. Swap from Ordnance tab or weapon wheel, not a second HUD bar. Fission Cap optional Siege-brick cook: TBD-023.
FS-PRG-007 — Customizable → Ultimates
Section titled “FS-PRG-007 — Customizable → Ultimates”Active loadout’s four sockets tag the Ultimate on cast (damage, count, duration, radius, Energy economy, extra tentacle discharges, aura pressure). Exact tag→modifier maps: TBD-024. Dock does not passively drain Energy.
FS-PRG-008 — Ability implementation
Section titled “FS-PRG-008 — Ability implementation”Every Combat / Tentacle / Ordnance / Ultimate node is a Gameplay Ability with a Gameplay Tag. Grant on learn. Customizable stores ability tags, not widget pointers. Tentacle sets are components that grant/remove abilities when mode or unlock changes.
FS-PRG-009 — Apex Invoke Power
Section titled “FS-PRG-009 — Apex Invoke Power”Apex quality can be found (world / mission / pinnacle loot) or crafted (Weapon Frame or Armor Blueprint + materials on the Crafting Page, by item type). Both are Apex for stats, Artifact sockets, Ultimate synergy, and may feed Sets (FS-ITM-003, FS-ITM-004).
Invoke Power is on Inspect (full socket view) only for world-found Apex. Crafted Apex never offers Invoke. Legendary / Unique never offer Invoke.
Stamp at creation, server-authoritative, persist on the instance:
| Origin | How it appears | InvokeEligible |
|---|---|---|
| World-found | Loot, mission reward, named drop, world lottery | true |
| Crafted | Crafting Page recipe using Frame / Blueprint + mats | false |
Trade, mail, stash, and dismantle do not flip the stamp. A client cannot set InvokeEligible.
On a confirmed invoke of a world-found Apex:
- Take the player’s highest owned main class (max
class.level; ties: origin first). - Grant every unowned main class (Enforcer / Arcwarden / Phantom). Already-owned classes are unchanged.
- Each granted class:
class.leveland class XP match the highest class.UnlockedSubclassCountis the TBD-029 row for that class level (same gates as if that class had been leveled there).ActiveSubclass= first unlocked roster row if it was null. - Grant Combat skill points on each new class equal to the highest class’s earned Combat budget (unspent + spent on that class’s Combat tree). Tentacle / Ordnance / stat points are not copied. The player can spend those points to match the highest class’s Combat investment.
- Do not run Combat-tab Unlock Commit. Do not start the new class at level 1. Invoke itself does not charge the XP tax; after the grant, multiclass tax applies because more than one class is owned.
- Then roll break chance TBD-030. Do not invent a percentage. On break: destroy the Apex item; socketed Phonons / Gems / Jewels / Artifact return to bag; no salvage Frame/Blueprint. On hold: the item stays.
If all three main classes are already owned, or the item is crafted / not Apex / not world-found, Invoke is unavailable (no roll, no consume). Fail closed.
GDD lock plates (HTML figures): lock_gui_apex_invoke.svg, lock_gui_apex_origin.svg, lock_gui_apex_paths.svg, lock_gui_apex_inspect_gate.svg. Rebuild: python tfa_gdd_html/figures/build_apex_invoke_locks.py.
AC-PRG-003
Section titled “AC-PRG-003”Enforcer origin at class level L with Combat earned P. Inspect a world-found Apex. Invoke. Arcwarden and Phantom become owned at class level L, subclass gates per TBD-029 at L, Combat unspent P each. Enforcer unchanged. Repeat with all three owned: Invoke hidden. Legendary Inspect: Invoke hidden. Inspect a crafted Apex of the same package: Invoke hidden; Invoke RPC fails closed.
AC-PRG-001
Section titled “AC-PRG-001”Level up → unspent stats on I, not on HUD. Before Set 1, Tentacles tab shows Mechanical Arms only. Equip Kinetic Brick, throw twice, confirm Energy unchanged and charges = 0. Socket a grenade into Customizable: rejected.
AC-PRG-002
Section titled “AC-PRG-002”New Enforcer: UnlockedSubclassCount = 0. Combat tab is main class; T1 Berserker through T5 Seraph are preview-only. Drive the class through DT_TFA_SubclassUnlock (TBD-029): T1 opens first, then T2 Vanguard, then T3 Shock Trooper, then T4 Battle Master, then T5 Seraph. T3 must stay locked while T2 is still locked. Combat points on a still-gated tree are rejected. Magus and Hidden follow their roster rows in FS-PRD-004. A create-time Vanguard (or any other starting subclass) fails this test.
15. Itemization
Section titled “15. Itemization”FS-ITM-001 — Quality vs base tier
Section titled “FS-ITM-001 — Quality vs base tier”Base tier (Normal / Exceptional / Elite = Operative / Veteran / Apex fiction) is independent of quality:
Common → Uncommon → Augmented → Rare → Legendary → Unique → Apex.
Quality Apex ≠ Apex Threat difficulty ≠ Elite base-tier fiction.
FS-ITM-002 — Augmented / Rare
Section titled “FS-ITM-002 — Augmented / Rare”- Augmented: at most 1 Prefix + 1 Suffix.
- Rare: up to 3 Prefix + 3 Suffix; equal chance of 3 / 4 / 5 / 6 mods; 50/50 then reject if side at 3 or group already present. Cosmetic First Word + Second Word (no stats). Second Word gated by item family.
- Same affix group cannot stack twice.
- Staff / Scepter: no AR / ED combat prefixes.
- Mechanical Arms: never roll Prefix/Suffix.
- Armor: Light / Medium / Heavy only. No modular armor parts. Former modules are affix families (Plating → Trauma Weave).
- Level requirement ≈ 75% of highest affix level on the item.
Full name/effect catalog stays in GDD vol. 04. Engine consumes DT_TFA_Affixes with group IDs.
FS-ITM-003 — Legendary / Unique / Apex
Section titled “FS-ITM-003 — Legendary / Unique / Apex”Hand-authored packages. Not modular kits. Not Phonon Chord bases. Same prefix and suffix count on Legendary and Unique — affix slot count is not the difference.
Shared: Rewrite Reroll only (no Change), no Refit, no Stamp / Coda on craft. Nanite Residue on craft. Craft reprints the designer package (no new affix rolls at forge). Never Invoke. Unique salvage does not pay Legendary recipes (FS-CRF-007).
Legendary never carries a Set ID. Spawn and cook fail-closed if a Legendary row authors one (SetID none, PieceIndex 0). Equipping it never feeds 2 / 3 / 4 / 5 / 6-piece bonuses. Legendary has no Artifact socket.
Unique is authored either standalone (no Set ID) or as a named Set piece (Set ID + piece index). A Unique with a Set ID counts as that piece while equipped, with or without an Artifact in the well.
Exactly one Artifact socket on Unique unless a Unique explicitly disables it. Apex primary payoff is Ultimate-facing and may feed Sets (optional Set ID + piece index on the Apex item, same count rule as Unique). Apex also has exactly one Artifact socket unless disabled.
Apex quality Inspect offers Invoke Power only on world-found Apex. Crafted Apex does not. Full grant / break rules: FS-PRG-009. Quality Apex ≠ Apex Threat difficulty ≠ Elite base-tier fiction.
FS-ITM-004 — Artifacts / Sets
Section titled “FS-ITM-004 — Artifacts / Sets”Server item instance fields: Quality, SetID (Name; none unless Unique / Apex), PieceIndex (ignored if SetID is none), ArtifactSocket (optional chip ID).
Player / loadout fields: ActiveSetIDs (Name array; server-validated).
- Artifact sockets only on Unique and Apex.
- One Artifact per item. Separate from the 6 normal sockets.
- Set membership is on the Unique / Apex item, not the chip.
- Worn (unlimited by Set count): across the 15 paper-doll slots, Unique / Apex pieces may carry any mix of
SetIDs. Distinct worn Sets are capped only by slots and authored set sizes (not every Set is 6 pieces). Legendary never carriesSetID. - Active (budgeted): only Sets in
ActiveSetIDsfeed 2→6 thresholds. Inactive worn Set pieces keep looks, slots, Origins, Traits, and Artifacts — they contribute zero Set ladder power. - Equipped count (per
SetID, server): for each of the 15 paper-doll slots, if the equipped item is Unique or Apex anditem.SetIDmatches thatSetID, add 1. Empty Artifact well still counts. Duplicate slots still count as separate pieces. - Active Set Budget Points (ASBP): base ASBP = 6. Cost of each active Set = that Set’s equipped count. Legal iff
sum(costs of ActiveSetIDs) ≤ ASBP. Activating a Set whose equipped count is < 2 is refused (no threshold at 1). Server refuses illegal toggles; the last illegal pick does not stick. - Independent ladders: each active Set evaluates its own 2 / 3 / 4 / 5 / 6 thresholds from its own equipped count. No cross-Set piece pooling.
- Illegal under ASBP 6 (examples): 5+2, 4+4, 3+3+3, 6+anything. Legal examples: one 6; 4+2; 3+3; 2+2+2; 5 alone; 3+2.
- Character I exposes an Active Sets strip (LOAD OUT / doll chrome): dynamic list of every worn SetID · equipped
n· pips · toggle · budget meterused / 6. Inspect still shows per-item Set name + pips (membership only). Year 1 ships the full multi-active budget (TBD-072 | Closed). Store / validate against ASBP=6. - Legendary fail-closed:
SetIDalways none; no Artifact socket. Rare and below cannot host Artifacts and cannot carry a Set ID. - Thresholds 2 / 3 / 4 / 5 / 6-piece. All 15 eligible slots can feed equipped counts, including W1–W4, Wrist, Phys Shield — only Unique / Apex pieces in those slots.
- Set bonuses never retune Aim Assist baseline or camera verbs.
- Socket / unsocket Artifacts on Crafting Page (cost TBD-025). That spend does not grant, revoke, or change Set membership or
ActiveSetIDs.
FS-ITM-005 — Gems
Section titled “FS-ITM-005 — Gems”11 types × 5 tiers (Chipped → Perfect) × 4 contexts (weapon / helm / armor / shield) = 220 fixed outcomes.
Channel map: Ruby Thermal · Sapphire Cryo · Topaz Arc · Emerald Toxin · Gammitite Isotopic · Nucleite Fission · Helion Plasma · Nullite Void. Utility: Amethyst, Diamond, Siphonite.
Crafting Page: 3× same tier → 1× next (optional material tax). Socketing permanent until unsocket recipe destroys socketables (GDD). Dismantle of the item returns chips to bag — different path from unsocket recipe.
FS-ITM-006 — Jewels
Section titled “FS-ITM-006 — Jewels”1×1 chips. Augmented 1–2 affixes, Rare up to 4, Unique Rainbow Facets (+% skill damage and −% enemy resist per channel).
FS-ITM-007 — Phonons
Section titled “FS-ITM-007 — Phonons”Shards = Sanskrit letters A → Ma. Chords = Sanskrit words in exact order on white/gray socketed bases, socket count = Chord length. Bore / Well Tap cannot change Chord length. Artifact socket is never consumed by a Chord. Chords never gate camera, Flow, or Aim Assist baseline. HPS (Nna–Ma) = endgame trade currency. Full recipes stay in GDD vol. 08 (DT_TFA_PhononChords).
FS-ITM-008 — Equip requirements
Section titled “FS-ITM-008 — Equip requirements”Str / Dex (and Energy where listed) gate equip. Reduced Requirements affixes apply. Fail = cannot equip (slot rejects).
FS-ITM-009 — Master lists as data, not code
Section titled “FS-ITM-009 — Master lists as data, not code”Named melee triples (98), armor / shield / jewelry triples (69), gun Receivers (Types) + Classes, and Unique spreadsheet are Data Assets. Code knows Receivers / Classes / melee families, slots, and quality rules — not individual nameplates.
AC-ITM-001
Section titled “AC-ITM-001”Roll a Rare: ≤3 prefix and ≤3 suffix, no duplicate group. Attempt Artifact socket on a Rare: fail. Assemble a Chord on an Augmented base: fail. Assemble on a white base with exact sockets and order: succeed. Camera / AA unchanged.
FS-ITM-010 — Trait vs Origin quality gate
Section titled “FS-ITM-010 — Trait vs Origin quality gate”Lock 2026-11-13d. Weapons and armor / shields carry named Trait columns by quality. Jewelry has no Trait columns and no Origin lane from this system.
Weapons (guns / melee)
| Quality | Trait columns | Origin / Set |
|---|---|---|
| Common | — (none) | — |
| Uncommon | Verb | — |
| Augmented | Feed + Verb | — |
| Rare | Bullets + Feed + Verb | — |
| Legendary | Bullets + Feed + Plate + Verb | — |
| Unique | Bullets + Feed + Plate + Verb (same as Apex) | 1 Origin · optional SetID (FS-ITM-004) |
| Apex | Bullets + Feed + Plate + Verb (same as Unique) | 2 Origins (OriginId + OriginId2) · optional SetID |
Armor / shields — same unlock counts; armor-native columns:
| Quality | Trait columns | Origin / Set |
|---|---|---|
| Common | — (none) | — |
| Uncommon | Verb | — |
| Augmented | Stride + Verb | — |
| Rare | Shell + Stride + Verb | — |
| Legendary | Shell + Stride + Brace + Verb | — |
| Unique | Shell + Stride + Brace + Verb | 1 Origin · optional SetID |
| Apex | Shell + Stride + Brace + Verb | 2 Origins · optional SetID |
Feed (weapons) player label = {MagFamily} Spec (Cell Spec, Drum Spec, …). Crafting Refit unchanged — Feed is a Trait column, not a Mag Install. Shell / Stride / Brace are armor-only columns (not gun Feed/Bullets/Plate). Stride never rewrites movement mechanics (sprint/slide/wall/jump) — only soft DR / gun settle in those states. No mantle/vault (FS-MOV-003).
Stacking: One active Trait per unlocked column. Unique 1 Origin; Apex 2 Origins. Rare/Legendary never Origin. Set Unique/Apex only. Jewelry never Traits/Origins from this gate. Refit never writes Trait column ids or Origins.
Instance fields: guns — traitVerbId · traitFeedId · traitBulletsId · traitPlateId (+ mags). Armor/shields — traitVerbId · traitStrideId · traitShellId · traitBraceId (+ mags). Jewelry — none of these Trait fields.
Modes: AlwaysOn or Ambient only. Ambient may use normal-play triggers (on_hit, on_kill, while_ads, below_hp, …). Banned: stack-to-empower activation chores; writes to Fire Mode, Aim Assist, FOV, or camera verbs.
Does not replace: affixes, Receiver / Frame, Refit parts, Phonon / Gem / Jewel wells, Artifact chips. Refit parts never author Traits or Origins.
Catalog rows: TBD-058 (weapon Traits), TBD-059 (armor Traits), TBD-060 / TBD-061 (Origins). Names + modes + effects + column in docs/superpowers/specs/tfa_trait_origin_catalog_v1.json. Magnitudes still TBD.
FS-ITM-014 — Field Spec slots (guns + melee)
Section titled “FS-ITM-014 — Field Spec slots (guns + melee)”Lock 2026-11-13 (extended 2026-11-13e for melee). Weapon combat-plug lane. Player word: Field Spec (not “mod,” not Trait, not Mag Install, not Shiv Spec, not Demo Mod chrome).
Guns + melee. Armor / jewelry / Phys Shield / ES: 0 slots.
| Quality | Field Spec slots |
|---|---|
| Common · Uncommon · Augmented | 0 |
| Rare | 1 |
| Legendary | 2 |
| Unique | 3 |
| Apex | 4 |
Instance fields: fieldSpecId1 … fieldSpecId4. Distinct ids per piece. Adept catalog rows Unique/Apex only. Catalog rows carry lanes (gun / melee / both). Capacity Specs (mag/reserve) are guns only.
Capacity Specs (e.g. Reserve Bandolier, Deep Clip) add magDelta / reserveDelta on top of kit MagSize / reserve for OmniVisor HUD (FS-GUN-012 · OV38). Soft Magnets never rewrite Receiver AA baselines (FS-GUN-008). Melee Specs never write MagSize.
Catalog: Programming Bible docs/inventory/demo-mod-field-specs.md · mock FIELD_SPEC_CATALOG. Year-1 live set 26 rows (FS-01…FS-26; shared + gun-only + melee-only).
FS-ITM-015 — Shiv Spec socket (Unique / Apex weapons)
Section titled “FS-ITM-015 — Shiv Spec socket (Unique / Apex weapons)”Lock 2026-11-13e (rename 2026-11-13f). Unique/Apex exclusive upgrade lane. Player word: Shiv Spec.
Unique + Apex only · guns + melee · 1 socket (shivSpecId). Armor / jewelry / Phys Shield / ES / Common→Legendary: 0.
Catalog is per Unique/Apex nameplate (hand-authored when that weapon is designed). Until a nameplate has rows in SHIV_SPEC_BY_UNIQUENAME, the socket shows stub SHIV-TBD. Effects remain TBD until that weapon’s fantasy is locked.
Does not replace: Field Spec · Trait / Origin · Masterwork · Artifact · Invoke · Mag Install.
Docs: docs/inventory/demo-mod-shiv-specs.md · mock SHIV_SPEC_*.
FS-ITM-011 — Equipped aggregate order
Section titled “FS-ITM-011 — Equipped aggregate order”Server (Online) / local Solo applies equipped power in this order after slot intrinsics:
- Affixes / authored package stats
- Per-piece Trait columns (active ids for unlocked columns)
- Per-piece Origin (Unique 1 · Apex 2 via
OriginId2) - Per-piece Field Specs (FS-ITM-014 — guns + melee; Rare→Apex slots)
- Per-piece Shiv Spec (FS-ITM-015 — Unique/Apex guns + melee; when completed)
- Socket chips (Gem / Jewel / Phonon / Chord)
- Active Set thresholds (FS-ITM-004)
- Artifact chip power
- Authored exclusive verbs on Unique / Apex nameplates when present
- Masterwork finish soft layer (FS-ITM-013) when ranked
Inspect shows one strip per unlocked Trait column — guns: Feed labeled {MagFamily} Spec · Bullets · Plate · Verb; armor/shield: Shell · Stride · Brace · Verb; jewelry: no Trait strips — plus Origin strip(s) on Unique / Apex, Field Spec pips on guns and melee Rare→Apex, Shiv Spec pip on Unique/Apex weapons, Set 2–6 pips when SetID is present on Unique/Apex, plus Familiarity / Masterwork chrome (FS-ITM-013).
FS-ITM-012 — Data, not code
Section titled “FS-ITM-012 — Data, not code”Trait / Origin / Set-perk catalogs are Data Tables / Data Assets (DT_TFA_WeaponTraits, DT_TFA_ArmorTraits, DT_TFA_OriginTraits, DT_TFA_SetBonuses / DA_TFA_Set). Code knows quality gate, mutual exclusion, apply order, and bans — not individual verb names.
FS-ITM-013 — Familiarity and Masterwork on gear instances
Section titled “FS-ITM-013 — Familiarity and Masterwork on gear instances”Two orthogonal meters on weapon/armor instances:
- Familiarity — earned while that instance is equipped (style-weighted combat credit on weapons; worn-performance on armor / jewelry / ES).
- Masterwork — Crafting Page only (FS-CRF-012); requires Familiarity gate rank.
Neither replaces Power / ARL. Caps tune gunfeel / Trait mag / chrome — not raw TTK spikes. Refit / Rewrite / Bore do not reset Familiarity or Masterwork. Dismantle destroys both with the instance.
Instance fields: familiarityXp, derived familiarityRank, masterworkRank. See design docs/superpowers/specs/2026-11-11-gear-familiarity-masterwork-design.md. Costs/curves TBD-065…068.
AC-ITM-003
Section titled “AC-ITM-003”Guns: Spawn Common: no Trait columns; Origins empty; Field Spec slots 0; Shiv Spec 0. Spawn Uncommon: Verb only; Field Spec 0; Shiv Spec 0. Spawn Augmented: Feed+Verb; Field Spec 0; Shiv Spec 0. Spawn Rare: Bullets+Feed+Verb; Origins empty; SetID none; Field Spec 1; Shiv Spec 0. Spawn Legendary: Bullets+Feed+Plate+Verb; Origin empty; Field Spec 2; Shiv Spec 0. Spawn Unique with Set A: four Trait columns + one Origin + SetID; Field Spec 3; Shiv Spec socket 1 (SHIV-TBD until nameplate authored). Spawn Apex: four Trait columns + OriginId + OriginId2; optional Set; Field Spec 4; Shiv Spec 1. Attempt Adept Field Spec on Rare: fail. Attempt Field Spec on armor/jewelry: fail. Attempt Shiv Spec on Legendary or armor: fail. Equip Reserve Bandolier: OmniVisor MagSize/reserve gain catalog deltas.
Melee: same Field Spec quality ladder as guns (Rare 1 … Apex 4); melee-lane Specs only (no Capacity mag Specs). Unique/Apex melee: Shiv Spec 1 (per-name TBD). Phys Shield / ES: Field Spec 0, Shiv Spec 0.
Armor/shields: same quality curve with Shell·Stride·Brace·Verb (Augmented = Stride+Verb; Rare = Shell+Stride+Verb; L/U/Apex = Shell+Stride+Brace+Verb). Jewelry: spawn at any quality → no Trait column ids and no Origin from this gate. Field Spec / Shiv Spec never on armor/jewelry.
Attempt Origin on Legendary: fail. Attempt OriginId2 on Unique: fail. Attempt Set on Rare: fail. Attempt Trait column write on jewelry: fail.
AC-ITM-002
Section titled “AC-ITM-002”Spawn a Unique with Set ID A, piece 1, empty Artifact well: equip it; equipped count for A is 1; toggle A into ActiveSetIDs is refused (< 2). Attempt to socket an Artifact on a Legendary: fail. Unequip the Unique: equipped count for A is 0. Spawn a Legendary whose data row authored a Set ID: instance SetID is none, no Artifact socket, and it never feeds bonuses. Spawn an Apex with Set ID A, piece 2: equip it with the Unique; equipped count for A is 2; activate A succeeds (cost 2, ASBP used 2/6); 2-piece threshold for A is live. Equip a second Set B to equipped count 4 while A stays active at 2: activate B succeeds (2+4=6). Attempt to activate a third Set C at equipped count 2 while A+B are active: refuse (sum would be 8). Deactivate B, then activate C at 2: succeed (A+C = 4). Equip Set D to 6 and attempt activate D while any other Set is active: refuse. Forge a Unique: output reprints the DA Set ID; the player cannot pick a Set ID on the workbench. Rewrite / Refit / Bore / Install refuse to write SetID or PieceIndex.
16. Crafting and salvage
Section titled “16. Crafting and salvage”FS-CRF-001 — No Cube
Section titled “FS-CRF-001 — No Cube”There is no Cube inventory item. All synthesis happens on the Crafting Page.
The Crafting Page is the Inventory → Gear maximize workbench (W_TFA_CraftingPage, FS-GUI-008, OV18). Doll and LOAD OUT stay; the Gear bag hides; stats / dock yield so Forge fills the rest of Character I. Inner tabs Gear / Socketables / Artifacts stay. World mats and recipes each have their own scrollbar. Occupancy reads on the workbench. It is not a fifth top tab and not an Inventory inner bag. This page Forges new gear. Forge is refused if the Gear bag has no room for that output (wide Frames need two empty slots). Refit is on that item’s Inspect (FS-CRF-008). Rewrite is also Inspect (FS-CRF-009). Bore is also Inspect (FS-CRF-010).
Hubs and unlocked field fabricators host the same page with a station bonus (exact bonus TBD) — not exclusive access.
Overlay spend lock (Online): catalog browse is allowed while I is open. Forge / Refit / Rewrite / Bore / repair / other spends fail closed while in combat or downed. Server rejects spends that fire during a lock. Solo pause has no extra gate.
Intentionally expensive.
FS-CRF-002 — Breakdown
Section titled “FS-CRF-002 — Breakdown”Destroy item → unlock that typed Weapon Frame or Armor Blueprint for this character (FS-CRF-005, FS-CRF-006) + mats. Augmented / Rare guns also unlock the Receiver identity (Class × Receiver × finish variant) and each installed accessory part variant (Class × Receiver × Socket × Variant) (FS-CRF-008). Augmented / Rare melee unlocks each installed melee part variant (melee Family × Socket × Variant). First breakdown of a key unlocks it. Repeat breakdowns of the same key still yield mats. Higher quality unlocks the higher-rarity key of that same type. Socketed Phonons / Gems / Jewels / Artifact return to bag. Part variants are not bag tiles.
FS-CRF-003 — Page capabilities
Section titled “FS-CRF-003 — Page capabilities”Forge weapons (unlocked Frame + heavy mats; Augmented / Rare also owned part variants or random rolls) and armor (unlocked Blueprint + heavy mats). Output lands in the Gear bag. Forge is fail-closed if that bag has fewer empty slots than the recipe needs (default 1; wide Frames 2). The recipe catalog is long: search by name, Armor / Weapons chips, Ranged / Melee once Weapons is selected, and a rarity chip (All, or Common → Apex) on every view. World mats stay in a scrolling stack rail with its own scrollbar; recipes scroll in their own column. Not a Materials bag. Refit Augmented / Rare weapons on Inspect (FS-CRF-008) — not a park well, not a workbench mode. Assemble Chords. Upgrade gems / Shards (3:1 + tax). Socket services. Socket / unsocket Artifacts — chip power only; this spend does not grant or revoke Set membership (FS-ITM-004). Bore (add a Phonon / Gem / Jewel well) is Inspect (FS-CRF-010), not a Forge park well — Well Tap still stacks on this page. Repair / recharge / unsocket (Kha-Shard). Blood / caster-style crafts still need that Frame / Blueprint unlocked where applicable. Apex recipes are allowed: output is Apex quality with InvokeEligible = false (FS-PRG-009). Do not stamp crafted Apex as world-found. Legendary / Unique / Apex Forge reprints the designer package (stats, Unique / Apex Artifact well if authored, Unique / Apex Set ID if any). Legendary never gains an Artifact well. The player cannot pick a Set ID on the workbench. Recipes do not consume the Frame / Blueprint.
FS-CRF-004 — Economy intent
Section titled “FS-CRF-004 — Economy intent”Materials are a sink. Breakdown is a meaningful choice. Frames / Blueprints are a second chase layer. Cosmetics stay on Marketplace (LUMENAR); power is not shop-gated. Credits are the in-world vendor spend (FS-ECO). They do not replace Dual Stack Cells, Frames, Blueprints, or Kha-Shards.
FS-CRF-005 — Frame / Blueprint identity (no generic stacks)
Section titled “FS-CRF-005 — Frame / Blueprint identity (no generic stacks)”There is no single “Weapon Frames” pile and no single “Armor Blueprints” pile.
| Key | Identity | Stacks with |
|---|---|---|
| Weapon Frame | Gun Class × Receiver (Type) or melee family + that Frame (core / specialty) + rarity (FS-GUN-004) | Only another Frame with the same Class × Receiver (or melee family), same Frame, and same rarity |
| Armor Blueprint | Armor type (slot × Light / Medium / Heavy where the slot uses weight) + rarity. Jewelry and shields use their slot (no weight class). | Only another Blueprint with the same type and same rarity |
Pulse Adaptive Rare does not stack with Pulse Aggressive Rare, Auto Adaptive Rare, or Pulse Adaptive Legendary. Helm Light Rare does not stack with Helm Heavy Rare or Chest Light Rare. Unique-stamped Frames / Blueprints do not stack with Legendary of the same Receiver / melee family, and Unique salvage cannot pay a Legendary recipe.
Dual Stack Cells and Kha-Shards still stack as themselves. World mats stack by SKU + rarity (FS-CRF-007).
Crafting recipes require the matching typed key to be unlocked by breakdown. They do not consume, hide, or re-lock that key. Do not invent a wildcard Frame.
FS-CRF-006 — Permanent Frame / Blueprint access
Section titled “FS-CRF-006 — Permanent Frame / Blueprint access”Once a typed Weapon Frame or Armor Blueprint is unlocked by breaking down an item, that key stays accessible on the Crafting Page for that character. Later crafts of that identity spend materials (and other recipe costs) only. You cannot craft a Frame or Blueprint you have never broken down. Trade or mail of finished gear does not grant the key — only breakdown does. Invoke break is still not salvage (FS-PRG-009): no unlock.
FS-CRF-007 — World material catalog
Section titled “FS-CRF-007 — World material catalog”Eight shared body families, rarity-stamped: Ferrospine (Metals), Weldalloy (Alloys), Optic Lens (Lenses), Helion Prism (Prisms), Sealant Mesh (Composites), Capacitor Coil (Coils), Warhead Compound (Payloads), Limb Filament (Filaments). Same SKU + different rarity do not stack and cannot pay each other. Item type picks families; item rarity picks the stamp. Exact counts TBD.
These stacks draw on the Crafting Page world-mat rail (W_TFA_CraftingPage), with an independent scrollbar — not a Materials bag (FS-GUI-008).
Also on recipes: Dual Stack Cells (one pile, no rarity stamp, power tax). Well Tap (one pile, no rarity stamp, opens one chip well on Inspect — FS-CRF-010). Legendary / Unique / Apex crafts add Nanite Residue (not a rarity of Ferrospine). Augmented / Rare crafts spend Forge Stamp per prefix slot and Telemetry Coda per suffix slot (same rarity rule). Guided crafts add a group sigil (not rarity-stamped). Channel affixes also spend the matching Gem. Legendary / Unique / Apex crafts spend no Stamp / Coda. Mechanical Arms never. Common spends no affix reagents. Uncommon default none.
Do not name mats Operative / Veteran / Apex Threat (zone difficulty) or Normal / Exceptional / Elite (base-tier fiction). Quality Apex is not Apex Threat.
Keep out of this catalog: Kha-Shards, typed Frames / Blueprints, weapon parts (unlock catalog, FS-CRF-008), Phonons / Gems / Jewels / Artifacts, ammo bricks.
3:1 rarity upconvert is off. Must not skip into Legendary / Unique / Apex.
Salvage returns a slice of the same families at that item’s rarity (fraction TBD, must stay a sink) and unlocks the Frame / Blueprint on first salvage. Augmented / Rare salvage also unlocks installed part variants (FS-CRF-008). Unique salvage yields Unique-stamped body mats + Residue — not Legendary mats, not Forge Stamps, and it cannot pay a Legendary recipe.
FS-CRF-008 — Weapon parts (unlock catalog + Refit)
Section titled “FS-CRF-008 — Weapon parts (unlock catalog + Refit)”Augmented / Rare guns and melee only. Armor, jewelry, shields, Mechanical Arms, Legendary / Unique / Apex: no part sockets, no Refit.
Guns — Receiver (structural) + five accessory sockets: Receiver authors Type and is required on every Augmented / Rare gun (FS-GUN-004). Year-1 Refit Install does not swap Receiver. Accessory sockets (FS-GUN-006): Barrel, Mag / Cell / Quiver, Optic, Stock / Brace, Grip (or that Receiver’s specialty five-pack). Melee uses five: Head, Guard, Haft, Weight, Core. Phonon / Gem / Jewel wells are not part sockets.
Gun accessory part identity = Class × Receiver × Socket × Variant. Melee part identity = melee Family × Socket × Variant. Corp finish C1–C5 is paint on that variant (look only; mixed-corp allowed). Rare variants do not install on Augmented. Auto Barrel does not fit Pulse. Rifle Gatling Barrel does not fit Heavy Gun Gatling. Empty accessory sockets are legal (Receiver baseline). Cross-Class kits are illegal except where a multi-Class Receiver name has a matching Class × Receiver row.
Unlock: first salvage of an Augmented / Rare gun grants the Receiver × finish key and each installed accessory variant for this character. First salvage of Augmented / Rare melee grants each installed melee variant. Keys stay accessible. Forge and Refit spend materials only. Trade / mail / Invoke break do not grant parts. Parts are not bag tiles and do not stack as items.
Forge: pick owned variants or roll cheaper from owned variants; gun recipes require a legal Receiver × Frame pair (FS-GUN-004). Refit is the Inspect activity on Augmented / Rare weapons. Preview = select an owned accessory variant; the stat plate ghosts + / −; no spend. Install = the spend that writes one accessory socket and pays that socket’s Receiver mix at the item’s rarity + Dual Stack Cells (counts TBD). Finish-only swap (same variant, new C1–C5) costs Dual Stack Cells only. Install does not change Receiver, Class, Frame, cadence, affixes, or socketed Phonons / Gems / Jewels / Artifact. Install does not write SetID, PieceIndex, or InvokeEligible. There is no park well. Do not label the pay button Refit or Commit.
Parts never write Fire Mode, AA baselines, RPM, charge ms, draw ms, or burst count (FS-GUN-007, FS-GUN-008).
FS-CRF-009 — Rewrite (affix Reroll / Change)
Section titled “FS-CRF-009 — Rewrite (affix Reroll / Change)”Post-hoc one-slot affix retouch on Inspect. Not Forge. Not Refit. Not Install.
Who: Augmented / Rare guns, melee, armor, jewelry, shields — full Reroll and Change. Legendary / Unique / Apex — Reroll only; Change tab hidden; empty wells illegal. Mechanical Arms never. Common never. Uncommon default off. Socketable jewel chips do not Rewrite; doll jewelry items do.
Seat: W_TFA_Inspect_Rewrite, full child above Inspect. I or Esc closes Rewrite first, then Inspect.
Reroll: keep the affix group; roll a new named affix + band inside it. Cannot pick Terminal vs Razor by name. Empty wells: Reroll illegal.
Change: pay a group sigil; pick a different family; then roll. Cannot duplicate a group already on the item. May fill an empty legal well (Rare ≤3 prefix + 3 suffix; Augmented ≤1+1). Staff / Scepter refuse Combat prefixes.
Etch: the click that pays after free odds preview. Not a hold.
Materials: prefix → Forge Stamp (item rarity). Suffix → Telemetry Coda. Change → one group sigil (Combat, Siphon, Tempo, Channel, Attribute, Yield, Vital, Plating, Guard, …). Channel groups → matching Gem. Every Etch → Dual Stack Cells. Overpay 0–3 extra matching Stamp/Coda + extra Cells weights the band table; never 100%. Lab / still bias table: [50,35,15] → [30,40,30] → [18,37,45] → [10,30,60] for low/mid/high. Exact counts TBD (lab floor 1 Stamp or 1 Coda + 12 Cells; Change +1 sigil; Channel +1 Gem; overpay +1 reagent +12 Cells per step).
Cannot write: Frame, cadence, parts, Phonons / Gems / Jewels / Artifact, InvokeEligible, SetID, PieceIndex, AA / camera / FOV.
Online: browse OK; Etch fail-closed in combat or downed (overlay spend lock).
FS-CRF-010 — Bore (add a chip well)
Section titled “FS-CRF-010 — Bore (add a chip well)”Post-hoc open of one Phonon / Gem / Jewel well on Inspect. Not Forge. Not Refit. Not Install. Not Rewrite.
Material: Well Tap — Crafting stack, one pile, no rarity stamp. Plus Dual Stack Cells. Exact counts TBD (TBD-042). Lab floor: 1 Well Tap + 8 Cells × the next well index (well 1 costs 8, well 6 costs 48).
Seat: Inspect, under the chip-socket strip (W_TFA_Inspect). No child window. No park well.
Effect: openWells += 1, hard cap 6. The new well is empty. Does not fill it. Does not write Frame, cadence, affixes, parts, seated Phonons / Gems / Jewels, Artifact, InvokeEligible, SetID, or PieceIndex. Cannot add a 7th chip well. Cannot add or remove the Artifact socket. Cannot add part sockets.
Who: guns, melee, armor, jewelry, shields that have chip wells, including Legendary / Unique / Apex (authored birth count; player may Bore to 6). Mechanical Arms never. Ammo never. Common / Uncommon Chord bases never — socket count is Chord length (FS-ITM-007). Socketable jewel chips do not Bore; doll jewelry items do.
Draw: six positions always. Open empty wells are numbered and droppable. Unopened wells draw locked (no drop).
Online: browse OK; Bore fail-closed in combat or downed (overlay spend lock).
AC-CRF-001
Section titled “AC-CRF-001”Open I → Inventory → Forge: auto-maximizes; Forge fills everything except the paper doll and LOAD OUT; Gear bag hides until Minimize. Forge is present. Refit is not a workbench mode. Open Inspect on a Rare Auto: Refit is present. Inventory inner tabs do not include Crafting. Doll / LOAD OUT / wallet stay. Stats / dock yield to Forge. Breakdown of a Unique returns its Artifact to the Artifacts bag and unlocks that typed Frame/Blueprint permanently (FS-CRF-005, FS-CRF-006). Auto Adaptive Rare Frame lists once as a key, not a pile of copies. Auto Adaptive Rare and Pulse Adaptive Rare are two keys. Helm Light Rare and Chest Light Rare are two Blueprint keys.
AC-CRF-002
Section titled “AC-CRF-002”Open I → Inventory → Forge: no tile labeled only “Weapon Frames” or only “Armor Blueprints” covering mixed Receivers / melee families. Dummy salvage of a Rare Auto unlocks an Auto Rare Frame (Rifle Class derived), not a generic Frame.
AC-CRF-003
Section titled “AC-CRF-003”Character A salvages a Rare Auto Adaptive once, then crafts that Auto Rare Frame recipe twice, paying mats each time. The second craft succeeds without another salvage. Character B, who never broke down that Auto, cannot craft it.
AC-CRF-004
Section titled “AC-CRF-004”Rare Auto recipe rejects Common Ferrospine. Unique salvage yields Unique-stamped body mats + Residue, not Legendary mats and not Forge Stamps. Unique-stamped Ferrospine cannot pay a Legendary recipe. Crafted Apex spends Apex-stamped families + Residue, stamps InvokeEligible = false, and spends no Stamp / Coda.
AC-CRF-005
Section titled “AC-CRF-005”Open I → Inventory → Forge: no Barrel / Head / part tiles. Salvage a Rare Auto with an installed Barrel variant: that Auto × Barrel × variant unlocks; Inspect → preview a second Auto’s Compensator (stats ghost) → Install spends Rare Ferrospine + Cells and does not consume the unlock. Install refuses a Pulse Barrel. RPM stays 600. Inspect on armor or Apex offers no Refit and no Install. Armor offers full Rewrite. Apex offers Rewrite Reroll only.
AC-CRF-006
Section titled “AC-CRF-006”Online overlay: open I → Inventory → Forge while a dummy is firing (in combat). Catalog browse succeeds. Forge / Refit / Rewrite / Bore / repair are rejected (fail closed). Repeat out of combat: spends succeed. Repeat while downed: spends rejected. Solo pause: spends succeed with no extra gate.
AC-CRF-007
Section titled “AC-CRF-007”Open Inspect on a Rare Trace: Rewrite is visible. Reroll a Kinetic Output prefix: Etch writes a new name/band in Kinetic Output; Frame, parts, and chips unchanged. Change an empty suffix with a free sigil: the well fills. Change that tries to duplicate a group already on the item is refused. Open Inspect on Crown Rifle (Apex) or TFA Warden (Legendary): Rewrite is visible; Change tab is hidden. Reroll a filled prefix: Etch writes a new name/band in the same group. Change on an empty well is refused. Socketable jewel chips do not expose Rewrite.
AC-CRF-008
Section titled “AC-CRF-008”Open Inspect on HAB Trace (lab: 2 of 6 open). Locked wells 3–6 refuse a Gem drop. Bore spends 1 Well Tap + Cells and opens well 3 empty; Frame, parts, affixes, and seated chips unchanged. Repeat to 6. A 7th Bore is refused. Open Inspect on Plate Helm (lab: 0 of 6): first Bore opens well 1. Open Inspect on a Chord-locked Common: Bore is refused. Crown Rifle may Bore remaining wells to 6; Artifact socket count stays 1. Forge lists Well Tap as a stack; the spend is Inspect, not a park well.
AC-CRF-009
Section titled “AC-CRF-009”Open I → Inventory → Forge. Search “Trace” shows HAB Trace Rare Frame and hides Helm Light Rare Blueprint. Armor chip hides all Frames; Weapons chip hides all Blueprints and reveals Ranged / Melee. Ranged hides Wrist Melee; Melee hides Auto Adaptive. Rarity Rare hides Common Helm Light and Crown Rifle Apex. All + All restores the full scrolling list. World mats stay in the stack rail (not a bag). The mat rail and the recipe list each have their own scrollbar.
AC-CRF-010
Section titled “AC-CRF-010”Open I → Inventory → Forge: Gear bag is hidden; doll and LOAD OUT stay (FS-GUI-008, OV18). Gear occupancy reads on the workbench. The world-mat rail has its own scrollbar. Forge with free slots writes the item into Gear (wide Crown Rifle Apex Frame consumes two slots). Fill the bag: Forge buttons dim; click is refused; bag count unchanged. Minimize restores docked Gear with the forged tiles. Socketables / Artifacts maximize is still a full bag with no workbench.
FS-CRF-011 — Forge / Refit vs Trait and Origin
Section titled “FS-CRF-011 — Forge / Refit vs Trait and Origin”Forge stamps active Trait ids for each quality-unlocked column — guns: Verb / Feed / Bullets / Plate; armor/shields: Verb / Stride / Shell / Brace; jewelry: none. Forge Legendary: four Trait columns, no Origin. Forge Unique: four columns + one Origin + optional Set. Forge Apex: four columns + two Origins + optional Set. Common→Rare never stamp Origin.
Refit Install / preview: never writes Trait column ids, OriginId, OriginId2, SetID, or PieceIndex.
Trait lane: TBD-064 locked 2026-11-13b — Common→Legendary Rewrite may change Trait column picks (cost TBD). Unique/Apex Crafting unlocks options; out-of-combat swap among unlocked. Origin / OriginId2 never Rewrite (Unique/Apex authored only).
FS-CRF-012 — Masterwork (Crafting Page)
Section titled “FS-CRF-012 — Masterwork (Crafting Page)”Requires Familiarity at or above gate rank (FS-ITM-013). v1: masterworkRank 0 → 1. Applies Masterwork Inspect chrome + one authored finish bonus from DT_TFA_MasterworkFinishes (Trait mag band / one plate column / socket glow — not a free affix roll). Does not write Trait column ids, Origins, SetID, affixes, wells, Artifact, or InvokeEligible. Costs TBD-067.
AC-CRF-011
Section titled “AC-CRF-011”Forge Rare gun: Bullets+Feed+Verb; Origin empty. Forge Rare armor: Shell+Stride+Verb; Origin empty. Forge Legendary: four Trait columns (gun Plate / armor Brace); Origin empty. Forge Apex: four columns + two Origins. Forge jewelry: no Trait columns. Refit Install on Rare: Trait/Origin/Set fields unchanged. Attempt Masterwork below Familiarity gate: fail.
16b. Player economy — Credits, BTUCOIN, and LUMENAR
Section titled “16b. Player economy — Credits, BTUCOIN, and LUMENAR”Product lock: FS-PRD-007. This section is the runtime contract.
Three ledgers:
- Credits — in-world vendors / NPC transactions. Account-shared (PUID / Solo profile). Play-sourced.
- BTUCOIN — crypto token on the EOS PUID. Never marketplace tender. Convert → LUMENAR only.
- LUMENAR — soft marketplace currency (not crypto). Storefront + listings. Bought with cash or BTUCOIN convert.
They do not replace craft mats. The menu roll W_TFA_Credits is a different screen — never bind the wallet there.
Year 1 BTUCOIN is a studio-operated ledger plus an external market-price feed. Do not invent an on-chain client, wallet seed, or exchange listing in C++. Later Proof of Stake hybrid (deposit / withdraw / optional stake) is GDD BTUCOIN — PoS Hybrid and FS-ECO-013 under TBD-038.
FS-ECO-001 — Credits
Section titled “FS-ECO-001 — Credits”Account-shared. int64 CreditsBalance on the EOS PUID (Online) or Solo local profile — not a per-character field. Every character on that account reads and spends the same pool (alt mule / power-up is intentional). Never a bag tile. Character I title bar only (W_TFA_IWallet) — CREDITS chip, gap, BTUCOIN chip, then X; chip shows the shared balance on every character. Solo: local profile save. Online: server-authoritative on PUID; fail closed. Reset Campaign and character delete keep Credits (account ledger). Account wipe / PUID delete clears the pool.
Spend: in-game vendors / world NPC transactions only. Affixes of Profit / of Payday (Credits Find) modify play grants only. Credits do not buy Marketplace storefront or listings.
FS-ECO-002 — Play grants
Section titled “FS-ECO-002 — Play grants”Credits drop and award from play. Sources (locked):
| Source | Notes |
|---|---|
| Stashes / caches | Opened containers. Amount TBD-037 |
| Monster kills | Trash / elite. Credits Find affixes apply. Amount TBD-037 |
| Boss kills | Distinct from trash. Amount TBD-037 |
| Side missions | On completion. Amount TBD-037 |
| Milestones / accomplishments | Anti-FOMO earn path. Same Credits, not LUMENAR |
Do not invent per-kill numbers. DT_TFA_CreditRewards stays empty until TBD-037.
FS-ECO-003 — Marketplace cash → BTUCOIN mint (then convert)
Section titled “FS-ECO-003 — Marketplace cash → BTUCOIN mint (then convert)”Marketplace fiat / cash SKUs (BTUCOIN packs, checkout that takes real money) mint BTUCOIN on the buyer’s EOS PUID using FS-ECO-004 — 51% BTU Games (studio treasury) / 49% buyer. Pack tables are fiat value (V) (TBD-036), not fixed BTUCOIN counts. At mint time, settlement (P) = FS-ECO-005; total mint (M = V / P); player credit = (0.49M). When market is above floor, the pack mints fewer BTUCOIN; converting that mint at the same (P) yields the same LUMENAR for (V) (FS-ECO-006). Do not grant LUMENAR from cash. Do not grant Credits from cash.
To buy storefront, listings, or Season Pass Advanced: buyer converts their 49% BTUCOIN → LUMENAR (FS-ECO-006), then spends LUMENAR (FS-ECO-010). BTUCOIN never tenders SKUs directly.
Store login still does not move a Solo character into the Online pool. A Solo character with EOS can receive the BTUCOIN mint locally / on PUID and convert; cosmetic unlocks still require LUMENAR spend after convert.
FS-ECO-004 — BTUCOIN mint split (51 / 49)
Section titled “FS-ECO-004 — BTUCOIN mint split (51 / 49)”Every BTUCOIN mint uses this split — play grants (FS-ECO-008) and any future fiat path that explicitly mints BTUCOIN. There is no mint that skips the studio cut.
| Share | Owner |
|---|---|
| 51% | Studio treasury. Never shown as the player’s wallet. |
| 49% | Player BTUCOINBalance / CryptoBalance on that EOS PUID |
Player BTUCOIN is only this 49% share. They cannot spend, list, or convert the studio 51%. BTUCOIN is never Marketplace tender.
FS-ECO-005 — BTUCOIN price floor + settlement (P)
Section titled “FS-ECO-005 — BTUCOIN price floor + settlement (P)”BTUCOIN has a studio-set floor price in fiat (TBD-035) — the marketplace base value. Live market comes from the Year-1 price feed (later exchange / oracle under TBD-038).
| Symbol | Meaning |
|---|---|
| (P_{\text{floor}}) | Studio floor (TBD-035). Never invent a number in code docs. |
| (P_{\text{market}}) | Free-market / feed price at the operation’s timestamp. |
| (P) | Settlement = (\max(P_{\text{floor}},, P_{\text{market}})). |
(P) is shared by cash mint (FS-ECO-003), play mint (FS-ECO-008), and convert (FS-ECO-006). The token never settles below the floor. If the open market trades above the floor, (P) follows the market — so BTUCOIN quantity minted for a fixed fiat value (V) falls, while LUMENAR from converting that mint at the same (P) stays flat.
Holding BTUCOIN across a price move can change later convert LUMENAR (mint (P) ≠ convert (P)). Immediate convert of a fresh mint keeps LUMENAR = (V_{49} \times R).
FS-ECO-006 — Convert BTUCOIN → LUMENAR
Section titled “FS-ECO-006 — Convert BTUCOIN → LUMENAR”The player may convert any portion of their 49% BTUCOIN into LUMENAR whenever they want. Confirm on Marketplace Wallet. LUMENAR writes to the EOS PUID ledger (FS-ECO-009).
[ \text{LUMENAR} = \big\lfloor B_{49} \times P \times R \big\rfloor ]
- (B_{49}) — player BTUCOIN converted
- (P) — settlement at confirm time (FS-ECO-005)
- (R) — LUMENAR-per-fiat (TBD-036)
Grant/cash sizing and convert must use this same (P) formula so a mint sized as (M = V / P) converts to stable LUMENAR for that (V) (player share (0.49V \times R)). Irreversible. Fail closed: Solo with no EOS session, zero balance, Online ledger reject.
BTUCOIN does not buy Marketplace SKUs or listings directly. Convert first, then spend LUMENAR. There is no convert BTUCOIN → Credits.
FS-ECO-007 — Marketplace Wallet
Section titled “FS-ECO-007 — Marketplace Wallet”Command Deck Marketplace panes: Storefront · Listings · Wallet. Wallet needs EOS (same rule as Storefront). Shows: LUMENAR (primary), BTUCOIN (player 49%), floor, live market, settlement, Convert BTUCOIN → LUMENAR, cash → BTUCOIN mint entry (FS-ECO-003). Credits may echo for context but are not a Marketplace spend. Listings prices are LUMENAR. Fiat SKUs mint BTUCOIN; LUMENAR SKUs debit FS-ECO-009.
Looks only. Seasons never vault. FE spec §11 owns chrome.
FS-ECO-008 — Play BTUCOIN (daily / weekly / hard objectives)
Section titled “FS-ECO-008 — Play BTUCOIN (daily / weekly / hard objectives)”Completing these awards a BTUCOIN mint. Not Credits. Not LUMENAR. TBD-039 authors each row as a fiat value (V) (and the Hard Objective catalog) — not a fixed BTUCOIN count. At completion, settlement (P) = FS-ECO-005; total mint (M = V / P); then FS-ECO-004 (51% treasury / 49% player). When market is above the marketplace floor, the objective mints fewer BTUCOIN; converting that mint at the same (P) yields the same LUMENAR for that (V).
Do not invent a board. Do not invent a Command Deck tab — they use the same objective chrome as story / sub-missions on every Tab map (W_TFA_LocalMap and W_TFA_WorldMap; FS-CMP-007 / FS-CMP-009). Daily / Weekly / Hard rows + Tasks filter on both drawers. Globe markers on World Map. Local Objects stay on Local Map.
Online service only. Solo never lists, spawns, tracks, or completes them. Store login on a Solo character does not grant them. EOS Wallet convert is a different gate.
| Source | Notes |
|---|---|
| Daily tasks | Online only. Reset daily. Fiat (V) from TBD-039. (M = V / P). Mint runs FS-ECO-004. |
| Weekly tasks | Online only. Reset weekly. Fiat (V) from TBD-039. (M = V / P). Mint runs FS-ECO-004. |
| Hard objectives | Online only. Distinct from dailies / weeklies. Fiat (V) from TBD-039. (M = V / P). Mint runs FS-ECO-004. |
Mint writes to the EOS PUID of the Online character. Fail closed off the Online pool. DT_TFA_CryptoPlayGrants stays empty until TBD-039 (columns: objective id, fiat (V), reset — not raw BTUCOIN).
FS-ECO-009 — LUMENAR
Section titled “FS-ECO-009 — LUMENAR”Soft marketplace currency. Not crypto. int64 (or fixed-point table TBD-036) on the EOS PUID. Never a bag tile. Never an I title-bar chip. Marketplace Wallet is the home surface. Acquire only via BTUCOIN convert (FS-ECO-006) — not from cash SKUs. Solo: local unlock cache after convert + spend. Online: server-authoritative; fail closed. Reset Campaign does not wipe LUMENAR (account field).
Spend: Marketplace storefront and player listings only. Does not spend at in-world vendors. Does not replace craft mats.
FS-ECO-010 — Marketplace spend
Section titled “FS-ECO-010 — Marketplace spend”Storefront and listings debit LUMENAR only. Credits cannot pay. BTUCOIN cannot pay without FS-ECO-006 convert first. Fail closed on insufficient LUMENAR.
FS-ECO-011 — Season Pass (Basic / Advanced)
Section titled “FS-ECO-011 — Season Pass (Basic / Advanced)”GDD: Season Pass — Basic & Advanced. One shared XP ladder; Basic free; Advanced unlocked by LUMENAR spend (FS-ECO-010). Fund LUMENAR by converting BTUCOIN from fiat mint (FS-ECO-003) and/or play mint (FS-ECO-008) — cash does not grant LUMENAR directly. Rewards are cosmetics / presentation and soft-currency drips only — never frames, cadence, trees, gems power, RAID access, or ladder MMR. Mid-season Advanced purchase grants all Advanced rewards for tiers already reached. Pass XP from Online objectives / match complete (Solo rate 0 until locked). Progress on Online / IMonetaryHost identity. UI: Command Deck W_TFA_SeasonPass — not Character I. Ledgers / purchase / claim currency grants live in MonetaryPlatform; Frontend presents; Online feeds XP. CF / Founding Club exclusives are a separate entitlement track (FS-ECO-012), not Season Pass tiers.
FS-ECO-012 — Founding Clubs & CF cosmetics (in-game)
Section titled “FS-ECO-012 — Founding Clubs & CF cosmetics (in-game)”GDD: Founding Clubs & CF Cosmetics — In-Game (founding-clubs-cf-cosmetics). Crowdfunding ladder exclusives and Apex-band Founding Clubs (Seal Circle → Founding Apex Enclave) grant EOS PUID entitlement flags consumed by the game client as looks / presentation only (FS-PRD-006). Working catalog (materials, FX, body props including wings) is design-locked in that GDD chapter and marketing Store Plan Ch. 5.
| Rule | Contract |
|---|---|
| Host | EOS / Online account (IMonetaryHost / MonetaryPlatform entitlement store). Not a Combat GE. Not a bag tile. |
| Write path | External pledge resolve (website / CF backend) → signed entitlement upsert on PUID. Game client reads; it does not invent CF flags from local fiat. |
| Flag kinds | title_*, fx_*, mat_*, prop_*, club_*, hangar / nameplate / VISION-chip chrome, emote, weapon-wrap, decal ids. Formal strings: TBD-055. |
| Layers | Three stackable equip layers: Material (surface finish), Armor FX (overlay / shader), Body prop (silhouette — wings, mantle, trails, shoulder pips). Toggleable in hangar / loadout. |
| Club model | Studio-owned Founding Clubs only (Year 1). Membership = resolved Apex-band tier — not a second in-game SKU and not player-created brand clubs. |
| Stack | Lower cosmetics (materials, FX, props) stay unlocked when the player climbs. One primary club representation = highest resolved Apex club; badge visibility toggle does not revoke entitlement. Cosmetics start at Founder; Witness–Benefactor = thank-you + title only. |
| In-game surface | Materials, Armor FX, Body props, titles / title trim, emotes, hangar banner / trim / pedestal, nameplate frame + club tag, Founding / club VISION chip chrome (under the Terra Firma mark, never on it), prestige ranks (cosmetic / roster labels only), armor/weapon decals. |
| Plate lock | Materials / FX / props never change light/heavy plate size or underarmor joint / visible underarmor scale. Body props never grant flight, glide, hitbox, or mobility buffs. |
| Forbidden | Power, frames, cadence, trees, gem/jewel power, RAID keys, ladder MMR, Credits or LUMENAR grants as pay-to-win from club membership, MLM recruiting trees, flight from wings. |
| Out of FS runtime | Site club page, Discord channels / voice, charter copy, ops ambassador roles, studio line, playtest seat priority — marketing / community ops, not Combat or MonetaryPlatform spend. |
Presentation: Character I / Collections / hangar / nameplate / Match Results chrome / OmniVisor VISION-chip tint. TFAEconomy may route entitlement apply into MonetaryPlatform; TFACombat / TFAWeapons never read CF flags for damage, cadence, or kit unlocks. Solo with EOS may cache unlocks locally after account sync; Online is server-authoritative and fails closed.
FS-ECO-013 — BTUCOIN PoS hybrid (deposit / withdraw / stake)
Section titled “FS-ECO-013 — BTUCOIN PoS hybrid (deposit / withdraw / stake)”GDD: BTUCOIN — PoS Hybrid. Year 1 remains studio ledger + price feed (FS-PRD-007). When TBD-038 lands, BTUCOIN may settle on a Proof of Stake host (existing PoS L1 / L2 preferred; custom PoS L1 not required).
| Rule | Contract |
|---|---|
| Play authority | Match / objectives / fiat→BTUCOIN mint / convert / Marketplace spend stay on MonetaryPlatform studio ledger — fail-closed. UE5 never runs validators or PoW miners. |
| Fiat | Cash SKUs mint BTUCOIN 51/49 (FS-ECO-003); they do not credit PoS directly and do not grant LUMENAR. |
| Withdraw | Player may withdraw only the 49% player BTUCOIN lane. Studio 51% treasury never withdrawable. Server freezes/debits ledger, then bridge mints/releases on-chain. AntiCheat / fraud hold → reject. Min amount / delay: TBD-038-A / TBD-038-B. |
| Deposit | On-chain send → after N confirmations (TBD-038-C) credit EOS PUID ledger. Client cannot invent deposit credit. Deposit alone does not grant LUMENAR, Credits, frames, or Season Pass tiers. |
| Stake | Optional on-chain only. Rewards never grant Combat power, cadence, trees, RAID access, Ladder MMR, or Trust rank. Wallet chrome only — not Character I / OmniVisor combat. Bonding/unstake delay is expected. |
| Mint | Play mints still FS-ECO-004. Stake/chain inflation (TBD-038-D) is separate from play grant tables. |
| Tender | BTUCOIN still never buys storefront / listings — convert → LUMENAR (FS-ECO-006 / FS-ECO-010). |
Owners: MonetaryPlatform (ledger + bridge jobs + gates), Frontend Wallet (presentation), Online (identity). Not required for Demo exit.
AC-ECO-001
Section titled “AC-ECO-001”Open I: title bar shows Credits and BTUCOIN on Inventory, Combat, Tentacles, Ordnance, and Channels. Kill a dummy tagged as a credit source: Credits tick up without a bag slot. Switch to a second character on the same account: Credits chip shows the same balance. Dismantle does not spend Credits. LUMENAR is not on the I bar.
AC-ECO-002
Section titled “AC-ECO-002”With EOS: buy a $100 EXAMPLE Marketplace cash pack (numbers are the test harness, not TBD-036). Ledger mints BTUCOIN at 51/49 — player BTUCOIN ticks by the 49% share only; no LUMENAR grant and no Credits grant from that SKU. Wallet Convert of player BTUCOIN increases LUMENAR and zeros that converted BTUCOIN amount. Then a LUMENAR storefront buy succeeds. Attempt to buy a storefront SKU with Credits or raw BTUCOIN (no convert) fails. Repeat on Solo: BTUCOIN mint / convert / unlocks land on the account path; character stays in the Solo pool.
AC-ECO-003
Section titled “AC-ECO-003”Online pool: a dummy Daily appears on Local Map and World Map Missions & Objects / Operations (filter Tasks) and as a world / globe marker (TFA.World.OnlineTask). Set as Primary from either map drives FE30. Completing it mints (M = V / P) at settlement (FS-ECO-005 / FS-ECO-008): test harness may use floor = market = $1 and (V = $1) → (M = 1.00) total, then 51% treasury / 49% player. Raise harness market above floor with the same (V): fewer BTUCOIN mint; convert at that (P) yields the same LUMENAR as the floor case. Character I BTUCOIN ticks by the player share only. Repeat a Weekly and a Hard Objective. Solo: neither map lists Daily / Weekly / Hard; world has none of those markers; a dummy tagged that way does not complete and does not mint.
AC-ECO-004
Section titled “AC-ECO-004”Online: Command Deck Season Pass shows Basic and Advanced lanes on one XP bar. Claim a Basic cosmetic without LUMENAR. Buy Advanced with LUMENAR only — Credits and raw BTUCOIN fail. After earning tiers on Basic alone, purchase Advanced mid-season and receive Advanced rewards for those reached tiers. No pass tier grants a gun frame, cadence change, or skill-tree node. Solo-only identity does not advance pass XP (until Solo rate is locked).
AC-ECO-005
Section titled “AC-ECO-005”With an EOS PUID seeded with Founder cosmetics (fx_visor_cyan_glow, mat_founding_plate_matte, prop_hardlight_vanes or harness equivalents) and Seal Circle club (club_seal + Seal Lacquer / Seal Span): Character I / Collections / hangar / nameplate show Material + Armor FX + Body prop stacked; Match Results may show the club tag when badge visible. Toggle badge hide: tag hidden, entitlement still present. Climb harness to Primus: Seal cosmetics remain unlocked and Primus material / FX appear. Equip materials / FX / props on light and heavy sets: plate silhouette and underarmor joint scale unchanged; wings grant no flight. Attempt to map any CF / club flag to a gun frame, cadence scalar, skill-tree node, Credits grant, or LUMENAR grant fails closed. Without EOS sync, client cannot invent CF entitlements from local fiat.
AC-ECO-006
Section titled “AC-ECO-006”With PoS hybrid harness enabled: Wallet shows deposit / withdraw. Withdraw of player BTUCOIN debits only the 49% lane; attempt to withdraw studio treasury share fails. Fraud / AntiCheat hold blocks withdraw. Deposit credits ledger only after configured confirmations — a client-spoofed “deposit complete” does not credit. Stake summary (if shown) cannot be spent as Marketplace tender and does not alter gun cadence or Ladder standing. With hybrid disabled (Year 1 default): play mint, convert, and LUMENAR spend still pass AC-ECO-002 / AC-ECO-003.
17. Campaign, world, and encounters
Section titled “17. Campaign, world, and encounters”FS-CMP-001 — Dual story
Section titled “FS-CMP-001 — Dual story”Main Story (Val & Dea) is fixed and discovered. Game Story is the player’s HAVOC-unit journey. Year 1 is linear, single ending. Player is a soldier in the unit, present for the Kailashia opening, then playable.
FS-CMP-002 — Command chain (runtime)
Section titled “FS-CMP-002 — Command chain (runtime)”- Indra: quest-giver from Indra’s Ring (briefings).
- Dea: persistent comms handler (
W_TFA_Comms). Not an alliance portrait. - Val: unit commander; sprinkled cinematics and missions.
FS-CMP-003 — Year 1 geography
Section titled “FS-CMP-003 — Year 1 geography”Playable Earth + Indra’s Ring. Tutorial off-world (Moon station or Ring). Opening cinematic on Kailashia. Other planets are Year 2–5.
Campaign: 4 Parts × ~30 hours. Each part culminates in a Raid Online or matching SOLO OPS dungeon Solo. Sub-mission target ~1 hour. Exact mission table lives in GDD_Storyline_and_Game_Progression.txt.
FS-CMP-004 — Enemy factions (Earth)
Section titled “FS-CMP-004 — Enemy factions (Earth)”- Corp security
- Corrupted human military
- Mutants / abominations
- Mek-Shivs (late)
MEKs are soul-transfer vessels under a Hive Mind. EXOs are elite MEKs. Ghost MEKs are DLC-reserved (survive Hive Mind destruction).
FS-CMP-005 — Ability unlock fiction vs systems
Section titled “FS-CMP-005 — Ability unlock fiction vs systems”Narrative unlocks (double jump, Wall Walk, Heat vision, Mechanical Arms) must call the same movement / vision / tentacle systems as the baseline kit. If a verb is baseline kit in the combat GDD, the campaign may tutorialize it rather than grant it for the first time — TBD-026 (resolve per verb so tutorial and GDD do not fight).
FS-CMP-006 — Monster level
Section titled “FS-CMP-006 — Monster level”| Space | Rule |
|---|---|
| Open world / most dungeons | Monster level = that operative’s character level, even in a shared instance |
| Raids / specialty / SOLO OPS pinnacle | Authored set level. Under-level allowed (harder). No hard lockout unless later asked |
Difficulty tier and Recommended Level (ARL) for the same space are also area-authored (FS-PRD-005 · FS-DMG-009) — not a separate player menu. An area row owns encounter level policy, Difficulty.Operative / Veteran / ApexThreat, and RecommendedLevel. Open-world ARL = expected sector entry band (not live alvl). PowerΔ uses ARL + MobOffset; CtH still uses alvl vs dlvl.
How to even per-player monster level in coop so it feels fair: TBD-027. Do not implement highest / average / owner as a silent default.
Implementation sketch (until TBD-027 locks): each pawn applies FS-DMG-009 PowerΔ from own alvl vs shared ARL (plus personal MobOffset vs that monster’s dlvl) so two players can share one actor. Do not spawn two hidden copies of the same grunt.
FS-CMP-007 — Contextual Map System (Local Map & World Map)
Section titled “FS-CMP-007 — Contextual Map System (Local Map & World Map)”The map interface is activated contextually and toggled via Tab:
- Context-Aware Activation (Hold / Press Tab):
- On Planet Surface / Combat Sector: Opens Local Map (
W_TFA_LocalMap), centered on current player coordinates. - In Orbit / Station (Indra’s Ring / Dropship): Opens World Map (
W_TFA_WorldMap), displaying the global planetary view.
- On Planet Surface / Combat Sector: Opens Local Map (
- Local Map (
W_TFA_LocalMap) & Missions / Objects Hub:- Map Canvas: Displays sector topology, elevation layers, fog of war, player coordinates/heading, and local world tags (
TFA.World.*). - Integrated Missions & Objects Drawer:
- Filters: All | Campaign | Sub | Tasks | Objects. Tasks is Online only (hidden Solo). Objects = Local POIs (this map only).
- Left panel hosting active Story Missions, Sub-Missions / Bounties, Local POIs / Objects (Fabricators, Weapon Caches, Terminals, Extraction Beacons), and — Online pool only — Daily / Weekly / Hard Objectives (FS-CMP-009). Same Online-task rows and Tasks filter as World Map.
- Online only: if
LastMatchRecapis set, a Last match row sits above Operations / Missions (activity name + outcome). Opens frozenW_TFA_MatchResults(FS-MCH-003). Not a Tasks filter. Empty: no row. Solo never shows it. - Each entry shows status, objectives, distance, and rewards.
- Set as Primary works on Online tasks the same as on story / objects.
- Set as Primary Action:
- Player can select any mission, Online task, or world object and click [Set as Primary].
- Exactly one target can be Primary at any time (shared across Local Map and World Map).
- The Primary target receives an ember/gold pulse on the open map (Local or World) and registers with
UTFAObjectiveSubsystem. That subsystem drives the GUI locator on the OmniVisor: quiet world pip (W_TFA_3DWaypoint), heading-tape pip (W_TFA_HeadingTape), and gold blip onW_TFA_TrackerDisc. It does not spawn an FE26 nameplate on the reticle.
- World Map Transition: A prominent
[ < World Map (Tab) ]button on the top-left lets players ascend to the planetary view.
- Map Canvas: Displays sector topology, elevation layers, fog of war, player coordinates/heading, and local world tags (
- World Map (
W_TFA_WorldMap) & Bi-directional Drilldown:- Displays Earth globe, orbital stations (Indra’s Ring), and macro mission nodes.
- Operations / Missions & Objects drawer: same Online-task rows as Local Map — Daily / Weekly / Hard Objectives — plus Tasks filter (FS-CMP-009). Local Objects / POIs stay on Local Map. Set as Primary works here too.
- Online only: Last match row above Operations when
LastMatchRecapis set (FS-MCH-003). Same frozen Results sheet as Local Map. Not RAID/VAULT launch; not Tasks. - Filters: All | Story | Tasks | Raids | Vaults. Tasks / Raids / Vaults are Online only (hidden Solo). No Objects tab.
- Globe markers: amber task diamonds at the task’s sector (not RAID hexes). Solo never draws them.
- Selecting a sector displays operational summary, threat rating, and a
[ View Local Map (Tab) ]button that transitions down into that sector’sW_TFA_LocalMap.
- Bi-Directional Tab Toggle:
- Pressing Tab while in Local Map swaps to World Map.
- Pressing Tab while in World Map swaps to Local Map (defaulting to the player’s current sector).
- Pressing Esc or clicking [ Close ] returns directly to gameplay.
- GUI locator (play HUD, after Set as Primary):
- Primary (FE30): 8–12 px gold world pip off the reticle + heading-tape gold pip + tracker gold diamond. No name, no meters.
- Secondary options: FE28 (world pip only) or FE29 (heading tape as the heading cue). Not the default ship.
- Tap Tab / M: 4 s ping — name +
{dist} m+ elevation chevron beside the world pip; tape and tracker brighten. - Off-FOV: world pip hides; tape pip parks at the end; tracker blip remains; tiny visor rim tick only.
- One Primary. Clearing Primary hides the locator. Fast travel: TBD-002.
FS-CMP-008 — World tags
Section titled “FS-CMP-008 — World tags”TFA.World.Vaultable · TFA.World.WallRunnable (migrate/alias WallWalkable) · TFA.World.Fabricator · TFA.World.MissionVolume · TFA.World.SafeHub · TFA.World.ObjectivePOI · TFA.World.OnlineTask (daily / weekly / hard; Online pool only).
FS-CMP-009 — Online tasks (daily / weekly / hard)
Section titled “FS-CMP-009 — Online tasks (daily / weekly / hard)”Daily tasks, weekly tasks, and hard objectives only exist on the Online service. They are game objectives, not a Marketplace pane and not a Character I tab.
| Seat | Behavior |
|---|---|
| World (play) | Tagged TFA.World.OnlineTask. Visible in the sector like other objectives. |
| Local Map | Rows in Missions & Objects. Filter Tasks. Online only (hidden Solo). Local Objects stay on this map. |
| World Map | Same Daily / Weekly / Hard rows in Operations / Missions & Objects. Same Tasks filter. Globe markers at the task’s sector. Online only. |
| Track | Set as Primary from either map → UTFAObjectiveSubsystem → FE30 GUI locator. One Primary. |
| Solo | No rows on any map, no world markers, no complete, no BTUCOIN mint from these sources. |
Catalog and grant amounts: TBD-039. Completing one mints BTUCOIN (FS-ECO-008).
FS-WLD-001 — AI classes
Section titled “FS-WLD-001 — AI classes”ATFACharacter (shared vitality / channels) with ATFAAIController. Grunt / Elite / Boss data assets set TTK band, plate size, and immunities. Do not fork a second damage pipeline for AI.
AI behavior (Logic Driver, fuzzy scores, Squad / Agent) lives in GFP TFAAI (FS-AI-001–FS-AI-005). This requirement only locks the shared pawn / damage line. Multiplayer bot brains, monster pack brains, and campaign / world patrol brains are separate LD asset families on that substrate — not one reused Deathmatch graph.
Design authority: docs/superpowers/specs/2026-10-26-ai-substrate-logic-driver-fuzzy-design.md.
FS-AI-001 — TFAAI substrate GFP
Section titled “FS-AI-001 — TFAAI substrate GFP”Logical module TFAAI packs as GFP TFAAI (Runtime). Depends on TFACore (downward only). Not Boot Active — Experiences enable it (world encounters, campaign patrol, MP bot fill, Demo sandbox C). TFACombat / TFAWeapons stay damage and gunfeel; AI never forks a second kinetic pipeline (FS-WLD-001).
Key types: ATFAAIController, UTFAAISquadCoordinator, Agent LD host on the controller, fuzzy membership helper, DA_TFA_AIDifficultyProfile.
FS-AI-002 — Logic Driver as fuzzy system
Section titled “FS-AI-002 — Logic Driver as fuzzy system”Logic Driver Pro is the fuzzy decision layer. Pipeline:
- Sensors / world queries → raw metrics.
- Membership curves → continuous desirability scores [0, 1] on the LD blackboard.
- Soft selection among intents / tactics using those scores plus hysteresis (enter/exit thresholds or dwell) so states do not thrash.
DA_TFA_AIDifficultyProfileremaps curve steepness, reaction delay, aim cone, aggression bias without replacing soft selection with boolean-only high-level goals.
Forbidden as the sole high-level path: hard boolean SM with an outer Goal picker that bypasses LD soft scores.
FS-AI-003 — Squad + Agent graphs
Section titled “FS-AI-003 — Squad + Agent graphs”Every coordinated AI group uses one Squad / Team Logic Driver graph (coordinator) plus per-pawn Agent Logic Driver graphs. The squad writes shared soft intents and role assignments; agents fuzzy-pick local tactics under those intents. Same structural pattern for MP bot teams, monster packs, and patrol cells; different graph assets and intent vocabularies per product brain.
FS-AI-004 — Product brain split
Section titled “FS-AI-004 — Product brain split”Three product brains on TFAAI (full catalogs in Tracks A / B / C):
| Brain | Track | Difficulty semantics |
|---|---|---|
| MP bots | A | UT2004-style ladder (exact table in Track A spec) |
| Monster groups | B | Area Difficulty / ARL / Grunt·Elite·Boss (FS-CMP-006, FS-WLD-001) |
| Campaign / world patrol | C | Mission / sector authored — not UT2004 labels |
Do not share LD graphs, intent names, or difficulty label feel across brains. Outline stubs: docs/superpowers/specs/2026-10-26-ai-track-*-outline.md.
FS-AI-005 — AI authority
Section titled “FS-AI-005 — AI authority”Solo: local authority runs Squad / Agent selection. Online: server owns fuzzy scores, squad intents, and agent tactic selection; clients may predict presentation only. AI fire / move still validates through the same combat auth path as players (FS-ARCH-013 / damage pipeline).
AC-AI-001
Section titled “AC-AI-001”An engineer names GFP TFAAI, ATFAAIController, and states that MP bots, monster packs, and campaign patrol use separate LD asset families on a shared fuzzy Squad+Agent substrate — and that AI does not fork the damage pipeline.
AC-AI-002
Section titled “AC-AI-002”Given a high-level AI goal change, the design path writes continuous blackboard desirability scores and soft-selects with hysteresis inside Logic Driver — not a boolean-only outer brain that only teleports LD into named states.
AC-CMP-001
Section titled “AC-CMP-001”Solo map has no Raid marker, no Vault marker, and no Daily / Weekly / Hard Objective rows or pips on Local Map or World Map. Online Local Map and World Map list a dummy Daily / Weekly / Hard Objective; Tasks filter is on both; Set as Primary can track from either. Online map shows RAID pip 2/4/8. Two Online players at different levels in an open-world volume both receive XP; monster level handling matches the locked rule or the explicit TBD-027 note in the build changelog — never an undocumented party average.
AC-CMP-002
Section titled “AC-CMP-002”Operative on a planetary surface holds Tab: W_TFA_LocalMap opens centered on player. Player selects an extraction terminal object in the left Missions & Objects drawer and clicks [Set as Primary]. Player presses Tab: view smoothly transitions to W_TFA_WorldMap. Online: Operations still lists Daily / Weekly / Hard; Tasks filter works; globe shows amber task diamonds; [Set as Primary] on a Daily tracks FE30. If LastMatchRecap is set, Last match sits above Operations on both maps and opens frozen Results (FS-MCH-003). Solo: World Map has none of those rows, no Tasks filter, no task diamonds, no Last match. Player presses Tab again: transitions back to W_TFA_LocalMap. Player presses Esc: returns to gameplay. Visor ships FE30: quiet gold pip on the terminal (off the reticle), gold pip on the heading tape, gold diamond on the tracker. Tapping Tab or M reveals name + meters + elevation for 4 s beside the world pip — not on the reticle. When facing away, the world pip hides; tape + tracker remain; only a tiny rim tick. FE28 (pip only) and FE29 (tape as heading cue) are secondary options, not the acceptance default. FE26 nameplate-on-reticle fails this test.
18. Presentation, audio, VFX
Section titled “18. Presentation, audio, VFX”FS-FX-001 — Niagara ownership
Section titled “FS-FX-001 — Niagara ownership”Frame sockets own muzzle, mag eject, ADS optic offset. Singularity bursts are grounded radial Niagara + Kinetic impulse. Vision modes are post-process first; Niagara is extra (Heat bloom, Motion trails, Sonar ping).
FS-FX-002 — Animation
Section titled “FS-FX-002 — Animation”- FPP arms and TPP body are both driven; melee equipped hides FPP arms.
- Vault: random clip, shared notify windows (
AnimNotify_VaultApex). - Melee Drive: Motion Warping to a point along stick, not to an actor homing target.
- 2H and dual stances use dedicated anim layers (Lyra-style link layers).
FS-FX-003 — Audio
Section titled “FS-FX-003 — Audio”Dea comms = voice + subtitle. Ultimate flame-on at 100% has a sting. Flow Overclocked and Singularity have distinct stings. Options expose master / music / SFX / dialogue (FE spec).
FS-FX-004 — Armor weight art rule
Section titled “FS-FX-004 — Armor weight art rule”Light / Medium / Heavy change plates only. Underarmor, joints, and visible body scale stay that character’s size (Create Character sex + appearance). Corps C1–C5 are finishes on the same envelopes.
FS-MESH-001 — Mesh attach naming (Full game)
Section titled “FS-MESH-001 — Mesh attach naming (Full game)”Not Demo — Demo stays placeholders + fake-modular dials. Full cheat sheet + stub alias table: docs/inventory/mesh-naming.md. Product stack: FS-APP-002. Guns: FS-GUN-004 / FS-GUN-006. Armor weight: FS-FX-004.
Grammar
{domain}_{role}_{slot}[_{host}][_{corp}_{auth}_{id}]| Token | Values |
|---|---|
domain |
a armor · w weapon |
role |
socket · spine · receiver · module · plate · under · flare |
slot |
Armor: helm chest gloves belt boots scapula_l … · Guns: barrel barreltip mag optic counterweight stock brace grip frontgrip underlug + keyed · Melee: head guard haft pommel core + family aliases |
host |
Meshes only — guns Class/share + Receiver when keyed; armor mass light med heavy |
corp |
Meshes only — c1…c5 |
auth |
Meshes only — kit | hand |
id |
kit → v1…v5 · hand → stable slug |
Rules
- Sockets never encode corp/auth (
a_socket_chest,w_socket_barrel). Meshes do (a_plate_chest_heavy_c3_kit_v1,w_module_barrel_kinetic_c1_kit_v3). - Armor corp = mesh language (different silhouettes, same sockets). Gun modular corp = finish family on shared kit geometry.
hand= Legendary / Unique / Apex (outside Refit five-packs).- Bone name = Soft Object Path stem.
- Legacy
a_<slot>/a_<slot>_armor→a_socket_<slot>/a_plate_<slot>_….
Attach order (guns): Spine → Receiver → Barrel (+ tip) → Mag / Optic|Counterweight / Stock|Brace / Grip / FrontGrip|Underlug.
Attach order (melee): Spine → Head → Guard → Haft → Pommel → Core. Wrist Razors/Claws = Wrist Melee slot only (hotkey 1) — same five parent sockets; not a Weapon 1–4 family.
AC-MESH-001
Section titled “AC-MESH-001”Author a Rifle Auto kit: sockets have no c#; module Soft Object Paths include c1…c5 + kit/hand. Equip Heavy chest plate: a_plate_chest_heavy_* swaps; a_socket_chest name unchanged; underarmor scale unchanged (FS-FX-004).
19. Online, Ladder, and integrity
Section titled “19. Online, Ladder, and integrity”FS-NET-001 — EOS
Section titled “FS-NET-001 — EOS”Online path requires an EOS Product User ID (PUID). Username / password (TFA if enabled) and Continue with Discord (FS-ID-001–FS-ID-005) both produce that PUID. Store login for Marketplace does not move a Solo character into the Online pool. FE spec owns the screens.
FS-NET-002 — What replicates
Section titled “FS-NET-002 — What replicates”Stance tag, vitality, Flow combo (server), active vision (cosmetic; server may ignore for gameplay reveals that must be anti-cheat authoritative — TBD-028), equipped item IDs, ActiveSetIDs (Name array; server-validated against ASBP — FS-ITM-004), Ultimate charge, Energy, grenade charges.
Equipped Set piece counts are server-derived from equipped Unique / Apex SetID fields; threshold power applies only for IDs in ActiveSetIDs under ASBP (FS-ITM-004). Do not replicate chip Set tags as membership. Legendary has no Artifact socket.
Do not replicate full bag contents to other clients. Other players see cosmetics + stance + IFF. Do not replicate Credits, BTUCOIN, or LUMENAR balances to other clients. Player chat (FS-HUD-010) is server-routed by channel: fireteam members, online clan members, match activity roster, current instance, proximity set, or whisper target.
FS-NET-003 — Ladder normalization
Section titled “FS-NET-003 — Ladder normalization”Same gunfeel baseline. Strip or cap affix deltas. Frames remain readable. Crit % off.
FS-NET-004 — Raid / Vault
Section titled “FS-NET-004 — Raid / Vault”Matchmaking by activity size 2 / 4 / 8. That is instance size, not the Social fireteam cap. A fireteam may hold 8; a story coop instance still caps at 4. Set monster level. Campaign-complete Online characters use the endgame hub. Solo characters cannot enter these instances.
FS-SOC-001 — Social page
Section titled “FS-SOC-001 — Social page”Command Deck tab Social (W_TFA_Social). Replaces Clan on the bar. Panes: Fireteam, Clan, Friends, Discord. Fireteam pane lists everyone else in the current instance with a row Invite. Clan pane lists the full roster and keeps clan org invites. Friends pane lists EOS Friends. Favorites (FS-SOC-008) on Clan and Friends. Solo: tab visible and locked — “Social is Online only.” Online overlay; does not pause (FS-SES-005). Character screen I still has no social tabs.
FS-SOC-002 — Fireteam
Section titled “FS-SOC-002 — Fireteam”Session group. Cap 8. Distinct from ClanId. Online in-world starts as a fireteam of 1. Leader invites and removes. Mixed clans allowed. Accepting a fireteam invite or Joining leaves the previous fireteam. Leader leave: oldest remaining member becomes leader. Fireteam invites are session-scoped and die if that fireteam dissolves. Privacy: FS-SOC-005.
FS-SOC-003 — Clan
Section titled “FS-SOC-003 — Clan”Persistent. Create only if ClanId is empty. One clan at a time. Server-authoritative; fail closed. Founder / leader invites and kicks. Reset Campaign keeps membership. Leave (confirm) before creating another. Roster is the full member list (online and offline) on this pane. Clan org invite sheet stays here. Row Invite is a fireteam Send to that member (FS-SOC-004), not a clan org invite. Favorites: FS-SOC-008. Roster cap and extra ranks: TBD-031. Solo cannot create or join.
FS-SOC-004 — Discord invite delivery
Section titled “FS-SOC-004 — Discord invite delivery”OAuth-link Discord to the live EOS PUID (FS-ID-004 scenario C / EOS_Connect_LinkAccount). Not a second game account. Not voice. Not a friends list. Cold login from the EOS screen is FS-ID-004 A/B (EOS_Connect_Login / CreateUser).
Game server issues clan and fireteam invite tokens. W_TFA_InviteSheet has one Send. Row Invite on Instance, Friends, and Clan roster is the same fireteam Send, pre-filled to that PUID. Fireteam Send lands only if the target’s Accept fireteam invites from includes the sender (FS-SOC-005); then Accept is automatic. That press also delivers on Discord if sender and target are linked. Discord miss does not fail Send. Unlinked sender: in-game still lands when Accept allows it. Clan org invites ignore fireteam privacy. Accept for clan org is always in Terra Firma. Discord deep link opens the game / EOS session; fireteam follows privacy, clan org presents Accept. Invite expiry: TBD-032. Fail closed: Solo, fireteam at 8, already in that clan, target not in the Online pool, target Accept excludes you, target offline (fireteam Invite). Do not ship a second Discord-only send.
FS-SOC-005 — Fireteam privacy
Section titled “FS-SOC-005 — Fireteam privacy”Settings → Social (W_TFA_Settings / UTFAGameSettingRegistry). Same Options screen. Online only. Solo: tab visible, rows locked.
| Setting | Options | Server rule |
|---|---|---|
| Accept fireteam invites from | Anyone / Friends or clan / Friends / Clan / Nobody | Send to this PUID fails closed outside the set. Inside: auto-accept. Clan = same ClanId on the live character. Friends = EOS Friends on this PUID. |
| Who can join my fireteam | Invite only / Friends or clan / Friends / Clan / Anyone | Eligible players Join without an invite while roster < 8. Invite only = no Join. Leader may still kick. |
Default for the HAVOC example: both Friends or clan. Per PUID. Clan check uses current character ClanId. Discord friends are not this list.
FS-SOC-006 — Friends
Section titled “FS-SOC-006 — Friends”W_TFA_Friends. EOS Friends on this PUID. Full list on the pane. Add / remove by Online display name / EOS. Not Discord. Not voice. Not a second account. Used as the Friends set for FS-SOC-005. Each online friend has row Invite (fireteam Send). Offline: no fireteam Invite. Favorites: FS-SOC-008. In-game text chat is OmniVisor FS-HUD-010, not this pane.
FS-SOC-007 — Instance list
Section titled “FS-SOC-007 — Instance list”Fireteam pane section In this instance (W_TFA_InstanceList). Lists every other Online player in the current instance (hub, story, RAID, Vault). Omits you. Already on your fireteam: On fireteam, no Invite. Everyone else: row Invite (same Send as FS-SOC-004). Row Report opens W_TFA_Report (FS-TRS-002). Ghost spectators are omitted. No favorite control on this list — star lives on Clan and Friends. Not a friends list. Not Discord. Empty instance besides you: show the empty state, keep the fireteam slots.
FS-SOC-008 — Favorites
Section titled “FS-SOC-008 — Favorites”Per PUID, not per character. One favorite flag per target PUID. Clan roster and Friends list share that flag. Toggle is a diamond on the row. Favorites sort first, then this instance, then online, then name. Persist on the Online account. Reset Campaign keeps favorites. Not a privacy set — Accept / Join still use EOS Friends and ClanId. I-screen has no favorite list.
AC-SOC-001
Section titled “AC-SOC-001”Online: Social opens Fireteam (1 of 8) with In this instance rows and Invite. Clan shows the full HAVOC roster plus clan org Send. Friends shows the EOS list with Invite. Settings → Social shows Accept / Join. Create clan HAVOC on an empty ClanId. Invite sheet has one Send. Solo: Social shows the locked string; create, invite, Join, favorite writes, and privacy writes are rejected.
AC-SOC-002
Section titled “AC-SOC-002”Fireteam at 8: further fireteam invites and Joins fail closed. Unlinked Discord: Send still lands in-game when Accept allows it; Discord delivery is skipped, not a failed invite. Accepting a fireteam invite or Joining removes the pawn from the old fireteam. A Discord click with a dead token does not join. Two send buttons on the sheet fails this test.
AC-SOC-003
Section titled “AC-SOC-003”Ash Cantor (HAVOC): Accept = Friends or clan, Join = Friends or clan. A clanmate Joins without Send. A stranger Send fails closed. Invite only: Join is hidden / rejected. Nobody: all fireteam Sends fail closed; clan org invite still lands. Discord friends who are not EOS Friends do not pass the Friends set.
AC-SOC-004
Section titled “AC-SOC-004”Online Social, Ash Cantor in HAVOC on Ring Approach. Fireteam pane lists Tess Ward, Juno Pike, Rex Dalton with Invite. Clan pane lists Ash (you), Tess, Mara Voss, Len Sato; Len is offline with no Invite; clan org Send is on the pane. Friends pane lists Tess, Cal Renn, Nia Brooks. Diamond on Tess sorts her first on Clan and Friends. Toggling Tess’s diamond updates both panes. Juno has Invite and no diamond. Offline Nia has no Invite. Row Invite uses the same Send as the sheet. No favorite control on the instance list.
FS-NET-005 — Disconnect
Section titled “FS-NET-005 — Disconnect”Session-lost screen (FE thin screen). Online inventory mutations fail closed. Solo writes a backup until the next successful save (FE spec).
AC-NET-001
Section titled “AC-NET-001”Two clients in a Raid: both see the same takedown on a shared elite (server Flow). A client cannot socket an Artifact by RPC without server validation.
FS-TRS-001 — Trust overlay
Section titled “FS-TRS-001 — Trust overlay”Command Deck tab Trust (W_TFA_Trust). Online only. Visible when the PUID has a studio or volunteer staff flag. Solo: hidden, or visible and locked. Overlay policy FS-SES-005. Character I has no Trust tab. No CREDITS / BTUCOIN chips on this window. Queue states: New / Watching / Needs studio / Closed. Volunteers cannot open studio-only cases. Web/admin console is later and must use the same case IDs — not required for P9b.
FS-TRS-002 — Player report
Section titled “FS-TRS-002 — Player report”W_TFA_Report. One Send. Open from In this instance Report, from a chat-line Report this player (FS-HUD-010), from a Match Results row click (FS-MCH-001 / FS-MCH-002; RAID / Vault / Ladder only), or optional IFF-pip hold. Target is PUID + character name. Pre-fill match instance ID when opened from Results. Category chips only (combat feel, movement, vision, chat, economy / marketplace, other). Optional last-view clip (TBD-043). Server stamps instance, activity, map, time, reporter, target. Fail closed: Solo, empty target, cooldown (TBD-044), target not Online, self row. Combat / downed may still Send. Reporter sees “Report received.” Never told whether a ghost joined. Frozen recap after the instance is gone still opens this sheet (spectate stays disabled). Do not document exploit steps on the sheet. Do not invent a second report form.
FS-TRS-003 — Discord pager
Section titled “FS-TRS-003 — Discord pager”Worker HTTP webhook after the case writes (FS-ARCH-012). Volunteer channel vs studio-only channel (TBD-046). Payload: case ID, category, instance, target display name, deep link. No bags, no Credits / BTUCOIN / LUMENAR, no packet dumps. Discord miss does not drop the case. Discord role alone does not grant spectate — EOS staff flag does.
FS-TRS-004 — Case log
Section titled “FS-TRS-004 — Case log”Server store owned by MonetaryPlatform AntiCheat (case-log hooks). Game Trust UI writes and reads through that API. Merge window for same target + instance is data. Fields: who / what / when / where, report text, clip IDs, cheap-reject counts, spectate join/leave, notes (volunteer vs studio), outcome. Retention TBD-045. Players never read another player’s case. Heuristics and replay never delay damage GEs (FS-ARCH-013).
FS-TRS-005 — Ghost spectate
Section titled “FS-TRS-005 — Ghost spectate”Spectate RPC places the staff client in that dedicated instance as a ghost. Not a player pawn. Does not consume RAID / Vault 2 / 4 / 8 or fireteam 8. Omitted from instance list, Match Results roster, IFF, chat, fireteam, clan-in-activity. Target is not notified. Full instance relevancy may apply to the ghost; bags and wallets still do not replicate (FS-NET-002). Camera: free fly + Follow (W_TFA_GhostHud). No combat OmniVisor chrome. No loot / damage / interact / spend. Do not SetGamePaused. Instance gone: Spectate disabled, case remains. Leave returns to Trust overlay or hub.
FS-TRS-006 — Kick and ban
Section titled “FS-TRS-006 — Kick and ban”Volunteer: notes + Needs studio only. Studio: kick dumps the target per FS-NET-005; fireteam members stay. Restrict / ban is EOS / Online pool, studio only. Volunteer roster and flag source: TBD-047.
AC-TRS-001
Section titled “AC-TRS-001”Online staff-flagged PUID: Trust tab lists a new player report; Spectate joins the live instance with no extra player slot; other clients do not see the ghost on In this instance or Match Results. Volunteer Send on Kick is rejected. Studio Kick dumps the target; fireteam remains. Solo: Trust Send / Spectate / Kick fail closed.
FS-MCH-001 — Live Match Results overlay
Section titled “FS-MCH-001 — Live Match Results overlay”W_TFA_MatchResults. Match = RAID 2 / 4 / 8, Vaults, Competitive Ladder only. Hidden in hubs, open world, story coop, Solo. GFP: TFAOnline (snapshot) + TFAFrontend (chrome). Overlay policy FS-SES-005 — LIVE, does not pause, hit does not close it. Not Character I. No CREDITS / BTUCOIN. Ghosts omitted.
Open: Command Deck chip Results while the activity is RAID / Vault / Ladder; also Esc session menu. Visor bind TBD-048 — do not steal Tab (Tab stays Local / World map). Roster: every player pawn in the activity, including you. Ghosts omitted.
Match header (not per row): activity name, RAID / Vault / Ladder tag, size 2 / 4 / 8, duration, outcome copy (TBD-050), completion reason when abnormal, map / sector ID, match instance ID (Trust path only — not on public board).
Team strip when the activity authors teams (FS-MCH-004): team name / side, team score, team standing. Ladder always draws it. RAID / Vault omit when single-outcome.
Row columns (live + frozen): Name; Order (Enforcer / Arcwarden / Phantom); Standing (Ladder + scored activities); Score (hide when activity has no score); Kills; Assists; Deaths; K/D; KDA; Efficiency = (Kills + Assists) ÷ (Deaths + 1); Precision kills; Precision % = precision kills ÷ gun kills (hide when gun kills = 0); Ultimate kills; Peak Flow (1 / Overclocked / Singularity); Time played (seconds present); Completed (Y finished in roster at stamp / N left early). Ladder sorts Standing then Score. K/D / KDA / Efficiency are allowed but never the sole Ladder identity.
Expand row (this match only): gun / melee / tentacle / ordnance / skill kills; Singularity takedowns; Defeats; best kill streak; average life; best weapon Receiver (Type) badge; per-equipped-slot (W1–W4 + Wrist) kills + precision kills + damage dealt; Triumph IDs earned this match; left-early flag; completion reason when Completed = N.
Ladder score panel (expand, not main column): base score, objective bonus, multiplier stack, reward score — server snapshot scoreboardValues; clients do not recompute (FS-MCH-005).
Server-owned; clients display the snapshot. Click another player → W_TFA_Report (FS-TRS-002) pre-filled to that PUID + this match instance ID. No Report on self. Combat / downed can still Send. Disconnect mid-match: row marks left; recap still freezeable for those who finish.
FS-MCH-002 — Freeze + persist last recap
Section titled “FS-MCH-002 — Freeze + persist last recap”At match end the server stamps the recap: all row columns, header, team strip, expand payloads, and scoreboard values. The same widget freezes. Recap auto-opens once (Close allowed). Continue dumps to the post-activity seat (hub / orbit) per existing disconnect-safe Online rules. Do not SetGamePaused. Report still works on frozen rows after the instance is gone. Frozen payload is stored for LastMatchRecap, Match History (FS-MCH-006), and career rollups (FS-CAR-001).
Persist one LastMatchRecap on the Online character. Overwrite only when the next RAID / Vault / Ladder ends. Starting a new match clears live Results and does not wipe Last match until that new match finishes. Reset Campaign keeps it (FS-SES-003). Solo never has one. Lifetime if they never queue again: TBD-051 (recommended: no TTL; overwrite only on next finished match).
FS-MCH-003 — World / Local Map Last match
Section titled “FS-MCH-003 — World / Local Map Last match”GFP: TFAFrontend (map chip / open frozen widget). World Map Operations drawer: row Last match (activity name + outcome) opens frozen W_TFA_MatchResults. Same row on Local Map Missions & Objects so the player is not forced into orbit. Filters: not Tasks; row sits above Operations, Online only. Empty LastMatchRecap: no row. Same Report path as FS-MCH-001.
AC-MCH-001
Section titled “AC-MCH-001”Online RAID / Vault / Ladder: Results overlay opens from Command Deck / Esc; world keeps running; click another player opens W_TFA_Report; self has no Report. Match end freezes the same widget and auto-opens once; Continue does not pause. After return, World Map and Local Map show Last match and open the frozen recap. Starting a new match does not wipe Last match until that match ends. Hub / open world / story coop / Solo: Results chip hidden; no Last match row. Ghost omitted from the roster. Row columns match FS-MCH-001 including Standing, K/D, KDA, Efficiency, Precision %, Time played, Completed; expand row and Ladder score panel per FS-MCH-005.
FS-MCH-004 — Team strip
Section titled “FS-MCH-004 — Team strip”When DA_TFA_Mission or Ladder rules author teams: draw team strip on W_TFA_MatchResults — team label, team score, team standing. Ladder always. RAID / Vault omit when single shared outcome. GFP: TFAOnline snapshot + TFAFrontend chrome.
FS-MCH-005 — Ladder score panel
Section titled “FS-MCH-005 — Ladder score panel”Expand-only panel on Ladder recaps: base score, objective bonus, multiplier stack, reward score. Server fields scoreboardValues on the frozen payload. Clients display only. GFP: TFAOnline.
FS-MCH-006 — Match History archive
Section titled “FS-MCH-006 — Match History archive”W_TFA_MatchHistory. Online only. Journey → Match History tab and Social → Recent matches shortcut open the same widget. List columns: date/time, activity name + tag, size, outcome, duration, your standing, your score, your K/D. Click row → frozen W_TFA_MatchResults for that instance. Retain at least 50 finished matches per Online character (TBD-053 may raise); oldest drops at cap. Reset Campaign keeps rows (FS-SES-003). Solo: no history widget. GFP: TFAOnline store + TFAFrontend chrome.
FS-MCH-007 — Triumphs on match expand
Section titled “FS-MCH-007 — Triumphs on match expand”When expand row is open, show Triumph IDs earned in that instance only. Lifetime Triumph catalog and counts live in FS-CAR-003. Triumph chips do not open Report.
FS-CAR-001 — Journey Career tab
Section titled “FS-CAR-001 — Journey Career tab”W_TFA_JourneyCareer. Command Deck Journey → Career. All-time character totals (Online server / Solo local): matches played; wins / losses; time played; kills / assists / deaths; K/D / KDA / Efficiency; precision kills / precision %; ultimate kills; Peak Flow tier counts; best kill streak; average life; gun / melee / tentacle / ordnance / skill kills; Singularity takedowns; Triumphs earned count. Updated when a RAID / Vault / Ladder match freezes (FS-MCH-002). Not live Results. GFP: TFAOnline + TFAFrontend.
FS-CAR-002 — Collections weapon mastery
Section titled “FS-CAR-002 — Collections weapon mastery”W_TFA_CollectionsMastery. Command Deck Collections → Weapons. Per DA_TFA_GunReceiver (Type; Class derived) and DA_TFA_MeleeFamily: career kills, precision kills, assists, damage dealt, time equipped, precision %, matches as primary Receiver / melee family, favorite badge when top career kills. Instance Inspect trackers roll into Receiver / melee-family totals server-side. Not per item hash. Cadence never tracked. GFP: TFAOnline + TFAFrontend.
FS-CAR-003 — Triumphs catalog
Section titled “FS-CAR-003 — Triumphs catalog”W_TFA_Triumphs. Journey → Triumphs. Catalog rows: Triumph ID, name, icon, flavor copy, lifetime count, category (match feat, objective, Flow / Singularity, Ladder placement, no-death segment). No power grants unless a future Online task references the ID. GFP: TFAOnline + TFAFrontend.
FS-CAR-004 — Mode aggregates
Section titled “FS-CAR-004 — Mode aggregates”W_TFA_ModeAggregates. Journey → Modes. Per RAID, Vault, Ladder blocks: matches, wins, kills, deaths, average score when scored, best standing; Ladder also wins / losses, average standing, current season rank snapshot. Open world and story coop do not feed. GFP: TFAOnline.
FS-CAR-005 — Ladder leaderboard
Section titled “FS-CAR-005 — Ladder leaderboard”W_TFA_LadderBoard. Journey → Ladder and read-only on Ladder queue UI. Season or window ID (TBD-054). Rows: place, character name, optional clan tag, score, wins, losses, K/D, Efficiency. Pin viewer row when ranked. Normalized Ladder stats (FS-NET-003). Career window board — not per-match Standing on Results. GFP: TFAOnline + TFAFrontend.
FS-API-001 — Companion Player API product boundary
Section titled “FS-API-001 — Companion Player API product boundary”Ship a read-only public HTTP API so a separate companion Discord bot, the website BenchMark Leaderboard, and third-party apps can look up Online player info (app-key + component-profile). Not a second career store inside UE. Not the invite-delivery Discord app (FS-SOC-004 / FS-ID-*).
| Layer | Owns |
|---|---|
| TFAOnline | Authoritative Online career / Match History / Ladder writes (FS-MCH / FS-CAR) |
| Companion API gateway | Read HTTP v1 in front of that store + CDN manifest (Architecture P9c) |
| Invite Discord | Client SDK → EOS_Connect_LinkAccount + invite deep links — different Discord application |
| Companion Discord bot | Separate Discord app; X-API-Key only; slash commands / embeds; no invite Send |
| MonetaryPlatform AntiCheat | Trust / fraud only — not profile stats |
Solo pool never appears. Design map: docs/31-companion-player-api.md · docs/superpowers/specs/2026-11-12-companion-player-api-map.md.
FS-API-002 — Identity
Section titled “FS-API-002 — Identity”| Concept | Lock |
|---|---|
| Membership ID | EOS PUID |
| Character ID | Online character GUID |
| Display name | Online display name |
| Discord → PUID | GET /v1/memberships/by-discord/{id} when linked (FS-ID-004 C); opaque Discord id only |
FS-API-003 — Auth + rate limits
Section titled “FS-API-003 — Auth + rate limits”X-API-Keyrequired on every call (studio-registered, revocable).- Optional later: player OAuth Bearer for Friends / Private components.
- Per-key rate limits; display-name search stricter than profile GETs.
FS-API-004 — Profile components (reuse §19 — do not invent stats)
Section titled “FS-API-004 — Profile components (reuse §19 — do not invent stats)”| Component | Source | Default |
|---|---|---|
Profiles |
PUID, display name, opaque Discord id, clan tag | Public |
Characters |
Name, Order / Faction, level, subclass unlocks | Public |
CharacterEquipment |
Equipped cosmetics only (FS-NET-002) | Public (lockable) |
Career |
FS-CAR-001 | Public (lockable) |
CollectionsMastery |
FS-CAR-002 | Public (lockable) |
Triumphs |
FS-CAR-003 | Public (lockable) |
ModeAggregates |
FS-CAR-004 | Public (lockable) |
LadderStanding |
FS-CAR-005 | Public when ranked |
MatchHistory / LastMatchRecap |
FS-MCH-006 / FS-MCH-002 | Friends (lockable) |
Hard deny: bags / Secure Locker; Credits / BTUCOIN / LUMENAR; marketplace listings; Case / mystery / OV clues; Trust / reports / ghost; chat; Solo; secrets / Discord tokens; others’ fireteam Accept / Join; any write / mutate.
FS-API-005 — HTTP surface (v1 path contract)
Section titled “FS-API-005 — HTTP surface (v1 path contract)”Host is ops. Path shape is the lock:
GET /v1/memberships/search?displayname=GET /v1/memberships/by-discord/{discordUserId}GET /v1/profiles/{puid}?components=GET /v1/profiles/{puid}/characters/{characterId}?components=GET /v1/leaderboards/ladder?season=GET /v1/manifest/{entityType}/{hash}
Locked components → privacy: locked (prefer over bare 404 on an otherwise visible profile).
FS-API-006 — Player privacy (FE)
Section titled “FS-API-006 — Player privacy (FE)”Settings → Social (same Options as fireteam privacy — FS-SOC-005). Defaults: Career / Equipment / Collections / Triumphs / Modes = Public; Match History = Friends. Ladder standing stays public when ranked. App-key-only callers see Public components; Friends needs player OAuth.
FS-API-007 — Two Discord products (hard split)
Section titled “FS-API-007 — Two Discord products (hard split)”| Invite Discord | Companion Discord bot | |
|---|---|---|
| Discord application | Game client / invite delivery | Separate app |
| Purpose | Link account + deliver invite deep links | /stats, /ladder, profile cards |
| Auth | Discord OAuth → EOS_Connect_LinkAccount |
Companion API X-API-Key (+ optional player OAuth later) |
| Writes game state | Invite tokens via game server | None (read-only) |
| FS | FS-ID-* · FS-SOC-004 | FS-API-* |
Linked Discord on a PUID enables by-discord membership bridge only — not invite authority.
Out of scope (v1): loadout writes, presence / instance join from the bot, Case / Pre-CF mystery, replacing EOS Friends with Discord friends, building the Discord bot repo itself.
AC-API-001
Section titled “AC-API-001”App-key search returns public Characters / Career / Ladder. Match History locked without OAuth under default Friends. Hard deny bags / wallets. Discord-id membership only when linked. Companion Discord application ≠ invite Discord application. Solo PUID never appears in search.
AC-CAR-001
Section titled “AC-CAR-001”Finish Online Ladder match: Journey Career increments matches and combat totals; Collections Weapons row for the credited Receiver (Type) / melee family updates; Triumph earned in match appears in expand and in Triumphs lifetime count; Match History appends a row; Ladder board updates when season rules say so. Solo RAID has no Results / History / Career Online widgets — local Solo character may still accumulate local career if a future Solo competitive activity authors it (default: no).
FS-TRK-001 — Weapon instance trackers on Inspect
Section titled “FS-TRK-001 — Weapon instance trackers on Inspect”GDD lock: lock_weapon_trackers.svg. Guns and melee only — not armor, jewelry, shields, Mechanical Arms, or ammo.
W_TFA_Inspect_Trackers is a child strip on W_TFA_Inspect, below the stat plate. Tracks this item instance (item GUID), not career aggregates across all weapons and not Match Results main columns.
| Tracker | Meaning |
|---|---|
| Kills | Defeats credited to this weapon while equipped / fired |
| Precision kills | Headshot connects with this weapon |
| Precision % | Precision kills ÷ kills when kills > 0 |
| Assists | Assist credit while this weapon was active (TBD-052 window) |
| Damage dealt | Server-summed kinetic + elemental damage |
| Time equipped | Seconds this instance was in a loadout slot |
| Best kill streak | Longest uninterrupted defeat chain with this instance |
Online: server-owned; replicate to owning client on Inspect open. Solo: local instance store. Trade / mail keeps counts on that instance. Refit preview ghosts stat plate deltas — trackers do not ghost. Dismantle or Apex Invoke break destroys the instance and clears trackers with it.
Match Results expand row may show per-equipped-slot kills + precision kills for that match only (FS-MCH-001). Inspect trackers are lifetime on the item.
GFP: TFACharacterI (presentation) + TFAOnline (Online persistence) / Solo inventory subsystem.
AC-TRK-001
Section titled “AC-TRK-001”Inspect a gun with prior kills: trackers draw below the stat plate. Refit preview changes stat ghosts; tracker numbers stay fixed until a new kill with that instance. Inspect armor: no tracker strip. Dismantle the gun: instance gone; a new craft of the same Receiver starts at zero. Online: counts survive logout and return on reopen Inspect.
Precision / slide / air / hip / multi-kill flags on kill credit also feed Familiarity XP on that instance (FS-ITM-013) — weighted, soft-capped per minute (anti-farm).
FS-TRK-002 — Armor / jewelry / ES worn-performance trackers
Section titled “FS-TRK-002 — Armor / jewelry / ES worn-performance trackers”Armor, jewelry, and Energy Shield instances track worn performance while equipped (not kill attribution): combatSeconds, damageMitigated, shieldEvents, parkourCount, abilitySpend, teamUtility, objectiveTicks. These feed Familiarity XP (FS-ITM-013). Dismantle clears. Refit does not reset.
AC-TRK-002
Section titled “AC-TRK-002”Equip armor into combat: combatSeconds increments; Familiarity XP drips. Holstered armor earns nothing. Dismantle clears trackers + Familiarity.
20. Data assets (engineering inventory)
Section titled “20. Data assets (engineering inventory)”Create these as Primary Data Assets / tables before content fill. Empty rows are fine; missing types are not.
| Asset | Purpose |
|---|---|
DA_TFA_GunReceiver |
Keyed Class × Receiver (Type). FireMode, CadenceUnit, DefaultBurst, AA Mag/Stick/Rot/Strafe bands (FS-GUN-008), ReticleFamily, Stance (1H/2H/Handheld2H), ammo brick, accessory socket layout (FS-GUN-004). Gatling has one row per legal Class. Legacy name DA_TFA_GunFamily maps here |
DA_TFA_GunFrame |
Class × Receiver × Frame (Class required when Receiver is multi-Class) or Receiver × Frame: core / specialty dials, cadence number, recoil pattern, Impact / Mag / Range bands (FS-GUN-009), RangeStat 0–100 (FS-GUN-011), allowlist. Must not rewrite FireMode or AA baseline. Salvage key with Class + Receiver + Frame + rarity (FS-CRF-005, FS-GUN-007) |
DA_TFA_GunPart |
Class × Receiver × Socket × Variant (accessory sockets); owned variables; C1–C5 meshes; salvage unlock (FS-CRF-008). Never writes cadence / Fire Mode / AA. Receiver structural finish unlock is separate from accessory Install |
DA_TFA_MeleeFamily |
Family, 1H/2H, attribute scaling |
DA_TFA_MeleePart |
Family × Socket × Variant (Head / Guard / Haft / Weight / Core); C1–C5 meshes; salvage unlock (FS-CRF-008) |
DA_TFA_MeleeBase |
Normal/Exceptional/Elite name triple |
DA_TFA_ArmorBase |
Slot × Light/Med/Heavy triples. Salvage Blueprint key with type + rarity (FS-CRF-005) |
DA_TFA_ShieldBase |
Phys vs Energy (Barrier) |
DT_TFA_Affixes |
Group, prefix/suffix, alvl, illegal stacks |
DT_TFA_Gems |
11 × 5 × 4 |
DT_TFA_PhononShards |
A→Ma |
DT_TFA_PhononChords |
Word, sequence, legal bases |
DA_TFA_Artifact |
Chip power only. Optional flavor Set tag is ignored for piece count. |
DA_TFA_LegendaryItem |
Fixed package. SetID always none. Cook / spawn fail-closed if a row authors one. |
DA_TFA_UniqueItem |
Fixed package. Optional Set ID + piece index. Standalone Unique has none. |
DA_TFA_ApexItem |
Fixed package. Optional Set ID + piece index. May feed Sets. InvokeEligible is instance, not this row. |
DA_TFA_Set |
Set ID, named piece indices, bonus ladders 2 / 3 / 4 / 5 / 6. Catalog fill is data; the type is required. |
DA_TFA_AbilityNode |
Tree, Energy/charge, Customizable tags |
DA_TFA_Ordnance |
Twelve types + three mods |
DA_TFA_SingularityBursts |
Ten varieties |
DA_TFA_Subclass |
Order / Faction / roster T1–T5 / Ultimate seats. Create does not pick a row. |
DT_TFA_SubclassUnlock |
Class level → UnlockedSubclassCount 1–5 (TBD-029). Empty until that lock. |
DT_TFA_XPCurve |
TBD fill |
DA_TFA_Mission |
Part, markers, Solo vs Online delivery. Daily / weekly / hard rows are Online-only and list on Local Map and World Map (FS-CMP-009) |
DA_TFA_AIDifficultyProfile |
Fuzzy curve multipliers + reaction / accuracy / aggression hooks (FS-AI-002). Row semantics differ per product brain (UT2004 ladder = Track A only; area / role = Track B; mission = Track C) |
DA_TFA_AIEnemyTier |
Grunt / Elite / Boss: TTK band, plate size, immunities (FS-WLD-001). Combat data — not LD graphs |
DA_TFA_MapSector |
Sector topology, bounds, fog texture, sub-regions |
DA_TFA_SectorObject |
POI tag, world coordinate, category (Story/POI/Cache/Extract/OnlineTask) |
DT_TFA_AmmoCaps |
Field / Specialist / Siege reserve caps (TBD-040). Not bag stacks |
DT_TFA_CryptoPlayGrants |
Daily / weekly / hard-objective fiat (V) rows (TBD-039); runtime mints (M = V / P). Online only |
DA_TFA_CryptoConfig |
Token display name BTUCOIN, floor fiat (TBD-035), market feed hook, 51/49 split (locked), LUMENAR-per-fiat (R) (TBD-036) |
DT_TFA_LumenarCashPacks |
Marketplace cash → BTUCOIN mint sizing table (fiat (V); TBD-036) — cash never grants LUMENAR directly (FS-ECO-003) |
DA_TFA_TrustRole |
PUID staff flag: volunteer vs studio. Ban power is studio only. |
DT_TFA_TrustCase |
Case store type (reporter, target, instance, category, notes, outcome). Schema may live in TFA Content; authoritative store / API is MonetaryPlatform AntiCheat. Empty rows until fill. |
DT_TFA_ItemCombatStats |
Per item-instance weapon trackers (FS-TRK-001). Keyed by item GUID. |
DT_TFA_MatchRecap |
Frozen match payloads for History + Last match (FS-MCH-002, FS-MCH-006) |
DT_TFA_CareerCombat |
Journey Career + mode aggregate rollups per character (FS-CAR-001, FS-CAR-004) |
DT_TFA_WeaponFamilyStats |
Collections weapon mastery per Receiver (Type) / melee family (FS-CAR-002). Legacy name kept; gun rows key on Receiver |
DT_TFA_Triumph |
Triumph catalog + per-character counts (FS-CAR-003) |
DT_TFA_LadderSeason |
Leaderboard window / season rows (FS-CAR-005, TBD-054) |
21. Implementation phases (suggested)
Section titled “21. Implementation phases (suggested)”Not a schedule — a dependency order so systems are not built against missing contracts.
| Phase | Ships | Blocked on |
|---|---|---|
| P0 | Lyra remap FE (existing spec), character pool, Create Character with no subclass picker (FE17 / FS-PRD-004), empty Earth hub, EOS login + Discord Connect identity (FS-ID) | — |
| P1 | Camera director, loadout state machine, movement verbs, OmniVisor chrome + GUI locator (FE30) — TFACombat spine + TFAOmniVisor (Plugify) | P0 |
| P2 | GAS vitality + kinetic/elemental pipeline + TFAMelee + TFASingularity (Flow climax; Plugify) | P1 |
| P3 | Gunfeel Firehand Bus + one Receiver × two Frames with distinct cadence (FS-GUN-007) — TFAWeapons (Plugify) | P2 |
| P4 | Inventory 15 + bags (no ammo tiles) + Inspect + salvage + I-wallet chips | P2 |
| P4b | Economy ledger: play Credits (vendors, account-shared), Online play BTUCOIN (daily / weekly / hard obj on Local Map and World Map), Marketplace cash → BTUCOIN mint 51/49, Wallet convert BTUCOIN → LUMENAR | P4, P0 |
| P5 | Trees + Customizable + Mechanical Arms → tentacles + Ordnance | P4 |
| P6 | Crafting Page on I — Forge fills except doll (FS-GUI-008, OV18); Gear bag hides; bag-space gate; dual scrollbars; typed Frames / Blueprints (FS-CRF-005) + gems / Phonons / Artifacts; Unique / Apex Set ID on the item (FS-ITM-003, FS-ITM-004) | P4 |
| P7 | Vision modes + Dea comms + Tab Map (Local & World bi-directional + Missions/Objects + Operations drawers; Online tasks on both; Set Primary → GUI locator); TFAAI substrate when Experiences need AI (FS-AI-001) | P1 |
| P8 | Mission flags + Part 1 slice + Solo vs Online marker split (RAID / VAULT / Online tasks); monster / patrol product brains on TFAAI (MP bots when match Experiences enable) | P0, P7 |
| P9 | EOS raids / Ladder normalization / Social (fireteam 8, clan, Discord invite delivery) / Match Results live + freeze + Last match (FS-MCH) | P2, P8 |
| P9b | Trust: player report (including Results row), Discord pager, case log, ghost spectate (FS-TRS) | P9 |
| P9c | Companion Player API gateway (read memberships / profiles / Ladder / manifest) — FS-API-001–007 | P9 |
22. Open locks (do not invent in C++)
Section titled “22. Open locks (do not invent in C++)”Expose as data or leave a ensureMsgf stub. Do not pick silent defaults that become lore.
| ID | Lock |
|---|---|
| TBD-001 | Area → Difficulty tier + RecommendedLevel (ARL) table rows / transition edge cases (model locked: area-authored — FS-PRD-005 · FS-DMG-009) |
| TBD-002 | Fast travel |
| TBD-003 | MaxWallDashDistance meters |
| TBD-004 | |
| TBD-005 | G (FS-INP-001) |
| TBD-006 | UTFAInputConfig (Demo / lab default; Mod-tunable) |
| TBD-007 | Dodge / Roll stamina or Energy cost |
| TBD-008 | PvP global scalar |
| TBD-009 | Tentacle mirror vs crit step |
| TBD-010 | Mechanical Arms damage coefficient |
| TBD-011 | Energy pickup form |
| TBD-012 | Aether Sight vs Spiritus Sight name |
| TBD-013 | Q/E/Z/X/C/F); V stays Vision |
| TBD-014 | Done — Frame × Receiver Impact / Mag / Range qualitative bands locked in FS-GUN-009 (2026-10-20). Float map → TBD-IMR-FLOAT |
| TBD-AA-FLOAT | Map AA Mag/Stick/Rot/Strafe bands → engine floats |
| TBD-IMR-FLOAT | Map Impact / Mag bands → numeric frame kit values. Range closed by FS-GUN-011 + docs/inventory/weapon-range-falloff.md |
| TBD-015 | Support Frame ally-heal rules |
| TBD-016 | Named Ultimates per subclass |
| TBD-017 | Level cap, XP curve, task vs kill XP |
| TBD-018 | Stat points per level |
| TBD-019 | Stat respec |
| TBD-020 | Skill points per level |
| TBD-021 | Combat node lists per subclass |
| TBD-022 | Tentacle Set 1 / 2 / 3 levels |
| TBD-023 | Fission Cap Siege-brick cook |
| TBD-024 | Customizable tag → Ultimate modifiers |
| TBD-025 | Artifact socket material cost |
| TBD-026 | Campaign grant vs baseline-kit tutorial per verb |
| TBD-027 | Coop fairness for per-player monster level |
| TBD-028 | Vision-mode anti-cheat authority. TFAVision GFP: server owns unlock + relevancy; client overlay is presentation only (§2.4, §2.5) |
| TBD-029 | Character levels that open subclass T1–T5 in roster order (DT_TFA_SubclassUnlock) |
| TBD-030 | Apex Invoke Power break chance (after a successful class grant) |
| TBD-031 | Clan roster cap and extra ranks (founder / leader is enough to ship invites) |
| TBD-032 | Clan and fireteam invite expiry |
| TBD-033 | Chat message limit (there is a limit; number is TBA), flood rate, and gamepad chat binds |
| TBD-034 | Closed: crypto token display name = BTUCOIN |
| TBD-035 | BTUCOIN floor price (fiat). Settlement (P) = max(floor, free market). Shared by mint sizing and convert |
| TBD-036 | Cash-pack fiat values (V) (FS-ECO-003); LUMENAR-per-fiat (R) for convert. Mint amount is (M = V / P), not a fixed BTU count |
| TBD-037 | Credit reward table: stash, trash, elite, boss, side mission |
| TBD-038 | Legal / custody / listing path for BTUCOIN on a PoS hybrid (GDD BTUCOIN — PoS Hybrid · FS-ECO-013). Year 1 ships studio ledger + price feed until this lands. Sub-TBDs: TBD-038-A min withdraw · TBD-038-B withdraw delay · TBD-038-C deposit confirmations · TBD-038-D stake inflation table · host chain choice |
| TBD-039 | Play BTUCOIN grant table as fiat (V) per daily / weekly / hard objective (not fixed BTU counts). (M = V / P) at settlement. Hard Objective catalog. Online-only. Live on Local Map and World Map (Tasks filter) plus world markers. Do not invent a board |
| TBD-040 | Field / Specialist / Siege reserve caps. Ammo never a bag tile (FS-AMMO-001) |
| TBD-041 | Lag-compensation rewind window (ms of pose history) for hitscan and Melee Drive auth (FS-ARCH-013). Past the window = miss, not a teleport kill |
| TBD-042 | Well Tap + Dual Stack Cells counts per Bore (next well index). Lab floor 1 Well Tap + 8 Cells × next well |
| TBD-043 | Reporter last-view clip length (seconds) attached to a Trust report |
| TBD-044 | Per-target per-instance player-report cooldown |
| TBD-045 | Trust case log retention |
| TBD-046 | Discord volunteer vs studio Trust channel mapping (pager only; not in-game chat) |
| TBD-047 | Volunteer roster source / how the EOS staff flag is granted and revoked |
| TBD-048 | Match Results visor shortcut bind. Do not steal Tab |
| TBD-049 | Match Results live/frozen row stat columns beyond Name and Order. Do not invent K/D as the sole Ladder identity |
| TBD-050 | Match-end outcome strings (win / fail / extract and activity copy) |
| TBD-051 | Last match lifetime if they never queue again. Recommended: no TTL; overwrite only on next finished RAID / Vault / Ladder |
| TBD-052 | Assist credit window for Match Results Assists, weapon-instance Assist tracker, and family mastery assists (FS-MCH-001, FS-TRK-001, FS-CAR-002) |
| TBD-053 | Match History retention cap per Online character (minimum 50) |
| TBD-054 | Ladder leaderboard season / rolling window ID and refresh rules |
| TBD-055 | Formal CF / Founding Club entitlement string table (title_*, fx_*, mat_*, prop_*, club_*, hangar / nameplate / emote / decal ids). Working names locked in GDD founding-clubs-cf-cosmetics; do not invent ids in C++ (FS-ECO-012) |
| TBD-056 | Kinetic Flow damage-break without freeflow Block — when a hit dumps Flow to Tier 1 (Health-only vs Shield/Armor forgiven vs Health damage budget vs soft decay / combo-armor). Interim: any damage. Spec: docs/superpowers/specs/2026-10-26-singularity-one-flow-two-verbs-design.md (FS-CMB-004) |
| TBD-072 | Closed: Year 1 ships ASBP=6 multi-active Sets (ActiveSetIDs[]; worn unlimited; cost = equipped count; refuse <2; independent ladders). No single-Set Year-1 clamp. FS-ITM-004 · FS-GUI-010 |
Also still TBD in GDD (track, do not fill): WSM / Def / block % / ES bands, grenade throw feel, multiclass UI, New Game+ vs Reset Campaign relationship on Solo (Reset is locked; NG+ is story-doc only).
23. Acceptance pack (playable vertical slice)
Section titled “23. Acceptance pack (playable vertical slice)”A P3 slice is accepted when all of the following pass on PIE and a packaged Solo build:
- AC-SES-001 / AC-SES-002 / AC-SES-003 / AC-ID-001 / AC-ID-002 / AC-ID-003 — Solo pool persists; invisible to Online select. Create has no subclass picker; new slot is main class only (
UnlockedSubclassCount = 0). Online Command Deck does not pause the world; Solo Deck does. Discord Continue uses EOS Connect; Social link uses LinkAccount on the live PUID. Stay signed in silent-logs in; Log Out clears persist; Discord AccessToken is never written to disk. - AC-CAM-001 — Gun FPP, melee TPP, Shift-Out 0.2 s, no ADS/Shift-Out with Phys Shield in-hand, Phonons do not move the camera.
- AC-INP-001 / AC-MOV-001 — Four mobility verbs, non-overlapping.
- AC-LOD-001 — Full 1–7 stance matrix + 2H lockouts + no ADS with Phys Shield in-hand.
- AC-CMB-001 — Flow 30 → grounded TPP storm → reset; damage-break resets Flow per interim any-damage until TBD-056 locks.
- AC-DMG-001 — Pipeline unit tests; Story crit absent under Ladder.
- AC-HUD-001 / AC-HUD-002 / AC-AMMO-001 — Visor seats match OV lock; no 1–7 strip; no XP bar. Ammo bricks fill the reserve counter, never the bag. Online chat: Enter / Tab / Shift+Enter per FS-HUD-010.
- AC-GUN-001 / AC-GUN-002 / AC-GUN-003 — Part deltas vs AA baseline; Ladder flattens affixes. Fire Mode + AA on Receiver (FS-GUN-008); cadence number is Receiver × Frame; Class derived from Receiver; parts never change Fire Mode / RPM / charge / draw / AA.
- AC-GUI-001 / AC-GUI-003 / AC-ECO-001 — I-screen persistence + dismantle chip return. Forge maximize is OV18 (fills except doll; Gear bag hides; occupancy; dual scrollbars). Credits + BTUCOIN are two non-overlapping title-bar chips across tabs. Gear bag has no ammo.
- AC-PRG-001 / AC-PRG-002 / AC-PRG-003 — Arms gate, Energy vs Ordnance charges, grenades out of dock. Subclasses open T1→T5 in roster order from TBD-029; create never writes a starting subclass. World-found Apex Invoke grants missing classes at highest class level with equal Combat points, then TBD-030 break. Crafted Apex cannot Invoke.
- AC-ITM-001 / AC-ITM-002 / AC-CRF-001 / AC-CRF-002 / AC-CRF-007 / AC-CRF-008 / AC-CRF-009 / AC-CRF-010 / AC-GUI-003 / AC-ECO-002 / AC-ECO-003 — Quality socket rules; Legendary never a Set piece; Unique / Apex Set ID on the item, not the chip; Crafting is a station; Frames / Blueprints stack only same Receiver (or melee family) + rarity; Rewrite on Inspect (Reroll / Change / Etch); Bore on Inspect (Well Tap, cap 6); Forge catalog search + Armor / Weapons + Ranged / Melee + rarity; Forge fills except doll (OV18), Gear bag hides, Forge needs empty Gear slots, mat rail and recipe list each scroll. Marketplace cash → BTUCOIN mint 51/49 (no direct LUMENAR); every BTUCOIN mint 51/49 (including daily / weekly / hard objectives); Wallet convert BTUCOIN → LUMENAR; Marketplace spend is LUMENAR only.
- AC-VIS-001 — Seven modes, readable chrome.
- AC-CMP-001 / AC-CMP-002 / AC-ECO-003 — Marker split Solo / Online (no Raid / Vault / Online tasks on Solo); Local ↔ World Map Tab toggle; Daily / Weekly / Hard + Tasks filter on both maps; Set Primary from either including a dummy Online Daily; FE30 GUI locator (pip + tape + tracker); Tap Tab / M ping 4 s; off-FOV is tape + tracker + rim tick. FE28 / FE29 are secondary options. FE26 fails.
- AC-NET-001 — Server-authoritative sockets in a listen-server smoke (can wait for P9).
- AC-SOC-001 / AC-SOC-002 / AC-SOC-003 / AC-SOC-004 — Social replaces Clan on the Deck. Fireteam cap 8. Instance list + Friends + Clan roster. Row Invite. Favorites on Clan and Friends. One Send. Fireteam privacy (Accept / Join) is Settings → Social. Friends are EOS Friends, not Discord. Solo Social stays locked.
- AC-TRS-001 — Staff Trust overlay + ghost spectate (can wait for P9b). Volunteer cannot Kick. Studio Kick dumps the target. Solo Trust fail-closed.
- AC-MCH-001 — RAID / Vault / Ladder Results overlay live + freeze + Last match on World / Local Map; Report from a Results row (can wait for P9). Hidden hub / open world / story coop / Solo.
24. Traceability (GDD → this spec)
Section titled “24. Traceability (GDD → this spec)”| GDD | Spec |
|---|---|
| 1b Hybrid Perspective / vol. 02 | §4, §5, §8 |
| Movement H7 | §6 |
| Weapon loadout O10c | §7 |
| Damage bible vol. 03 | §9 |
| Vision H8 / OV9 | §10 |
| OmniVisor vol. 15 | §11, §13 |
| Character I Forge maximize (OV18) | FS-GUI-008, FS-CRF-001, FS-CRF-003, AC-GUI-003, AC-CRF-010 |
| Gunfeel / AA vol. 02 / 05 | §12 |
| Gun Receiver × Frame cadence + Fire Mode / AA (G2–G5) | FS-GUN-004, FS-GUN-007, FS-GUN-008, DA_TFA_GunFrame / DA_TFA_GunReceiver |
| Character level vol. 16 | §14 |
| Trees vol. 11 | §14 |
| Orders / Factions / Subclasses vol. 10 / GDD §5b | FS-PRD-004, FS-SES-006, FS-PRG-004, FS-PRG-009. Create = main class; subclasses unlock T1→T5. World-found Apex Invoke grants missing classes; crafted Apex cannot Invoke. |
| Affix / gems / Phonons vol. 04 / 08 | §15–16 |
| Legendary vs Unique Sets (HTML GDD lock) | FS-ITM-003, FS-ITM-004, FS-GUI-003, FS-GUI-004, AC-ITM-002, DA_TFA_LegendaryItem / UniqueItem / ApexItem / Set |
| Marketplace Economy (Credits + BTUCOIN + LUMENAR) | FS-PRD-007, FS-ECO, FE spec §11 |
| Founding Clubs & CF Cosmetics — In-Game | FS-PRD-006, FS-ECO-012, AC-ECO-005, Architecture Map §7 |
| Modes vol. 07 + FE spec | §1, §3, §19 |
| Story progression doc | §17 |
| Five corps vol. 09 | §12, §18 |
| Front-End UI | FE spec (not duplicated) |
| Online Trust & Safety (HTML GDD) | FS-TRS, FS-TRS-002 report open paths |
| Online Match Results (HTML GDD) | FS-MCH, FS-TRS-002 Results → Report |
| Online Match History (HTML GDD) | FS-MCH-006 |
| Command Deck Career Records (HTML GDD) | FS-CAR-001–005, AC-CAR-001 |
| Character I weapon trackers (HTML GDD) | FS-TRK-001, FS-GUI-004, DT_TFA_ItemCombatStats |
| Secure Locker hub (HTML GDD) | FS-GUI-009, FS-ECO-014, AC-GUI-004 |
| Item footprints / bag grids (HTML GDD) | FS-GUI-010, FS-AMMO-001 |
| In-game Chat (HTML GDD) | FS-HUD-010, AC-HUD-002 |
Terra Firma: Awakening — Functional Specification. Unreal Engine 5. Design numbers live in data sheets; this file locks behavior.