前回の記事で、基本的なふしぎのダンジョン系のランダムなダンジョン生成を紹介しました。
しかし、これだけでは単色の塗りつぶしでいかにも素っ気ないですね。
もうちょっと草が生えてたり、石ころが落ちてたり、水場がそれっぽく散っていたりして欲しい。つまり「ランダムなマップ装飾」がしたいわけです。
参考サイトさん復習
セルオートマトンというらしい
前回記事でも参考にしたこよるさんの「ローグライク製作メモ」に、こんな記事があります。
参考
セルオートマトンを使うSmallNight◆ゲーム開発録◆
マップの全マスを、チップAとチップBのどちらかでランダムに書き換える。
↓
一マスずつすべてのマスを走査して、チップBの周囲8方向にチップAが4マス(ここらへんは適当)以上あるときは、そのマスをチップAに書き換える。
↓
床と天井の配置がいい具合になるまで手順を繰り返す。
やりたいことはズバリこれっぽいですね。
考え方としては「セルオートマトン」と言うようです。
こちらのページでされているのは理念の説明ですので、本記事でその理念の実作に挑んでみましょう。
やりたいことを考える
引用部分の言い回しはいかにも難しそうです。が、いまやりたいことに合わせて言い換えてみると簡単そうなことがわかってきます。
仮に、「自動生成のカクカクした石壁・石床のダンジョンに、ランダムで草むらを生やして装飾したい」とします。
そのとき必要な手順は以下。
- マップの全マスを調べて、そこが「床(壁では無い場所)」なら、一定確率で草むらチップを設置
- マップの全マスを調べて、そこが草むらチップで、かつ周囲に別の草むらチップが無いなら、その草むらチップを消去(1マスだけで孤立している草むらチップを消す)
これだけですね。
参考サイトさんでやっていることはもっともっと高度と思いますが、今はこれだけの動作をしてくれれば、ランダムな量と配置で、草むらチップのかたまりがあちこちに生まれるはずです。
少なめに配置したいなら1番の処理の確率を下げればいいし、多めに配置したいなら確率を上げれば良さそうです。
そんなかんじで、上の1番と2番をそれぞれコモンイベント化してみましょう。
ランダムなマップ装飾を作る
ランダムに指定のチップを任意の確率で配置するコモン
マップのすべてのマスを調べて、そこが壁かどうかの判定をし、さらに確率判定をしてチップを書き換えるわけですから、ごくすなおに書くとこんな感じでしょうか。
入力値でチップの種類や確率も自由に変えられるようにしておきました。
こんなマップがあったとして、上のコモンを「50%の確率で草っぽい地形(森)を生やす」ように動かしてみましょう。
なんかもうコレだけでいいんじゃないかというソレっぽさに。
「装飾として生やすチップが通行不可な水場だった」とか、「通路にはどんな装飾チップも置かない」といったことをやるには、さらに上のコモンに調整が必要になるでしょう(通路を除外するだけなら、「通路生成の前」にこの処理を呼べばよさそうですね)。
今回はおいておいて、先に進みます。
装飾チップも、複数の種類があった方がそれらしいはず。
さきほどのコモンを異なる設定で2回呼び出したものです。
- 草っぽい地形・確率40%
- 石ころ・確率5%
これだけです。
石ころは元から孤立してポツポツある方がそれらしいのでOKですが、草地形は確かに孤立している方が悪目立ちします。こういう孤立チップを消去するコモンも作ってみましょう。
指定のチップが孤立しているなら消去するコモン
指定のチップと一致するマスを探して、その周囲4マスをチェックして分岐をかければよいわけです。
実際に動かしてみましょう。
石ころは孤立していてほしいので、こちらのコモンは森地形にだけかけていきます。
これが、
こう。
これだけではちょっと判断がつきませんが、目的の動作はこなしているようです。
あれこれ試してみた結果
両方のコモンを調整しながら、いろいろなチップを呼び出して配置していくとにぎやかなランダム性が得られそうですね。