Todas as páginas de formatos ↓
Unidades, scripts e configurações

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, unitname e UNITNAME se 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, e 56.8 como 56 quando o jogo espera um número inteiro (campos como killmul e tidalstrength sã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
    }
}

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 Type e pelo número de posições iniciais, não pela posição no arquivo. Só se qualificam os esquemas Network 1 a Network 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-8 e Any carregam todos).
  • As posições iniciais são as entradas de [specials] cujo specialwhat começa com StartPos (sem diferenciar maiúsculas). StartPosN é o lugar de jogador N-1, StartPos0 também é o lugar 0, e uma entrada sem número depois de StartPos recebe o próximo número de uma contagem própria (o primeiro é 1). XPos e ZPos são pixels do mapa, limitados a 16 bits.
  • Chaves ausentes têm valores padrão, não zeros: sem missiondescription, aparece "No description available"; sem maxunits (só nas campanhas), vale 200; e um elemento pré-posicionado ([features]) sem XPos ou ZPos é ignorado, então um elemento na coluna ou na linha 0 precisa de um 0 explí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=arm funciona com a lógica de classificação de unidades do ARM, mas mods que trocam de lado em tempo real com if (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 analisa numplayers: 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ão true/false. O motor só aceita 1/0.
  • Os arquivos .ota costumam 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 com Commander=1, CloakCost, MaxDamage=3000), ARMSAM (torre com Weapon1/2/3 preenchidos), ARMBRAWL (aeronave com CanFly, crusisealt, BankScale) e ARMMEX (extrator de metal com ExtractsMetal).
  • TA — todos os TDF de armas: [FLAMETHROWER] para burst/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) e ARAARCH (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 Objectname do FBI.
  • GAF — referenciado pelo seqname dos elementos e pelo explosiongaf das armas.
  • TDFs do gamedata — moveinfo.tdf, sound.tdf, sidedata.tdf, referenciados por campos do FBI.
  • Som — como SoundCategory aponta para arquivos WAV.
  • Glossário — lado, área ocupada, yardmap, esquema.