Листы набора правил

На этой странице вы составляете лист персонажа набора правил: характеристики, навыки, поля и списки, текущие состояния, шкалы ран, штрафы, отдых и текст Game Master, а также лист отряда и часы прогресса. Она предназначена для авторов наборов правил. Прежде чем начать, прочитайте Создание наборов правил Game Mode.

Лист

Любой читатель числа указывает ссылку на значение – объект ровно с одним ключом: const, field, derived, abilityScore, abilityMod, abilityModFromField, skillMod, saveMod, listSum, livePool, liveTrack или itemStat. Пример запаса с производным максимумом: "max": { "derived": "grit_max" }.

Проверка без подготовки. Навык или спасбросок, в котором у персонажа нет подготовки (его уровень – первый), бросается как обычно, если набор не говорит иначе через untrained у навыка, спасброска или секции, в которой он находится (собственное правило навыка или спасброска главнее):

"sections": [{ "id": "labour", "label": "Labour", "untrained": { "by": -1 } }],
"skills": [
  { "id": "dig", "label": "Dig", "ability": "sinew", "section": "labour", "untrained": "refuse" },
  { "id": "listen", "label": "Listen", "ability": "nerve", "untrained": "harder" }
]

Секции у характеристик, навыков и спасбросков, а также untrained в любом месте требуют Capability API 1.41 для набора в составе пакета.

Навык или спасбросок может иметь cap – ссылку на значение, выше которого его проверка никогда не поднимается: рейтинг, который нельзя перерасти, или шкала, которая его сдерживает. Gravewatch ограничивает Soothe оставшимся у стража Resolve: "cap": { "livePool": "resolve" }. Ограниченное число – то, которое показывает лист и с которым бросается каждая проверка, а замена через with= вычисляется по числу до ограничения и затем снова ограничивается. Предел не может читать модификатор навыка или спасброска, как и читаемое им производное значение и любое производное значение, объявленное выше него, поэтому лист по-прежнему вычисляется один раз, сверху вниз. Capability API 1.39.

hideWhen скрывает поле, производное значение, список, запас или обычную шкалу по значению другого поля ровно одним из трех способов: equals одно значение, notEquals одно значение (скрыто всякий раз, когда в поле что-то другое; так говорится "только для персонажей такого типа") или in список значений. Каждое названное значение должно быть допустимым для поля, иначе правило никогда не сработает, и проверяется это по одному значению; для notEquals и in это включает диапазон числового поля и длину текстового. Правило читает значение, которое показывает редактор листа: незаданное поле имеет значение, с которого начинается пустой лист, а значение перечисления, которое набор больше не предлагает, читается как значение поля по умолчанию. Файл 5e использует equals, чтобы скрыть ячейки заклинаний у персонажа, не владеющего магией; Gravewatch убирает масло для фонаря из листа каждого стража не из ночной смены через "hideWhen": { "field": "watch", "notEquals": "night" }. Слой не может удалить значение, с которым сравнивает любое из этих правил. Шкалу ран скрыть нельзя, потому что броски и бой читают ее независимо от того, что показывает лист. notEquals и in требуют Capability API 1.39.

max обычной шкалы может быть ссылкой на значение вместо числа, и тогда длину шкалы задает рейтинг персонажа: "max": { "field": "willpower_rating" }. Ее min и default остаются числами. У шкалы ран с именованными уровнями max равен числу уровней; шкала из нумерованных ячеек длиной равна собственному max (см. Нумерованные ячейки ниже). alwaysShow: true выводит шкалу в блок листа Game Master даже на значении по умолчанию – для рейтинга, важного на каждом ходу; без него шкала на значении по умолчанию опускается, потому что три спасброска от смерти на нуле ничего не говорят. Эти три возможности требуют Capability API 1.37 для набора в составе пакета.

Текущие режимы: облик, стойка, свет

Поле-перечисление выбирается при создании персонажа и остается выбранным, а состояние лишь включено или выключено. Текущий режим – одно значение из закрытого набора, меняющееся в игре: облик оборотня, боевая стойка, насколько ярко горит фонарь.

"live": {
  "states": [
    {
      "id": "stance",
      "label": "Stance",
      "values": ["guarded", "steady", "reckless"],
      "valueLabels": { "guarded": "Guarded", "steady": "Steady", "reckless": "Reckless" },
      "default": "steady"
    }
  ]
}

Числа, которые следуют за режимом. Производное значение с "op": "enumTable" дает число для каждого значения поля-перечисления или текущего режима:

{
  "id": "stance_brawn",
  "label": "Stance on Brawn",
  "op": "enumTable",
  "from": { "liveState": "stance" },
  "table": { "guarded": -1, "reckless": 2 },
  "default": 0
}

Текущие режимы, enumTable и шаг отдыха, называющий state, требуют Capability API 1.42 для набора в составе пакета.

Шкалы ран: здоровье как шкала вместо числа

Многие системы вообще не считают хиты. Вместо них – столбец ячеек, каждая хуже предыдущей, и при ранении ставится отметка. Добавьте записи live.tracks kinds и либо именованные levels, либо нумерованные boxes (ниже), и число на шкале станет такой шкалой ран:

Какая форма нужна вашей системе? Запас хранит СКОЛЬКО вреда получено; шкала – сколько И какого вида была каждая часть. Если рана бывает ударной, летальной или усугубленной, и вид важен после удара – усугубленная медленнее лечится, не поглощается или окончательно убивает, – он должен где-то сохраниться после броска. Вид несет только отметка. Запас очков этого не умеет: вычтенный урон оставляет лишь меньшее число, а лист не помнит вид отдельных очков. Поэтому combat.damageKinds отклоняется при здоровье-запасе, а не игнорируется. Запас все еще может иметь damageTypes, а противник – сопротивление или иммунитет к ним: это определяет дошедшую часть удара, а не последующий вид раны.

{
  "id": "harm",
  "label": "Harm",
  "min": 0,
  "max": 4,
  "levels": [
    { "label": "Scuffed", "penalty": 0 },
    { "label": "Winded", "penalty": -1 },
    { "label": "Bleeding", "penalty": -3 },
    { "label": "Down", "penalty": -99 }
  ],
  "kinds": [
    { "id": "knock", "label": "K", "severity": 0 },
    { "id": "tear", "label": "T", "severity": 1 }
  ]
}

Точные правила, потому что расплывчатое прочтение дает неправильную шкалу:

Отметки в игре. Game Master пишет [sheet: op="damage" track="harm" kind="knock" amount="1"] и лечит отрицательным amount. На шкале, заполняемой по ячейкам, он добавляет box="3" – ячейку, в которую приходится удар. Форма damage с pool= не меняется. Простая команда track для шкалы ран отклоняется: одно число не называет виды новых отметок. Игрок также может вручную отмечать и очищать ячейки листа, как предполагают такие системы.

Бой тоже ставит отметки. Направьте combat.health на шкалу вместо запаса. Попадание отмечает столько ячеек, сколько говорит combat.damageKinds.marks, видом, сопоставленным этим блоком типу урона. Персонаж с полной шкалой падает, что и читает правило умирания. На шкале, заполняемой по ячейкам, урон per-point называет ячейку, в которую приходится, а per-blow целится в первую; удар, который не может принять ни одна ячейка, валит персонажа с ног – в системах с такой шкалой это и означает выбыть. Лечение очищает одну отметку, самую легкую, любого вида. Временные очки отклоняются: у шкалы нет буфера для них. Engine читает шкалу как число ОСТАВШИХСЯ уровней, поэтому остальной бой, падение, возвращение, журнал и пересказ не меняются.

Отдых может лечить шкалу ран. Шаг восстановления с "to" очищает ее до указанного числа отметок, вместе с переполнением; шаг с ОТРИЦАТЕЛЬНЫМ "by" убирает столько отметок, начиная с переполнения, так что "by": { "const": -2 } убирает две. Шаг, который также называет kind, снимает только отметки этого вида: "Catch your breath" в Gravewatch – это { "track": "harm", "kind": "knock", "to": "min" }, он залечивает ушибы и оставляет разрывы. Шаг, ДОБАВЛЯЮЩИЙ отметки, ничего не делает, потому что отдых не наносит вреда, и это касается и положительного "by": такой шаг молча пропускается, поэтому пишите знак минус.

Нумерованные ячейки вместо именованных уровней

Если длина шкалы зависит от выносливости персонажа, задайте ей boxes вместо levels. У нее столько ячеек, сколько составляет ее собственный max, который может быть вычисляемым листом значением (но никогда не читающим текущее состояние), до 64:

{
  "id": "strain",
  "label": "Strain",
  "min": 0,
  "max": { "derived": "strain_boxes" },
  "boxes": {
    "penalty": {
      "by": "remaining",
      "table": [
        [0, -1],
        [1, 0]
      ]
    }
  },
  "kinds": [{ "id": "strain", "label": "S", "severity": 0 }],
  "fill": "indexed",
  "onFull": "refuse"
}

Заполнение по ячейкам и шкалы, которые отказывают

Уровни, добавляемые списком

"extra": { "list": "scars", "countColumn": "levels", "penaltyColumn": "penalty" } у шкалы с именованными уровнями позволяет списку в листе удлинять ее для каждого персонажа. Каждая строка по порядку добавляет свое число уровней (не больше 16) со своим штрафом после последнего уровня, штраф которого не хуже; уровни называются по этому уровню, если штрафы совпадают, и по штрафу в остальных случаях. Так устроены шрамы в Gravewatch. Скрытый листом список ничего не добавляет, а если удалить строку, пока ее уровни отмечены, непоместившиеся отметки сохраняются как переполнение: правка листа не отменяет вред.

boxes, fill, onFull, extra и kind в шаге отдыха требуют Capability API 1.40 для набора в составе пакета.

Штраф к броскам

resolution.penaltyFrom указывает шкалу ран, штраф которой действует на каждую проверку набора. Это декларация, не предположение: без нее броски работают точно как до появления шкал ран.

ДЕЙСТВИЕ штрафа определяет вид разрешения, как и значение числа листа:

Ссылка должна указывать шкалу ран. Обычная шкала не имеет штрафа и отклоняется при импорте. Результат называет примененный штраф, чтобы игрок понимал меньшее число костей, а блок листа для Game Master показывает ступень и ее цену.

Модификаторы из листа

Некоторые числа листа сопровождают каждый бросок, которого касаются: тяжелый мешок при каждом подъеме, штраф доспеха при каждой попытке подкрасться, благословение на все. resolution.adjust описывает это для любого вида:

"adjust": [{ "value": { "derived": "burdened" }, "abilities": ["brawn"] }]

Результат сообщает, что добавил лист (adjust="-2" в записи броска и строка на карточке броска), чтобы игрок видел, почему бросок вышел таким. Это Capability API 1.38 для набора в составе пакета.

Отдых

Отдых – список шагов восстановления и очищаемых вещей. Каждый шаг называет одну цель (pool, poolGroup, listPools, track или state) и задает значение ("to": "max", "to": "min" либо число) или меняет его ("by": { "const": 1 } либо "by": { "fractionOfMax": 0.5 }). Шаг шкалы ран может только лечить, поэтому его by отрицателен; см. выше. Шаг текущего режима только задает его – "default" или одно из его значений. Шаг poolGroup с fractionOfMax меняет каждый запас группы на его собственную долю; добавьте "shared": true (Capability API 1.77), чтобы вместо этого вычислить долю от максимума всей группы и раздать ее запасам группы в порядке их перечисления в листе, каждому не больше, чем ему не хватает. Долгий отдых 5e, "половина общего числа" костей хитов, хранящихся в отдельном запасе для каждого вида кости, – это { "poolGroup": "hit_dice", "by": { "fractionOfMax": 0.5, "round": "down", "min": 1 }, "shared": true }.

Текст Game Master

Полный справочник правил для GM

Необязательный ключ верхнего уровня gmReference содержит полный справочник правил набора для Game Master, до 16 000 символов. Помещайте сюда развернутые правила судейства, а короткие указания о проверках и ресурсах оставляйте в gm.checkGuidance и gm.sheetGuidance. Для этих полей и для gm.worldGuidance по-прежнему действует ограничение в 1 500 символов; указания слоев тоже сохраняют свои прежние ограничения.

"gmReference": "When a journey crosses hostile country, judge supplies, shelter and exposure before the next leg. A failed navigation check costs time rather than silently moving the party to its destination."

Справочник появляется под заголовком Game Master rules reference в стабильном системном промпте, один раз на запрос. Он никогда не копируется в напоминание на каждом ходу. Как и другой безопасный для промпта текст, он должен быть одной строкой без управляющих символов, квадратных скобок и фигурных скобок макросов ({{ и }}). Если после обычных поправок истории и бюджета ответа запрос все равно превышает лимит контекста, справочник сокращается с отмеченным обрезом раньше, чем обрезаются основные инструкции. Не задавайте его, чтобы сохранить прежние промпты. Пакет, который его использует, должен объявить в манифесте schemaVersion: 2 и capabilityApi: { "major": 1, "minor": 145 } или новее.

Часы прогресса отряда и сцены (clocks)

Capability API 1.143 добавляет необязательный объект верхнего уровня clocks. Опустите его, чтобы команды часов оставались отключенными. Объект строгий: принимаются только эти три ключа.

"clocks": {
  "sizes": [4, 6, 8],
  "max": 8,
  "text": "Create clocks for looming threats and long projects. Tick them when the fiction advances."
}

sizes допускает от одного до шести уникальных целых чисел сегментов, каждое от 2 до 12; по умолчанию [4, 6, 8]. max – наибольшее число часов, которые хранятся одновременно, от 1 до 12, по умолчанию 8. Необязательный text – одна безопасная для промпта строка до 400 символов, объясняющая, когда GM следует заводить и отмечать часы. Пустой объект включает значения по умолчанию.

Часы принадлежат отряду или сцене, а не персонажу. Напоминание для GM каждый ход перечисляет их имена и заполнение и обучает следующим командам:

Имена – одиночные строки от 1 до 100 символов без двойных кавычек, квадратных скобок, управляющих символов и фигурных скобок макросов. Каждый тег запрашивает ровно одно действие. Команды применяются в порядке ответа, поэтому часы можно создать и отметить в одном ответе. Engine переписывает каждый тег с result="ok" now="4/6" (или now="cleared") либо с result="refused" reason="...". Атрибуты результата, выданные моделью, отбрасываются. Неизвестные часы и некорректные запросы отклоняются; за один ответ применяется не больше 40 команд.

Game Mode показывает круг из сегментов, имя и заполнение рядом с состоянием отряда. Теги остаются в сохраненном ответе как квитанции и скрыты из повествования. Часы хранятся в каждом снимке состояния игры как rulesetClocks; отсутствие данных означает, что часов нет. Перегенерация начинается с предыдущего снимка, продолжение – с текущего, а выбор или удаление свайпов и сообщений восстанавливает часы вместе с остальным снимком.

Лист отряда: банда, корабль или общие Story Points

Capability API 1.144 добавляет необязательный ключ верхнего уровня party рядом с sheet. Он содержит один общий лист на игру, например банду в Blades, корабль в Lasers & Feelings или Story Points в Genesys:

"party": {
  "label": "Crew",
  "fields": [
    { "id": "heat", "label": "Heat", "type": "number", "min": 0, "max": 9, "default": 0 },
    { "id": "vault", "label": "Vault capacity", "type": "number", "min": 0, "max": 16, "default": 8 },
    { "id": "upgrades", "label": "Upgrades", "type": "text", "maxLength": 400 }
  ],
  "pools": [{ "id": "coin", "label": "Coin", "max": { "field": "vault" }, "start": "empty" }],
  "advancement": { "fields": ["heat", "vault", "upgrades"], "text": "Record heat after a score." },
  "text": "Coin belongs to the crew."
}

fields использует ту же схему полей, что и sheet.fields; pools – схему sheet.live.pools, включая start, group, hideWhen и allowTemp. Нужно хотя бы одно поле или запас, и их идентификаторы должны быть уникальны в пределах листа отряда. Идентификаторы персонажа и отряда могут совпадать. В этой минорной версии у листов отряда нет секций, списков, характеристик, производных значений и миграций листа персонажа. max запаса читает константу или числовое поле отряда. Формулы персонажа не могут читать значения отряда, а формулы отряда – значения персонажа. hideWhen тоже называет только поля отряда.

advancement.fields называет поля типа number, text или longtext, которые GM может менять насовсем. advancement.text и text принимают по одной безопасной для промпта строке не длиннее 400 символов. Необязательный summary повторно использует gm.sheetSummary: его fields выбирают поля отряда; derived и lists должны быть пустыми. Без сводки показываются все видимые поля отряда. Запасы показываются всегда.

[sheet: sheet="party" op="restore" pool="coin" amount="3"]
[sheet: sheet="party" op="spend" pool="coin" amount="2"]
[sheet: sheet="party" op="advance" field="heat" by="2"]
[sheet: sheet="party" op="advance" field="upgrades" to="Hidden vault"]

sheet="party" выбирает общий лист; who не указывайте. Существующий who="party" по-прежнему применяется к каждому персонажу и никогда не меняет общий лист. Эта минорная версия разрешает на листе отряда spend, restore и advance для полей. Неизвестные листы, неподдерживаемые операции, недостаточные запасы, необъявленное развитие и недопустимые значения отклоняются, и тег переписывается с результатом Engine. Запасы отряда следуют той же арифметике текущего значения и максимума и тем же значениям по умолчанию, что и запасы персонажа.

GM каждый ход получает подпись, поля и запасы отряда рядом с блоками листов персонажей. Game Mode предлагает сворачиваемый лист отряда только для чтения рядом с портретами персонажей, в том же оформлении листа. Постоянные значения хранятся один раз в метаданных чата (gamePartySheet) рядом с gameCharacterCards и разделяют квитанции развития. Текущие запасы используют зарезервированную запись $party в rulesetLive; нормализованные имена персонажей не могут с ней совпасть. Перегенерация начинается до ответа, а выбор или удаление свайпа восстанавливает и постоянные, и текущие значения через существующую историю. Наборы без party сохраняют прежнее поведение.

Совместное создание отряда (Capability API 1.163). Лист отряда может нести lists (до 12, записываются как списки листа персонажа), собственный пошаговый builder и fromMembers: до 8 числовых полей отряда, читаемых с персонажей отряда, каждое в виде { "field", "count": true } (сколько персонажей) или { "field", "sum": "<character number field>" } (сколько составляют в сумме их значения, например точки Totem). Поля участников вычисляются из персонажей в их текущем виде при каждом чтении общего листа, поэтому присоединение или уход персонажа сразу их меняет. Если есть списки, их может называть summary.lists отряда.

Конструктор пишется точно так же, как конструктор персонажа (запасы, шаги, строки с ценой, предложения расходов, профили), и подчиняется тем же правилам относительно собственных полей и списков отряда. Его шаги каталога и копирования строк могут читать каталоги набора, которые наполняют списки отряда. В Game Mode любой игрок открывает у общего листа кнопку Edit, где есть пошаговая настройка, и сохраняет лист для всего отряда. Каждое сохранение называет версию, от которой его открыли (gamePartySheetRevision в метаданных чата, повышается при каждом сохранении и при изменениях самой истории): сохранение, открытое до того, как сохранил кто-то другой, отклоняется, показывается более новый лист, а черновик игрока остается открытым, так что повторное сохранение – это его осознанный выбор заменить лист.

"party": {
  "label": "The Crew",
  "fields": [
    { "id": "tier", "label": "Tier", "type": "number", "min": 0, "max": 4, "default": 0 },
    { "id": "size", "label": "Crew size", "type": "number", "min": 0, "max": 12, "default": 0 }
  ],
  "lists": [{ "id": "upgrades", "label": "Upgrades", "columns": [{ "id": "name", "label": "Name", "type": "text" }] }],
  "builder": { "steps": [{ "id": "upgrades", "label": "Upgrades", "kind": "rows", "list": "upgrades" }] },
  "fromMembers": [{ "field": "size", "count": true }]
}