Перейти к основному содержимому

Фреймворки на коде

Таблицы правил

Храните постоянные данные правил в таблице и читайте их в правилах или используйте как варианты входного значения.

Что такое таблица

Таблица правил это постоянные данные, которые читают ваши правила, например бонус для каждого призвания. Это не состояние игры, и игроки её не меняют. Изменение строки создаёт новую версию игры, как любая другая правка исходников.

Объявите таблицу

Таблица это файл JSON в tables/. Перечислите его в манифесте.

manifest/project.json
  "tables": ["tables/callings.json"]
  1. Строка 10 Пути к файлам таблиц.
tables/callings.json
{
  "id": "callings",
  "name": "Callings",
  "columns": [
    { "key": "calling", "label": "Calling", "type": "string" },
    { "key": "bonus", "label": "Watch bonus", "type": "number" }
  ],
  "rows": [
    { "calling": "Guard", "bonus": 30 },
    { "calling": "Scout", "bonus": 10 }
  ]
}
  1. Строки 4-7 Столбцы. У каждого есть ключ, метка и тип: string, number или boolean.
  2. Строки 8-11 Строки. Каждая строка задаёт значение для каждого столбца и больше ничего.

Framework перечисляет id таблиц, которые он читает.

schemas/keeper.json
  "tables": ["callings"]
  1. Строка 22 Framework может читать таблицу callings.
ОграничениеЗначение
Столбцов в таблице64
Строк в таблице1000
Таблиц на Framework64
Таблиц на игру128

Читайте таблицу в правиле

table.find принимает id таблицы, столбцы для сопоставления с искомыми значениями и столбцы для возврата с значением по умолчанию для каждого. Он возвращает названные вами столбцы из первой строки, у которой все столбцы сопоставления равны вашим значениям. Если ни одна строка не подходит, он возвращает значения по умолчанию.

rules/keeper.ts
export function construct(
  name: string,
  max_hp: number,
  calling: string,
): { name: string; max_hp: number; hp: number; calling: string; watch: number } {
  const row = table.find("callings", { calling: calling }, { bonus: 0 });
  const bonus: number = row.bonus;
  return {
    name: name,
    max_hp: max_hp,
    hp: max_hp,
    calling: calling,
    watch: 20 + bonus,
  };
}
  1. Строка 6 Найдите бонус для призвания. Значение по умолчанию 0.
  2. Строка 7 Прочитайте столбец результата. Его тип берётся из таблицы, поэтому приведение не нужно.
  3. Строка 13 Используйте бонус в начальном значении.

Id таблицы это строка, записанная в коде, и Framework должен перечислять эту таблицу. Каждый названный столбец должен существовать, и возвращаются только названные столбцы. Конструктор читает таблицу так же. Значения для сопоставления должны быть переменной, полем или литералом, а не вычисляемым значением.

Эти ошибки находит проверка проекта:

  const row = table.find("callings", { calling: calling }, { boost: 0 });
has no column 'boost'
which manifest.tables does not declare
  const row = table.find("callings", { calling: calling + "!" }, { bonus: 0 });
table.find match values must be a variable, a field or a literal

Используйте таблицу для вариантов

Текстовое входное значение может брать варианты из одного столбца таблицы. Варианты это разные значения столбца в порядке строк.

schemas/keeper.json
    "calling": {
      "label": "Calling",
      "optionsFrom": { "table": "callings", "column": "calling" },
      "defaultValue": "Guard"
    }
  1. Строка 11 Мастер предлагает значения столбца calling.
  2. Строка 12 Значение по умолчанию должно быть одним из вариантов.
is not one of this Framework's tables

Входное значение действия типа text может делать то же через запись optionsFrom в объявлении действия. Источник должен давать не меньше 2 вариантов.

Дальше