事前のお知らせ

RPGツクールMZ

ランダムダンジョン作成 (テンプレート&リスポーン使用) #RPGツクールMZ

RPGツクールMVでご紹介した手法をブラッシュアップした方法をご紹介します。
(以前の手法は筆者が今より無知だったために雑多でした)

サンプルプロジェクトをご用意しました。
中を参照しながら、不明な点を記事で理解を深めていただければと思います。

こちらの記事はRPGツクールMZ用です。
RPGツクールMV用は下記にあります。

fungamemake.com/archives/367

サンプルプロジェクト

github.com/munokura/RPG-Tkool-MZ-Sample-project-Random-Dungeon1

サンプルプロジェクトZIPダウンロード(4MB)

使用プラグイン

  • PluginCommonBase.js
    公式プラグインです。
    下記あたりに入っています。
    C:\Program Files (x86)\Steam\steamapps\common\RPG Maker MZ\dlc\BasicResources\plugins\official
    C:\Program Files\KADOKAWA\RPGMZ\dlc\BasicResources\plugins\official
  • テンプレートイベント(トリアコンタン様作)
    plugin-mz.fungamemake.com/archives/255
  • イベント動的生成(トリアコンタン様作)
    plugin-mz.fungamemake.com/archives/212

プラグインの設定

PluginCommonBase
TemplateEvent
EventReSpawn
をプラグイン管理でONにします。

TemplateEvent で「上書き対象項目」を下記の用に「画像」を「true」に設定してください。

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
場所移動:転移の間 (11,24) (向き: 下, フェード: なし)
ラベルジャンプ:End

分岐終了
コモンイベント:マップ選択
場所移動:{MapId} ({X},{Y}) (向き: 下, フェード: なし)
コモンイベント:フロアセット
ラベル:End
画面のフェードイン

上り階段

SEの演奏:Move1 (90, 100, 0)
画面のフェードアウト
変数の操作:#0001 上り下り判定 = 1
変数の操作:#0002 階 -= 1
条件分岐:階 = 0
場所移動:地上 (8,5) (向き: 下, フェード: なし)
ラベルジャンプ:End

分岐終了
コモンイベント:マップ選択
場所移動:{MapId} ({X},{Y}) (向き: 下, フェード: なし)
コモンイベント:フロアセット
ラベル:End
画面のフェードイン

フロアセット

プラグインコマンド:EventReSpawn, 条件付きランダム生成
プラグインコマンドイベントID = 1
プラグインコマンド通行可能タイルのみ = false
プラグインコマンド画面に関する条件 = 0
プラグインコマンドキャラクターとの位置重複 = 0
プラグインコマンド地形タグ = ["1"]
プラグインコマンドリージョン = []
プラグインコマンドテンプレート生成 = true
プラグインコマンド生成アルゴリズム = 0
プラグインコマンド:EventReSpawn, 条件付きランダム生成
プラグインコマンドイベントID = 2
プラグインコマンド通行可能タイルのみ = false
プラグインコマンド画面に関する条件 = 0
プラグインコマンドキャラクターとの位置重複 = 0
プラグインコマンド地形タグ = ["1"]
プラグインコマンドリージョン = []
プラグインコマンドテンプレート生成 = true
プラグインコマンド生成アルゴリズム = 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]階

イベント作成

テンプレートイベント

テンプレートマップ(ID2)にテンプレートイベントを作成します。
ここで指定した設定が他のマップにコピーされます。

TemplateEvent で「上書き対象項目」に指定した項目だけが、コピー先のイベントの設定で優先させることができます。

地上の入口

下り階段をコピーします。
メモ欄に「<TE:1><TEOverRide>」と入れます。
メモの意味は下記です。

  • テンプレートイベントID1をコピーする
  • 画像をテンプレートに現在のイベントを上書きする

最終フロア

テンプレートから上り階段をコピーします。
メモ欄に「<TE:2>」と入れます。

タイルセットの設定

今回のコモンイベント「フロアセット」で、イベント(階段)をランダム配置する場所を「地形タグ:1」と指定しています。

ダンジョンの床となるタイルの地形タグを1に変更してください。

※「フロアセット」でのランダム配置する場所を「通行タイルのみ」だけに指定すると、壁の上部分が通行できる(タイルセットではXであっても)ため、そこに階段が配置されてしまうケースが出てしまいます。
このため、今回は地形タグ使用しています。

これで、複数のマップがランダムに並び、そのマップ内でランダムに階段が出現するランダムダンジョンの完成です。

カラクリの種明かし

4つのコモンイベントがカラクリの全てです。

  1. マップ選択
  2. 下り階段
  3. 上り階段
  4. フロアセット

処理の流れの情報を整理します。

簡単に2つの流れに分かれます。
2.下り階段途中まで ⇒ 1.マップ選択 ⇒ 2.下り階段続き ⇒ 4.フロアセット
3.上り階段途中まで ⇒ 1.マップ選択 ⇒ 3.上り階段続き ⇒ 4.フロアセット

処理の最初にフェードアウトし、最後にフェードインしているのは、移動を2回する必要があるため、主人公や階段の位置が移動するのが見えてしまうのを避けるためです。
試しに、コモンイベント2,3からフェードアウトを削除してみると、格好悪い表示になるのが分かると思います。

この仕組を応用し、宝箱・敵シンボル・障害物の位置をそれぞれランダムに配置することで、よりランダム性は増すでしょう。
ただ、完全な無作為だと困った動作になる場合もあると思います。
例:階段を降りたら、四方を敵に囲まれていた。

こういったことを避けたり、完成度を上げていくには、「下ごしらえ」の項目で行った「タイルの地形タグの設定」と「イベント配置」の地形タグの指定で細かく決めることができます。
地形タグ以外にもリージョンを使うことが出来ます。

スポンサードリンク

スポンサードリンク

-RPGツクールMZ

Copyright© RPGツクールMZ・MV初心者的備忘録 - FGMG (Fun Game Make Group) , 2021 All Rights Reserved.