マップ表示とイベント処理のテストに変数と制御構文を加えて、一通りゲームシステムとして動くものにまとめてみました。
イベント内のスクリプトで使う変数は
getVar(n) : n番の変数の値を取得
setVar(n) : n番の変数に値を設定
という形で「変数番号」を指定し、値(整数)を読み書きします。
スクリプトの組み込み機能でも、選択ダイアログの選択結果を指定変数に格納するなどの形で変数を利用することになるでしょう。ゲームの中で選択結果を保存したりイベント処理の中でsetVar()で変数の値を設定することで、「以前の行動」に応じたスクリプトを実行する仕組みです。
今回のJavaScriptでは、変数をeventVars[]という配列に格納しています。とりあえず100個の変数(番号0-99)を格納することを前提にしてみました。別に1000個でも容量の問題はほとんどないと思いますが、100個もあれば十分でしょう。
変数の値をスクリプトの処理系で処理するために、「渡された文字列を数値として評価」するgetVal()を用意しました。これは、渡された文字列からgetVar()など変数の値を取得する関数や数字を識別し、数値として取得する処理になります。
// 文字列を数値評価
function getVal(arg) {
// 数字文字列ならその値を返す
if (isNum(arg)) {
return parseInt(arg, 10);
}
// 文字列をコマンドとして解析
var command = parseCommand(arg);
// 文字列がgetVar(変数の値取得)コマンドならその値を評価
if (command.code == EVENTCODE_GETVAR) {
// 変数番号を取得
var index = getVal(command.args[0]);
// 指定番号が変数番号の範囲になければ異常値
if (index == Number.NaN || index < 0 || index > VAL_MAX_INDEX) {
return Number.NaN;
}
// 変数の値を返す
return eventVars[index];
}
return Number.NaN;
}
Number.NaNは、JavaScriptで「数値でない」状態を表すための値です。
次に、この変数を利用して条件による分岐を行うif文の実装です。
if文は、条件を指定しその条件を満たす場合と満たさない場合の処理を記述する一般的な形式にしました。ただし、簡略化のため条件の指定は、演算子ではなくeq(指定された二つの引数の値が等しい時に真)、ne(指定された二つの引数の値が等しくない時に真)といった関数で行います。
たとえば、変数0が1なら処理1、1以外なら処理2を実行するなら
if(eq(getVar(0),1)) 処理1 else() 処理2 endif()
といった感じです。and、orなど複数の条件を指定することはできませんが、if文の中にさらにif文を書くこともできます(もちろん、指定条件がすべて満たされた場合に真となるand関数なども追加しようと思えばできますが、そこまでやる意味があるか……)。
if文や選択ダイアログが入って、基本的なイベントスクリプト処理の仕組みがほぼ出揃ってきました。
実行画面(下の開始ボタンで開始。Canvas対応Webブラウザが必要です)
ソース(JavaScript、UTF-8)
今回は、キャラクタに接触してイベント処理が始まると、ゲーム画面下のテキスト欄に現在のイベントで実行されているスクリプトの文字列を表示するようにしてみました。