Fichas de conjuntos de regras

Use esta página para montar a ficha de personagem de um conjunto de regras: atributos, perícias, campos e listas, estados vivos, trilhas de ferimentos, penalidades, descansos e o texto do Game Master, além da ficha do grupo e dos relógios de progresso. Ela é para autores de conjuntos de regras. Antes de começar, leia Escrever conjuntos de regras de Game Mode.

A ficha

Tudo que lê um número o nomeia com uma referência de valor: um objeto com exatamente uma chave entre const, field, derived, abilityScore, abilityMod, abilityModFromField, skillMod, saveMod, listSum, livePool, liveTrack e itemStat. Por exemplo, uma reserva cujo máximo é derivado: "max": { "derived": "grit_max" }.

O que um teste faz sem treinamento. Uma perícia ou salvaguarda em que o personagem não tem treinamento (seu nível é o primeiro) rola normalmente, a menos que o conjunto diga o contrário, com untrained na perícia ou salvaguarda ou na seção em que ela fica (a regra da própria perícia ou salvaguarda prevalece):

"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" }
]

Seções em atributos, perícias e salvaguardas, e untrained em qualquer lugar, exigem Capability API 1.41 num conjunto empacotado.

Uma perícia ou salvaguarda pode ter um cap, uma referência de valor que é o máximo que seu teste pode alcançar: uma pontuação que ela não pode superar ou uma trilha que a segura. Gravewatch limita Soothe ao Resolve que resta a um guardião, "cap": { "livePool": "resolve" }. O número limitado é o que a ficha mostra e que todo teste rola, e uma troca com with= é calculada sobre o número antes do teto e depois limitada de novo. Um teto não pode ler um modificador de perícia ou de salvaguarda, e o valor derivado que ele lê, ou qualquer valor derivado declarado acima desse, também não pode, para que a ficha continue sendo calculada uma única vez, de cima para baixo. Capability API 1.39.

hideWhen oculta um campo, um valor derivado, uma lista, uma reserva ou uma trilha comum pelo valor de outro campo, de exatamente uma de três formas: equals um valor, notEquals um valor (oculto sempre que o campo contém qualquer outra coisa; é assim que algo fica restrito a um tipo de personagem) ou in uma lista de valores. Cada valor nomeado precisa ser um que o campo possa conter, ou a regra nunca coincidiria, e isso é verificado um valor por vez; para notEquals e in, isso inclui a faixa de um campo numérico e o comprimento de um campo de texto. A regra lê o valor que o editor de fichas mostra: um campo não definido é o valor com que uma ficha em branco começa, e um valor enum que o conjunto não oferece mais é o padrão do campo. O arquivo 5e usa equals para ocultar espaços de magia de um personagem que não lança magias; Gravewatch mantém o óleo de lanterna fora da ficha de todo guardião que não está na vigília noturna com "hideWhen": { "field": "watch", "notEquals": "night" }. Uma camada não pode remover um valor com o qual qualquer uma dessas regras compara. Uma trilha de ferimentos não pode ser ocultada, porque rolagens e lutas a leem seja o que for que a ficha mostre. notEquals e in exigem Capability API 1.39.

O max de uma trilha comum pode ser uma referência de valor em vez de um número, para que uma pontuação do personagem defina até onde ela vai: "max": { "field": "willpower_rating" }. Seus min e default continuam sendo números. Uma trilha de ferimentos com níveis nomeados tem um max igual ao seu número de níveis; uma trilha de casas numeradas tem o comprimento do próprio max (veja Casas numeradas abaixo). alwaysShow: true imprime uma trilha no bloco de ficha do GM mesmo no seu padrão, para uma pontuação que importa em todo turno; sem isso, uma trilha no padrão é omitida, porque três salvaguardas contra a morte em zero não dizem nada. Esses três exigem Capability API 1.37 num conjunto empacotado.

Estados vivos: uma forma, uma postura, uma luz

Um campo enum é escolhido quando o personagem é criado e continua escolhido, e uma condição só está ativa ou não. Um estado vivo é um valor de um conjunto fechado que muda durante a partida: a forma de um metamorfo, uma postura de luta, quão acesa está uma lanterna.

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

Números que acompanham. Um valor derivado com "op": "enumTable" dá um número para cada valor de um campo enum ou de um estado vivo:

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

Estados vivos, enumTable e um passo de descanso que nomeia um state exigem Capability API 1.42 num conjunto empacotado.

Trilhas de ferimentos: saúde marcada numa trilha

Muitos sistemas não contam pontos de vida. Têm uma coluna de casas, cada uma pior que a anterior, e você marca uma ao se ferir. Dê a uma entrada live.tracks os kinds e também levels nomeados ou boxes numeradas (abaixo) para que ela deixe de ser um número numa escala e vire uma dessas trilhas:

Qual formato seu sistema precisa? Uma reserva registra QUANTO dano entrou; uma trilha registra quanto E o tipo de cada parte. Se um ferimento é contundente, letal ou agravado e o tipo ainda importa após o golpe (porque o agravado cura mais devagar, não pode ser absorvido ou acaba matando), precisa continuar registrado após a rolagem. Só uma marca carrega isso. Uma reserva não pode: depois de subtrair o dano, só resta um número menor, sem lembrar quais pontos eram de cada tipo. Por isso combat.damageKinds é recusado quando a saúde é uma reserva, em vez de ignorado. Uma reserva ainda pode ter damageTypes, e oponentes podem resistir ou ser imunes a eles: isso trata de quanto dano entra, não de qual ferimento fica depois.

{
  "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 }
  ]
}

As regras exatas, porque uma leitura vaga produz a trilha errada:

Marcar durante a partida. O GM escreve [sheet: op="damage" track="harm" kind="knock" amount="1"] e cura com amount negativo. Numa trilha preenchida por casa, ele adiciona box="3" para indicar a casa que o golpe atinge. A forma de reserva de damage, que nomeia pool=, não muda. O comando comum track é recusado em trilhas de ferimentos: um número não identifica os tipos das novas marcas. O jogador também pode marcar e limpar casas manualmente na ficha, como esses sistemas esperam.

Uma luta também pode marcá-la. Aponte combat.health para a trilha em vez de uma reserva: um golpe acertado marca as casas indicadas por combat.damageKinds.marks, do tipo ao qual esse bloco mapeia seu tipo de dano. Um personagem com a trilha cheia está caído, o estado lido pela regra de morte. Numa trilha preenchida por casa, o dano per-point nomeia a casa que atinge e o per-blow mira a primeira, e um golpe que nenhuma casa pode receber derruba o personagem, que é o que ser posto fora de combate significa nos sistemas que usam esse tipo de trilha. Cura limpa uma marca, a mais leve, de qualquer tipo. Pontos temporários são recusados porque a trilha não tem um espaço para eles. O Engine lê a trilha como níveis RESTANTES; o restante da luta, cair, reviver, o registro e o resumo continuam iguais.

Um descanso pode curar a trilha. Uma restauração com "to" a reduz àquela quantidade de marcas, incluindo transbordamento; com um "by" NEGATIVO, limpa aquela quantidade, começando pelo transbordamento, então "by": { "const": -2 } limpa duas. Um passo que também nomeia um kind limpa só marcas desse tipo: o "Catch your breath" de Gravewatch é { "track": "harm", "kind": "knock", "to": "min" }, que cura as pancadas e deixa os rasgos. Um passo que ADICIONARIA marcas não faz nada, porque um descanso não marca dano, e isso inclui um "by" positivo: ele é ignorado sem aviso, então escreva o sinal de menos.

Casas numeradas em vez de níveis nomeados

Quando uma trilha tem o comprimento da resistência do personagem, dê a ela boxes em vez de levels. Ela tem tantas casas quanto o próprio max, que pode ser um valor calculado pela ficha (nunca um que leia o estado vivo), até 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"
}

Preencher por casa e trilhas que recusam

Níveis que uma lista adiciona

"extra": { "list": "scars", "countColumn": "levels", "penaltyColumn": "penalty" } numa trilha com níveis nomeados permite que uma lista da ficha a alongue por personagem. Cada linha, em ordem, adiciona sua quantidade de níveis (no máximo 16) com sua penalidade, depois do último nível cuja penalidade seja pelo menos tão boa, com o nome desse nível quando as penalidades coincidem e com o da penalidade caso contrário. As cicatrizes de Gravewatch funcionam assim. Uma lista que a ficha oculta não adiciona nada e, se uma linha for excluída enquanto seus níveis estão marcados, as marcas que não cabem mais ficam como transbordamento: editar a ficha não desfaz dano.

boxes, fill, onFull, extra e o kind de um passo de descanso exigem Capability API 1.40 num conjunto empacotado.

A penalidade nas rolagens

resolution.penaltyFrom nomeia a trilha de ferimentos cuja penalidade afeta todo teste do conjunto. É declarada, não presumida: sem ela, as rolagens continuam como antes da existência das trilhas.

O EFEITO da penalidade depende do tipo de resolução, assim como o número da ficha:

Ela precisa nomear uma trilha de ferimentos. Uma trilha comum não tem penalidade e é recusada na importação. O resultado indica a penalidade aplicada para explicar ao jogador seus dados a menos; o bloco de ficha do GM também mostra o patamar e seu custo.

Modificadores da ficha

Alguns números da ficha acompanham toda rolagem que afetam: uma mochila pesada em toda escalada, uma penalidade de armadura em toda tentativa de furtividade, uma bênção em tudo. resolution.adjust declara isso, nos dois tipos:

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

O resultado informa o que a ficha adicionou (adjust="-2" no registro e uma linha no cartão de dados), para que o jogador veja por que a rolagem saiu assim. Exige Capability API 1.38 num conjunto empacotado.

Descansos

Um descanso lista restaurações e elementos a limpar. Cada passo nomeia um alvo (pool, poolGroup, listPools, track ou state) e o define ("to": "max", "to": "min" ou um número) ou modifica ("by": { "const": 1 } ou "by": { "fractionOfMax": 0.5 }). Se nomeia uma trilha de ferimentos, só pode curá-la, então seu by é negativo; veja acima. Se nomeia um estado vivo, só pode defini-lo, como "default" ou um dos seus valores. Um passo poolGroup com fractionOfMax muda cada reserva do grupo pela própria fração; acrescente "shared": true (Capability API 1.77) para calcular a fração sobre o máximo do grupo inteiro e distribuí-la entre as reservas do grupo na ordem em que a ficha as lista, cada uma até o que lhe falta. O descanso longo de 5e, "metade do número total de" dados de vida do personagem, guardados numa reserva por tipo de dado, é { "poolGroup": "hit_dice", "by": { "fractionOfMax": 0.5, "round": "down", "min": 1 }, "shared": true }.

Texto do Game Master

Referência completa de regras para o GM

O gmReference opcional, no nível superior do arquivo, contém a referência completa de regras do conjunto para o Game Master, com até 16.000 caracteres. Coloque aqui as regras detalhadas de arbitragem e mantenha as instruções curtas de testes e recursos em gm.checkGuidance e gm.sheetGuidance. Esses campos, e gm.worldGuidance, continuam com seus limites de 1.500 caracteres; as orientações das camadas também mantêm seus limites atuais.

"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."

A referência aparece sob Game Master rules reference (referência de regras do Game Master) no prompt de sistema estável, uma vez por requisição. Ela nunca é copiada para o lembrete de cada turno. Como qualquer outro texto seguro para prompt, precisa ter uma única linha, sem caracteres de controle, colchetes nem chaves de macro ({{ e }}). Quando a requisição ainda passa do limite de contexto depois dos ajustes habituais no histórico e no orçamento da resposta, a referência é encurtada com um corte marcado antes que as instruções principais sejam cortadas. Deixe-a sem definir para manter os prompts atuais. Um pacote que a use precisa declarar no manifesto schemaVersion: 2 e capabilityApi: { "major": 1, "minor": 145 } ou mais recente.

Relógios de progresso do grupo e da cena (clocks)

A Capability API 1.143 acrescenta um objeto clocks opcional no nível superior. Omita-o para manter os comandos de relógio desativados. O objeto é estrito: só estas três chaves são aceitas.

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

sizes permite de uma a seis quantidades de segmentos inteiras e distintas, cada uma de 2 a 12; o padrão é [4, 6, 8]. max é o número máximo de relógios mantidos ao mesmo tempo, de 1 a 12, com padrão 8. O text opcional é uma linha segura para prompt, de até 400 caracteres, que explica quando o GM deve criar e avançar relógios. Um objeto vazio ativa os padrões.

Os relógios pertencem ao grupo e à cena, não a um personagem. O lembrete do GM lista os nomes e o preenchimento deles a cada turno e ensina estes comandos:

Os nomes são linhas únicas de 1 a 100 caracteres, sem aspas duplas, colchetes, caracteres de controle nem chaves de macro. Cada tag pede exatamente uma ação. Os comandos se aplicam na ordem da resposta, então um relógio pode ser criado e avançado na mesma resposta. O Engine reescreve cada tag com result="ok" now="4/6" (ou now="cleared"), ou com result="refused" reason="...". Atributos de resultado fornecidos pelo modelo são descartados. Relógios desconhecidos e pedidos malformados são recusados; no máximo 40 comandos se aplicam por resposta.

Game Mode mostra um círculo segmentado, o nome e o preenchimento ao lado do status do grupo. As tags ficam na resposta salva como comprovantes e são ocultadas da narração. Os relógios são guardados em cada instantâneo do estado da partida como rulesetClocks; dados ausentes significam nenhum relógio. Regenerar parte do instantâneo anterior, continuar parte do atual, e selecionar ou remover swipes/mensagens restaura os relógios junto com o resto daquele instantâneo.

Ficha do grupo: um bando, uma nave ou Story Points compartilhados

A Capability API 1.144 acrescenta um party opcional no nível superior, ao lado de sheet. Ele contém uma ficha compartilhada por partida, como o bando de Blades, a nave de Lasers & Feelings ou os Story Points de 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 usa o mesmo esquema de campo de sheet.fields; pools usa o de sheet.live.pools, inclusive start, group, hideWhen e allowTemp. É preciso pelo menos um campo ou uma reserva, e seus IDs precisam ser únicos dentro da ficha do grupo. IDs de personagem e do grupo podem coincidir. Nesta versão, fichas do grupo não têm seções, listas, atributos, valores derivados nem migrações de ficha de personagem. O max de uma reserva lê uma constante ou um campo numérico do grupo. Fórmulas de personagem não podem ler valores do grupo, e fórmulas do grupo não podem ler valores de personagem. hideWhen também só nomeia campos do grupo.

advancement.fields nomeia campos number, text ou longtext que o GM pode mudar de forma permanente. advancement.text e text aceitam, cada um, uma linha segura para prompt de no máximo 400 caracteres. O summary opcional reaproveita gm.sheetSummary: seus fields escolhem campos do grupo; derived e lists precisam ficar vazios. Sem resumo, todos os campos visíveis do grupo são mostrados. As reservas sempre aparecem.

[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" escolhe a ficha compartilhada; deixe who de fora. O who="party" existente continua se aplicando a cada personagem e nunca muda a ficha compartilhada. Esta versão permite spend, restore e o advance de um campo na ficha do grupo. Fichas desconhecidas, operações sem suporte, reservas insuficientes, avanços não declarados e valores inválidos são recusados e reescritos com o resultado do Engine. As reservas do grupo seguem a mesma aritmética de valor atual e máximo e os mesmos padrões das reservas de personagem.

O GM recebe o rótulo, os campos e as reservas do grupo ao lado dos blocos de ficha dos personagens a cada turno. Game Mode oferece uma ficha do grupo recolhível e somente leitura ao lado dos retratos dos personagens, com a mesma apresentação de ficha. Os valores permanentes ficam uma única vez nos metadados do chat (gamePartySheet), ao lado de gameCharacterCards, e compartilham os comprovantes de avanço. As reservas vivas usam a entrada reservada $party de rulesetLive; nomes de personagem normalizados não podem colidir com ela. Regenerar parte de antes da resposta, e selecionar ou excluir um swipe restaura os valores permanentes e os vivos pelo histórico existente. Conjuntos sem party mantêm o comportamento atual.

Criação compartilhada do grupo (Capability API 1.163). Uma ficha do grupo pode ter lists (até 12, escritas como as listas da ficha de personagem), um builder guiado próprio e fromMembers: até 8 campos numéricos do grupo lidos dos personagens do grupo, cada um { "field", "count": true } (quantos personagens há) ou { "field", "sum": "<character number field>" } (quanto os deles somam, como os pontos de Totem). Os campos de membros são calculados a partir dos personagens como estiverem sempre que a ficha compartilhada é lida, então um personagem que entra ou sai os muda na hora. Com listas, o summary.lists do grupo pode nomeá-las.

O construtor é escrito exatamente como o de um personagem (reservas, etapas, linhas com preço, ofertas de gasto, perfis) e segue as mesmas regras, aplicadas aos campos e às listas do próprio grupo. Suas etapas de catálogo e de cópia de linhas podem ler os catálogos do conjunto que alimentam listas do grupo. Em Game Mode, qualquer jogador abre o Edit da ficha compartilhada, que oferece a configuração guiada, e a salva para o grupo inteiro. Cada salvamento nomeia a revisão em que foi aberto (gamePartySheetRevision nos metadados do chat, aumentada a cada salvamento e pelas mudanças da própria história): um salvamento aberto antes de o de outra pessoa entrar é recusado, a ficha mais nova é mostrada, e o rascunho do jogador continua aberto, então salvar de novo é escolha dele para substituí-la.

"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 }]
}