セーブ・ロードに対応させよう

# KAG の「栞」

KAG では、ゲームのセーブ・ロードを、しゃれて(?)「栞」にたとえています。( この表記が納得行かない方は、MainWindow.tjs を書き換えてください )。
栞データに関しては 栞のデータに関して も参照してください。
残念ながら、KAG でのセーブ・ロードは任意の場所でできません。必ず、セーブ可能なラベルを目印として、セーブ・ロードする「場所」が必要となります。
・・・とはいってもセーブ・ロード自体は、メニューの「栞をはさむ」「栞をたどる」で、ほぼいつでもできるのですが、セーブするときは、一番最近に通った「セーブの場所」がセーブされます。
そのため、プレーヤーがその「場所」から少し離れたところでセーブしても、ロードするとその一番最後に通った「場所」の位置からまたスタートすることになります。
そのセーブの場所となるのが、ラベルです。ただし、セーブの場所となるラベルは、普通のラベルとはすこし違った書き方をします。
以下の例を見てください。
`[wait time=20]
*start|スタート
[cm]
ここがスタートです[l][r]
*label2|セーブ場所2
[cm]
ここはセーブ場所２[l][r]
*label3|セーブ場所3
[cm]
ここはセーブ場所３[l][r]
[jump target=*start]
`
このように、ラベルの後に | ( 縦棒 ) を指定し、その後にそのセーブ場所の名前となる物を「見出し」としてつけます。見出しは名前が重複していてもかまいません。見出しは「栞をはさむ」メニュー内の、メニュー項目の所にも表示される物ですので、ユーザーにわかりやすい名前を付けるべきです。また、フリーセーブモードにおいてはデフォルトのファイル名にもなります。
jump タグなどで | つきのラベルにジャンプさせたい場合は、 | 以降は指定してはいけません。上記では [jump target=*start] とありますが、このように target 属性などでラベルを指定する場合は、 | 以降は省略する必要があります。
見出しは、たとえば以下のように省略することができます。
`*label|
`
この場合は、前回通過した時点での見出しを引き継ぎます。
また、| の後に & をつけると、変数の内容を見出しにできます。たとえば、
`*label|&f.title
`
とすると、f.title の変数の中身を見出しとして使用するようになります。
ラベル名 ( | より前の部分 ) は、同じシナリオファイルの中では、重複する名前があってはなりません ( 違うシナリオファイル中では重複していても OK です )。それに対して見出しは内部的に扱われるだけですので、シナリオファイルを作る側だけが注意していれば OK です。
また、このようなラベルの後には必ず [cm] を書きます。
Note
[cm] でなくて [ct] でもかまいません。両者の違いは、ct が操作対象のメッセージレイヤを表ページの message0 に設定するのに対し、cm はすべてのメッセージレイヤをクリアするだけで、操作対象のメッセージレイヤは変更しないということです。
このようなメッセージレイヤをクリアするタグを書かなければならないのは、メッセージレイヤになにが書かれているかまでは栞に保存されないためです。
また、セーブ可能なラベルを trans タグと wt タグの間に書くなど、「何か時間を行って処理をするタグ」と「それを待つタグ」の間には書かないことをおすすめします。
また、| を書かずに、普通にラベル名だけを記述したラベルのカ所ではセーブできません。
・・・注意すべき事はこれだけです`(^^)`
このような、セーブ場所としてのラベルは増やせば増やすほど、ユーザーにセーブできるカ所を増やすことができます。ラベルは作るだけで、べつに作ったらそこに必ずジャンプするようなタグを書かなければならないというわけではありません。
ただ、このようなラベルの後は必ず [cm] を書かなければならないということは、よく注意してください。
Note
内部的には、KAG は | 付きの ( セーブ可能な ) ラベルを通過するときに、KAG はその時点での状態をいったん内部に保存します。ユーザが栞の保存を選んだときに保存されるのはそのときのデータです。

# disablestore タグの使用法

disablestore タグは一時的に「栞をはさむ」の機能を無効にします。
セーブ可能なラベルは、ゲーム本編にはいる前の、たとえばメインのメニューなどで栞を保存できても仕方ないと思うので、そのような場所には書く必要はありません。
KAG は、起動してからまだセーブ可能なラベルを通過しない間は「栞をはさむ」の機能は利用できません。
ですので、ゲームの本編にはいる前にはどこにもセーブ可能なラベルを書かなければいいのですが、それだとゲームが終わってメインメニューに戻るときには、もしセーブ可能なラベルを通過しているとメインメニューでも栞を挟めてしまえます。
これを防ぐため、ゲーム本編にはいるまではセーブ可能なラベルを書かないのとともに、メインメニューなどでは `[disablestore]` を記述して「栞をはさむ」の機能を無効にします。
`[disablestore]` を記述すると、KAG 起動時と同じく、セーブ可能なラベルを通過しない間は「栞をはさむ」の機能が使用できなくなります。

# startanchor タグの使用法

startanchor タグは「最初に戻る」メニューを使用可能にします。
KAG のメニューバーには「システム|最初に戻る...」があります。
このメニューはそのままでは選択できません。
戻り先を指定するには、「最初に戻る」メニューが選択されたときに戻りたい場所に、`[startanchor]` タグを記述します。このタグはセーブ可能なラベルのあとに書いてください。この `[startanchor]` 以後、「最初に戻る」メニューが使用可能になります。
また、メインメニューなどで「最初に戻る」の機能を使わせたくない場合は `[startanchor enabled=false]`と記述します。この場合は、再び `[startanchor]` の記述を通過しない間は「最初に戻る」の機能が使用不可能になります。
「最初に戻る」は startanchor タグの記述された位置の栞をたどるのと似た動作をしますが、ゲーム変数 ( → 変数を使おう ) はすべてそのまま ( 保持 ) されます。

# ラベル名の重複や省略

同じシナリオファイル中に同じラベル名 ( | より前の部分 ) がある場合は、一番最初のラベルはそのままですが、次のラベルには `:2` や `:3` などの通し番号が自動的につきます。
たとえば、
`*start|スタート
*start|セーブ場所2
*start|セーブ場所3
`
とすると、最初の *start は "`*start`" ですが、次の *start にジャンプなどをしたい場合は、target属性などで "`*start:2`" とする必要があります。その次は "`*start:3`" です。
また、ラベル名を省略すると、直前のラベル名と同じ物が指定されたと見なされ、通し番号がつきます。 　たとえば、
`*start|スタート
*|セーブ場所2
*|セーブ場所3
`
とすると、２番目のラベルは "`*start:2`" となります。３番目のラベルは "`*start:3`" です。
ラベルと見出しの両方を省略すると以下のような書き方になります。
`*start|スタート
*|
*|
`
この書き方は保存可能なラベルを書くときにいちいちそれぞれ異なるラベル名を指定しなくて良いので便利ですが、ラベルが通し番号で管理されているため、シナリオファイルを編集して、途中でラベルの数を減らしたり増やしたりすると、栞をたどったときに元の位置に戻れなくなったり、return タグで元の位置に戻れなくなる可能性があります。
Note
見出しを省略すると、直前に通過したセーブ可能なラベルの見出しを引き継ぐのに対し、ラベル名を省略すると、そこを通過したか通過しなかったかに関わらず、シナリオファイル中での直前のラベル名を引き継ぎます。