.gui de TA: Kingdoms (árboles de widgets separados por espacios)
Fuente: coreprime/kbot @ 0ab97bf · Editar en GitHub
TA: Kingdoms dibujaba su menú principal, el lobby, el HUD de la partida y los cuadros de diálogo a partir de archivos
.gui, un formato peculiar de descripción de widgets separados por espacios en blanco. Aunque a simple vista se parece a los archivos de interfaz del propio TA (también.gui), el formato de TA:K es estructuralmente distinto y no son intercambiables.
Note
kbot no incluye por ahora ningún subcomando para los .gui de TA:K: el
formato se documenta aquí para que la referencia esté completa y para
orientar futuras herramientas. Aun así, puedes inspeccionar estos
archivos a mano; son texto ASCII plano.
Qué estás viendo
Un archivo .gui es una secuencia plana de widgets. El widget de
cabecera del archivo declara el número total de widgets y los metadatos
globales (imagen de fondo, teclas rápidas); cada widget posterior
describe un único elemento de la interfaz.
Un widget típico tiene este aspecto:
4 1 ← widget type (4 = button), unused flag (always 1)
1 ← unused (always 1 except in headers)
2 196 79 95 20 1 0 0 0 ← bounds: type, X, Y, W, H, flags…
3 0 0 0 0 ← colour: type, R, G, B, A
1 0 0 ← unused (always 1 0 0)
1 14 hattfont11.gaf ← font: type, len, name
12 PlayerColor 2 12 ← control name + state count
3 ← number of gaf frames that follow
1 17 singlemachine.gaf 14 SingleMachine0 0 18 ← disabled frame
1 17 singlemachine.gaf 14 SingleMachine0 1 18 ← pressed frame
1 17 singlemachine.gaf 14 SingleMachine0 2 18 ← released frame
3 ← number of strings that follow
2 0 0 2 0 4 Exit 2 0 4 Exit 3 ← state strings (disabled, pressed, up)
1 7 Default
1 12 skirmish.wav ← sound played when activated
1 7 Default
2 0 16 Play the Machine ← tooltip / mouseover help
0 ← number of child widgets
Los tokens van separados por espacios en blanco. El primer token de cada widget es el ID de tipo de widget; todo lo que sigue se ajusta a un esquema propio de cada tipo.
Cadenas con prefijo de longitud
El truco más importante del formato: cada cadena va precedida de su longitud en caracteres como un token entero. Eso significa que las cadenas pueden contener espacios, pero el analizador tiene que leer primero la longitud.
1 14 MainScreen.gaf
^ ^^ ^^^^^^^^^^^^^^
│ │ │
│ │ └─ the string itself (14 characters)
│ └─ length
└─ string-flavour prefix (1 = literal string)
Una cadena nula o vacía es 1 0 0 (prefijo, longitud cero, y el
contenido vacío es «la cadena vacía»). Es muy fácil analizar mal los
prefijos 1/0 repetidos si te limitas a dividir en tokens por los
espacios y empezar a contar: tienes que leer de forma secuencial, en el
orden de los widgets.
Important
No tiene sentido buscar con grep «el tercer botón» en un archivo
.gui: la estructura es secuencial, no direccionable. Los editores
escritos para este formato son analizadores secuenciales.
Tipos de widget
IDs de tipo de widget observados:
| ID | Widget | Notas |
|---|---|---|
2 |
Cabecera / formulario | Primer widget del archivo. Lleva el fondo, las teclas rápidas y el número de hijos. |
4 |
Botón | 3 estados (desactivado / pulsado / sin pulsar). |
5 |
Casilla de verificación | Matriz de 5 estados (desactivada, apagada-pulsada, encendida-pulsada, apagada-sin pulsar, encendida-sin pulsar). |
9 |
Marco | Contenedor invisible; solo agrupa widgets visualmente. |
12 |
Contenedor de barra de desplazamiento | Delimita el deslizador y sus botones de aumentar/disminuir. |
14 |
Botón de barra de desplazamiento (aumentar / disminuir / cursor) | Después de cada 12 van tres de estos. |
15 |
Cuadro de lista | Se rellena durante la ejecución; las plantillas están casi vacías. |
17 |
Botón de opción | 3 estados. |
18 |
Botón de varios estados | Botón que recorre N estados en ciclo (p. ej., el selector de «dificultad de la IA»). |
19 |
Imagen + etiqueta | Widget combinado de TA:K para arte estático con un rótulo. |
Cada tipo tiene un esquema fijo para los tokens que siguen al ID de tipo. El esquema canónico, obtenido por ingeniería inversa por Dark Rain, se conserva en los materiales de origen que acompañan a este repositorio.
Forma genérica de un widget
[TYPE] 1
1
2 [X] [Y] [W] [H] 1 0 0 0
3 [colour: A R G B]
1 0 0
1 [font: length name]
[control-name length] [name] 2 3
[N]
1 [len] [gaf] [len] [seq] [frame] 9 × N
[N]
2 0 0 2 [string set] × N entries inline
1 7 Default
1 [len] [activate.wav]
1 7 Default
2 0 [help length] [help text]
[child-count]
Según el tipo de widget, varían el tamaño de [N] y la estructura del
conjunto de cadenas; los esquemas de los materiales de origen documentan
cada uno.
Códigos de alineación
Dentro del conjunto de cadenas:
| Código | Alineación |
|---|---|
0 |
Centrada |
1 |
Izquierda |
2 |
Derecha |
En un widget de un solo estado verás, por ejemplo, 2 0 6 Player; en un
botón de 3 estados verás los tres estados concatenados, por ejemplo,
2 0 0 2 0 6 Player 2 3 6 Play2r 3.
Ejemplo desarrollado: el menú principal
2 1
2 0 0 640 480 1 1 0 0
3 255 255 255 255
1 0 0
1 0
8 MainMenu 1 2
2
1 15 TitleScreen.tsf 7 JPGTest 0 9
1 15 TitleScreen.tsf 7 JPGTest 1 9
2
2 0 0 2 0 0 2
1 0
1 0
2 0 24 #Enter#Play#Esc#Previous
6
De arriba abajo:
2 1: widget de tipo 2 (cabecera), marca 1.2 0 0 640 480 1 1 0 0: límites en el origen, 640×480, más los cuatro tokens de marcas.3 255 255 255 255: entrada de color blanco opaco.8 MainMenu 1 2: nombre de control «MainMenu» (8 caracteres), seguido de1 2.- Las dos entradas
TitleScreen.tsf JPGTestson la imagen de fondo (dos referencias duplicadas: el motor quiere las dos). 2 0 24 #Enter#Play#Esc#Previous: asignaciones de teclas:Enteractiva el control llamado «Play» yEscactiva «Previous».6: el formulario contiene 6 widgets hijos, que siguen a continuación.
Fondos TSF frente a GAF
El widget de cabecera admite dos fuentes de fondo:
.tsf: la forma de texto de una animación truecolor de TA:K, que el cargador de la interfaz lee directamente. En un menú estático es un simple envoltorio de un JPG (el ejemploTitleScreen.tsfenvuelveTitleScreen.jpg), pero el mismo formato describe animaciones completas de varios fotogramas. Consulta TAF / TSF para ver la disposición binaria y la de texto; kbot analiza las dos y hace el viaje de ida y vuelta con ambas..gaf: la animación estándar de TA: Kingdoms. La cabecera hace referencia a una secuencia dentro del GAF; el motor la reproduce como fondo.
En los dos casos, el formato exige que la entrada de imagen aparezca dos veces seguidas; solo se renderiza de verdad la segunda copia. Es una peculiaridad conocida.
Escollos
Warning
Un archivo .gui no tiene suma de comprobación ni marcas de
recuperación. Un solo token de número de hijos mal contado desplaza
sin avisar todos los widgets siguientes. El motor cargará el archivo
(no valida la estructura), pero verás widgets en sitios equivocados, no
encontrará nombres de control o acabarás con botones fantasma.
- Los espacios en blanco solo importan como delimitadores de tokens. Los archivos que distribuyó Cavedog usan tanto espacios como tabuladores; trata cualquier secuencia de espacios en blanco como un único separador.
- Los números de hijos tienen que ser exactos. Un widget de marco
(tipo 9) que termina en
4reclama como hijos los cuatro widgets de nivel superior siguientes. Si te equivocas en el número, el resto del formulario se desbarata. - Los widgets de cuadro de lista y de barra de desplazamiento son, en la práctica, plantillas vacías en los archivos distribuidos: el motor los rellena durante la ejecución a partir del estado del script. No tiene sentido intentar rellenarlos de forma estática.
- La opción de línea de comandos
-disablecavedogverificationde TA:K es necesaria para cargar la mayoría de los.guimodificados. Sin ella, el motor rechazará cualquier archivo cuyo hash no coincida con una lista incrustada. - Algunos archivos se cuelgan desempaquetados y otros, empaquetados. El formato en sí es estable; el cargador del motor se comporta de forma distinta con las capas del sistema de archivos virtual y con el acceso directo a directorios. Cuando hagas mods, prueba los dos estados.
Véase también
- TAF / TSF: la animación truecolor y su forma de texto
.tsf, a la que hacen referencia las cabeceras.guipara los fondos de los menús. - GAF: los archivos
.guihacen referencia continuamente a animaciones.tafcon paleta. - PCX: la convención de portador de paleta que usa TA:K para
los
.tafcon paleta. - Las notas sobre las dificultades del formato de TA:K que hay en los materiales de origen de este repositorio: escollos prácticos al portar recursos de TA a TA:K.
- Glosario.