Diablo 1 ist der klassische Roguelike von 1996. Dies war einer der ersten erfolgreichen Versuche, die Massen mit Roguelike bekannt zu machen, das bis dahin Nischengrafiken in Form von ASCII-Kunst hatte. Das Spiel brachte mehrere Fortsetzungen und viele Simulationen hervor. Sie ist bekannt fĂŒr ihre dunkle, dĂŒstere AtmosphĂ€re, die sich verdichtet, wenn der Spieler in die Kerker unter der Stadt Tristram hinabsteigt. Es war eines der ersten Spiele mit prozeduraler Kartengenerierung fĂŒr mich, und die Möglichkeit, solch glaubwĂŒrdige Levels zu generieren, schockierte mich.
Ich habe kĂŒrzlich herausgefunden, dass aufgrund der Entdeckung verschiedener Dateien mit Debugging-Symbolen mehrere Fans des Spiels die Aufgabe ĂŒbernommen haben
, den Quellcode zurĂŒckzuentwickeln, um ihn zu bereinigen und herauszufinden, wie der von den Entwicklern geschriebene Code aussieht. So begann meine einwöchige Exkursion in die Studie, wie der Hauptentwickler David Brevik diese Level erstellt hat. Vielleicht ist deshalb die Magie des Spiels fĂŒr mich teilweise zusammengebrochen, aber ich habe viele Techniken gelernt, die fĂŒr Entwickler Ă€hnlicher Spiele nĂŒtzlich sein werden, also werde ich sie in diesem Artikel teilen.
Vielen Dank an David Brevik und das Blizard North-Team fĂŒr die Erstellung eines so groĂartigen Spiels sowie an
galaxyhaxz und das Devilution-Team fĂŒr ihre groĂartige Arbeit bei der Wiederherstellung des lesbaren Quellcodes des Projekts.
EinfĂŒhrung
Diablo ist ein Spiel, das aus isometrischen Kacheln besteht. Das Spiel besteht aus 4 Stufen, von denen jede 4 Stufen hat. Spielphasen: Kathedrale, Katakomben, Höhlen und Hölle. Es gibt auch mehrere feste Ebenen, zum Beispiel die Stadt Tristram, die ich in dem Artikel nicht berĂŒcksichtigen werde. Diablo hat separate Level-Generierungsverfahren fĂŒr jede der 4 Stufen, daher werde ich zuerst auf ihre Funktionen eingehen und dann den Betrieb jeder der Stufen separat betrachten.
Ich war nur daran interessiert, wie die Levels generiert wurden. Erfahren Sie mehr ĂŒber Quests, Monster usw. Ich empfehle, den
Jarulf-Leitfaden zu Diablo und Hellfire zu lesen, in dem diese Aspekte ausfĂŒhrlich beschrieben werden.
Allgemeine Funktionen
Obwohl jede Stufe einen eigenen Pegelgenerator hat, haben sie alle gemeinsame Merkmale.
Dungeons und Kacheln
Jedes Level des Spiels wird generiert, um ein Raster von 40 x 40 PlĂ€ttchen zu fĂŒllen. Die X-Achse entspricht dem SĂŒdosten und die Y-Achse entspricht dem SĂŒdwesten.
Diese Kacheln werden nur fĂŒr Aufgaben zur Ebenengenerierung verwendet. Nach dem Erstellen eines Levels wird jedes PlĂ€ttchen in 4 "Dungeonfragmente" unterteilt, die auf dem Bildschirm gerendert werden.
Dieses detailliertere Raster wird verwendet, um durchquerte Kacheln zu bestimmen, und bietet auch eine effizientere Wiederverwendung des Grafikspeichers. FrĂŒher habe ich ĂŒber
Kachelaufteilungsschemata geschrieben .
Dies bedeutet, dass die Standard-Diablo-Karte aus mehr als hundert Kacheln besteht, von denen viele geringfĂŒgige Abweichungen von anderen sind, um alle möglichen Verbindungsmethoden zu berĂŒcksichtigen. Wir werden spĂ€ter darĂŒber sprechen.
Zu meiner Ăberraschung bestehen Dungeon-Karten im Gegensatz zu anderen Spielen dieser Serie nicht aus vorgefertigten Blöcken. Fast alles wird mithilfe von Algorithmen erstellt.
Mehrstufiger Prozess
Jede Dungeon-Generierungsprozedur ist in zwei Stufen unterteilt. Die Vorgeneration befasst sich ĂŒberhaupt nicht mit der Auswahl von Fliesen. Es wird einfach ein Array generiert, in dem begehbare Kacheln, Kacheln mit TĂŒren und einige andere Details auf hoher Ebene markiert sind. In der zweiten Phase wird dieser Dungeon-Rohling in eine Reihe von Kacheln umgewandelt. AnschlieĂend wird eine Generierung durchgefĂŒhrt und unter BerĂŒcksichtigung dieser Kacheln werden Ănderungen vorgenommen.
Dies sollte fĂŒr den Designer unglaublich praktisch sein. Sie können mit einem Grundriss experimentieren, der völlig unabhĂ€ngig von der Wahl der Fliesen und des Stils ist. In vielen FĂ€llen sind sie jedoch miteinander verbunden und bieten ein ganzheitlicheres GefĂŒhl fĂŒr die Ebene.
Alle Phasen der Erstellung von Dungeon-Rohlingen beginnen mit einem Level, das mit fester âHĂ€rteâ gefĂŒllt ist. Danach verwandeln sich die einzelnen Teile des Levels rekursiv in Bodenfliesen. Ich werde dies weiter unten genauer diskutieren.
Fertige Fragmente
Fertige Fragmente sind vorab erstellte Ebenenblöcke, die einfach in eine zufĂ€llig generierte Ebene eingefĂŒgt werden. Sie werden fĂŒr die meisten Spielquests verwendet. Auf jeder Ebene kann es nur ein fertiges Fragment geben, dessen Position in jeder Phase separat ausgewĂ€hlt wird.
Butcher's Den ist eines der ersten vorgefertigten Schnipsel im Spiel.Mini-Sets
Mini-Kits sind eine weitere Möglichkeit, Inhalte in eine Ebene vorab erstellter Inhalte einzufĂŒgen. Dies sind kleine StĂŒcke, normalerweise ungefĂ€hr 3 Ă 3 groĂ, die zufĂ€llig in den Kerker eingefĂŒhrt werden. Es gibt ein einfaches Mustervergleichsschema, dank dessen sie nur an den ârichtigenâ Stellen erscheinen. Oft sind sie mit zusĂ€tzlichen Anforderungen codiert, z. B. können Mini-Sets nicht nahe beieinander platziert werden, sie können sich nicht mit vorgefertigten Fragmenten ĂŒberlappen und so weiter. Einige Mini-Kits suchen und ersetzen immer, wĂ€hrend andere dies mit einer festen Wahrscheinlichkeit tun.
Diablo Mini Kits werden fĂŒr viele verschiedene Zwecke verwendet. Sie werden verwendet, um groĂe Objekte von Kacheln wie Treppen zu platzieren, Kombinationen von Kacheln zu fixieren, die nicht gut miteinander verbunden sind, und um Kacheln zufĂ€llige Variationen hinzuzufĂŒgen.
Thematische RĂ€ume
Themenzimmer sind kleine RĂ€ume, die von einer Wand und einer TĂŒr begrenzt werden. Normalerweise befinden sich in ihnen auf zufĂ€llige Weise bestimmte vorbestimmte Objekte. Zum Beispiel haben Bibliotheken immer ein BĂŒcherregal mit zwei Kerzen auf jeder Seite, mehreren zufĂ€lligen BuchstĂŒtzen und Monstern. Monster Lairs enthalten viele Monster und einen zufĂ€lligen Gegenstand und so weiter.
Auf den Ebenen der Kathedrale schafft der Generator geeignete RĂ€ume, die durch
FĂŒllen erkannt und wiederverwendet werden. In anderen Phasen findet der Algorithmus offene RĂ€ume, in denen WĂ€nde und eine TĂŒr gezeichnet werden, um RĂ€ume zu schaffen.
Jeder thematische Raumtyp hat bestimmte Anforderungen an die GröĂe und das Stadium, in dem er erzeugt wird.
Fliesenersatz
Einige Karten haben eine spezielle Anpassung der Kacheln, aber alle haben ein gemeinsames Merkmal: Einige Kacheln können durch Àhnliche Variationen ersetzt werden. Die gÀngigsten Fliesen (z. B. Böden und flache WÀnde) weisen verschiedene Variationen auf, die die Monotonie des Levels verringern. Fliesenwechsel werden niemals nebeneinander wiederverwendet.
Vergleich von Mustern und âKorrekturenâ
Wie oben erwĂ€hnt, werden Mini-Sets als Such- und Ersetzungsmechanismus verwendet, der Generatorfehler korrigiert. In den meisten Phasen gibt es jedoch Verfahren, mit denen spezifischere Probleme erkannt und behoben werden können. Ich werde nicht auf Details eingehen, weil es nur ein paar davon gibt. Es genĂŒgt zu sagen, dass Diablo ziemlich fehlerhaft ist, und nĂ€her an der Veröffentlichung wurde klar, dass es einfacher wĂ€re, bestimmte Probleme zu erkennen, als ihre grundlegenden Ursachen zu beseitigen.
Eine der hĂ€ufigsten "Korrekturen" war die "Aussperrung": Sie ĂŒberprĂŒfte, ob es möglich war, den gesamten Dungeon zu durchlaufen, und startete die Generierung erneut, wenn dies nicht der Fall war.
Quests
Die meisten Quests wurden mit vorgefertigten Fragmenten erstellt, aber einige verwendeten ihre eigene Logik. Zum Beispiel generiert Zhar the Mad thematische BibliotheksrĂ€ume, der Eingang zu Poisoned Water wird durch Mini-Dialing generiert und Anvil of Fury verfĂŒgt ĂŒber einen bestimmten Code zur Generierung von Ebenen. Ich werde nicht auf Details eingehen, aber der Code ist voll von Ă€hnlichen PrĂŒfungen fĂŒr Quests.
Kathedrale
Die Kathedrale ist wahrscheinlich die kultigste der BĂŒhnen von Diablo. Es zeichnet sich durch lange Reihen gotischer Bögen, beengte RĂ€ume und viele EngpĂ€sse in Form von TĂŒren aus. Mal sehen, wie es erstellt wurde.
Dungeon leer
Der Algorithmus zeichnet als erstes den Kern der Karte. Er wĂ€hlt zufĂ€llig bis zu drei RĂ€ume 10 Ă 10 in vorbestimmten Positionen entlang der Mittelachse X oder Y aus. Ein breiter Korridor, der die RĂ€ume verbindet, wird ebenfalls entlang der Achse gezeichnet. Befindet sich auf der Ebene ein fertiges Fragment, befindet es sich immer in der Mitte eines dieser RĂ€ume. Diese zentralen KerkerrĂ€ume sind fĂŒr neue WĂ€nde als ungeeignet gekennzeichnet, so dass sie immer groĂe FreiflĂ€chen bleiben.
Alle anderen RĂ€ume werden durch die rekursive Knospungstechnik in einer Funktion namens
L5roomGen
, die in jedem dieser RÀume ausgelöst wird, und durch Auswahl einer Achse.
L5roomGen-Funktion
- Sie passiert das Rechteck des ursprĂŒnglichen Raums, von dem aus Sie mit dem Knospen beginnen mĂŒssen, sowie die bevorzugte Achse.
- Mit einer Wahrscheinlichkeit von 1/4 Àndert sich die bevorzugte Achse.
- Die zufĂ€llige GröĂe des neuen Raums wird mit 2, 4 oder 6 Kacheln auf jeder Seite ausgewĂ€hlt.
- FĂŒr jede Seite des ursprĂŒnglichen Raums entlang der ausgewĂ€hlten Achse (d. H. SE / NS fĂŒr X, SW / NE fĂŒr Y):
- Das Rechteck des neuen Raums richtet sich nach der Mitte des Randes des ursprĂŒnglichen Raums
- Es wird ĂŒberprĂŒft, dass zuvor nichts gezeichnet wurde und wir das Ende der Karte nicht erreicht haben. WĂ€nde erfordern einen Rand von einer Fliese.
- Wenn die PrĂŒfung erfolgreich ist, wird ein Raum gezogen.
- FĂŒr jeden zu
L5roomGen
Raum wird L5roomGen
rekursiv aufgerufen, wobei der neue Raum und die Achse gegenĂŒber der zuvor verwendeten Achse L5roomGen
.
Letztendlich beginnt dieser Vorgang mit mehreren RÀumen, die innerhalb der "harten" Kacheln ausgeschnitten sind, und klebt dann wiederholt neue Rechtecke, um neue passierbare Bereiche auszuschneiden. Zu diesem Zeitpunkt sind alle "RÀume" auf einer Seite geöffnet, da sich jeder neue Raum direkt neben dem vorherigen befindet, ohne PÀsse zum Platzieren von WÀnden.
Dann berechnet der Generator die Anzahl der erzeugten durchquerten Kacheln. Wenn es unter dem Mindestschwellenwert liegt, der mit jedem Level zunimmt, wird der Dungeon zerstört und der Generierungsversuch erneut ausgefĂŒhrt.
Dungeon
Bisher hat der Algorithmus nur die "festen" und geschlechtsspezifischen Kacheln. Wir mĂŒssen sie durch echte Wandfliesen ersetzen. Zu diesem Zweck verwendet Diablo den Marschquadrat-Algorithmus, den ich
in einem frĂŒheren Artikel beschrieben habe .
Das Spiel nutzt jedoch seine ungewöhnliche Variation. Das Kachelset der Kathedrale enthĂ€lt WĂ€nde, die sich jedoch immer am Ă€uĂersten Rand der Kachel befinden. Daher gibt es eine Fliese mit einer Wand am Nordostrand, aber keine Fliesen mit einer Wand am SĂŒdostrand. Um WĂ€nde auf anderen Seiten zu erstellen, mĂŒssen Sie eine âfesteâ Kachel mit einer zusĂ€tzlichen Wand finden, die sich vom Rand der Kachel nach auĂen erstreckt. Es klingt seltsam, ist aber sehr praktisch, um WĂ€nde nach Tiefe zu sortieren.
Um dies zu bewĂ€ltigen, ĂŒberspringt Diablo wĂ€hrend der MarschwĂŒrfelphase einige WĂ€nde:
ZusĂ€tzliche WĂ€nde werden spĂ€ter in der Phase âFixesâ hinzugefĂŒgt. Ich denke, dieses einfache Verfahren beeinflusst am meisten den "Stil" der Kathedrale. Da die gegenĂŒberliegenden WĂ€nde an massiven Fliesen befestigt sind, wird bei zwei durch eine Wandfliese getrennten RĂ€umen die gegenĂŒberliegende Wand einfach nicht erzeugt. Dies bedeutet, dass die TrennwĂ€nde zwischen den RĂ€umen "dĂŒnner" sind, als Sie normalerweise in der Auflösung erhalten können, mit der Marschquadrate ausgefĂŒhrt werden.
Nach dem Platzieren der HauptwĂ€nde fĂŒgt der Generator jedem der zentralen RĂ€ume vier freistehende SĂ€ulen und eine Kolonnade von Bögen fĂŒr den zentralen Korridor hinzu. Auf diese Weise können Sie der Kathedrale ein besseres GefĂŒhl fĂŒr Design vermitteln als auf anderen Ebenen und den Spielern die Navigation erleichtern.
Der Generator fĂŒgt dann zufĂ€llig TrennwĂ€nde hinzu. TrennwĂ€nde verlaufen immer entlang der Achse von einer Wand zur anderen. Sie beginnen an den Ecken, sodass die Bereiche wunderschön in RĂ€ume unterteilt sind. In 25% der FĂ€lle besteht eine Wand aus einer Reihe von Bögen, in 25% der FĂ€lle aus einer Reihe von Bögen mit einem Gitter, das den Eingang blockiert, und in allen anderen FĂ€llen handelt es sich um eine feste Wand. Bei Gittern und festen WĂ€nden wird irgendwo entlang der Trennwand zufĂ€llig eine TĂŒr oder ein Bogen hinzugefĂŒgt, um den Raum passierbar zu machen.
Das FĂŒllverfahren erkennt potenzielle ThemenrĂ€ume.
Treppen werden platziert, um eine Verbindung zu anderen Ebenen herzustellen. Wenn es unmöglich ist, sie zu platzieren, beginnt der Versuch, den Dungeon zu generieren, von neuem.
Die Anordnung von Mini-Sets, "Korrekturen" und Ersetzungen werde ich nicht im Detail betrachten. Am allermeisten liebe ich das PANCREAS1 Mini-Kit, das eine 1% ige Chance hat, einen Haufen blutigen Fleisches auf die Bodenfliese zu legen. Am Ende werden 5-10 Lampenobjekte darauf platziert, um den Dungeon zu dekorieren.
Katakomben
Im Gegensatz zur Kathedrale, die ein entworfenes GebĂ€ude zu sein scheint, fĂŒhlen sich Katakomben viel spontaner an. Sie zeichnen sich durch quadratische RĂ€ume aus, die durch viele gewundene Korridore miteinander verbunden sind. An vielen Stellen befinden sich anstelle von TĂŒren breite Ăffnungen. Erhöhen der Wahrscheinlichkeit, dass der Spieler von vielen Feinden umgeben ist.
Der komplexeste Generierungsalgorithmus im Spiel wurde verwendet, um Katakomben zu generieren. Ich vermute, dass der Zeitmangel die Entwickler gezwungen hat, in spÀteren Phasen einfachere Lösungen anzuwenden.
Dungeon leer
Das Verfahren zum Erstellen eines Dungeon-Rohlings fĂŒr Katakomben ist ziemlich einzigartig. In allen anderen Phasen gibt es einen einzelnen Booleschen Wert, der das Vorhandensein oder Fehlen von Geschlecht anzeigt (plus eine Reihe von Bits fĂŒr zusĂ€tzliche Details). Katakomben speichern den Dungeon Blank in Form einer ASCII-Karte, fast wie ein klassisches Roguelike. Und dies ist nicht besonders ĂŒberraschend angesichts
des EingestÀndnisses von
David Brevik, dass er sich von Angband fĂŒr Diablo inspirieren lieĂ .
Der Hauptraumgenerator ist wieder ein rekursiver Algorithmus, diesmal jedoch eine rekursive Partition. Die
CreateRoom
Funktion
CreateRoom
fĂŒr den gesamten Dungeonbereich von 40 Ă 40 minus 1
CreateRoom
aufgerufen.
CreateRoom-Funktion
- Der
CreateRoom
Funktion CreateRoom
ein Rechteck ĂŒbergeben, das den Bereich angibt, in dem Sie RĂ€ume generieren möchten. Details ĂŒber den ursprĂŒnglichen Raum werden ebenfalls an die Funktion ĂŒbergeben (anfĂ€nglich null). - Wenn der Bereich zu eng ist, wird die Funktion beendet.
- FĂŒr den Raum wird eine zufĂ€llige GröĂe von 4 bis 9 Kacheln auf jeder Seite ausgewĂ€hlt, wobei die maximale GröĂe des Bereichs berĂŒcksichtigt wird, in dem Sie den Raum platzieren möchten.
- In dem Bereich wird eine zufÀllige Position ausgewÀhlt, um den Raum zu platzieren.
- Der Raum wird auf einer ASCII-Karte gerendert. In der Abbildung das Symbol
'.'
Bodenfliesen sind angegeben, das Symbol '#'
ist die umgebende Wand und die Buchstaben 'A'
, 'B'
, 'C'
und 'E'
sind die vier Ecken. - Wenn ein Raum einen Quellraum hat:
- An den nĂ€chsten RĂ€ndern des ursprĂŒnglichen und des neuen Raums wird eine zufĂ€llige Kachel ausgewĂ€hlt.
- Diese Informationen werden in der Korridorliste aufgezeichnet, die spÀter verwendet wird.
- Die verbleibenden Teile des Bereichs, mit Ausnahme des aktuellen Raums, werden ausgeschnitten, wodurch vier Rechtecke entstehen.
- Die GröĂe jedes Rechtecks ââwird um zwei Kacheln reduziert, um einen Raum zwischen den RĂ€umen zu schaffen. AnschlieĂend wird die Funktion
CreateRoom
rekursiv aufgerufen, der Bereich, fĂŒr den dieses Rechteck verwendet wird, und der erstellte Raum als Quelle.
Wenn sich auf der Karte ein fertiges Fragment befindet, befindet es sich immer im ersten von CreateRoom erstellten Raum, und seine Abmessungen werden so festgelegt, dass dieses Fragment darin platziert wird.
Nach dem Aufruf von
CreateRoom
ein ASCII-Array Àhnlich dem unten gezeigten (danke
nomdenom fĂŒr das Extrahieren aus dem Code):
A##B #..# A####B #..# #....# #..# #....# C##E #....# C####EA#####B #.....# #.....# A########B #.....# #........# #.....# #........# C#####E #........# A#B #........# #.# #........# #.# #........# #.# #........# #.# #........# #.# C########E #.# #.# A#BC#E #.# A####B #.# #....# #.# #....# #.# #....# #.# C####E #.# #.# A#####BC#E #.....# A###B #.....# #...# #.....# C###E #.....# C#####E
In diesem Fall war der ursprĂŒnglich erstellte âRootâ -Raum der niedrigste.
Dann werden die zuvor gesammelten Korridorinformationen angewendet. Zwischen jedem aufgezeichneten Punktpaar wird eine Linie gezogen. Wenn es eine Wand ĂŒberquert, wird
'D'
geschrieben, und wenn es eine feste Kachel ĂŒberquert, wird
','
. Die Korridore haben eine zufĂ€llige Breite: 1, 2 oder 3. Eckkacheln dienen zur UnterstĂŒtzung der Navigation.
Wenn die TĂŒren an eine andere TĂŒr angrenzen, werden sie ĂŒbersprungen, und die Korridore können sich ĂŒberlappen, wodurch Sie die Einfachheit des Generators verbergen können.
Nach dem Aufzeichnen aller Korridore wird die ASCII-Karte gelöscht. Eckfliesen werden zu Wandfliesen, und Fliesen
' '
neben
','
ebenfalls zu WĂ€nden. SchlieĂlich werden die Zeichen
','
durch die Zeichen
'.'
. Also bekommen wir den unten gezeigten Dungeonplan.
#### #..# ###### #..# #....# #..# #....# #D## #....# #.# #D#### ##D#### #..# #.....# #..# ###.....# ##D######## #.D.....# #........# #.#.....# #........# ### #.##D#### #........# #.### #.##...# #........###.D.# #.##...# #........##..#.# #.##...# #........##..#.# #.##...# #........##..#.# #.##...# #........##..#.# #.##...# ###D#######..#.# #.##...# #.......#..#.# #.###D## ###.....#..### #.# #.# #######D##.# #.# #.# #....#.# #.# #.# #....D.# #.# #.# #....###### #.# #.# ##D####....## #.# #.# #...........# #.# #.# ####....###D####.# ### ######.....##.# #####.D.....##.# #...D.#.....D..# #####.#.....#### #########
Wie Sie sehen können, kann dieses Verfahren ziemlich viel leeren Raum auf der Karte lassen. Daher ist der nĂ€chste Schritt des Generators das âFĂŒllen der HohlrĂ€umeâ. Er sucht nach angrenzenden Wandabschnitten, auf die zusĂ€tzliche Bodenrechtecke geklebt werden können. Rechtecke können mindestens 5 Ă 5 und nicht gröĂer als 12 Ă 14 sein.
Das FĂŒllen der Leere wird fortgesetzt, bis mindestens 700 Kacheln erreicht sind oder die Wiederholungsgrenze erreicht ist. Wenn der Generator 700 Kacheln nicht erreicht hat, beginnt die Dungeonerzeugung bei Null.
Dies gibt uns den unten gezeigten Dungeon Blank.
########## #........# ########### #........# #.........# #........# #.........# #........# #.........# #### #........# #.........# #..# #######..###.........# #..# #..............# #..# #..............# #D## #..............# #.# #D####.........# ##D#### #..# ########### #.....# #..# ###.....# ##D######## #.D.....# #........# #.#.....# ########........# ### #.##D#### #...............# #.### #.##...# #...............###.D.# #.##...# #...............##..#.# #.##...# #...............##..#.# #.##...# #...............##..#.# #.##...# #...............##..#.# #.##...# #......###D#######..#.# #.##...# #......# #.......#..#.# #.###D## #......# ###.....#..### #.# #.# #......#########D##.# #.# #.# #.........# #....#.# #.# #.# #.........# #....D.# #.# #.# #.........# #....###### #.# #.# #.........# ##D####....## #.# #.# #.........# #...........# #.# #.# #.........# ####....###D####.# ### #.........# ######.....##.# #.........# #####.D.....##.# #.........# #...D.#.....D..# ########### #####.#.....#### #########
Dungeon
Auch hier unterscheiden sich die Katakomben von der Standardformel. Anstelle des Marschquadrat-Algorithmus (der Kacheln basierend auf 2 Ă 2 Quadraten des Dungeon-Rohlings zuweist) verwendet er ein eigenes Mustervergleichsverfahren, das jedes der 3 Ă 3-Rechtecke des Dungeon-Rohlings untersucht und das entsprechende Kachel fĂŒr den Dungeon auswĂ€hlt. Muster bestimmen, wie jedes DungeonplĂ€ttchen aussehen soll: eine Wand, ein Boden, eine TĂŒr, ein festes PlĂ€ttchen oder eine Kombination davon. Ich verstehe nicht ganz warum.
Der Rest der Funktion wird Ihnen aus der Kathedrale bekannt vorkommen. Treppen auf und ab werden auf der Karte platziert, der Dungeon wird auf die Möglichkeit eines vollstĂ€ndigen Durchgangs ĂŒberprĂŒft und verschiedene Korrekturen werden ebenfalls durchgefĂŒhrt. Wie im Abschnitt Allgemeine Funktionen beschrieben, werden RĂ€ume eingefĂŒgt, gefolgt von vielen Mini-Sets und Fliesenersatz.
Ich denke, dass Mini-Sets irgendwie die TĂŒren beeinflussen, aber es ist ziemlich langweilig, sie ohne Werkzeug zu lesen, deshalb habe ich mich nicht mit diesem Thema befasst.
Höhlen
Höhlenebenen sind mit weiten FreiflĂ€chen und Lavaströmen gefĂŒllt. Die WĂ€nde dieses Bereichs sind rau und wellig. Die einzigen rechteckigen Komponenten hier sind HolzgerĂŒste, die anscheinend spĂ€ter als die Höhlen selbst erschienen.
Diese Phase ist dank der animierten Lava eine der schönsten im Spiel. Man fĂŒhlt, dass es sich sehr von frĂŒheren Ebenen unterscheidet, die aus RĂ€umen bestehen. Daher war ich sehr ĂŒberrascht, dass der Hauptteil der Generation nach den Prinzipien der KathedralenbĂŒhne modelliert ist und die Karten mit kniffligen Tricks ein âHöhlenâ -Look erhalten.
Dungeon leer
Das Erstellen einer Höhlenebene beginnt mit einem zufÀlligen 2 à 2-Raum, der sich irgendwo in der NÀhe der Kartenmitte befindet. Der Generator ruft dann die Prozedur
DRLG_L3CreateBlock
fĂŒr jede Kante dieses Blocks auf.
Beim Zeichnen von Rechtecken auf dieser Ebene wird keine normale FĂŒllung verwendet. Die InnenrĂ€ume sind immer solide, aber jede Fliese an der Grenze hat eine 50% ige Chance, ein Boden zu werden, sonst bleibt sie solide.
DRLG_L3CreateBlock-Prozedur
- Diese Funktion erhÀlt den Rand des Rechtecks, d.h. Ausgangspunkt, Richtung und LÀnge.
- Die GröĂe des neu erstellten Blocks wird fĂŒr jede Seite im Bereich von 3-4 ausgewĂ€hlt.
- Der neue Block wird zufÀllig relativ zur Eingangsflanke platziert.
- Wenn nicht genĂŒgend Platz zum Zeichnen eines Blocks vorhanden ist, wird das Beenden ausgefĂŒhrt.
- Der Block wird gezeichnet.
- Mit einer Wahrscheinlichkeit von 1/4 wird die Ausgabe ausgefĂŒhrt.
DRLG_L3CreateBlock
wird DRLG_L3CreateBlock
fĂŒr drei Kanten aufgerufen, auĂer fĂŒr die, von der wir gekommen sind.
Obwohl dieses Verfahren
L5roomGen
Ă€hnelt,
L5roomGen
durch die Verwendung viel kleinerer BlockgröĂen und das Zeichnen rauer RĂ€nder viel organischer. DarĂŒber hinaus enthĂ€lt es keinen Rand von 1 Kachel fĂŒr WĂ€nde, sodass im Gegensatz zu frĂŒheren Generatoren Schleifen erstellt werden können.
Nach dem Erstellen einer groben Skizze der Dungeonform wendet der Generator die Erosionsverfahren an:
- Erstens findet er Bereiche von 2 Ă 2 Kacheln mit diagonal gegenĂŒberliegenden festen Kacheln. Es ist oft schwierig, mit solchen Formationen zu arbeiten, wenn Marschquadrate ausgefĂŒhrt werden, daher wird eine der festen Kacheln zufĂ€llig durch das Geschlecht ersetzt.
- Alle massiven Einzelfliesen, die von 8 Bodenfliesen umgeben sind, werden durch eine Bodenfliese ersetzt.
- Alle langen und geraden Wandabschnitte werden zufÀllig aufgeraut, indem 50% der WÀnde durch Bodenfliesen ersetzt werden.
- Diagonalen von durchgehenden Kacheln werden wiederholt entfernt.
Bei all diesen Verfahren werden mehr Bodenfliesen hinzugefĂŒgt, sodass die Karte offener wird.
Wenn es weniger als 600 Bodenfliesen hat, wird die Karte neu generiert.
Dungeon
Dungeon-Rohlinge werden mithilfe von Marschquadraten in Kacheln umgewandelt. Im Gegensatz zu Kathedrale und Katakomben ist das Kachelset hier viel praktischer und enthĂ€lt fast alle Kombinationen, die fĂŒr MarschplĂ€tze benötigt werden. Es gibt keine Fliesen fĂŒr diagonal gegenĂŒberliegende WĂ€nde, aber sie wurden in der WerkstĂŒckphase entfernt, sodass sie nie erscheinen.
Dann gibt es wie immer viele Mini-Sets. Der Code enthÀlt mehrere Mini-Sets, die einen separaten Wandabschnitt definieren und durch Stalagmiten und Böden ersetzen, wodurch die Offenheit der RÀume erhöht wird.
Lavaseen werden hinzugefĂŒgt. Der Algorithmus sucht mithilfe von
fill nach einem angrenzenden Wandabschnitt. Wenn es ihm gelingt, einen Abschnitt von WÀnden / festen Fliesen mit weniger als 40 Fliesen zu finden, die vollstÀndig von Bodenfliesen umgeben sind, werden sie durch Lava ersetzt. Wenn der Lavasee nicht gefunden werden kann, beginnt die Erzeugung des Verlieses von neuem.
Eine 3 Ă 3 Wand verwandelt sich in einen LavaseeDann werden mehrere Lavaströme hinzugefĂŒgt. Der Generator unternimmt mehrere Versuche, einen Fluss zu zeichnen, der am Lavasee beginnt und an der Wand endet. Die folgenden Anforderungen werden an den Fluss gestellt: Er sollte sich nicht selbst kreuzen, der Fluss hat eine LĂ€nge von 7-100 Kacheln und es sollte ein geeigneter Platz fĂŒr die BrĂŒcke darauf sein. Das BrĂŒckenplĂ€ttchen sorgt dafĂŒr, dass die gesamte Karte passierbar bleibt. Wenn auf der Karte Platz ist, können bis zu vier FlĂŒsse hinzugefĂŒgt werden.
Dann werden Themenzimmer platziert. In diesem Stadium sind die WĂ€nde der thematischen RĂ€ume HolzzĂ€une, durch die Sie nicht gehen können, aber Sie können beobachten. HolzzĂ€une werden auch in den beiden folgenden Verfahren verwendet. Der erste setzt einen Zaun auf alle verbleibenden Abschnitte der WĂ€nde mit ziemlich langen geraden Abschnitten. Der zweite zeichnet eine Reihe von ZĂ€unen auf der Karte von einer Wand zur anderen und setzt dann die TĂŒr ein. Im Gegensatz zum Verfahren zum Erzeugen einer Kathedrale werden keine Ecken gesucht, um mit dem Erstellen dieser WĂ€nde zu beginnen.
Hölle
Die Hölle ist die letzte Stufe von Diablo. Dabei liegt der Schwerpunkt bereits auf Monstern, und die Gestaltung von Levels bleibt auf der Strecke. Diese BĂŒhne hat das kleinste Kachelset von allen und das meiste davon wird fĂŒr groĂe Treppen und Pentagramme verwendet. Die höllischen Ebenen bestehen normalerweise aus mehreren quadratischen RĂ€umen und sind symmetrisch angeordnet.
Dungeon leer
Die Höllengenerierung beginnt mit einem zufĂ€lligen Raum von 5-6 Kacheln auf jeder Seite (mehr, wenn es ein fertiges Fragment fĂŒr die Quest gibt), und dann wird das gleiche rekursive Knospen angewendet wie in der Kathedrale. Die Erzeugung ist jedoch auf 20 Ă 20 begrenzt.
Ein vertikaler und horizontaler Korridor wird hinzugefĂŒgt, der bis zum Rand des 20 Ă 20-Bereichs gespannt ist.
Dann wird der Dungeon-Rohling horizontal und vertikal gespiegelt, um die volle GröĂe zu erhalten.
Dungeon
Dungeon-Rohlinge werden mithilfe von Marschquadraten wieder in Kacheln umgewandelt. Dann werden Ă€hnlich wie bei der Schaffung der Kathedrale Mauern hinzugefĂŒgt, wie in Katakomben und Höhlen.
Fazit
Ich habe es wirklich genossen, diesen Code zu lesen. Obwohl es offensichtlich Fehler gibt, die Namen zufÀllig zugewiesen werden und einige Teile nicht in qualitativ hochwertigem Quellcode neu erstellt werden können, ist deutlich zu erkennen, dass dieser Code einen ernsthaften Test im Kampf bestanden hat und voller kluger Ideen ist.
Hier sind die wichtigsten Lektionen fĂŒr mich:
- Der Teufel steckt im Detail: Die einzelnen Komponenten sind nicht wahnsinnig komplex, aber wenn sie kombiniert werden, ergeben sie etwas Wunderbares. Ich kann mir vorstellen, wie die Entwickler ĂŒber die Verbesserung der QualitĂ€t nachgedacht haben, bis sich das Niveau von gut auf erstaunlich geĂ€ndert hat. Die Anzahl der Kacheln und die kombinatorische KomplexitĂ€t der KachelsĂ€tze ist ebenfalls sehr hoch - es ist unmöglich, dies zu implementieren, ohne darauf zu achten, wie die Elemente verbunden sind.
- Das Suchen und Ersetzen fĂŒr den Mustervergleich ist ein sehr leistungsfĂ€higes Werkzeug, mit dem Sie viele verschiedene Effekte implementieren können. Es behebt Generationsfehler, fĂŒgt VariabilitĂ€t hinzu, fĂŒgt vorgefertigte Inhalte ein, verwaltet Erosion und vieles mehr.
- Die Aufteilung der Dungeon-Generierung in die PassabilitÀtskarte (Dungeon-Vorbereitung) und die Kachel-Generierung ist sowohl in Bezug auf das Design als auch in Bezug auf das Debugging eine sehr bequeme Technik.
- , . , .
- , .