Задать вопрос
k12th
@k12th
console.log(`You're pulling my leg, right?`);

Как хранить поведение нестандартных игровых объектов?

Предположим, есть некоторая RPG. Большая часть оружия обладает стандартным поведением и полностью описывается параметрами (например: Ржавая Секира Тупости — урон +5, интеллект -5). Все это прекрасно хранится в реляционной БД.

Но часть оружия обладает неким поведением — например, хорошо действует против данного конкретного босса, или весит больше на свету, или урон зависит от класса персонажа. В общем, некоторое поведение, которое, по хорошему, можно описать только функцией.

Так вот, где хранить эту функцию? Варианта, в общем, два: первый — сделать репозитарий поведений и получать оттуда функции по айдишнику. Но это разнесет контент игры между кодом и БД, будет труднее обеспечивать целостность. Второй — хранить функцию в БД и eval'ить ее — но это некрасиво, eval is evil, хранить код в БД неизящно и все такое.

По видимому, надо хранить в БД, но не основном языке, а на каком-то DSL — но я вряд ли осилю написать DSL.

Технологии — JS и SQLite. Ни то, ни другое нельзя сменить по условиям задачи:)
  • Вопрос задан
  • 2840 просмотров
Подписаться 4 Оценить Комментировать
Решения вопроса 1
TheHorse
@TheHorse
Я так понимаю есть какой-то серверный скрипт, который вываливает js-ы клиенту? В таком случае можно код хранить и в БД, и без eval-ов его впиливать в серверный ответ. Но в любом случаее это не выход.

В БД вы должны хранить параметры, значения, константы, мета-информацию, нельзя в БД хранить логику, это ошибка (в данном случае).
Предлагаю решение:
1. Сделать еще одну таблицу, которая хранит все возможные факторы влияния.
2. Описать где-то в JS все возможные факторы влияния, функция должна возвращать уровень влияние по ID/name фактора влияния, в зависимости от текущих параметров (погода, цель удара, время последнего удара или что-то там еще).
3. Для каждого спец. предмета в таблице добавить поле содержащее строку '[«id1»:«k1»,«id2»:«k2»...]' — список параметров влияние и их коэффициентов. Либо не доп. поле, а доп. таблицу (в зависимости от уровня нормализации таблиц).

Таким образом вы сможете хранить спец. параметры в БД, и изменять основные параметры предметов/игрока динамичиски с помощью JS. Если количество спец. факторов — динамическое и может меняться в процессе игрового процеса — DSL либо шаблоны — случайная примесь разных факторов влияния.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
codesnik
@codesnik
MUD-ы, большинство, хранит таки код специальных поведений объектов в БД (другое дело, что БД обычно текстовая, а код — действительно DSL, а не C/C++). Часто встречающееся поведение — параметризуют во флагах («5% шанс на отравление при ударе»), особое — прописывают в proc-и «on_hit, 3% { echo „Вы услышали страшный хруст“}, сохраняемые вместе с классами объектов в ту же „БД“
Это, типа, работает уже не первый десяток лет.
но Javascript, можно сказать, сам себе DSL. так что даже придумывать ничего не надо.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы