| ① |
観戦者 S:ロビーで部屋IDを入力し「観戦する」を押す。プレイヤー A,B,C,D:部屋で待機または「ゲーム開始」を押す。 |
(S が送信するまでサーバー側の変化なし) |
S:ロビー(部屋一覧・部屋ID入力欄・「観戦する」ボタン)。A,B,C,D:部屋画面(参加者 4人・ゲーム開始ボタン)。 |
| ② |
S:「観戦する」送信済み。A:ゲーム開始押下で全員ゲーム画面へ。 |
spectate_room 受信→部屋が存在し参加可能なら room["spectators"] に S を追加、socket を room_id の Socket.IO ルームに join。ゲーム中なら現在の game 状態(board, taken, vanished, points, current_turn, players)を S に返却。 |
S:ゲーム未開始なら部屋画面(参加者・観戦者数のみ、操作不可)。ゲーム中なら盤面・ポイント・現在ターン。A,B,C,D:ゲーム画面 or 部屋。 |
| ③ |
S:カードをクリックしない(不可)。「観戦をやめる」のみ可能。A,B,C,D:通常プレイ(2枚選択・ペア取得・ターン終了)。 |
pair_taken / turn_ended / tribe_effect 等を room 宛に emit → S も同じルームにいるため受信。S には flip_cards 送信権なし。カードクリックはクライアントで無効化。 |
S:プレイヤーと同じ盤面・ポイント・「○のターン」表示。カードはクリック不可・「観戦中」のラベル。A,B,C,D:通常のゲーム画面。 |
| ④ |
全員:ゲーム終了の結果を見る。S:勝者・ポイントを確認し、続けて観戦するかロビーに戻るか選ぶ準備。 |
game_ended を room 宛に emit(points, pairs, winner_indices)。S も受信。プレイヤーには「再戦しますか?」、観戦者には「観戦を続ける/ロビーに戻る」用の payload または同じイベントでクライアントが役割で分岐。 |
S:終了オーバーレイ(勝者名・各プレイヤーのポイント・ペア数)。「観戦を続ける」「ロビーに戻る」ボタン。A,B,C,D:終了オーバーレイ「再戦しますか?」(はい・いいえ)。 |
| ⑤ |
S:「観戦を続ける」→ 再戦開始まで待ち、2回目も観戦。「ロビーに戻る」→ leave_room 送信。A,B,C,D:はい/いいえ選択。 |
S が leave_room 送信→サーバーは players に該当 sid がなければ spectators から削除。socket を room から leave。S に「ロビーに戻しました」等のレスポンス。room_updated で観戦者数が減ったことを配信するかは任意。 |
S(ロビーに戻る選択後):ロビー画面(部屋一覧)。A,B,C,D:再戦カウントダウン or 「参加者を待っています…」。 |
| ⑥〜⑦ |
S:ロビーで他部屋を観戦したり、自分で部屋を作成・参加できる。A,B,C,D:再戦 or 人数不足でロビーへ。 |
disconnect 時も players にいなければ spectators から削除(_fantasy_leave_room_by_sid)。部屋が解散(0人)になったら S がまだ観戦中なら部屋が消えるので、クライアントで check_room 等で無効と分かればロビー表示に切り替える。 |
S:ロビー。A,B,C,D:再戦でゲーム再開 or ロビー。 |