Üzerinde çalıştığım bir roguelike için, damla oluşturmak için oldukça esnek bir veri odaklı sistem uyguladım. Burada belgeledim . Rastgele seçilen bir dizi öğeyi seçmek için aslında küçük bir DSL.
Basit bir düşüş şöyle görünür:
1-10 copper coin
Sadece 1 ile 10 arasında rasgele sayıda bakır para bıraktığı söyleniyor. Dallar eklediğinizde işler daha esnek oluyor:
one of
turquoise stone (50%)
onyx stone (25%)
malachite stone (15%)
jade stone (10%)
Bir "biri", verilen olasılıklara göre alt dallarından birini seçer ve bunu değerlendirir. Damlalar birden fazla öğeyi düşürebilir:
any of
turquoise stone (50%)
onyx stone (25%)
malachite stone (15%)
jade stone (10%)
Bu, tüm alt dalları değerlendirecek ve olasılıklarına karşı bir rulo geçerse bunları bırakacaktır. Zindan ve oyuncu seviyesine göre bir öğe seçmek için başka şubeler de var.
Bunlar karmaşık olabileceğinden, adlandırılmış makroları tanımlamanıza izin verir, temel olarak bir dal ifadesini genişleten işlevler ve birden çok damlada yeniden kullanılabilir. Bu şekilde, örneğin, tüm cüceler aynı tür ganimeti düşürürse, bunun için tek bir makro yapabilir ve büyük damla tablolarını kopyalamak ve yapıştırmak yerine tüm bu canavar türlerinde kullanabilirsiniz.
Bir canavar örneği düşmesine :
:: ancient dragon
glyph = D
groups = dragon
drops
(coins)
2-3(1:8) one of
(any-weapon)
(any-armor)
Burada (coins)
, (any-weapon)
ve (any-armor)
tüm makro aramalar:
(any-armor)
one of
(shield)
(helm)
(boots)
(gloves)
(cloak)
(robe)
(soft-armor)
(hard-armor)
ki buna benzer şeyleri çağırır:
(cloak)
one near level
cloak (10)
velvet cloak (20)
fur-lined cloak (50)
Bırakma ifadelerini keyfi olarak gerçek bir programlama dili gibi derinlemesine iç içe yerleştirebilirsiniz. Bu, basit bir tablo tabanlı yaklaşımın veremeyeceği bileşimi sağlar.
Tüm veri odaklı sistemler gibi, geçilmez karmaşık damlalar oluşturarak kendinizi bunaltabilirsiniz, ancak hedeflerime ulaşıyor:
- Hangi şeylerin tamamen kodun dışına atılacağını belirtebilme.
- Çekirdek sistemi kodda uygulamak kolaydır.
- Oyuncunun hedefe yönelik keşif yapabilmesi için hangi canavarların düştüğünü ayarlayabilme. ("Bir kolyeye ihtiyacım var. Onları düşürme eğiliminde oldukları için cüceleri arayacağım.")
Bunu uygulayan C # kodu burada .