12 ドアを作る


DOOMにおいては、『ドア』も実はセクターの一つに過ぎません。ドアは、「天井の高さが変化するセクター」だとも言えます。
レベルエディタによっては、ドアをある程度自動化して作ってくれるものもありますが、WadCraftでは、全てを『手動』で設定しなければなりません。煩雑ではありますが、その分DOOMのゲームの仕組みの理解を深めるのには役立つでしょう。

まずは実際に、一番単純なタイプのドアを作ってみて、その後に詳細を解説します。
では、最初にグリッドを64にして、幅がグリッド二個分、長さがグリッド六個分の細長いセクターを南北方向に作って下さい。このセクターは、いわば『廊下』になります。
次に、グリッドを8に変更します。8のグリッドは、細かくて非常に見づらいので、Iキーを押してビューを拡大させた方がいいです。
そして最初のセクターを真ん中から二つに分けるように、厚みがグリッド一つ分のドアになるセクターを作って下さい(図1)。



図1 『廊下』を仕切るドアになるセクターを作ったところ

ところで、今のようにセクターの内部を仕切るように、ドアなどのセクターを作ると、最初のセクターは『分断』されてしまいますが、それでもあくまで一つのセクターとして認識され続けます。この場合のドアの前後のセクターを別々にしたい時は、あらかじめ二つのセクターを作って、その間にドアのセクターを作るなどの配慮が必要です。

次に、ドアになるセクターを選択して、編集ダイアログボックスを呼び出します。そこで、Ceiling Heightに0を入力して下さい。これで、床と天井の高さが同じになるので、ドアは閉じられた状態になります。また、Ceiling Flatも「FLAT20」に変更して下さい。

次に、ドアの正面にあたるLinedefを選択して下さい。前後に二つありますが、最初はどちら側でも構いません。
おそらく、選択されたLinedefの法線は、現在ドアの内側を向いていると思います。今回は、このLinedefの向きを反対にして、図2のように、法線がドアの外側を向くようにします。



図2 フリップ機能を使ってLinedefを反転させたところ

それには、キーボードのFキーを押すか、または「編集(E)」メニューの中の「フリップ」を選択して下さい。
このフリップ機能は、Two-sided Linedefの方向を変えたい時に使います。

次に、このLinedefの編集ダイアログボックスを呼び出して下さい。
「Right Sidedef」側のタブのUpper Textureには、デフォルトのUpper Textureが選択されていると思います。これは、先程ドアのセクターの天井の高さを変更した時に、WadCraftが自動的に設定したものです。
まず、このテクスチャを「BIGDOOR2」に変更して下さい。
次に、ダイアログボックスの左側にある「Special」と書かれたドロップダウンリストから、上から二番目の「001 Door(L) SRm Open/Close」という項目を選択して下さい。
それが終わったら、反対側のドアの正面にあたるLinedefに対しても、全く同じ設定を行って下さい。

仕上げに、ドアの側面の部分の壁のテクスチャを設定します。
まず、ドアの側面の壁にあたるLinedefのどちらか一方を選択して、編集ダイアログボックスを呼び出して下さい。この部分の壁は、Single-sided Linedefになるので、Right SidedefのMiddle Textureを変更します。ドロップダウンリストの中から「DOORTRAK」を選択して下さい。
次に、前回説明したLinedefの属性であるLower Unpeggedにチェックを入れて下さい。
このように、ドアを作る時は必ず、側面の壁にあたるLinedefにはLower Unpeggedを適用しなければなりません。何故かと言うと、ドアが開閉するという事は、セクターの天井が上下に動く事でもあるので、Middle Textureのデフォルトであるトップダウンによるテクスチャの貼られ方だと、天井が動くと同時にテクスチャも動いて見えてしまうからです。
後は、もう片方の側面の壁にも同じ設定を行って下さい。

以上の設定が終わったら、廊下のセクターの適当な場所に「Player 1 start」を置いて、マップをプレイしてみて下さい。ドアの前でUSEボタン(通常は、スペースバーに割り当てられている)を押して、ドアが開閉出来る事も確認してみて下さい。問題が無ければ、図3のような感じになるはずです。



図3 出来上がったマップをプレイしたところ

以降ここでは、今回使ったLinedefのSpecialという属性について解説します。
LinedefのSpecial属性は、様々な種類の機能を持っており、その数も141個もあります。これらの機能を駆使するのは、DOOMのレベル作りにおいて最も奥の深い部分でもあります。
機能の大半は、ドアやリフトのようなセクターの床や天井の高さを変化させる種類のものですが、その他にも、セクターのライティングを制御するもの、テレポートやレベルのEXITの役目をするものなどがあります。

Specialが設定されたLinedefは、何らかの方法で「アクティベイト」された時に、上で言ったような機能を作動させます。
Special Linedefのアクティベイトのされ方には、次の三つのタイプがあります。
@ そのLinedefの前でUSEボタンが押された時。
A そのLinedefを(プレイヤーやモンスターが)またいだ時。
B そのLinedefを銃弾が通過した、または当たった時。
Bは、ピストルやショットガンの銃弾の事で、ロケットやプラズマなどの放射物は適用されません。しかし、パンチやチェーンソーは有効なようです。

Special Linedefの機能は、大抵任意のセクターに何らかの変化を起こさせるものです。そのため、そのLinedefと影響を受けるセクターとを関連付けなければなりません。
既に見てきたLinedefとセクターの編集ダイアログボックスには、どちらにも「Tag」という名前のフィールドがある事に気づかれたと思います。Special Linedefとセクターを結びつけるには、このTagフィールドを使います。
Tagは単なる数値(short型)で、ゲームプログラムでは、そのLinedefのTag番号と同じTag番号を持つセクターを、機能の対象になるセクターとして判断します。その同じTag番号を持つセクターが複数あった場合は、全てがその機能に従って作動します。
全てのLinedefとセクターのTagフィールドは、初期値が0になっていますが、0だからと言って設定されていない事を意味するものではないので、Special LinedefのTagを設定し忘れると、マップの中の全てのセクターが作動してしまうという事にもなりかねません。

ここで、ダイアログボックスの中の「Special」ドロップダウンリストに表示される項目の表記法について説明します。この表記法は参考文献[1]を参考にしていますが、スペースの制約で、さらに短く記述する必要があったので、全く同じものではありません。

最初の数字は、ゲームプログラムが認識するSpecial属性の識別子です。0から141までありますが、0は、何のSpecial属性も設定されていない事を意味します。

次は、DoorやLiftといった、機能の種類を表す名前が続きます。これらには、次のようなものがあります。
Door
Lift
Floor
Ceiling
Crusher
Stair
Light
Teleport
Exit
Donut
Scrolling wall

次は、Special Linedefのアクティベイトのされ方を表す記号が続きますが、これについては、ある程度確立された省略記法が存在します。英数字二文字で表現しますが、それぞれの文字には次のようなものがあります。
S  Switch
W  Walk-over
G  Gunfire
1  Once
R  Repeatable
一文字目は、S、W、Gのいずれかで、それぞれ前に述べたアクティベイトのされ方の三つのタイプの@、A、Bにあたります。二文字目は、1かRのどちらかですが、それぞれその機能を使えるのが、一度きりなのか、何度でも使えるのか、を表します。
さらにその後に、「m」が付く事がありますが、これはプレイヤーだけでなくモンスターもそのSpecial Linedefをアクティベイトさせる事が出来るという意味を表します。また、「mo(monsters only)」が付いた場合は、その機能がモンスターだけに適用される事を意味します。
一つ気をつける点は、Sタイプ、つまりUSEボタンを使うタイプのSpecial Linedefでは、そのLinedefの右側からしかアクティベイト出来ない事です。今回作ったドアで、正面にあたるLinedefをフリップさせて法線が外側を向くようにさせたのもそのためです。
Wタイプでは、どちら側からLinedefをまたいでもアクティベイトされます。ただし、テレポートだけは、右側からまたいだ時にだけ作動します。

次は必要に応じて、その機能の具体的な動作を表した語が続きますが、これについては、機能の種類ごとに説明した方がいいので、最後の個々の機能の種類についての説明の部分で解説します。

次は、もしその機能が何らかの動きを伴う機能だった場合、動作の速さに関する語が付く事があります。
その速さがノーマルスピード以外だった時に、Slow、Fast、Turboなどの語が付きます。

最後に、DoorやLiftなどといった機能の種類ごとについて、具体的な動作に関する説明をしておきます。

Door

ドアには大きく分けて、ローカルとリモートの二つのタイプがあります。通常、ドアになるセクターはTagによって指定されますが、ローカルドアの場合は、そのSpecial Linedefの左側にあるセクターがドアになると決められています。そのため、ローカルドアではTag番号を指定する必要はありません。今回作ったドアが典型的なローカルドアの例です。通常、ローカルドアの場合は、ドアの前後の正面にあたるLinedefの両方にSpecial属性を設定しますが、一方のLinedefだけ設定する事によって、片側からしか開けられないドアを作る事が容易に出来ます。ドロップダウンリスト内の表示では、Doorの文字の後に(L)と書かれている場合は、ローカルドアである事を意味します。ローカルドアは、マニュアル(Manual)ドアとも呼ばれます。
リモートドアの場合は、大抵Special Linedefはドアとは離れた場所にあり、そのLinedefはスイッチのテクスチャが貼られた壁になる事が多いです。Doorの文字の後に(L)と書かれていない場合は、全てリモートドアになります。
そのほか、Doorの文字の後に続く補助的な文字として、(R)、(B)、(Y)という文字があります。これらはそれぞれ、そのドアを開けるためには、レッドキー、ブルーキー、イエローキーが必要である事を示します。DOOMで使われるキーには、カードとスカルの二つのタイプがありますが、どちらのタイプであっても色さえ合っていれば開きます。実はゲームプログラム内では、カードとスカルの区別は無いので、どちらのタイプを使うかはレベルデザインの問題になります。
最も一般的なドアの動作は、Special Linedefがアクティベイトされると、閉じていたドアが開いて、そのまま4秒間止まった後にまた閉じる、といったものです。この場合、ドロップダウンリスト内の項目の動作を表す部分には、Open/CloseまたはOpen,Closeと表示されますが、「/」と「,」の違いは、前者の時はドアが開閉中でもアクティベイト出来るのに対して、後者の時はドアが閉じている時しかアクティベイト出来ない事です。
ドアの動作が、開いたら開いたまま、あるいは閉じたら閉じたままの場合は、単にOpenまたはCloseとだけ書かれます。
ドアが開いた時の停止する位置は、隣接するセクターの天井の高さの中で最も低い天井の高さよりも4低い位置です。

Lift

リフトも広い意味では、「床の高さが変化するセクター」の一つですが、次のような一定の動き方をするのでリフトと呼んで区別します。
リフトとなるセクターは、Special Linedefがアクティベイトされると、床の高さが最初の位置から、隣接するセクターの床の高さの中で最も低い床の高さまで下がり、そのまま3秒間止まった後、また最初の位置まで戻ります。
もし、隣接するセクターの中にリフトとなるセクターの床よりも低い床を持つものが無かった場合は、何も動きません。
Liftの文字の後に(perpetual)と書いてある場合は、上の動作を永続的に繰り返す事を意味します。このタイプのリフトには、動作を表す語としてStartまたはStopという文字が付いて、それぞれ動作の開始と停止を行います。
リフトになるセクターを作る時は、初期状態での床の高さがリフトが持ち上がっている時の高さになる事に注意して下さい。
リフトには、ドアの場合のような「ローカル」に動作するものは無いので、必ずTagを使ってセクターを指定する必要があります。

Floor/Ceiling

FloorとCeilingは、それぞれ床と天井の高さを上または下に動かす機能です。具体的にどこまで上下するかを言葉で表すと長くなるので、次のようなアルファベットの大文字一文字に、特定の意味を持たせています。
F (Floor)    床の高さ
C (Ceiling)   天井の高さ
L (Lowest)   隣接するセクターの中で一番低い
H (Highest)  隣接するセクターの中で一番高い
I (Including)  当のセクターを含めて
E (Excluding) 当のセクターを除外して
例えば、機能の種類がFloorで、「UpLEF」と書いてある時は、セクターの床の高さが、隣接するセクターの床の中で最も低い床の高さまで持ち上がるという事を意味し、「UpLIC」と書いてある時は、隣接するセクターの天井の高さ、及びそれ自身の天井の高さの中で一番低い天井の高さまで床が持ち上がるという事を意味します。
また、「Up24」のように上下する量が直接数字で指定されているものや、「DownHEF+8」や「UpLIC-8」のように指定された床や天井の高さのいくつ手前で止まるかをプラスマイナスを付けた数字で表すものもあります。
Floorの場合は、その後に(C)という文字が付く事がありますが、これはChangerと呼ばれる機能を持っている事を表します。Changerとは、セクターの床のテクスチャやSpecial属性が別なものに変わる機能を言います。この機能は説明が長くなるので、後のチュートリアルで実際に作りながら解説します。

Crusher

Crusherとは、Crushing Ceilingの事を言っています。Crushing Ceilingも天井が動くセクターの一種ですが、天井が下がってくる時に、下にいるプレイヤーやモンスターに当たるとダメージを与えるところが違います。
Crushing Ceilingの動作は、天井が最初にあった位置から床よりも8手前の位置まで下がって、また元の高さまで戻るという動きを永続的に繰り返すものです。
Crusherの項目の動作を表す語には、StartまたはStopのどちらかが書かれていて、それぞれ動作の開始と停止を行います。

Stair

DOOMのマップの中には、スイッチなどを入れると、床の一連の部分が次々に持ち上がって、階段が出来上がるものがあります。これは、Building StaircaseとかSelf-raising Staircaseなどと呼ばれますが、Stairと書かれている種類は、この機能を持ちます。
Stairもやはり「床が動くセクター」と言えますが、Stairとして指定されたセクターは、一定の条件を満たした隣接するセクターに『連鎖反応』を起こさせるという特殊な性質を持ちます。これについても、後のチュートリアルで実際に作りながら解説します。

Light

Lightは、セクターの明るさを変化させる機能の種類です。
ドロップダウンリスト内の項目の動作を表す語の部分には、次のようなものが付きます。
OnFull    Light Levelが255になる OffZero   Light Levelが0になる MatchLE  隣接するセクターの中で一番暗いセクターの明るさになる MatchHE  隣接するセクターの中で一番明るいセクターの明るさになる Blink     一秒ごとに点滅する
DOOMのマップの中には、常に明かりが点滅しているセクターがよく見られますが、それらのほとんどは次回に説明する「セクターのSpecial属性」によるものです。Special Linedefによるライティングの制御には、特定の場所を通ると、明かりが点いたり消えたりするものが多いです。

Teleport

テレポートについても、詳細は後のチュートリアルで解説します。

Exit

Exitのタイプには、通常の次のレベルに行くタイプと、シークレットレベルに行くタイプの二つがあります。DOOMUのシークレットレベルには、Level 15: Industrial Zoneでシークレットドアなどを見つけると行けるLevel 31と、さらにそのLevel 31のシークレットドアから行けるSuper Secret LevelのLevel 32があります。
シークレットレベルに行くタイプのExitを使った時に、ゲームマップがMAP15かMAP31以外だと、通常に次のレベルにしか行きません。

Donut

Donutの機能を持つものは、Special番号が9の一つしかありません。DonutもChangerの一種ですが、やや特殊なので独立しているのだと思います。
Donutの機能も、言葉で表現すると複雑になるので、ここではとりあえず実例をあげておくだけにします。



図4 E1M2のchainsaw pillar

図4は、典型的な例としてよくあげられるDOOMのE1M2で見られるDonutエフェクトです(この場所に入るには、シークレットドアを見つける必要があります)。
ドーナッツ状の『堀』の部分が持ち上がって、回りのセクターの床の高さと同じ位置で止まり、同時に床のテクスチャも変わり、プレイヤーのヘルスを奪う『毒性』も無くなります。ドーナッツの穴の部分にあたるセクターは、下に降りて来て、やはり同じ高さで止まります。

Scrolling wall

Scrolling wallも、Special番号が48の一つしかありません。このSpecial属性が設定されたLinedefは、常にテクスチャが横方向にスクロールしている壁になります。Two-sided Linedefに適用された場合、スクロールするのはRight Sidedef側のテクスチャだけのようです。
この属性も、ローカルドア及びExitと並んで、Tagの設定が必要のないタイプです。