# フェーズ別ボタンとセーブ・復元

ゲーム画面の入口は「ボタン設定」のフェーズ別ボタンです。回数は通常のプレイヤー変数、表示・有効条件、共通処理で管理します。専用の行動管理画面やゲーム名による操作バーはありません。JSON形式20／処理形式4です。

## 設定と実行

通常の処理編集で「セーブポイント」「条件・配置を検査」を追加します。文章・コード編集で同じ登録済み引数を編集できます。作成時の既定は操作者所有、情報の新規公開で失効、操作制限なしです。

```json
{"id":"record","type":"savepoint","amount":{"kind":"number","value":0},"savepoint":{"key":"turn","mode":"create","informationPolicy":"invalidate","guard":{"buttonIds":["finish"],"manual":"none"}}}
```

- key：英数字・ハイフン・下線の1〜64文字。予約キーは不可。同時に8個まで。
- mode：create（作成／上書き）、restore（復元）、discard（破棄）、guard（記録を保持して制限だけ変更）。guard省略のguard処理は制限解除。
- owner：actor（既定）またはturn。informationPolicy：invalidate（既定）またはallow。allowは新しく見えたカードも戻せるため、採用ルールを明記します。
- guard：buttonIds（許可する通常ボタンID、100件まで）、manual（none／pieces／all）、任意のplacement。piecesは開始時に使用可能な駒の移動・反転・回転だけ。allでも通常の移動権限・公開範囲を越えられません。
- restoreGuard：復元後に適用する操作制限。終了後と復元後を待機状態へ戻す場合に使います。

やり直しボタンは該当フェーズごとに作成し、actionsを同じkeyのrestore処理1個だけにします。復元は終端処理で、後続処理は実行しません。通常ボタンの表示・有効条件に加え、記録所有者と復元可否を検査します。手番確定ではdiscardしてから給与や次手番へ進めます。手番世代・所有者が変わると記録は破棄されます。

## 条件と配置

stateCheckにcondition（共通条件）、key（配置検査の記録名）、message（失敗時表示）を指定します。conditionとkeyは少なくとも一方が必要です。失敗したコマンドの効果は確定されません。

guard.placementはminAddedPieces／maxAddedPieces／maxPerCard、preserveExistingPlacements、onlyStartingPieces、startingPieceSelector（piece）、targetCardSelector（card）を持ちます。個数は0〜10000の整数です。対象は作成時の権限と閲覧範囲で固定し、選択中・繰返し中に依存する対象は使えません。手動操作のたびに既存配置・対象・上限を検査し、stateCheckで下限も検査します。回数消費と報酬は検査の後に記述します。

## 秘密情報と回答待ち

公開状態savepointsにはkey・ownerId・canRestoreだけを配信します。記録本体、手札内容、山札順、回答継続は私有です。記録所有者による新しいカード内容の閲覧は各処理境界で検出し、一度失効した記録は裏に戻しても復活しません。所持金変更や既知の手札・公開カードの説明閲覧だけでは失効しません。乱数処理等の作者が戻りを禁止したい境界では先にdiscardします。

保存するのはゲーム全体の状態です。全員の手札・所持金・盤面・手番・フェーズと、同じ評価内でcreate後に最初に到達した選択・入力・確認待ち、その処理の続きも保存します。ownerは復元ボタンを使う権限者であり、保存する人や範囲ではありません。実行者・権限者・回答者が異なる場合や複数人が回答する場合にも使用できます。復元は所有者・手番世代・revision・情報失効を検査し、演出中は拒否します。待機以前の効果は再実行せず、回答要求IDを新しく発行します。保存後の古い回答は無効になり、保存時点の回答状況・候補・必要数・案内と残り処理を復元します。期限は元の制限時間で再開します。認証、通信revision、receipt、演出受領は巻き戻しません。

タイマーによる外部の変更以前の記録は失効します。自動タイマー内で作成する場合はownerをturnにします。本人専用のrestore・guard変更とkeyによる配置検査は使えません。discardとconditionによる検査は利用できます。

待機を保存しても、新しい非公開情報を知った記録は復活しません。以前の別操作で作成した記録を後の待機で移動させることもありません。旧保存記録に待機がない場合は従来どおり状態だけを戻します。

## 例と移行

[職場選択待ちへ戻る最小例](examples/savepoint-choice.json)、[配置と3回制限の最小例](examples/phase-savepoints.json)と[プロジェクトLの通常処理例](examples/project-l-phase-buttons.json)を読み込んで確認できます。プロジェクトLは回数変数、フェーズ、通常のカード選択、配置検査、報酬、終了判定へ展開されています。例のallowは情報やり直しを認める採用設定です。ナショナルエコノミーはinvalidateで、直前操作の取消を置かずターン全体だけ戻します。

旧settings.actionFlow／settings.projectLは読込変換で通常ボタン・変数・処理に移します。新形式の保存では旧設定を禁止します。旧方式の進行中の部屋は復元情報を推測して変換せず、新規開始が必要です。公開済み定義や保存元ファイルを読込だけで上書きしません。アルカトラズの既存フェーズボタンは変更しません。

[検証方法](validation.md)で定義・操作・秘密投影・保存再開を確認してください。ローカル実装の検証と本番公開・複数端末確認は別です。

## 連続する選択の実行上限

同じ選択行を繰り返しても回答は一回ごとに必要です。正しい回答が全対象者分揃うと、次の同期計算区間の実行予算を数え直します。上限値、保存した値・公開範囲・ループ位置は変更しません。自動演出、タイムアウト、一部の回答、やり直しでは予算を増やせません。

[実行者と復元権者を分離し、複数人の選択を戻す例](examples/savepoint-world.json)。保存形式20／処理形式4と旧記録の読込は維持し、待機を持たない旧記録は状態だけの復元となる。既存の進行中の部屋の定義を自動変換しない。

確認待ち中でも、既存の権限と操作制限で許可された手動操作は確認画面・ゲーム画面の両方で利用できます。操作しても確認済み人数や要求IDは変わりません。通常の入力・選択待ちの変更禁止は維持します。タイマーが0で停止するだけなら取消記録は維持し、設定済みの終了処理が実際に実行される直前に以前の記録を失効させます。
