スクリプトシステムとは

 まずはこの「猫の手」スクリプトシステムがどういうものなのかを見てみます

sample00 変数を定義して演算、結果を表示

最初のサンプル sample00 を実行するには sample/sample/exec00.bat を実行します
 sam00_00.png
 ↑は分かりやすくエラー表示処理などは省略しています

このバッチはサンプルスクリプト sample00.mlc
 sam00_01.png
をスクリプトコンパイルして sample00.bin を作成し、解析サンプル analyzer.exe に渡して実行します。



実行結果
 

PRINT の後に 5 という結果が出力されました


実行結果はスクリプトに指定してある
  変数a に 2
  変数b に 3
を代入して
   a + b を出力
とした結果です



スクリプト実行の流れです。
  pic003.png
sample00.mlc がスクリプトソースです。拡張子は mlc ですが特に決まりはありません。
それを「猫の手」に通し、sample00.bin を作成。
analyzer.exe がそれを読んで解析し、実行しています。

sample01 if文による条件分岐


sample01.mlc
sam01_00.png
今度は値を判定して分岐する処理を試してみます。
C言語と同様のif文を使います。

sample01 を実行するには exec01.bat を実行します。
先ほどと同様に sample01.bin を作成して analyzer00.exe に渡すものです。

実行結果
sam01_02.png

変数a に 5 を代入し、if文で 5 未満だった時はそのまま、それ以外なら値を10倍して表示する、というスクリプトです。

これだけだときちんと判定されているのかどうかよく分かりませんね。
ぜひ sample01.mlc をメモ帳などで編集して値を色々変更してテストしてみてください。

 sample01.mlcを編集 -> exec01.bat を実行
の手順のみでOKです。

以下は値を 4 に変更した時の結果です。
sam01_01.png
実行結果
sam01_03.png


章締

2つのサンプルスクリプトを実行してみましたがこれだけでは
 結局これが何なの?
という感じかもしれません。

  よく分からないシステムを導入するよりC言語で直接書いたほうが早い
という意見もある事と思います。

スクリプトは簡易言語とも言われ、主に生産性を高める目的で大昔から導入されてきたものです。

例えばアドベンチャーゲーム(ADV)を作る時、最初は
 台詞1を表示するプログラム
 台詞2を表示するプログラム
 選択肢を表示するプログラム
 選択された項目にあった箇所へ処理を移行する
というプログラムを全ての場面で作っていました。

しかし、これではすぐに大変になってしまいます。

そこで文章をデータベース化するようになります。
プログラムでやらなくてはならない事はほぼ決まっていますからね。
 ID, 文章, 選択肢1, 選択肢1が選ばれた時の飛び先ID, 選択肢2, 選択肢2が選ばれた時の飛び先ID, 選択肢3, 選択肢3が選ばれた時の飛び先ID
というデータベースを作ります。
選択肢でない場面では選択肢の項目を空にしておきます。

しかし、文章表示と選択肢表示がある、という単純なシステムでも
 選択肢がある場面は全体の1割にも満たないのにデータ的には決まった容量を取っておかなくてはならず効率的ではありません。
 これにキャラクターを表示する、背景を表示する、高度な演出を入れるとなると効率化を図るためにちょっとデータ構造を捻らなくてはならず、
構造が複雑になってデータベースを使っているメリットが半減です。
※近年はマシンパワーやメモリ容量の増大で本格的なADVでないものに上記のようなデータベースを採用するタイトルは見られます。

そこで効率よく汎用性を高めるために文章を羅列したシナリオファイルをベースにしたインタープリターが採用されます。
シナリオ文章の中に決まった単語または記号を判定して特定の処理を行うというものです。
文章の中に
 *4
という記号と文字があれば次に続く文は選択肢であると解釈します。
続く 4 は選択肢4項目がその下4行にわたって記述されている事をアプリケーションに知らせています。

 ★キャラクターの名前
のように★記号はキャラクター表示の意味を持たせたりします。

そうすればどんな仕様が追加されようとも対応が可能です。
機能が多くなったり、記号では意味が分かりにくくなると命令語を解析させるようにします。
 SELECT(選択肢1, 選択肢1が選ばれた時の飛び先ラベル, 選択肢2, 選択肢2が選ばれた時の飛び先ラベル)
  CHAR(キャラクターの名前)

飛び先のラベルは
 :選択肢1が選ばれた時の飛び先ラベル
のように:の後に続く文字列をラベルと解釈させて飛び先の制御をさせます。:が先頭にあるのはインタープリターで解析するのに簡単なため

この方法は発売されている多くのタイトルで採用されています。

しかし、この方法も命令語の解析に処理負荷がかかる、命令語はデータベースで持たせるのか等の問題、命令追加の手間も大きい、などのデメリットもあります。
最大の問題は記述ミスがあっても実行してみるまで分からない事です。
複雑なフラグ分岐を持つADVでは全てのパターンを通してみないと単純ミスも検出できず、
出るはずの絵が出ないという不具合があってもシナリオを書いた人にしか分からない為発売まで気づかれなかったという例も少なくありません。

そこで命令語を単純なコードに変換するコンバータが作成されます。
記述ミスなどはコンバートの段階で発見でき、解析ルーチンの負荷も軽減されます。

条件式などのサポートしたコンバータを作成する場合は、特に判定が正しく動作するかが重要になってきます。
コンバータはスクリプトをコンバートするプログラムと解析するプログラムの両方が完成して初めて意味を成すものです。
インタープリターのデメリットは改善されますが、専用のコンバータを作成する手間を惜しんでインタープリター止まりのタイトルも少なくないのです。

あるいはシューティングゲーム(STG)の敵キャラのアルゴリズムでも同様です。
多くのSTGシステムではデータベースを採用していますが
やはり無駄なデータが増えたり、自キャラの位置によって行動パターンを変えるようなアルゴリズムはシステムに組み込まれていなくてはなりません。

ADVの複雑なパラメータの判定もSTGのアルゴリズムに応用できるはず、
基本システムを共通化して簡単にADVやSTGに流用できる汎用的なスクリプトコンバートのシステムを作れないものか
という肯定で作成されたのがスクリプトシステム「猫の手」です。

新たな命令語を簡単に追加出来、条件判定などは多くのタイトルで使用されている信頼性のあるものです。

次章ではサンプルプログラム analyzer00.exe  に命令語を追加する手順を実践します。