Przejdź do głównej treści

Frameworki kodowe

Układy i karty

Narysuj kartę za pomocą ramki, powiąż ją ze swoimi polami i połącz jej przyciski z akcjami.

Plik ramki

Ramka to plik JSON w layouts/. Framework wymienia ją w frames. To karta postaci 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. Wiersze 11-15 requiredBindings wymienia każde pole używane w tekście, razem z jego typem.
  2. Wiersze 17-20 Aliasy akcji: nazwa dla przycisków i id akcji, którą wywołują.
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" }
    ]
  }
}
CzęśćCo zawiera
versionWersja formatu ramki. Użyj 1.0, a dla ramki, która rysuje listę, 2.0.
metadataNazwa, bindingMode ustawione na bound oraz frameworkRef, czyli id frameworka, do którego należy ramka. Zostaw context i template jak w przykładzie.
dataContractPola, które ramka czyta, i akcje, które mogą wywoływać jej przyciski.
layoutDrzewo węzłów. Przykład używa węzłów container, text i button.

Węzeł container przyjmuje ustawienia układu w obiekcie layout obok kind. Węzeł text przyjmuje ustawienia stylu, takie jak fontSize i fontWeight. Ramka nie zawiera kodu, obsługi zdarzeń ani surowego HTML.

layouts/keeper.json
    "kind": "container",
    "layout": { "direction": "column", "gap": 12, "padding": 16 },
    "children": [
  1. Wiersz 25 Rodzaj węzła.
  2. Wiersz 26 Ustawienia układu: direction, gap i padding.
  3. Wiersz 27 Węzły wewnątrz kontenera.

Powiązania

Tekst pokazuje zapisaną wartość przez {{element.attributes.field}}. Wymień każde używane pole w requiredBindings razem z jego typem. Powiązanie z polem, które nie istnieje, zostanie odrzucone.

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

Przyciski i akcje

dataContract wymienia aliasy akcji. Każdy alias ma nazwę i functionRef, czyli id akcji tego samego frameworka. Przycisk wskazuje alias w 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. Wiersze 26-30 Węzły tekstowe pokazują pola w podwójnych nawiasach klamrowych.
  2. Wiersze 31-32 Przyciski wskazują w actionRef alias z dataContract.actions.
{ "kind": "button", "label": "Take damage", "actionRef": "mend" }
ACTION_MISSING: Action "mend" not found in framework's actionFunctions/ledgerFunctions

Kości w tekście

Napisz rzut kośćmi w tekście, na przykład [[1d20+{{element.attributes.guard}}]]. Gracz rzuca zwykłymi kontrolkami kości w Fabled. Powiązana liczba musi być zadeklarowanym polem i znajdować się w requiredBindings.

layouts/keeper.json
        "text": "Defend: [[1d20+{{element.attributes.guard}}]]"
  1. Wiersz 39 Adnotacja kości stoi w podwójnych nawiasach kwadratowych. Pole musi być wymienione w requiredBindings.

Jak rzut trafia do akcji

Adnotacja kości pokazuje znaczek kości. Gdy gracz w niego kliknie, Fabled rzuca kośćmi i pokazuje wynik w dzienniku rzutów stołu i na czacie. Rzut nie zapisuje do ledgera i nie wypełnia danych wejściowych akcji. Dane wejściowe z kluczem roll rzuca natomiast serwer, jak opisano niżej.

Przycisk też nie może przechowywać wartości ani rzutu. Gdy gracz użyje przycisku akcji z danymi wejściowymi, Fabled otwiera dialog i pyta o każde dane wejściowe. Kroki są więc takie: rzuć, odczytaj liczbę, użyj przycisku akcji i wpisz liczbę.

Napisz te kroki na karcie, aby gracze je znali. Reguła musi sprawdzić liczbę, bo dialog jej nie ogranicza.

Aby Fabled rzucał za gracza, nadaj danym wejściowym akcji klucz roll, jak pokazuje strona schematów Framework. Okno pokazuje wtedy przycisk Rzuć zamiast pola. Serwer rzuca kośćmi, a okno wpisuje sumę w polu, którego gracz nie może edytować. Gracz może rzucić ponownie, a nowa suma zastępuje starą.

Rzut zużywa się raz. Gdy akcja się wykonuje, bierze rzut zapisany przez serwer, więc liczby nie można wpisać ani użyć dwa razy. Nowy rzut unieważnia wcześniejsze niezużyte rzuty tych danych wejściowych. Rzut jest powiązany z kampanią, w której go wykonano, i wygasa po 15 minutach. Potem gracz rzuca ponownie.

Rzut trafia do dziennika stołu dla pewnej widowni. Jeśli akcja nie wskazuje odbiorców, trafia do widowni rzutów gracza, czyli tego samego ustawienia co jego inne rzuty kośćmi. Wszyscy to rzut publiczny, tylko on to szept do siebie, a on i MG to szept do siebie i do MG.

Akcja może opublikować wiersz z wynikiem w dzienniku stołu za pomocą szablonu log. Sekcja Wiersz dziennika akcji na stronie Schematy frameworków pokazuje jak. Rzut na karcie publikuje tylko własny rzut kośćmi. Wiersze dziennika są w trakcie wdrażania i mogą jeszcze nie być dostępne w każdej grze.

Jedna ramka dla każdego frameworka

Każdy framework ma własne ramki. Element podrzędny Lamp ma własną kartę, powiązaną z polami Lamp.

Dalej