Files
tiennm99 9de0f97752 feat(pvp): auto-start game on second player join
The "Start Game" button in the waiting room is gone — as soon as a
second player joins a PVP room, the server flips to Playing and both
clients transition into the game in lockstep.

Server:
- Proto: remove GameStartingRequest message + oneof field (now unused).
- state/home.go handleJoinRoom: after a successful join that fills the
  room, call assignColors, set Status=Playing + CurrentTurn=Black,
  close StartCh, broadcast GameStartingResponse, return StateGamePvp
  for the joining player. If still only one player, return StateWaiting
  as before.
- state/waiting.go: collapse ownerWait + joinerWait into a single
  unified loop. Both roles just select on StartCh (auto-start signal)
  and CmdCh (for ClientExit). No more GameStartingRequest handling or
  PlayerCount checks.
- network/dispatch.go: drop Request_GameStarting from the stateful
  routing list.

Client:
- connection-service.js: remove sendGameStarting() helper.
- menu-ui-rooms.js showWaiting: drop the isOwner parameter + Start Game
  button + owner/joiner branching. Both views show the same passive
  'Waiting for opponent...' message that flips to 'Opponent joined:
  <name> - starting game...' when the second player arrives.
- menu-scene.js: update _onRoomCreateSuccess + _onRoomJoinSuccess to
  call the simpler showWaiting(ownerNickname, playerCount, onLeave)
  signature.

Tests:
- Remove TestWaitingOwnerGameStartingRequiresFullRoom (obsolete).
- Rewrite TestWaitingOwnerStartsWhenFull into TestWaitingOwner
  TransitionsOnStartCh: simulate handleJoinRoom closing StartCh,
  verify owner transitions to StateGamePvp.
- Add TestFlow_JoinAutoStartsGame: end-to-end drive where owner is in
  waitingState, joiner sends JoinRoomRequest from home, and both
  goroutines must land in StateGamePvp with colors assigned and
  GameStartingResponse broadcast.

Regen Go + JS proto stubs. go vet + go test ./... green.
npm --prefix client run build green.
2026-04-11 18:19:05 +07:00
..