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,unitnameeUNITNAMEreferem-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 e56.8como 56 quando o jogo quer 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é 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
}
}
[MENUENTRY] — extensão do menu de construção
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
Typee pelo número de posições iniciais, não pela ordem. Só contam os esquemasNetwork 1aNetwork 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-8eAnycarregam todos). - As posições iniciais são as entradas de
[specials]cujospecialwhatcomeça porStartPos(sem distinguir maiúsculas de minúsculas).StartPosNé o lugar de jogador N-1,StartPos0também é o lugar 0, e uma entrada sem número depois deStartPosrecebe o número seguinte de uma contagem própria (o primeiro é 1).XPoseZPossão píxeis do mapa, limitados a 16 bits. - As chaves em falta têm valores predefinidos, não zeros: um
missiondescriptionem falta mostra "No description available", ummaxunitsem falta (só nas campanhas) significa 200, e um elemento pré-colocado ([features]) semXPosouZPosé ignorado, por isso um que esteja 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
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=armcorresponde à lógica de classificação de unidades do ARM, mas os mods que trocam de lado em tempo real comif (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 analisanumplayers: 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ãotrue/false. O motor só aceita1/0. - Os ficheiros
.otatê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 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 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) eARAARCH(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
Objectnamedo FBI. - GAF — referido pelo
seqnamedos elementos e peloexplosiongafdas armas. - TDFs do gamedata —
moveinfo.tdf,sound.tdf,sidedata.tdf, referidos por campos do FBI. - Som — como o
SoundCategoryse resolve em ficheiros WAV. - Glossário — side, footprint, yardmap, schema.