Code frameworks
Límites y errores
Los límites de un proyecto y los mensajes que puedes ver, con sus soluciones.
Límites
| Límite | Valor |
|---|---|
| Tamaño del código fuente | 8 MiB |
| Tamaño del juego compilado | 16 MiB |
| Archivos | 1000 |
| Frameworks | 64 |
| Archivos de escenario | 512 |
| Preajustes de contenido por Framework | 512 |
| Preajustes de contenido por Juego | 2048 |
| Acciones por Framework | 96 |
| Acciones por Juego | 192 |
| Funciones de ledger por Framework | 64 |
| Frames por Framework | De 1 a 16 |
| Frames por Juego | 128 |
| Secciones por Framework | 64 |
| Opciones de entrada | De 2 a 128 |
| Pasos de acción creados por proyecto | 512 |
| Pasos por acción | 64 |
| Pasos por escenario | 32 |
| Comprobaciones de ledger por escenario | 32 |
| Escrituras esperadas por paso | 64 |
Las filas de arriba limitan tu código fuente. Fabled también compila tu código fuente en un solo juego, y ese juego compilado debe pesar menos de 16 MiB antes de poder prepararse.
El servidor vuelve a comprobar los mismos límites cuando preparas un juego, y su veredicto es el definitivo.
Errores y soluciones
Cada fila cita parte de un mensaje. El mensaje en The Forge puede añadir el archivo, la línea o los nombres implicados.
| Mensaje | Causa | Solución |
|---|---|---|
| Project contains undeclared source files: rules/extra.ts. | Hay archivos a los que nada hace referencia. El mensaje enumera hasta cinco rutas e indica cuántos archivos más quedan. | Compara los archivos del árbol con el manifiesto y los esquemas. Al borrar una función del ledger queda su archivo de reglas, así que borra también ese archivo. |
| Missing or misplaced project source. | Una ruta enumerada no tiene archivo, o el archivo está en la carpeta equivocada. | Corrige la ruta o añade el archivo. |
| Unrecognized key(s) in object | Un archivo JSON usa un campo que el formato no tiene. | Elimina el campo o corrige cómo está escrito. |
| Input name is hidden, so it must declare a defaultValue. | Una entrada oculta no tiene valor por defecto. | Añade un defaultValue, o muestra la entrada. |
| must be one of its options | Un valor por defecto no está en la lista de opciones. | Usa una de las opciones como valor por defecto. |
| Parameter max_hp 99 is not between 1 and 40. | Un escenario o preajuste se sale de los límites de una entrada. | Cambia el valor o los límites. |
| is not assigned to any section | Hay secciones, pero una entrada no está en ninguna. | Añade la entrada a una sección. |
| Duplicate semantic identity or source path. | Dos elementos comparten un id o un archivo de origen. | Dale a cada uno su propio id y archivo. |
| Invalid child Framework constraint | Una ranura hija apunta a un Framework fuera del juego. | Usa el id de un Framework de este juego. |
| Ledger function must target an existing scalar field. | El campo no es uno de los que devuelve el constructor. | Devuelve el campo desde el constructor, o corrige el nombre. |
| must define the required 'name' value | Un constructor no devuelve un name. | Devuelve un campo de texto llamado name. |
| The entry framework must be a character constructor. | El Framework de entrada del manifiesto no es un personaje. | Haz que entryFramework apunte a un Framework de personaje. |
| while loops are not allowed | Una regla usa un bucle que podría no terminar. | Usa for of. |
| is a host global and not part of the TypeScript subset | Una regla usa Math u otro global. | Usa las llamadas al host, como math.min. |
| import is not allowed | Una regla importa código. | Pon la lógica en el propio archivo de reglas. |
| must return a value on every reachable path | Una función con tipo de retorno tiene un camino sin return. | Devuelve un valor en todos los caminos, o declara void. |
| is not declared on this schema | Una acción escribe un campo que el constructor no devuelve. | Devuelve el campo desde el constructor, o corrige el nombre. |
| FRAME_BINDING_UNKNOWN | Un Frame enlaza un campo que no existe. | Enlaza un campo declarado. |
| ACTION_MISSING | Un botón nombra un alias de acción que no existe. | Declara el alias, o corrige el nombre. |
| Expected ordered writes | Una acción escribió algo distinto de expectedWrites. | Corrige la regla o las escrituras esperadas. |
| Constructor output does not match its scenario. | expectedValues es distinto de lo que devuelve el constructor. | Corrige el escenario o el constructor. |
| SCENARIO_COVERAGE_MISSING | Una acción no tiene paso de escenario. | Añade al menos un paso para la acción. |
| is a non-writable state field | Una acción escribe un valor que deriva una función del ledger. | Escribe un campo guardado y deja que la función del ledger derive el resto. |
| Action accesses require literal keys on self. | Una acción nombra un campo con un valor en lugar de una cadena escrita en el código. | Escribe el nombre del campo entre comillas. Usa una acción para cada campo. |
| functions but only the action | Un archivo de acción exporta dos funciones. | Exporta una función por archivo de acción, o comparte el archivo entre acciones. Deja las funciones auxiliares sin export. |
| the step expects it to be refused with | Un paso espera un rechazo, pero la acción no fue rechazada. | Quita expectedRefusal, o corrige la oferta para que rechace. |
| Add expectedRefusal | Un paso de lista fue rechazado, pero no lo indica. | Añade expectedRefusal con el código, y sin escrituras. |
| Every ledger function needs an executable scenario. | Una función del ledger no tiene entrada en la lista ledger de ningún escenario. | Añade una entrada de ledger con el id de la función, un currentValue y el resultado esperado. |
| effectful action helpers are not supported | Una función auxiliar escribe con ledger.set o ledger.add. | Haz que la función auxiliar devuelva el valor y escríbelo en la acción. |
| is not a writable state field | Una lista fields nombra un campo que no se almacena, como uno que deriva una función del ledger. | Enumera solo campos almacenados que devuelve el constructor. |
| is not satisfied: roll.missing | Un escenario usa el método roll sin tiradas registradas, o lo usa un preset, y solo el servidor puede tirar. | En un escenario, añade poolRolls con un slot por puntuación. Un preset no puede usar roll, así que da al pool otro método para los presets. |
| The roll dice must be one group such as | Los dados de roll no son un solo grupo como "3d6", por ejemplo 3d6x5. | Escribe un solo grupo de dados y pon el multiplicador en la clave multiplier. |
| outside the min/max of input | Los dados pueden dar un total que una entrada no admite. | Amplía min y max de las entradas, o cambia los dados. |
| give exactly one roll per input. | El count de roll difiere del número de entradas de la reserva. | Pon count igual al número de entradas. |
| must offer exactly the methods of pool | Las opciones de la entrada que elige el método difieren de los métodos de la reserva. | Haz que las opciones sean los nombres de los métodos, ni más ni menos. |
| Required | Falta una clave que el formato necesita. El panel Problemas muestra una lista JSON. | Lee la ruta de la lista. Nombra la clave que falta. Añádela. |
| Expected number, received string | Una clave del esquema tiene el tipo equivocado. El panel Problemas muestra una lista JSON. | Lee el path de la lista. Nombra la clave, por ejemplo inputs, max_hp, min. Corrige ese valor. |
The Forge enumera los problemas de cada archivo en Problemas. Un problema de reglas también indica la línea y la columna. Si el constructor no coincide, el mensaje lista las primeras diferencias y termina con cuántas más se omitieron. Corrige las que aparecen y comprueba de nuevo.

