セーブ/開発者モード
本ドキュメントは振る舞い仕様(観測可能な契約)を定義する。保存形式と保存対象は データの契約 を参照。 用語の正式な定義は 用語集。
概要
プレイヤーはラン(マップ生成〜クリア/ゲームオーバーまでの一続きのプレイ)の途中、戦闘中を含めていつでも中断でき、後から中断時点と同じ状態から再開できる。
また、通常のプレイ経路とは別に、動作確認・調整のための開発者モードを最初から用意する。
決定論と乱数
「保存前と見分けがつかない状態で再開できる」という要求は、乱数の扱いを決めない限り原理的に達成できない。 マップ生成・デッキのシャッフル・座の移動先の決定・報酬候補の抽選が、すべて乱数に依存しているためである。
したがって 状態層がシード付き乱数を所有し、その内部状態をセーブに含める(アーキテクチャ方針 契約3、ADR-0013)。
この契約は開発者モードにも効く。シードを共有すればバグを再現できるため、開発者モードはシードを表示・入力できる必要がある。
セーブ
保存対象
復帰後に同一のイベント列が観測できることが保存対象の判定基準である。この基準を満たす項目の一覧は データの契約 > 保存対象のチェックリスト が持つ。
保存タイミング
プレイヤーが明示的に中断操作を行った時点で保存する。 マップ画面・バトル画面の双方に導線を置く。自動保存は行わず、確認ダイアログも出さない。
スロットは1つで、ロードするとセーブファイルは削除される(ADR-0021)。セーブは中断のための機能であり、やり直しのための機能ではない。
復帰
保存されたデータから復帰した際、保存前と見分けがつかない状態でプレイを再開できる。
- 戦闘中に保存した場合は、そのターンの途中から再開できる(既にプレイしたページ・確定した方向・使用済みの特殊操作が全て復元される)
- 復帰後に引くページの順序は、保存前に引くはずだった順序と一致する
開発者モード
有効化
ゲーム起動時のオプション(起動引数、または起動時のメニュー選択)によって有効化する。
通常の起動経路では、開発者モード向けの操作・表示は一切出現しない。
設計上の位置づけ
開発者モードは、状態層から見れば「入力層と同じ Intent インターフェースを通じて特別な指示を送る、もう一つの発信元」である。
通常の入力経路を迂回して状態層を直接改変する裏口は作らない。デバッグ用の変更も Debug*Intent として表現し、状態層の同じ apply() を通る(アーキテクチャ方針 契約1)。
これにより:
- 開発者モードの操作もイベントを発行するため、表示が自動的に追従する
- デバッグ操作を含むリプレイが記録できる
- 「デバッグ用の抜け道」がゲームロジックを汚染しない
できること(最低限)
状態の直接操作
- HP・防御・歩・綻び・刻を任意の値に設定する
- 手札・山札・捨て札の内容を編集する(ページの追加・削除・並べ替え・面ごとのペン状態の切り替え)
- 敵のHP・座の位置・エスカレーションの進行度を設定する
- 次ターンの予兆(Intent の個数と威力、座の移動先)を指定する
これらの操作は バトルシステム の通常ルール(歩の残量・発動する面の判定・1ステージ1回の特殊操作制限など)をバイパスしてよい。
任意の状態からの開始
- 任意のステージ・HP・綻び・刻・手札構成を指定してラン/戦闘を開始する
- シードを指定してランを開始する(マップとシャッフルの再現)
- 層数を上書きしてランを開始する。 通し確認1回に30〜45分を払わずに済ませるための機能であり、上書きした層数で測った収支は目標比率の検証には使えない(バランス)
内部値の常時表示
- 現在の刻・歩の残量・防御・累積綻び・そのステージ中の綻び上昇量・突破ライン
- このターンに座を跨いだ回数
- 山札・捨て札の中身
- 敵の内部パラメータ(座の生成規則・エスカレーションの進行度)
- 乱数シードと現在のRNG状態
- 直近に発行されたイベントのログ
リリースビルドでの扱い
プロトタイプ期間中は考慮しない。ただし「開発者モードは Intent の発信元にすぎない」という構造を守っておけば、後から Debug*Intent の受付を無効化するだけで済む。
セーブファイルの改竄対策はプロトタイプでは行わない。