Как хранить поведение нестандартных игровых объектов?
Предположим, есть некоторая RPG. Большая часть оружия обладает стандартным поведением и полностью описывается параметрами (например: Ржавая Секира Тупости — урон +5, интеллект -5). Все это прекрасно хранится в реляционной БД.
Но часть оружия обладает неким поведением — например, хорошо действует против данного конкретного босса, или весит больше на свету, или урон зависит от класса персонажа. В общем, некоторое поведение, которое, по хорошему, можно описать только функцией.
Так вот, где хранить эту функцию? Варианта, в общем, два: первый — сделать репозитарий поведений и получать оттуда функции по айдишнику. Но это разнесет контент игры между кодом и БД, будет труднее обеспечивать целостность. Второй — хранить функцию в БД и eval'ить ее — но это некрасиво, eval is evil, хранить код в БД неизящно и все такое.
По видимому, надо хранить в БД, но не основном языке, а на каком-то DSL — но я вряд ли осилю написать DSL.
Технологии — JS и SQLite. Ни то, ни другое нельзя сменить по условиям задачи:)
Я так понимаю есть какой-то серверный скрипт, который вываливает js-ы клиенту? В таком случае можно код хранить и в БД, и без eval-ов его впиливать в серверный ответ. Но в любом случаее это не выход.
В БД вы должны хранить параметры, значения, константы, мета-информацию, нельзя в БД хранить логику, это ошибка (в данном случае).
Предлагаю решение:
1. Сделать еще одну таблицу, которая хранит все возможные факторы влияния.
2. Описать где-то в JS все возможные факторы влияния, функция должна возвращать уровень влияние по ID/name фактора влияния, в зависимости от текущих параметров (погода, цель удара, время последнего удара или что-то там еще).
3. Для каждого спец. предмета в таблице добавить поле содержащее строку '[«id1»:«k1»,«id2»:«k2»...]' — список параметров влияние и их коэффициентов. Либо не доп. поле, а доп. таблицу (в зависимости от уровня нормализации таблиц).
Таким образом вы сможете хранить спец. параметры в БД, и изменять основные параметры предметов/игрока динамичиски с помощью JS. Если количество спец. факторов — динамическое и может меняться в процессе игрового процеса — DSL либо шаблоны — случайная примесь разных факторов влияния.
Таблица факторов
id type info
1 "[0..9]" «Влияние некой случайно величины»
2 «float» «Влияние скорости вета»
3 «bool» «Влияние алкоголя»
//id, тип для JS (чтобы описывать функции которые возвращают значение типов которые предпологались при создании контента), описание (на всякий случай)
Таблица предметов:
id……………… special
1 [«1»:«0.3»:«power»]
2 [«1»:«0.4»:«power»;«3»:"-2":«speed»]
//special хронит набор строк [«x»:«y»:«z»] каждая из которых указывает, что на параметр Z влияет фактор Х c коэффициентом Y.
MUD-ы, большинство, хранит таки код специальных поведений объектов в БД (другое дело, что БД обычно текстовая, а код — действительно DSL, а не C/C++). Часто встречающееся поведение — параметризуют во флагах («5% шанс на отравление при ударе»), особое — прописывают в proc-и «on_hit, 3% { echo „Вы услышали страшный хруст“}, сохраняемые вместе с классами объектов в ту же „БД“
Это, типа, работает уже не первый десяток лет.
но Javascript, можно сказать, сам себе DSL. так что даже придумывать ничего не надо.