Coud について


Coud とは

Coud (Code of user demand)は、Cisqua システムとレイヤオブジェクトを用いて実践的なゲームを作成した例です。 Coud は、一般的な ADV ゲームを作成するためのスクリプトエンジンです。 テキストからソースを読み込み、内部で構文を解析して実行することができます。

Coud は [ ] で囲まれた単純なタグ形式の命令と、文書だけでゲームを作成することができます。 本バージョンでは、変数システムがなくレイヤの管理も数値によるインデックス管理で直感的ではないなどの問題がありますが、これらの問題は将来解決される予定です。

Coud を起動するには、setup.ini の [INIT] セクションで SCRIPTER_MOD に coud.dll を指定し、SCRIPTER_CMD に入力するソースファイルを指定します。


ソースを書く

Coud のソースコードはテキストで表現され、拡張子に制限はありません。 デバッグ時は txt などでよいでしょう。

Coud はタグ式 [ ] に囲まれた中に命令を書く単純な仕様です。 [ ] 以外の場所に文字を書いた場合は、ADV のメッセージウィンドウに表示するメッセージであると解釈されます。 次のようなソースコードを作成してみましょう。

達郎さんの報告を聞いて、ようやく自分たちの置かれている状況に気づき始めた。
何とかなるだろうという雰囲気は徐々に失われ、重い空気に変わる。

「それじゃぁ、私たちは村から出られないってこと!?」
「少なくとも陸路では無理ということになりますね」
「ほな、早う警察に電話してヘリでもなんでも飛ばしてもらえばええやんか」
「電話が通じません。この辺は携帯電話の電波もありませんし…」
せやなぁ、と島田さんはわかりやすく肩を落とすしぐさをして見せた。

このテキストをソースとして Coud を実行するには cisqua.dll 及び cc.exe が配置されているフォルダにある setup.ini ファイルを書き換えなければなりません。 ソースファイルの名前が test.txt だと仮定した場合、次のように書き換えてください。

[INIT]
TITLE=Cisquaの紹介
MAXFPS=60
WIDTH=640
HEIGHT=480
FULLSCR=0

SCRIPTER_MOD=coud.dll
SCRIPTER_CMD=test.txt

[SAVE]
COUNT=5
PATH=sav
NAME=s

[FONT]
NAME=MS Pゴシック
SIZE=25

SCRIPTER_CMD の値に、入力するソースファイルのパスを指定します。 実行ファイルに対して相対パスでもかまいませんが、他のドライブにあるソースなどを指定する場合などは絶対パスを指定してもかまいません。

実行すると、ソースに書いた文章がメッセージとして表示されることがわかります。 しかし、この状態ではメッセージ以外の情報は与えていないので、メッセージが淡々と表示されるだけです。 クリック待ちなどもなく、背景などのイメージが表示されることもありません。

イメージを表示したり、クリックを待ったり、背景の色を変えるなどの動作を実現するには [ ] で囲まれたタグ式で指示を与えなければなりません。 Coud はソーステキストの先頭から順に解析され、[ ] が出てくる順番で要求を実行してくれます。

クリックを待つには [l] を、改ページには [p] を指定します。 例えば、次のソースコードを実行してください。

達郎さんの報告を聞いて、ようやく自分たちの置かれている状況に気づき始めた。
[l]
何とかなるだろうという雰囲気は徐々に失われ、重い空気に変わる。

[l]
「それじゃぁ、私たちは村から出られないってこと!?」
[l]
「少なくとも陸路では無理ということになりますね」
[l]
「ほな、早う警察に電話してヘリでもなんでも飛ばしてもらえばええやんか」
[l]
「電話が通じません。この辺は携帯電話の電波もありませんし…」
[l]
せやなぁ、と島田さんはわかりやすく肩を落とすしぐさをして見せた。
[l][p]

「奇妙だとは思わないか…」
達郎さんが、誰にということもなく問う。
[l]
「野鳥や家畜が次々に死ぬことが十分に奇妙であることはみんな承知よ」
[l]
「そうじゃない、電話が通じなくなったのも、山道が土砂で埋まってしまったのも、お役所にこの事態を報告してからだ。
俺にはどうしても、人為的なものに思えてならない。」

[l]
つまり、俺たちが誰かの意思で閉じ込められているのではないかということだ。
[l]
皆もその可能性を疑っていたのか、誰も達郎さんの仮説に驚く様子はなかった。

[l] タグの部分まで Coud が実行されると、その時点でメッセージの表示は中断されユーザーのクリックを待ちます。 また、[p] タグが実行されると改ページされ、画面上のメッセージがクリアされます。

Coud のタグは大文字と小文字を区別しないので [L] や [P] と書いても同じです。 ただし、タグは小文字だけを使うべきであり、複数の単語からなる長い名前のタグのみ次の単語の頭だけを大文字にすることが推奨されます。 例えば createLayer や deleteLayer という書き方が好まれます。


引数つきのタグ

これまでの [l] タグと [p] タグは、単純に [ ] 中にタグ名を記述するだけでした。 しかし、タグの多くは何らかのパラメータを必要とするものがあります。 このパラメータを引数と呼び、次のように記述します。

[タグ名 引数1, 引数2, ...]

タグ名と最初の引数の間には一つ以上の半角スペースが必要になります。 それ以降の引数とはカンマ , で区切らなければなりません。

例えば、文字色を決定する [color] タグは引数に色を表す数値を指定しなければなりません。 Coud は 0x で始まる数値を 16 進数として認識できるため、通常は 0xRRGGBB 形式で指定します。

[color 0xFF0000]
今夜 12時 誰かが 氏ぬ

このように指定すれば、文字は赤く表示されるでしょう。

文字が赤く表示されていることを確認することができます。 このほかに、[font] タグでフォントを変更したり、[delay] タグでテキストの流れるスピードを変更することができます。


画像を表示させる

Coud が実行されたときは、ルートレイヤ上に、背景用レイヤ 0 番とメッセージレイヤ 1 番が表示されてます。 レイヤはそれぞれインデックスで管理されて、新しいレイヤは最も数の大きいインデックスに追加されていきます。

1 番のメッセージレイヤは通常のレイヤとほぼ同じ機能を持っていますが、テキストを表示する専用のレイヤです。 そのため、通常は背景用レイヤの 0 番にイメージを表示することになるでしょう。

イメージを表示するには、[image] タグを用いてディスクから BMP 形式のファイルを読み込みます。 現バージョンでは BMP 形式のファイルしか対応しておりません。

[image 0, "test.bmp" , 10 , 20]

この場合、0 番レイヤに対して "test.bmp" というパスにあるイメージファイルを X 座標 10、Y 座標 20 から描画する、という意味になります。 ファイルパスは文字列として指定しなければなりません。 Coud では、文字列は二重引用符 " で囲まなければなりません。

[image 0, "000.bmp", 0 , 0]
深い眠りから徐々に意識を取り戻し、重いまぶたをこじ開けた。
[l]
体中が痛むのを堪えて上半身を起こし辺りを見回すと、ここは海岸のようである。
[l]
あたりに人気はなく、船や民家なども見当たらなかった。

この例のように、image タグを用いれば、ディスク上のビットマップファイルを画面に表示することができるようになります。 将来のバージョンでは、ユーザーが直接画像を開いてしまわないように、独自形式の暗号化されたアーカイブ機能を提供する可能性があります。


ラベルとジャンプ

Coud はソースコードの最上部から順番に下に向かって解析されます。 実行順序もこれに従いますが、[label] タグと [goto] タグを用いることで、この順序を制御することができます。

goto タグは label タグでマーキングした名前の場所まで移動するタグです。 例えば、ソースコードのどこかに [label "test1"] を記述していれば、[goto "test1"] を実行した時点で Coud は実行位置を [label "test1"] の次のタグに移動します。

Coud はソースコードの最上部から下に向かって順番に実行されます。
[l]
しかし、label タグと goto タグを用いれば、流れを制御することができます。
[l][p]
[goto "test2"]

[label "test1"]
test1 に移動しました。
[end]	;end タグで終了させる

[label "test2"]
test2 に移動しました。
[goto "test1"]

[label] タグは解析時にソースコードの位置を記録するためのもので、実行時に何らかの動作を行うものではありません。 実行時はスルーされることに注意が必要です。

上記のコードの [label "test1"] の直後の [end] タグは、その地点でコードの実行を終了するというものです。 これがない場合、[label "test2"] はスルーされてそのまま "test2 に移動しました。" が再び実行されてしまうことになります。


レイヤを制御する

Coud は実行時に、ルートレイヤに対して背景用レイヤ 0 番とメッセージレイヤ 1 番をデフォルトで保有しています。 Coud では、レイヤが必要になれば新しく作成して追加したり、不要になったレイヤを削除することができます。

新しいレイヤを作成するには [createLayer] タグを、既存のレイヤを削除するには [deleteLayer] タグを用います。 [createLayer] タグはレイヤのサイズだけを指定する場合と、レイヤオブジェクトを作成するモジュールパスを指定する 2 通りの指定方法があります。

[createLayer 640 , 480]
[createLayer "moduleName", 640 , 480]

上のサイズだけを指定しているタグは、システムデフォルトのレイヤモジュールを呼び出します。 cisqua.dll は、単純なビットマップレイヤを生成するコードを内蔵しているため、通常はこれが呼び出されます。

下の "moduleName" を指定した場合は、そのパスに存在する dll からレイヤオブジェクトを生成する関数を検索して実行します。 Coud では、メッセージを表示する専用のレイヤオブジェクトを MessageLayer.dll から生成しなければなりません。

既存のレイヤは、pos で位置を、visible で可視性を、opaque で不透明度を制御することができます。

[deleteLayer 1] ;メッセージレイヤを削除

[createLayer 200 , 200]
[createLayer 300 , 300]

[cls 0, 0xFFFFFF]
[cls 1, 0xFF0000]
[cls 2, 0x0000FF]
 
[pos 1 , 0 , 300 , 150]
[pos 2 , 0 , 50 , 30]

このサンプルでは、既存のメッセージ用レイヤを削除し、新しいレイヤを 2 つ作成しています。 イメージの青と赤の矩形が、それぞれ独立したレイヤオブジェクトです。 新しく作成されたレイヤは常に黒色で初期化されています。


変数を使う

変数を使えば、データを一時的に保存し、後からそのデータを参照することができます。 変数の内容は必要に応じて更新することができるため、より柔軟なスクリプトを記述することができるようになるでしょう。

Cisqua for Learning Edition では、変数は数値型のみ扱うことができます。 文字列を保存することはできません。 変数は [var] タグで宣言すると同時に初期化します。 [var] タグで宣言した変数名がすでに既存のものであれば、新しい値で上書きします。

[var x , 100]
[var y , 25]
[var color , 0xFFFFFF]

[cls 0 , color]
[image 0 , "fore.bmp" , x , y]

[var x , 300]
[image 0 , "fore.bmp" , x , y]

このコードは、[var] タグによって x、y、color という変数を宣言しています。 これらの変数は、[var] タグで宣言した以降、自由に利用することができます。 x に 100、y に 25 が格納されている状態で [image 0 , "fore.bmp" , x , y] と記述した場合、これは実行時に x と y に格納されているデータに変換されて [image 0 , "fore.bmp" , 100 , 25] と解釈されます。

不要になった変数は [free] タグで解放することができます。 free タグで解放された変数はメモリ空間から削除されます。 レイヤオブジェクトなどに比べれば変数が確保するメモリ領域はわずかなものですが、不要になった変数は削除するべきです。