DOMINATION

DOMI-NATION — First Human Playtest Runbook (Online Multiplayer)

Two humans, one LAN, one dedicated server. Everything below is verified by the automated sync harness (2p/4p/8p/bots all IN SYNC as of 2026-07-02, PR #1416); this run is about how the game feels, not whether it desyncs.

1. Build the game (once)

cd ~/Desktop/war/unity
./build-game.sh          # ~12 min; produces Build/domination/domination.x86_64

Copy the Build/domination/ folder to the second machine (or run both clients on one box for a first smoke — it works, windowed).

2. Start the server (host machine)

cd ~/Desktop/war
DEDICATED_SERVER_HOST=0.0.0.0 \
DEDICATED_SERVER_PORT=7777 \
TLS_CERT_PATH=/etc/domination/tls/fullchain.pem \
TLS_KEY_PATH=/etc/domination/tls/privkey.pem \
SERVER_DATA_DIR=$HOME/domination-server-data \
node server/src/server.js --config "$PWD/server/config/server.json"

Healthy start logs maps_loaded with releaseMapCount=9, then server_listening. The release manifest—not the contents of an arbitrary working directory—defines the map list. Profiles, replays and logs land under SERVER_DATA_DIR. Stop with Ctrl-C; restart is safe (profiles/XP persist, running matches do not). The certificate SAN must contain the hostname players enter and its issuer must be trusted by both client operating systems.

3. Connect (both players)

  1. Launch domination.x86_64 → MULTIPLAYER.
  2. Server field: the certificate-matching hostname and port, for example tls://rts-host.example.net:7777. A bare hostname also defaults to TLS. Plaintext LAN endpoints are rejected; the explicit numeric-loopback development exception must never carry real credentials. Pick a commander name → CONNECT.
  3. Host: CREATE LOBBY → pick a map (start with riverton_crossing for up to four players; heartland_front for larger team tests).
  4. Joiner: pick the lobby from the list → JOIN.
  5. Both: choose faction + team, joiner hits READY, host hits START.
  6. Loading is spread-started; a stalled client forfeits after 90 s instead of hanging the lobby.

Optional: host can ADD AI to fill slots (bots earn no XP for you beyond participation/time — no farming).

4. What to pay attention to (the actual playtest)

  • Command feel: orders execute ~0.5 s after you issue them (the lockstep lead). Does it feel acceptable for an RTS? Note any moment it feels laggy vs merely deliberate.
  • The first 5 minutes: build order flows, power management, unit production, rally points (set them — they relay), attack-moves.
  • Combat readability: do fights on your screen match what your opponent describes? (They should be tick-identical.)
  • Chat + quick comms in the lobby; rank insignia on the roster.
  • Notifications: low power, under attack, unit lost — timely and clear?
  • Post-game: VICTORY/DEFEAT screen, XP breakdown, rank progress, then the lobby reopens for a rematch — does the loop invite "one more"?
  • The thing that should NEVER appear: an amber UNRANKED MATCH STOPPED screen means the desync net fired. If you see it, grab SERVER_DATA_DIR/logs/ and the replay — that's a bug report gold mine.

5. Known limits (deliberate, this playtest)

  • Sell, bulldoze, and repair are disabled online ("coming soon" notify) — they mutate the sim locally with no relay command yet; they return once relayed as commands (queued right behind research). Build placement, movement, combat, production, and rally all work normally.
  • Research & Doctrine trees are disabled online ("coming soon" notify) — their effects are local-only today and would fork the sim. Post-playtest work relays them as commands. Consequently, research-locked content — node-gated tier-3 units, the 12 secondary support powers, and two-key superweapon authorization — is also unavailable online for now (equally for every player; the standard build-order arc through tier 2 is intact).
  • Lobby and pre-match loading disconnects may reclaim their reserved seat. Once simulation begins, reconnect is disabled for 1.0 because command replay cannot safely restore authoritative world state; a dropped player remains paused locally and the server applies its configured disconnect outcome.
  • Superweapons, elites, naval all work online — they run on the seeded, tick-aligned sim like everything else — but have had less multi-human soak time than the core loop. Notes welcome.
  • Result integrity: public peer-simulated matches are explicitly unranked; casual awards are server-computed, match IDs are deduped, and leaving early follows the abandon/forfeit policy. Integrity stops infer no winner and create a durable incident/review cooldown instead of a consequence-free void. The client must negotiate lockstep-0.1; checksum cohorts are frozen per tick, and surrender cannot bypass a pending comparison.
  • Matches are recorded and reviewable: every match's full command log is archived server-side (<dataDir>/replays/). Say so to players — recorded games measurably deter casual cheating. A stopped match also writes the reconstructable private evidence record at <dataDir>/integrity/<matchId>.json.

6. Feeding notes back

Freeform notes are perfect. Most useful format: timestamp + what you expected

  • what happened. The post-playtest iteration turns those into the polish backlog (alongside the fun/reward queue: leaderboard, medals, battle stats, streak XP).