オンライン対戦の「戻る」には、途中の試合へ復帰する場合と、同じメンバーでもう一戦始める場合があります。Signalではこの二つを分け、再接続では判断途中の状態を保ち、再戦では秘密と盤面を作り直します。ここではSignalの実装だけを例にします。ほかのゲームの再接続時間は混ぜません。
6文字のコードと、本人を識別する情報
Signalのルームコードは6文字で、I・O・0・1を使わない英数字から作ります。口頭や小さい画面で共有するときに、Iと1、Oと0を読み違えにくくするための構成です。入力ミスが何%減ったという測定結果ではありません。
コードは部屋を探すためのもので、同じコードを入力するだけで誰かの席へ戻れるわけではありません。復帰には、その参加者として保存されたセッション情報が必要です。部屋の識別とプレイヤー本人の識別を分けることで、招待先を共有しても秘密の手札を共有することにはなりません。
古い切断通知で、新しい接続を切らない
画面を更新すると、新しい接続が先に成立し、古い接続の終了通知が遅れて届く場合があります。以下はその順序を説明するための例です。
- プレイヤーPが接続Aで参加している。
- 更新後、同じPの接続Bが成立し、現在の接続として保存される。
- 遅れて接続Aの切断通知が届く。
ここでPという名前だけを見て切断扱いにすると、接続Bで復帰済みなのに待機状態へ戻されます。Signalは切断通知の接続IDと、現在そのプレイヤーに結び付いた接続IDを比較し、一致しない古い通知を無視します。復帰の速さだけでなく、通知の順序が入れ替わることへの対策です。
再接続猶予は90秒。ただし試合を巻き戻さない
Signalの切断後の再接続猶予は90秒です。通信の生存確認に使う45秒の期限とは用途が違います。部屋自体の有効期限は作成から4時間で、こちらも再接続とは別の制限です。
復帰できる間は同じplayer identityへ戻し、試合の状態を送り直します。盤面、行動数、役職、本人の手札、本人向けSCAN結果、本人のJAM情報を新しい接続へ復元します。非公開データは全員共通の更新に混ぜず、それぞれの本人へ送ります。
一方、切断した瞬間へ試合を巻き戻すわけではありません。投票などの期限は進み、復帰時にはサーバーが持つ最新状態を受け取ります。「残っていた手番の時間を必ず全部使える」という保証とは異なります。
明示的な退出やホストによる退室、猶予切れは一時切断と別です。退出済みの古いセッションで、そのまま席を復活させることはできません。戻れない場合は、同じコードを繰り返し入力する前に、切断なのか退出なのかを確認してください。
再戦では何を保ち、何を作り直すか
再戦は、必要な参加者が接続し、再戦準備をそろえた後に新しい試合を作る処理です。同じ盤面を続ける再接続とは、初期化する範囲が違います。
| 対象 | 再接続 | 再戦 |
|---|---|---|
| 部屋・コード・プレイヤーID | 維持 | 維持 |
| 役職・本人の手札 | 同じ試合の情報を復元 | 役職を再抽選し、新試合で配り直す |
| ルート・盤面ラウンド・行動数 | 最新状態を復元 | 新しい盤面、1/5ラウンド、行動数0から |
| 結果・投票・準備状態 | その時点の状態を復元 | 前の試合の状態を引き継がない |
役職の再抽選は「必ず別の役職になる」という意味ではありません。同じ役職を続けて引くこともあります。手札も配り直すため、前の組み合わせを保存して使い続けるわけではありません。
ここで紛らわしいのが「ラウンド」です。ルート盤面の1〜5ラウンドは新試合で1へ戻りますが、部屋が数える連戦番号は増えます。すべてのroundという値を0や1へ戻す処理ではありません。さらに部屋作成時のSTANDARD / CARDのルール設定は再戦にも引き継ぐため、旧部屋で再戦するだけではCard Modeへ切り替わりません。
この違いが、参加者の操作につながる
一時的な更新や通信断なら、保存されたセッションからの復帰を使う。前の試合を終えて新しい秘密で遊ぶなら、結果画面で再戦を選ぶ。新しいルール設定で遊びたいなら、新規ルームを作る。この三つを区別すると、部屋を作り直すべき場面も判断できます。
対戦ルールはSignalの詳細にあります。