Bagaimana ruang bawah tanah dihasilkan di Enter The Gungeon

Baru-baru ini, saya banyak bermain di Enter The Gungeon . Ini adalah permainan neraka yang luar biasa, sangat menantang, yang mengingatkan saya pada Binding of Isaac . Tapi semakin aku memainkannya, semakin aku menyadari kejeniusan halus dari desain penjara bawah tanah.


Ada banyak generator prosedural yang membuat skema level logis yang memastikan kecepatan permainan dan hadiah pemain yang benar, dan ada generator lain yang membuat level dengan loop dan skema kompak. Tetapi jarang menemukan kedua jenis dalam satu game. Satu-satunya permainan yang saya tahu di mana ada upaya untuk mengimplementasikan hal seperti itu adalah Unexplored .

Jadi saya secara alami meluncurkan dekompiler sehingga Gungeon akan mengungkapkan semua rahasianya kepada saya. Dalam artikel ini saya akan membagikan kepada Anda apa yang berhasil saya temukan.



Sekilas, level Gungeon tampak cukup sederhana. Berikut adalah contoh peta yang khas.


Kartu Level 1 yang Khas

Pemain mulai di pintu masuk. berjalan melalui peti dan penjaga toko untuk mengumpulkan rampasan dan akhirnya mengalahkan bos . Jika Anda tersandung ke jalan buntu yang panjang, Anda dapat menggunakan teleport untuk dengan cepat kembali ke kamar. Jelas, ruangan terpisah dibuat dengan tangan, dan dihuni oleh berbagai musuh yang perlu ditembak. Ketika maju ke level berikutnya dalam permainan, pemain melihat pola yang sama berulang-ulang, hanya tahap menjadi lebih besar.

Sejauh ini, tampaknya ini tidak menarik. Di Internet, Anda dapat menemukan banyak generator yang menghubungkan lorong ke kamar acak.

Fitur generator menjadi terlihat ketika Anda mulai bermain. Levelnya tampak ... sedikit lebih terencana daripada yang mungkin diharapkan dari kebetulan. Ruang bos selalu jarak yang wajar dari awal. Kamar dengan musuh selalu diselingi dengan kamar, bangku, dan persimpangan yang tenang. Dan yang paling penting - banyak peti terletak di belakang engsel dengan salib satu arah.


Garis merah adalah koridor satu arah. Jika Anda ingin masuk ke ruangan dengan peti, maka Anda harus pergi jauh. Sebagian besar peti terletak di ujung satu arah loop, atau cukup dalam di dalam level, yang memaksa pemain untuk bertempur melalui banyak kamar, hanya untuk mencapai dada. Tidak ada hadiah tanpa risiko.

Rahasia dari bagian ini adalah skema umum dibuat secara manual. Berikut adalah diagram yang digunakan untuk menghasilkan level yang ditunjukkan di atas.


Kamar normal adalah kamar yang dipilih secara acak dengan musuh, ruang persimpangan, atau kamar besar dengan beberapa pintu keluar. Imbalan (Imbalan) dan bos (bos) tidak perlu dijelaskan. Itu tidak menunjukkan kamar "penghubung", yaitu kamar tanpa musuh, seringkali dengan bahaya alam. Kamar yang tersisa ditentukan atau dipilih dari tabel kamar khusus.

Di Gungeon, ada beberapa skema seperti yang disebut "mengalir" (flow). Pada tingkat Hollow, mereka adalah yang paling sedikit (4), dan di Gungeon Proper, paling banyak (8). Ini bukan skema sederhana, desain mereka dibuat berdasarkan fitur tertentu yang dapat diperhatikan dengan beberapa bagian. Ini bisa berupa lingkaran raksasa, atau garpu penting dalam banyak hal, atau kebutuhan untuk sampai ke bangku untuk melewati level. Mereka begitu mencolok sehingga speedrunners memperhatikan perbedaan dan membuat jadwal di mana Anda dapat menemukan bos secepat mungkin. Saya sudah menyiapkan daftar skema lengkap yang bisa diunduh dari sini .

Anda mungkin telah memperhatikan bahwa pola aliran dan peta tidak cocok sepenuhnya. Di bawah bangku ada ruang tambahan. tidak konsisten dengan skema, dan kamar koridor yang aneh . Mari kita pelajari seluruh proses, itu mengandung banyak ide cerdas.

Proses dimulai dengan secara acak memilih file streaming seperti yang ditunjukkan di atas. Ini adalah struktur data "grafik" , yaitu, ia menyimpan interkoneksi kamar, tetapi bukan lokasinya. Setiap kamar berisi metadata tentang tipe kamar dan koneksi yang seharusnya dimiliki. Koneksi memiliki arah - setiap diagram alir dimulai dari simpul akar, dan kemudian membentuk pohon simpul anak. Kemudian koneksi tambahan memecah struktur pohon untuk membuat loop. Saya pikir ini terutama disebabkan oleh kekhasan pengembangan game, tetapi ini menyederhanakan prosedur untuk menganalisis peta, karena semua loop telah didefinisikan dengan jelas awal dan akhir.

Konversi aliran


File stream dapat dikonversi dengan sejumlah cara. Pertama, beberapa kamar tertentu akan diganti dengan serangkaian kamar yang panjangnya acak. Fungsi ini hanya digunakan di kemudian hari, level yang lebih besar. Selain itu, beberapa bagian file stream memiliki jalur alternatif, dan salah satunya dipilih secara acak. Fungsi ini hanya digunakan dua kali.

Kemudian beberapa node tambahan "disuntikkan". Fungsi ini cukup fleksibel dan digunakan untuk berbagai keperluan.

Setiap "injeksi" berisi data yang menentukan jenis objek apa yang harus dimasukkan, di mana harus dimasukkan, kemungkinan penciptaan dan segala kondisi yang harus dipenuhi (misalnya, adanya babak master , kutukan tinggi atau bahwa pemain belum menyimpan karakter tersebut. ) Sebagai contoh, ruang rahasia biasanya dibuat di jalan buntu, tetapi memiliki kemungkinan 1/5 melekat pada ruangan mana pun. Mereka memiliki kemungkinan 90% terjadinya dan tidak memerlukan kondisi tambahan.

Hampir setiap ruangan khusus dalam permainan ditentukan oleh injeksi situs, termasuk pedagang (tidak termasuk toko utama), penjara, kamar dengan perapian dan lift.


Salah satu sel penjara yang bisa disuntikkan ke level

Pada tahap yang sama, generator memilih ruang khusus untuk setiap node. Ini terutama tergantung pada tahap saat ini dan jenis kamar yang dibutuhkan. Ada daftar besar kamar - hampir 300 untuk tahap pertama - tetapi generator mencoba untuk tidak memilih kamar yang sama dua kali.

Node konektor berfungsi berbeda. Kamar-kamar mereka dipilih kemudian, sementara skema dibuat. Seringkali ini adalah kamar yang panjang dan sempit, sehingga sangat penting untuk memilih kamar dengan orientasi yang benar.

Benda majemuk


Setelah pembuatan aliran selesai, itu dibagi menjadi "objek komposit". Setiap objek komposit dapat berupa loop terpisah dari kamar, atau satu set kamar yang terhubung tanpa loop (mis. Pohon ). Ini dilakukan dengan menemukan loop terkecil pada peta dan memotongnya sebagai objek komposit. Operasi diulangi sampai tidak ada loop pada peta. Sisa peta menjadi seperangkat pohon yang terbagi dan koneksi antara objek komposit individu.


Aliran yang sama setelah injeksi dan pemisahan

Skema Objek Majemuk


Kemudian setiap objek komposit dibuat secara terpisah, pada peta yang terpisah. Mereka akan bergabung bersama nanti.

Untuk merencanakan objek majemuk, ruang pertama ditempatkan di tempat yang sewenang-wenang. Kemudian, kamar ditambahkan ke sirkuit satu per satu dengan memilih sepasang pintu keluar, yang salah satunya terkait dengan ruang baru, dan yang lainnya ke sirkuit yang ada. Keluar adalah lokasi yang telah ditentukan dalam metadata setiap kamar. Kemudian ruang baru ditempatkan sehingga pintu keluarnya terhubung langsung ke pintu keluar dari ruang sebelumnya. Kemudian proses berulang.

Lebih khusus, objek pohon komposit ditempatkan dengan melintasi pohon secara mendalam . Algoritme hanya memilih pasangan output yang mengarah pada tampilan ruangan baru tanpa berpotongan dengan yang sebelumnya. Secara umum, algoritma lebih memilih untuk memilih output yang jauh dari yang sudah ada. Jika tidak mungkin untuk menempatkan kamar, itu akan kembali dan memperbaharui pilihan kamar, mengulangi proses ini hingga tiga kali.

Sementara itu, objek loop komposit ditempatkan dengan menambahkan elemen dari loop pada gilirannya di kedua sisi garis. Untuk mulai dengan, pasang keluar dipilih secara acak (preferensi diberikan ke dinding yang berlawanan, timur-barat atau utara-selatan). Ketika loop dibuat setengah, ia mulai memberi preferensi pada pasangan output yang menyatukan dua tepi loop terbuka. Setelah membuat semua kamar, algoritma perlu menambahkan koneksi lain antara dua kamar terakhir. Dia memilih sepasang jalan keluar lain. Jika memungkinkan, ia mendesain di antara pintu keluar ini sebuah ruangan persegi panjang kecil. Kalau tidak, ia mencari jalan di antara pintu keluar dan menciptakan "ruang", yang hanya merupakan koridor sempit. Panjang koridor harus dari 4 hingga 30 unit (di tambang hingga 50).

Perakitan akhir


Pada tahap ini, bagian-bagian kecil ruang bawah tanah yang terhubung satu sama lain, tetapi objek komposit itu sendiri harus terhubung untuk membuat peta lengkap.


Peta yang sama dengan objek komposit sebelum perakitan akhir

Seperti yang Anda lihat, senyawa yang tersisa dalam kasus ini tidak memberikan banyak pilihan. Tetapi mungkin ada kasus yang lebih kompleks dari sebelumnya. Algoritma memotong peta, mulai dari ruangan dengan koneksi terbanyak. Seperti sebelumnya, sepasang output dipilih untuk setiap koneksi yang dibuat. Jika dua ruangan berada di bagian peta yang terpisah, maka kedua bagian peta ini disejajarkan untuk membuat jalur pendek. Kalau tidak, pencarian rute digunakan untuk membuat rute.

Dan di sinilah pembuatan diagram level berakhir. Tetap hanya untuk memilih musuh dan dekorasi untuk kamar, dan ini adalah topik yang sama sekali berbeda.

Kesimpulannya


Tampaknya tujuan utama para pengembang adalah menciptakan generator prosedural yang menyediakan gameplay yang memuaskan. Jelas, agar dapat diimplementasikan dengan benar, mereka harus melakukan banyak iterasi - saya menemukan sejumlah besar kode generasi, yang, tampaknya, tidak digunakan, karena pengembang telah mengubah formula prosedural mereka untuk mencari kesempurnaan.

Trik yang aneh adalah bahwa mereka menghasilkan bagian peta yang paling kompleks / penting terlebih dahulu. Generator berfokus pada pembuatan loop sempit dan koridor pendek di bagian paling tengah dari level, dan kemudian mencoba untuk menghubungkan yang lainnya dengan mereka.

Seperti dalam kasus studi saya tentang generasi level Diablo 1 , saya terkejut betapa efisiennya untuk menghasilkan bagian dari ruang bawah tanah dalam bentuk abstrak - dalam hal ini adalah grafik tanpa informasi tentang lokasi. Semuanya menjadi lebih spesifik hanya nanti. Fungsi "injeksi" tidak mungkin jika kita segera beralih ke bekerja dengan peta ubin. Berkat abstraksi dari detail penempatan kamar, ini memungkinkan Anda untuk mengontrol gaya permainan dan skala level.

Selain itu, saya terkesan dengan ekstensibilitas sistem secara keseluruhan. Unity mendorong pendekatan berbasis data aktif. Menambahkan ruang baru, skema atau bahkan perilaku khusus dapat diwujudkan dengan hanya menambahkan objek baru ke tabel yang sesuai. Ini pasti sangat membantu, karena Dodge Roll telah merilis beberapa DLC gratis dan, tanpa diragukan lagi, mendukung pembuatan mod .



Bonus


Mempelajari generator ini adalah kesempatan pertama saya untuk meneliti membuat game profesional di Unity. Pengembang Dodge Roll melakukan yang terbaik dan menulis kode yang baik. Ini dibaca dengan baik, dan di beberapa tempat cukup lucu - tampaknya cinta permainan kata-kata mereka telah menyebar ke kode. Saya suka yang ini:

  • Mesin fluida dalam permainan ini disebut DeadlyDeadlyGoopManager
  • Kode generasi penjara bawah tanah disebut Dungeonator
  • Berbagai langkah disebut CASTLEGEON/GUNGEON/MINEGEON/CATACOMBGEON dll. Saya ingin tahu apakah pengembangnya terinspirasi oleh Diablo 1, yang menggunakan skema yang sangat mirip?
  • Secara harfiah setiap kamar memiliki nama sendiri, biasanya dalam bentuk pelesetan (atau untuk menghormati beberapa Joe; mungkin ini adalah seorang seniman dengan kesombongan besar).

Saya juga memperhatikan bahwa awalnya studio memiliki rencana untuk tahapan dalam tema ruang, hutan dan Wild West. Sayangnya, mereka tidak ditakdirkan untuk muncul. Dodge Roll memutuskan bahwa pekerjaannya di Gungeon telah selesai . Saya akan menunggu game mereka berikutnya dan berharap mereka menaruh banyak cinta dan perhatian ke dalamnya.

Source: https://habr.com/ru/post/id462377/


All Articles