TDFs do gamedata — Tabelas de configuração do motor
Fonte: coreprime/kbot @ 0ab97bf · Editar no GitHub
Os ficheiros de
gamedata/são ficheiros de texto TDF que configuram o próprio motor: classes de movimento, categorias de dano das armas, dados dos lados (disposição da interface, menus de construção, unidades iniciais), associações de sons e uma mão-cheia de pequenas tabelas de consulta. Os mods que mudam as regras do jogo (em vez de acrescentarem unidades) estão quase sempre aqui.
Esta página documenta os ficheiros de gamedata mais úteis. Todos usam a gramática TDF ao estilo INI; veja TDF para os pormenores ao nível do analisador.
Tip
Experimente por si.
ls $(kbot ctx path)/gamedata/
# The web UI renders these as collapsible section trees
kbot mount $(kbot ctx path) --server
# → browse to gamedata/sidedata.tdf, then sidedata > [CANBUILD]
Os ficheiros, em resumo
| Ficheiro | O que controla |
|---|---|
sidedata.tdf |
A disposição da interface de cada lado, o Comandante inicial, os menus de construção. O maior ficheiro de gamedata/. |
moveinfo.tdf |
Classes de movimento: que terreno cada "MovementClass" consegue atravessar. |
weapons.tdf |
Documento de referência sobre a gramática dos TDF de armas (quase só comentários; não é uma tabela usada durante o jogo). |
category.tdf |
Descrições legíveis das categorias de unidades. Puramente cosmético. |
sound.tdf |
Categorias de sons por unidade (referidas no FBI por SoundCategory=). |
allsound.tdf |
Sons da interface e de eventos do jogo (cliques nos botões, sinais da barra de pontuação, música de fundo). |
los.tdf |
Afinação da linha de visão (modificadores do raio de visão por terreno). |
meteor.tdf |
Parâmetros das chuvas de asteroides (usados por alguns mapas da campanha). |
unitview.tdf |
Disposição do painel de informações da unidade durante o jogo. |
buildinfo.tdf |
Teclas de atalho e texto das dicas do menu de construção. |
version.tdf |
A cadeia de versão do jogo que o lobby indica. |
translate.tdf |
Tabela de consulta de localização para as cadeias da interface. |
help.tdf |
Entradas do sistema de ajuda do jogo. |
Os três grandes, para quem cria mods, são sidedata.tdf (menus de
construção, lados), moveinfo.tdf (classes de movimento) e
weapons.tdf (que é documentação, não dados; as armas propriamente
ditas estão em weapons/*.tdf).
moveinfo.tdf — Classes de movimento
O FBI de uma unidade declara a sua MovementClass=KBOTSS2 (ou
parecida); o motor procura essa classe em moveinfo.tdf para decidir que
terreno a unidade consegue atravessar.
O TA 3.1c só lê as secções [CLASS0] a [CLASS31] (a primeira secção com
cada um desses nomes) e encontra uma classe pelo seu Name=, sem
distinguir maiúsculas de minúsculas, começando pela posição mais baixa.
Quando a classe da unidade é resolvida, os valores da classe
substituem por completo as chaves FootprintX/FootprintZ,
MaxWaterDepth, MinWaterDepth e de declive da própria unidade (o
MaxSlope=20 do Comandante dá lugar aos 32 de TANKDS2), e uma chave que
a classe omita fica com a predefinição do jogo indicada abaixo, e não com o
valor do FBI. Uma unidade sem classe, ou que indique uma que o jogo não
encontre, lê as suas próprias chaves do FBI, com as mesmas predefinições.
Os metadados de unidades, a sandbox e as partidas alojadas do KBot Studio
resolvem o movimento desta forma.
[CLASS0]
{
Name=KBOTSS2; // Class name referenced from FBIs
FootprintX=2; // Cells wide (16-px units)
FootprintZ=2; // Cells deep
MaxWaterDepth=12; // Deepest water it can enter
MaxSlope=32; // Steepest land slope it can climb
}
[CLASS3]
{
Name=TANKDH3;
FootprintX=3;
FootprintZ=3;
MaxWaterDepth=100; // Heavy tank — can ford deep water
MaxWaterSlope=30; // Slope limit *underwater* (separate from MaxSlope)
MaxSlope=15;
}
Campos
| Campo | Tipo | Significado |
|---|---|---|
Name |
cadeia | Identificador da classe referido por MovementClass= nos FBI das unidades. Não distingue maiúsculas de minúsculas. |
FootprintX, FootprintZ |
inteiro | Área ocupada para o cálculo de caminhos, em células de atributos de 16 px. Substitui a área ocupada do FBI da unidade; 0 quando a classe a omite. |
MaxWaterDepth |
inteiro | A água mais funda (em unidades de altura do terreno) em que a unidade pode entrar. 0 = só terra. Predefinição 10000 (qualquer profundidade): as classes de hovercraft omitem-na, por isso um hovercraft anda em qualquer água, diga o FBI o que disser. |
MinWaterDepth |
inteiro | Profundidade mínima de água necessária (barcos, submarinos). Predefinição -10000 (sem mínimo). |
MaxSlope |
inteiro | O declive mais íngreme que a unidade consegue subir em terra (unidades = 2π / 256 radianos). Predefinição 255; limitado por MaxWaterSlope. |
BadSlope |
inteiro | Declive a partir do qual a unidade se move a velocidade reduzida (mais devagar, mas sem ficar bloqueada). Por omissão, metade de MaxSlope; limitado por MaxSlope. |
MaxWaterSlope |
inteiro | O mesmo que MaxSlope, aplicado debaixo de água. Predefinição 255 (sem limite, usado nos hovercrafts). |
BadWaterSlope |
inteiro | Equivalente de BadSlope debaixo de água; por omissão, metade de MaxWaterSlope. |
Convenções de nomes
O nome da classe codifica a sua forma numa etiqueta curta, segundo a convenção da Cavedog:
| Prefixo | Significado |
|---|---|
KBOT |
Kbot bípede |
TANK |
Veículo de lagartas/rodas |
BOAT |
Embarcação de superfície |
SPID |
Aranha / rastejante de muitas patas |
HOVER |
Hovercraft |
Depois vem um sufixo SS / SF / DS / DH / SH
(pequeno/profundo/pesado/etc.) e um algarismo com a área ocupada. Os
nomes são só uma convenção: o motor trata Name= como uma chave opaca.
Important
Duas unidades com a mesma MovementClass= partilham o comportamento
de procura de caminhos. Se mudar KBOTSS2 para MaxWaterDepth=50,
todos os Kbots pequenos passam a andar pela água. Se quiser afinar
unidade a unidade, acrescente antes uma classe nova.
sidedata.tdf — Configuração de cada lado
Este é o ficheiro mais longo de gamedata/, porque junta três assuntos
distintos:
- Declarações dos lados — nome, prefixo, Comandante, tipos de letra, cores.
- Disposição do HUD — coordenadas em píxeis de cada barra de estado, etiqueta e botão da interface do jogo.
- Menus de construção — a secção
[CANBUILD], que lista o que cada construtor pode construir.
Bloco do lado
[SIDE0]
{
name=ARM;
nameprefix=ARM;
commander=ARMCOM; // UnitName of the commander unit
intgaf=ARMINT; // GAF used for intro screen
font=console; // FNT for general text
fontgui=armbutt; // FNT for buttons
energycolor=208; // Palette index for energy bars
metalcolor=224; // Palette index for metal bars
// …followed by ~60 HUD coordinate sub-sections
[LOGO] { x1=132; y1=5; x2=152; y2=25; }
[ENERGYBAR] { x1=471; y1=12; x2=598; y2=14; }
[METALBAR] { x1=218; y1=12; x2=345; y2=14; }
...
}
[SIDE1] { name=CORE; ... }
| Campo | Significado |
|---|---|
name |
Nome do lado mostrado no ecrã (também usado na correspondência de categorias). |
nameprefix |
Prefixo acrescentado às consultas de localização. |
commander |
UnitName da unidade Comandante do lado. |
intgaf |
Sequência GAF mostrada durante a escolha da fação. |
font / fontgui |
Ficheiros FNT para o texto do HUD e para os botões. |
energycolor / metalcolor |
Índices da paleta das barras do HUD (índices de palette.pal). |
O TA 3.1c lê os lados [SIDE0], [SIDE1], … por ordem, e para no
primeiro número em falta ou depois do quinto. Uma secção com qualquer outro
nome ([SIDE01], um [SIDE3] depois de um [SIDE2] em falta, um sexto
lado) nunca é lida, e cada lado lido precisa de todos os retângulos do HUD
abaixo (ta.SideRectangles do kbot-io), ou o jogo não carrega lado
nenhum. O seletor de lados da sandbox do estúdio oferece os mesmos lados.
Subsecções de coordenadas do HUD
Cada elemento visível do HUD é um bloco [NAME] com coordenadas em píxeis
x1/y1/x2/y2. São relativas à resolução base de 640×480; nos modos
superiores, é o motor que faz a escala.
[ENERGYBAR] { x1=471; y1=12; x2=598; y2=14; }
Para mudar a barra de energia de sítio, edite os quatro números. Para lhe
mudar o aspeto, troque o GAF que o HUD usa para desenhar nessa posição
(definido em unitview.tdf).
Menus de construção [CANBUILD]
A definição estática do menu de construção. Cada construtor lista o que pode construir no início da partida:
[CANBUILD]
{
[ARMCOM]
{
canbuild1=ARMSOLAR; // Slot 1 on the build menu
canbuild2=ARMWIN;
canbuild3=ARMESTOR;
canbuild4=ARMMSTOR;
canbuild5=ARMMEX;
...
}
[ARMLAB]
{
canbuild1=ARMCK;
canbuild2=ARMPW;
...
}
}
O número da posição é o lugar na página do menu de construção. O menu de
construção do TA é uma grelha de 2 colunas × 3 linhas, por isso cada
página tem 6 posições: canbuild1–canbuild6 são a página 1,
canbuild7–canbuild12 a página 2, e assim por diante.
Como o TA 3.1c lê a tabela (CanBuildBuilder.BuildList do kbot-io;
kbot document, o visualizador de unidades e o menu de construção da
sandbox seguem-no):
- Só uma unidade cujo FBI defina
Builder=1recebe uma lista; uma subsecção para qualquer outra unidade é ignorada. - O jogo lê a primeira secção
[CANBUILD]e, dentro dela, a primeira subsecção com o nome do construtor (sem distinguir maiúsculas de minúsculas). - Lê
canbuild1,canbuild2, … e para no primeiro número em falta:canbuild1=ARMSOLAR; canbuild3=ARMLAB;dá uma entrada. - Um nome que não corresponda a nenhuma unidade é saltado, e uma lista guarda no máximo 30 unidades. As entradas de download (ver abaixo) podem levar o menu de um construtor até 31. (Alguma documentação mais antiga afirmava que havia 12 posições por página; a grelha real do jogo tem 6.) Veja a referência da árvore de construção do TA para a disposição por página de cada construtor do jogo base.
Important
Nos mods, NÃO edite sidedata.tdf para acrescentar unidades. O
método abençoado pela Cavedog para acrescentar uma unidade ao menu de
construção é incluir um ficheiro download/<UNITNAME>.tdf com o resto
do mod: no arranque, o motor junta todos os download/*.tdf à tabela
estática [CANBUILD] de sidedata.tdf.
Editar sidedata.tdf só se justifica se estiver a distribuir uma
conversão total que reescreve toda a disposição do HUD e do menu de
construção. Até a própria expansão Core Contingency da Cavedog
acrescenta as novas unidades através de download/*.tdf, sem modificar
sidedata.tdf.
Veja TDF: [MENUENTRY]
e o tutorial de criação de mods.
weapons.tdf — Referência dos TDF de armas
Apesar do nome, gamedata/weapons.tdf é quase só comentários: é a
referência publicada pela Cavedog para a gramática dos TDF de armas, e o
jogo nunca o carrega. As definições reais das armas estão em
weapons/*.tdf, uma secção por arma (veja TDF).
kbot document não lista as secções de gamedata/weapons.tdf como
armas.
A tabela de armas
O TA 3.1c constrói uma tabela de 256 posições de armas a partir dos
ficheiros .tdf que estão diretamente em weapons/ (não nas subpastas),
pela ordem em que os lista:
- Uma secção vai para a posição indicada pelo seu
ID=, de0a255. Uma secção semID, ou com um fora desse intervalo, é saltada. - Uma secção posterior com o mesmo
ID, no mesmo ficheiro ou num ficheiro posterior, substitui a anterior. Weapon1/Weapon2/Weapon3,ExplodeAseSelfDestructAsde uma unidade indicam uma secção; o nome (sem distinguir maiúsculas de minúsculas) resolve-se na posição mais baixa que tenha uma secção com esse nome.- Os valores são lidos como prefixos numéricos:
weaponacceleration=13O;vale 13, e um valor inválido nunca faz perder o resto do ficheiro. - Uma estrutura danificada faz o jogo recusar o ficheiro inteiro, pelo
que nenhuma das suas armas é carregada, incluindo as secções anteriores
ao erro: um cabeçalho de secção sem
]ou sem{, texto sem=ou um valor sem;antes do fim do ficheiro, o ficheiro a terminar dentro de uma secção, ou um ficheiro vazio. Os outros ficheiros não são afetados. (Uma}solta fora de qualquer secção não leva à recusa: o jogo deixa de ler nesse ponto e fica com o que veio antes.) - Um
rangeem falta vale32767; umminbarrelangleem falta vale-11.25graus;reloadtimeconta-se em ticks inteiros (30 por segundo,reloadtime*30truncado:0.35recarrega ao fim de 10 ticks, 0.333 s);turnrateestá em unidades de ângulo por segundo (65536 = uma volta completa).
O KBot Studio, os pacotes e kbot host resolvem todos as armas através
desta tabela. Os ficheiros que o jogo recusa e as secções que salta ou
substitui são assinalados como avisos
(kbot pack mostra-os; o estúdio disponibiliza-os em
/api/studio/weapons/warnings).
Sprites rendertype=4
Uma arma rendertype=4 dispara um sprite 2D de anims/fx.gaf, e o seu
color= escolhe qual: 0 cannonshell, 1 plasmasm, 2 plasmamd, 3
ultrashell, 4 de novo plasmasm; qualquer outro valor (como o
color=255 do EARTHQUAKE) não desenha sprite nenhum. O sprite avança um
fotograma por tick do jogo desde o momento do disparo, sejam quais forem
as durações dos fotogramas do GAF.
Os comentários de referência documentam:
- Três arquétipos de armas:
ballistic,lineofsight,dropped. Todos os TDF de armas têm de pôr um destes a1. - Alcance, velocidade, aceleração — em píxeis e píxeis/s.
- Área de efeito — raio em píxeis, com
edgeeffectivenesscomo fração de atenuação (por exemplo,0.5= metade do dano na orla). - Rajada e dispersão —
burst,burstrate,sprayangle. - Armas de duas fases —
twophase,weapontype2,flighttimepara projéteis ao estilo starburst. - Tipo de renderização —
rendertype=Nescolhe modelo 3D, mapa de bits com paleta, feixe, etc.
A subsecção [DAMAGE] é onde ficam os modificadores de dano por
categoria de alvo:
[FLAMETHROWER] {
...
[DAMAGE]
{
default=10; // Damage applied to anything not listed
corpyro=2; // Pyros are nearly fire-proof
}
}
As chaves de [DAMAGE] são nomes de unidades: uma unidade listada
sofre esse dano em vez de default=, e todas as outras sofrem default=.
Os valores são guardados em 16 bits. As explosões de morte (ExplodeAs,
SelfDestructAs) usam a mesma tabela: CORPYRO_BLAST causa 60 por
omissão, mas só 15 a um Pyro.
category.tdf — Descrições das categorias de unidades
Uma lista simples e cosmética que associa os tokens de categoria a texto legível. O motor mostra-os no painel de informações da unidade:
[Plant] { description = Unit Creation plant; }
[KBOT] { description = Some type of units; }
[Tank] { description = Some type of units; }
[Metal] { description = Some type of units; }
Os traços em vez de descrições são texto-padrão involuntário da Cavedog. A maioria dos mods não mexe neste ficheiro; alguns substituem as descrições por texto de ambientação a sério. Alterá-lo não afeta a jogabilidade.
sound.tdf e allsound.tdf
Tratados em WAV / Som. Em resumo:
sound.tdf— associações de sons por categoria de unidade (as secções[ARM_COM],[ARM_KBOT]). Referido no FBI porSoundCategory=. O jogo lê 23 eventos, cada um comoKEYe depoisKEY1,KEY2, … até ao primeiro número em falta.allsound.tdf— associações globais de sons da interface ([BIGBUTTON],[SKIRMISH],[BGM]).
Exemplo comentado — acrescentar uma classe de movimento
Para criar uma classe de "barco que consegue passar a vau em água muito pouco funda":
Acrescente ao fim de
gamedata/moveinfo.tdf:[CLASS20] { Name=AMPHIB3; FootprintX=3; FootprintZ=3; MaxWaterDepth=100; // Deep water OK MaxSlope=20; // Reasonable land climbing MaxWaterSlope=200; // Smooth underwater movement }No FBI da sua unidade:
MovementClass=AMPHIB3;A área ocupada e os limites da classe substituem os do próprio FBI, por isso as chaves
FootprintX/FootprintZ/MaxWaterDepthda unidade deixam de contar.Empacote:
kbot hpi pack ./mymod --target mymod.ufo
A unidade passa a atravessar terra e água sem problemas.
Note
Só [CLASS0] a [CLASS31] são lidas. Uma classe em [CLASS32],
[CLASS100] ou [HOVERXL] nunca é encontrada, e as unidades que a
indiquem recorrem às suas próprias chaves do FBI. Escolha uma posição
livre abaixo de 32 (a versão comercial usa CLASS0 a CLASS14); uma
segunda secção com o mesmo nome de posição é ignorada.
Tamanhos típicos
| Ficheiro | Intervalo observado em gamedata/ da Cavedog |
|---|---|
sidedata.tdf |
~50 KB |
moveinfo.tdf |
~3 KB (15–20 classes) |
sound.tdf |
~20 KB (300+ categorias) |
weapons.tdf |
~2 KB (quase só comentários) |
category.tdf |
~1 KB |
| Outros ficheiros de gamedata | < 5 KB cada |
Armadilhas
Warning
Muitos ficheiros de gamedata são carregados uma só vez, no arranque do motor, e não a cada mapa. Para testar uma alteração, tem de reiniciar o jogo; voltar a carregar o lobby não chega. Isto apanha muitos modders, que julgam que a alteração "não pegou".
- As posições das classes de movimento são fixas. Só
[CLASS0]a[CLASS31]são lidas; os buracos na numeração dentro desse intervalo não fazem mal. - Os comentários usam
//, não/*…*/, na maioria dos ficheiros, masweapons.tdfusa ambos. Os analisadores de teste toleram ambos; algumas ferramentas de terceiros não. - As coordenadas do HUD de
sidedata.tdfestão na base de 640×480 e o motor aumenta-as nas resoluções mais altas. Não escreva coordenadas em resoluções modernas. - A numeração de
[CANBUILD]não pode ter buracos. O jogo deixa de ler a lista de um construtor no primeirocanbuildNem falta, por isso umcanbuild11seguido decanbuild14perde a entrada 14 e todas as que vêm depois, sem qualquer erro. - Uma
MovementClassque o jogo não encontra não é um erro. A unidade usa silenciosamente as suas próprias chaves do FBI, com as predefinições do jogo para as que faltam: uma unidade semMaxWaterDepthpassa então a andar pela água até à profundidade 10000.