コードフレームワーク
レイアウトとシート
フレームでシートを描き、フィールドにバインドし、ボタンをアクションに結び付けます。
フレームファイル
フレームは layouts/ にある JSON ファイルです。フレームワークは frames にそれを列挙します。これは 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": []
},- 11-15 行目 requiredBindings は、テキストが使うすべてのフィールドを型とともに一覧にします。
- 17-20 行目 アクションのエイリアスです。ボタンが使う名前と、呼び出すアクションの id を対応付けます。
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 を使います。 |
| metadata | name、bindingMode の bound、そしてフレームが属するフレームワークの ID である frameworkRef です。context と template は例のままにしてください。 |
| dataContract | フレームが読み取るフィールドと、ボタンが呼び出せるアクションです。 |
| layout | ノードのツリーです。例では container、text、button のノードを使っています。 |
container には、kind の隣の layout オブジェクトにレイアウト設定を指定します。text ノードには fontSize や fontWeight などのスタイル設定を指定します。フレームには、コード、イベントハンドラー、生の HTML を含められません。
"kind": "container",
"layout": { "direction": "column", "gap": 12, "padding": 16 },
"children": [- 25 行目 ノードの種類です。
- 26 行目 レイアウト設定です。方向、間隔、余白を指定します。
- 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 でエイリアスを指定します。
"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" }
]
}- 26-30 行目 テキストノードは二重の波かっこでフィールドを表示します。
- 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 に含まれている必要があります。
"text": "Defend: [[1d20+{{element.attributes.guard}}]]"- 39 行目 ダイス注釈は二重の角かっこの中に書きます。そのフィールドは requiredBindings に一覧されている必要があります。
ロールがアクションに届くまで
ダイス注釈にはダイスのバッジが表示されます。プレイヤーがそれをクリックすると、Fabled がダイスを振り、結果をテーブルのダイスログとチャットに表示します。ロールはレジャーに書き込まず、アクションの入力も埋めません。一方、roll キーを持つ入力は、後述のとおりサーバーがロールします。
ボタンにも、値やロールを持たせることはできません。入力のあるアクションのボタンをプレイヤーが使うと、Fabled はダイアログを開き、入力ごとに値を尋ねます。手順は、ロールする、数値を読む、アクションのボタンを使う、数値を入力する、の順です。
この手順をシートに書いて、プレイヤーに伝えてください。ダイアログは数値を制限しないので、ルールが数値を確認する必要があります。
Fabled にプレイヤーの代わりにロールさせるには、Framework スキーマのページにあるとおり、アクション入力に roll キーを付けます。するとダイアログには、フィールドの代わりに「ロール」ボタンが表示されます。サーバーがダイスを振り、ダイアログは合計をプレイヤーが編集できないフィールドに入れます。プレイヤーはもう一度ロールでき、新しい合計が古いものと置き換わります。
ロールは一度だけ消費されます。アクションは実行時にサーバーが保持したロールを使うので、数値を入力したり二度使ったりすることはできません。新しいロールは、その入力の未消費の以前のロールを無効にします。ロールは行われたキャンペーンに紐づき、15 分で期限切れになります。その後はもう一度ロールします。
ロールは、ある公開範囲でテーブルのログに投稿されます。アクションが受信者を指定しない場合、プレイヤーのロール公開範囲に送られます。これは他のダイスロールと同じ設定です。「全員」は公開ロール、「本人のみ」は自分へのささやき、「本人と GM」は自分と GM へのささやきです。
アクションは、log テンプレートを使って、結果の行をテーブルのログに投稿できます。方法は「フレームワークスキーマ」のページの「アクションのログ行」で説明しています。シート上のロールが投稿するのは、そのロール自身の結果だけです。 ログ行は順次提供中で、まだすべてのゲームで使えるとは限りません。
フレームワークごとに 1 つのフレーム
すべてのフレームワークは、それぞれのフレームを持ちます。子の Lamp には、Lamp のフィールドにバインドした専用のカードがあります。

