今回は少し大きめのマップで、疑似ランダムダンジョンを作る方法をご紹介します。
疑似と言っても、完全ランダムにすると詰まってしまうのを避けるためであり、労力の割にはかなりランダムに感じる仕組みです。
サンプルプロジェクトをご用意しました。
中を参照しながら、不明な点を記事で理解を深めていただければと思います。
※以前はテンプレートプラグインを使用しない形での作成だったものを、リメイクしています。
イベント動的生成プラグインはテンプレートイベントプラグインと組み合わせたほうが使いやすいです。
こちらの記事はRPGツクールMV用です。
RPGツクールMZ用の記事もございます。
目次
サンプルプロジェクト
github.com/munokura/RPG-Tkool-MV-Sample-project-Random-Dungeon2/tree/master
使用プラグイン
テンプレートイベント(トリアコンタン様作)
triacontane.blogspot.com/2016/06/blog-post_25.html
イベント動的生成(トリアコンタン様作)
triacontane.blogspot.com/2016/08/blog-post.html
プラグインの設定
TemplateEvent
EventReSpawn
をプラグイン管理でONにします。
TemplateEventで「テンプレートマップID」を「2」に設定してください。
マップ作り
- スタートとなる地上:1個
- テンプレートイベントを入れておくマップ:1個
- ランダムダンジョンになるマップ:5個
- 最終フロアになるマップ:1個
を作ります。
スタートとなる地上マップ
ダンジョンの入口があれば、何でもありです。
テンプレートイベントを入れておくマップ
上記のプラグイン設定で、テンプレートマップを2にしているので、ID2のマップをテンプレートにします。
今回のコピーするイベントはダンジョン内に配置するので、マップのタイルセットをダンジョンに指定しましょう。
ランダムダンジョンになるマップ
好きなダンジョンのフロアマップを5つ作ってください。
マップIDが連番(3から7)になるようにしてください。
サンプルでは、ランダム生成で作成したマップを使用しています。
最終フロアになるマップ
最終フロアだと分かりやすいマップを1つ作ってください。
変数の準備
理解しやすくするために、先に変数に名前をつけておきます。
- 1:上り下り判定
- 2:階
- 3:MapId
- 4:X
- 5:Y
- 11:一時変数
コモンイベントの準備
- マップ選択
- 下り階段
- 上り階段
- フロアセット
を作ります。
マップ選択
◆変数の操作:#0003 MapId = マップID
◆ループ
◆変数の操作:#0011 一時変数 = 乱数 3..7
◆条件分岐:一時変数 ≠ MapId
◆変数の操作:#0003 MapId = 一時変数
◆ループの中断
◆
:分岐終了
◆
:以上繰り返し
下り階段
◆SEの演奏:Move1 (90, 100, 0)
◆画面のフェードアウト
◆変数の操作:#0001 上り下り判定 = 2
◆変数の操作:#0002 階 += 1
◆条件分岐:階 = 6
◆場所移動:転移の間 (10,18) (向き: 下, フェード: なし)
◆ラベルジャンプ:End
◆
:分岐終了
◆コモンイベント:マップ選択
◆場所移動:{MapId} ({X},{Y}) (向き: 下, フェード: なし)
◆コモンイベント:フロアセット
◆ラベル:End
◆画面のフェードイン
上り階段
◆SEの演奏:Move1 (90, 100, 0)
◆画面のフェードアウト
◆変数の操作:#0001 上り下り判定 = 1
◆変数の操作:#0002 階 -= 1
◆条件分岐:階 = 0
◆場所移動:地上 (8,5) (向き: 下, フェード: なし)
◆ラベルジャンプ:End
◆
:分岐終了
◆コモンイベント:マップ選択
◆場所移動:{MapId} ({X},{Y}) (向き: 下, フェード: なし)
◆コモンイベント:フロアセット
◆ラベル:End
◆画面のフェードイン
フロアセット
◆プラグインコマンド:ERS_MAKE_TEMPLATE_RANDOM 1 0 0 2 1 0
◆プラグインコマンド:ERS_MAKE_TEMPLATE_RANDOM 2 0 0 2 1 0
◆条件分岐:上り下り判定 = 1
◆変数の操作:#0004 X = $gameMap.event(1).x;
◆変数の操作:#0005 Y = $gameMap.event(1).y;
◆
:分岐終了
◆条件分岐:上り下り判定 = 2
◆変数の操作:#0004 X = $gameMap.event(2).x;
◆変数の操作:#0005 Y = $gameMap.event(2).y;
◆
:分岐終了
◆場所移動:{MapId} ({X},{Y}) (向き: 下)
◆文章:なし, 暗くする, 中
: :地下\V[2]階
プラグインコマンドの意味は下記です。
EventReSpawn.js のプラグインコマンドです。
使用コマンド:ERS_MAKE_TEMPLATE_RANDOM 1 0 0 2 1 0
ERS_MAKE_TEMPLATE_RANDOM ID a b c d e
テンプレートマップのイベントIDを下記条件で生成します。
a. 通行可能かどうか(0:判定なし 1:通行可能タイルのみ)
b. 画面内 or 画面外(0:判定なし 1:画面内 2:画面外)
c. 他のキャラとの重なり(0:判定なし 1:プレイヤー 2:イベント 3:両方)
d. 地形タグ(0:判定なし 1..:指定した地形タグ)
e. リージョン(0:判定なし 1..:指定したリージョン)
イベント作成
テンプレートイベント
テンプレートマップ(ID2)にテンプレートイベントを作成します。
ここで指定した設定が他のマップにコピーされます。
TemplateEvent で「上書き対象項目」に指定した項目だけが、コピー先のイベントの設定で優先させることができます。
地上の入口
下り階段をコピーします。
メモ欄に「<TE:1><TEOverRide>」と入れます。
メモの意味は下記です。
テンプレートイベントID1をコピーする
画像をテンプレートに現在のイベントを上書きする
最終フロア
テンプレートから上り階段をコピーします。
メモ欄に「<TE:2>」と入れます。
タイルセットの設定
今回のコモンイベント「フロアセット」で、イベント(階段)をランダム配置する場所を「地形タグ:1」と指定しています。
ダンジョンの床となるタイルの地形タグを1に変更してください。
※「フロアセット」でのランダム配置する場所を「通行タイルのみ」だけに指定すると、壁の上部分が通行できる(タイルセットではXであっても)ため、そこに階段が配置されてしまうケースが出てしまいます。
このため、今回は地形タグ使用しています。
これで、複数のマップがランダムに並び、そのマップ内でランダムに階段が出現するランダムダンジョンの完成です。
カラクリの種明かし
4つのコモンイベントがカラクリの全てです。
- マップ選択
- 下り階段
- 上り階段
- フロアセット
処理の流れの情報を整理します。
簡単に2つの流れに分かれます。
2.下り階段途中まで ⇒ 1.マップ選択 ⇒ 2.下り階段続き ⇒ 4.フロアセット
3.上り階段途中まで ⇒ 1.マップ選択 ⇒ 3.上り階段続き ⇒ 4.フロアセット
処理の最初にフェードアウトし、最後にフェードインしているのは、移動を2回する必要があるため、主人公や階段の位置が移動するのが見えてしまうのを避けるためです。
試しに、コモンイベント2,3からフェードアウトを削除してみると、格好悪い表示になるのが分かると思います。
この仕組を応用し、宝箱・敵シンボル・障害物の位置をそれぞれランダムに配置することで、よりランダム性は増すでしょう。
ただ、完全な無作為だと困った動作になる場合もあると思います。
例:階段を降りたら、四方を敵に囲まれていた。
こういったことを避けたり、完成度を上げていくには、「下ごしらえ」の項目で行った「タイルの地形タグの設定」と「イベント配置」の地形タグの指定で細かく決めることができます。
地形タグ以外にもリージョンを使うことが出来ます。
コメントを投稿するにはログインしてください。