Skyrim Mod 製作日記 - 18 - ダンジョンを自動生成する (3)
ウィザードリィ#1のマップを利用したダンジョン生成ですが、一応一通りの内容が出来たので、以前に公開したバージョンを更新し、日本語版も用意し、Nexusの方へも登録してみました。
ただ、PS4版でフォロワーの追従がうまくいかず、その点は不完全なままです。
また、出現する敵と敵の強さなどの調整が不十分なので、今後修正していきたいと思っています。
以下、このModでのポイントなど。特にPS4基準で作成している点について。
テレポートについて
※書いてみたものの、わかりづらい内容ですみません
ウィザードリィでは元々トラップの一種としてテレポートがありますが、それとは別にSkyrimでウィザードリィのダンジョンを再現するのに次の手段をとっています。
- ダークゾーンはLightの設定を真っ暗にして、別セルとして用意し、その場所へMoveTo(テレポート)させる
- マップの端から端へのループはダミーの見た目を用意して、端から端の場所へMoveTo(テレポート)させる
- 各階への移動は、各階は別セルとして、通常のDoorでのTeleportで移動させる
- エレベータでの移動は、エレベータ用の部屋を用意してDoorでつないで、Teleportで移動させる
まず、ダークゾーンについてです。
通常のダンジョンは次のように設定して、ライトを設置せずに明るくさせています。
一方ダークゾーンは次のように設定して、ライトがないと真っ暗になります。
"Directional Ambient Lighting"とは日本語で、指向性周囲照明となるようです。
壁などを設置した際にその向きの周辺の照明ということなのでしょう。
例えば、色を赤に設定すれば赤色の照明になります。
セルへの移動は、アクティベーターを次のように作成しています。
ここで重要なのは次の2つのスクリプトです。
まず1つ目。プレイヤーを移動させるのに使用します。
Scriptname DA16DreamwarpTriggerScript extends ObjectReference Conditional ObjectReference Property pDA16DreamwarpReturnMarker Auto Message Property pDA16DreamwarpMessage Auto Event OnTriggerEnter(ObjectReference akActionRef) if akActionRef == Game.GetPlayer() Game.GetPlayer().MoveTo(pDA16DreamwarpReturnMarker) pDA16DreamwarpMessage.Show() endif endEvent
続いて、2つ目はフォロワーを移動させるのに使用しています。
Scriptname C06TombEntranceCheatScript extends ObjectReference Location Property TombLoc auto ReferenceAlias Property Aela auto ReferenceAlias Property Farkas auto ReferenceAlias Property Vilkas auto ObjectReference Property AelaSpot auto ObjectReference Property FarkasSpot auto ObjectReference Property VilkasSpot auto Quest Property C06 auto Event OnTriggerEnter(ObjectReference akActivator) if (akActivator == Game.GetPlayer()) if (C06.GetStage() >= 30 && C06.GetStage() < 40) ; if (Aela.GetReference().GetCurrentLocation() != TombLoc) Aela.GetReference().MoveTo(AelaSpot) ; endif ; if (Farkas.GetReference().GetCurrentLocation() != TombLoc) Farkas.GetReference().MoveTo(FarkasSpot) ; endif ; if (Vilkas.GetReference().GetCurrentLocation() != TombLoc) Vilkas.GetReference().MoveTo(VilkasSpot) ; endif endif endif EndEvent
よくよく見ると、2つ目のスクリプトでプレイヤーもフォロワーも移動できますが、当初は1つ目のスクリプトのみ利用していたのと、メッセージ表示に利用していたためです。
今後修正してもよいかもしれません。
プレイヤー用のスクリプトは、プログラムで生成する際に移動先のマーカーを設定するようにしています。
フォロワー用のスクリプトは次のようにプロパティ設定をしてあります。
クエストと、クエストステージが条件として必要となるため、次のようにクエストを作ってあります。
クエストはゲーム開始時にクエストが開始されるようにしているので、スクリプトの条件が成立します。
フォロワーはクエストの"DialogueFollower"にあるエイリアス"Follower"を参照すればよいようで、プロパティに設定しています。(※しかしながら、PS4版ではコレが有効でない?のか、フォロワーが移動しません、この辺はまだ自分が知識不足で原因がわかっていません)
このアクティベーターをセルへトリガーとして次のように配置します。
※XMarkerHeadingに重なっている四角のトリガーはメッセージ表示に使用しているもので、別途説明します
ダークゾーン側には次のように配置します。
トリガーに触れると、矢印の先のXMarkerHeadingへ移動します。
マップで見ると次の部分です。
セルを赤色で塗っている部分がダークゾーンです。それぞれの入り口にトリガーを置き、出口にマーカーを配置して、スクリプトのMoveToで移動しています。
マップの端から端への移動もこのトリガーとマーカーを配置させて移動させます。
ただし、表示領域を作らないと真っ暗な表示になるため、ダミー用の領域を作成します。
次のマップはB3階のマップです。
セルを黄色で塗っている部分がダミー用の表示領域で、その他前の位置で、逆方向へテレポートさせます。
ただ、ドアの開閉などの状態はリンクしないため、見た目が異なるなどの難点がありますが、まぁしょうがないでしょう。
DoorをActivateした際に、別のドアを開閉するスクリプトがあれば、見た目をリンクさせることができるかもしれません。ありそうな気はしますが、今のところ探していません。
各階やエレベータについては、DoorのTeleportをそのまま利用します。
※こちらも、PS4版だとナビメッシュでフォロワーの配置場所を作っていても、移動してこない場合があります。基本的には別のセル間への移動はできて、同一セル間の移動は出来ないようですが、別のセル間でも移動しない場合もあり、いまひとつ原因がわかっていません
とりあえず、今回はこの辺で。