コードフレームワーク
上限とエラー
プロジェクトの上限と、表示される可能性のあるメッセージおよびその対処です。
上限
| 上限 | 値 |
|---|---|
| ソースのサイズ | 8 MiB |
| コンパイル後のゲームのサイズ | 16 MiB |
| ファイル数 | 1000 |
| フレームワーク数 | 64 |
| シナリオファイル数 | 512 |
| フレームワークあたりのコンテンツプリセット数 | 512 |
| ゲームあたりのコンテンツプリセット数 | 2048 |
| フレームワークあたりのアクション数 | 96 |
| ゲームあたりのアクション数 | 192 |
| フレームワークあたりのレジャー関数数 | 64 |
| フレームワークあたりのフレーム数 | 1 から 16 |
| ゲームあたりのフレーム数 | 128 |
| フレームワークあたりのセクション数 | 64 |
| 入力の選択肢数 | 2 から 128 |
| プロジェクトごとの作成済みアクションステップ数 | 512 |
| アクションごとのステップ数 | 64 |
| シナリオごとのステップ数 | 32 |
| シナリオごとのレジャー確認数 | 32 |
| ステップごとの期待される書き込み数 | 64 |
上の行はソースの上限です。Fabled はソースを 1 つのゲームにもコンパイルします。準備を始める前に、そのコンパイル後のゲームを 16 MiB 未満にする必要があります。
ゲームを準備するとき、サーバーが同じ上限をもう一度確認します。その判定が最終結果です。
エラーと対処
各行はメッセージの一部を引用しています。The Forge のメッセージには、ファイル、行、関係する名前が加わる場合があります。
| メッセージ | 原因 | 対処 |
|---|---|---|
| Project contains undeclared source files: rules/extra.ts. | どこからも参照されていないファイルがあります。メッセージには最大5件のパスと、残りのファイル数が表示されます。 | ツリーのファイルを、マニフェストとスキーマと見比べます。レジャー関数を削除してもそのルールファイルは残るので、そのファイルも削除します。 |
| Missing or misplaced project source. | 列挙されたパスにファイルがないか、ファイルが誤ったフォルダにあります。 | パスを修正するか、ファイルを追加します。 |
| Unrecognized key(s) in object | JSON ファイルが、形式に存在しないフィールドを使っています。 | フィールドを削除するか、綴りを直します。 |
| Input name is hidden, so it must declare a defaultValue. | hidden の入力にデフォルトがありません。 | defaultValue を追加するか、入力を表示します。 |
| must be one of its options | デフォルトが選択肢のリストにありません。 | 選択肢のいずれかをデフォルトにします。 |
| Parameter max_hp 99 is not between 1 and 40. | シナリオまたはプリセットが、入力の範囲を外れています。 | 値または範囲を変更します。 |
| is not assigned to any section | セクションがありますが、どのセクションにも入っていない入力があります。 | 入力をセクションに追加します。 |
| Duplicate semantic identity or source path. | 2 つの項目が ID またはソースファイルを共有しています。 | それぞれに固有の ID とファイルを付けます。 |
| Invalid child Framework constraint | 子スロットが、ゲームの外のフレームワークを指しています。 | このゲームにあるフレームワークの ID を使います。 |
| Ledger function must target an existing scalar field. | フィールドが、コンストラクタの返すものではありません。 | コンストラクタからそのフィールドを返すか、名前を直します。 |
| must define the required 'name' value | コンストラクタが name を返していません。 | name という文字列のフィールドを返します。 |
| The entry framework must be a character constructor. | マニフェストのエントリーフレームワークがキャラクターではありません。 | entryFramework をキャラクターのフレームワークに向けます。 |
| while loops are not allowed | ルールが、終わらない可能性のあるループを使っています。 | for of を使います。 |
| is a host global and not part of the TypeScript subset | ルールが Math などのグローバルを使っています。 | math.min などのホスト呼び出しを使います。 |
| import is not allowed | ルールがコードをインポートしています。 | ロジックをルールファイルの中に書きます。 |
| must return a value on every reachable path | 戻り値の型を持つ関数に、return のない経路があります。 | すべての経路で値を返すか、void を宣言します。 |
| is not declared on this schema | アクションが、コンストラクタの返さないフィールドに書き込んでいます。 | コンストラクタからそのフィールドを返すか、名前を直します。 |
| FRAME_BINDING_UNKNOWN | フレームが、存在しないフィールドにバインドしています。 | 宣言済みのフィールドにバインドします。 |
| ACTION_MISSING | ボタンが、存在しないアクションのエイリアスを指定しています。 | エイリアスを宣言するか、名前を直します。 |
| Expected ordered writes | アクションが expectedWrites と異なる内容を書き込みました。 | ルールまたは期待する書き込みを修正します。 |
| Constructor output does not match its scenario. | expectedValues が、コンストラクタの返す値と異なります。 | シナリオまたはコンストラクタを修正します。 |
| SCENARIO_COVERAGE_MISSING | アクションにシナリオのステップがありません。 | アクションに少なくとも 1 つのステップを追加してください。 |
| is a non-writable state field | アクションが、レジャー関数で導き出される値を書き込んでいます。 | 保存されるフィールドに書き込み、残りはレジャー関数に導き出させてください。 |
| Action accesses require literal keys on self. | アクションが、コードに書かれた文字列ではなく、値でフィールドを指定しています。 | フィールド名を引用符で囲んで書きます。フィールドごとにアクションを 1 つ使います。 |
| functions but only the action | アクションのファイルが 2 つの関数をエクスポートしています。 | アクションファイルごとに関数を 1 つエクスポートするか、ファイルをアクション間で共有します。補助関数には export を付けません。 |
| the step expects it to be refused with | ステップは拒否を期待していますが、アクションは拒否されませんでした。 | expectedRefusal を削除するか、オファーが拒否するように直します。 |
| Add expectedRefusal | リストのステップは拒否されましたが、そのことが書かれていません。 | コードを指定した expectedRefusal を追加し、書き込みは書きません。 |
| Every ledger function needs an executable scenario. | どのシナリオの ledger リストにも、そのレジャー関数のエントリがありません。 | 関数 ID、currentValue、期待する結果を持つ ledger エントリを追加します。 |
| effectful action helpers are not supported | 補助関数が ledger.set または ledger.add で書き込んでいます。 | 補助関数に値を返させ、書き込みはアクションで行います。 |
| is not a writable state field | fields の一覧に、保存されていないフィールド、たとえばレジャー関数が導出するフィールドが含まれています。 | コンストラクターが返す保存フィールドだけを列挙します。 |
| is not satisfied: roll.missing | シナリオが記録されたロールなしで roll メソッドを使っているか、プリセットが使っています。ロールできるのはサーバーだけです。 | シナリオでは、値ごとに 1 つのスロットを持つ poolRolls を追加します。プリセットは roll を使えないので、プリセット用に別のメソッドをプールに与えてください。 |
| The roll dice must be one group such as | roll のダイスが "3d6" のような 1 つのグループになっていません。たとえば 3d6x5 です。 | ダイスは 1 つのグループで書き、倍率は multiplier キーに入れてください。 |
| outside the min/max of input | ダイスが、入力で許可されていない合計を出す可能性があります。 | 入力の min と max を広げるか、ダイスを変えます。 |
| give exactly one roll per input. | roll の count が、プールの入力の数と違っています。 | count を入力の数に合わせます。 |
| must offer exactly the methods of pool | 方式を選ぶ入力の選択肢が、プールの方式と一致していません。 | 選択肢を方式名とちょうど同じにします。 |
| Required | 形式に必要なキーがありません。「問題」パネルには JSON の一覧が表示されます。 | 一覧のパスを読みます。パスが足りないキーを示すので、そのキーを追加します。 |
| Expected number, received string | スキーマのキーの型が違います。「問題」パネルには JSON のリストが表示されます。 | リストの path を読みます。inputs、max_hp、min のように、キーを示しています。その値を直します。 |
The Forge は、ファイルごとの問題を「問題」に一覧表示します。ルールの問題には、行と列も示されます。コンストラクタの不一致では、最初の差分が列挙され、末尾に省略された件数が示されます。列挙された分を直して、もう一度検証してください。

