Menghasilkan ruang bawah tanah di Binding of Ishak



Binding of Isaac dan pembuatan ulangnya Binding Of Isaac: Rebirth adalah beberapa game favorit saya. Mereka termasuk dalam genre penembak tongkat kembar roguelite dan sangat mirip dengan Enter the Gungeon .



Ruang bawah tanah yang dihasilkan oleh game-game ini sangat terkenal. Saya telah melihat banyak sekali tutorial di Internet tentang cara membuat generasi gaya Isaac, tetapi saya bertanya-tanya bagaimana penerapannya dalam bahasa aslinya. Yang mengejutkan saya, sebagian besar tutorial menjelaskan prosesnya secara tidak benar. Pada artikel ini saya akan berbicara tentang cara kerja generasi dan menunjukkan contohnya dalam demo Javascript.



Meskipun saya harus mendekompilasi dan menyegarkan kembali pengetahuan Flash saya yang berdebu (saya pernah menulis decompiler Actionscript saya sendiri), saya juga sangat beruntung: pengembang IsaacFlorian Himsl dan salah satu pengembang inti dari Rebirth, Simon Parser , dengan senang hati menjawab pertanyaan saya. Faktanya, Florian bahkan baru-baru ini merekam video yang menjelaskan algoritme. Di channelnya, Anda juga bisa mengetahui detail perkembangan game barunya Squid Invaders.



Mengingat kehadiran ceritanya, artikel saya bisa dianggap mubazir, tapi kalau mau detail berdarah, lanjutkan membaca.



Algoritme dasar



Pengembang Isaac sangat terinspirasi oleh game 2D dalam seri Zelda dan menghasilkan peta yang mirip dengan ruang bawah tanah mereka.





Ini adalah satu set kamar persegi yang dihubungkan oleh ujung satu sama lain. Beberapa kamar istimewa - selalu ada toko , ruang harta karun, dan bos di setiap lantai ; Selain itu, beberapa kamar khusus lainnya dipilih secara acak. Kecuali ruang rahasia , tidak ada loop di ruang bawah tanah.



Permainan itu sendiri terdiri dari bagian linier dari level seperti itu, biasanya ada dua di antaranya per "bab". Dalam proses melewati, peta menjadi sedikit lebih besar, dan isi ruangan berubah, tetapi algoritma untuk membuat strukturnya, pada kenyataannya, tetap sama setiap saat.



Versi pertama Isaac dikembangkan dalam waktu kurang dari 3 bulan, jadi Himslu harus menggunakan waktunya dengan sangat efisien. Desain dasar gim ini ramping dan sederhana. Pertama, denah lantai (tingkat) dibuat. Kemudian beberapa kamar dipilih sebagai kamar istimewa. Kemudian interior setiap kamar dipilih dari kolam yang sesuai.



Rencana denah



Isaac dibuat pada grid 9x8. Untuk memudahkan, sel dilambangkan dengan angka - sel menunjukkan posisi X, puluhan - posisi Y. Ini berarti Anda dapat bergerak ke atas, bawah, kiri dan kanan, cukup dengan menambahkan +10, -10, +1 dan -1. Sel dengan posisi X 0 tidak digunakan (selalu kosong), yang berarti sebagian besar kode tidak perlu mengkhawatirkan batas peta. Artinya, sel kiri atas pada peta adalah 01, dan kanan bawah adalah 79.



Denah lantai hanya menentukan sel mana yang akan berisi ruangan - isi ruangan akan dipilih nanti.



Pertama, rumus random(2) + 5 + level * 2.6menentukan jumlah ruangan. Itu. level dimulai dengan 7 atau 8 kamar dan meningkat 2 atau 3 kamar setiap kali.



Permainan kemudian menempatkan ruang awal (sel 35) dalam antrian. Kemudian dia secara siklik melewati antrian. Untuk setiap sel dalam antrian, ia berputar melalui 4 arah utama dan melakukan hal berikut:



  • Menentukan sel yang berdekatan dengan menambahkan + 10 / -10 / + 1 / -1 ke sel saat ini.
  • Jika sel yang berdekatan sudah ditempati, maka game tidak melakukan apa pun.
  • Jika sel tetangga itu sendiri memiliki lebih dari satu tetangga yang terisi, maka permainan tidak melakukan apa pun.
  • Jika sudah ada cukup ruangan di level tersebut, game tidak melakukan apa pun.
  • Gim ini tidak melakukan apa pun dengan probabilitas 50%.
  • Jika tidak, game menandai sel yang berdekatan sebagai berisi ruangan dan menambahkannya ke antrean.


Jika sebuah sel tidak menambahkan ruang ke salah satu sel yang berdekatan, maka itu adalah jalan buntu dan dapat ditambahkan ke daftar ruang tujuan untuk digunakan lebih lanjut.



Jika peta memerlukan lebih dari 16 ruangan, ruang awal harus antri kembali secara berkala untuk merangsang pertumbuhan.



Karena algoritme yang dijelaskan di atas dimulai dengan satu ruangan dan berkembang ke luar berkali-kali, ini pada dasarnya adalah eksplorasi pertama yang luas. Pembatasan tersebut tidak memperbolehkan sebuah ruangan untuk ditambahkan jika sudah ada dua tetangga yang membagi ruangan menjadi koridor terpisah yang tidak pernah bersatu dalam loop.



Denah lantai kemudian diperiksa konsistensinya. Itu harus berisi jumlah ruangan yang diperlukan, dan ruang bos tidak boleh terletak di sebelah ruang awal. Jika tidak, generasi dimulai kembali.



Kamar khusus



Ruang bos ditempatkan dengan membaca item terakhir dari daftar ruang akhir. Karena kenyataan bahwa pembangkitan dilakukan sebagai pertumbuhan ke luar, maka akan selalu menjadi salah satu ruangan yang terletak paling jauh dari ruang awal.



Kemudian posisi ruang rahasia ditunjukkan. Kamar-kamar ini ditambahkan ke denah lantai; mereka adalah salah satu dari sedikit pengecualian dari aturan yang melarang penempatan kamar di samping beberapa kamar yang sudah ada. Faktanya, algoritme, sebaliknya, lebih suka menempatkannya seperti ini. Generator secara acak mencari sel kosong di sebelah setidaknya tiga ruangan dan bukan di dekat ruangan akhir. Jika dia tidak menemukannya setelah 300 kali percobaan, maka itu sedikit melemahkan kriteria pencarian, dan setelah 600 percobaan itu semakin melemahkannya. Prosedur ini memastikan bahwa ruang rahasia akan selalu ditempatkan di lantai, tetapi biasanya diapit di sebelah persimpangan, artinya selalu ada banyak kamar di sebelahnya.



Hampir semua ruang khusus lainnya terletak di ruang ujung acak. Beberapa kamar dijamin, yang lain memiliki peluang atau kriteria kecil. Misalnya, ruang pengorbanan muncul satu dari tujuh kali; jika pemain dalam kondisi kesehatan penuh, maka itu terjadi sekitar satu dari tiga kali.



Kamar biasa



Kamar-kamar yang berdekatan selalu memiliki pintu (atau dinding yang dapat dihancurkan) tepat di tengah, dan setiap kamar dirancang agar dapat diakses dari keempat arah. Oleh karena itu, tidak ada pertimbangan khusus yang diperlukan saat memilih kamar - kombinasi apa pun dapat digunakan.



Kamar dipilih secara acak dari kolam renang. Informasi tentang ruangan berisi struktur (lubang, api, batu, dll.) Dan monster. Keduanya tunduk pada variasi acak, seperti kemunculan monster juara dan perapian merah.



Untuk kamar biasa, ada tiga pool: easy, medium, dan hard. Tahap pertama dari bab ini memilih dari ruang sederhana dan sedang, dan yang kedua dari ruang sedang dan sulit. Bab pertama (Basement) berisi 174 kamar biasa di kolam renang. "Alternate Chapters" seperti Cellar, yang secara acak menggantikan Basement, memiliki ruangan yang sedikit berbeda.



Kutukan labirin



Salah satu fitur tambahan yang paling menarik dari kode ini adalah peta berukuran ganda. Mereka dibuat secara acak dan hanya untuk beberapa mode tantangan. Selain penggandaan jumlah ruangan khusus dan dua ruangan bos yang berdekatan, mereka juga memiliki banyak detail kecil:



  • 80% lebih banyak kamar normal (maks 45)
  • Hanya 6 kamar paling ujung yang digunakan untuk kamar khusus
  • Tingkat memilih kamar dari kumpulan kamar sederhana, sedang, dan kompleks.
  • Ruang normal tambahan ditambahkan secara acak ke denah lantai dengan logika penempatan yang mirip dengan ruang rahasia.


Demo



Saya membuat contoh sederhana dari generator di Javascript sehingga Anda dapat bereksperimen dengannya. Kode lengkap dapat ditemukan di sini , dan contoh yang berfungsi dapat ditemukan di artikel asli .





Kelahiran kembali





Binding of Isaac: Rebirth adalah remake dari Binding of Isaac orisinal yang dibuat oleh Nicalis , yang pada saat itu terkenal dengan port VVVVV dan Cave Story mereka . Gim ini di-porting ke C ++ dan semua suara dan grafik dibuat ulang. Selama bertahun-tahun, gim ini telah menerima banyak DLC, menambahkan item dan musuh baru ke daftar aslinya yang sudah mengesankan.



Sementara Rebirth memiliki banyak inovasi menarik, kontribusi utama untuk pembuatan level adalah penambahan ruangan yang lebih besar dan tidak beraturan.





Dengan set lengkap DLC (pada saat penulisan ini, ini adalah Afterbirth +), gim ini memiliki 11 ruangan besar: 2 × 2, 2 × 1, koridor berbentuk L dan sempit dalam opsi rotasi yang berbeda.





Kamar tipikal berbentuk L, tiga kali ukuran ruangan normal. Ini diimplementasikan oleh Simon Parser melalui modifikasi yang hati-hati pada kode sumber Himsla.



Alih-alih melakukan perulangan ke semua arah, algoritme melewati semua pintu keluar dari ruangan. Jumlahnya bisa sampai delapan dalam ruang 2x2.



Ketika harus memasukkan kamar, dia secara acak mencoba memasukkan kamar besar sebagai gantinya. Pemeriksaan tetangga masih diterapkan, tetapi hanya untuk sel pertama di sebelahnya di luar pintu; namun, algoritme memeriksa untuk melihat apakah ada cukup ruang untuk sisa ruangan. Artinya, ruangan besar dapat membuat engsel yang rata. Biasanya, dua ruangan besar dibuat berdampingan dan dilengkapi dengan sepasang pintu yang menghubungkannya.



Jika tidak ada cukup ruang untuk sebuah ruangan, maka algoritme mencoba memasukkan kandidat lain. Jika ruangan besar berhasil dimasukkan, ada 95% kemungkinan mereka akan dikeluarkan dari kolam.



Bahkan lebih banyak kode diperlukan untuk menangani ruang bos yang besar. Ingatlah bahwa ruang bos selalu terletak sejauh mungkin dari ruang awal. Jika ruangan yang lebih besar diinginkan, generator menggantikan ruangan tunggal yang diinginkan. Karena ruang bos selalu buntu, saat mengganti, algoritme memeriksa untuk melihat apakah mereka berdekatan dengan beberapa ruang tambahan. Terkadang penggantian masih tidak mungkin, jadi semua titik akhir diperiksa pada jarak maksimum dari ruang awal, dan jika tidak sesuai, algoritme menyerah.



Untuk kamar rahasia, kamar yang bersebelahan di denah lantai dipertimbangkan untuk penempatan, dan kamar dipilih hanya jika algoritme menentukan bahwa pintu tidak diperlukan.





Dalam Ishak, jurang biasanya tidak mungkin untuk dilintasi



Keluaran



Isaac Level Generator bukanlah yang paling canggih yang pernah saya lihat, tetapi meskipun jumlah kodenya sedikit, ia bekerja dengan sangat baik. Ini mungkin mengapa mereka mencoba membuatnya begitu sering. Kesederhanaannya memungkinkan adanya perubahan dan ekstensi, seperti yang dapat kita lihat dalam contoh Kelahiran Kembali. Hasil yang luar biasa.



Anda juga dapat melihat bahwa game ini melanjutkan tren menghasilkan denah lantai secara terpisah dari detail ruangan. Dalam artikel saya tentang Diablo 1 [ terjemahan ke Habré] dan Enter the Gungeon [ terjemahan ke Habré], saya mengatakan mengapa pendekatan seperti itu bisa sangat ampuh.



Saat mendekompilasi kode, saya tidak menemukan detail yang sangat menarik. Hal paling menarik yang bisa saya katakan adalah bahwa lokasi ruang harta disimpan dalam variabel bernama "boner" - mungkin kependekan dari Ruang Bonus. Ada juga seluk-beluk dalam kode mengenai efek samping kecil dari berbagai item, tetapi saya akan menyerahkan topik ini kepada penganalisis .



Kemudian Anda dapat menonton serial video Himsla di bagian dalam game, atau bahkan bermain Isaac dan melihat semua level secara langsung. Saya mendengar bahwa Repentance DLC baru akan keluar tahun ini. Saya juga merekomendasikan bermain game lain oleh Kepala Desainer Edmund McMillen (terutama Super Meat Boy).



All Articles