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:
- Mampu menentukan hal-hal apa saja yang dibuang sepenuhnya di luar kode.
- Sederhana untuk mengimplementasikan sistem inti dalam kode.
- 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 .