オンライン対戦の「戻る」には、途中の試合へ復帰する場合と、同じメンバーでもう一戦始める場合があります。Signalではこの二つを分け、再接続では判断途中の状態を保ち、再戦では秘密と盤面を作り直します。ここではSignalの実装だけを例にします。ほかのゲームの再接続時間は混ぜません。

6文字のコードと、本人を識別する情報

Signalのルームコードは6文字で、I・O・0・1を使わない英数字から作ります。口頭や小さい画面で共有するときに、Iと1、Oと0を読み違えにくくするための構成です。入力ミスが何%減ったという測定結果ではありません。

コードは部屋を探すためのもので、同じコードを入力するだけで誰かの席へ戻れるわけではありません。復帰には、その参加者として保存されたセッション情報が必要です。部屋の識別とプレイヤー本人の識別を分けることで、招待先を共有しても秘密の手札を共有することにはなりません。

古い切断通知で、新しい接続を切らない

画面を更新すると、新しい接続が先に成立し、古い接続の終了通知が遅れて届く場合があります。以下はその順序を説明するための例です。

  1. プレイヤーPが接続Aで参加している。
  2. 更新後、同じPの接続Bが成立し、現在の接続として保存される。
  3. 遅れて接続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の詳細にあります。