Code frameworks
Layouts e fichas
Desenhe uma ficha com um Frame, ligue-a aos seus campos e conecte os botões às ações.
Um arquivo de Frame
Um Frame é um arquivo JSON em layouts/. Um Framework o lista em frames. Esta é a ficha do Keeper.
"dataContract": {
"requiredBindings": [
{ "binding": "element.attributes.name", "expectedType": "string" },
{ "binding": "element.attributes.hp", "expectedType": "number" },
{ "binding": "element.attributes.max_hp", "expectedType": "number" }
],
"optionalBindings": [],
"actions": [
{ "name": "hurt", "functionRef": "hurt" },
{ "name": "heal", "functionRef": "heal" }
],
"regions": []
},- Linhas 11-15 requiredBindings lista todo campo que o texto usa, com o seu tipo.
- Linhas 17-20 Aliases de ação: um nome para os botões usarem e o id da ação que ele chama.
layouts/keeper.json
{
"version": "1.0",
"metadata": {
"name": "Keeper sheet",
"bindingMode": "bound",
"frameworkRef": "keeper",
"context": "BLADE",
"template": "standard-blade"
},
"dataContract": {
"requiredBindings": [
{ "binding": "element.attributes.name", "expectedType": "string" },
{ "binding": "element.attributes.hp", "expectedType": "number" },
{ "binding": "element.attributes.max_hp", "expectedType": "number" }
],
"optionalBindings": [],
"actions": [
{ "name": "hurt", "functionRef": "hurt" },
{ "name": "heal", "functionRef": "heal" }
],
"regions": []
},
"layout": {
"kind": "container",
"children": [
{ "kind": "text", "text": "{{element.attributes.name}}" },
{
"kind": "text",
"text": "HP: {{element.attributes.hp}} / {{element.attributes.max_hp}}"
},
{ "kind": "button", "label": "Take damage", "actionRef": "hurt" },
{ "kind": "button", "label": "Heal", "actionRef": "heal" }
]
}
}| Parte | O que contém |
|---|---|
| version | A versão do formato do Frame. Use 1.0, ou 2.0 para um Frame que desenha uma lista. |
| metadata | O name, o bindingMode bound e o frameworkRef, o id do Framework ao qual o Frame pertence. Mantenha context e template como no exemplo. |
| dataContract | Os campos que o Frame lê e as ações que seus botões podem chamar. |
| layout | Uma árvore de nós. O exemplo usa nós container, text e button. |
Um container aceita suas configurações de layout em um objeto layout ao lado de kind. Um nó text aceita configurações de estilo como fontSize e fontWeight. Um Frame não tem código, manipuladores de eventos nem HTML bruto.
"kind": "container",
"layout": { "direction": "column", "gap": 12, "padding": 16 },
"children": [- Linha 25 O tipo do nó.
- Linha 26 As configurações de layout: direction, gap e padding.
- Linha 27 Os nós dentro do contêiner.
Vínculos
O texto mostra um valor salvo com {{element.attributes.field}}. Liste cada campo que você usa em requiredBindings com seu tipo. Um vínculo com um campo que não existe é recusado.
{
"kind": "text",
"text": "HP: {{element.attributes.hp}} / {{element.attributes.mana}}"
}FRAME_BINDING_UNKNOWN: element.attributes.manaBotões e ações
O dataContract lista aliases de ação. Cada alias tem um name e um functionRef, que é o id de uma ação do mesmo Framework. Um botão indica um alias em actionRef.
"layout": {
"kind": "container",
"children": [
{ "kind": "text", "text": "{{element.attributes.name}}" },
{
"kind": "text",
"text": "HP: {{element.attributes.hp}} / {{element.attributes.max_hp}}"
},
{ "kind": "button", "label": "Take damage", "actionRef": "hurt" },
{ "kind": "button", "label": "Heal", "actionRef": "heal" }
]
}- Linhas 26-30 Os nós de texto mostram campos com chaves duplas.
- Linhas 31-32 Os botões indicam em actionRef um alias de dataContract.actions.
{ "kind": "button", "label": "Take damage", "actionRef": "mend" }ACTION_MISSING: Action "mend" not found in framework's actionFunctions/ledgerFunctionsDados no texto
Escreva uma rolagem de dados dentro do texto, como [[1d20+{{element.attributes.guard}}]]. O jogador rola com os controles de dados normais do Fabled. Um número vinculado deve ser um campo declarado e aparecer em requiredBindings.
"text": "Defend: [[1d20+{{element.attributes.guard}}]]"- Linha 39 Uma anotação de dados fica entre colchetes duplos. O campo deve estar listado em requiredBindings.
Como uma rolagem chega a uma ação
Uma anotação de dados mostra um selo de dados. Quando um jogador clica nele, o Fabled rola os dados e mostra o resultado no registro de dados e no chat da mesa. A rolagem não escreve no ledger e não preenche uma entrada de ação. Uma entrada com a chave roll é, em vez disso, rolada pelo servidor, como descrito abaixo.
Um botão também não pode guardar um valor nem uma rolagem. Quando um jogador usa o botão de uma ação que tem entradas, o Fabled abre uma caixa de diálogo e pede cada entrada. Então os passos são: role, leia o número, use o botão da ação e digite o número.
Escreva esses passos na ficha, para os jogadores os conhecerem. A regra deve conferir o número, porque a caixa de diálogo não o limita.
Para que o Fabled jogue pelo jogador, dê à entrada da ação uma chave roll, como mostra a página de esquemas de Framework. O diálogo mostra então um botão Jogar no lugar de um campo. O servidor joga os dados e o diálogo preenche o total num campo que o jogador não pode editar. O jogador pode jogar de novo, e o novo total substitui o anterior.
Uma jogada é gasta uma só vez. Quando a ação é executada, ela usa a jogada guardada pelo servidor, por isso um número não pode ser digitado nem usado duas vezes. Uma nova jogada anula as jogadas anteriores não gastas dessa entrada. Uma jogada fica ligada à campanha em que foi feita e expira após 15 minutos. Depois disso, o jogador joga de novo.
A jogada é publicada no registo da mesa para um público. Se a ação não indicar destinatários, vai para o público de jogadas do jogador, a mesma definição das outras jogadas de dados dele. Todos é uma jogada pública, só ele é um sussurro para si mesmo, e ele e os GMs é um sussurro para si mesmo e para os GMs.
Uma ação pode publicar uma linha de resultado no registro da mesa com um modelo log. A seção Linha de registo de uma ação da página Schemas de Framework mostra como. Uma rolagem na ficha publica apenas a sua própria rolagem de dados. As linhas de registro estão sendo liberadas e ainda podem não estar disponíveis em todos os jogos.
Um Frame para cada Framework
Todo Framework tem seus próprios Frames. O filho Lamp tem seu próprio cartão, ligado aos campos do Lamp.

