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

Changelog

Страница для тех, кто держит что-то поверх наших контрактов: датасет, импортёр, редактор, встроенный лист. Сюда попадает только то, что видно снаружи — новые поля, новые проверки, изменения в опубликованных схемах и файлах. Правки интерфейса и внутренняя кухня живут не здесь.

Схемы по постоянным URL (/schema/v1/…) всегда отражают текущий прод: если что-то разошлось с этой страницей, верна схема.

2026-10-29 — выборы игрока: развилки внутри черт и выбор нескольких черт

Заголовок раздела «2026-10-29 — выборы игрока: развилки внутри черт и выбор нескольких черт»

Две вещи. Именованный pick-one стал полноценным каналом контента, а новый грант feat-choice даёт выбрать несколько черт из списка — воззвания, метамагию, приёмы, боевые стили. Ломающих изменений нет: всё новое аддитивно, старые наборы работают как раньше. Обзор того, что теперь можно собрать, — в «Датасетах».

Слот на count черт категории category, с устойчивым id, по которому хранится выбор игрока. «Ещё одно воззвание на 5 уровне» — отдельный такой грант в уровневой строке. Выбранные черты едут на лист как обычный feat, со всеми своими грантами.

Черта без repeatable берётся один раз на персонажа: визард блокирует её в других слотах и там, где её уже выдали напрямую. Флаг classFeature: true у слота кладёт выбранное в «Умения и способности» вместо «Черт» — для способностей класса вроде воззваний. Подробности и рецепты — в «Датасетах».

  • minLevel — уровень персонажа, с которого черту можно выбрать в слоте;
  • repeatable — черту можно взять больше одного раза.

category у черты и у слота больше не ограничена пятью значениями из схемы. Своя механика «выбери из списка» — это просто черты своей категории и слот этой категории. Опечатку в категории ловит проверка «слот, под который нет ни одной черты».

Уровневые строки в языках, инструментах и чувствах

Заголовок раздела «Уровневые строки в языках, инструментах и чувствах»

Языки, инструменты, именное оружие и чувства теперь собираются и из уровневых строк, до уровня персонажа. Раньше language-fixed на уровневой строке молча не появлялся.

Развилка с id и options[].id теперь работает в любом месте датасета:

  • у самой сущности — как и раньше;
  • в уровневой строке (leveledGrants) — появляется у игрока с этого уровня;
  • внутри черты — рисуется под карточкой черты, у выданной и у выбранной в слоте;
  • внутри выбранной ветки другой именованной развилки.

Выбранная ветка доезжает во все каналы ровно как гранты, выданные напрямую: числа, текст, счётчики, языки, инструменты, чувства, заклинания, навыки и экспертиза. Раньше из ветки доезжали только числа и слоты навыков, а трейт, счётчик или заклинание внутри ветки молча не появлялись. До ответа игрока ветка не даёт ничего.

Типичный случай — черта «владение ИЛИ экспертиза» (Наблюдатель, Проницательный ум). Пример — в «Датасетах».

Открытый слот черты на классе или подклассе теперь применяется: выбранная черта едет на лист со всеми своими грантами. Раньше игрок мог выбрать черту в визарде, но на лист она не попадала. Её счётчики тоже читаются, в том числе у черты, выданной на уровне.

Правка ретроактивна, как любая правка датасета:

  • если игрок уже ответил на развилку сущности, а в выбранной ветке лежат трейт, счётчик или заклинание, они появятся на листе;
  • если у класса есть слот any и игрок уже выбрал в нём черту, черта появится на листе.

Блок черты с развилкой пересобирается, когда игрок меняет ветку, — правки игрока внутри этого блока при этом теряются. У черт без развилки ничего не меняется.

  • feat-choice без id или с count меньше 1 — ошибка; id слота, совпадающий с другим слотом или развилкой, — ошибка;
  • minLevel черты не целое от 1 до 20 — ошибка;
  • classFeature у слота вида, линии или предыстории — предупреждение: флаг работает только у класса и подкласса;
  • повторяемая черта с именованной развилкой — предупреждение: у всех копий один ответ;
  • проверка «слот черты без кандидатов» распространяется на feat-choice;
  • Исправлено: проверка уникальности id развилки считала развилку внутри черты по разу на каждую сущность, которая выдаёт эту черту, и отклоняла такой набор при импорте. Теперь черта считается один раз.
  • Счётчик в ветке именованной развилки больше не вызывает предупреждения: его читают. Счётчик внутри безымянной развилки (снаряжение или золото) — по-прежнему предупреждение: её открывает только канал снаряжения.

2026-10-22 — эффекты, преимущество и помеха бонусом, бонусы к атакам и урону

Заголовок раздела «2026-10-22 — эффекты, преимущество и помеха бонусом, бонусы к атакам и урону»

Ломающих изменений нет: всё новое аддитивно, старые персонажи открываются как раньше. Подробности — в «Формате персонажа».

Эффекты игрока — именованные наборы бонусов, которые включаются целиком: { id, name, description?, disabled?, icon?, tone?, ends?, shown? }. Бонусы эффекта — обычные записи в data.bonuses с source: { kind: "effect", refId: <id эффекта> }. Пока эффект выключен или записи нет, его бонусы не действуют.

У бонуса появились mode: "advantage" и "disadvantage" — преимущество или помеха вместо числа. Значения у такого слоя нет, в число поля он не входит, его читает бросок. Действует только на целях бросков к20.

  • check.all, save.all — все проверки характеристик (вместе с навыками и инициативой) и все спасброски;
  • attack.all — атаки оружием и заклинаниями;
  • damage.weapon — урон любого оружия;
  • stat.<характеристика>.attack, stat.<характеристика>.damage — атаки и урон оружием этой характеристики;
  • weapon.<id строки>.attack, weapon.<id строки>.damage — одна строка weaponsList.

У целей урона бонус — формула с костями: add добавляет слагаемое, set заменяет формулу оружия, set с приоритетом перезаписи — весь урон.

Лист строит механику conditions и exhaustion по редакции персонажа и показывает её с source.kind: "condition". В data.bonuses эти слои не пишутся — генератору тоже не нужно их писать, иначе они применятся дважды. В conditions кладите только отмеченные состояния: выводимые (incapacitated от paralyzed) лист добавит сам.

Ломающих изменений нет: id в spells.prepared/book работают как раньше.

В spells.prepared и spells.book файла персонажа теперь можно писать слаг ("cure-wounds"), английское имя ("Cure Wounds") или имя как в базе ("Исцеление ран [Cure Wounds]"). Лист находит заклинание сам — в SRD редакции персонажа, затем в гримуаре владельца, — а ненайденное показывает списком в настройках заклинаний. Подробности — в «Формате персонажа».

Сюда сервер откладывает слаги при создании персонажа: { slug, list }[], где list — "prepared" или "book". Писать его самим не нужно. В экспорте оно встретится у персонажа, у которого остались ненайденные заклинания; при повторном импорте его можно оставить как есть.

К слагу, имени и кругу добавлены id заклинания и classes — в чьём списке оно есть. Старые поля не менялись.

{ "slug": "cure-wounds", "id": "698197c2a5dc6923c7028c8c", "name": "Исцеление ран [Cure Wounds]", "level": 1, "classes": ["artificer", "bard", "cleric", "druid", "paladin", "ranger"] }

Грант, ссылающийся слагом на заклинание из гримуара игрока, теперь действительно его выдаёт. Раньше заклинание находилось, но на лист не попадало.

Крупная выкатка: заклинания стали настоящими объектами на листе, а ячейки — выдаваемыми по классу и уровню. Для авторов датасетов это одно ломающее изменение и довольно много нового.

Что было. Лист подмешивал список заклинаний волшебника любому классу с id fighter или rogue — хардкодом, чтобы Мистический рыцарь и Арканный ловкач хоть как-то работали.

Что стало. Список берётся из spellcasting.spellList, а если поля нет — из id класса.

Кого ломает. Любой заклинатель, который черпает не из своего списка:

  • подкласс-гибрид вроде Мистического рыцаря — classId: "fighter" резолвится в список «воина», которого не существует;
  • любой собственный класс — его id в базе заклинаний не значится ничем.

Симптом: ячейки есть, потолок круга правильный, а выбрать нечего — список пуст. Ни ошибки, ни предупреждения при этом нет нигде: линт про spellList не знает, а сервер честно отвечает пустотой.

Лечится одной строкой на класс или подкласс:

{ "type": "spellcasting", "ability": "int", "casterType": "memory",
"progression": "third", "spellList": "wizard" }

Значение — id класса, чей список используется: "wizard", "cleric", "druid" и так далее.

Поле Что даёт
progression из него теперь растут ячейки на листе, а не только потолок круга
slotsByLevel собственная таблица ячеек класса, 21 строка × 9 кругов
cantripsByLevel, knownByLevel, preparedFormula, bookAtFirst, bookPerLevel счётчики «сколько можно взять»

preparedFormula принимает три значения: mod+level, mod+half-level (половина вниз) и mod+half-level-up (половина вверх).

spell-fixed — именное всегда-подготовленное заклинание по слагу. spell-choice — N заклинаний круга, которые игрок выбирает сам из указанного списка. Общие поля выдачи: ability, uses, withSlots, alwaysPrepared.

У счётчика uses есть shortRestRegain — сколько возвращает короткий отдых, формулой. Без него короткий отдых наполняет счётчик целиком.

Заклинание в гранте называется слагом — слагифицированным английским именем (hellish-rebuke). Из русского названия он не выводится. Опубликованы два файла, они же гейт линта:

  • https://longstoryshort.app/datasets/srd-spell-slugs-2014.json — 318 записей
  • https://longstoryshort.app/datasets/srd-spell-slugs-2024.json — 339 записей

Ссылка на не-SRD заклинание легальна: она резолвится у игрока, который уже загрузил ваш файл заклинаний.

spellSlot.1…spellSlot.9 и pactSlot.1…pactSlot.9 — ячейки стали целями системы бонусов.

  • spell-choice без count, круга или spellList — ошибка;
  • два spell-choice одного круга на одной сущности — ошибка;
  • uses без count и без countExpr, или сразу с обоими — ошибка;
  • uses.shortRestRegain, который не вычисляется в число — ошибка;
  • slotsByLevel короче 21 записи — ошибка;
  • слаг вне опубликованного списка SRD — предупреждение.

spells.granted (выданные датасетом, вне лимита подготовленных), spells.slotless (за что нельзя заплатить ячейкой), spellsInfo.charges (привязка «заклинание → счётчик») и spellsInfo.abilities (характеристика конкретного заклинания). Всё аддитивно.

data.spells у персонажа, собранного визардом, стал базой свёртки, а не итогом: поверх лежат выданные классом ячейки и правка игрока, и на листе видно другое число.

Подробности — «Датасеты» и «Формат персонажа».