コードフレームワーク
Fabled がコードを実行する仕組み
ソースからプレイまでの流れを追います。何がいつ実行されるか、レジャーがどう働くか、シナリオが何を証明するかを説明します。
ソースからプレイまで
プロジェクトは 5 つのステップで進みます。プレイは最後だけです。それより前のステップが、公開中のキャラクターを変えることはありません。
- 書く
ソースエディタでソースファイルを編集します。この時点では何も実行されません。
- 検証する
「検証してプレビュー」は、保存前でも現在の編集内容をコンパイルし、すべてのシナリオを実行します。問題は「問題」パネルに表示されます。何も公開されません。
- 保存する
「プロジェクトを保存」は、ソースをゲームの新しいバージョンとして保存します。準備は保存したバージョンでのみ動くので、準備の前に保存します。
- 準備する
「ゲームを準備」は、保存したバージョンから非公開のフレームワーク、フレーム、コンテンツを作成します。サーバーがプロジェクトをもう一度検証し、その判定が最終結果になります。
- プレイする
プレイヤーがあなたのフレームワークからキャラクターを作成します。コンストラクタがそれを作り、アクションがそれを変更します。
何がいつ実行されるか
| 部品 | 実行されるとき | 役割 |
|---|---|---|
| コンストラクタ | フレームワークからエレメントを作成するとき 1 回だけです。 | 入力を初期値に変換します。書き込みは行いません。 |
| レジャー関数 | エレメントが作られるときに、スキーマが関数を宣言した順で実行されます。アクションのたびにもう一度実行されます。 | 保存された値から値を導き出します。アクションはそれを書き込めません。 |
| アクション | プレイヤーがそれを呼び出すボタンを使うときです。 | ledger.set と ledger.add でレジャーに書き込みます。 |
| フレーム | シートが表示されるたびです。 | 保存された値を読み取って描画します。ボタンがアクションを呼び出します。 |
| シナリオ | 「検証してプレビュー」でのみ実行され、プレイ中には実行されません。 | エレメントを作り、アクションを実行して、すべての値と書き込みを比べます。 |
レジャー
エレメントの値がその場で書き換えられることはありません。すべての変更は、そのレジャーへの書き込みです。ledger.set は値を置き換え、ledger.add は値に加えます。シナリオはそれらの書き込みを一覧にするため、ルールが何をするかを正確に確認できます。
導き出された値はレジャー関数から生まれるため、アクションはそれを書き込めません。検証は次のように拒否します。
which is a non-writable state fieldコンストラクタは、レジャー関数が導き出すフィールドも、0 などの仮の値で返します。エレメントが作られるとき、レジャー関数がその仮の値を置き換えます。シナリオは、レジャー関数の実行後の値と expectedValues を比べます。仮の値ではなく、導き出された値を書いてください。
レジャー関数は、スキーマが宣言した順に実行され、それぞれが前の関数の結果を見ます。読み取るフィールドの関数より後に宣言してください。次の例では、total が base を読み取りますが、先に宣言されているため、仮の値を読み取ります。
{
"ledgerFunctions": [
{
"id": "total",
"name": "Total",
"field": "total",
"source": "rules/total.ts"
},
{
"id": "base",
"name": "Base",
"field": "base",
"source": "rules/base.ts"
}
]
}expectedValues.total: expected 11, constructor returned 1他のフィールドに従って動き、どのアクションも書き込まない値には、レジャー関数を使います。hp のように、キャラクターが持ち、アクションが変える数値には、コンストラクタの値を使います。コンストラクタは一度だけ計算するので、元になったフィールドが後で変わっても、その値は動きません。
シナリオが証明すること
- コンストラクタが期待どおりの値を返すこと。
- 各アクションが、一覧にした書き込みをちょうど行うこと。
- 導き出された値が、アクションの後も正しく出ること。
- すべてのファイルが使われ、プロジェクト全体がコンパイルできること。
シナリオは、シートの見た目や、ルールのプレイ中の感触までは証明しません。それは準備したゲームで試してください。

