Skip to content

Terra Firma: Awakening — Front-End UI/UX Spec

Status: Locked for design and CommonUI remap
Scope: Boot → Main Menu → Play → Character → In-world chrome (Tab map, Esc, Command Deck)
Does not replace: OmniVisor play HUD (vol. 15) or Character screen I (hotkey I)

Solo and Online are separate realms. Characters never transfer. Same story, different delivery (raids vs solo endgame dungeons).


Decision Lock
Menu art Black field. Shiv mark glows on intro, burns on the menu. No live 3D atrium.
Menu chrome Lyra centered glass pillar. TFA ember / hard-light tokens, not Lyra ice-blue.
Play / Quit labels Short PLAY and QUIT on buttons. Full title lives in the logo.
Clan Lives under Command Deck Social. Online only. Solo shows Social locked: “Social is Online only.”
Social Command Deck tab. Panes: Fireteam (max 8 + instance list), Clan (full roster + clan invites), Friends (EOS list), Discord (link).
Fireteam privacy Settings → Social (same Options screen). Accept fireteam invites from and Who can join my fireteam. Online only. Example HAVOC: Friends or clan on both.
Fireteam Session group. Cap 8. Distinct from clan. RAID/Vault matchmaking still uses activity size 2 / 4 / 8. Story coop instance still caps at 4.
Discord identity Discord is an EOS Connect external credential (EOS_ECT_DISCORD_ACCESS_TOKEN) linked after EOS login (Social pane). Same Online PUID. Not a second game account. Not a Screen A login button.
Discord invites One Send on the invite sheet. Game server issues the token and lands it in-game. Same Send also delivers on Discord if sender and target are linked. Discord miss does not fail the invite.
Companion Discord bot Separate Discord application from invite delivery. Reads Online profiles / Ladder / career via Companion Player API (FS-API-*). Does not Send invites. Does not own Social → Discord Link.
Companion profile privacy Settings → Social (same Options screen as fireteam privacy). Per-component Public / Friends / Private for Career, Equipment, Collections, Triumphs, Modes (default Public). Match History default Friends. Ladder standing public when ranked. Bags / wallets / Case / Trust never exposed. Online only.
Marketplace Command Deck tab. Storefront requires EOS login. Buys unlock locally and work on Solo with no live session. Listings Online only. Cosmetics / looks only, plus Secure Locker tab QoL SKUs (FS-ECO-014 — storage capacity, never power). Seasons never vault. Prices in LUMENAR. Wallet: cash → BTUCOIN mint 51/49; convert BTUCOIN → LUMENAR to spend. Daily / weekly / hard objectives mint BTUCOIN at 51/49 — Online only, tracked on Local Map, World Map, and in the world.
Credits In-world vendor currency, account-shared (same pool on every character). Character I title-bar chip (W_TFA_IWallet), left of BTUCOIN, never overlapping tabs. Play: stashes, kills, bosses, side missions. Does not buy Marketplace.
BTUCOIN Player crypto (was Currency). 49% of every mint. Play: daily / weekly / hard (TBD-039 fiat (V), mint (M = V / P)) — Online only. Convert → LUMENAR on Marketplace Wallet at same settlement (P). Never marketplace tender.
LUMENAR Soft marketplace currency — not crypto. Storefront + listings spend. Acquired only by BTUCOIN convert (BTUCOIN from cash mint and/or play mint). Not on the I title bar.
Create Character Name + Sex (Male / Female) + Appearance (premade MetaHuman faces / grooms / facial dials / hair+skin color / tattoos — no body-size dials) + Order → Faction. Starts as the main class. Subclasses unlock in roster order as you level. Race is Human (Year 1), not a picker. Full-game mesh: Mutable (FS-APP-*); not Demo.
Reset Campaign Character Select only. Wipes story/location. Keeps identity, gear, Credits, Collections, Xenobiological Codex, hangar, clan, marketplace unlocks.
Campaign complete (Online) Stay on that character. Endgame hub: open world, repeatables, Raids, special coop. No forced NG+.
In-game chat OmniVisor Online. Enter opens compose. Tab while chat is up cycles Fireteam → Clan → Match (matchmade activity only) → General → Proximity. Whisper is not Tab — open from a name / Whisper action. Enter sends. Shift+Enter is a new line. There is a message limit; the number is TBA. Proximity radius meters TBA. Discord is not this chat. Not a Deck tab. GDD: In-game Chat.
Tab map Contextual: on planet opens Local Map (Missions & Objects hub); in orbit opens World Map. Tab toggles Local ↔ World. Set as Primary drives the OmniVisor GUI locator (quiet world pip + heading tape + tracker blip). Tap Tab / M pings name + meters for 4 s. While chat compose is focused, Tab is channel cycle only — no map, no ping. Fast travel is TBD. Daily / weekly / hard objectives are Online only and live in the Missions & Objects / Operations drawer on both maps, plus the world. Filter Tasks on both.
Online Esc Overlay only. World does not pause.
Online chrome Command Deck, Character I, Tab maps, Esc, Settings, and Deck children are overlay only. Online never pauses — including hubs and the Crafting Page station. Solo pauses the local world when any of those overlays is up.
Remember password Allowed only if username is also saved. Show a warning.
Stay signed in After a successful Online login, persist the EOS session on this device. Next Online path silent-logs in. Discord: persist refresh via the Discord SDK, never the short-lived AccessToken. Log Out clears.
Endgame card badge ENDGAME on the character card when campaign is complete.

  • Boot / menu world: full black.
  • Brand mark (locked): the painted Shiv — inward horns, three side spikes, needle chin, inner mask lines. FE30 (primary play-HUD still) shows it fire / red. Intro = glow charge on this mark. Menu = this same mark on fire. Logo only. No gem housing, no hex cage, no metal ring, no all-seeing-eye triangle. Canonical painted asset: tfa_gdd_html/figures/tf_shiv_logo_fire.png (fire / FE30). tf_logo.svg is a thin wrapper that embeds that PNG — do not use the old outline paths. Leave the mark as PNG (alpha stamp) — not JPEG. Triangle-eye stays GDD volume chrome only.
  • Type: uppercase button labels, high contrast, geometric. Logo: TERRA FIRMA with smaller AWAKENING.
  • In-game overlays: same type and color tokens as the front-end.
  • Color tokens: ember #E85A1A, gold story #E8B44A, vault violet #8B6CFF, raid crimson #C42A2A, steel #8A9AA8.

Happy path (FE0): Intro → Menu → Mode → EOS if Online (or silent persist) → Character → World.

Full UX map (every screen and back edge) is FE11. Auth flow is FE31. Social / invite flow is FE32.

flowchart TD
  subgraph bootLane [1_BootFrontEnd]
    firstRun[FirstRun_Legal]
    intro[Intro_ShivGlow]
    main[MainMenu]
    options[Options_LyraParity]
    bench[Benchmark]
    credits[Credits]
    quit[QuitConfirm]
    firstRun --> intro
    intro -->|Esc_Enter_Space_or_end| main
    main --> options
    main --> bench
    main --> credits
    main --> quit
    options --> main
    bench --> main
    credits --> main
    quit -->|Cancel| main
  end

  subgraph playLane [2_PlayAccount]
    mode[ModeSelect]
    solo[Solo_LocalPool]
    online[Online]
    silent[Silent_StaySignedIn]
    eos[EOS_Login]
    discordOAuth[Discord_OAuth]
    tfa[TFA_Code]
    logged[EOS_Session]
    main -->|PLAY| mode
    mode --> solo
    mode --> online
    online --> silent
    silent -->|persist_valid| logged
    silent -->|miss| eos
    eos -->|Continue_Discord| discordOAuth
    discordOAuth --> logged
    eos -->|TFA_on| tfa
    eos -->|no_TFA| logged
    tfa --> logged
  end

  subgraph charLane [3_CharacterSharedWidget]
    chars[CharacterSelect]
    empty[EmptyPool_CreateOnly]
    create[CreateCharacter]
    reset[ResetCampaign]
    delete[DeleteCharacter]
    loadNew[Load_Tutorial]
    loadResume[Load_LastSpot]
    loadEnd[Load_EndgameHub]
    solo --> chars
    logged --> chars
    chars --> empty
    chars --> create
    chars --> reset
    chars --> delete
    create --> chars
    reset --> chars
    delete --> chars
    chars -->|Play_new| loadNew
    chars -->|Play_existing| loadResume
    chars -->|Play_campaignDone_Online| loadEnd
  end

  subgraph worldLane [4_InWorld]
    world[InWorld_OmniVisor]
    mapLocal[Tab_LocalMap_Missions_Objects]
    mapWorld[Tab_WorldMap_Global]
    pause[Esc_SessionMenu]
    deck[CommandDeck]
    inv[Inventory_CharacterI]
    hangar[Hangar]
    look[Appearance]
    coll[Collections]
    journey[Journey]
    market[Marketplace]
    social[Social]
    fireteam[Fireteam_8]
    clanPane[Clan]
    discord[Discord_Link]
    invite[InviteSheet]
    settings[Settings_sameOptions]
    loadNew --> world
    loadResume --> world
    loadEnd --> world
    world -->|Tab_onPlanet| mapLocal
    world -->|Tab_inOrbit| mapWorld
    world -->|Tap_Tab_or_M| world
    world -->|Enter_Online| chatCompose
    chatCompose[Chat_Compose]
    chatCompose -->|Tab_channel| chatCompose
    chatCompose -->|Enter_send| world
    chatCompose -->|Esc| world
    mapLocal <-->|Tab_or_Button| mapWorld
    mapLocal -->|Set_Primary| world
    mapLocal -->|Esc_or_Close| world
    mapWorld -->|Esc_or_Close| world
    world -->|Esc| pause
    pause -->|Resume| world
    pause -->|Options| settings
    pause -->|CharacterSelect| chars
    pause -->|MainMenu| main
    pause -->|Quit| quit
    pause -->|LogOut_Online| main
    world --> deck
    deck --> inv
    deck --> hangar
    deck --> look
    deck --> coll
    deck --> journey
    deck --> market
    deck --> social
    deck --> settings
    social --> fireteam
    social --> clanPane
    social --> friends[Friends_EOS]
    social --> discord
    fireteam --> invite
    clanPane --> invite
    settings --> social
    invite -->|Send| world
    settings --> world
    inv -->|I_or_Esc| world
  end

Lane rules: Character Select is one widget with the pool injected (Solo or Online). Options and Settings are one screen. Reset Campaign is not on Esc. Social (and Clan under it) is locked on Solo. Marketplace storefront needs EOS; an EOS store login does not move a Solo character into the Online pool. Buys then work locally. Listings stay Online-only. I is Character screen I, not the session menu.


  1. Application window opens after engine load.
  2. Black field. Intro song starts. The Terra Firma logo fades in and charges a glow (drawn mark only — no gem housing, not a cut-out).
  3. Skip: Esc, Enter, or Space. Fade audio + logo, then Main Menu.
  4. If not skipped: hold through the glow peak / song sting, then auto-advance.
  5. First launch only, before intro: legal / EULA / privacy, language if shipped, graphics auto-detect.

Background: black + looping burning Terra Firma logo (mark only, no gem, not a still).

Center pillar, top to bottom:

  • Game logo
  • PLAY
  • OPTIONS
  • BENCHMARK
  • CREDITS
  • QUIT
  • Small engine / build mark

Peripheral chrome

  • Bottom-left: machine / build / OFFLINE until EOS login
  • After Online login: account display name + EOS status
  • Dev/network warnings stay a debug overlay

Same screen from Main Menu and from in-game Settings. Apply / Back / Restore defaults.

  • Video: window mode, resolution, VSync, frame-rate cap, quality preset, resolution scale, GI, shadows, AA, view distance, textures, effects, reflections, post, foliage, shading, brightness/gamma
  • Audio: master, music, SFX, dialogue (voice-chat later for Online)
  • Mouse and keyboard: sensitivity, invert, full keybind list (default Toggle Sprint on Left Shift; Hold Sprint unbound — FS-INP-006)
  • Gamepad: look sensitivity, invert, dead zone, vibration, bindings (default LS click / L3 Toggle Sprint — FS-INP-006)
  • Controls (shared): Auto Sprint boolean, OFF by default. When ON, forward move past threshold auto-enters sprint when legal (FS-INP-006). Same Options asset from Main Menu and Esc Settings.
  • Accessibility: colorblind mode + strength
  • Social (Online): fireteam privacy. Accept fireteam invites from (Anyone / Friends or clan / Friends / Clan / Nobody). Who can join my fireteam (Invite only / Friends or clan / Friends / Clan / Anyone). Companion profile (for Discord bots / BenchMark / third-party apps — FS-API-005): Career, Equipment, Collections, Triumphs, Modes — each Public / Friends / Private (default Public). Match History — Friends / Private / Public (default Friends). Ladder standing stays public when ranked. Solo: tab visible, rows locked. Friends are EOS Friends on this PUID — Discord is not this list.

Later TFA additions (not required for remap): FOV, HUD scale, subtitle size, language, camera shake, combat-text, safe-area, ultrawide.


  1. Disclaimer: timed scene, may hitch, results are local.
  2. Run Benchmark — fixed camera path: Earth surface + Ring flyover.
  3. Results: avg / 1% / 0.1% FPS, resolution, preset, GPU/CPU names, timestamp.
  4. Actions: Apply Recommended Preset, Save Result, Back.

Two large cards.

Card Visual Meaning
Solo Local Campaign Single operator, Earth, no network marks Local saves only. No EOS. No raids / special coop.
Online Fireteam + Earth + Indra’s Ring signal nodes EOS required. Raids and special coop exist.

Footer on each card: Characters do not transfer between Solo and Online.


Shown only on the Online path if not already logged in this session (or saved login failed). Same screen opens from Marketplace storefront. Store login does not move a Solo character into the Online pool.

Screen A — credentials

  • Username, password
  • Remember username
  • Remember password (enabled only if username is also saved; warning shown)
  • Stay signed in on this device (default on after a successful login). Uses OS secure storage. Warning on shared machines.
  • Log In / Back / Create Account (external EOS) / Forgot Password
  • No Discord control on Screen A. Discord is linked after a live EOS session from Command Deck → Social → Discord (W_TFA_DiscordLink / EOS_Connect_LinkAccount). See Functional Spec §3.X / FS-ID scenario C.

Screen B — TFA (2-FA) if the EOS account has two-factor on the username / password path: code, submit, resend/timeout, Back. Real client: automatic from EOS — no player “has 2-FA” checkbox. FE lab may show a 2-FA (Lab: Purpose to show UX) toggle only to preview Screen B.

Discord mapping (runtime is FS-ID-004)

  • Discord attach is post-login only (Social → Discord → Link). EOS_Connect_LinkAccount on the live PUID. Same Online pool. Never CreateUser on this path.
  • Discord already tied to a different PUID: fail closed. No silent merge.
  • Cold Online login is username / password (and Screen B if required). Do not place Continue with Discord on Screen A.

Errors (Discord link path): expired Discord token → silent OAuth refresh and retry EOS LinkAccount once. Network timeout → tell the player to check Discord Services.

Stay signed in (FS-ID-006). Online path tries silent login first. If persist is valid, skip Screen A (and skip TFA). If persist fails, show Screen A. Log Out of EOS (Online Character Select and Esc) deletes local persist and Discord OAuth consent on this device. Confirm before Log Out (drops session). Discord OAuth consent is once per device until Log Out, Discord revoke, or refresh failure.

Failures (username path): wrong password, network down, banned, TFA mismatch, expired session.

Logout lives on Online Character Select and in the Online Esc menu. That is the shared-device / next-player path. Confirm Log Out clears device persist and Discord consent on this device only. It does not unlink Discord from the EOS PUID. The next person who logs into their EOS account only sees Discord linked to their PUID.

Discord Unlink (Social pane). Optional, while still logged into EOS: Unlink Discord on W_TFA_DiscordLink if the player wants to detach Discord from this account (wrong link, or no longer want Discord delivery). Not required for shared-PC handoff. Relink uses EOS_Connect_LinkAccount again. Social shows the linked Discord display name so the player can verify it is theirs.


Same layout for Solo and Online. Different save pools.

Empty pool: centered Create New Character. No Play.

Occupied pool (1–10): profile cards + Create New Character. At 10, Create is disabled: “Maximum 10 characters.”

Card data: portrait, name, level, last location, campaign part, last played, playtime, ENDGAME badge if complete. Online: clan tag. Solo: LOCAL.

Play enables only when a character is selected (or auto-selected after create).

Also on this screen: Delete (confirm), Reset Campaign, Sort by last played.

Year 1 create is identity, not a second game.

Field Rule
Display name 2–16 characters, unique inside the current pool. Required.
Sex Male or Female. Two options. Required. No other body types, no Type A/B/C, no identity sliders.
Appearance Premade MetaHuman face presets, grooms (hair / brows / facial hair), limited facial feature dials, hair color, skin color, tattoos on face and body. Sex picks the fixed Male or Female body — no body-size or limb-scale dials. Light / medium / heavy armor later changes plates only (a_socket_* / a_plate_* — FS-MESH-001) — joints, underarmor, and flare scale stay that person’s size. Full-game mesh: Mutable + MetaHuman (FS-APP-*). Catalog counts TBD-057. Not in Demo.
Order Fist / Magus / Hidden. Required. This is the main class origin.
Faction Auto from Order: Enforcer / Arcwarden / Phantom. Not a free picker. New characters start as this main class.
Subclass Not on create. Five per faction (GDD §5b) open one after another as the character levels, in roster order. No picker.
Race Human. Locked for Year 1. Shown as read-only. Later years unlock races on this screen.
Difficulty Not on create.
Corp Not on create. Corps are armor finishes, not origin.

Confirm writes into the current pool only, returns with that character selected.

Subclass unlock order (not chosen on this screen). T1 opens first, then T2, then T3, then T4, then T5. Character-level thresholds: Functional Spec TBD-029.

  • Fist / Enforcer: Berserker → Vanguard → Shock Trooper → Battle Master → Seraph
  • Magus / Arcwarden: Pyrocaster → Torrentcaller → Zypher → Cyromancer → Stormbringer
  • Hidden / Phantom: Infiltrator → Specialist → Wraith → Shadow → Ghost

Lives on Character Select only. Esc does not wipe. Optional Esc helper: “Reset campaign from Character Select.”

Enabled only if the selected character has campaign progress.

Two-step confirm: warning, then type RESET or hold confirm 2 seconds. Cancel is default focus.

Wipes: story / mission / sub-mission flags, tracked objectives, last position, campaign-complete / endgame-hub state, story-gated map unlocks.

Keeps: name, appearance, Order / Faction, subclass unlock progress, inventory, Credits, hangar, shaders, Collections, Xenobiological Codex kills, marketplace unlocks, Online clan.

After confirm the card returns to campaign start. Player hits Play. This is not Delete and not New Game+.

Online reset is server-authoritative and fails closed. Solo writes local with a backup until the next successful save.


  • Existing: load where that character left off.
  • New: tutorial / opening cinematic.
  • Online + campaign complete: endgame hub on that character.
  • After reset: fresh campaign start on that character, kept gear and Collections.

Loading: Shiv mark + planet name + one tip.


  1. Character / Inventory — opens Character screen I
  2. Hangar — ships and mechs for this character
  3. Appearance — armor / item look, shaders
  4. Collections — Items + Xenobiological Codex
  5. Journey — Game Story list and lore (not the globe)
  6. Marketplace — storefront (EOS to buy) + player listings
  7. Social — Fireteam (instance list + Invite), Clan (full roster + clan invites + favorite), Friends (list + Invite + favorite), Discord. Online functional; Solo locked: “Social is Online only.”
  8. Settings — same Options screen (includes Social / fireteam privacy)

Social (locked). Replaces Clan on the Deck. Clan is a pane under Social, not a Deck tab. Online only. Follows the Command Deck pause policy.

Pane Owns Does not own
Fireteam Session group. Cap 8. You are a team of 1 until invites land or eligible players Join. Leader invites / kicks from the team. Mixed clans allowed. Accepting a fireteam invite or Joining leaves the old fireteam. Leader leave: oldest remaining member leads. In this instance lists everyone else here; each row has Invite. Clan membership. RAID/Vault activity size still 2 / 4 / 8. Story coop instance still caps at 4 (GDD). Extra fireteam members do not enter a 4-player story instance. Favorites (those live on Clan and Friends).
Clan Persistent Online org. Create if ClanId is empty. One clan at a time. Server-authoritative. Founder / leader invites and kicks. Reset Campaign keeps membership. Leave before creating another. Example tag: HAVOC on Ash Cantor. Full roster on this pane (online and offline). Clan org Send stays here. Row Invite is fireteam. Diamond favorite. Fireteam. Matchmaking. Solo. Roster cap and extra ranks: TBD-031.
Friends EOS Friends on this PUID. Full list. Add / remove by Online display name / EOS. Used by fireteam privacy. Online friends get Invite. Diamond favorite (same flag as Clan). Discord friends. Voice. I-screen. A second game account.
Discord After EOS login: Link Discord → Discord OAuth / SDK consent (no Discord password inside TFA) → short-lived AccessToken → EOS_Connect_LinkAccount (EOS_ECT_DISCORD_ACCESS_TOKEN). Linked state shows Discord display name + username on this PUID. Unlink returns to not-linked. Invite Send delivers in-game and on Discord when linked. Accept stays in Terra Firma. Not voice. Not a second game login. Linked Discord also enables Companion API by-discord lookup for the separate companion stats bot (FS-API-002) — that bot is not this pane and does not Send invites. Friends list. Voice. I-screen tabs. Discord button on EOS Screen A. In-game Discord password fields. Separate Discord-only send. Companion Discord bot app credentials.

Fireteam privacy (locked). Lives on Settings → Social (same Options asset). Also echoed on the Fireteam pane. Per PUID; clan checks use this character’s ClanId. Online only.

Setting Options Behavior
Accept fireteam invites from Anyone · Friends or clan · Friends · Clan · Nobody Who may Send you a fireteam invite. Outside the set, Send fails closed (does not land). Inside the set, Accept is automatic — no prompt. Nobody blocks all fireteam invites. Clan org invites are a different sheet and ignore this.
Who can join my fireteam Invite only · Friends or clan · Friends · Clan · Anyone Who may Join your fireteam without an invite while a slot is open. Invite only = they wait for Send. Leader can still kick. Cap 8 still fail closed.

Companion profile privacy (locked). Same Settings → Social tab, below fireteam rows. Per PUID. Online only. Controls what Companion Player API apps (companion Discord bot, BenchMark site, third-party) may read with an app API key. FS-API-005.

Setting Options Default Behavior
Career Public · Friends · Private Public FS-CAR-001 totals
Equipment Public · Friends · Private Public Equipped cosmetics only (FS-NET-002)
Collections Public · Friends · Private Public FS-CAR-002
Triumphs Public · Friends · Private Public FS-CAR-003
Modes Public · Friends · Private Public FS-CAR-004
Match History Friends · Private · Public Friends FS-MCH-006 / Last match recap

Ladder standing on the season board stays public when ranked. Bags, wallets, Case / mystery, and Trust are never rows here — hard deny on the API. Friends visibility requires player OAuth on the caller; app-key-only sees Public. Solo: rows visible and locked.

Example: Ash Cantor (HAVOC) sets both to Friends or clan. Clanmates and EOS Friends Join the HAVOC fireteam without waiting. A stranger’s Send fails closed.

Join from Friends pane or clan roster. Joining leaves the old fireteam. Story coop instance still caps at 4.

Lists (locked). Fireteam pane: In this instance — other players here, each with Invite. Clan pane: full member roster + clan org Send. Friends pane: full EOS Friends list, each online friend with Invite. Row Invite is the same fireteam Send as the sheet. Offline: no fireteam Invite. Already on your fireteam: On fireteam.

Favorites (locked). Diamond on Clan roster and Friends list. One flag per target PUID; both panes share it. Sorts favorite first. Persist on the Online account. Not a privacy set. No diamond on the instance list. Infographic: locks/lock_fe_favorites.svg. Still: FE44.

Invite sheet. One sheet, opened from Fireteam or Clan. Search Online display name / EOS. One Send button. Game server issues the token. Fireteam Send lands only if the target’s Accept setting includes you — then Accept is automatic. Same Send delivers on Discord if sender and target are linked. Discord miss does not fail Send. Clan roster can seed a fireteam invite. Clan org invites still land as pending on Social (this privacy table does not apply to clan org). Fireteam invites die with the session; clan invites persist on the server. Expiry: TBD-032. Fail closed: Solo realm, fireteam already at 8, already in that clan, target not in the Online pool, target’s Accept set excludes you, target offline (fireteam Invite).

Deep link from Discord opens the game / EOS session. Fireteam join follows Accept / Join settings. Clan org still presents Accept. Discord is delivery, not authority.

Pause policy (locked). Same widgets both realms. The session owns time, not the widget.

Solo Online
World clock Stops while Deck, I, Tab map, Esc, Settings, or a Deck child is up Never stops. No SetGamePaused on GameState or the server
Esc title PAUSED LIVE — overlay
Input Cursor on. Move / look / fire / skills off Same input lock
Pawn Frozen with the world Still simulates. Damage, CC, objectives, fireteam keep going
OmniVisor Hidden under pause glass is fine Vitals must stay readable under the overlay
Hit while overlay is up N/A (world frozen) Does not auto-close the Deck
Downed / death / disconnect Resume path after unpause Dump overlay stack to OmniVisor death / respawn or session-lost

Hubs are not an exception. Crafting Page is still a station (not a Deck tab) and still follows this clock: Solo may pause there; Online does not.

  • Resume (Solo: unpause. Online: close overlay)
  • Options
  • Leave to Character Select
  • Leave to Main Menu
  • Quit Game
  • Online: Log Out of EOS

Confirm on anything that drops a session.

Hotkey I remains Character screen I. Esc is the session menu. They are not the same window. I uses the same pause policy as the Command Deck.


10. Tab — Contextual Navigation: Local Map & World Map

Section titled “10. Tab — Contextual Navigation: Local Map & World Map”

The map and navigation experience is unified under Tab and context-aware:

  • Hold / Press Tab: Evaluates player context (IsPlayerOnPlanet()):
    • On Planet Surface / Combat Sector: Opens Local Map (W_TFA_LocalMap), centered on current operative coordinates.
    • In Orbit / Station (Indra’s Ring / Dropship transit): Opens World Map (W_TFA_WorldMap), showing the planetary globe.
  • Tap Tab (or Tap M) during gameplay: Does not open the full-screen map. Pings the GUI locator for 4 seconds: name + {dist} m + elevation beside the quiet world pip; heading-tape pip and tracker blip brighten. No nameplate on the reticle.
  • While OmniVisor chat compose is focused: Tab cycles Fireteam → Clan → Match → General → Proximity (skip empty seats; Whisper is not Tab). Does not ping. Hold Tab does not open the map. Enter sends. Shift+Enter inserts a newline. Overlay Enter is UI, not chat. Full lock: FS-HUD-010 / GDD In-game Chat.

10.2 Local Map & Missions/Objects Hub (W_TFA_LocalMap)

Section titled “10.2 Local Map & Missions/Objects Hub (W_TFA_LocalMap)”

The Local Map is the tactical command center for the current sector:

  • Map Viewport: High-resolution topological vector render, elevation contours, dynamic fog-of-war, real-time player position / orientation cone, and interactive world tags (TFA.World.*).
  • Missions & Objects Drawer (Left Panel):
    • Filter Tabs: All | Campaign | Sub-Missions | Tasks | Local Objects. Tasks is Online only (hidden Solo).
    • Tracked Categories:
      • Story & Campaign: Active story quest stages, narrative leads, primary drop zones.
      • Sub-Missions & Bounties: Side contracts, high-value target bounties, patrol tasks.
      • Online tasks (Online pool only): Daily tasks, weekly tasks, hard objectives. Same drawer and Tasks filter on Local Map and World Map. Set as Primary tracks them in the world. Not a Command Deck tab. Catalog TBD-039.
      • Local Objects & POIs: Tagged world actors including Fabricators, Weapon Caches, Data Terminals, Safe Hubs, and Extraction Beacons.
    • Item Card: Shows name, lore/task summary, distance from player, completion criteria, and reward preview.
  • Set as Primary Action:
    • Selecting any mission, Online task, or world object enables the [Set as Primary] button.
    • Only one objective or object is Primary at a time.
    • Setting an item as Primary locks its tracking, highlights its marker with an ember/gold pulse on the open map (Local or World), and publishes world coordinates through UTFAObjectiveSubsystem to the OmniVisor GUI locator (quiet pip + heading tape + tracker blip).
  • World Map Navigation: Prominent header button [ < World Map (Tab) ] allows immediate zooming out to the planetary view.

10.3 World Map (W_TFA_WorldMap) & Bi-directional Flow

Section titled “10.3 World Map (W_TFA_WorldMap) & Bi-directional Flow”
  • Globe & Orbital Station: Rotatable 3D Earth globe, atmospheric operational sectors, and elevated Indra’s Ring orbital station.
  • Operations / Missions & Objects Drawer (Left Panel):
    • Filter Tabs: All | Story | Tasks | Raids | Vaults. Tasks, Raids, and Vaults are Online only (hidden Solo). No Objects tab — Local Objects / POIs stay on Local Map.
    • Same Online-task rows as Local Map: Daily / Weekly / Hard Objectives. Story, Raid, and Vault rows stay here.
    • Set as Primary works from this drawer the same as Local Map. One Primary across both maps.
  • Globe markers: Online-task diamonds at sector (amber, not RAID hexes). Solo never draws them.
  • Bi-Directional Tab Toggle:
    • Pressing Tab while in Local Map $\rightarrow$ switches to World Map.
    • Pressing Tab while in World Map $\rightarrow$ switches to Local Map (defaulting to operative’s current sector).
    • Pressing Esc or clicking [Close] returns directly to gameplay.

Solo markers: story, sub-mission, side, solo endgame dungeon, local objects/POIs. No Raid. No special coop. No daily / weekly / hard objectives. GDD solo equivalents (Biolab Purge, Grid Collapse, System Purge, Core Collapse) use the SOLO OPS bunker mark.

Online markers: everything Solo has, plus Raid, Vault, and Online-task markers (daily / weekly / hard).

Type Shape Color / motion List / Drawer
Story / campaign Chevron / diamond Gold, steady Default Primary
Sub-mission Small diamond Muted gold Nested
Side / next step Circle White / cyan Secondary
Local Object / POI (Cache / Terminal / Fabricator) Square / hexagonal pip Cyan / Amber Local Objects tab
Daily / Weekly / Hard Objective Small diamond Amber Tasks tab on Local Map and World Map. Online only. Set as Primary
Primary Tracked Target Same shape, enlarged Gold pulse ring + beam Active Primary
Raid (Online) Hex breach seal, ~1.4× Ember / crimson, rotating ring Badge RAID, pip 2 / 4 / 8
Special coop dungeon Triangle vault + Shiv rune Hard-light violet Badge VAULT + fireteam size
Solo endgame dungeon Square bunker Steel + ember, no ring Badge SOLO OPS
Complete Desaturated sealed glyph Grey Collapsed
Locked Same shape + lock Grey Filter

Filters (split by map):

  • Local Map: All | Campaign | Sub | Tasks | Objects. Tasks hidden Solo. Objects = Local POIs.
  • World Map: All | Story | Tasks | Raids | Vaults. Tasks / Raids / Vaults hidden Solo. No Objects tab.

10.5 OmniVisor GUI locator (W_TFA_3DWaypoint + tape + tracker)

Section titled “10.5 OmniVisor GUI locator (W_TFA_3DWaypoint + tape + tracker)”

Once an objective or object is marked as Primary, in-world navigation uses FE30 as the primary lock: quiet world pip + heading tape + tracker gold blip. FE26’s nameplate on the reticle is the clutter anti-example. The center-top Ultimate is the painted Shiv on fire (tf_shiv_logo_fire.png). Never a new skull or helmet.

Secondary options (not the default ship): FE28 world pip only; FE29 heading tape as the heading cue.

  1. Quiet world pip: 8–12 px gold diamond on the target in world space. Never over the Firehand reticle. Name + meters hidden until Tap Tab / M ping (4 s).
  2. Heading tape: thin tick strip under the visor brow. Shiv Ultimate stays center-top. Gold pip = Primary heading. Off-FOV parks at the tape end. Not a compass rose over the world.
  3. Tracker blip: gold diamond on the existing IFF disc. Red = hostiles. Not a second minimap.
  4. Off-FOV: world pip hides; tape + tracker remain; tiny rim tick only. Not FE26’s visor-rim billboard.

Command Deck tab. Always visible.

Storefront requires EOS. Browse and buy only while an EOS session is live. Signing in for the store does not move a Solo character into the Online pool.

Buys unlock locally. After purchase, cosmetics, shaders, titles, and hangar liveries stay on this machine. Solo characters can apply them with no live EOS session. Appearance is the apply screen. Offline storefront still lists owned locally; the live catalog stays locked until EOS sign-in.

Pane Without EOS With EOS
Storefront Locked: “Sign in to EOS to browse and buy.” Owned-locally list remains. Live catalog. Season items stay listed forever. LUMENAR SKUs debit LUMENAR. Fiat / cash SKUs mint BTUCOIN 51/49 (FS-ECO-003) — then convert to spend.
Listings Solo: visible and locked — “Player listings are Online only.” Online pool: player trade of allowed looks, priced in LUMENAR. Server-authoritative.
Wallet Locked: “Sign in to EOS to convert.” Credits still read on Character I. LUMENAR (primary) + BTUCOIN (player 49%). Floor, market, settlement (P = \max(\text{floor}, \text{market})). Convert BTUCOIN → LUMENAR anytime at (P) (FS-ECO-006). Cash buy mints (M = V / P) at 51/49 (no direct LUMENAR).

Sells: looks, shaders, titles, hangar liveries, and Secure Locker tab slots (secure_locker_tab_slot — FS-ECO-014 QoL: account storage capacity only). Does not sell: combat stats, raid clears, Collections bases, Frames, trees, or anything that changes power.

Secure Locker tabs: LUMENAR SKU unlocks one extra account Locker tab beyond the six free (FS-GUI-009). Buy from Storefront or Secure Locker Buy Tab deep-link. Not looks — explicit QoL exception. Not Armory foundry. Not coop Vault.

LUMENAR is the Marketplace spend. Credits are in-world vendors only. Ended seasons roll into the standard storefront — no vault, no disappearing SKUs.

Play BTUCOIN → daily / weekly / hard objectives

Section titled “Play BTUCOIN → daily / weekly / hard objectives”

Completing daily tasks, weekly tasks, and hard objectives mints BTUCOIN. TBD-039 is a fiat value (V) table (and Hard Objective catalog) — not fixed BTU counts. At complete: settlement (P = \max(\text{floor}, \text{market})); mint (M = V / P); then 51/49. When market is above the marketplace floor, objectives mint fewer BTUCOIN; convert at the same (P) keeps LUMENAR out flat for that (V). Do not invent a board. These grants are not Credits and not LUMENAR (Credits stay stashes / kills / bosses / sides).

Online service only. They live where other game objectives live: world markers and the Missions & Objects / Operations drawer on every Tab map (Local Map and World Map). Filter Tasks on both. Set as Primary tracks them on the OmniVisor. Solo never lists or spawns them. Store login does not grant them to a Solo character.

Every BTUCOIN mint — play or fiat BTUCOIN path — splits 51% studio treasury / 49% player wallet. There is no mint that skips the studio cut. Character I BTUCOIN shows the player share only.

Real money → BTUCOIN mint → convert → LUMENAR

Section titled “Real money → BTUCOIN mint → convert → LUMENAR”

Marketplace fiat / cash SKUs mint at 51% BTU Games / 49% buyer (FS-ECO-003 / FS-ECO-004). Pack tables are fiat (V) (TBD-036); (M = V / P) at settlement. They do not grant LUMENAR or Credits.

BTUCOIN floor TBD-035. Settlement (P = \max(\text{floor}, \text{market})) is shared by mint sizing and convert. The player converts their 49% BTUCOIN to LUMENAR on Wallet whenever they want ((\lfloor B_{49} \times P \times R \rfloor)), then spends LUMENAR on storefront / listings / Advanced Pass. BTUCOIN does not buy SKUs directly. Credits do not buy Marketplace.

Infographic: locks/lock_fe_economy.svg. Marketplace chrome: FE22.


Planet → Location. Info gated by kills. 10,000 kills = full dossier. Unencountered = silhouette / Unknown.

Armor and Weapons. Base pieces only (no prefixes / suffixes). Foundry index, not the backpack. Pull a base into inventory if frames and parts are owned. Modifications / gems = coming slot, disabled.


No Unreal project lives in this workspace. This is the class and widget map for the next editor pass. Keep CommonUI: UCommonActivatableWidget, UPrimaryGameLayout, stacked menus, gamepad focus.

Lyra (source) TFA (replace / add) Notes
Frontend experience B_LyraFrontend B_TFA_Frontend Black + burning Shiv, not the atrium map
ULyraFrontendStateComponent UTFAFrontendStateComponent Owns intro → menu → play stack
W_LyraFrontend / press-start W_TFA_IntroSplash then W_TFA_MainMenu Intro is skippable
ULyraButtonBase / menu buttons W_TFA_MenuButton Ember glass, uppercase
Play Lyra Opens W_TFA_ModeSelect Does not start a match
Options → W_GameSettingScreen W_TFA_Settings Same asset from menu and Esc
ULyraGameSettingRegistry UTFAGameSettingRegistry Lyra tabs + TFA Social / fireteam privacy
Credits (menu roll) W_TFA_Credits Staff / studio roll. Not the in-game wallet
Quit W_TFA_QuitConfirm
— W_TFA_Benchmark + W_TFA_BenchmarkResults New
— W_TFA_ModeSelect Solo / Online cards
— W_TFA_EOSLogin Username, password, remember flags, Stay signed in. No Discord button
— W_TFA_EOS_TFA Code only if required on the username path
— W_TFA_CharacterSelect Shared widget, pool injected
— W_TFA_CharacterCreate Locked fields above
— W_TFA_ResetCampaignConfirm Two-step
— W_TFA_DeleteCharacterConfirm
— W_TFA_Loading Shiv + planet + tip
— W_TFA_CommandDeck Top bar. Pause policy: FE spec §9 / FS-SES-005
— W_TFA_InGameMenu Esc. Title PAUSED (Solo) / LIVE (Online)
— W_TFA_LocalMap Tab on planet; Missions & Objects drawer (Online: Daily / Weekly / Hard + Tasks filter), Set Primary, [World Map] button
— W_TFA_WorldMap Tab off planet / in orbit; Daily / Weekly / Hard rows + Tasks filter (Online); globe task diamonds; [View Local Map] button; Set Primary; no Local Objects
— W_TFA_HeadingTape Visor-brow heading tape; gold Primary pip
— W_TFA_3DWaypoint GUI locator world pip; ping reveals name; off-FOV hides (tape + tracker stay)
— W_TFA_Collections Items / Xenobiological Codex
— W_TFA_Journey Game Story log
— W_TFA_Marketplace Storefront needs EOS; buys unlock locally; listings Online only. Panes: Storefront / Listings / Wallet. Includes secure_locker_tab_slot (FS-ECO-014)
— W_TFA_MarketWallet Wallet pane. LUMENAR primary. Cash → BTUCOIN mint 51/49. Convert BTUCOIN → LUMENAR
— W_TFA_SecureLocker Hub / station terminal only. Dual-pane CHARACTER GEAR ↔ SECURE LOCKER with center DEPOSIT → / ← WITHDRAW rail. Footprints FS-GUI-010 (Gear 10×6 · Locker 12×12). Six free tabs + LUMENAR expand. Not Character I. Not Armory foundry. Not coop Vault (FS-GUI-009)
— W_TFA_CreditChip Do not ship. Second pair caused tab overlap. W_TFA_IWallet is the only I-screen wallet
— W_TFA_IWallet Title-bar pocket: CREDITS, gap, BTUCOIN, then X. Persistent. Never overlaps Inventory / Combat / Tentacles / Ordnance. LUMENAR is Marketplace only
— W_TFA_WeaponAmmo OmniVisor bottom right. Mag + Field/Specialist/Siege reserve counter. Bricks never enter the bag
— W_TFA_Hangar Ships / mechs
— W_TFA_Appearance Shaders
— W_TFA_Social Deck tab. Panes: Fireteam / Clan / Friends / Discord. Solo locked
— W_TFA_Fireteam Session group. Cap 8
— W_TFA_Clan Pane under Social. Create / invite / leave. Online only
— W_TFA_Friends EOS Friends list. Invite on the row. Favorite diamond
— W_TFA_InstanceList Fireteam pane. Other players in this instance. Invite on the row
— W_TFA_DiscordLink Social Discord pane: linked profile / Log in with Discord
— W_TFA_DiscordOAuth Open Discord consent → Authorize → AccessToken → LinkAccount (lab mock; real = Discord SDK / browser). No Discord password in TFA
— W_TFA_InviteSheet One Send. In-game inbox + Discord delivery. Row Invite uses this Send
Character I / OmniVisor Unchanged Do not fold into Esc
Character I · Inspect Trait column strips seat-aware (guns: Feed = {MagFamily} Spec · Bullets · Plate · Verb; armor/shield: Shell · Stride · Brace · Verb; jewelry: none) + Origin(s) (1 Unique · 2 Apex) + Set membership pips on Unique/Apex + Familiarity / Masterwork FS-ITM-010 2026-11-13d / 004/013, FS-TRK-001/002. Mock: #ins-verb / #ins-fam in tfa_gdd_html/index.html. Catalog names filled; Familiarity costs TBD-065…068
Character I · Active Sets LOAD OUT / doll chrome strip: dynamic worn SetIDs · equipped n · toggles · ASBP meter used / 6 FS-ITM-004 · Year 1 ship surface TBD-072. Mock: #active-sets in tfa_gdd_html/index.html. Inspect pips ≠ active state
Demo Mod Seat-aware Trait columns by quality (Common none; jewelry none); Origin + Set on Unique/Apex; Active Sets ASBP note Mock: tfa_gdd_html/figures/demo_mod_mock.html. Not OmniVisor child

Save pools

  • Solo: local save per slot, max 10, tagged LOCAL. Never listed on Online.
  • Online: EOS + server slots, max 10. Never listed on Solo.

Input

  • Intro skip: Esc, Enter, Space, gamepad face / start.
  • Every front-end screen: CommonUI analog cursor + keyboard / gamepad focus order.
  • Tab (Hold / Press): Toggles contextual Map (Local Map on planet, World Map in orbit). Not while chat compose is focused.
  • Tab (Inside Map UI): Seamlessly swaps between Local Map and World Map.
  • Tab (Tap) / M (Tap) in gameplay: Pings GUI locator (pip + tape + tracker); name / meters 4 s. Not while chat compose is focused.
  • Enter (Online, in play, no overlay): Opens OmniVisor chat. Enter sends. Shift+Enter is a new line. Tab cycles Fireteam / Clan / Match / General / Proximity (Whisper separate).
  • Esc: Toggles in-game menu (or closes top overlay first). Chat compose open: Esc closes chat without sending.

Credits, Quit confirm, Delete confirm, Reset confirm, Loading, disconnect / session lost, Create Account / Forgot Password landing, empty / error / max-characters, first-run legal.

Combat HUD and death / respawn stay in the OmniVisor lock.


GDD reader lab: tfa_gdd_html/index.html → UX · Front-End. Written lock: Front-End UI.

Infographics (same chrome as the Character I lock plates):

Figure File Example shown
Lock · Logo tfa_gdd_html/figures/tf_shiv_logo_fire.png Painted fire Shiv (PNG stamp). tf_logo.svg embeds this PNG.
Lock · Realms tfa_gdd_html/figures/locks/lock_fe_realms.svg Riven Hale vs Ash Cantor
Lock · Markers tfa_gdd_html/figures/locks/lock_fe_markers.svg Mission 1, Biolabs raid, Biolab Purge
FE0 fe0_flow.svg Happy path. Online may skip EOS if Stay signed in
FE11 fe11_full_flow.svg Full UX map — four lanes, every screen
FE31 fe31_auth_flow.svg Online auth: persist, Discord Connect, username TFA, Log Out
FE32 fe32_social_flow.svg Social: Fireteam 8, Clan, Discord link, invite sheet
FE33 fe33_eos_discord.jpg Illustrated still — Stay signed in (legacy Discord-on-A art; product = Social Link after login)
FE34 fe34_social.jpg Illustrated still — Social tab, Fireteam 1 of 8, LIVE overlay
FE35 fe35_invite.jpg Illustrated still — one Send (in game and Discord)
FE36 fe36_pause_live.jpg Illustrated still — Solo PAUSED vs Online LIVE
FE1–FE2 intro + main menu Skip keys, PLAY pillar
FE3–FE4 mode + EOS ash.cantor + 2-FA path. Discord Link on Social after login
Lock · Identity locks/lock_fe_id.svg Discord AccessToken → EOS Connect. Stay signed in persists EOS session, never the AccessToken
FE5–FE6 characters + create Hale / Voss / Cantor. Create: Order → Faction, no subclass picker
FE7 reset Kira Voss wipe vs keep
FE8 deck + Esc Marketplace on the bar; Social locked on Solo; Clan lives under Social
Lock · Social locks/lock_fe_social.svg Fireteam 8, Clan create/invite, Discord delivers both invite types
Lock · Overlay locks/lock_fe_overlay.svg Solo PAUSED vs Online LIVE. Command Deck never pauses Online
Lock · Privacy locks/lock_fe_privacy.svg Accept invites from / Who can join. HAVOC Friends or clan
FE37 fe37_fireteam_privacy.jpg Illustrated still — Settings → Social, fireteam privacy
FE38 fe38_fireteam_join.jpg Illustrated still — Fireteam pane, Accept / Join Friends or clan
FE39 fe39_friends_join.jpg Illustrated still — Friends pane, Join fireteam auto-join
FE40 fe40_accept_filter.jpg Illustrated still — clanmate Join vs stranger Send fails closed
Lock · Roster locks/lock_fe_roster.svg Instance Invite. Clan full roster + favorite. Friends list + Invite
Lock · Favorites locks/lock_fe_favorites.svg Tap diamond. Shared PUID flag. Sort. No diamond on instance
FE41 fe41_clan_roster.jpg Illustrated still — HAVOC roster, favorite diamond, clan Send
FE42 fe42_friends_list.jpg Illustrated still — EOS Friends, favorite, Invite
FE44 fe44_favorites.jpg Illustrated still — tap diamond on Friends. Same flag on Clan
FE43 fe43_instance.jpg Illustrated still — In this instance + Invite. No diamond
FE9 world map RAID 2/4/8, VAULT, Daily / Weekly / Hard rows, Tasks filter, globe task diamonds, View Local Map (Tab)
FE18 illustrated world map Earth + Ring. Daily / Weekly / Hard in Operations. Tasks on this globe. Set as Primary
FE23 local map Missions & Objects drawer, Online Tasks filter, Set as Primary, Extract A-7
Lock · Online tasks locks/lock_fe_online_tasks.svg Daily / weekly / hard: Online only. Local Map and World Map. Tasks filter. Set as Primary
FE24 dense 3D waypoint (anti-example) Large callout — do not ship
FE27 waypoint density Seat diagram. Primary lock is FE30
FE30 primary lock · GUI locator Pip + tape + tracker. Painted Shiv on fire
FE28 secondary option World pip only
FE29 secondary option Heading tape as heading cue
FE10 collections Warden Frame, Xenobiological Codex
FE22 marketplace EOS to buy; LUMENAR prices; Wallet cash → BTUCOIN mint 51/49 then convert; Online tasks mint 49% BTUCOIN; listings Online only
Lock · Economy locks/lock_fe_economy.svg Cash → BTUCOIN mint 51/49. Convert → LUMENAR to spend. Play mints same split. Floor vs market. Credits = vendors
Lock · Credits chip locks/lock_gui_credits.svg Character I title bar: CREDITS + BTUCOIN, gap, then X. Never overlap tabs
FE22b marketplace wallet still Illustrated Wallet: LUMENAR primary; BTUCOIN convert; Credits vendors echo
FE12–FE21 illustrated stills Same visor chrome as OV12–OV24: intro, menu, mode, EOS, chars, create, map, Esc, collections, reset
FE33–FE44 illustrated stills Discord + Stay signed in, Social, invite, pause vs LIVE, fireteam privacy, Friends Join, Accept filter, clan roster, friends list, favorites toggle, instance list
OV29 ov29_chat.jpg Illustrated still — OmniVisor chat compose, Fireteam / HAVOC team
OV31 ov31_chat_channels.jpg Illustrated still — Tab cycle (channel bible: Fireteam → Clan → Match → General → Proximity; Whisper separate). GDD: In-game Chat
OV32 ov32_chat_newline.jpg Illustrated still — Shift+Enter new line
Lock · Chat locks/lock_hud_chat.svg Enter / Tab / Shift+Enter. Message limit TBA
FE25 illustrated local map Ring Approach. Daily / Weekly / Hard in Missions & Objects. Extract A-7 Primary
FE26 illustrated 3D waypoint OmniVisor EXTRACT A-7, 142 m, rim clamp

Lock plates: python tfa_gdd_html/figures/build_fe_infographics.py
Illustrated stills live in tfa_gdd_html/figures/ as .jpg (fe12_intro.jpg … fe21_reset.jpg, plus fe25_local_map.jpg, fe26_waypoint.jpg (anti-example), fe30_waypoint_combo.jpg (primary GUI locator), fe28_quiet_pip.jpg / fe29_heading_tape.jpg (secondary options)). Shiv stamp stays PNG (tf_shiv_logo_fire.png).