セーブ&ロード

Ponkanのセーブは、吉里吉里2/KAG3のセーブの仕様を参考にしています。
KAG3がラベルの位置の状態をセーブしていたのに対して、Ponkanではセーブマークの位置の状態をセーブします。

セーブマーク行の意味

Ponkanのセーブは、少し複雑な仕様になっています。

Ponkanでセーブデータを保存しても、セーブする瞬間の状態は保存されません。 その瞬間ではなく、最後にセーブマーク行を通過した時点の状態が保存されます。

以下に例を示します。

# ゲーム開始スクリプト
;call file: "script/init_system.pon"

~セーブ場所1
;clear
こんにちは。
;pagebreak
;br

~セーブ場所2
;clear
セーブマークを書くと、その位置でセーブできるようになります。
;pagebreak
;br

~セーブ場所3
;clear
セーブマークの後では、かならずclearを実行してください。
;pagebreak
;br

~セーブ場所1というような記述がある部分が、セーブされる場所です。

~(チルダ)の後ろの部分(セーブ場所1、セーブ場所2、セーブ場所3)は、セーブマークの「見出し」テキストです。 見出しはセーブデータに保存され、セーブ画面でそのまま見出しとして表示されます。 プレイヤーに見えるテキストなので、わかりやすい見出しを付けるようにしましょう。

セーブマークの直後には、必ずclearコマンドを書くようにしてください。 これは、Ponkanのセーブデータにはメッセージ情報が保存されないためです。

セーブマークを書いてはいけない場所

以下のような場所には、セーブマークを書かないようにしてください。

  • マクロの中
  • サブルーチンの中
  • メッセージが画面に表示されている状態の場所

見出しの省略

見出しのテキストは省略することができます。省略した場合、直前のセーブマークの見出しと同じ見出しが使われます。

# ゲーム開始スクリプト
;call file: "script/init_system.pon"

~ゲーム開始
;clear
こんにちは。
;pagebreak
;br

~
;clear
この位置のセーブ見出しは「ゲーム開始」です。
;pagebreak
;br

~
;clear
ここも「ゲーム開始」です。
;pagebreak
;br

~花子ルート1
;clear
ここは「花子ルート1」です。
;pagebreak
;br

セーブマーク名を明示する

実はここまでのセーブマークはすべて、セーブマーク名を省略した記法でした。 セーブマーク名は見出しテキストとは別のもので、セーブマークを区別するためにつける名前です。

セーブマーク名を省略すると、Ponkanが自動で __save_mark_0__ というような名前を割り振ります。 数字の部分はスクリプトファイルの中で連番になります。

セーブマーク名を明示する場合は、以下のように書きます。 my_save_markの部分がセーブマーク名になります。

~my_save_mark|ゲーム開始
  • 見出しテキストを省略したとき:~セーブマーク名|
  • セーブマーク名を省略したとき:~|見出しテキスト または ~見出しテキスト
  • 両方を省略したとき: ~| または ~

通常、セーブマーク名は省略してしまったので問題ありません。 ただし、ゲームを一度リリースした後にアップデートするときは、明示しないといけない場合があります。

セーブマーク名を省略できないパターン

Ponkanはセーブデータをロードしたとき、セーブデータに保存されているセーブマーク名を利用して、 スクリプトのどの部分を実行していたかを把握します。

では、もしゲームのバージョンアップで、セーブマークの数が増減したとしたら、どうでしょうか。 例にそって考えていきましょう。

最初のリリース時のスクリプトが、以下のようなものだったとします。

# 最初のリリース時のスクリプト

~ゲーム開始
;clear
こんにちは。
;pagebreak
;br

~
;clear
また遊んでね。

セーブマークは全部で2つあります。 セーブマーク名はすべて省略されているので、順番に__save_mark_0____save_mark_1__となります。

その後、ゲームをアップデートして、メッセージが一つ増えました。

# アップデート後のスクリプト

~ゲーム開始
;clear
こんにちは。
;pagebreak
;br

~
;clear
プレイしてくれてありがとう。
;pagebreak
;br

~
;clear
また遊んでね。

セーブマークが1つ増えて、3つになりました。なので、順番に__save_mark_0____save_mark_1____save_mark_2__です。

では、もしアップデート前のセーブデータが残っていて、__save_mark_1__の場所でセーブされていたとしたら、どうなるでしょうか。 セーブしたときは「また遊んでね。」の直前の位置のセーブだったのに、 アップデートしたら「プレイしてくれてありがとう。」の位置になってしまいました。 これでは、セーブデータをロードされたら、おかしなことになってしまいます。

これを回避するために、セーブマークを追加する場合には、セーブマーク名を明示して書くようにします。

# アップデート後のスクリプト

~ゲーム開始
;clear
こんにちは。
;pagebreak
;br

~added_save_mark|
;clear
プレイしてくれてありがとう。
;pagebreak
;br

~
;clear
また遊んでね。

このようにすれば、アップデートしても正しくセーブ&ロードできます。