メインコンテンツへスキップ

コードフレームワーク

レイアウトとシート

フレームでシートを描き、フィールドにバインドし、ボタンをアクションに結び付けます。

フレームファイル

フレームは layouts/ にある JSON ファイルです。フレームワークは frames にそれを列挙します。これは 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. 11-15 行目 requiredBindings は、テキストが使うすべてのフィールドを型とともに一覧にします。
  2. 17-20 行目 アクションのエイリアスです。ボタンが使う名前と、呼び出すアクションの id を対応付けます。
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" }
    ]
  }
}
部品内容
versionフレーム形式のバージョンです。1.0 を使います。リストを描くフレームには 2.0 を使います。
metadataname、bindingMode の bound、そしてフレームが属するフレームワークの ID である frameworkRef です。context と template は例のままにしてください。
dataContractフレームが読み取るフィールドと、ボタンが呼び出せるアクションです。
layoutノードのツリーです。例では container、text、button のノードを使っています。

container には、kind の隣の layout オブジェクトにレイアウト設定を指定します。text ノードには fontSize や fontWeight などのスタイル設定を指定します。フレームには、コード、イベントハンドラー、生の HTML を含められません。

layouts/keeper.json
    "kind": "container",
    "layout": { "direction": "column", "gap": 12, "padding": 16 },
    "children": [
  1. 25 行目 ノードの種類です。
  2. 26 行目 レイアウト設定です。方向、間隔、余白を指定します。
  3. 27 行目 コンテナの中のノードです。

バインディング

テキストは {{element.attributes.field}} で保存値を表示します。使うフィールドはすべて、型とともに requiredBindings に列挙してください。存在しないフィールドへのバインディングは拒否されます。

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

ボタンとアクション

dataContract にはアクションのエイリアスを列挙します。各エイリアスは name と functionRef を持ち、functionRef は同じフレームワークのアクション ID です。ボタンは 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. 26-30 行目 テキストノードは二重の波かっこでフィールドを表示します。
  2. 31-32 行目 ボタンは actionRef に、dataContract.actions のエイリアスを指定します。
{ "kind": "button", "label": "Take damage", "actionRef": "mend" }
ACTION_MISSING: Action "mend" not found in framework's actionFunctions/ledgerFunctions

テキスト内のダイス

[[1d20+{{element.attributes.guard}}]] のように、テキストの中にダイスロールを書きます。プレイヤーは Fabled の通常のダイス操作でロールします。バインドする数値は宣言済みのフィールドで、requiredBindings に含まれている必要があります。

layouts/keeper.json
        "text": "Defend: [[1d20+{{element.attributes.guard}}]]"
  1. 39 行目 ダイス注釈は二重の角かっこの中に書きます。そのフィールドは requiredBindings に一覧されている必要があります。

ロールがアクションに届くまで

ダイス注釈にはダイスのバッジが表示されます。プレイヤーがそれをクリックすると、Fabled がダイスを振り、結果をテーブルのダイスログとチャットに表示します。ロールはレジャーに書き込まず、アクションの入力も埋めません。一方、roll キーを持つ入力は、後述のとおりサーバーがロールします。

ボタンにも、値やロールを持たせることはできません。入力のあるアクションのボタンをプレイヤーが使うと、Fabled はダイアログを開き、入力ごとに値を尋ねます。手順は、ロールする、数値を読む、アクションのボタンを使う、数値を入力する、の順です。

この手順をシートに書いて、プレイヤーに伝えてください。ダイアログは数値を制限しないので、ルールが数値を確認する必要があります。

Fabled にプレイヤーの代わりにロールさせるには、Framework スキーマのページにあるとおり、アクション入力に roll キーを付けます。するとダイアログには、フィールドの代わりに「ロール」ボタンが表示されます。サーバーがダイスを振り、ダイアログは合計をプレイヤーが編集できないフィールドに入れます。プレイヤーはもう一度ロールでき、新しい合計が古いものと置き換わります。

ロールは一度だけ消費されます。アクションは実行時にサーバーが保持したロールを使うので、数値を入力したり二度使ったりすることはできません。新しいロールは、その入力の未消費の以前のロールを無効にします。ロールは行われたキャンペーンに紐づき、15 分で期限切れになります。その後はもう一度ロールします。

ロールは、ある公開範囲でテーブルのログに投稿されます。アクションが受信者を指定しない場合、プレイヤーのロール公開範囲に送られます。これは他のダイスロールと同じ設定です。「全員」は公開ロール、「本人のみ」は自分へのささやき、「本人と GM」は自分と GM へのささやきです。

アクションは、log テンプレートを使って、結果の行をテーブルのログに投稿できます。方法は「フレームワークスキーマ」のページの「アクションのログ行」で説明しています。シート上のロールが投稿するのは、そのロール自身の結果だけです。 ログ行は順次提供中で、まだすべてのゲームで使えるとは限りません。

フレームワークごとに 1 つのフレーム

すべてのフレームワークは、それぞれのフレームを持ちます。子の Lamp には、Lamp のフィールドにバインドした専用のカードがあります。

次へ