.gui do TA: Kingdoms — árvores de widgets separados por espaços
Fonte: coreprime/kbot @ 0ab97bf · Editar no GitHub
O TA: Kingdoms desenhava o menu principal, o lobby, o HUD durante a partida e as caixas de diálogo a partir de ficheiros
.gui, um formato peculiar de descrição de widgets separados por espaços em branco. Apesar da semelhança visual com os ficheiros de interface do próprio TA (também.gui), o formato do TA:K tem uma estrutura diferente e não é intercambiável.
Note
Atualmente, o kbot não inclui um subcomando para o .gui do TA:K: o
formato fica aqui documentado para que a referência esteja completa e
para orientar ferramentas futuras. Ainda assim, pode examinar estes
ficheiros à mão: são texto ASCII simples.
O que está a ver
Um ficheiro .gui é uma sequência plana de widgets. O widget de
cabeçalho do ficheiro declara o número total de widgets e os metadados
globais (imagem de fundo, teclas de atalho); cada widget seguinte
descreve um único elemento da interface.
Um widget típico tem este aspeto:
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
Os tokens são separados por espaços em branco. O primeiro token de cada widget é o ID do tipo de widget; tudo o que vem a seguir obedece a um esquema próprio de cada tipo.
Cadeias com prefixo de comprimento
O truque mais importante do formato: cada cadeia de caracteres é precedida do seu comprimento em caracteres, sob a forma de um token inteiro. Isto significa que as cadeias podem conter espaços, mas o analisador tem de ler primeiro o comprimento.
1 14 MainScreen.gaf
^ ^^ ^^^^^^^^^^^^^^
│ │ │
│ │ └─ the string itself (14 characters)
│ └─ length
└─ string-flavour prefix (1 = literal string)
Uma cadeia nula/vazia é 1 0 0 (prefixo, comprimento zero, e o payload
vazio é "a cadeia vazia"). Os prefixos 1/0 repetidos são muito fáceis
de analisar mal se se limitar a dividir o texto em tokens pelos espaços e
começar a contar: é preciso ler sequencialmente, pela ordem dos widgets.
Important
Não dá para procurar "o terceiro botão" num ficheiro .gui com um
grep e obter algo útil: a estrutura é sequencial, não endereçável. Os
editores escritos para este formato são analisadores sequenciais.
Tipos de widgets
IDs de tipos de widgets observados:
| ID | Widget | Notas |
|---|---|---|
2 |
Cabeçalho / formulário | O primeiro widget do ficheiro. Contém o fundo, as teclas de atalho e o número de filhos. |
4 |
Botão | 3 estados (desativado / premido / levantado). |
5 |
Caixa de verificação | Matriz de 5 estados (desativado, desligado-premido, ligado-premido, desligado-levantado, ligado-levantado). |
9 |
Moldura | Contentor invisível; só agrupa widgets visualmente. |
12 |
Contentor da barra de deslocamento | Delimita o cursor e os seus botões de incremento/decremento. |
14 |
Botão da barra de deslocamento (incremento / decremento / cursor) | A cada 12 seguem-se três destes. |
15 |
Caixa de lista | Preenchida durante a execução; os modelos estão quase vazios. |
17 |
Botão de opção | 3 estados. |
18 |
Botão de vários estados | Botão que percorre N estados (por exemplo, o seletor "dificuldade da IA"). |
19 |
Imagem + etiqueta | O widget combinado do TA:K para arte estática + legenda. |
Cada tipo tem um esquema fixo para os tokens que vêm depois do ID do tipo. O esquema canónico, obtido por engenharia inversa por Dark Rain, está preservado nos materiais de origem que acompanham este repositório.
Forma genérica de um 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]
Para cada tipo de widget, o tamanho de [N] e a estrutura do conjunto de
cadeias variam; os esquemas nos materiais de origem documentam cada um.
Códigos de alinhamento
Dentro do conjunto de cadeias:
| Código | Alinhamento |
|---|---|
0 |
Centrado |
1 |
À esquerda |
2 |
À direita |
Num widget de um só estado vê-se, por exemplo, 2 0 6 Player; num botão
de 3 estados veem-se os três estados concatenados, por exemplo
2 0 0 2 0 6 Player 2 3 6 Play2r 3.
Exemplo comentado — menu 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
Lendo de cima para baixo:
2 1— widget do tipo 2 (cabeçalho), flag 1.2 0 0 640 480 1 1 0 0— limites na origem, 640×480, mais os quatro tokens de flags.3 255 255 255 255— entrada de cor branca opaca.8 MainMenu 1 2— nome de controlo "MainMenu" (8 caracteres), seguido de1 2.- As duas entradas
TitleScreen.tsf JPGTestsão a imagem de fundo (duas referências duplicadas: o motor quer as duas). 2 0 24 #Enter#Play#Esc#Previous— atalhos de teclado:Enteraciona o controlo chamado "Play",Escaciona "Previous".6— o formulário contém 6 widgets filhos, que vêm logo a seguir.
Fundos TSF e GAF
O widget de cabeçalho aceita duas fontes de fundo:
.tsf— a forma de texto de uma animação truecolor do TA:K, que o carregador da interface lê diretamente. Num menu estático, é um simples invólucro de um JPG (o exemploTitleScreen.tsfenvolveTitleScreen.jpg), mas o mesmo formato descreve animações completas com vários fotogramas. Veja TAF / TSF para a disposição binária e a de texto, que o kbot analisa e reproduz em ida e volta..gaf— a animação normal do TA: Kingdoms. O cabeçalho refere uma sequência dentro do GAF; o motor reprodu-la como fundo.
Em qualquer dos casos, o formato exige que a entrada da imagem apareça duas vezes seguidas; só a segunda cópia é de facto renderizada. É uma peculiaridade conhecida.
Armadilhas
Warning
Um ficheiro .gui não tem soma de verificação nem marcadores de
recuperação. Basta um token de número de filhos mal contado para
deslocar, sem aviso, todos os widgets seguintes. O motor carrega o
ficheiro (não valida a estrutura), mas vai ver widgets nos sítios
errados, nomes de controlos que não são encontrados ou botões fantasma.
- O espaço em branco só serve para separar tokens. Os ficheiros distribuídos pela Cavedog usam espaços e tabulações; trate qualquer sequência de espaços em branco como um único separador.
- O número de filhos tem de ser exato. Um widget de moldura (tipo 9)
que termine em
4reclama como filhos os quatro widgets de nível superior seguintes. Se errar o número, o resto do formulário desfaz-se. - Os widgets de caixa de lista e de barra de deslocamento são, no essencial, modelos vazios nos ficheiros distribuídos: o motor preenche-os durante a execução a partir do estado dos scripts. Não vale a pena tentar preenchê-los estaticamente.
- A flag de linha de comandos
-disablecavedogverificationdo TA:K é obrigatória para carregar a maior parte dos ficheiros.guimodificados. Sem ela, o motor rejeita qualquer ficheiro cujo hash não corresponda a uma lista incorporada. - Alguns ficheiros falham quando estão desempacotados, outros quando estão empacotados. O formato em si é estável; o carregador do motor comporta-se de forma diferente nas camadas do sistema de ficheiros virtual e no acesso direto às pastas. Quando criar mods, teste os dois casos.
Ver também
- TAF / TSF — a animação truecolor e a sua forma de texto
.tsf, que os cabeçalhos.guireferem para os fundos dos menus. - GAF — as animações
.tafcom paleta são referidas por todo o lado nos ficheiros.gui. - PCX — a convenção de transporte de paleta que o TA:K usa nos
.tafcom paleta. - As notas sobre as dificuldades dos formatos do TA:K, nos materiais de origem deste repositório — armadilhas práticas ao portar recursos do TA para o TA:K.
- Glossário.