スクリプトを動かす
しばらく更新しませんでしたが、身動きとれなくて、ちょっと前に実験できるところまで一気に作りました。
スクリプトエンジンについて、基礎がだいぶできたので、試しに動かしています。以下の画像は、大きい画像へのリンクになっています。
スクリプトのソースコードは以下です。これはメッセージテキストを変えただけです。従来のメッセージファイルは、内部的にメッセージ表示命令に置き換えられて、従来どおり動きます。ギャルに喋らせたい人や、剣でぼったくりたい人だけ、スクリプトを挿入すればいいということで。ベタテキスト行は、そのまま画面のメッセージエリアに表示されます。
実際に運用するときは、共通のセッティングスクリプトを作っておいて、各メッセージの頭でインクルードする(他のスクリプトの挿入命令を使う)と効率が良くなると思います。頭のゴチャゴチャは一行で終わらせて、あとはギャルゲーっぽい会話の打ち込みに専念しましょう、というわけです。ダブルスラッシュ「//」以降はコメントを表します。
// 改行のみの行を無視します。 #EmptyLineOff //「//」より後ろはコメント。命令や変数の大文字小文字は区別しない // メッセージ領域の大きさと行数を変えます #DefineArea 0, 10, 73, 10, 6.5, 5 // 改行ごとにクリック待ちを入れることにします #StopChar "\n" // メッセージ領域用の背景を描きます #Box 1, 7, 69, 7, 2, 0xC06060, 0xFFA0A0 // メッセージ領域の背景をグラデーションにします #BoxStyle 1, 1, 0x000000 // メッセージ背景に透過率を設定します #Visible 1, 200 // メッセージ背景を一番下の部品にします #Order 1, 0, -1 // 立ち絵を表示します #Image 2, "girl.png", 40, 100, 8 // 立ち絵をメッセージ背景の下にします #Order 2, 1, -1 // 剣を表示します #Image 3, "sword.png", 40, 100, 2 改行をオフにすると、まだ改行を挟む方法がないんです。(略) ということで、ギャルゲも作れそうですねぇ #Color 0xFFFFFF #Message "「剣でも買ってくださいね! " #Color 0x80FF80 #Message "5000000円" #Color 0xFFFFFF #Message "くらいで!!」\n"
それにしても……、マジックナンバー(他のプログラマに意味が通じない値)だらけです。命令の引数がどんな意味を持つか、マニュアルが必要になるのはもちろんですが、あと簡単な#define機能も作りますが、はたしてシナリオ作者各位がこれを使う気になるものやら。エラーチェックは弱いし、デバッガはないし、速度は遅いしで、大規模なプログラムは作りにくいです。ハデハデなゲームを作ろうとか野望を抱かないでくだせぇ。
あと、ウィンドウに表示されている文章が変なのは気にしないで下さい。
主旨は、行単位で単純な命令を並べていくやり方ということで、それなりにシンプルなつもりです。全体的な規則はそれなりにプログラミング言語してますので、細かく使うためには、それなりに理解が必要になります。ifとかwhileとか、計算式とかですね。演算子や変数については、C言語やJavaに似ています。
決定的な違いは、スクリプトが非構造化のルールにあるので、ローカル変数や関数定義という概念がないことです。実は、作ってあった元のスクリプトシステムにはあるんですが、たぶんテキストゲームには合わないコーディングスタイルになると思って、わざわざ非構造化してしまいました。だから行単位で行頭から命令を書きます。
とにかくセミコロンや関数呼び出しのカッコ、タブによるインデントなどは、小説っぽく書くテキストファイルにとって阻害になると感じます。他にもスクリプトエンジンの候補はあったんですが、どれもプログラマのことは考えていてもキーパンチャーのことは考えていないのがオチで。結局、オリジナルという形でまとまりそうです。オリジナルについても、なんせ一人が勢いで作り込んでいますので、出来の善し悪しは分かりません。(編集ツールの側で、私がイベント入力画面を作るよりは時間短縮になっていると思います)
がんばって#if(条件)移動先ラベルしましょうというわけですね。大規模プログラミングは無理ですが、小さなゲームブックの連続でシナリオを作っていこうというスタンスです。
……で、どの段階で実用化するかというと、まだはっきりしていません。迷路イベントの中で、例に挙げた水準で文章や画像を表示するくらいのことは、近いうちにできると思います。
女の子の画像は以下より使わせていただいています。