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)
- Launch
domination.x86_64→ MULTIPLAYER. - 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. - Host: CREATE LOBBY → pick a map (start with
riverton_crossingfor up to four players;heartland_frontfor larger team tests). - Joiner: pick the lobby from the list → JOIN.
- Both: choose faction + team, joiner hits READY, host hits START.
- 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).