Todas as páginas de formatos ↓
Unidades, scripts e ficheiros de configuração

TDF / FBI / OTA — ficheiros de configuração em texto

Fonte: coreprime/kbot @ 0ab97bf · Editar no GitHub

Os ficheiros TDF ("Text Data File"), FBI ("Feature/Building/Item") e OTA ("Online Total Annihilation") partilham todos o mesmo formato de texto ao estilo INI. São a forma canónica como a Cavedog declarava tudo o que não era binário: atributos das unidades, parâmetros das armas, definições de elementos do mapa, metadados das missões, categorias de som, indicações para a IA.

Extensão Onde o encontra 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, indicações para a IA

Estes ficheiros são ASCII simples: pode abri-los em qualquer editor de texto.

Tip

Experimente por si.

# The web UI renders FBI/TDF/OTA as collapsible section trees
kbot mount ~/games/totala --server
# → browse to units/ARMCOM.FBI

Para usar o navegador no terminal e as opções para extrair tudo para uma pasta, veja a referência de kbot mount da linha de comandos.

A partir de 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 ficheiro TDF é uma árvore de secções. Cada secção tem um nome entre parênteses retos, seguido de um corpo { ... } com pares chave=valor e/ou secçõ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 das secções ficam entre parênteses retos; tudo o que vem a seguir, até à } correspondente, pertence a essa secção. Uma secção pode ocupar uma só linha ([special0] { specialwhat=StartPos1; XPos=464; ZPos=216; }).
  • Um valor vai do = até ao ; seguinte, mesmo atravessando quebras de linha: nada mais o termina, por isso chavetas, parênteses retos e = dentro de um valor são texto simples, e um valor nunca pode conter um ;. Os espaços, as tabulações e as quebras de linha nas extremidades 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 distinguem maiúsculas de minúsculas. UnitName, unitname e UNITNAME referem-se todas ao mesmo campo, e as ferramentas costumam normalizá-las para minúsculas na leitura. Os nomes das secções também são comparados sem distinguir maiúsculas de minúsculas.
  • Os valores são cadeias de caracteres por omissã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 quer 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é ao fim da linha, e blocos /* ... */, que podem ocupar várias linhas. Assim, missiondescription=See http://tauniverse.com; perde tudo a partir de //, incluindo o seu ;, e o valor continua pela linha seguinte. O kbot recusa-se a escrever um valor que contenha ;, // ou /*.
  • Os espaços em branco e as linhas vazias são ignorados.

As secções aninhadas (como [SOUNDS] dentro de [UNITINFO], acima) são comuns nos FBI e OTA. A especificação do TDF não fixa uma profundidade máxima; na prática, não verá mais de 3 níveis.


FBI — definições de unidades

Um FBI é a visão completa que o motor tem de uma unidade. Junta num só sítio o modelo 3D da unidade, o script, a lista de armas, o banco de sons, os custos de construção e o comportamento em combate. Um exemplo abreviado 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 uma centena de campos. A maioria explica-se por si; os menos óbvios costumam ser estes:

Campo O que controla realmente
Bmcode Código da página do menu de construção: deixe-o em 1 para unidades normais.
Category Lista de etiquetas separadas por espaços, usada pelo BadTargetCategory das armas, pelo NoChaseCategory, pela IA e pelos menus de construção.
MovementClass Refere uma classe de gamedata/movinfo.tdf que define os declives de terreno aceitáveis, a profundidade da água, etc.
YardMap Desenho ASCII (por exemplo, oooo\noooo\n) que declara a área ocupada pela unidade e as restrições de água/terra de cada célula.
Corpse Nome de um [FEATURE] (ver abaixo) usado como os destroços que a unidade deixa.
SoundCategory Escolhe o banco de áudio em gamedata/sound.tdf.
TEDClass Indicação para o editor da Cavedog; ignorado durante o jogo.

Important

O UnitName é a chave de consulta em todo o lado: o OTA refere-o, a IA refere-o, o menu de construção refere-o. Se mudar o nome de um FBI, tem de procurar (com grep) as referências em todo o mod.


TDF — definições de elementos, armas e sons

Os ficheiros features/**/*.tdf contêm secções [FEATURE], uma por cada objeto estático do mapa. O formato TNT (TNT) refere-as pelo nome da secçã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 secções [WEAPON_NAME]. O campo Weapon1=COMMANDER_WEAPON do FBI resolve-se na secção [COMMANDER_WEAPON] de um dos TDF de weapons/, através da tabela de armas do jogo, indexada por ID: cada secção precisa de um ID= em 0–255, uma secção posterior com o mesmo ID substitui a anterior, e um nome resolve-se na posição mais baixa que o contenha (veja Gamedata: a tabela de armas). O guia de armas da comunidade documenta cerca de 60 campos distintos; os que mais pesam são ballistic/lineofsight/dropped (o arquétipo da arma), weapontimer, weaponvelocity, areaofeffect, edgeeffectiveness, burst/burstrate e a subsecçã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 ficheiros download/*.tdf registam uma unidade nos menus de construção de um ou mais construtores sem alterar o sidedata.tdf. É o mecanismo que a expansão Core Contingency da Cavedog usa para acrescentar as suas unidades, e a convenção que todos os complementos .ufo de uma só unidade seguem.

[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 a cujo menu estamos a acrescentar.
MENU int Número da página do menu de construção. As páginas 1–2 estã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 grelha de 2 colunas × 3 linhas: 0=em cima à esquerda, 1=em cima à direita, 2=ao meio à esquerda, 3=ao meio à direita, 4=em baixo à esquerda, 5=em baixo à direita).
UNITNAME str A unidade a acrescentar: tem de coincidir com o UnitName= do FBI da sua unidade.

Convenção para o nome do ficheiro. Por convenção, o ficheiro chama-se download/<UNITNAME>.tdf (igual ao UNITNAME= da primeira entrada), mas o motor lê todos os *.tdf de download/, por isso o nome do ficheiro é apenas uma indicação para o modder. O normal é haver uma unidade por ficheiro.

Várias entradas. Um só ficheiro 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 primeiras cinco secções de cada ficheiro, sejam quais forem os seus nomes ([MENUENTRY1] é a convenção, mas [ENTRY0] também funciona); uma sexta secção nunca é lida. Uma entrada cujo UNITMENU não nomeie nenhuma unidade, ou nenhuma unidade com Builder=1, é ignorada, tal como uma cujo UNITNAME não nomeie nenhuma unidade. MENU e BUTTON ficam limitados a 8 bits, e o menu de um construtor (a sua lista [CANBUILD] mais o que download/ acrescenta) tem no máximo 31 unidades.

Important

O download/*.tdf acrescenta ao menu de construção; não substitui nada. Se a posição que escolher colidir com uma entrada existente, o comportamento do motor é imprevisível: normalmente ganha a entrada carregada por último, mas a ordem de carregamento dos .ufo não é garantida entre plataformas. Escolha uma página MENU alta (4 ou 5) para mods que devam coexistir.

É este o ponto de extensão aditivo que permite distribuir um único .ufo sem criar uma cópia divergente do sidedata.tdf de 50 KB. Veja o tutorial de modding para um exemplo de uso do princípio ao fim.


OTA — metadados do mapa

O .ota acompanha cada .tnt e contém tudo aquilo de que o motor precisa para jogar o mapa (por oposição a renderizar o 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; }
            ...
        }
    }
}

O 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 vistas do kbot — o editor de mapas do studio, a sandbox, o explorador de recursos, o kbot tnt preview, o kbot tnt lint e o Quality Checker — leem-nos da mesma maneira, através da vista de jogo OTA do kbot-io):

  • Os esquemas são encontrados pelo nome, Schema 0, Schema 1, … até ao primeiro número em falta. Os nomes são comparados sem distinguir maiúsculas de minúsculas ([schema 1] conta), mas o número tem de estar escrito de forma simples: [Schema0] ou [Schema 01] nunca são encontrados, 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 ordem. Só contam os esquemas Network 1 a Network 4 (comparados sem distinguir maiúsculas de minúsculas) com pelo menos uma posição inicial. Para N jogadores, o jogo prefere o último desses esquemas com exatamente N posições iniciais e, se não houver, o que tiver mais. Uma missão da campanha escolhe pela dificuldade (Easy, Medium, Hard). numplayers é só 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 por StartPos (sem distinguir maiúsculas de minú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 número seguinte de uma contagem própria (o primeiro é 1). XPos e ZPos são píxeis do mapa, limitados a 16 bits.
  • As chaves em falta têm valores predefinidos, não zeros: um missiondescription em falta mostra "No description available", um maxunits em falta (só nas campanhas) significa 200, e um elemento pré-colocado ([features]) sem XPos ou ZPos é ignorado, por isso um que esteja 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 ficheiro. Ao guardar, só mudam os valores que editou (e são acrescentados ou removidos os esquemas e as posições iniciais que acrescentou ou removeu); tudo o resto — chaves de vitória e de acionadores, useonlyunits, [units], [features], outros [specials], frações como killmul=0.5, comentários — é escrito tal como estava. Remover um esquema ou uma posição inicial reescreve o ficheiro na disposição do kbot-io (o 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 consiga ler é mostrado com o respetivo erro e fica inalterado ao guardar, e o texto de diálogo que contenha ;, // ou /* é recusado. O mesmo acontece a uma gravação que levasse o jogo a ler um esquema que hoje ignora: acrescentar um esquema usa o número livre mais baixo, por isso, num ficheiro com [Schema 0] e [Schema 2], o novo [Schema 1] poria o [Schema 2] em jogo; o erro indica a secção a que deve mudar o nome ou que deve remover. Uma fração demasiado grande para ser guardada (killmul=1e999, que o jogo lê como infinito) aparece como o maior número possível e é mantida tal como está escrita, a não ser que a altere. O jogo tira o nível do mar do cabeçalho do .tnt; o editor mantém em sintonia uma chave sealevel= que já exista, mas nunca acrescenta uma.


Exemplo comentado — unidade mínima

Um FBI "falso", 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 fazer disto um complemento de unidade completo, 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

Todos os valores têm de terminar em ;. A falta de um ponto e vírgula não dá erro: o analisador junta silenciosamente o valor à linha seguinte, o que produz 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 distinguem maiúsculas de minúsculas, os valores sim. Side=arm corresponde à lógica de classificação de unidades do ARM, mas os mods que trocam de lado em tempo real com if (Side == "ARM"), por comparação exata de cadeias, vão falhar.
  • Os valores de lista são separados por espaços (Category=COMMANDER MOBILE WEAPON), e não por vírgulas. O motor divide-os em qualquer espaço em branco.
  • Alguns campos do OTA usam vírgulas, no entanto: numplayers=2,4,6,8,10. Não há uma convenção única para o delimitador das listas, e o jogo nem sequer analisa numplayers: limita-se a mostrar o texto.
  • As secções aninhadas não têm um limite formal de profundidade, mas a Cavedog nunca distribuiu nada com mais de 3 níveis. Os editores que contam com 2 níveis vão falhar em alguns TDF de armas com aninhamentos do tipo [WEAPON][DAMAGE][category].
  • Os campos booleanos são inteiros (canmove=1, canstop=0), e não true/false. O motor só aceita 1/0.
  • Os ficheiros .ota têm muitas vezes mojibake de UTF-8 nas descrições das missões (aspas curvas do Word, etc.). O motor apresenta-os com a página de código Windows-1252 e mostra como quadrados vazios (tofu) tudo o que estiver fora dela.

Tamanhos típicos

Recurso Intervalo observado no conteúdo da Cavedog
FBI de unidade 1–4 KB (Comandante: ~3 KB; tanque ligeiro: ~1.5 KB)
TDF de um só elemento 200 B – 1 KB
TDF de arma 0.5–3 KB por secção [WEAPON]
Ficheiro OTA 1–8 KB
gamedata/sidedata.tdf ~50 KB (sobretudo a disposição do HUD)
gamedata/sound.tdf ~20 KB
Total de FBI no TA + CC ~250 ficheiros

Apêndice A — dicionário de campos FBI

Todos os campos que aparecem habitualmente em units/*.fbi, agrupados por finalidade. Legenda da coluna Tipo: str = identificador/cadeia de caracteres; int = inteiro; float = vírgula flutuante; bool = 0/1; list = tokens separados por espaços em branco; enum = inteiro pequeno com significados documentados.

Os campos que não estão aqui ou são rascunho do editor (UnitNumber, Copyright) ou não estão documentados. O motor ignora silenciosamente as chaves desconhecidas.

Identidade e apresentação

Campo Tipo Notas
UnitName str Chave de consulta principal. Referida por outros ficheiros de configuração, 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" mostrado no painel de informação da unidade (por exemplo, ARM-WM para o Comandante ARM).
Name str Nome curto mostrado por cima da unidade.
Description str Texto da dica mostrado no botão de construção e no painel de informação 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 registada pelo editor. Sempre 1 ou 2 no conteúdo comercial.
UnitNumber int ID que só o editor usa. Ignorado durante o jogo.
Copyright str Texto livre de direitos de autor. Ignorado.
TEDClass str Classificação do editor TAE (KBOT, TANK, COMMANDER, …). Apenas cosmético.

Economia e construção

Campo Tipo Notas
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-o pelo WorkerTime do construtor para obter o tempo real de construção.
WorkerTime int Poder de construção emitido por esta unidade quando é um construtor.
EnergyUse int Energia gasta por tick quando está ativa.
EnergyMake int Energia produzida por tick quando está ativa.
MetalUse int Metal gasto por tick.
MetalMake int Metal produzido por tick.
EnergyStorage int Capacidade de armazenamento. Em branco nas unidades que não armazenam.
MetalStorage int Capacidade de armazenamento. Em branco nas unidades que não armazenam.
MakesMetal int Metal que um conversor de metal converte por segundo enquanto está ligado e a sua energia está paga; lido como número inteiro (1.9 é 1). Separado de MetalMake, que está sempre ativo.
ExtractsMetal float Metal que um extrator rende por unidade de metal do mapa sob a sua área ocupada, 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 o intervalo de velocidades 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ó os comandantes).
ActivateWhenBuilt bool Põe o interruptor "ativo" ligado por omissão quando a construção termina.
onoffable bool Tem um interruptor ligar/desligar que o jogador pode acionar.

Combate e sobrevivência

Campo Tipo Notas
MaxDamage int Pontos de vida.
Weapon1 / Weapon2 / Weapon3 str Nomes das secções de armas em weapons/*.tdf. Até 3 armas.
wpri_badTargetCategory list Categorias contra as quais a arma principal é pouco eficaz (perdem prioridade).
wsec_badTargetCategory list O mesmo para a arma secundária.
BadTargetCategory list Alvos que a unidade no seu todo evita.
NoChaseCategory list Alvos que a unidade não persegue (só dispara se estiverem ao alcance).
canattack bool Se pode, de todo, disparar armas.
candgun bool Pode disparar manualmente a sua terceira arma (o D-gun do Comandante).
commandfire bool Obriga a que todos os disparos sejam ordenados pelo jogador.
ExplodeAs str Nome da arma usada na explosão ao morrer (em weapons/*.tdf).
SelfDestructAs str Nome da arma usada na explosão de autodestruição.
Corpse str Nome da secção [FEATURE] em features/**/*.tdf usada para os destroços.
HealTime int Segundos para ficar totalmente reparada numa plataforma de reparação.
DamageModifier float Multiplicador aplicado ao dano recebido. <1 = resistente.
ImmuneToParalyzer bool Ignora as armas de estase.
HideDamage bool Esconde a barra de dano ao inimigo.
kamikaze bool Detona ao contacto em vez de disparar.
firestandorders bool Tem o interruptor da ordem de fogo permanente.
StandingFireOrder enum Postura de fogo predefinida: 0 = cessar fogo, 1 = ripostar, 2 = fogo à vontade. Uma chave em falta vale 2; um valor explícito mantém os seus dois bits mais baixos, por isso 0 é mesmo Cessar fogo.
mobilestandorders bool Tem o interruptor da ordem de movimento permanente.
StandingMoveOrder enum Postura de movimento predefinida: 0 = manter posição, 1 = manobrar, 2 = vaguear. Uma chave em falta vale 2; um valor explícito mantém os seus dois bits mais baixos (o 0 dos comandantes é Manter posição).
ShootMe bool Indicação para os adversários da IA/computador: dar prioridade a esta unidade como alvo.
Commander bool Marca a unidade como comandante (perde-se o jogo quando é destruída).

Movimento

Campo Tipo Notas
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 Declive de terreno mais acentuado que a unidade consegue subir. Predefinição 255.
MaxWaterDepth int Profundidade de água máxima em que a unidade pode entrar. 0 = só terra; predefinição 10000.
MinWaterDepth int Profundidade de água mínima (só barcos). Predefinição -10000.
MovementClass str Nome de classe em gamedata/moveinfo.tdf ([CLASS0]–[CLASS31]). Quando se resolve, a área ocupada, as profundidades de água e os declives da classe substituem as chaves do próprio FBI (veja Gamedata).
SteeringMode enum 0/1/2 — rodar e depois avançar vs. em arco vs. instantâneo.
Upright bool Desenha a unidade de pé (Kbots) ou assente no chão (veículos).
BankScale float Com que intensidade a unidade se inclina para o lado ao virar (aeronaves). Predefinição 1; um 0 explícito nunca se inclina.
PitchScale float Com que intensidade a unidade inclina a frente para cima ou para baixo ao acelerar.
Scale float Multiplicador da escala visual (1.0 = normal).
CanFly bool Flag de aeronave.
crusisealt int Altitude de cruzeiro das unidades voadoras.
attackrunlength int Distância das passagens de ataque dos VTOL/bombardeiros.
HoverAttack bool A aeronave fica a pairar enquanto ataca (aeronaves de ataque).
floater bool Flutua à superfície da água.
canmove bool Se a unidade se pode, de todo, mover.
canpatrol bool A ordem de patrulha está disponível.
canstop bool A ordem de parar está disponível.
canguard bool A ordem de proteger está disponível.
canload bool Pode carregar unidades para as transportar.
transportsize int Classe de tamanho para as verificações de carga dos transportes.
transportmaxunits / TransMaxUnits int Capacidade das unidades de transporte.
manuverleashlength (também maneuverleashlength) int Até que distância da sua posição a unidade manobra.
BadSlope int Declive a partir do qual o movimento abranda, sem ficar bloqueado.
BuildAngle int Declive máximo em que esta unidade pode ser construída.

Sentidos

Campo Tipo Notas
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 se manter camuflada enquanto está parada.
CloakCostMoving int Energia por tick para se manter camuflada enquanto se move.
mincloakdistance int A camuflagem falha quando um inimigo está a este número de células ou menos.

Menu de construção e área ocupada

Campo Tipo Notas
Bmcode int Código do menu de construção. Deixe-o em 1 para o que as unidades podem construir e em 0 para as construções que não aparecem.
FootprintX / FootprintZ int Área ocupada em células de 16 px. Tem de coincidir com a área ocupada da MovementClass.
YardMap str Grelha ASCII de várias linhas (o=livre, c=fechada, w=água, g=geotérmica) que define as restrições de cada célula.
ThreeD bool Desenhada como modelo 3D. Sempre 1 nas unidades comerciais.
ZBuffer bool Usar Z-buffering. Sempre 1.
NoShadow bool Não desenhar a sombra.
NoAutoFire bool Desativar o disparo automático.
norestrict bool Ignorar a aplicação das zonas restritas.
IsAirBase bool As aeronaves podem aterrar/ser reparadas aqui.
IsFeature bool Tratar como elemento estático, e não como unidade.
Category list Crítico. Lista de etiquetas separadas por espaços em branco, usada na escolha de alvos das armas, nos pesos da IA e nos menus de construção. Tokens habituais: MOBILE, WEAPON, SURFACE, UNDERWATER, VTOL, KBOT, TANK, SHIP, LEVEL1/LEVEL2/LEVEL3, NOTSUB, NOTAIR, COMMANDER, nomes dos lados.
WaterLine int Profundidade a que uma unidade flutuante assenta.
altfromsealevel int A altitude da aeronave é medida a partir do nível do mar, e não do terreno.

Áudio

Campo Tipo Notas
SoundCategory str Nome de uma secção de gamedata/sound.tdf que fornece as amostras de voz da unidade.
[SOUNDS] (secção aninhada) subsecção Substituições locais para eventos específicos (canselect=…, select1=…, etc.).

Diversos / mal compreendidos

Campo Tipo Notas
DefaultMissionType str Estado inicial da missão (Standby, Move, etc.).
sortbias int Peso de ordenação no menu de construção.
teleporter bool Marca a unidade como plataforma de teletransporte (Portal Galáctico).
IsAirBase bool Veja "Menu de construção e área ocupada": repetido aqui para ficar completo.
Ovradjust bool Ativa uma substituição não documentada do motor; só o comandante a usa.
ShowPlayerName bool Mostra o nome do jogador por cima da unidade (só no 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

A melhor forma de aprender a usar os campos é com FBI reais. Os repositórios de referência catalogam todas as unidades distribuídas:

  • 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 registos [MENUENTRY] da instalação.
  • Unidades do TA: Kingdoms — o conjunto de campos diferente (buildcost= com um só recurso, damagecategory=, [WEAPONn] em linha). ARAKING (Elsin, o monarca de Aramon) e ARAARCH (Archer) são bons pontos de partida.

Ver também

  • TNT — refere nomes de elementos que se resolvem em secções TDF [FEATURE].
  • 3DO, COB — referidos pelo Objectname do FBI.
  • GAF — referido pelo seqname dos elementos e pelo explosiongaf das armas.
  • TDFs do gamedata — moveinfo.tdf, sound.tdf, sidedata.tdf, referidos por campos do FBI.
  • Som — como o SoundCategory se resolve em ficheiros WAV.
  • Glossário — side, footprint, yardmap, schema.