擬似スクリプト言語の全容 | いっぺいのゲームブログ

いっぺいのゲームブログ

ゲームブログの記事に使用する画像はWebで拾ったものがメインで、グラフなどはデータを元に一部自作してます。

ようやく文字列表示や簡単な変数操作が出来るようになった、産まれたての赤ん坊のような擬似スクリプト言語。


しかし、目指したい方向性というか、全体像は何となく見えてきました。そこで今後実装したいコマンドを一覧に並べました。



全てのコマンドが実装できたら、この擬似スクリプト言語を使って本格的にゲームを実装することが可能になります。これだけあれば、コマンドベースの大抵のものは作れるはずです。


また、特殊文字もまとめました。



この特殊文字はコマンドの引数にも使えますので、スクリプトの組み立てが楽になります。特殊文字自体はグローバル関数を追加することで増やせます。


(例)rnd[10](0〜9の乱数)


既にダイスロール関数で乱数を生成できるようにしているので、この例の優先度はあまり高くないですが、頻繁に使う便利機能があれば加えたいです。


【今回の成果】

前回からの進捗です。


変数操作コマンドを改良しました。前回は「a+b」のように2項目と演算子のみのシンプルな計算式しかありませんでしたが、今回は「a=b+c」のように一行で処理できる項目数を増やしました。


改良版のサンプルスクリプトはこちら



変数の初期化と演算を同時に実行できるようにしたことで、前回の半分のステップ数で同じ結果が得られます。



また、ローカル変数にも対応しました。今後、ローカル変数はvコマンドを、グローバル変数はgコマンドを使って操作することにします。


元々コマンドと引数はカンマ区切りにしていましたが、文字列にカンマを使う頻度を考慮してパイプ区切りに変えました。この副産物として、スクリプトの可読性が少し上がりました。


【今回苦戦したこと】

スクリプトのローカル変数に対応しようとしたとき、正規表現の変換用に使っている無名関数からアクセスできないという問題にぶち当たりました。Javascriptのスコープ関連はもう少し勉強が必要ですが、複数埋め込まれる可能性のある特殊文字を変換するには正規表現が大変便利な為、無名関数からもローカル変数にアクセスできるようにしたかったのです。


対応として、実行中のスクリプトをグローバル変数に格納しておき、共通関数からローカル変数にアクセスできるようにしました。


【雑感】

改めて、正規表現の威力に驚いています。特殊文字の変換や計算式の解析に大活躍です。正規表現のお陰で多少複雑な文字列操作も短いコードで実装できています。


あと、コマンドをオブジェクト化しておいて正解でした。所謂Factoryパターンを採用したのですが、仮想マシンの心臓部分は思った以上にスッキリしています。


個々のコマンドの処理内容を各コマンドクラスに委譲することでスクリプトクラス本体はローカル変数の管理や分岐、ループ、他スクリプト呼び出しといったコアな処理に集中することができます。そして、コマンド毎に処理が分割されることで実装単位が小さくなり、バグや作り直しの影響範囲も狭まりました。


複雑なことをやろうと思ったら、一気に全部を作るのは無理です。処理を分解して少しずつ組み立てていく。これがオブジェクト指向の本領ですね。


「擬似スクリプト言語を実行する仮想マシンをJavascriptで実装する」という試みも、初めは途方もない作業のように思えましたが、一歩一歩進めるうちに何となく形が見えてきました。


まだまだ先は長いですが、夢は膨らみます。