10. セーブとロード
プレイヤーが途中から再開できるようにする仕組みと、シナリオ制作者が設計で意識することをまとめます。セーブ UI の実装そのものはシステムスクリプト側ですが、シナリオの書き方で体験が大きく変わります。
ただし保存先や永続化の仕組みはプラットフォームごとに異なります(10.7)。
10.1 セーブの種類
| 種類 | プレイヤー操作 | 主な API/データ | 用途 |
|---|---|---|---|
| クイックセーブ | メッセージ枠/メニューの Q.SAVE | quicksave.dat(最新 1 件)+セーブ画面の Q ページ(履歴 10 件) | 手軽な 1 か所のセーブ |
| クイックロード | Q.LOAD | 最新のクイックセーブを読む | クイックセーブから復帰 |
| スロットセーブ | セーブ画面でスロット選択 | SaveSlot.saveState(n) → save001.dat … | 複数セーブの保存 |
| スロットロード | ロード画面 | SaveSlot.loadState(n) | 任意スロットから再開 |
| オートセーブ | (自動) | セーブ画面の A ページ(履歴 10 件) | 選択肢の前・scenetitle の後・autosave の場所で自動保存 |
| 前回の続きから | タイトル「前回の続きから」 | quickresume.dat | 文章が 1 行進むたびに自動記録(環境設定のオートセーブが入のとき)。ゲームを終えるときにも記録 |
| サスペンド | メニュー/メッセージ枠の SUSPEND | suspend.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.txt | Q ページ・A ページの履歴の数と場所(SaveSlot.setSeries) |
images/10_save_ui.png
メッセージ枠またはメニューバーの Q.Save / Save ボタン
images/10_save_ui.png10.3 何が保存されるか
クイックセーブ/スロットセーブ時に、おおよそ次が記録されます。
- 実行中のシナリオファイルパス(例:
scenario/chapter01) - 現在の位置(ラベルと、その中の何行目か)
- シナリオ変数(
setvar/addvarで設定した値) - 画面状態(背景・立ち絵・イベント CG・BGM・メッセージウィンドウ。ロードやシーン戻りで、Windows・Android・ブラウザとも同じように戻ります)
- セーブ一覧に出る場面名(
scenetitleで決めたもの)
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 のスロット選択画面
images/10_slot_menu.png10.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.lastcont | QuickResume.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.dat | CG などの閲覧記録(cg_flag) |
詳細: 公式 第6章 6.8、第4章 4.6。
| プラットフォーム | 保存の考え方 | 制作者としての注意 |
|---|---|---|
| Windows | exe の隣の SaveData\(書き込めなければ AppData) | 最も確認しやすい基準環境 |
| Android | アプリの中の保存領域 | アンインストールや端末差を考慮して実機確認する |
| ブラウザ | ブラウザの中(IndexedDB) | キャッシュ削除やブラウザ設定で消える場合がある |
SaveData フォルダを別の場所へ移してから起動します。消さずに移しておけば、あとで元に戻せます。
10.8 動作確認チェックリスト
| 確認項目 | OK の目安 |
|---|---|
| クイックセーブ | 本編中に Q.SAVE → Q.LOAD で同じ位置に戻る |
| 変数復元 | セーブ前に変えた setvar がロード後も保持される |
| スロット | セーブ画面・ロード画面でスロット保存・読込できる |
| オートセーブ | 選択肢や scenetitle の後、セーブ画面の A ページに増えている |
| タイトル続き | 一度終了後、「前回の続きから」が押せる(記録がある場合) |
| ボタン無効化 | クイックセーブが無いとき Q.LOAD がグレーアウトする |
| プラットフォーム確認 | 必要な範囲で Windows / Android / ブラウザそれぞれで保存・復帰を試す |