Code frameworks
Diseños y hojas
Dibuja una hoja con un Frame, enlázala con tus campos y conecta sus botones con acciones.
Un archivo de Frame
Un Frame es un archivo JSON de layouts/. Un Framework lo enumera en frames. Esta es la hoja del 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": []
},- Líneas 11-15 requiredBindings enumera cada campo que usa el texto, con su tipo.
- Líneas 17-20 Alias de acción: un nombre que usan los botones y el id de la acción a la que llama.
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 | Qué contiene |
|---|---|
| version | La versión del formato del Frame. Usa 1.0, o 2.0 para un Frame que dibuja una lista. |
| metadata | El nombre, bindingMode bound y frameworkRef, el id del Framework al que pertenece el Frame. Deja context y template como en el ejemplo. |
| dataContract | Los campos que lee el Frame y las acciones que pueden llamar sus botones. |
| layout | Un árbol de nodos. El ejemplo usa nodos container, text y button. |
Un container admite sus ajustes de diseño en un objeto layout junto a kind. Un nodo text admite ajustes de estilo como fontSize y fontWeight. Un Frame no contiene código, controladores de eventos ni HTML sin procesar.
"kind": "container",
"layout": { "direction": "column", "gap": 12, "padding": 16 },
"children": [- Línea 25 El tipo de nodo.
- Línea 26 Los ajustes de diseño: dirección, separación y relleno.
- Línea 27 Los nodos dentro del contenedor.
Enlaces
El texto muestra un valor guardado con {{element.attributes.field}}. Enumera cada campo que uses en requiredBindings con su tipo. Se rechaza un enlace a un campo que no existe.
{
"kind": "text",
"text": "HP: {{element.attributes.hp}} / {{element.attributes.mana}}"
}FRAME_BINDING_UNKNOWN: element.attributes.manaBotones y acciones
El dataContract enumera alias de acciones. Cada alias tiene un name y un functionRef, que es el id de una acción del mismo Framework. Un botón nombra un alias en 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" }
]
}- Líneas 26-30 Los nodos de texto muestran campos con llaves dobles.
- Líneas 31-32 Los botones nombran en actionRef un alias de dataContract.actions.
{ "kind": "button", "label": "Take damage", "actionRef": "mend" }ACTION_MISSING: Action "mend" not found in framework's actionFunctions/ledgerFunctionsDados en el texto
Escribe una tirada de dados dentro del texto, como [[1d20+{{element.attributes.guard}}]]. El jugador tira con los controles de dados habituales de Fabled. Un número enlazado debe ser un campo declarado y aparecer en requiredBindings.
"text": "Defend: [[1d20+{{element.attributes.guard}}]]"- Línea 39 Una anotación de dados va entre dobles corchetes. El campo debe estar en requiredBindings.
Cómo llega una tirada a una acción
Una anotación de dados muestra una insignia de dados. Cuando un jugador hace clic en ella, Fabled tira los dados y muestra el resultado en el registro de dados y en el chat de la mesa. La tirada no escribe en el ledger y no rellena una entrada de acción. En cambio, una entrada con la clave roll la tira el servidor, como se describe más abajo.
Un botón tampoco puede guardar un valor ni una tirada. Cuando un jugador usa el botón de una acción con entradas, Fabled abre un cuadro de diálogo y pide cada entrada. Así que los pasos son: tirar, leer el número, usar el botón de la acción y escribir el número.
Escribe esos pasos en la hoja para que los jugadores los conozcan. La regla debe comprobar el número, porque el cuadro de diálogo no lo limita.
Para que Fabled tire por el jugador, da a la entrada de la acción una clave roll, como muestra la página de esquemas de Framework. El diálogo muestra entonces un botón Tirar en lugar de un campo. El servidor tira los dados y el diálogo rellena el total en un campo que el jugador no puede editar. El jugador puede tirar de nuevo, y el nuevo total sustituye al anterior.
Una tirada se gasta una sola vez. Al ejecutarse, la acción toma la tirada que guardó el servidor, así que un número no puede escribirse ni usarse dos veces. Una tirada nueva anula las tiradas anteriores sin gastar de esa entrada. Una tirada queda ligada a la campaña en la que se hizo y caduca a los 15 minutos. Pasado ese tiempo, el jugador tira de nuevo.
La tirada se publica en el registro de la mesa para una audiencia. Si la acción no nombra destinatarios, va a la audiencia de tiradas del jugador, el mismo ajuste que usan sus demás tiradas de dados. Todos es una tirada pública, solo él es un susurro para sí mismo, y él y los GM es un susurro para sí mismo y los GM.
Una acción puede publicar una línea de resultado en el registro de la mesa con una plantilla log. La sección Línea de registro de una acción de la página Esquemas de Framework muestra cómo. Una tirada en la hoja solo publica su propia tirada de dados. Las líneas de registro se están desplegando y puede que aún no estén disponibles en todos los juegos.
Un Frame para cada Framework
Cada Framework tiene sus propios Frames. El hijo Lamp tiene su propia carta, enlazada con los campos de Lamp.

