Saya kira pertanyaan ini lebih berkaitan dengan game seperti game MMO dan Diablo.
Apa saja desain yang biasa untuk menerapkan tabel drop, di mana monster bisa menjatuhkan berbagai jenis item tergantung pada persentase? Saya kira cara paling sederhana untuk memiliki kamus 'persentase berat' untuk jenis barang, tetapi ini sulit untuk diperluas jika kami ingin memperkenalkan jenis barang baru (misalnya, ketika ekspansi D2 mencakup rune dan item kelas baru)
game-design
rpg
Extrakun
sumber
sumber
Jawaban:
Untuk roguelike yang sedang saya kerjakan, saya menerapkan sistem data-driven yang cukup fleksibel untuk menghasilkan tetes. Saya sudah mendokumentasikannya di sini . Ini pada dasarnya adalah DSL kecil untuk memilih sejumlah item yang dipilih secara acak.
Drop sederhana terlihat seperti:
Ia hanya mengatakan untuk menjatuhkan sejumlah koin tembaga acak antara 1 dan 10. Hal-hal menjadi lebih fleksibel ketika Anda menambahkan cabang:
"Salah satu" memilih salah satu cabang anaknya berdasarkan probabilitas yang diberikan dan kemudian mengevaluasi itu. Tetes dapat jatuh lebih dari satu item:
Ini akan mengevaluasi semua sub-cabang dan menjatuhkannya jika gulungan terhadap probabilitas melewati mereka. Ada juga beberapa cabang lain untuk memilih item berdasarkan level dungeon dan pemain.
Karena ini bisa menjadi kompleks, itu juga memungkinkan Anda untuk mendefinisikan makro bernama, pada dasarnya fungsi yang memperluas ekspresi cabang dan dapat digunakan kembali dalam beberapa tetes. Dengan begitu jika, misalnya, semua kurcaci menjatuhkan jenis rampasan yang sama, Anda bisa membuat makro tunggal untuk itu dan menggunakannya di semua jenis monster itu alih-alih menyalin dan menempel tabel drop besar.
Contoh dari drop satu monster :
Di sini,
(coins)
,(any-weapon)
, dan(any-armor)
semua panggilan makro:yang pada gilirannya menyebut hal-hal seperti:
Anda dapat menumpuk ekspresi secara sewenang-wenang seperti bahasa pemrograman yang sebenarnya. Ini memberi Anda kompabilitas yang tidak akan diberikan oleh pendekatan berbasis tabel.
Seperti semua sistem yang digerakkan oleh data, Anda dapat membanjiri diri Anda sendiri dengan membuat tetes yang rumit dan tak tertembus, tetapi memenuhi tujuan saya:
Kode C # yang mengimplementasikannya ada di sini .
sumber
Di Stendhal, tabel rampasan kami adalah daftar. Setiap entri berisi nama item, jumlah minimum dan maksimum serta probabilitasnya. Struktur internal sangat mirip dengan apa yang kami tampilkan di halaman web makhluk itu .
Penting bagi kami bahwa desainer game yang memiliki pengetahuan besar dunia dapat mendefinisikan hal-hal seperti itu. Artinya, tanpa memahami logika kompleks pada level kode program. Jadi kami tidak memiliki definisi makhluk dan item dalam kode program tetapi memindahkannya ke file .xml seperti elves.xml atau club.xml . Kami memang memiliki editor gui untuk mereka, tetapi sebagian besar desainer game memodifikasi file .xml secara langsung.
Untuk membuat makhluk dan barang mudah diperpanjang, kami menggunakan sistem blok bangunan: Tidak ada kelas program untuk "elf" atau "archer elf". Tetapi ada sejumlah kelas perilaku yang terkait seperti "pengecut", "patroli", "agresif", "pemanah", "tabib". Desainer dapat mendefinisikan makhluk baru memilih perilaku tersebut tanpa menulis kode program: Misalnya untuk membuat "pemanah elf" gambar sprite elf dengan busur dan mendefinisikannya sebagai "ofensif", "pemanah". Kemudian tentukan level dan atribut yang serupa dan tambahkan beberapa item elf ke tabel loot.
Untuk item kami memiliki pendekatan yang serupa, tetapi saat ini terbatas pada satu perilaku: Seorang desainer dapat menambahkan item baru dan mendefinisikan perilaku seperti "ConsumableItem", "KeyItem" atau "AttackItem", "Eja", "Scroll" tanpa harus memprogram logika.
sumber
Dalam permainan meja D & D ada konsep jenis jarahan. Sebagian besar monster akan jatuh dari satu atau lebih tabel dan tabel ini akan menjadi apa yang akan Anda perbarui dalam ekspansi Anda. Monster masih akan menjatuhkan "65% umum, 10% permata, 15% seni, 10% alat" tetapi Anda akan memperbarui apa yang ada di masing-masing tabel ini.
mis. Permata berisi slot dengan rentang acak yang mengembalikan "1 permata (25%) 2 permata (50%) 5 permata (75%) 100 permata". dan ketika Anda ingin menambahkan permata rune khusus, perbarui tabel ke "1 permata (25%) 2 permata (50%) 5 permata (75%) 100 permata (95%) 1 runegem".
Tetapi, di sisi lain, jika Anda sudah mendapatkan bobot persentase, mengapa tidak memperbarui semua tabel monster dalam ekspansi Anda? Tentunya tabel seperti ini adalah muatan kecil dibandingkan dengan tekstur dan jerat. Anda juga tidak perlu mempertahankan persentase penghitungan hingga 100, itu hanya asumsi yang Anda buat untuk memulai dan Anda dapat menghitung total total sebelum menghasilkan nilai acak Anda. Jika bobot bertambah hingga 120, maka hasilkan saja nilai dari 1-120, bukan 1-100.
sumber
Pada permukaan ini tampaknya sama dengan masalah "pemilihan acak tertimbang".
Algoritma untuk menentukan kejadian acak
Alokasikan probabilitas relatif untuk setiap peristiwa, tambahkan semuanya, lalu pilih angka acak dalam rentang itu untuk memutuskan acara mana yang Anda inginkan.
Bahkan jika Anda lebih suka menggunakan persentase - yang merupakan sistem yang sama, hanya ditingkatkan menjadi 100 - Anda melebih-lebihkan betapa sulitnya menambahkan barang. Jika Anda memiliki 100% dan kemudian menambahkan 20% dalam ekspansi, cukup bagi semua nilai dengan (120/100) dan Anda kembali ke total 100%.
sumber