06.01. Crear fuentes STORE
Un archivo .store es un manifiesto de payloads etiquetados. Cada label debe
ser único dentro de la fuente y cada entrada puede seleccionarse después por
ese nombre.
Cabecera
Toda fuente comienza con el magic exacto y una versión soportada:
MAGIC "store"
VERSION 1
Usa VERSION 1 para payloads locales/raw. Usa VERSION 2 cuando haya
declaraciones tipadas, @REQST o conversión de fuentes TTF:
MAGIC "store"
VERSION 2
Solo las versiones 1 y 2 están soportadas actualmente. La versión 3 queda
reservada para futuras funciones del lenguaje, como funciones o macros.
Items de media y binarios opacos
La forma por bloque tiene exactamente cuatro campos, en este orden:
@ITEM BINARY
: "config.bin" ; ruta relativa a la carpeta del .store
: "bin" ; formato de origen
: "RAW" ; formato de salida/datos
: config_blob ; label
@end
Los tipos de item soportados son IMAGE, AUDIO y BINARY.
| Tipo | Formatos locales | Comportamiento |
|---|---|---|
IMAGE |
png, jpg, jpeg, bmp, gif, tga, webp |
Usa el plugin de imagen con el formato de salida declarado, incluido BGR555 para píxeles GBA. |
AUDIO |
wav, flac, ogg |
Usa el plugin de audio con el formato de salida declarado. MP3 no es una entrada de audio STORE. |
BINARY |
bin, dat, raw |
Copia el archivo byte por byte. El formato de datos debe ser RAW o BYTES; no ejecuta plugins de media. |
Para IMAGE y AUDIO, el tercer campo es el formato de salida del plugin,
como el formato soportado por el conversor seleccionado. La extensión del
archivo debe coincidir con el formato declarado. En BINARY, raw significa
bytes opacos, no un parser ni un ensamblador.
Fuentes TTF
VERSION 2 puede consumir una fuente local .ttf mediante @FONT. La entrada
siempre es TTF; el perfil de salida decide si se guardan los bytes originales o
un atlas bitmap:
@FONT raw_font:
source "assets/font.ttf"
output BYTES
@end
@FONT gba_font:
source "assets/font.ttf"
output BITMAP
pixel_format MONO1
size 8
cell_width 8
cell_height 8
glyphs ASCII_PRINTABLE
layout GRID
columns 16
@end
BYTES copia el TTF exactamente y no requiere Pillow. BITMAP usa el plugin
de fuentes para crear un atlas GRID en orden por filas. Los formatos de píxel
soportados son MONO1 (un bit MSB-first por píxel), GRAY8 (un byte de alpha
por píxel) y RGBA8888 (glifos blancos con el alpha rasterizado).
ASCII_PRINTABLE selecciona los códigos 0x20 a 0x7E; ASCII selecciona
0x00 a 0x7F; cualquier otro valor entre comillas en glyphs se interpreta
como una secuencia explícita de caracteres. columns controla el ancho del
atlas. Cada bloque @FONT crea una entrada raw usando su nombre como label.
La conversión bitmap requiere Pillow y solo acepta rutas locales. La fuente
debe terminar en .ttf y los límites de recursos se aplican tanto a la entrada
como al atlas generado.
Bloques binarios inline
VERSION 2 puede contener un payload binario raw directamente en la fuente.
Usa @BINARY, un label identificador, una o más líneas de bytes hexadecimales
de dos dígitos y @END:
MAGIC "store"
VERSION 2
@BINARY MODE_3
01 03 A0 E3,
03 10 A0 E3 01 1B 81 E3
B0 10 C0 E1
@END
Los espacios separan bytes y las comas son opcionales. También se acepta el
prefijo 0x. El bloque se guarda como un único payload opaco y no ejecuta
plugins. @BINARY está limitado a la versión 2; para la versión 1 usa
@FILE o @ITEM BINARY.
Valores tipados de bytes exactos
Los valores tipados requieren VERSION 2:
MAGIC "store"
VERSION 2
str greeting = "Hello, world"
uint8 age = 30
int32 count = -2
float32 decimal = 13.0000
| Tipo canónico | Alias | Ancho | Codificación |
|---|---|---|---|
str |
— | variable | Bytes UTF-8, sin NUL implícito |
int8, int16, int32, int64 |
i8, i16, i32, i64 |
1, 2, 4, 8 bytes | Entero little-endian con signo |
uint8, uint16, uint32, uint64 |
u8, u16, u32, u64 |
1, 2, 4, 8 bytes | Entero little-endian sin signo |
float32, float64 |
f32, f64 |
4, 8 bytes | Float IEEE-754 little-endian |
Los valores son únicamente literales. No hay expresiones, asignaciones, actualizaciones en runtime ni conversiones de tipos. Los rangos enteros se comprueban según el ancho y los floats deben ser finitos.
El tipo declarado se conserva en el índice de un storage versión 2 para que el consumidor pueda aplicar después un layout de bytes. El payload ya está codificado en la forma canónica little-endian.
Añadir un archivo local
@FILE copia un archivo local arbitrario como bytes raw:
@FILE "myfile.bin"
@FILE "headers/boot.dat" AS boot_header
Sin AS, el label es el nombre base del archivo (myfile en el primer
ejemplo). La ruta es relativa al .store y debe permanecer dentro de su
carpeta: se rechazan rutas absolutas y recorridos con ...
Solicitar un binario acotado de GitHub
@REQST requiere VERSION 2 y un archivo .bin alojado en GitHub:
@REQST algorithm "github.com/owner/repository/path/algorithm.bin/main"
También se acepta https://github.com/.... La ruta debe terminar en una rama,
contener una ruta de archivo .bin y no puede incluir credenciales, query
strings, fragmentos ni recorridos. Solo se siguen hosts HTTPS de GitHub. La
petición tiene timeout de 15 segundos y está limitada a 16 MiB, o al límite
global configurado si es menor.
@REQST adquiere bytes raw, no ejecuta código. El archivo descargado se guarda
con el label declarado sin usar plugins de imagen o audio.
Importar entradas de otro contenedor
Usa @CONTAINER para copiar entradas etiquetadas de un storage validado:
@CONTAINER "variables/vars.storage.bin":
get etiqueta1
get etiqueta2
@end
La ruta es local a la carpeta del .store actual y tiene las mismas
restricciones de seguridad que @FILE. Las entradas conservan sus labels y
bytes originales. Se recomienda escribir @end; solo puede omitirse cuando el
bloque es el último de la fuente.
Si una entrada seleccionada tiene metadatos tipados de la versión 2, la fuente
que importa también debe ser VERSION 2; la versión 1 solo puede contener
entradas raw.
Restricciones
- Los labels deben ser identificadores como
config_bloboMODE_3y ser únicos. - Las rutas se resuelven desde la carpeta del
.store, no desde el directorio de trabajo del proceso. - Un item
BINARYno es un entero tipado; usa una declaración tipada cuando importe el ancho y la representación numérica. - Una declaración tipada no es una variable de runtime: es un payload fijo.
- La conversión de
IMAGEyAUDIOes explícita. UsaBINARYo@FILEsi el origen debe conservarse byte por byte.