Diablo 1 adalah roguelike hack and slash klasik tahun 1996. Ini adalah salah satu upaya pertama yang berhasil untuk memperkenalkan massa kepada roguelike, yang sampai saat itu memiliki grafik khusus dalam bentuk seni ASCII. Gim ini menelurkan beberapa sekuel dan banyak simulasi. Dia dikenal karena suasananya yang gelap dan suram, menebal saat pemain turun ke ruang bawah tanah yang terletak di bawah kota Tristram. Itu adalah salah satu game pertama dengan pembuatan peta prosedural untuk saya, dan kemungkinan menghasilkan level yang dapat dipercaya seperti itu mengejutkan saya.
Baru-baru ini saya menemukan bahwa, karena ditemukannya berbagai file dengan simbol debugging, beberapa penggemar permainan mengambil tugas
rekayasa balik kode sumber untuk membersihkannya dan mencari tahu seperti apa bentuk kode yang ditulis oleh pengembang. Maka mulailah perjalanan saya selama seminggu ke dalam studi tentang bagaimana pengembang utama David Brevik menciptakan level-level ini. Mungkin karena ini, keajaiban permainan bagi saya sebagian runtuh, tetapi saya belajar banyak teknik yang akan berguna bagi pengembang game yang serupa, jadi dalam artikel ini saya akan membagikannya.
Terima kasih kepada David Brevik dan tim Blizard North yang telah menciptakan game yang luar biasa, serta
galaxyhaxz dan tim Devilution atas kerja luar biasa mereka dalam memulihkan kode sumber proyek yang dapat dibaca.
Pendahuluan
Diablo adalah game yang terdiri dari ubin isometrik. Permainan ini terdiri dari 4 tahap, yang masing-masing memiliki 4 level. Tahapan permainan: Katedral, Katakombe, Gua dan Neraka. Ada juga beberapa tingkat tetap, misalnya, kota Tristram, yang tidak akan saya pertimbangkan dalam artikel ini. Diablo memiliki prosedur pembuatan level terpisah untuk masing-masing dari 4 tahap, jadi saya pertama-tama akan berbicara tentang fitur mereka, dan kemudian mempertimbangkan secara terpisah pengoperasian masing-masing tahap.
Saya hanya tertarik pada bagaimana level dihasilkan. Untuk mempelajari tentang pencarian, monster, dll. Saya sarankan membaca
Jarulf's Guide To Diablo dan Hellfire , yang menjelaskan aspek-aspek ini secara rinci.
Fitur Umum
Meskipun setiap tahap memiliki generator level sendiri, mereka semua memiliki fitur umum.
Dungeons and Tiles
Setiap level permainan dihasilkan untuk mengisi kotak 40 x 40 ubin. Sumbu X sesuai dengan tenggara, dan sumbu Y sesuai dengan barat daya.
Ubin ini hanya digunakan untuk tugas pembuatan level. Setelah membuat level, setiap ubin dibagi menjadi 4 "fragmen penjara bawah tanah", yang ditampilkan di layar.
Kisi yang lebih detail ini digunakan untuk menentukan ubin yang dilalui dan juga menyediakan penggunaan kembali memori grafis yang lebih efisien. Sebelumnya, saya menulis tentang
skema pemisahan ubin .
Ini berarti bahwa kartu Diablo standar terdiri dari lebih dari seratus ubin, banyak di antaranya merupakan variasi kecil dari yang lain, untuk memperhitungkan semua cara yang memungkinkan untuk menghubungkannya. Kami akan membicarakan ini nanti.
Yang mengejutkan saya, tidak seperti game lain dalam seri ini, peta penjara bawah tanah tidak terdiri dari blok yang dibuat sebelumnya. Hampir semuanya dibuat dengan menggunakan algoritma.
Proses multi-tahap
Setiap prosedur pembuatan dungeon dibagi menjadi dua tahap. Pra-generasi tidak berurusan dengan pilihan ubin sama sekali. Ini hanya menghasilkan array di mana ubin lumayan, ubin di mana ada pintu, dan beberapa detail tingkat tinggi lainnya ditandai. Pada tahap kedua, ruang bawah tanah kosong ini diubah menjadi array ubin, setelah generasi dilakukan dan perubahan dilakukan dengan memperhitungkan ubin ini.
Ini harusnya sangat nyaman bagi perancang. Anda dapat bereksperimen dengan denah lantai yang sepenuhnya independen dari pilihan ubin dan gaya. Tetapi dalam banyak kasus, mereka saling berhubungan, memberikan rasa tingkat yang lebih holistik.
Semua tahap menciptakan ruang bawah tanah kosong dimulai dengan tingkat yang diisi dengan "kekerasan" yang solid, setelah itu masing-masing bagian tingkat secara rekursif berubah menjadi ubin lantai. Saya akan membahas ini secara lebih rinci di bawah ini.
Fragmen Selesai
Fragmen yang sudah jadi adalah blok level yang dibuat sebelumnya yang hanya disisipkan ke level yang dibuat secara acak. Mereka digunakan untuk sebagian besar pencarian gim. Di setiap level hanya ada satu fragmen yang sudah jadi, lokasi yang pada setiap tahap dipilih secara terpisah.
Butcher Den adalah salah satu cuplikan pra-dibuat pertama yang ditemukan dalam permainan.Set mini
Mini-kit adalah cara lain untuk menyisipkan konten ke tingkat konten yang dibuat sebelumnya. Ini adalah potongan-potongan kecil, biasanya berukuran sekitar 3 Γ 3, dimasukkan secara acak ke dalam penjara bawah tanah. Ada skema pencocokan pola yang sederhana, karena hanya muncul di tempat yang βbenarβ. Seringkali mereka dikodekan dengan persyaratan tambahan, misalnya, mini-set tidak dapat ditempatkan berdekatan satu sama lain, mereka tidak dapat tumpang tindih dengan fragmen yang sudah jadi, dan sebagainya. Beberapa mini-kit selalu mencari dan mengganti, sementara yang lain melakukan ini dengan probabilitas tetap.
Kit mini Diablo digunakan untuk berbagai tujuan. Mereka digunakan untuk menempatkan benda besar dari ubin, seperti tangga, untuk memperbaiki kombinasi ubin yang tidak terhubung dengan baik satu sama lain, dan untuk menambahkan variasi acak ke ubin.
Kamar tematik
Kamar bertema adalah ruang kecil yang dibatasi oleh dinding dan pintu. Biasanya di dalamnya secara acak benda-benda tertentu yang telah ditentukan berada. Sebagai contoh, perpustakaan selalu memiliki rak buku dengan dua lilin di setiap sisi, beberapa rak buku dan monster acak. Monster Lairs berisi banyak monster dan item acak, dan sebagainya.
Pada tingkat tahap athedral, generator menciptakan ruangan yang cocok yang dikenali dengan
mengisi dan digunakan kembali. Pada tahap lain, algoritma menemukan ruang terbuka di mana dinding dan pintu digambar untuk membuat kamar.
Setiap jenis ruang tematik memiliki persyaratan tertentu untuk ukuran dan tahap pembuatannya.
Penggantian ubin
Beberapa kartu memiliki adaptasi khusus ubin, tetapi semuanya memiliki fitur umum: beberapa ubin dapat diganti dengan variasi yang serupa. Ubin paling standar (misalnya, lantai dan dinding datar) memiliki berbagai variasi, yang mengurangi monoton tingkat. Penggantian ubin tidak pernah digunakan kembali berdampingan.
Perbandingan pola dan "koreksi"
Seperti disebutkan di atas, mini-set digunakan sebagai mekanisme pencarian dan penggantian yang memperbaiki kekurangan generator. Tetapi pada sebagian besar tahapan, ada prosedur yang mendeteksi dan memperbaiki masalah yang lebih spesifik. Saya tidak akan merinci, karena hanya ada banyak dari mereka. Cukuplah untuk mengatakan bahwa Diablo cukup buggy, dan lebih dekat dengan rilis itu menjadi jelas bahwa akan lebih mudah untuk menambahkan pengakuan masalah spesifik daripada menghilangkan penyebab mendasar mereka.
Salah satu "perbaikan" yang paling umum adalah "penguncian": itu memeriksa apakah mungkin untuk melewati seluruh ruang bawah tanah, dan memulai generasi lagi jika tidak.
Quests
Sebagian besar pencarian dibuat menggunakan fragmen siap pakai, tetapi beberapa menggunakan logika mereka sendiri. Misalnya, Zhar the Mad membuat ruang perpustakaan tematik, pintu masuk ke Poisoned Water dihasilkan oleh panggilan mini, dan Anvil of Fury memiliki kode generasi level tertentu. Saya tidak akan merinci, tetapi kode ini penuh dengan pemeriksaan serupa untuk pencarian.
Katedral
Katedral mungkin adalah yang paling ikonik dari tahapan Diablo. Ini ditandai dengan barisan panjang lengkungan Gothic, kamar sempit dan banyak kemacetan dalam bentuk pintu. Mari kita lihat bagaimana itu dibuat.
Ruang bawah tanah kosong
Hal pertama yang dilakukan algoritma adalah menggambar inti kartu. Dia secara acak memilih hingga tiga kamar 10 Γ 10 dalam posisi yang telah ditentukan di sepanjang sumbu pusat X atau Y. Sebuah koridor lebar yang menghubungkan kamar-kamar juga digambar di sepanjang sumbu. Jika ada bagian yang selesai pada tingkat, maka selalu terletak di tengah salah satu kamar ini. Kamar-kamar bawah tanah pusat ini ditandai sebagai tidak cocok untuk dinding baru, sehingga mereka selalu tetap ruang terbuka yang besar.
Semua kamar lain dihasilkan oleh teknik tunas rekursif dalam fungsi yang disebut
L5roomGen
, yang dipicu di masing-masing kamar ini, dan dengan memilih sumbu.
Fungsi L5roomGen
- Dia melewati persegi panjang ruang asli, dari mana Anda harus mulai bertunas, serta sumbu yang disukai.
- Dengan probabilitas 1/4, sumbu yang diinginkan berubah.
- Ukuran acak dari ruangan baru dipilih, dengan 2, 4 atau 6 ubin di setiap sisi.
- Untuk setiap sisi ruang asli sepanjang sumbu yang dipilih (mis. SE / NS untuk X, SW / NE untuk Y):
- Persegi panjang ruangan baru sejajar dengan pusat tepi ruang asli
- Cek dilakukan sebelum ada tidak ada yang ditarik dan kami tidak mencapai akhir peta. Dinding membutuhkan batas satu ubin.
- Jika cek berhasil, sebuah kamar ditarik.
- Untuk setiap kamar yang akan
L5roomGen
, L5roomGen
secara rekursif disebut, yang melewati ruang baru dan sumbu yang berlawanan dengan yang digunakan sebelumnya.
Pada akhirnya, prosedur ini dimulai dengan beberapa ruangan terpotong di dalam ubin "solid", dan kemudian berulang kali menempel persegi panjang baru untuk memotong area lumayan baru. Pada tahap ini, semua "kamar" terbuka di satu sisi, karena setiap kamar baru terletak tepat di sebelah yang sebelumnya, tanpa melewati untuk menempatkan dinding.
Kemudian generator menghitung jumlah ubin yang dilalui yang dihasilkan. Jika di bawah ambang minimum, yang meningkat dengan setiap level, penjara bawah tanah dihancurkan dan upaya generasi dilakukan lagi.
Penjara bawah tanah
Sejauh ini, algoritme hanya memiliki ubin "solid" dan gender. Kita harus menggantinya dengan ubin dinding asli. Untuk ini, Diablo menggunakan algoritma kotak marching, yang saya
jelaskan di artikel sebelumnya .
Namun, gim ini menggunakan variasi yang tidak biasa. Ubin katedral berisi dinding, tetapi selalu terletak di ujung ubin. Oleh karena itu, ada ubin dengan dinding di tepi timur laut, tetapi tidak ada ubin dengan dinding di tepi tenggara. Untuk membuat dinding di sisi lain, Anda perlu menemukan ubin "solid" yang memiliki dinding tambahan yang memanjang keluar dari perbatasan ubin. Kedengarannya aneh, tetapi sebenarnya sangat nyaman untuk menyortir dinding dengan kedalaman.
Untuk mengatasinya, Diablo melompati beberapa dinding selama fase kubus berbaris:
Dinding tambahan ditambahkan kemudian, pada tahap "perbaikan". Saya pikir prosedur sederhana ini paling memengaruhi "gaya" katedral. Karena dinding yang berlawanan melekat pada ubin padat, dalam hal dua kamar dipisahkan oleh satu ubin dinding, dinding yang berlawanan tidak akan dibuat. Ini berarti bahwa pembagi antara kamar "lebih tipis" daripada yang biasanya Anda dapatkan dalam resolusi di mana kotak marching dieksekusi.
Setelah menempatkan dinding utama, generator menambahkan empat kolom yang berdiri bebas untuk masing-masing kamar pusat dan barisan tiang lengkung untuk koridor tengah. Ini memungkinkan Anda memberi katedral rasa desain yang lebih serius daripada level lain, dan juga membantu pemain menavigasi.
Generator kemudian secara acak menambahkan dinding pemisah. Dinding pemisah selalu lurus sepanjang sumbu dari satu dinding ke dinding lainnya. Mereka mulai dari sudut, sehingga area indah dibagi menjadi kamar. Dalam 25% kasus, dinding adalah serangkaian lengkungan, dalam 25% kasus itu adalah serangkaian lengkungan dengan kisi-kisi yang menghalangi pintu masuk, dan dalam semua kasus lainnya adalah dinding yang kokoh. Dalam kasus kisi-kisi dan dinding kokoh, di suatu tempat di sepanjang dinding pemisah, sebuah pintu atau lengkungan ditambahkan secara acak untuk membuat ruang tersebut bisa dilewati.
Prosedur pengisian mendeteksi ruangan bertema potensial.
Tangga ditempatkan untuk terhubung ke level lain. Jika tidak mungkin untuk menempatkan mereka, maka upaya untuk menghasilkan penjara bawah tanah dimulai lagi.
Adapun pengaturan mini-set, "perbaikan" dan penggantian, saya tidak akan mempertimbangkannya secara rinci. Yang terpenting, saya suka mini-kit PANCREAS1, yang memiliki peluang 1% untuk menaruh tumpukan daging berdarah di ubin lantai. Pada akhirnya, 5-10 benda lampu ditempatkan di atasnya untuk menghias penjara bawah tanah.
Katakombe
Berbeda dengan Katedral, yang tampaknya merupakan bangunan yang dirancang, Catacombs terasa jauh lebih spontan. Mereka ditandai oleh kamar-kamar persegi yang saling terhubung oleh banyak koridor berliku. Di banyak tempat, bukannya pintu, bukaan lebar berada. meningkatkan kemungkinan bahwa pemain akan dikelilingi oleh banyak musuh.
Algoritma generasi paling kompleks dalam game digunakan untuk menghasilkan katakombe. Saya menduga bahwa kurangnya waktu telah memaksa pengembang untuk menerapkan solusi yang lebih sederhana di tahap selanjutnya.
Ruang bawah tanah kosong
Prosedur untuk membuat ruang bawah tanah kosong untuk katakombe cukup unik. Pada semua tahap lain, ada nilai Boolean tunggal yang menunjukkan ada atau tidak adanya jenis kelamin (ditambah satu set bit untuk detail tambahan). Catacombs menyimpan ruang bawah tanah kosong dalam bentuk kartu ASCII, hampir seperti roguelike klasik. Dan ini tidak terlalu mengejutkan mengingat pengakuan
David Brevik bahwa ia mendapatkan inspirasi untuk Diablo dari Angband .
Generator ruang utama lagi adalah algoritma rekursif, tetapi kali ini partisi rekursif. Fungsi
CreateRoom
dipanggil untuk seluruh area penjara bawah tanah 40 Γ 40 minus 1 ubin perbatasan.
Fungsi CreateRoom
- Fungsi
CreateRoom
dilewatkan persegi panjang yang menunjukkan area di mana Anda ingin menghasilkan kamar. Detail juga diteruskan ke fungsi tentang ruang asli (awalnya nol) - Jika area terlalu sempit, fungsi keluar.
- Ukuran acak dipilih untuk ruangan dari 4 hingga 9 ubin di setiap sisi, dengan mempertimbangkan ukuran maksimum area di mana Anda ingin menempatkan ruangan.
- Di area tersebut, posisi acak dipilih untuk menempatkan ruangan.
- Ruangan dirender pada peta ASCII. Dalam gambar, simbol
'.'
ubin lantai ditunjukkan, simbol '#'
adalah dinding di sekitarnya, dan huruf 'A'
, 'B'
, 'C'
dan 'E'
adalah empat sudutnya. - Jika kamar memiliki ruang sumber:
- Ubin acak dipilih di tepi terdekat ruang asli dan baru.
- Informasi ini dicatat dalam daftar koridor, yang akan digunakan nanti.
- Bagian yang tersisa dari daerah itu, dengan pengecualian ruangan saat ini, dipotong, menciptakan empat persegi panjang.
- Ukuran setiap persegi panjang dikurangi oleh dua ubin untuk membuat ruang antara kamar, dan kemudian fungsi
CreateRoom
disebut secara rekursif, wilayah yang digunakan persegi panjang ini, dan ruang yang dibuat sebagai sumber.
Jika ada fragmen yang selesai pada peta, itu akan selalu berada di ruang pertama yang dibuat oleh CreateRoom, dan dimensinya dibuat sehingga fragmen ini ditempatkan di dalamnya.
Setelah memanggil
CreateRoom
mendapatkan larik ASCII yang mirip dengan yang ditunjukkan di bawah ini (terima kasih
nomdenom untuk mengekstraksinya dari kode):
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
Dalam hal ini, ruang "root", awalnya dibuat, adalah yang terendah.
Kemudian informasi koridor yang dikumpulkan sebelumnya diterapkan. Garis digambar di antara setiap pasangan poin yang direkam. Ketika melintasi dinding,
'D'
ditulis, dan ketika melintasi ubin padat,
','
. Koridor memiliki lebar acak: 1, 2 atau 3. Ubin sudut digunakan untuk membantu navigasi.
Jika pintu berdekatan dengan pintu lain, maka mereka dilewati, dan koridor dapat saling tumpang tindih, yang memungkinkan Anda untuk menyembunyikan kesederhanaan generator.
Setelah merekam semua koridor, kartu ASCII dihapus. Ubin sudut menjadi ubin dinding, dan ubin
' '
sebelah
','
juga menjadi dinding. Akhirnya, karakter
','
diganti oleh karakter
'.'
. Jadi kita mendapatkan rencana penjara bawah tanah yang ditunjukkan di bawah ini.
#### #..# ###### #..# #....# #..# #....# #D## #....# #.# #D#### ##D#### #..# #.....# #..# ###.....# ##D######## #.D.....# #........# #.#.....# #........# ### #.##D#### #........# #.### #.##...# #........###.D.# #.##...# #........##..#.# #.##...# #........##..#.# #.##...# #........##..#.# #.##...# #........##..#.# #.##...# ###D#######..#.# #.##...# #.......#..#.# #.###D## ###.....#..### #.# #.# #######D##.# #.# #.# #....#.# #.# #.# #....D.# #.# #.# #....###### #.# #.# ##D####....## #.# #.# #...........# #.# #.# ####....###D####.# ### ######.....##.# #####.D.....##.# #...D.#.....D..# #####.#.....#### #########
Seperti yang Anda lihat, prosedur ini dapat menyisakan cukup banyak ruang kosong di peta. Oleh karena itu, langkah selanjutnya dari generator adalah "mengisi rongga". Dia mencari setiap bagian dinding yang berdekatan dengan lantai persegi tambahan yang dapat direkatkan. Persegi panjang bisa berukuran setidaknya 5 Γ 5 dan tidak lebih dari 12 Γ 14.
Pengisian batal berlanjut hingga minimal 700 ubin diperoleh, atau batas coba lagi tercapai. Jika generator gagal mencapai 700 ubin, maka generasi dungeon dimulai dari nol.
Ini memberi kami ruang bawah tanah kosong yang ditunjukkan di bawah ini.
########## #........# ########### #........# #.........# #........# #.........# #........# #.........# #### #........# #.........# #..# #######..###.........# #..# #..............# #..# #..............# #D## #..............# #.# #D####.........# ##D#### #..# ########### #.....# #..# ###.....# ##D######## #.D.....# #........# #.#.....# ########........# ### #.##D#### #...............# #.### #.##...# #...............###.D.# #.##...# #...............##..#.# #.##...# #...............##..#.# #.##...# #...............##..#.# #.##...# #...............##..#.# #.##...# #......###D#######..#.# #.##...# #......# #.......#..#.# #.###D## #......# ###.....#..### #.# #.# #......#########D##.# #.# #.# #.........# #....#.# #.# #.# #.........# #....D.# #.# #.# #.........# #....###### #.# #.# #.........# ##D####....## #.# #.# #.........# #...........# #.# #.# #.........# ####....###D####.# ### #.........# ######.....##.# #.........# #####.D.....##.# #.........# #...D.#.....D..# ########### #####.#.....#### #########
Penjara bawah tanah
Sekali lagi, katakombe berbeda dari rumus tingkat standar. Alih-alih algoritma kotak marching (yang menetapkan ubin berdasarkan kotak 2x2 dari ruang bawah tanah kosong), ia menggunakan prosedur pencocokan pola sendiri, yang memeriksa masing-masing dari 3 Γ 3 persegi panjang dari ruang kosong dan memilih ubin yang sesuai untuk ruang bawah tanah. Pola menentukan apa yang harus setiap ubin penjara bawah tanah: dinding, lantai, pintu, ubin padat, atau kombinasi daripadanya. Saya tidak mengerti mengapa.
Sisa dari fungsi tersebut akan terasa akrab bagi Anda dari Katedral. Tangga naik dan turun ditempatkan di peta, penjara bawah tanah diperiksa untuk kemungkinan bagian yang lengkap, dan berbagai koreksi juga dilakukan. Seperti dijelaskan di bagian Fitur Umum, kamar dimasukkan, diikuti oleh banyak set mini dan penggantian ubin.
Saya pikir bahwa mini-set entah bagaimana mempengaruhi pintu, tetapi mereka cukup membosankan untuk dibaca tanpa alat, jadi saya tidak mempelajari topik ini.
Gua
Tingkat gua dipenuhi dengan ruang terbuka yang luas dan sungai lava. Dinding area ini kasar dan bergelombang. Satu-satunya komponen persegi panjang di sini adalah perancah kayu, yang tampaknya muncul lebih lambat dari gua itu sendiri.
Tahap ini adalah salah satu yang paling indah di dalam gim ini berkat animasi lava. Orang merasa bahwa itu sangat berbeda dari lantai sebelumnya yang terdiri dari kamar. Oleh karena itu, saya sangat terkejut bahwa bagian utama dari generasi ini dimodelkan sesuai dengan prinsip-prinsip panggung Katedral, dan kartu diberi tampilan yang lebih "gua" menggunakan trik rumit.
Ruang bawah tanah kosong
Membuat level gua dimulai dengan satu ruangan 2 Γ 2 acak yang terletak di suatu tempat dekat dengan pusat peta. Generator kemudian memanggil prosedur
DRLG_L3CreateBlock
untuk setiap tepi blok ini.
Saat menggambar persegi panjang pada level ini, isian normal tidak digunakan. Interior selalu solid, tetapi setiap ubin di perbatasan memiliki peluang 50% untuk menjadi lantai, jika tidak tetap solid.
Prosedur DRLG_L3CreateBlock
- Fungsi ini mendapatkan tepi kotak, mis. titik awal, arah dan panjang.
- Ukuran blok yang baru dibuat dipilih dalam kisaran 3-4 untuk setiap sisi.
- Blok baru ditempatkan secara acak relatif ke tepi input.
- Jika tidak ada cukup ruang untuk menggambar blok, maka keluar dilakukan.
- Blok ditarik.
- Dengan probabilitas 1/4, output dieksekusi.
DRLG_L3CreateBlock
disebut DRLG_L3CreateBlock
untuk tiga sisi, selain yang kami DRLG_L3CreateBlock
.
Meskipun prosedur ini mirip dengan
L5roomGen
, menggunakan ukuran blok yang jauh lebih kecil dan menggambar batas kasar memberikannya tampilan yang jauh lebih organik. Selain itu, itu tidak termasuk perbatasan 1 ubin untuk dinding, oleh karena itu, tidak seperti generator sebelumnya, dapat membuat loop.
Setelah membuat sketsa kasar bentuk dungeon, generator menerapkan prosedur erosi:
- Pertama, ia menemukan area 2 Γ 2 ubin dengan ubin padat diagonal berlawanan. Seringkali sulit untuk bekerja dengan formasi seperti itu ketika melakukan pawai, sehingga salah satu ubin padat diganti secara acak berdasarkan gender.
- Semua ubin tunggal solid yang dikelilingi oleh 8 ubin lantai diganti dengan ubin lantai.
- Semua bagian dinding yang panjang dan lurus dikasar secara acak dengan mengganti 50% dinding dengan ubin lantai.
- Diagonal dari ubin terus menerus dihilangkan berulang kali.
Semua prosedur ini menambahkan lebih banyak ubin lantai, sehingga peta menjadi lebih terbuka.
Jika memiliki kurang dari 600 ubin lantai, maka peta dibuat ulang.
Penjara bawah tanah
Kosong penjara bawah tanah dikonversi ke ubin menggunakan kotak marching. Tidak seperti Cathedral dan Catacombs, tileset jauh lebih nyaman di sini, dan berisi hampir semua kombinasi yang diperlukan untuk marching square. Tidak ada ubin untuk dinding diagonal berlawanan di dalamnya, tetapi mereka dihilangkan dalam fase benda kerja, sehingga mereka tidak pernah muncul.
Lalu, seperti biasa, ada banyak set mini. Kode memiliki beberapa set mini yang menentukan bagian dinding yang terpisah dan menggantinya dengan stalagmit dan lantai, yang meningkatkan keterbukaan ruang.
Danau lava ditambahkan. Algoritma mencari bagian dinding yang berdekatan menggunakan
isian . Jika ia berhasil menemukan bagian dinding / ubin padat kurang dari 40 ubin yang sepenuhnya dikelilingi oleh ubin lantai, maka mereka diganti dengan lava. Jika danau lava tidak dapat ditemukan, maka generasi dungeon mulai lagi.
Dinding 3 Γ 3 berubah menjadi danau lavaKemudian ditambahkan beberapa sungai lava. Generator membuat beberapa upaya untuk menggambar sungai mulai dari danau lava dan berakhir di dinding. Persyaratan berikut diberlakukan pada sungai: tidak boleh menyeberang sendiri, sungai memiliki panjang 7-100 ubin, dan harus ada tempat yang cocok untuk jembatan di atasnya. Ubin jembatan memastikan bahwa seluruh peta tetap bisa dilewati. Jika ada ruang di peta, dapat ditambahkan hingga empat sungai.
Kemudian ditempatkan kamar bertema. Pada tahap ini, dinding kamar tematik adalah pagar kayu, yang melaluinya Anda tidak bisa melewatinya, tetapi Anda bisa menyaksikannya. Pagar kayu juga digunakan dalam dua prosedur berikut. Yang pertama menempatkan pagar di semua bagian dinding yang tersisa, memiliki bagian lurus yang cukup panjang. Yang kedua menggambar garis pagar di peta, dari satu dinding ke seberang, dan kemudian menyisipkan pintu. Berbeda dengan prosedur untuk membuat katedral, ia tidak mencari sudut untuk mulai membuat dinding ini.
Neraka
Neraka adalah tahap terakhir dari Diablo. Di dalamnya, penekanan utama sudah pada monster, dan desain level berjalan di pinggir jalan. Tahap ini memiliki tileset terkecil dari semua, dan sebagian besar digunakan untuk tangga besar dan pentagram. Tingkat neraka biasanya terdiri dari beberapa kamar persegi dan memiliki tata letak simetris.
Ruang bawah tanah kosong
Generasi neraka dimulai dengan ruang acak 5-6 ubin di setiap sisi (lebih jika ada fragmen siap pakai untuk pencarian di dalamnya), dan kemudian penanaman rekursif yang sama diterapkan seperti di Katedral. Namun, generasi dibatasi hingga 20 Γ 20.
Koridor vertikal dan horizontal ditambahkan, membentang ke tepi area 20 Γ 20.
Kemudian ruang bawah tanah kosong dicerminkan secara horizontal dan vertikal untuk mendapatkan ukuran penuh.
Penjara bawah tanah
Kosong penjara bawah tanah dikonversi kembali ke ubin menggunakan kotak marching. Kemudian, mirip dengan penciptaan Katedral, dinding ditambahkan, seperti di Catacombs dan Gua.
Kesimpulan
Saya sangat menikmati membaca kode ini. Meskipun jelas ada bug di dalamnya, nama-nama tersebut ditetapkan secara acak, dan beberapa bagian tidak dapat dibuat ulang dalam kode sumber berkualitas tinggi, jelas terlihat bahwa kode ini lulus ujian serius melalui pertempuran dan penuh dengan ide-ide cerdas.
Inilah pelajaran paling penting bagi saya:
- Iblis ada dalam perinciannya: komponen-komponen individual tidaklah rumit, tetapi ketika digabungkan, mereka memberikan sesuatu yang luar biasa. Saya bisa membayangkan bagaimana para pengembang meneliti peningkatan kualitas sampai tingkat berubah dari hanya baik menjadi luar biasa. Jumlah ubin dan kompleksitas kombinatorial dari tileset juga sangat tinggi - tidak mungkin untuk menerapkan ini tanpa memperhatikan bagaimana elemen-elemen terhubung.
- Cari dan ganti untuk pencocokan pola adalah alat yang sangat ampuh yang dengannya Anda dapat menerapkan banyak efek berbeda. Ini memperbaiki bug generasi, menambahkan variabilitas, menyisipkan konten yang dibuat sebelumnya, mengelola erosi dan banyak lagi.
- Membagi generasi penjara bawah tanah menjadi peta kelaikan (persiapan penjara bawah tanah) dan generasi ubin juga merupakan teknik yang sangat mudah, baik dari segi desain dan debugging.
- , . , .
- , .