解決)ランダムダンジョン生成(ローグライク風でない)

アバター
こめかみ
記事: 104
登録日時: 2017年9月06日(水) 19:34
連絡を取る:

解決)ランダムダンジョン生成(ローグライク風でない)

投稿記事by こめかみ » 2021年10月05日(火) 00:44

同じサイズのマップ(部屋)をランダムに組み合わせて
マップ間を移動するダンジョンを生成する方法はないでしょうか?
図のような上下左右に出入口用イベントがあるマップを15種類用意して
全体サイズと、スタートからゴールまでのマップ数を決め
できれば孤立したマップが出ないように(同型マップを使用可)パズルのように組み合わせる方法を考えているのですが、自分には難解で途方にくれています。良い考えを頂けないかと質問させて頂きました。

スタートマップから上下左右にマップを増やしていくのか、それとも先に全体を構築して、それぞれのマップの繋がりに整合性を取らせていけばいいのでしょうか??
また、それぞれの部屋にランダムで敵やアイテムや仕掛けを置きたいのですが「同型マップだが同マップではない」「仕掛けで開ける扉の反対の部屋の仕掛けは?」といった問題も懸念されるでしょうか :oops:
添付ファイル
map1.png
map1.png (9.94 KiB) 閲覧数: 3083 回
map2.png
最後に編集したユーザー こめかみ on 2021年10月27日(水) 17:57 [ 編集 2 回目 ]

アバター
こめかみ
記事: 104
登録日時: 2017年9月06日(水) 19:34
連絡を取る:

Re: ランダムダンジョン生成(ローグライク風でない)

投稿記事by こめかみ » 2021年10月05日(火) 14:29

追記
条件・要望が曖昧なため、箇条にて整理いたしました。
1、出入口の数が違う15種類のマップを(重複使用可)ランダムで組み合わせる。
2、スタートとゴールの位置がランダムで決まり、かつスタートからゴールまでの最短マップ移動数を設定して生成したい(一本道になってもよい)
3、フロアの規模も設定できる。XかけるYで全体の大きさを決定したい(できたフロア枠内を全て埋めなくても良い)
4、各マップの移動は出入口イベント、またはリージョンに触れる事で行う予定
5、袋小路だけではなく回廊状になってもよい(回り道ができてもよい)
6、出入り口の反対の部屋にも対になる出入口がなくてはいけない(これは見た目の問題で、一方通行があってもよいが戻れるルートは必要)
7、それぞれのマップにランダムで敵や仕掛けのイベントを配置するが、同種マップが適用された際に重複させたくない
8、一度生成されたマップはそのフロアをクリアしない限りは敵イベント等含め再構築されない
9、上記をできる限り力技ではなく(それでもマップの規模が大きくなると条件分岐の収集がつかなくなってしまう)縦・横・距離の3つを設定するだけでなるべく簡単に効率的にできるコマンドを組みたい

※まず最初のアプローチ状態で正解がわからないです状態です。
次のマップに移動する時に順次生成していく方が良いのか、それとも(出入口が3か所以上の場合は特に)隣り合った部屋との出入口の整合性を考えると、各マップがフロア枠内のどこに位置するのかを先に決定した方が良いのか、そもそも前提条件(2や6など)が厳しいのか、些細なヒントでも助言頂ければありがたいです。
マドレーヌ
記事: 36
登録日時: 2020年11月07日(土) 19:48

Re: ランダムダンジョン生成(ローグライク風でない)

投稿記事by マドレーヌ » 2021年10月05日(火) 17:07

こめかみ さん
こんにちは

マップを複数作って場所移動で移動先をコントロールするのが簡易な仕組みでしょうか。
(魔女の家の移動みたいな)

ゼルダで言うところの迷いの森のようなイベントっぽい?、
進んだ方向で変数でカウントして正解に行ける簡易な仕組ですが、

仮に同マップに部屋を生成出来たとしてもプレイヤーからはマップが大きすぎて見切れて
見えないので、簡易な仕組みでも良いのではないかとも思います。
アバター
こめかみ
記事: 104
登録日時: 2017年9月06日(水) 19:34
連絡を取る:

Re: ランダムダンジョン生成(ローグライク風でない)

投稿記事by こめかみ » 2021年10月05日(火) 22:01

マドレーヌ様
ご返答ありがとうございます。
全体フロアが入るたびに変化する、ゼルダで例えるならば、イメージ的には初代の様な同型サイズで数種類のマップが連結されたダンジョンで通路がなく、それが入る度に構造が違うものになるというのが理想形と考えております。
最近だと3Dですがブラッドボーンの聖杯ダンジョン生成が近いかも知れません。
大マップを部屋と通路に区切るランダム生成系のプラグインも考えたのですが
処理落ちや敵仕掛けイベント管理の都合、部屋の見た目のクオリティ面で、15種類のマップにだけ力を割いてしまえば、あとはランダムに何度でも挑戦できるダンジョンにできそうだ、という目論見でした。
進んだ先で変数をカウントし、その都度部屋が配置されていく方法もありなんですね :idea:
要領を得ぬお返事になっておりましたら申し訳ございません。

移動先をコントロール
マドレーヌ さんが書きました:こめかみ さん
こんにちは

マップを複数作って場所移動で移動先をコントロールするのが簡易な仕組みでしょうか。
(魔女の家の移動みたいな)

ゼルダで言うところの迷いの森のようなイベントっぽい?、
進んだ方向で変数でカウントして正解に行ける簡易な仕組ですが、

仮に同マップに部屋を生成出来たとしてもプレイヤーからはマップが大きすぎて見切れて
見えないので、簡易な仕組みでも良いのではないかとも思います。
添付ファイル
map3.png
マドレーヌ
記事: 36
登録日時: 2020年11月07日(土) 19:48

Re: ランダムダンジョン生成(ローグライク風でない)

投稿記事by マドレーヌ » 2021年10月05日(火) 22:39

どこまでできるかはわかりませんが、
複数のマップを繋げて1つの大きなマップにするプラグインがあるようです。

https://tm.lucky-duet.com/viewtopic.php?t=5911
アバター
こめかみ
記事: 104
登録日時: 2017年9月06日(水) 19:34
連絡を取る:

Re: ランダムダンジョン生成(ローグライク風でない)

投稿記事by こめかみ » 2021年10月06日(水) 03:28

マドレーヌ様
ご紹介頂いたプラグインは難易度が高そうで未使用でしたが、挑戦してみます。他にも色々と考え方を変えて試してみようと思います!
アバター
MEIKOI
記事: 168
登録日時: 2018年9月22日(土) 20:13
連絡を取る:

Re: ランダムダンジョン生成(ローグライク風でない)

投稿記事by MEIKOI » 2021年10月06日(水) 15:11

こんにちは、はじめまして。

前に、イベントコマンドとスクリプトで苦労しながら同じような事をした事があります。

穴掘り法と言う考え方を使って、配列にマップの情報(マップID)を入れて作成しました。

穴掘り法をイベントコマンドでどういう風に実現するのかが肝ではありますが

ちょっと記憶がうろ覚えで、しかもめんどくさかったので説明が難しいですが

マップは、こめかみ様とおなじようにあらかじめ15種類用意しておきました。

穴掘り法で配列にマップIDを入れる事さえできれば、この形のランダムダンジョンは作れます。

中途半端なんですが、つい昔やった事を思い出して書きました。

参考になれば・・・ならないかな^^;
-----------------------------------------
https://twitter.com/meikoimv
-----------------------------------------
アバター
こめかみ
記事: 104
登録日時: 2017年9月06日(水) 19:34
連絡を取る:

Re: ランダムダンジョン生成(ローグライク風でない)

投稿記事by こめかみ » 2021年10月07日(木) 13:47

MEIKOI様
やはり、イベントコマンドやスクリプトを駆使するしかなく、手間を省いてできるものではないのですね。
配列の概念にマップIDを使用するのは考えにありませんでした;
以前に同じようなマップ構成で作成なされたという事で、挑戦する励みになります。
別所にて生成パターンを色々と教えてもらい、穴掘り方が近い?と思っていましたので、考え方的に無茶ではないとわかり頑張れそうです。アドバイスありがとうございます!
奈々(なな)
記事: 103
登録日時: 2016年11月06日(日) 16:57

Re: ランダムダンジョン生成(ローグライク風でない)

投稿記事by 奈々(なな) » 2021年10月08日(金) 13:07

こんにちは。
Aceのスクリプトで、ほぼ同じような仕様で作っていました。(諸事情で素材としては公開しませんでしたが)
最近MZのプラグインでも簡易版を作成中ですので、誰かの参考になればと思い書き込みさせて頂きます。


処理の順番としては概ね
 1.迷路を作る
 2.マップ配置に変換する
 3.実際に配置する
の流れになると思います。

1.
迷路作成で調べればアルゴリズムが色々と出てきますが
既に穴掘り法の話が出ているので、今回のケースはそれで良いと思います。

スタートとゴールを後から決める生成法なので、そちらは少し工夫が必要です。
例えば、ある1点をランダムで抜き出したときに
それが「通路、かつ上下左右の3つが壁」なら端部だと判別できます。

もしスタートとゴールの長さも条件にしたい場合は
スタートを決めた後に迷路を進めていって、一定長さ以上の端部を見つける必要があります。
内容としては穴掘り法の応用で、駄目だったら前の分岐点に戻って~という処理です。


2.
今回の穴掘り法で得られる迷路は、壁と通路(とスタートとゴール)が1マス扱いのものです。
(因みに、大前提としてこういうマス目は数字の入った2次元配列として扱います)

 012345678
0壁壁壁壁壁壁壁壁壁
1壁S  壁   壁
2壁壁壁 壁 壁壁壁
3壁       壁
4壁 壁壁壁壁壁 壁
5壁     壁G壁
6壁壁壁壁壁壁壁壁壁

対して、最終的に作成したいのは、通路付きの部屋を1マス扱いで並べたものです。
なので、実際に配置ができるような形に直す必要があります。
部屋が15種類なので、順番に番号を割り振って1~15番が入った2次元配列としましょう。

対応は簡単です。上記の迷路の奇数同士の交点が部屋、それ以外が通路と壁です。
なので、まずは左上の[1,1]を見ます。
その上下左右のマスが通路なのか壁なのかを見れば、この部屋の形がわかりますので
条件分岐で調べていって該当する番号を配置用の配列に入れます。
これを[3,1]、[5,1]...と繰り返していくだけです。

同時に、その部屋がスタートかゴールだった場合
スタート位置、ゴール位置の座標をそれぞれ記録しておくと良いです。


3.
最終的にどういう方法でゲームに出すかは、色々あります。
既に出ているように
プラグインを使って1つのマップに結合する方法や
簡易的なものだと場所移動で部屋のマップを移動していく方法もあります。

前者なら作成した配列の通りにマップを置いていくだけなので、作成は簡単です。
プラグインの使い方、イベントのコントロール、ゲームが重くならないか、などがハードルです。

後者は「現在位置」を管理して
移動するときに次のマップがどれか、配列から判別する方法です。
マップに関してはデフォルトの機能だけで完結し、1つ1つの処理を順番に作成するため
やってみるとやりやすい方法だと思います。見栄えしにくいのが難点ですが。
------------------------------------------------------------------------------------
へぷたなすくろーる
http://heptanas.mamagoto.com/

VXAceのスクリプト素材及びイベント講座などをやっています。
------------------------------------------------------------------------------------
アバター
こめかみ
記事: 104
登録日時: 2017年9月06日(水) 19:34
連絡を取る:

Re: ランダムダンジョン生成(ローグライク風でない)

投稿記事by こめかみ » 2021年10月10日(日) 00:21

奈々様
返信遅くなり申し訳ありません。詳しい作成法の記載ありがとうございます。
アドバイスを参考に(穴掘り方とはちょっと違う気もするのですが)なんとか生成までこぎつけました。
https://twitter.com/i/status/1446850578873610249
探索用イベントで通行可能かを調べ、プレイヤーの侵入時に入口、退出時に出口を追加して行くという方法だったのですが、要望にある回廊(ループ)ありのダンジョンを生成できました。
(迷路上にして、袋小路から分岐まで一旦バックさせる処理が難しく断念したのもあるのですが;;)
あとはマップ構成ですが後者のタイプで「現在位置の管理」と「移動先の制御」をなんとか形にしてみようと思います。

※闇雲な状態でしたが、皆様のアドバイスでイメージを掴む事ができました!感謝致します。

“MV:質問” へ戻る