Salta al contenuto principale

Framework in codice

Layout e schede

Disegna una scheda con un Frame, collegala ai tuoi campi e collega i suoi pulsanti alle azioni.

Un file Frame

Un Frame è un file JSON in layouts/. Un Framework lo elenca in frames. Questa è la scheda del Keeper.

layouts/keeper.json
  "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": []
  },
  1. Righe 11-15 requiredBindings elenca ogni campo usato dal testo, con il suo tipo.
  2. Righe 17-20 Alias delle azioni: un nome che i pulsanti possono usare e l'id dell'azione che chiamano.
layouts/keeper.json
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" }
    ]
  }
}
ParteCosa contiene
versionLa versione del formato del Frame. Usa 1.0, oppure 2.0 per un Frame che disegna un elenco.
metadataIl nome, bindingMode bound e frameworkRef, l'id del Framework a cui il Frame appartiene. Lascia context e template come nell'esempio.
dataContractI campi che il Frame legge e le azioni che i suoi pulsanti possono chiamare.
layoutUn albero di nodi. L'esempio usa nodi container, text e button.

Un container riceve le sue impostazioni di disposizione in un oggetto layout accanto a kind. Un nodo text riceve impostazioni di stile come fontSize e fontWeight. Un Frame non contiene codice, gestori di eventi o HTML grezzo.

layouts/keeper.json
    "kind": "container",
    "layout": { "direction": "column", "gap": 12, "padding": 16 },
    "children": [
  1. Riga 25 Il tipo di nodo.
  2. Riga 26 Le impostazioni di disposizione: direction, gap e padding.
  3. Riga 27 I nodi dentro il container.

Collegamenti

Il testo mostra un valore memorizzato con {{element.attributes.field}}. Elenca ogni campo che usi in requiredBindings con il suo tipo. Un collegamento a un campo che non esiste viene rifiutato.

{
  "kind": "text",
  "text": "HP: {{element.attributes.hp}} / {{element.attributes.mana}}"
}
FRAME_BINDING_UNKNOWN: element.attributes.mana

Pulsanti e azioni

Il dataContract elenca gli alias delle azioni. Ogni alias ha un nome e un functionRef, che è l'id di un'azione dello stesso Framework. Un pulsante nomina un alias in actionRef.

layouts/keeper.json
  "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" }
    ]
  }
  1. Righe 26-30 I nodi di testo mostrano i campi con le doppie parentesi graffe.
  2. Righe 31-32 I pulsanti indicano in actionRef un alias di dataContract.actions.
{ "kind": "button", "label": "Take damage", "actionRef": "mend" }
ACTION_MISSING: Action "mend" not found in framework's actionFunctions/ledgerFunctions

Dadi nel testo

Scrivi un tiro di dadi dentro il testo, per esempio [[1d20+{{element.attributes.guard}}]]. Il giocatore tira con i soliti controlli dei dadi di Fabled. Un numero collegato deve essere un campo dichiarato e comparire in requiredBindings.

layouts/keeper.json
        "text": "Defend: [[1d20+{{element.attributes.guard}}]]"
  1. Riga 39 Un'annotazione di dadi sta tra doppie parentesi quadre. Il campo deve essere elencato in requiredBindings.

Come un tiro arriva a un'azione

Un'annotazione di dadi mostra un badge dei dadi. Quando un giocatore lo clicca, Fabled tira i dadi e mostra il risultato nel registro dei dadi del tavolo e nella chat. Il tiro non scrive nel registro e non compila un input di azione. Un input con la chiave roll viene invece tirato dal server, come descritto sotto.

Anche un pulsante non può contenere un valore o un tiro. Quando un giocatore usa il pulsante di un'azione con input, Fabled apre una finestra di dialogo e chiede ogni input. Quindi i passi sono: tira, leggi il numero, usa il pulsante dell'azione e scrivi il numero.

Scrivi questi passi sulla scheda, così i giocatori li conoscono. La regola deve controllare il numero, perché la finestra non lo limita.

Perché Fabled tiri al posto del giocatore, dai all'input dell'azione una chiave roll, come mostra la pagina degli schemi Framework. La finestra mostra allora un pulsante Tira al posto di un campo. Il server tira i dadi e la finestra inserisce il totale in un campo che il giocatore non può modificare. Il giocatore può tirare di nuovo, e il nuovo totale sostituisce il precedente.

Un tiro si spende una sola volta. Quando l'azione viene eseguita, prende il tiro conservato dal server, quindi un numero non può essere digitato né usato due volte. Un nuovo tiro annulla i tiri precedenti non spesi di quell'input. Un tiro è legato alla campagna in cui è stato fatto e scade dopo 15 minuti. Dopo, il giocatore tira di nuovo.

Il tiro viene pubblicato nel registro del tavolo per un pubblico. Se l'azione non indica destinatari, va al pubblico dei tiri del giocatore, la stessa impostazione degli altri suoi tiri di dadi. Tutti è un tiro pubblico, solo lui un sussurro a se stesso, e lui e i GM un sussurro a se stesso e ai GM.

Un'azione può pubblicare una riga di risultato nel registro del tavolo con un modello log. La sezione Riga di registro di un'azione della pagina Schemi dei Framework mostra come. Un tiro sulla scheda pubblica solo il proprio tiro di dadi. Le righe di registro sono in fase di rilascio e potrebbero non essere ancora disponibili in ogni gioco.

Un Frame per ogni Framework

Ogni Framework ha i propri Frame. Il figlio Lamp ha la propria carta, collegata ai campi di Lamp.

Avanti