セーブ&ロード
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
また遊んでね。
このようにすれば、アップデートしても正しくセーブ&ロードできます。