(RPG) Drop table design

18

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)

Extrakun
sumber
4
Mengapa sulit untuk memperluas kamus persentase saat menambahkan item baru? Maksud saya jika Anda tidak perlu memiliki semua persentase untuk membuat jumlah 100% (dan itu hanya kasus jika Anda ingin monster selalu menjatuhkan item tunggal, yang cukup aneh bagi saya), saya tidak melihat masalah.
n0rd
1
Katakanlah Orc => {'belati', 'pedang' 'baju besi'}, dan saya memiliki jenis barang baru, katakan rune; Saya harus memperbarui semua kamus yang terkait dengan setiap jenis monster secara langsung. Tentu saja, ini bukan lapisan tipuan yang tidak bisa dipecahkan. Jadi pertanyaannya adalah, bagaimana layer itu terlihat?
Extrakun
Saya tidak yakin mengapa Anda berpikir memperbarui kamus itu sulit. Dalam Python, memperluas satu kamus dengan nilai baru dilakukan dengan metode tunggal, misalnya. Bisakah Anda mengklarifikasi di mana menurut Anda kesulitannya?
Kylotan
2
Extrakun, jika Anda melihat jawaban saya di bawah ini, ada jawaban untuk pertanyaan "lapisan lain dari tipuan" Anda. Alih-alih memperlakukan tetesan sebagai meja datar, Anda bisa membuatnya dari ekspresi bersarang. Jika Anda mengizinkan makro yang dinamai (yaitu fungsi), Anda bisa menggunakan kembali potongan dari tabel drop di entitas yang berbeda.
murah hati
2
Anda baru saja menemukan 'tangkapan' pengembangan game. Tentu, Anda dapat membuat game dalam dua hari, tetapi kemudian datang lima tahun untuk menambahkan konten. Dan menambahkan konten menggiling. PENGGILINGAN.
Tor Valamo

Jawaban:

22

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:

1-10 copper coin

Ia hanya mengatakan untuk menjatuhkan sejumlah koin tembaga acak antara 1 dan 10. Hal-hal menjadi lebih fleksibel ketika Anda menambahkan cabang:

one of
    turquoise stone (50%)
    onyx stone (25%)
    malachite stone (15%)
    jade stone (10%)

"Salah satu" memilih salah satu cabang anaknya berdasarkan probabilitas yang diberikan dan kemudian mengevaluasi itu. Tetes dapat jatuh lebih dari satu item:

any of
    turquoise stone (50%)
    onyx stone (25%)
    malachite stone (15%)
    jade stone (10%)

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 :

:: ancient dragon
    glyph   = D
    groups  = dragon
    drops
        (coins)
        2-3(1:8) one of
            (any-weapon)
            (any-armor)

Di sini, (coins), (any-weapon), dan (any-armor)semua panggilan makro:

(any-armor)
    one of
        (shield)
        (helm)
        (boots)
        (gloves)
        (cloak)
        (robe)
        (soft-armor)
        (hard-armor)

yang pada gilirannya menyebut hal-hal seperti:

(cloak)
    one near level
        cloak (10)
        velvet cloak (20)
        fur-lined cloak (50)

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:

  1. Mampu menentukan hal-hal apa saja yang dibuang sepenuhnya di luar kode.
  2. Sederhana untuk mengimplementasikan sistem inti dalam kode.
  3. Mampu menyetel apa yang dijatuhkan monster tertentu sehingga pemain dapat melakukan eksplorasi berorientasi tujuan. ("Aku butuh kalung. Aku akan mencari kurcaci karena mereka cenderung menjatuhkannya.")

Kode C # yang mengimplementasikannya ada di sini .

banyak sekali
sumber
Ini adalah salah satu implementasi yang belum saya lihat sebelumnya. Terima kasih!
Extrakun
12

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.

Hendrik Brummermann
sumber
8

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.

Richard Fabian
sumber
3

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%.

Kylotan
sumber