Pour un roguelike sur lequel je travaillais, j'ai implémenté un système basé sur les données assez flexible pour générer des gouttes. Je l'ai documenté ici . C'est essentiellement un petit DSL pour sélectionner un certain nombre d'éléments choisis au hasard.
Une simple goutte ressemble à:
1-10 copper coin
Cela dit simplement de laisser tomber un nombre aléatoire de pièces de cuivre entre 1 et 10. Les choses deviennent plus flexibles lorsque vous ajoutez des branches:
one of
turquoise stone (50%)
onyx stone (25%)
malachite stone (15%)
jade stone (10%)
Un "un de" sélectionne une de ses branches enfants en fonction des probabilités données, puis l'évalue. Les gouttes peuvent déposer plusieurs éléments:
any of
turquoise stone (50%)
onyx stone (25%)
malachite stone (15%)
jade stone (10%)
Cela évaluera toutes les sous- branches et les supprimera si un jet contre leur probabilité passe. Il existe également d'autres branches pour sélectionner un élément en fonction du donjon et du niveau du joueur.
Parce que celles-ci peuvent devenir complexes, cela vous permet également de définir des macros nommées, essentiellement des fonctions qui développent une expression de branche et peuvent être réutilisées en plusieurs suppressions. De cette façon, si, par exemple, tous les nains déposent le même type de butin, vous pouvez créer une seule macro pour cela et l'utiliser sur tous ces types de monstres au lieu de copier et coller d'énormes tables de dépôt.
Un exemple de chute d' un monstre :
:: ancient dragon
glyph = D
groups = dragon
drops
(coins)
2-3(1:8) one of
(any-weapon)
(any-armor)
Ici, (coins)
, (any-weapon)
et (any-armor)
sont tous les appels macro:
(any-armor)
one of
(shield)
(helm)
(boots)
(gloves)
(cloak)
(robe)
(soft-armor)
(hard-armor)
qui à son tour appelle des choses comme:
(cloak)
one near level
cloak (10)
velvet cloak (20)
fur-lined cloak (50)
Vous pouvez imbriquer des expressions de manière arbitraire profondément comme un véritable langage de programmation. Cela vous donne la composabilité qu'une approche basée sur une table simple ne donnera pas.
Comme tous les systèmes basés sur les données, vous pouvez vous submerger en créant des gouttes d'une complexité impénétrable, mais cela répond à mes objectifs:
- Être en mesure de spécifier les éléments qui sont complètement supprimés en dehors du code.
- Simple à implémenter le système de base dans le code.
- Soyez en mesure de régler les monstres spécifiques à laisser tomber afin que le joueur puisse faire une exploration orientée vers les objectifs. ("J'ai besoin d'un collier. Je vais chercher des nains car ils ont tendance à les laisser tomber.")
Le code C # qui implémente ceci est ici .