Фреймворки на коде
Ограничения и ошибки
Ограничения проекта и сообщения, которые вы можете увидеть, с вариантами исправления.
Ограничения
| Ограничение | Значение |
|---|---|
| Размер исходного кода | 8 MiB |
| Размер скомпилированной игры | 16 MiB |
| Файлы | 1000 |
| Фреймворки | 64 |
| Файлы сценариев | 512 |
| Пресеты контента на фреймворк | 512 |
| Пресеты контента на игру | 2048 |
| Действия на фреймворк | 96 |
| Действия на игру | 192 |
| Функции журнала на фреймворк | 64 |
| Фреймы на фреймворк | от 1 до 16 |
| Фреймы на игру | 128 |
| Разделы на фреймворк | 64 |
| Варианты поля ввода | от 2 до 128 |
| Авторских шагов действий на проект | 512 |
| Шагов на действие | 64 |
| Шагов на сценарий | 32 |
| Проверок журнала на сценарий | 32 |
| Ожидаемых записей на шаг | 64 |
Строки выше ограничивают ваш исходный код. Fabled также компилирует ваш исходный код в одну игру, и эта скомпилированная игра должна быть меньше 16 MiB, прежде чем её можно будет подготовить.
Сервер ещё раз проверяет те же ограничения, когда вы подготавливаете игру, и его вердикт окончательный.
Ошибки и исправления
Каждая строка приводит часть сообщения. В сообщении в The Forge могут быть добавлены файл, строка или задействованные имена.
| Сообщение | Причина | Исправление |
|---|---|---|
| Project contains undeclared source files: rules/extra.ts. | Есть файлы, на которые ничто не ссылается. Сообщение перечисляет до пяти путей и указывает число остальных файлов. | Сравните файлы дерева с манифестом и схемами. Если удалить функцию журнала, её файл правил останется, поэтому удалите и этот файл. |
| Missing or misplaced project source. | У указанного пути нет файла, или файл лежит не в той папке. | Исправьте путь или добавьте файл. |
| Unrecognized key(s) in object | В JSON-файле есть поле, которого нет в формате. | Удалите поле или исправьте его написание. |
| Input name is hidden, so it must declare a defaultValue. | У скрытого поля нет значения по умолчанию. | Добавьте 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. | У двух элементов один идентификатор или один файл. | Дайте каждому свой идентификатор и файл. |
| Invalid child Framework constraint | Дочерний слот указывает на фреймворк вне игры. | Используйте идентификатор фреймворка из этой игры. |
| 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 | У действия нет шага сценария. | Добавьте хотя бы один шаг для действия. |
| is a non-writable state field | Действие пишет значение, которое выводит функция журнала. | Пишите хранимое поле, а остальное пусть выводит функция журнала. |
| Action accesses require literal keys on self. | Действие называет поле через значение, а не через строку, записанную в коде. | Напишите имя поля в кавычках. Используйте по одному действию на каждое поле. |
| functions but only the action | Файл действия экспортирует две функции. | Экспортируйте одну функцию на файл действия или разделите файл между действиями. Вспомогательные функции оставляйте без export. |
| the step expects it to be refused with | Шаг ждёт отказа, но действие не было отклонено. | Уберите expectedRefusal или исправьте предложение, чтобы оно отказывало. |
| Add expectedRefusal | Шаг со списком был отклонён, но об этом не сказано. | Добавьте expectedRefusal с кодом и не указывайте записей. |
| Every ledger function needs an executable scenario. | У функции журнала нет записи в списке ledger ни одного сценария. | Добавьте запись ledger с идентификатором функции, currentValue и ожидаемым результатом. |
| effectful action helpers are not supported | Вспомогательная функция пишет через ledger.set или ledger.add. | Пусть вспомогательная функция возвращает значение, а запишите его в действии. |
| is not a writable state field | Список fields называет поле, которое не хранится, например такое, которое выводит функция журнала. | Перечисляйте только сохранённые поля, которые возвращает конструктор. |
| is not satisfied: roll.missing | Сценарий использует метод roll без записанных бросков, либо его использует пресет, а бросать может только сервер. | В сценарии добавьте poolRolls с одним слотом на значение. Пресет не может использовать roll, поэтому дайте пулу другой метод для пресетов. |
| The roll dice must be one group such as | Кости в roll не образуют одну группу вроде "3d6", например 3d6x5. | Запишите одну группу кубиков, а множитель поместите в ключ multiplier. |
| outside the min/max of input | Кости могут дать сумму, которую вход не допускает. | Расширьте min и max входов или измените кости. |
| give exactly one roll per input. | Значение count в roll не равно числу входов пула. | Задайте count равным числу входов. |
| must offer exactly the methods of pool | Варианты входа, который выбирает метод, не совпадают с методами пула. | Сделайте вариантами названия методов, не больше и не меньше. |
| Required | Нет ключа, который нужен формату. Панель «Проблемы» показывает список JSON. | Прочитайте путь в списке. Он называет недостающий ключ. Добавьте его. |
| Expected number, received string | У ключа схемы неверный тип. Панель «Проблемы» показывает список JSON. | Прочитайте path в списке. Он называет ключ, например inputs, max_hp, min. Исправьте это значение. |
The Forge перечисляет проблемы каждого файла в разделе «Проблемы». Для проблемы в правиле также указаны строка и столбец. Если конструктор не совпадает, в сообщении перечислены первые различия, а в конце указано, сколько ещё пропущено. Исправьте перечисленные и проверьте снова.

