セーブ・ロードについて
セーブの内容
novelsphere.js コンテンツでは、セーブデータは大きく2種類に分かれます。
個別セーブデータ
[save]タグや[load]タグとともにセーブ・ロードが行われるデータです。
逆にいうと、これらのデータは[save]タグを実行しなければ保存されませんし、[load]タグを実行しなければ読み込まれることはありません。そのため、コンテンツの起動時には、これらのデータは空になっています。
個別セーブデータの内容は、具体的には以下のとおりです。
- セーブ変数("f." プレフィックスのついた変数)
- マクロ変数("mp." プレフィックスのついた変数)
- その時点の内部状態(レイヤの状態、BGM や効果音の状態など)
リアルタイムセーブデータ
その novelsphere.js コンテンツ全体で常に最新の内容が共有されるデータです。
これらのデータは、[save]タグや[load]タグによって明示的にセーブしたりロードしたりする必要はありません。
また、コンテンツの起動時には、最新のリアルタイムセーブデータが自動的に読み込まれます。
リアルタイムセーブデータの内容は、具体的には以下のとおりです。
- システム変数("sf." プレフィックスのついた変数)
個別セーブデータをセーブできる場所
novelsphere.js コンテンツでは、どの場所でも個別セーブデータをセーブできるわけではありません。
個別セーブデータをセーブできる場所については、そのコンテンツがどのセーブモードを使っているかによって異なります。セーブモードは Config.json 中で設定できますので、設定法については「Config.json リファレンス」を参照してください。
NS KAG モードの場合
Config.json でセーブモードを「NS KAG モード」に指定した場合、[save]タグを用いたセーブ自体はどの場所からでも可能ですが、セーブされる内容は、その瞬間の情報ではなく、直近の[o2_savestat]タグを通過した時点の情報となります。したがって、そのコンテンツが起動してから一度も[o2_savestat]タグが実行されていない場合、個別セーブデータのセーブは行えません。
セーブの実験スクリプトです。[p][cm]
状態を保存します。[p][cm]
[o2_savestat]
状態を保存しました。[p][cm]
セーブを行います。[p][cm]
[save place="0"]
セーブを行いました。[p][cm]
上記サンプルスクリプトでは、0番スロットにセーブを行っています。
このスクリプトを実行した上で、コンテンツの別の場所で[load place="0"]を実行した場合、ロード直後に表示されるテキストは「セーブを行いました。」ではなく、「状態を保存しました。」となります。
後述する KAG3 モードの場合には、ラベルを用いてその時点の情報を保存しますが、NS KAG モードの場合にはラベルを置いてもその時点の情報は保存されません。
KAG3 モードの場合
Config.json でセーブモードを「KAG3 モード」に指定した場合、[save]タグを用いたセーブ自体はどの場所からでも可能ですが、セーブされる内容は、その瞬間の情報ではなく、直近の見出し付きラベルを通過した時点の情報となります。したがって、そのコンテンツが起動してから一度も見出し付きラベルを通過していない場合、個別セーブデータのセーブは行えません。
セーブの実験スクリプトです。[p][cm]
ラベルを立て、状態を保存します。[p][cm]
*label1|テスト
ラベルを立て、状態を保存しました。[p][cm]
セーブを行います。[p][cm]
[save place="0"]
セーブを行いました。[p][cm]
上記サンプルスクリプトでは、0番スロットにセーブを行っています。
このスクリプトを実行した上で、コンテンツの別の場所で[load place="0"]を実行した場合、ロード直後に表示されるテキストは「セーブを行いました。」ではなく、「ラベルを立て、状態を保存しました。」となります。
KAG3 モードの場合は、[o2_savestat]タグを使って状態を保存することはできません。
上記説明の他にも NS KAG モードと KAG3 モードではセーブに関する挙動が異なりますので、以下に補足します。
NS KAG モードでは、コールスタック(その場所がサブルーチン内にある場合、それがどのサブルーチンなのかという情報)をセーブに含めますが、KAG3 モードでは含めません。
また、NS KAG モードでは、その時点までに定義されたマクロの情報をセーブに含めますが、KAG3 モードでは含めません。
セーブデータ情報の取得
novelsphere.js コンテンツからは、セーブデータをセーブしたりロードするだけでなく、付帯する情報(セーブ時点でのスナップショット画像など)を利用することができます。現時点では、環境変数を用いることで以下の3つの情報を利用できます。「環境変数リファレンス」の「ev.save オブジェクトについて」も参照してください。
見出し
そのセーブデータがセーブされた時点の見出しです。
見出しは文字列として保存されています。
見出しはラベルを使って定義することができます。「ラベルについて」も参照してください。
セーブ日時
そのセーブデータがセーブされた日時です。
日時は JavaScript の Date オブジェクトとして保存されています。
スナップショット
そのセーブデータがセーブされた瞬間の画面のスナップショットです。
ただし、[locksnapshot]タグや[unlocksnapshot]タグを使うことで、画面のスナップショットが撮られるタイミングを制御することもできます。
画像は PNG 形式で、Base64 エンコードを経て文字列として保存されています。
ノベルスフィアでのセーブの扱い
ここでは、ノベルスフィア(http://novelsphere.jp/)上で配信する novelsphere.js を制作する場合についての記述を行っています。ノベルスフィア用のコンテンツ制作以外の目的で本ドキュメントを参照している方は下記「ノベルスフィア以外でのセーブの扱い」の項目を併せてご覧ください。
ノベルスフィア用のコンテンツでは、セーブやロードを行うには、ノベルスフィアアカウントを持ち、かつそのアカウントでログインしていることが必要となります。ログインしていないプレイヤーは、セーブやロードを行うことはできませんので、再生中のコンテンツのウィンドウを閉じたり再読込したりすると、一切のセーブデータは消滅してしまいます。
そのコンテンツがノベルスフィア用のものであるか否かは「ノベルスフィアアシスタント」プラグインが読み込まれているか否かで判断されますので、ノベルスフィア用のコンテンツを制作する際には、必ずノベルスフィアアシスタントプラグインを使用してください。このプラグインは、適宜プレイヤーにログインを促したり、プレイヤーが正しくログインできているかを確認する機能を持っています。
プレイヤーがログインを行っている場合
個別セーブデータは、[save]タグを実行することにより、直近の[o2_savestat]タグ実行時点のデータ(NS KAG モードの場合)もしくは直近のラベル通過時点のデータ(KAG3 モードの場合)が、ノベルスフィアのサーバ上のそのプレイヤーのアカウントへ保存されます。
リアルタイムセーブデータは、常にノベルスフィアのサーバ上のそのプレイヤーのアカウントへ保存されます。
プレイヤーがログインを行っていない場合
プレイヤーがログインを行っていない状態で[save]タグや[load]タグが実行された際には、エラーとなりコンテンツの再生が停止します。
これを避けるため、ノベルスフィアアシスタントプラグインを読み込むと使用できる[ns_checklogin]タグが存在します。このタグは、プレイヤーがログインしている時に実行されても何も起こりませんが、プレイヤーがログインしていない時に実行されると、ログインを促すウィンドウが表示され、プレイヤーにその場でログインをするよう促します。ログインに成功した後は、[save]タグや[load]タグが実行できるようになり、個別セーブデータおよびリアルタイムセーブデータが、ノベルスフィアのサーバ上のそのプレイヤーのアカウントへ保存されるようになります。
したがって、[save]タグや[load]タグを使う前はもちろん、セーブデータの内容によってコンテンツの挙動を変える必要のある部分に達する前に、あらかじめ[ns_checklogin]タグを実行するようにしてください。
なお、[ns_checklogin]タグや、ノベルスフィアアシスタントプラグインの詳細については「プラグインリファレンス」を参照してください。
上記の記述の通り、[ns_checklogin]タグより後の部分は、ノベルスフィアのアカウントを持ち、そのアカウントでログインしているプレイヤーしか再生できない部分となります。セーブ管理の煩雑さを避けるためにコンテンツの冒頭に[ns_checklogin]タグを置いてしまうのもひとつの方法ですが、その場合、不特定多数のプレイヤーに対し手軽にプレイしてもらえるというノベルスフィアのメリットを削ぐことにもなります。
お勧めの方法は、セーブボタンやロードボタンが押された瞬間に[ns_checklogin]タグが実行されるようにしておくことです。
ノベルスフィアでコンテンツを配信する場合、実際に配信が開始されたコンテンツについては上記のとおりに動作しますが、コンテンツの制作時にはノベルスフィアのサーバとの連携が行えないため、「ノベルスフィア以外でのセーブの扱い」に記した挙動のもとでデバッグを行って頂くことになります。
ノベルスフィア以外でのセーブの扱い
ここでは、novelsphere.js コンテンツをノベルスフィア以外のサーバから配信する場合についての記述を行っています。ノベルスフィア用のコンテンツを制作する目的で本ドキュメントを参照している方は上記「ノベルスフィアでのセーブの扱い」の項目をご覧ください。
また、ノベルスフィアデベロッパープログラムから入手した novelsphere.js SDK を用いて、ノベルスフィア以外のサーバから配信するコンテンツを制作することは、ライセンス上できませんのでご注意ください。
ノベルスフィア以外で配信される novelsphere.js コンテンツでは、セーブデータは全てブラウザの LocalStorage 上へ保存されます。
ただし、[o2_request]タグなどを使うことで、GET リクエストまたは POST リクエストを用いて、任意のサーバへ任意のデータを送信することは可能です。こちらの方法を利用する場合、詳しい方法についてはお問い合わせください。