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

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

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

以前にNIFを閲覧するためのModを作成しました。
rrryutaro.hatenablog.com

この画面の樽や床は全て自動生成したもので、元となるデータはフォルダとファイルの情報のみです。
f:id:rrryutaro:20170325224731p:plain

そこで、これを利用してちょっとしたダンジョンなら自動生成できるだろうと思い立ち、ダンジョン生成のプログラムを製作することにしました。
といっても、前に少し作りこんでいましたので、これも製作を再開といった所です。

ダンジョンの構成を1から考えて作るのは大変なので、ウィザードリィ #1のマップを利用することにします。
次のような仕様としました。

ダンジョン生成プログラムの基本仕様

  • 固定サイズの床などを組み合わせる形とする
  • マップは床や壁の配置を指定したcsv形式のファイルを読込むものとする
    • 行がY方向、列がZ方向
    • 壁を配置する方位をbit位置で 北:1 東:2 南:4 西:8 とし、合算した値の数字を設定する
    • 床壁情報、扉情報、敵情報、その他の情報とそれぞれにcsvを分ける
    • 敵情報とその他の情報は配置時の向きとする
  • その他の情報は別途xml形式で何を配置するかの詳細情報を記載する

マップの作成

表計算ソフトを利用して、セルを方眼にして罫線で壁を書き、床壁情報を書き込みます。
f:id:rrryutaro:20170325230436p:plain

扉情報はこんな感じ。
f:id:rrryutaro:20170325230534p:plain

敵情報はこんな感じ。
f:id:rrryutaro:20170325230629p:plain

あらかじめCKでCell情報や、最初の入り口などは作成しておき、これをプログラムから読込み追加情報を書き出して、CKで読込むとこんな感じになります。
f:id:rrryutaro:20170325230936p:plain

一部見えていない壁などは、床や壁に利用している素材が表面部分しか描画が無いためこのように見えます。
このため、ゲーム上で裏側からだと進入できて表面は壁として機能します。
逆にこれを利用して、一見通路のように見えるのに、通過すると壁になるという、ウィザードリィらしいトラップが実現できます。

ゲーム上から見るとこのような感じです。
f:id:rrryutaro:20170325231304p:plain

なお、ナビメッシュはCKで生成するようにしています。

現在実現できていること、出来るだろうけどまだやっていないこと、たぶん実現できないこと

PS4版基準でModを製作していますので、ウィザードリィらしくしたくてもできないこともあります。

現在できていること

  • 床・壁の配置
  • 扉の配置
  • 上下フロアへの移動手段
  • モンスターの配置(普通に配置しているのでダンジョンに入った瞬間全員動き出す)
  • 宝箱の配置
  • 一方通行の壁(床の裏面を通路にして、通り過ぎると表面が壁となるので)
  • ワープ(単純にMoveToできるスクリプト"DA16DreamwarpTriggerScript"を利用)
  • ダークゾーン(ライトを全て真っ暗にしたCellを作成してそこへワープさせる)

出来るだろうけどまだやっていないこと

  • エレベーターの配置
  • シュー
  • メッセージ表示
  • ダメージ系のトラップ類
  • 各種クエスト

タブンできないこと

  • 隠し扉
  • 一方通行の扉
  • 完全なダークゾーン
  • 呪文などを使えなくするゾーン
  • ランダムワープ
  • 回転床(近いことは出来るが、仕組み的にランダムワープと同じなので)

現在B3まで作っています。さすがにB10まで作るのは結構大変なので、調整してそこそこ動きそうなら公開してみようかと思います。

これまでの失敗について

次のようなことがありました。

  • NavMeshを配置してもPS4で動作しない
  • 壁などがCKで見るとちゃんと表示されるのにゲーム上で表示されない
  • ワープされる位置が指定と異なる

原因は、espファイルを出力しては読込んでを繰り返していたためか、セーブデータにゴミデータが出来上がっていたようです。
Mod導入前のセーブデータから実行したらちゃんと表示されました。


以上