【カレッジ】スクリプトゼミ #10「フラグ変数」

そろそろプログラミングらしきことに近づいてきました。今回はフラグを格納する変数についてです。

【10-1】フラグ変数とは

キャラフレのスクリプトでは、汎用的な変数は実装しておらず、変数的な扱いができるものとして、フラグを格納するための配列のみ用意しています。これはキャラフレ開発以前に、コンシューマーゲーム機版のスクリプトエンジンを開発していたことの名残なのですが、ストーリーで必要なフラグを特定の配列に格納し、そのままごっそりメモリーカードにセーブ/メモリーカードからロードしてしまった方が、シンプルでバグを生みにくいからという理由です。
PCゲームやオンラインゲームでは、変数使用の制約は殆どないのですが、セーブ/ロード先をデータベースのフィールドにする場合は、無尽蔵に使うよりもメモリーカードのように決まった領域に納めていく方が自然です。
そのような理由で、汎用プログラミング言語のように、自由に名前をつけて使えるような変数は実装していません。

【10-2】lf[] (local frag)

その場限りで有効な使い捨てできる変数領域として、lf[]という配列が使えます。配列数には特に制限をかけておりませんので、処理系依存です。
一応、整数値を格納する設計なのですが、JavaScriptによる実装のため文字列も格納できてしまいます。
使う人がわかっていれば構わないことではありますが、特別な理由がない場合は数値を格納する場所として利用してください。

コマンド
lf[配列番号]=数値

記述例
lf[0]=10
lf[1]=20

lf[]の値は、スクリプトの終了タイミングで破棄されます。値を保存したい場合は後述するsf[]配列変数を使ってください。
実は、もう一つ値を保存する方法としてglobal fragというものもありますが、運営が利用するフラグを上書きされる可能性に配慮して、一般公開はしておりません。使用方法もここには書かないでおきます。

【10-3】ls[] (local string)

文字列を格納する用途の配列変数です。10-1で申し上げたとおり、lfとlsの使い分けはシステム上意味がないのですが、スクリプト言語記述のお作法として文字列専用としての使い分けをお薦めします。

コマンド
ls[配列番号]=文字列

記述例
ls[0]=翔愛学園
ls[1]=2017翔愛祭

【10-4】sf[] (quest flag)

Quest領域と呼ばれる、個人のストーリー用セーブロード領域に保存することのできる変数です。
Quest領域を使うには、スクリプトと対応するクエストを設置する必要があります。カレッジで編集室申請時にsf[]変数を利用したいと伝えれば用意してくれると思います。
※sf変数の文字列扱いに不備があることがわかりました。仕様から削除させて頂きますこと、お詫び申し上げます。

コマンド
sf[配列番号]=数値
sf[配列番号]=文字列

記述例
sf[0]=10
sf[1]=2017翔愛祭

クエストとスクリプトが1対1で対応し、プレイボタンからの実行で オートロード/オートセーブされる使い方と、明示的にコマンドでロード/セーブをするやり方があります。
スクリプト間でデータを共有したい場合は、明示的にセーブ/ロードを使用しなければなりません。

コマンド
//クエスト使用の宣言
Quest[クエストコード].start
//sf変数のロード
Quest[クエストコード].loadsf
//sf変数のセーブ
Quest[クエストコード].savesf

記述例
//QS_001の部分は実際に割り当ててもらったクエストコードに置き換えなければ動作しません
Quest[QS_001].start
Quest[QS_001].loadsf
sf[1]=200
Quest[QS_001].savesf

注意点として、loadsfは(使っている/使っていないに関わらず)全てのsf領域をセーブデータで上書きしてしまいます。
loadsfをうっかり忘れてsavesfをしてしまうと、sf領域を0で上書きしてしまうことになりますので、スクリプトの先頭で必ずloadsfする習慣をつけましょう。
また、savesfはデータベースへの書き込みを伴いますので、それなりの負荷を伴います。重要な値を保存したらsavesfすることは必要だと思いますが、あまり頻繁に呼び出さないように記述してください。

一般的にはスクリプトの終了メニューを選んだ時に保存して、それ以外の終了の仕方(ブラウザ再読み込みなど)をした場合のフラグ消失は見る人の自己責任だと考えます。

 

 

コメントを残す

メールアドレスが公開されることはありません。

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください