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

コードフレームワーク

Fabled がコードを実行する仕組み

ソースからプレイまでの流れを追います。何がいつ実行されるか、レジャーがどう働くか、シナリオが何を証明するかを説明します。

ソースからプレイまで

プロジェクトは 5 つのステップで進みます。プレイは最後だけです。それより前のステップが、公開中のキャラクターを変えることはありません。

  1. 書く

    ソースエディタでソースファイルを編集します。この時点では何も実行されません。

  2. 検証する

    「検証してプレビュー」は、保存前でも現在の編集内容をコンパイルし、すべてのシナリオを実行します。問題は「問題」パネルに表示されます。何も公開されません。

  3. 保存する

    「プロジェクトを保存」は、ソースをゲームの新しいバージョンとして保存します。準備は保存したバージョンでのみ動くので、準備の前に保存します。

  4. 準備する

    「ゲームを準備」は、保存したバージョンから非公開のフレームワーク、フレーム、コンテンツを作成します。サーバーがプロジェクトをもう一度検証し、その判定が最終結果になります。

  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 のように、キャラクターが持ち、アクションが変える数値には、コンストラクタの値を使います。コンストラクタは一度だけ計算するので、元になったフィールドが後で変わっても、その値は動きません。

シナリオが証明すること

  • コンストラクタが期待どおりの値を返すこと。
  • 各アクションが、一覧にした書き込みをちょうど行うこと。
  • 導き出された値が、アクションの後も正しく出ること。
  • すべてのファイルが使われ、プロジェクト全体がコンパイルできること。

シナリオは、シートの見た目や、ルールのプレイ中の感触までは証明しません。それは準備したゲームで試してください。

次へ