アイザックのバインディングでダンジョンを生成する



アイザックのバインディングとそのリメイクアイザックのバインディング:再生は私のお気に入りのゲームのいくつかです。それらは、ローグライトツインスティックシューターのジャンルに属し、Enter theGungeonと非常によく似ています



特に有名なのは、これらのゲームによって生成されたダンジョンです。アイザックスタイルの世代を作成する方法についてインターネット上で数え切れないほどのチュートリアルを見てきましたが、それがオリジナルでどのように実装されているのか疑問に思いました。驚いたことに、ほとんどのチュートリアルではプロセスが正しく説明されていません。この記事では、生成がどのように機能するかについて説明し、Javascriptデモでその例を示します。ほこりっぽいFlashの知識



逆コンパイルして更新する必要がありましたが(私はかつて独自のActionscriptデコンパイラを作成しました)、開発者のIsaacも非常に幸運でした。フロリアンHimslと再生のコア開発者の一人、サイモン・パーサーは、喜んで私の質問に答え。実際、フロリアンは最近でもアルゴリズムを説明するビデオ録画しました彼のチャンネルでは、彼の新しいゲームSquidInvadersの開発の詳細を知ることもできます。



彼の話の存在を考えると、私の記事は冗長であると見なすことができますが、血まみれの詳細が必要な場合は、読み続けてください。



基本的なアルゴリズム



Isaacの開発者は、2DのZeldaゲームに大きく影響を受け、ダンジョンに似たマップを生成しました。





これは、エッジで相互に接続された正方形の部屋のセットです。一部の部屋は特別です-各フロアには常にショップ、宝物室、上司がいます。さらに、他のいくつかの特別な部屋がランダムに選択されます。秘密の部屋を除いて、ダンジョンにはループがありません。



ゲーム自体は、そのようなレベルの直線的な通過で構成され、通常、「章」ごとに2つあります。通過の過程で、マップは少し大きくなり、部屋の内容は変わりますが、実際には、それらの構造を作成するためのアルゴリズムは毎回同じままです。



Isaacの最初のバージョンは3か月足らずで開発されたため、Himsluは時間を信じられないほど効率的に使用する必要がありました。ゲームの基本的なデザインは洗練されたシンプルです。最初に、フロアプラン(レベル)が生成されます。その後、いくつかの部屋が特別なものとして選択されます。次に、各部屋の内部が対応するプールから選択されます。



フロアプラン



Isaacは9x8グリッドで生成されます。便宜上、セルは数字で示されます。1はX位置、10はY位置を示します。つまり、+ 10、-10、+ 1、および-1を追加するだけで、上下左右に移動できます。 X位置が0のセルは使用されません(常に空です)。つまり、ほとんどのコードはマップの境界について心配する必要がありません。つまり、マップの左上のセルは01で、右下のセルは79です



。フロアプランは、部屋を含むセルのみを定義します。部屋の内容は後で選択されます。



まず、式random(2) + 5 + level * 2.6によって部屋の数が決まります。それら。レベルは7または8部屋から始まり、毎回2または3部屋ずつ増加します。



次に、ゲームは開始室(セル35)をキューに入れます。次に、彼女は周期的にキューをバイパスします。キュー内のセルごとに、4つの主な方向を循環し、次のことを行います。



  • 現在のセルに+10 / -10 / + 1 / -1を追加して、隣接するセルを決定します。
  • 隣接するセルがすでに占有されている場合、ゲームは何もしません。
  • 隣接するセル自体に複数の隣接するセルがある場合、ゲームは何もしません。
  • レベルにすでに十分な部屋がある場合、ゲームは何もしません。
  • ゲームは50%の確率で何もしません。
  • それ以外の場合、ゲームは隣接するセルに部屋を含むものとしてマークを付け、それをキューに追加します。


セルが隣接するセルのいずれにも部屋を追加しない場合、それは行き止まりであり、さらに使用するために宛先部屋のリストに追加できます。



マップに16を超える部屋が必要な場合は、成長を促進するために、開始部屋が定期的に再度キューに入れられます。



上記のアルゴリズムは単一の部屋から始まり、何度も外側に拡張するため、本質的には最初の調査の幅が広がります。すでに2つの隣人がいる場合に部屋を追加できないという制限により、部屋はループにまとめられることのない別々の廊下に分割されます。



次に、フロアプランの整合性がチェックされます。必要な数の部屋が含まれている必要があり、ボスルームは開始部屋の隣に配置しないでください。それ以外の場合、生成は最初からやり直します。



特別な部屋



ボスルームは、エンドルームリストの最後のアイテムを読み取ることによって配置されます。世代は外向きの成長として行われるため、これは常に開始部屋から最も遠い場所にある部屋の1つになります。



次に、秘密の部屋の位置が示されます。これらの部屋はフロアプランに追加されます。これらは、いくつかの既存の部屋の隣に部屋を配置することを禁止する規則の数少ない例外の1つです。実際、逆に、アルゴリズムはそれらをこのように配置することを好みます。ジェネレーターは、少なくとも3つの部屋の隣にあり、どのエンドルームの近くにもない空のセルをランダムに検索します。 300回試行しても見つからない場合は、検索条件がわずかに弱くなり、600回試行してもさらに弱くなります。この手順により、秘密の部屋は常にレベルに配置されますが、通常は交差点の隣に挟まれているため、隣には常に多くの部屋があります。



他のほとんどすべての特別な部屋はランダムなエンドルームにあります。一部の部屋は保証されていますが、他の部屋には小さなチャンスや基準があります。たとえば、犠牲部屋は7回のうちの1回出現します。プレーヤーが完全な健康状態にある場合、それらは3回に1回発生します。



レギュラールーム



隣接する部屋の中央には常にドア(または壊れやすい壁)があり、各部屋は4方向すべてからアクセスできるように設計されています。したがって、部屋を選択する際に特別な配慮は必要ありません。どのような組み合わせでもかまいません。



部屋はプールからランダムに選択されます。部屋に関する情報には、構造(穴、火、石など)とモンスターの両方が含まれています。どちらも、チャンピオンモンスターや赤い暖炉の出現など、ランダムな変動の影響を受けます。



通常の部屋には、イージー、ミディアム、ハードの3つのプールがあります。この章の最初の段階は、単純な部屋と中程度の部屋から選択し、2番目の段階は中程度と難しい部屋から選択します。最初の章(地下)には、プール内に174の普通の部屋があります。地下室をランダムに置き換えるセラーのような「代替チャプター」には、わずかに異なる部屋のセットがあります。



迷宮の呪い



コードの最も興味深い追加機能の1つは、2倍のサイズのマップです。それらはランダムに作成され、一部のチャレンジモードでのみ作成されます。特別な部屋と2つの隣接するボスルームの数が明らかに2倍になることに加えて、それらには多くの小さな詳細もあります。



  • 通常の部屋が80%多い(最大45)
  • 特別な部屋の場合、6つの遠端の部屋のみが使用されます
  • レベルは、シンプル、ミディアム、コンプレックスの部屋のプールから部屋を選択します。
  • 追加の通常の部屋は、秘密の部屋と同様の配置ロジックでフロアプランにランダムに追加されます。


デモ



ジェネレーターの簡単な例をJavascriptで作成して、実験できるようにしました。完全なコードはここにあり、実用的な例は元の記事にあります。





再生





アイザックの結合:リバースは、アイザックの結合は、オリジナルのリメイクにより作成されNicalis時に彼らのために有名だった、VVVVV洞窟物語のポートゲームはC ++に移植され、すべてのサウンドとグラフィックがやり直されました。何年にもわたって、ゲームは多くのDLCを受け取り、すでに印象的なオリジナルのリストに新しいアイテムと敵を追加しています。



Rebirthには興味深い革新がたくさんありますが、レベル生成への主な貢献は、より大きく不規則な部屋の追加でした。





DLCのフルセット(この記事の執筆時点では、これはAfterbirth +です)を使用して、ゲームには11の大きな部屋があります:2×2、2×1、さまざまな回転オプションのL字型と狭い廊下。





通常の部屋の3倍の大きさの典型的なL字型の部屋。これは、Himslaソースコードを注意深く変更することにより、SimonParserによって実装されました。



アルゴリズムは、すべての方向をループする代わりに、部屋からのすべての出口をバイパスします。 2x2の部屋では、最大8つまで存在できます。



部屋を挿入することになると、彼は代わりに大きな部屋をランダムに挿入しようとします。ネイバーチェックは引き続き適用されますが、ドアの外側にある隣の最初のセルにのみ適用されます。ただし、アルゴリズムは、残りの部屋に十分なスペースがあるかどうかを確認します。これは、大きな部屋が水平なヒンジを作成できることを意味します。通常、2つの大きな部屋は隣り合って生成され、それらを接続する1対のドアによって補完されます。



部屋に十分なスペースがない場合、アルゴリズムは別の候補を挿入しようとします。大きな部屋が正常に挿入された場合、95%の確率でプールから削除されます。



大きなボスルームを処理するには、さらに多くのコードが必要です。ボスルームは常に開始ルームから可能な限り離れた場所に配置されることに注意してください。より広い部屋が必要な場合は、ジェネレーターが目的のシングルルームを置き換えます。ボスルームは常に行き止まりであるため、交換時に、アルゴリズムはそれらがいくつかの追加のルームに隣接しているかどうかを確認します。それでも交換が不可能な場合があるため、すべてのエンドポイントは開始室から最大距離でチェックされ、それらが適合しない場合、アルゴリズムはあきらめます。



シークレットルームの場合、フロアプラン上の隣接するルームの配置が考慮され、アルゴリズムによってドアが不要であると判断された場合にのみルームが選択されます。





アイザックでは、割れ目は通常交差することは不可能です



出力



Isaac Level Generatorは、私が見た中で最も複雑なものではありませんが、コードの量が非常に少ないにもかかわらず、非常にうまく機能します。これがおそらく彼らがそれを頻繁に再現しようとする理由です。 Rebirthの例でわかるように、その単純さにより、変更と拡張が可能になります。信じられないほどの結果。



このゲームは、部屋の詳細とは別にフロアプランを生成する傾向が続いていることにも気付くでしょう。Diablo 1 [ Habréへの翻訳]とEnterthe Gungeon [ Habréへの翻訳]に関する私の記事で、このアプローチが非常に強力である理由を述べました。



コードを逆コンパイルしたとき、特に興味深い詳細は見つかりませんでした。私が言える最も興味深いことは、宝物室の場所が「boner」という名前の変数に格納されていることです。おそらくボーナスルームの略です。さまざまなアイテムのマイナーな副作用に関するコードにも微妙な点がありますが、このトピックはアナライザーに任せます



次にゲーム内部でHimslaの一連のビデオを視聴したり、Isaacをプレイしてすべてのレベルをライブで確認したりできます。今年、新しいRepentanceDLCがリリースされると聞きました。また、チーフデザイナーのエドマンドマクミレン(特にスーパーミートボーイ)による他のゲームをプレイすることをお勧めします。



All Articles