Skip to content

Dock terminal lobby - #522

Merged
Jackriip merged 42 commits into
masterfrom
feature/lobby-terminal
Nov 11, 2026
Merged

Jackriip merged 42 commits into
masterfrom
feature/lobby-terminal

Conversation

@Jackriip

@Jackriip Jackriip commented Nov 10, 2026 •

Copy link
Copy Markdown
Member

Dock terminal lobby

The lobby is now a full-screen dock terminal drawn over the map pane, replacing the stock lobby buttons and the separate Join Game and ship purchase windows. Everything a player does before spawning happens on one screen.

Bezel

  • JOIN / READY / NOT READY, OBSERVE and CHARACTER keys, a ready lamp, and the wiki, polls (with the new-poll mark), manifest, settings and changelog buttons.
  • Header with players online and the round clock, or the departure countdown before the round.
  • Scales to the window at whole-pixel steps and has narrow layouts for small windows.

CREWS

  • One line per crew: ship, class, crew aboard, open berths and FULL / LOCKED / APPLIED.
  • Crew record with the memo and each open job's SIGN ON, which spawns straight into that job.
  • Locked crews take a CODE on screen, or an APPLY with a one-line note. Full crews can be pinged, with a cooldown.
  • Cryo rejoin wait, job bans and playtime, the popcap queue and admin-disabled late join show as short lines on screen instead of popups.

SHIPYARD

  • Parts on account, NEW SHIP, REQUISITION (only when a hull is free) and saved-ship slots (hidden until ship saves are merged).
  • HULLS registry and hull record, then FIT (finish, then each room) with the real full-colour preview composited live, then BILL.
  • One bill paid at COMMISSION. Unlocks are permanent and are kept if the launch fails after paying.
  • Commissioning, requisitioning or loading while in a crew shows LEAVES , and the key turns into CONFIRM.

HOUSING

  • Player outposts with their admission mode: MOVE IN, a CODE field for password outposts, REQUEST for invite-only ones.

Keyboard, highlight and sound

  • Works with arrow keys as well as the mouse, sharing one highlight. Arrows move to the nearest item; lists move row by row and page at the ends; Enter or Space presses; Escape or Backspace goes back; Tab or 1-4 changes tab.
  • Each screen pre-selects its first sensible item, and hovering moves the same highlight.
  • Quiet terminal clicks on moves and a select sound on presses, played in the page.
  • The crew record lists who is aboard by name and job, captain first and marked CAPT.
  • Every screen bounds its text: long names, memos, lists and prices are cut, wrapped or paged instead of running into their neighbours.

Fixes along the way

  • Ship part classes are defined before the hull templates that use them, so hull prices are keyed by class instead of the literal define name.
  • Spending parts refunds the classes already taken if a later class fails.
  • A failed spawn after a ship is created no longer blocks buying another.
  • The old join menu's ship and outpost password prompts share the terminal's guess limiter.

The classic HUD lobby stays as a fallback and only appears if the terminal fails to load within 30 seconds.

Wiki pages updated: new player guide, ship upgrades, ship parts.

Screens

In a real client, before the round:

Lobby in a real client

Crews Shipyard
Crews Shipyard
Fit Bill
Fit Bill

Housing:

Housing

Keyboard highlight, crew list and bill table in a real client:

Open
Crew record
Bill

Resizable bezel pieces at 1x (9-slice frame, deck with hazard-post ends,
keycaps in idle/hover/pressed/disabled, lamps, grille, button tray),
bezel.json describing their insets and positions, and lobby_terminal.css
classes that assemble them at an integer scale. Ready lamps are cropped
from icons/hud/lobby/collapse_expand.dmi.
A BROWSER control over the map pane renders the LobbyTerminal tgui
interface for new players. The terminal datum declares the section procs
for crews, shipyard and housing, shared code-lockout and join-lock
helpers, and the data contract in types.ts. term.tsx holds the text-grid
primitives the tabs draw with. The classic HUD lobby stays underneath as
the fallback.
Lists player outposts with their admission mode and residents, moves the
player in through join_outpost (which now takes an entered code instead of
prompting), rate-limits wrong outpost codes through the shared lobby code
limiter, and lets players ask INVITE outposts to take them in. The wiki
pages for new players, the shipyard and ship parts describe the terminal.
One line per crew with the record beside it: memo, berths with SIGN ON,
CODE and NOTE + APPLY for locked crews, PING CREW when every berth is
taken. SIGN ON is a direct join with no popups. It checks the popcap
queue and stops (the old path printed 'Server is full' and joined
anyway), job bans and playtime off the UI tick, the cryo rejoin wait,
admin-disabled late join and the shared join lock. Wrong codes go through
the shared lockout, and a new code on the ship resets it.
The shipyard section sends the hull catalog after the player opens it, sends each
hull's preview images on demand, and caches parts and ownership off the UI tick.
COMMISSION rebuilds the bill on the server, spends it once and records every unlock,
then launches with the crew answer the terminal collected. spend_parts now refunds
the classes it already took when a later class fails.
The batched spritesheet failed for the whole round when the first player
reached the lobby before the asset subsystem had run. The five buttons now
go out as PNGs cut from bottom_buttons.dmi in the terminal's own asset.
SHIPYARD home with new ship, requisition and saved ship cards drawn from
their floor plans; the hull registry and record; FIT with the live
composited yard preview on a viewscreen and the slot being edited
outlined; and the single BILL with commission. Leaving a crew shows a
LEAVES line and turns the key into CONFIRM. Narrow windows get one panel
at a time. Hull.jobs carries crew for hulls without finishes.
Share one text field between CREWS and HOUSING, route the old join menu's
outpost and ship password popups through the lobby code limiter, clear
spawning_ship when a new hull can't seat its buyer, keep a refused
commission's fit, return SHIPYARD to its front page when pressed again,
limit the yard's DB refresh and the client metrics log, and tidy the bezel
CSS comments.
The CHARACTER key and a fourth tab open an empty personnel file. Adds the
char_ action dispatch, the character section procs and vars, the data
contract in types.ts, Swatch/Cycler/Panel grid primitives, and stub files
for the backend, preview and editors.
…window sync

Adds the char_* adapter over /datum/preferences: preference writes through
update_preference, quirks, roles (one HIGH), loadout picks, colours, names and
skins through tg's middleware, a terminal species-change confirm, the native
colour dialog for body colours, debounced saving, two-way sync with tg's
character window, and a flag-gated is_accessible override so terminal edits
work while tg's window was last on game settings. Unit test covers the
crafted-act abuse cases.
FILES list with the preview's turn keys and dress label, the PERSONNEL FILE cells, crumbs and section routing. BODY rows follow the server's prefs keys, flow into two columns or pages on short screens, and long lists open a paged picker. Colour entry has hex, H/S/V bars, recent colours and the native picker.
… server cached preview facings, drop the preview benchmark
…ched kit colours, give the test's mock client a veteran check
… failed open

While the world initialises, send_assets() can sleep for seconds. Any message that reached the
page in that gap rendered tgui before its first update, crashed the Window layout on the empty
config and closed the terminal mid-open, so it never showed. The update is now queued first,
open() notices a close during the sleep, and a failed open is retried a few times.
…ck terminal

Every key, row, field and bezel button takes the focus on hover or with the arrow keys; Enter
or Space presses it, Escape or Backspace goes back, Tab and the number keys change tabs. The
terminal takes keyboard focus when it shows and hands it back to the map when it hides. The
page plays short terminal clicks on each move and press. The crew record lists who is aboard
with the captain first. The bill's totals are a parts table that can't overlap, and lists,
names and descriptions on every screen are cut, wrapped or paged to their boxes.
The page can report itself visible while open() is still sending assets. Without the UI set,
on_window_visible() took that for a stale page and hid the terminal over a working lobby.
…text on the CHARACTER screens too

Cyclers step with Left and Right, swatches and picker entries take the focus, pickers and
the colour box keep the focus inside them and close on Escape or Backspace.
Character screen in the dock terminal lobby
Ship saves and the lobby both added refund_parts(). Keep the one that
reports success, which ship saves relies on, with the lobby's refund log
line and the admin alert when a refund fails.
@Jackriip
Jackriip merged commit 5ee96be into master Nov 11, 2026
4 checks passed
@Jackriip
Jackriip deleted the feature/lobby-terminal branch November 11, 2026 04:43
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant