プログラミング・動画編集 備忘録

プログラミングや動画編集についての備忘録です

Skyrim Mod 製作日記 - 18 - ダンジョンを自動生成する (3)

ウィザードリィ#1のマップを利用したダンジョン生成ですが、一応一通りの内容が出来たので、以前に公開したバージョンを更新し、日本語版も用意し、Nexusの方へも登録してみました。

ただ、PS4版でフォロワーの追従がうまくいかず、その点は不完全なままです。
また、出現する敵と敵の強さなどの調整が不十分なので、今後修正していきたいと思っています。

以下、このModでのポイントなど。特にPS4基準で作成している点について。

テレポートについて

※書いてみたものの、わかりづらい内容ですみません

ウィザードリィでは元々トラップの一種としてテレポートがありますが、それとは別にSkyrimウィザードリィのダンジョンを再現するのに次の手段をとっています。

  1. ダークゾーンはLightの設定を真っ暗にして、別セルとして用意し、その場所へMoveTo(テレポート)させる
  2. マップの端から端へのループはダミーの見た目を用意して、端から端の場所へMoveTo(テレポート)させる
  3. 各階への移動は、各階は別セルとして、通常のDoorでのTeleportで移動させる
  4. エレベータでの移動は、エレベータ用の部屋を用意してDoorでつないで、Teleportで移動させる

まず、ダークゾーンについてです。
通常のダンジョンは次のように設定して、ライトを設置せずに明るくさせています。
f:id:rrryutaro:20170405222430p:plain

一方ダークゾーンは次のように設定して、ライトがないと真っ暗になります。
f:id:rrryutaro:20170405222507p:plain

"Directional Ambient Lighting"とは日本語で、指向性周囲照明となるようです。
壁などを設置した際にその向きの周辺の照明ということなのでしょう。
例えば、色を赤に設定すれば赤色の照明になります。

セルへの移動は、アクティベーターを次のように作成しています。
f:id:rrryutaro:20170405222948p:plain

ここで重要なのは次の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つ目のスクリプトのみ利用していたのと、メッセージ表示に利用していたためです。
今後修正してもよいかもしれません。

プレイヤー用のスクリプトは、プログラムで生成する際に移動先のマーカーを設定するようにしています。
フォロワー用のスクリプトは次のようにプロパティ設定をしてあります。
f:id:rrryutaro:20170405223505p:plain

クエストと、クエストステージが条件として必要となるため、次のようにクエストを作ってあります。
f:id:rrryutaro:20170405223627p:plain

クエストはゲーム開始時にクエストが開始されるようにしているので、スクリプトの条件が成立します。

フォロワーはクエストの"DialogueFollower"にあるエイリアス"Follower"を参照すればよいようで、プロパティに設定しています。(※しかしながら、PS4版ではコレが有効でない?のか、フォロワーが移動しません、この辺はまだ自分が知識不足で原因がわかっていません)

このアクティベーターをセルへトリガーとして次のように配置します。
f:id:rrryutaro:20170405224526p:plain
※XMarkerHeadingに重なっている四角のトリガーはメッセージ表示に使用しているもので、別途説明します

ダークゾーン側には次のように配置します。
f:id:rrryutaro:20170405224614p:plain

トリガーに触れると、矢印の先のXMarkerHeadingへ移動します。
f:id:rrryutaro:20170405225422p:plain

マップで見ると次の部分です。
f:id:rrryutaro:20170405225909p:plain
セルを赤色で塗っている部分がダークゾーンです。それぞれの入り口にトリガーを置き、出口にマーカーを配置して、スクリプトのMoveToで移動しています。

マップの端から端への移動もこのトリガーとマーカーを配置させて移動させます。
ただし、表示領域を作らないと真っ暗な表示になるため、ダミー用の領域を作成します。
次のマップはB3階のマップです。
f:id:rrryutaro:20170405230436p:plain
セルを黄色で塗っている部分がダミー用の表示領域で、その他前の位置で、逆方向へテレポートさせます。
ただ、ドアの開閉などの状態はリンクしないため、見た目が異なるなどの難点がありますが、まぁしょうがないでしょう。
DoorをActivateした際に、別のドアを開閉するスクリプトがあれば、見た目をリンクさせることができるかもしれません。ありそうな気はしますが、今のところ探していません。

各階やエレベータについては、DoorのTeleportをそのまま利用します。
f:id:rrryutaro:20170405230850p:plain

※こちらも、PS4版だとナビメッシュでフォロワーの配置場所を作っていても、移動してこない場合があります。基本的には別のセル間への移動はできて、同一セル間の移動は出来ないようですが、別のセル間でも移動しない場合もあり、いまひとつ原因がわかっていません


とりあえず、今回はこの辺で。