TDF / FBI / OTA — arquivos de configuração em texto
Fonte: coreprime/kbot @ 0ab97bf · Editar no GitHub
Os arquivos TDF ("Text Data File"), FBI ("Feature/Building/Item") e OTA ("Online Total Annihilation") compartilham o mesmo formato de texto no estilo INI. Eram a forma padrão de a Cavedog declarar tudo o que não fosse binário: atributos de unidades, parâmetros de armas, definições de elementos, metadados de missões, categorias de som, dicas para a IA.
| Extensão | Onde encontrar | Exemplos |
|---|---|---|
.fbi |
units/ |
ARMCOM.FBI, CORRAID.FBI — definições de unidades |
.tdf |
features/, weapons/, sounds/, gamedata/ etc. |
armflak_weapon.tdf, treeb.tdf |
.ota |
maps/ |
metal heck.ota — metadados do mapa, posições iniciais, instruções para a IA |
São arquivos em ASCII simples, que podem ser abertos em qualquer editor de texto.
Tip
Experimente você mesmo.
# The web UI renders FBI/TDF/OTA as collapsible section trees
kbot mount ~/games/totala --server
# → browse to units/ARMCOM.FBI
Veja a referência de kbot mount
da linha de comando para o uso no navegador de terminal e as opções de
desempacotamento.
Em Go. Use formats/tdf:
import "github.com/coreprime/kbot/formats/tdf"
doc, _ := tdf.ParseFile("units/ARMCOM.FBI")
info := doc.Section("UNITINFO")
fmt.Println(info.String("UnitName"), info.Int("MaxDamage"))
Sintaxe
Um arquivo TDF é uma árvore de seções. Cada seção tem um nome entre
colchetes e depois um corpo { ... } com pares chave=valor e/ou
seções aninhadas.
[UNITINFO]
{
UnitName=ARMCOM;
Designation=Commander;
Description=Commander, Arm;
Side=ARM;
Objectname=armcom;
BuildCostEnergy=2500;
BuildCostMetal=2500;
MaxDamage=3000;
[SOUNDS]
{
canselect=cmdsel1;
select1=cmdok1;
}
}
Regras:
- Os nomes de seção ficam entre colchetes; tudo o que vem depois, até o
}correspondente, pertence a essa seção. Uma seção pode ocupar uma só linha ([special0] { specialwhat=StartPos1; XPos=464; ZPos=216; }). - Um valor vai do
=até o próximo;, atravessando quebras de linha: nada mais o encerra, então chaves, colchetes e=dentro de um valor são texto comum, e um valor nunca pode conter;. Espaços, tabulações e quebras de linha nas pontas de uma chave ou de um valor são removidos. Uma chave atribuída duas vezes fica com o último valor. - As chaves não diferenciam maiúsculas de minúsculas.
UnitName,unitnameeUNITNAMEse referem ao mesmo campo; as ferramentas costumam normalizar tudo para minúsculas na leitura. Os nomes de seção também são comparados sem diferenciar maiúsculas. - Os valores são strings por padrão. Os números são lidos à maneira do
C, a partir dos dígitos iniciais:
12abcé lido como 12, e56.8como 56 quando o jogo espera um número inteiro (campos comokillmuletidalstrengthsão lidos como frações). As listas são separadas por espaços (por exemplo,Category=NOTSUB COMMANDER NOTAIR ...). - Os comentários são apagados antes de qualquer outra leitura:
//até o fim da linha e blocos/* ... */, que podem ocupar várias linhas. Assim,missiondescription=See http://tauniverse.com;perde tudo a partir de//, inclusive o;, e o valor continua pela linha seguinte. O kbot se recusa a gravar um valor que contenha;,//ou/*. - Espaços em branco e linhas vazias são ignorados.
Seções aninhadas (como [SOUNDS] dentro de [UNITINFO] acima) são comuns
em FBI/OTA. A especificação do TDF não fixa uma profundidade máxima; na
prática, você não vai ver mais de 3 níveis.
FBI — definições de unidades
Um FBI é a visão completa que o motor tem de uma unidade. Ele reúne num só lugar o modelo 3D da unidade, o script, a lista de armas, o banco de som, os custos de construção e o comportamento em combate. Um exemplo resumido do Comandante ARM:
[UNITINFO]
{
// === Identification ===
UnitName=ARMCOM; // Internal lookup key
Objectname=armcom; // → objects3d/armcom.3do, scripts/armcom.cob
Side=ARM; // ARM or CORE
Designation=Commander; // Mouseover label
Description=Commander, Arm;
// === Economy & build ===
BuildCostMetal=2500;
BuildCostEnergy=2500;
BuildTime=89400; // Build-power × seconds (engine units)
WorkerTime=300; // How fast it builds other things
// === Combat ===
MaxDamage=3000; // Hit points
Weapon1=COMMANDER_WEAPON; // → weapons/commander_weapon.tdf [COMMANDER_WEAPON]
Weapon2=disintegrator; // The dreaded D-gun
candgun=1; // Allowed to fire weapon2 on demand
// === Movement ===
MaxVelocity=1.15;
Acceleration=0.075;
BrakeRate=0.0825;
TurnRate=510;
MovementClass=COMMANDER_TANK3; // → gamedata/movinfo.tdf
// === Senses ===
SightDistance=520;
RadarDistance=585;
// === Tags & categories ===
Category=COMMANDER SURFACE MOBILE WEAPON ...;
NoChaseCategory=AIR;
[SOUNDS] {
canselect=cmdsel1;
select1=cmdok1;
...
}
}
O guia de FBI da comunidade, de 1998 (preservado nos materiais de origem deste repositório), documenta mais de cem campos. A maioria se explica sozinha; os que não são óbvios costumam ser:
| Campo | O que ele realmente controla |
|---|---|
Bmcode |
Código de página do menu de construção — deixe em 1 para unidades normais. |
Category |
Lista de tags separadas por espaços, usada por BadTargetCategory das armas, por NoChaseCategory, pela IA e pelos menus de construção. |
MovementClass |
Aponta para uma classe em gamedata/movinfo.tdf que define as inclinações de terreno aceitáveis, a profundidade da água etc. |
YardMap |
Desenho em ASCII (por exemplo, oooo\noooo\n) que declara a área ocupada pela unidade e as restrições de água/terra por célula. |
Corpse |
Nome de uma [FEATURE] (veja abaixo) usada como os destroços deixados. |
SoundCategory |
Escolhe o banco de áudio em gamedata/sound.tdf. |
TEDClass |
Dica para o editor da Cavedog; ignorado durante o jogo. |
Important
UnitName é a chave de consulta em todos os outros lugares: o OTA se
refere a ela, a IA se refere a ela, o menu de construção se refere a ela.
Se você renomear um FBI, terá de procurar com grep as referências no mod
inteiro.
TDF — definições de elementos, armas e sons
Os arquivos features/**/*.tdf contêm seções [FEATURE], uma para cada
objeto estático do mapa. O formato TNT (TNT) se refere a elas
pelo nome da seção:
[ArmTree01]
{
description=Arm Tree;
category=trees;
object=arm_tree01; // → objects3d/arm_tree01.3do
footprintx=1;
footprintz=1;
height=20;
blocking=1; // Pathing obstacle
flamable=1;
burnmin=10;
burnmax=20;
burntime=30;
feature_reclamate=ArmTree01_Heap; // Recursive: what's left when reclaimed
damage=15;
reclaimable=1;
energy=0;
metal=2;
seqname=arm_tree01; // GAF sequence to draw (for animated features)
}
Os weapons/*.tdf seguem o mesmo padrão, com seções [WEAPON_NAME]. O
campo Weapon1=COMMANDER_WEAPON do FBI aponta para a seção
[COMMANDER_WEAPON] de algum TDF em weapons/, por meio da tabela de
armas indexada por ID do jogo: cada seção precisa de um ID= entre 0 e
255, uma seção posterior com o mesmo ID substitui a anterior, e um nome
aponta para a posição mais baixa que o contém (veja
Gamedata: a tabela de armas). O guia de
armas da comunidade documenta cerca de 60 campos diferentes; os mais
importantes são ballistic/lineofsight/dropped (o arquétipo da arma),
weapontimer, weaponvelocity, areaofeffect, edgeeffectiveness,
burst/burstrate e a subseção [DAMAGE] (modificadores de dano por
categoria).
[FLAMETHROWER] {
ID=1;
name=Flame Thrower;
rendertype=5;
ballistic=1;
turret=1;
range=160;
reloadtime=1.2;
weapontimer=1;
weaponvelocity=188;
areaofeffect=32;
burst=17;
burstrate=.04;
[DAMAGE] {
default=10;
corpyro=2; // Pyros are nearly fireproof
}
}
[MENUENTRY] — extensão do menu de construção
Os arquivos em download/*.tdf registram uma unidade nos menus de
construção de um ou mais construtores sem modificar o sidedata.tdf. É
o mecanismo que a expansão Core Contingency da Cavedog usa para acrescentar
suas unidades, e a convenção que todo add-on .ufo de uma só unidade
segue.
[MENUENTRY1]
{
UNITMENU=ARMVP; // Builder's UnitName
MENU=3; // Menu page (row)
BUTTON=4; // Slot within the page
UNITNAME=MYFLASH; // Unit being placed
}
[MENUENTRY2] // Additional builders for the same unit
{
UNITMENU=ARMACV;
MENU=3;
BUTTON=4;
UNITNAME=MYFLASH;
}
| Campo | Tipo | Significado |
|---|---|---|
UNITMENU |
str | UnitName da unidade construtora em cujo menu estamos acrescentando a unidade. |
MENU |
int | Número da página do menu de construção. As páginas 1–2 são reservadas pela Cavedog para as unidades originais; a convenção da comunidade é começar em 3. |
BUTTON |
int | Posição dentro da página (0–5, dispostas numa grade de 2 colunas × 3 linhas: 0=superior esquerda, 1=superior direita, 2=meio à esquerda, 3=meio à direita, 4=inferior esquerda, 5=inferior direita). |
UNITNAME |
str | A unidade que está sendo acrescentada — precisa coincidir com o UnitName= do FBI da sua unidade. |
Convenção de nomes do arquivo. Por convenção, o arquivo se chama
download/<UNITNAME>.tdf (igual ao UNITNAME= da primeira entrada), mas
o motor lê todos os *.tdf de download/, então o nome do arquivo é só
uma indicação para o modder. O normal é uma unidade por arquivo.
Várias entradas. Um único arquivo pode ter várias entradas: o
download/Armfort.tdf da Cavedog usa três para que a Muralha de
Fortificação ARM possa ser construída pelo ACK, pelo ACV e pelo ACA. O TA
3.1c lê as cinco primeiras seções de cada arquivo, quaisquer que sejam
os nomes ([MENUENTRY1] é a convenção, mas [ENTRY0] também funciona);
uma sexta seção nunca é lida. Uma entrada cujo UNITMENU não nomeia
nenhuma unidade, ou nenhuma unidade com Builder=1, é ignorada, assim como
uma cujo UNITNAME não nomeia nenhuma unidade. MENU e BUTTON ficam
limitados a 8 bits, e o menu de um construtor — sua lista [CANBUILD]
mais os acréscimos de download — comporta no máximo 31 unidades.
Important
download/*.tdf acrescenta ao menu de construção; não substitui
nada. Se a posição escolhida colidir com uma entrada existente, o
comportamento do motor é imprevisível — normalmente vence a entrada
carregada por último, mas a ordem de carregamento dos .ufo não é
garantida entre plataformas. Escolha uma página de MENU alta (4 ou 5)
para mods feitos para conviver com outros.
É esse o gancho aditivo para mods que permite distribuir um único .ufo
sem criar uma versão própria do sidedata.tdf de 50 KB. Veja o tutorial
de modding para o uso
de ponta a ponta.
OTA — metadados do mapa
O .ota acompanha todo .tnt e traz tudo o que o motor precisa para
jogar o mapa (e não para renderizar seu terreno):
[GlobalHeader]
{
missionname=Metal Heck;
missiondescription=A small, brutal metal map.;
planet=metal;
tidalstrength=0;
solarstrength=20;
lavaworld=0;
killmul=50;
waterdoesdamage=0;
minwindspeed=100;
maxwindspeed=2500;
gravity=112;
numplayers=2,4,6,8,10;
[Schema 0] {
Type=Network 1;
aiprofile=DEFAULT;
SurfaceMetal=10;
MohoMetal=125;
HumanMetal=1000;
ComputerMetal=1000;
HumanEnergy=1000;
ComputerEnergy=1000;
[specials] {
[special0] { specialwhat=StartPos1; XPos=464; ZPos=216; }
[special1] { specialwhat=StartPos2; XPos=3408; ZPos=216; }
...
}
}
}
kbot tnt preview lê o .ota correspondente e desenha marcadores
numerados em cada posição inicial do esquema escolhido.
Como o jogo lê os esquemas e as posições iniciais (todas as visões do
kbot — o editor de mapas do studio, a sandbox, o explorador de recursos,
kbot tnt preview, kbot tnt lint e o Quality Checker — os leem da mesma
forma, pela visão de jogo do OTA no kbot-io):
- Os esquemas são encontrados pelo nome,
Schema 0,Schema 1, … até o primeiro número que faltar. Os nomes são comparados sem diferenciar maiúsculas ([schema 1]conta), mas o número precisa estar escrito de forma simples:[Schema0]ou[Schema 01]nunca é encontrado, e um esquema depois de uma lacuna (Schema 0,Schema 1,Schema 3) nunca é lido.SCHEMACOUNTé ignorado. - As partidas de escaramuça e multijogador escolhem um esquema pelo
Typee pelo número de posições iniciais, não pela posição no arquivo. Só se qualificam os esquemasNetwork 1aNetwork 4(comparados sem diferenciar maiúsculas) com pelo menos uma posição inicial. Para N jogadores, o jogo prefere o último esquema qualificado com exatamente N posições iniciais; se não houver, o que tiver mais. Uma missão da campanha escolhe pela dificuldade (Easy,Medium,Hard).numplayersé só um texto mostrado no lobby (2, 4,2-8eAnycarregam todos). - As posições iniciais são as entradas de
[specials]cujospecialwhatcomeça comStartPos(sem diferenciar maiúsculas).StartPosNé o lugar de jogador N-1,StartPos0também é o lugar 0, e uma entrada sem número depois deStartPosrecebe o próximo número de uma contagem própria (o primeiro é 1).XPoseZPossão pixels do mapa, limitados a 16 bits. - Chaves ausentes têm valores padrão, não zeros: sem
missiondescription, aparece "No description available"; semmaxunits(só nas campanhas), vale 200; e um elemento pré-posicionado ([features]) semXPosouZPosé ignorado, então um elemento na coluna ou na linha 0 precisa de um0explícito.
Note
O editor de mapas do studio edita o .ota de um mapa no próprio
arquivo. Ao salvar, só mudam os valores que você editou (e são
acrescentados ou removidos os esquemas e as posições iniciais que você
acrescentou ou removeu); todo o resto — chaves de vitória e de gatilhos,
useonlyunits, [units], [features], outros [specials], frações
como killmul=0.5, comentários — é gravado de volta como estava. Remover
um esquema ou uma posição inicial regrava o arquivo no layout do kbot-io
(mesmo conteúdo, sem os comentários) e renumera os esquemas seguintes para
que o jogo continue a encontrá-los. Um .ota que o kbot não consegue ler
aparece com o respectivo erro e fica inalterado ao salvar, e o texto de
diálogo que contenha ;, // ou /* é recusado. O mesmo acontece com um
salvamento que faria o jogo ler um esquema que hoje ele ignora: um esquema
novo recebe o menor número livre, então, num arquivo com [Schema 0] e
[Schema 2], o novo [Schema 1] colocaria o [Schema 2] em jogo; o erro
indica a seção a renomear ou remover. Uma fração grande demais para ser
guardada (killmul=1e999, que o jogo lê como infinito) aparece como o
maior número possível e é mantida como foi escrita, a menos que você a
altere. O jogo tira o nível do mar do cabeçalho do .tnt; o editor mantém
sincronizada uma chave sealevel= existente, mas nunca acrescenta uma.
Exemplo comentado: unidade mínima
Um FBI "de mentira" completo e funcional para uma torre fixa:
[UNITINFO]
{
UnitName=MYTURRET;
Objectname=myturret;
Side=ARM;
Designation=Test Turret;
Description=Bare-minimum turret for format testing.
BuildCostMetal=200;
BuildCostEnergy=400;
BuildTime=2400;
MaxDamage=600;
Category=NOTSUB SURFACE WEAPON NOTAIR;
TEDClass=LASER;
Builder=0;
canattack=1;
onoffable=0;
ActivateWhenBuilt=1;
Weapon1=LIGHTLASER;
FootprintX=2;
FootprintZ=2;
YardMap=cccc;
MaxSlope=15;
MaxWaterDepth=0;
SightDistance=300;
Corpse=MyTurret_Dead;
[SOUNDS] {
select1=corselect1;
ok1=corok1;
}
}
Para transformar isso num add-on completo de unidade, você distribuiria:
mymod/
├── units/myturret.fbi
├── objects3d/myturret.3do
├── scripts/MYTURRET.cob
├── features/corpses/myturret.tdf # contains [MyTurret_Dead]
└── unitpics/MYTURRET.PCX
…e depois empacotaria a pasta em HPI:
kbot hpi pack ./mymod --target myturret.ufo
Armadilhas
Warning
Todo valor precisa terminar com ;. A falta de um ponto e vírgula não
gera erro: o analisador junta silenciosamente o valor com a linha
seguinte, produzindo atributos desconcertantes (um MaxDamage=3000
seguido de um Description=... sem terminação produz uma unidade com
30.000 pontos de vida e sem dica).
- As chaves não diferenciam maiúsculas; os valores, sim.
Side=armfunciona com a lógica de classificação de unidades do ARM, mas mods que trocam de lado em tempo real comif (Side == "ARM")em comparações exatas de strings vão quebrar. - Os valores de lista são separados por espaços
(
Category=COMMANDER MOBILE WEAPON), não por vírgulas. O motor divide em qualquer espaço em branco. - Alguns campos do OTA usam vírgulas, porém:
numplayers=2,4,6,8,10. Não existe uma convenção única de delimitador de listas, e o jogo nunca analisanumplayers: só mostra o texto. - As seções aninhadas não têm limite formal de profundidade, mas a
Cavedog nunca distribuiu nada com mais de 3 níveis. Editores que supõem 2
níveis falham em alguns TDFs de armas com aninhamento no estilo
[WEAPON][DAMAGE][category]. - Os campos booleanos são inteiros (
canmove=1,canstop=0), nãotrue/false. O motor só aceita1/0. - Os arquivos
.otacostumam ter mojibake de UTF-8 nas descrições das missões (aspas curvas do Word etc.). O motor os renderiza com a página de código Windows-1252 e mostra como tofu (quadradinhos) tudo o que estiver fora dela.
Tamanhos típicos
| Recurso | Faixa observada no conteúdo da Cavedog |
|---|---|
| FBI de unidade | 1–4 KB (Comandante: ~3 KB; tanque leve: ~1,5 KB) |
| TDF de um único elemento | 200 B – 1 KB |
| TDF de armas | 0,5–3 KB por seção [WEAPON] |
| Arquivo OTA | 1–8 KB |
gamedata/sidedata.tdf |
~50 KB (o layout do HUD domina) |
gamedata/sound.tdf |
~20 KB |
| Total de FBIs no TA + CC | ~250 arquivos |
Apêndice A — dicionário de campos FBI
Todos os campos encontrados com frequência em units/*.fbi, agrupados por
finalidade. Legenda da coluna Tipo: str = identificador/string;
int = inteiro; float = ponto flutuante; bool = 0/1; list =
tokens separados por espaços em branco; enum = inteiro pequeno com
significados documentados.
Os campos que não aparecem aqui são rascunho do editor (UnitNumber,
Copyright) ou não estão documentados. O motor ignora chaves
desconhecidas sem avisar.
Identidade e exibição
| Campo | Tipo | Observações |
|---|---|---|
UnitName |
str | Chave principal de consulta. Referenciada por outras configurações, pela IA, pelo OTA e pelos menus de construção. |
Side |
str | ARM ou CORE (TA), Aramon/Taros/Veruna/Zhon (TA:K). Corresponde a um [SIDE<N>] em gamedata/sidedata.tdf. |
Objectname |
str | Nome base da malha .3do, do script .cob e do retrato unitpics/*.pcx da unidade. |
Designation |
str | O "código de tipo" exibido no painel de informações da unidade (por exemplo, ARM-WM para o Comandante ARM). |
Name |
str | Nome curto exibido sobre a unidade. |
Description |
str | Texto da dica (tooltip) mostrado no botão de construção e no painel de informações da unidade. |
GermanName / FrenchName / SpanishName / ItalianName / JapaneseName / PigLatinName |
str | Nomes localizados. Usados conforme o idioma da versão distribuída. |
GermanDescription / FrenchDescription / SpanishDescription / ItalianDescription / JapaneseDescription / PigLatinDescription |
str | Texto da dica localizado. |
Version |
int | Versão do esquema controlada pelo editor. Sempre 1 ou 2 no conteúdo comercial. |
UnitNumber |
int | ID usado só pelo editor. Ignorado durante o jogo. |
Copyright |
str | String de copyright em texto livre. Ignorada. |
TEDClass |
str | Classificação do editor TAE (KBOT, TANK, COMMANDER, …). Apenas cosmética. |
Economia e construção
| Campo | Tipo | Observações |
|---|---|---|
BuildCostMetal |
int | Metal necessário para construir esta unidade. |
BuildCostEnergy |
int | Energia necessária para construir esta unidade. |
BuildTime |
int | Poder de construção × segundos. O motor divide pelo WorkerTime do construtor para obter o tempo de construção real. |
WorkerTime |
int | Poder de construção emitido por esta unidade quando ela é construtora. |
EnergyUse |
int | Energia consumida por tick quando ativa. |
EnergyMake |
int | Energia produzida por tick quando ativa. |
MetalUse |
int | Metal consumido por tick. |
MetalMake |
int | Metal produzido por tick. |
EnergyStorage |
int | Capacidade de armazenamento. Vazio para unidades que não armazenam. |
MetalStorage |
int | Capacidade de armazenamento. Vazio para unidades que não armazenam. |
MakesMetal |
int | Metal que um conversor de metal converte por segundo enquanto está ligado e sua energia é paga; lido como número inteiro (1.9 vale 1). Separado de MetalMake, que está sempre ativo. |
ExtractsMetal |
float | Metal que um extrator rende por unidade de metal do mapa sob a área que ocupa, enquanto está ligado e alimentado. |
TidalGenerator |
bool | A produção de energia desta unidade varia com o tidalstrength do mapa. |
WindGenerator |
bool | A produção varia com a faixa de velocidade do vento do mapa. |
Builder |
bool | Pode construir outras unidades. |
Builddistance |
int | Distância máxima do nanotorno, em células de 16 px. |
CanReclamate |
bool | Pode reciclar destroços/elementos. |
CanCapture |
bool | Pode capturar unidades inimigas (só Comandantes). |
ActivateWhenBuilt |
bool | Deixa o botão "ativo" ligado por padrão quando a construção termina. |
onoffable |
bool | Tem um botão de ligar/desligar que o jogador pode acionar. |
Combate e resistência
| Campo | Tipo | Observações |
|---|---|---|
MaxDamage |
int | Pontos de vida. |
Weapon1 / Weapon2 / Weapon3 |
str | Nomes de seções de armas em weapons/*.tdf. Até 3 armas. |
wpri_badTargetCategory |
list | Categorias contra as quais a arma primária se sai mal (prioridade reduzida). |
wsec_badTargetCategory |
list | O mesmo para a arma secundária. |
BadTargetCategory |
list | Alvos que a unidade como um todo evita. |
NoChaseCategory |
list | Alvos que a unidade não persegue (só atira se estiverem ao alcance). |
canattack |
bool | Determina se a unidade pode disparar armas. |
candgun |
bool | Pode disparar a 3ª arma manualmente (a D-Gun do Comandante). |
commandfire |
bool | Obriga cada disparo a ser comandado pelo jogador. |
ExplodeAs |
str | Nome da arma para a explosão ao morrer (em weapons/*.tdf). |
SelfDestructAs |
str | Nome da arma para a explosão de autodestruição. |
Corpse |
str | Nome da seção [FEATURE] em features/**/*.tdf para os destroços deixados. |
HealTime |
int | Segundos para se recuperar totalmente numa plataforma de reparo. |
DamageModifier |
float | Multiplicador aplicado ao dano recebido. <1 = resistente. |
ImmuneToParalyzer |
bool | Ignora armas de estase. |
HideDamage |
bool | Esconde a barra de dano do inimigo. |
kamikaze |
bool | Detona ao contato em vez de disparar. |
firestandorders |
bool | Tem o botão da ordem de fogo permanente. |
StandingFireOrder |
enum | Postura de fogo padrão: 0 = cessar fogo, 1 = revidar, 2 = fogo à vontade. Sem a chave, vale 2; um valor explícito conserva os dois bits baixos, então 0 é mesmo Cessar fogo. |
mobilestandorders |
bool | Tem o botão da ordem de movimento permanente. |
StandingMoveOrder |
enum | Postura de movimento padrão: 0 = manter posição, 1 = manobrar, 2 = vagar. Sem a chave, vale 2; um valor explícito conserva os dois bits baixos (o 0 dos Comandantes é Manter posição). |
ShootMe |
bool | Dica para os oponentes de IA/computador: priorizar esta unidade como alvo. |
Commander |
bool | Marca esta unidade como Comandante (o jogo é perdido quando ela é destruída). |
Movimento
| Campo | Tipo | Observações |
|---|---|---|
MaxVelocity |
float | Velocidade máxima em unidades do mundo por tick. |
Acceleration |
float | Velocidade ganha por tick. |
BrakeRate |
float | Velocidade perdida por tick ao parar. |
TurnRate |
int | Velocidade de rotação em unidades de 2π/65536 por tick. |
MaxSlope |
int | A inclinação de terreno mais íngreme que a unidade consegue subir. Padrão 255. |
MaxWaterDepth |
int | A água mais profunda em que a unidade pode entrar. 0 = só terra; padrão 10000. |
MinWaterDepth |
int | Profundidade mínima da água (só embarcações). Padrão -10000. |
MovementClass |
str | Nome da classe em gamedata/moveinfo.tdf ([CLASS0]–[CLASS31]). Quando a classe é encontrada, a área ocupada, as profundidades da água e as inclinações da classe substituem as chaves do próprio FBI (veja Gamedata). |
SteeringMode |
enum | 0/1/2 — girar e depois andar, em arco ou instantâneo. |
Upright |
bool | Renderiza a unidade em pé (Kbots) ou rente ao chão (veículos). |
BankScale |
float | Com que intensidade a unidade se inclina lateralmente nas curvas (aeronaves). Padrão 1; um 0 explícito nunca se inclina. |
PitchScale |
float | Com que intensidade a unidade inclina o nariz ao acelerar. |
Scale |
float | Multiplicador da escala visual (1.0 = normal). |
CanFly |
bool | Flag de aeronave. |
crusisealt |
int | Altitude de cruzeiro das unidades aéreas. |
attackrunlength |
int | Distância das passagens de ataque de VTOL/bombardeiros. |
HoverAttack |
bool | A aeronave paira enquanto ataca (aeronaves de ataque). |
floater |
bool | Flutua na superfície da água. |
canmove |
bool | Determina se a unidade pode se mover. |
canpatrol |
bool | A ordem de patrulhar está habilitada. |
canstop |
bool | A ordem de parar está habilitada. |
canguard |
bool | A ordem de proteger está habilitada. |
canload |
bool | Pode carregar unidades transportadas. |
transportsize |
int | Classe de tamanho para as verificações de carga em transportes. |
transportmaxunits / TransMaxUnits |
int | Capacidade das unidades de transporte. |
manuverleashlength (também maneuverleashlength) |
int | Até que distância da posição em que está parada a unidade manobra. |
BadSlope |
int | Inclinação em que o movimento fica mais lento, mas não é bloqueado. |
BuildAngle |
int | Inclinação máxima sobre a qual esta unidade pode ser construída. |
Sentidos
| Campo | Tipo | Observações |
|---|---|---|
SightDistance |
int | Raio da linha de visão em células de 16 px. |
RadarDistance |
int | Raio de cobertura do radar. 0 = sem radar. |
SonarDistance |
int | Raio de cobertura do sonar. |
RadarDistanceJam |
int | Raio em que a unidade bloqueia o radar inimigo. |
Stealth |
bool | A unidade não aparece no radar inimigo. |
CloakCost |
int | Energia por tick para continuar camuflada enquanto parada. |
CloakCostMoving |
int | Energia por tick para continuar camuflada enquanto se move. |
mincloakdistance |
int | A camuflagem falha quando há um inimigo a menos desse número de células. |
Menu de construção e área ocupada
| Campo | Tipo | Observações |
|---|---|---|
Bmcode |
int | Código do menu de construção. Deixe em 1 para unidades construíveis; 0 para construções que não aparecem. |
FootprintX / FootprintZ |
int | Área ocupada em células de 16 px. Precisa coincidir com a área ocupada da MovementClass. |
YardMap |
str | Grade ASCII de várias linhas (o=livre, c=fechada, w=água, g=geotérmica) que define as restrições por célula. |
ThreeD |
bool | Renderiza como modelo 3D. Sempre 1 nas unidades comerciais. |
ZBuffer |
bool | Usa Z-buffer. Sempre 1. |
NoShadow |
bool | Não renderiza a sombra. |
NoAutoFire |
bool | Desativa o disparo automático. |
norestrict |
bool | Ignora a aplicação das zonas restritas. |
IsAirBase |
bool | Aeronaves podem pousar/ser reparadas aqui. |
IsFeature |
bool | Trata como um elemento estático, não como unidade. |
Category |
list | Crucial. Lista de tags separadas por espaços em branco, usada pela mira das armas, pelos pesos da IA e pelos menus de construção. Tokens padrão: MOBILE, WEAPON, SURFACE, UNDERWATER, VTOL, KBOT, TANK, SHIP, LEVEL1/LEVEL2/LEVEL3, NOTSUB, NOTAIR, COMMANDER, nomes dos lados. |
WaterLine |
int | Profundidade em que uma unidade flutuante se acomoda. |
altfromsealevel |
int | A altitude da aeronave é medida a partir do nível do mar, não do terreno. |
Áudio
| Campo | Tipo | Observações |
|---|---|---|
SoundCategory |
str | Nome de uma seção em gamedata/sound.tdf que fornece as amostras de voz da unidade. |
[SOUNDS] (seção aninhada) |
subseção | Substituições locais para eventos específicos (canselect=…, select1=… etc.). |
Diversos / pouco compreendidos
| Campo | Tipo | Observações |
|---|---|---|
DefaultMissionType |
str | Estado inicial da missão (Standby, Move etc.). |
sortbias |
int | Peso de ordenação no menu de construção. |
teleporter |
bool | Marca como plataforma de teletransporte (Portal Galáctico). |
IsAirBase |
bool | Veja "Menu de construção e área ocupada" — repetido para ficar completo. |
Ovradjust |
bool | Aciona uma substituição não documentada do motor; só o Comandante usa. |
ShowPlayerName |
bool | Mostra o nome do jogador sobre a unidade (só o Comandante). |
MoveRate1 / MoveRate2 |
int | Rascunho do editor. Não é usado durante o jogo. |
antiweapons |
bool | Usado pelas plataformas antiarmas (Fortitude, defesa antimísseis). |
Exemplos reais no catálogo de referência
O uso dos campos se aprende melhor com FBIs reais. Os repositórios de referência catalogam todas as unidades que vêm com os jogos:
- TA — todos os FBI:
bons exemplos "ricos" são
ARMCOM(Comandante comCommander=1,CloakCost,MaxDamage=3000),ARMSAM(torre comWeapon1/2/3preenchidos),ARMBRAWL(aeronave comCanFly,crusisealt,BankScale) eARMMEX(extrator de metal comExtractsMetal). - TA — todos os TDF de armas:
[FLAMETHROWER]paraburst/burstrate/firestarter,[NUCLEAR_MISSILE]para mísseis guiados em duas fases,[LIGHTNING]para uma arma de feixe. - TA — árvore de construção de elementos e armas
— todos os registros
[MENUENTRY]da instalação. - Unidades do TA: Kingdoms
— o conjunto diferente de campos (
buildcost=com um só recurso,damagecategory=,[WEAPONn]embutido).ARAKING(o monarca Elsin, de Aramon) eARAARCH(Archer) são bons pontos de partida.
Veja também
- TNT — referencia nomes de elementos que apontam para seções
[FEATURE]de TDF. - 3DO, COB — referenciados pelo
Objectnamedo FBI. - GAF — referenciado pelo
seqnamedos elementos e peloexplosiongafdas armas. - TDFs do gamedata —
moveinfo.tdf,sound.tdf,sidedata.tdf, referenciados por campos do FBI. - Som — como
SoundCategoryaponta para arquivos WAV. - Glossário — lado, área ocupada, yardmap, esquema.