Dla roguelike, nad którym pracowałem, zaimplementowałem dość elastyczny system danych do generowania zrzutów. Udokumentowałem to tutaj . Zasadniczo jest to trochę DSL do wybierania wielu losowo wybranych pozycji.
Prosta kropla wygląda następująco:
1-10 copper coin
Po prostu mówi, aby upuścić losową liczbę monet miedzianych od 1 do 10. Rzeczy stają się bardziej elastyczne po dodaniu oddziałów:
one of
turquoise stone (50%)
onyx stone (25%)
malachite stone (15%)
jade stone (10%)
„Jeden z” wybiera jedną ze swoich gałęzi potomnych na podstawie podanych prawdopodobieństw, a następnie ocenia to. Krople mogą upuścić więcej niż jeden przedmiot:
any of
turquoise stone (50%)
onyx stone (25%)
malachite stone (15%)
jade stone (10%)
Spowoduje to ocenę wszystkich podgałęzi i upuści je, jeśli przejdzie ich prawdopodobieństwo. Istnieją również inne gałęzie do wybierania przedmiotów na podstawie lochów i poziomu gracza.
Ponieważ mogą się one skomplikować, pozwala także definiować nazwane makra, zasadniczo funkcje, które rozwijają wyrażenie gałęzi i mogą być ponownie użyte w wielu kroplach. W ten sposób, jeśli na przykład wszystkie krasnoludy upuszczą ten sam rodzaj łupów, możesz dla tego zrobić jedno makro i użyć go we wszystkich typach potworów zamiast kopiować i wklejać ogromne tabele dropów.
Przykład upuszczenia jednego potwora :
:: ancient dragon
glyph = D
groups = dragon
drops
(coins)
2-3(1:8) one of
(any-weapon)
(any-armor)
Tutaj (coins)
, (any-weapon)
i (any-armor)
są wszystkie połączenia makro:
(any-armor)
one of
(shield)
(helm)
(boots)
(gloves)
(cloak)
(robe)
(soft-armor)
(hard-armor)
co z kolei wywołuje takie rzeczy jak:
(cloak)
one near level
cloak (10)
velvet cloak (20)
fur-lined cloak (50)
Możesz zagnieżdżać wyrażenia upuszczania dowolnie głęboko jak prawdziwy język programowania. Daje to możliwość komponowania, której nie da proste podejście oparte na tabeli.
Jak wszystkie systemy oparte na danych, możesz się przytłoczyć, budując nieprzenikalnie skomplikowane upuszczenia, ale to spełnia moje cele:
- Być w stanie określić, jakie rzeczy są całkowicie usuwane poza kodem.
- Prosta implementacja systemu podstawowego w kodzie.
- Bądź w stanie dostroić to, co upuszczają określone potwory, aby gracz mógł przeprowadzić eksplorację zorientowaną na cel. („Potrzebuję naszyjnika. Będę szukać krasnoludów, ponieważ mają tendencję do upuszczania.”)
Kod C #, który to implementuje, znajduje się tutaj .