10. セーブとロード

プレイヤーが途中から再開できるようにする仕組みと、シナリオ制作者が設計で意識することをまとめます。セーブ UI の実装そのものはシステムスクリプト側ですが、シナリオの書き方で体験が大きく変わります。

セーブ/ロードの考え方自体は Windows / Android / ブラウザで共通です。
ただし保存先や永続化の仕組みはプラットフォームごとに異なります(10.7)。

10.1 セーブの種類

種類プレイヤー操作主な API/データ用途
クイックセーブメッセージ枠/メニューの Q.SAVEquicksave.dat(最新 1 件)+セーブ画面の Q ページ(履歴 10 件)手軽な 1 か所のセーブ
クイックロードQ.LOAD最新のクイックセーブを読むクイックセーブから復帰
スロットセーブセーブ画面でスロット選択SaveSlot.saveState(n) → save001.dat …複数セーブの保存
スロットロードロード画面SaveSlot.loadState(n)任意スロットから再開
オートセーブ(自動)セーブ画面の A ページ(履歴 10 件)選択肢の前・scenetitle の後・autosave の場所で自動保存
前回の続きからタイトル「前回の続きから」quickresume.dat文章が 1 行進むたびに自動記録(環境設定のオートセーブが入のとき)。ゲームを終えるときにも記録
サスペンドメニュー/メッセージ枠の SUSPENDsuspend.dat中断してアプリ終了。次の起動では、ロゴとタイトルを飛ばして自動で再開(再開は Windows のみ)
環境設定コンフィグ変更systemdata.dat音量・表示設定など(本編進行とは別)

10.2 関連ファイル(システム側)

どれも GameData\data0\system\ にあります。

ファイル役割
MesWnd.txtメッセージ枠の Q.SAVE / Q.LOAD / SAVE / LOAD / SUSPEND ボタン
MenuBar.txt画面上部メニューのセーブ系ボタン
SaveMenu.txtセーブ画面(SaveSlot.saveState を呼ぶ)
LoadMenu.txtロード画面(SaveSlot.loadState を呼ぶ)
title_enhanced.txt「つづきから」「前回の続きから」ボタン
Initialize.txtQ ページ・A ページの履歴の数と場所(SaveSlot.setSeries)
セーブ UI
キャプチャ差し替え images/10_save_ui.png

メッセージ枠またはメニューバーの Q.Save / Save ボタン

図10-1: セーブ UI — 差し替え: images/10_save_ui.png

10.3 何が保存されるか

クイックセーブ/スロットセーブ時に、おおよそ次が記録されます。

制作者への意味: ルート分岐に使う変数は setvar で管理しておけば、ロード後も分岐状態が復元されます(06章)。setclearflag などの永続フラグはセーブとは別の場所に残るので、ロードしても巻き戻りません。

10.4 シナリオ制作者がやること

セーブしやすい地点を設計する

プレイヤーがセーブするのは「章の区切り」「選択肢の直前」などが多いです。章の頭で scenetitle を書くと、セーブ一覧に場面名が出て、オートセーブも 1 件残ります。

*chapter02_start
scenetitle 第2章 はじまり
scene_start ch02 "第2章 はじまり"
msgshow
name "ナレーション"
	第2章が始まります。

scene_start / scene_end(回想・章管理)

章やイベントの範囲を登録します。ギャラリーのシーン回想と連携します。

scene_start prologue "プロローグ"
// … シーン本文 …
scene_end prologue
命令意味
scene_start id "タイトル"シーン開始を登録
scene_end [id]シーン終了(id 省略時は直前のシーン)

menubar の制御

イベント CG やムービーの場面などでメニューを隠したいとき:

menubar off
msghide
// 演出中はセーブ UI を出さない
msgshow
menubar on

menubar off で隠れるのは上部メニューだけです。メッセージ枠の SAVE などのボタンは残るので、セーブさせたくない演出中は msghide で枠ごと隠します。

ロード後に破綻しやすいパターン

避けたい書き方理由
セーブ地点直前に一時的な演出だけの変数を使うロード後に演出がずれることがある
ラベルを飛ばさずに gosub だけで長い処理を続ける復帰位置が分かりにくい
章の途中に end を書いてしまうend の後ろは実行されず、タイトルへ戻ってしまう
スロットセーブ画面
キャプチャ差し替え(任意) images/10_slot_menu.png

SaveMenu のスロット選択画面

図10-2: スロットセーブ(任意) — 差し替え: images/10_slot_menu.png

10.5 システムスクリプトでのカスタム(応用)

セーブ画面やタイトルボタンの動作はシステムスクリプトで変更します。シナリオ行からは呼べません。

スロットセーブ/ロード

// SaveMenu.txt / LoadMenu.txt で使っている形
SaveSlot.saveState(n);
SaveSlot.loadState(n);

// セーブの有無確認(ボタン無効化など)
if (SaveSlot.hasState(n) == 1) {
    // n 番にデータがある
}

クイックセーブの存在確認

データが無いときは、ロード系のボタンを押せなくしています。

// MesWnd.txt(メッセージ枠): Q.LOAD だけを無効にする
if (QuickSave.exists() == 0) {
    System.messageWindow.setButtonEnabled("qload", 0);
}

// MenuBar.txt(上部メニュー): Q.LOAD と LOAD を無効にする
if (QuickSave.exists() == 0) {
    MenuBar.setButtonEnabled("qload", 0);
    MenuBar.setButtonEnabled("load", 0);
}

メッセージ枠の LOAD はロード画面を開くだけなので、いつでも押せるようにしてあります。

タイトルからの再開

ボタン ID動作
title.continueロード画面(LoadMenu)を開く
title.lastcontQuickResume.load() で前回の続きから再開
// title_enhanced.txt(抜粋)
Title.register("title.lastcont",
    "…\nQuickResume.load();"
);
Title.register("title.continue",
    "…\nScripts.execStorage(\"system/LoadMenu\");\n"
);

10.6 シナリオからセーブを残す

シナリオの区切りに autosave と書くと、その場所がオートセーブ(セーブ画面の A ページ)に残ります。選択肢の前と、scenetitle の後にも自動で残ります。

*chapter03_mid
	……ここで、第3章の前半が終わります。
autosave

	後半が始まります。
注意: オートセーブは、環境設定の「オートセーブ」が入のときだけ残ります。
System.* などのシステム API は、シナリオ行からは呼べません。システムスクリプトを動かしたいときは sysscript 名前 を使います。

シナリオから使えるのは autosave、scenetitle、menubar on/off、scene_start、変数操作などシナリオ命令です(09章)。

10.7 セーブデータの保存先

Windows では、lumina.exe の隣の SaveData\ に保存されます(Config.txt の System.setSaveRoot("InstallPath") と System.setSaveFolder("SaveData"))。
そこに書き込めない場所へ置かれたときは、エンジンが自動で AppData へ移し、プレイヤーに 1 回だけ知らせます。

ファイル内容
save001.dat …スロットセーブ(スロット番号ごと)
quicksave.datクイックセーブ(最新 1 件)
quicksave01.dat〜quicksave10.datクイックセーブの履歴(Q ページ)
autosave01.dat〜autosave10.datオートセーブの履歴(A ページ)
quickresume.dat前回の続きから
suspend.datサスペンド
systemdata.dat環境設定・既読・永続フラグなど
gallerydata.datCG などの閲覧記録(cg_flag)

詳細: 公式 第6章 6.8、第4章 4.6。

プラットフォーム保存の考え方制作者としての注意
Windowsexe の隣の SaveData\(書き込めなければ AppData)最も確認しやすい基準環境
Androidアプリの中の保存領域アンインストールや端末差を考慮して実機確認する
ブラウザブラウザの中(IndexedDB)キャッシュ削除やブラウザ設定で消える場合がある
初めて起動したときの動きを確かめるときは、SaveData フォルダを別の場所へ移してから起動します。消さずに移しておけば、あとで元に戻せます。

10.8 動作確認チェックリスト

確認項目OK の目安
クイックセーブ本編中に Q.SAVE → Q.LOAD で同じ位置に戻る
変数復元セーブ前に変えた setvar がロード後も保持される
スロットセーブ画面・ロード画面でスロット保存・読込できる
オートセーブ選択肢や scenetitle の後、セーブ画面の A ページに増えている
タイトル続き一度終了後、「前回の続きから」が押せる(記録がある場合)
ボタン無効化クイックセーブが無いとき Q.LOAD がグレーアウトする
プラットフォーム確認必要な範囲で Windows / Android / ブラウザそれぞれで保存・復帰を試す