Для мошенников, над которыми я работал, я реализовал довольно гибкую систему управления данными для генерации дропов. Я задокументировал это здесь . По сути, это маленький DSL для выбора нескольких случайно выбранных предметов.
Простая капля выглядит так:
1-10 copper coin
В нем просто говорится, что случайное количество медных монет должно быть от 1 до 10. Все становится более гибким, когда вы добавляете ветви:
one of
turquoise stone (50%)
onyx stone (25%)
malachite stone (15%)
jade stone (10%)
«Один из» выбирает одну из своих дочерних ветвей на основе заданных вероятностей, а затем оценивает это. Капли могут уронить более одного предмета:
any of
turquoise stone (50%)
onyx stone (25%)
malachite stone (15%)
jade stone (10%)
Это оценит все ответвления и отбросит их, если бросок против их вероятности пройдет. Есть также несколько других веток для выбора предмета в зависимости от уровня подземелья и уровня игрока.
Поскольку они могут быть сложными, это также позволяет вам определять именованные макросы, по существу функции, которые расширяют выражение ветвления и могут быть повторно использованы в нескольких отбрасываниях. Таким образом, если, например, у всех дварфов выпадет один и тот же вид добычи, вы можете создать для этого один макрос и использовать его для всех типов монстров вместо копирования и вставки огромных дроп-таблиц.
Пример падения одного монстра :
:: ancient dragon
glyph = D
groups = dragon
drops
(coins)
2-3(1:8) one of
(any-weapon)
(any-armor)
Здесь (coins)
, (any-weapon)
и (any-armor)
все макро - вызовы:
(any-armor)
one of
(shield)
(helm)
(boots)
(gloves)
(cloak)
(robe)
(soft-armor)
(hard-armor)
который в свою очередь называет такие вещи, как:
(cloak)
one near level
cloak (10)
velvet cloak (20)
fur-lined cloak (50)
Вы можете вкладывать выражения произвольно глубоко, как в настоящий язык программирования. Это дает вам возможность компоновки, которую не даст простой табличный подход.
Как и все системы, управляемые данными, вы можете ошеломить себя, создав непостижимо сложные капли, но это отвечает моим целям:
- Уметь указывать, какие вещи полностью исключены из кода.
- Простая реализация основной системы в коде.
- Уметь настраивать, какие именно монстры выпадают, чтобы игрок мог проводить целевое исследование. («Мне нужно ожерелье. Я буду искать гномов, потому что они склонны их бросать».)
Код C #, который реализует это здесь .