筆者: RayDunakin@aol.com
World Builderは最初1986年に発売されました。二、三年後に発売は中止され、このプログラムは数年間絶版状態で入手不可能でした。1995年8月7日になって、World Builderの創造者であるBill Appletonはこれをパブリック・ドメインにしました。私がこれらのファイルと一緒に送ったバージョンは32ビットに対応すべく私の手によって変換されたものです。つまり、これはどんなマックでも動くということで、あなたがこれで作ったゲームも同様でしょう。ただし、サウンドを担当するハードウェアの変化のために、サウンド機能はAVマックとPowerMacでは働きません。
このファイルはWorld Builderアプリケーション、World Template、Sound Converterそしてサンプルのsound libraryを含んでいます。私はみなさんがWBを十分に使うのに役立つテキストファイルもいくつか書いておきました。これらのファイルを配布するときは、それらを一まとめにしてください。
-------------------------------------------------------
World Builderを使ってゲーム作りを始めるには、初めにWorld Templateを複製して、その名前を変えてください。それからWorld Builderでそれを開いてください。場面、キャラクタ、オブジェクトの作成・編集はボタンを使ってします。サウンドはsound libraryから一度に一つコピーでき、それをゲームのサウンドファイルにペーストします。または、ゲームごとに分かれたsound libraryを作ることもできます。World Dataでsound libraryの名前を入力するだけです。
MacRecorderその他の録音機器を使って独自のサウンドを作ることもできます。SoundEdit形式で保存し、それをSound ConverterでWBサウンド形式に変換してください。
オブジェクトには動かせるものと動かせないものがあります。動かせないオブジェクトでクリックできるオブジェクト、簡単なアニメーションなどを作成できます。それらはシーン/グローバルコード通りにしか動かすことができません。動かせるオブジェクトはプレーヤーがその上でクリックするだけで取ることができ、自動的にプレーヤーの持ち物になるものです。
キャラクタは(プレーヤーキャラクタを除いて)コンピュータが制御します。キャラクタの行動に影響を与えるためにキャラクタデータのいろいろなデータを調節することができます。しかし、進歩的なゲームとすれば、オブジェクトを使ってキャラクタを表現し、シーンコードを書いて彼らの行動とせりふを制御したほうがいいでしょう。
シーンデータによって各場面でどの方向が行き止まりでどちらが開けているかを決められます。追加すべき動きはシーンコードに書けます。シーンコードは、それがグローバルコードによって扱われていない限り、あるシーンでの行動を制御できます。
シーンを一つ作って、テキストウインドウのサイズを、高さがシーンウインドウと同じになるように調節してみてください。あなたはシーンウインドウの縁に触れるようにテキストウインドウを少し広げようと思われるかもしれません。そうすればテキストの領域が増えてすっきりした見かけにもなるでしょう。そのシーンをコピーし、空のシーンを望むだけ複写してください。この後は、あなたのゲームの標準のウインドウズサイズを保持しつつ、各シーン用の描画、テキスト、プログラミングを行えます。
World Builderで他のWorld Builderゲームを開いて、それがどう動くのかコードを確認することもできます。私は"A Mess O'Trouble"のコードを学ぶことを強く勧めます。それが現時点で最もきれいで進んだコードだからです。さらに、私はみなさんがシーンコード全体を一歩一歩進めるようWBプログラミングについて論じたテキストファイルを複数同封しました。そしてアドベンチャーゲームのデザインと記述の創作過程を扱った一対のファイルもあります。
WBプログラミングとアドベンチャーゲームの作成についてのより詳しい情報はシェアウェア・レビューの中の私のコラムをご覧ください。
-----------------------------------------------------------
WB プログラミング・コード
テキスト変数:
CLICK$=(オブジェクトまたはプレーヤーがクリックした登場人物の名前)
TEXT$=(プレーヤーがタイプした、またはコマンドメニューから選んだコマンド)
-----------------------------------------------------------
数値変数:
LOOP# (その場面でプレーヤーが与えたコマンドの数)
RANDOM# (1と100の間で無作為に決まる数)
VICTORY# (殺された登場人物の数)
VISITS# (プレーヤーが訪れたシーンの数。繰り返し訪れた分を含む)
PHYS.ACC.BAS# (プレーヤーの元々の体の具合)
PHYS.ACC.CUR# (プレーヤーの現在の体の具合)
PHYS.ARM.BAS# (プレーヤーの元々の体の防御力)
PHYS.ARM.CUR# (プレーヤーの現在の体の防御力)
PHYS.HIT.BAS# (プレーヤーの元々の体のヒットポイント)
PHYS.HIT.CUR# (プレーヤーの現在の体のヒットポイント)
PHYS.SPE.BAS# (プレーヤーが元々持つ体の速さ)
PHYS.SPE.CUR# (プレーヤーが現在持つ体の速さ)
PHYS.STR.BAS# (プレーヤーの元々の体の強さ)
PHYS.STR.CUR# (プレーヤーの現在の体の強さ)
SPIR.ACC.BAS# (プレーヤーの元々の精神的確かさ)
SPIR.ACC.CUR# (プレーヤーの現在の精神的確かさ)
SPIR.ARM.BAS# (プレーヤーの元々の精神的防御力)
SPIR.ARM.CUR# (プレーヤーの現在の精神的防御力)
SPIR.HIT.BAS# (プレーヤーの元々の精神的ヒットポイント)
SPIR.HIT.CUR# (プレーヤーの現在の精神的ヒットポイント)
SPIR.SPE.BAS# (プレーヤーの元々の精神的速さ)
SPIR.SPE.CUR# (プレーヤーの現在の精神的速さ)
SPIR.STR.BAS# (プレーヤーの元々の精神的強さ)
SPIR.STR.CUR# (プレーヤーの現在の精神的強さ)
-----------------------------------------------------------
ワールド変数:
PLAYER@ (プレーヤーキャラクタ)
MONSTER@ (いる場合、現在のシーンのプレーヤー以外の人物)
RANDOMCHR@ (不作為に選ばれる人物) <これは使い道がない
RANDOMOBJ@ (不作為に選ばれるオブジェクト) <これも非常に使い道がない
RANDOMSCN@ (不作為に選ばれるシーン) <これによりプレーヤーを不特定のシーンに移動させられる。
STORAGE@ (使用されないときはオブジェクトと人物が格納されている見えない部屋のようなところ。プレーヤーを死なせたり、ゲームを終わらせたりするときはプレーヤーをSTORAGE@に移す。)
-----------------------------------------------------------
条件文:
IF/THENを使った記述で何が起こるのか、どんな反応があるのか決定できます。次のように記述します:
IF{TEXT$=UP}OR{TEXT$=CLIMB}THEN
MOVE{PLAYER@}TO{UPPER ROOM}
EXIT
次のように複数の文章を入れ子にすることもできます:
IF{TEXT$=UP}OR{TEXT$=CLIMB}THEN
IF{CLIFF.ROPE=SCENE@}THEN
MOVE{PLAYER@}TO{LEDGE}
EXIT
PRINT{The cliff is too steep to climb.}
EXIT
-----------------------------------------------------------
プレーヤーがコマンドを打ち込んだりマウスをクリックしたりするたびに、プログラムは行わなければいけないものがなにかないかとシーンコードを物色します。満たされる条件文に出会えば、コードのその部分で必要とされることをなんでもします。各構文はEXITかENDが後ろになければいけません。ENDはこの特定の文が終わること、しかし、実行されるべき他のことがないかどうか確かめるためにプログラムがシーンコードの残りを続行することを許すことを示します。シーンコードを一通り見た後、それまでにEXITによって停止されていなければ、プログラムはグローバルコードで調べを続け、実行されなければいけない他の条件を検査します。
次の例のように、必要なところではどこでもEXITかENDを使えます:
IF{TEXT$=UP}OR{TEXT$=CLIMB}THEN
IF{SECRET.LADDER=SCENE@}THEN
MOVE{PLAYER@}TO{HIDEOUT}
EXIT
END
この例では、プレーヤーが上に上がろうとしたときに秘密の梯子がすでに見つけられていないと、プログラムはこの文を無視してグローバルコードへ進みます。グローバルコードで標準的な反応を記述します。
IF{TEXT$=UP}OR{TEXT$=CLIMB}THEN
PRINT{You can't go up here.}
EXIT
-----------------------------------------------------------
ANDやORで複数の条件を一文の中で結合できることに注意してください。ただし、同一の文中でANDとORの両方を使うことはできません。例えば次のようにはできます:
IF{TEXT$=SHOOT}AND{PISTOL=PLAYER@}THEN
IF{THING.1=SCENE@}OR{THING.2=SCENE@}THEN
SOUND{GUNSHOT}
PRINT{Your bullets bounce off the creature without harming it!}
EXIT
END
しかし次のようにはできません:
IF{TEXT$=SHOOT}AND{PISTOL=PLAYER@}OR{TOMMYGUN=PLAYER@}THEN
-----------------------------------------------------------
上のいくつかの例において、テキストウインドウにテキストを表示させる方法を理解できます。サウンドを鳴らしたり人物やオブジェクトを移動させたりするのも同じように扱われます:
SOUND{BOOM.1} ("BOOM.1"は単なる例です。鳴らしたいサウンドの名前を自由に記入できます。)
MOVE{OPENDOOR.1}TO{SCENE@}
MOVE{BLANKET}TO{BEDROOM}
MOVE{GARGOYLE}TO{DUNGEON}
MOVE{PLAYER@}TO{STORAGE@}
-----------------------------------------------------------
ユーザー変数:
ユーザー変数は234個あります。これらはプログラマがイベントなどを追跡するために使う数字です。A1からA9、B1からB9といった具合にアルファベットだけあります。自分のゲームの中でどういう変数を使っているのかしっかり把握してください! もしも誤って同じ変数を二つの異なる事柄に使ったりしたら、ゲーム中にまずいことが起きるでしょう。そして、この手の問題を突き止めて解決するのは大変な苦痛にもなりえるのです。私はみなさんが変数を管理しやすいようにプリントアウトが可能なユーザー変数表を同封しました。あなたが使う各変数の隣にメモしてください。それがなんのために使われるのか、どういうシーンで使われるのかを。
それから、B4#は不良です。これはプログラムのバグです。使ってはいけません。
-----------------------------------------------------------
変数の設定はこうします:
LET{A1#=1} (各変数はどんな数も取りえます。1は単なる例に過ぎません。)
IF/THEN構文の一部にもなります:
IF{TEXT$=DRINK}THEN
LET{W1#=95}
PRINT{The water quenches your thirst.}
EXIT
-----------------------------------------------------------
ゲームの開始時点で、すべてのユーザー変数は0ではなく、1未満になっています。ですから、プレーヤーがある行動をとったかどうか知りたいときは、コードを次のように書いてください。:
IF{M4#<1}THEN
次のようにしないでください:
IF{M4#=0}THEN
-----------------------------------------------------------
変数を設定する別の方法がいくつかあります:
LET{A1#=A1#=1} (これはカウンタです。プレーヤーがある特定の行動をするたびに増えるようこれを記述の一部にすることができます。またはそれ自身で使えば、プレーヤーがあるシーンで何をしようとポイントを増加させられます。)
LET{A1#=A1#-1} (上と同様ですが、増加ではなく減少させます)
LET{A1#=H4#} (ある変数の総計を他の変数に渡します。)
LET{A1#=B1#+B2#} (別の二つの変数の合計を代入します。)
LET{A1#=RANDOM#} (1から100までの不作為に選ばれる数を変数に入れます。)
-----------------------------------------------------------
WBプログラミングについて何か質問があれば、電子メールのRayDunakin@aol.comを通じて私と連絡がとれます。