Tutte le pagine dei formati ↓
Unità, script, configurazioni

TDF / FBI / OTA — File di configurazione testuali

Fonte: coreprime/kbot @ 0ab97bf · Modifica su GitHub

I file TDF ("Text Data File"), FBI ("Feature/Building/Item") e OTA ("Online Total Annihilation") condividono tutti lo stesso formato testuale in stile INI. Sono il modo canonico con cui Cavedog dichiarava tutto ciò che non era binario: statistiche delle unità, parametri delle armi, definizioni degli elementi, metadati delle missioni, categorie dei suoni, suggerimenti per l'IA.

Estensione Dove lo trovi Esempi
.fbi units/ ARMCOM.FBI, CORRAID.FBI: definizioni delle unità
.tdf features/, weapons/, sounds/, gamedata/, ecc. armflak_weapon.tdf, treeb.tdf
.ota maps/ metal heck.ota: metadati della mappa, posizioni di partenza, istruzioni per l'IA

Sono semplici file di testo ASCII: puoi aprirli con qualsiasi editor di testo.

Tip

Provalo tu stesso.

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

Consulta il riferimento CLI di kbot mount per l'uso del browser da terminale e le opzioni di appiattimento.

Da Go. Usa 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"))

Sintassi

Un file TDF è un albero di sezioni. Ogni sezione ha un nome tra parentesi quadre, seguito da un corpo { ... } che contiene coppie chiave=valore e/o sezioni annidate.

[UNITINFO]
{
    UnitName=ARMCOM;
    Designation=Commander;
    Description=Commander, Arm;
    Side=ARM;
    Objectname=armcom;

    BuildCostEnergy=2500;
    BuildCostMetal=2500;
    MaxDamage=3000;

    [SOUNDS]
    {
        canselect=cmdsel1;
        select1=cmdok1;
    }
}

Regole:

  • I nomi delle sezioni stanno tra parentesi quadre; tutto ciò che segue fino alla } corrispondente appartiene a quella sezione. Una sezione può stare su una sola riga ([special0] { specialwhat=StartPos1; XPos=464; ZPos=216; }).
  • Un valore va dal = fino al ; successivo, anche su più righe: nient'altro lo chiude, quindi graffe, parentesi quadre e = dentro un valore sono testo normale, e un valore non può mai contenere un ;. Spazi, tabulazioni e a capo alle estremità di una chiave o di un valore vengono rimossi. Una chiave assegnata due volte mantiene l'ultimo valore.
  • Le chiavi non distinguono tra maiuscole e minuscole. UnitName, unitname e UNITNAME indicano tutte lo stesso campo; gli strumenti di solito le normalizzano in minuscolo durante la lettura. Anche i nomi delle sezioni vengono confrontati ignorando maiuscole e minuscole.
  • I valori sono stringhe per impostazione predefinita. I numeri vengono letti alla maniera del C, dalle cifre iniziali: 12abc vale 12 e 56.8 vale 56 dove il gioco si aspetta un numero intero (campi come killmul e tidalstrength vengono letti come frazioni). Le liste sono separate da spazi (ad es. Category=NOTSUB COMMANDER NOTAIR ...).
  • I commenti vengono cancellati prima di leggere qualsiasi altra cosa: // fino alla fine della riga, e i blocchi /* ... */, che possono estendersi su più righe. Perciò missiondescription=See http://tauniverse.com; perde tutto da // in poi, compreso il suo ;, e il valore prosegue nella riga successiva. kbot si rifiuta di scrivere un valore che contenga ;, // o /*.
  • Spazi bianchi e righe vuote vengono ignorati.

Le sezioni annidate (come [SOUNDS] dentro [UNITINFO] qui sopra) sono comuni negli FBI e negli OTA. La specifica TDF non fissa una profondità massima; in pratica non ne vedrai più di 3.


FBI — definizioni delle unità

Un FBI è la visione completa che il motore ha di un'unità. Riunisce in un unico posto il modello 3D dell'unità, lo script, l'elenco delle armi, il banco sonoro, i costi di costruzione e il comportamento in combattimento. Un esempio ridotto dell'Arm Commander:

[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;
        ...
    }
}

La guida agli FBI scritta dalla comunità nel 1998 (conservata tra le fonti di questo repository) documenta più di cento campi. La maggior parte si spiega da sé; quelli meno ovvi sono di solito:

Campo Che cosa controlla davvero
Bmcode Codice della pagina del menu di costruzione: lascialo a 1 per le unità normali.
Category Lista di tag separati da spazi usata da BadTargetCategory delle armi, da NoChaseCategory, dall'IA e dai menu di costruzione.
MovementClass Rimanda a una classe in gamedata/movinfo.tdf che definisce le pendenze del terreno accettabili, la profondità dell'acqua, ecc.
YardMap Disegno ASCII (ad es. oooo\noooo\n) che dichiara l'ingombro dell'unità e le restrizioni acqua/terra per ogni cella.
Corpse Nome di una [FEATURE] (vedi sotto) usata come relitto lasciato a terra.
SoundCategory Sceglie il banco audio in gamedata/sound.tdf.
TEDClass Suggerimento per l'editor di Cavedog; ignorato durante il gioco.

Important

UnitName è la chiave di ricerca usata ovunque: la usano l'OTA, l'IA e il menu di costruzione. Se rinomini un FBI devi cercare con grep i riferimenti in tutta la mod.


TDF — definizioni di elementi, armi e suoni

I file features/**/*.tdf contengono sezioni [FEATURE], una per ogni oggetto statico della mappa. Il formato TNT (TNT) vi fa riferimento tramite il nome della sezione:

[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)
}

I file weapons/*.tdf seguono lo stesso schema, con sezioni [WEAPON_NAME]. Il campo Weapon1=COMMANDER_WEAPON dell'FBI si risolve nella sezione [COMMANDER_WEAPON] di uno dei TDF in weapons/, tramite la tabella delle armi del gioco, indicizzata per ID: ogni sezione ha bisogno di un ID= compreso tra 0 e 255, una sezione successiva con lo stesso ID sostituisce la precedente, e un nome si risolve nello slot più basso che lo contiene (vedi Gamedata: la tabella delle armi). La guida alle armi della comunità documenta circa 60 campi distinti; i più importanti sono ballistic/lineofsight/dropped (l'archetipo dell'arma), weapontimer, weaponvelocity, areaofeffect, edgeeffectiveness, burst/burstrate e la sottosezione [DAMAGE] (modificatori del danno per 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
    }
}

I file in download/*.tdf registrano un'unità nei menu di costruzione di uno o più costruttori senza modificare sidedata.tdf. È il meccanismo che l'espansione Core Contingency di Cavedog usa per aggiungere le sue unità, e la convenzione seguita da ogni componente aggiuntivo .ufo per una singola unità.

[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 Significato
UNITMENU str UnitName del costruttore al cui menu si aggiunge l'unità.
MENU int Numero di pagina del menu di costruzione. Le pagine 1–2 sono riservate da Cavedog alle unità originali; per convenzione la comunità parte da 3.
BUTTON int Slot all'interno della pagina (0–5, disposti in una griglia di 2 colonne × 3 righe: 0=in alto a sinistra, 1=in alto a destra, 2=al centro a sinistra, 3=al centro a destra, 4=in basso a sinistra, 5=in basso a destra).
UNITNAME str L'unità che viene aggiunta: deve corrispondere allo UnitName= nell'FBI della tua unità.

Convenzione per i nomi dei file. Per convenzione il file si chiama download/<UNITNAME>.tdf (come lo UNITNAME= della prima voce), ma il motore legge ogni *.tdf in download/, quindi il nome del file è solo un'indicazione per il modder. La norma è un'unità per file.

Più voci. Un singolo file può contenere più voci: il download/Armfort.tdf di Cavedog ne usa tre per rendere l'Arm Fortification Wall costruibile da ACK, ACV e ACA. TA 3.1c legge le prime cinque sezioni di ogni file, qualunque sia il loro nome ([MENUENTRY1] è la convenzione, ma anche [ENTRY0] funziona); una sesta sezione non viene mai letta. Una voce il cui UNITMENU non nomina alcuna unità, o nessuna unità con Builder=1, viene ignorata, così come una il cui UNITNAME non nomina alcuna unità. MENU e BUTTON sono limitati a 8 bit, e il menu di un costruttore (la sua lista [CANBUILD] più le aggiunte da download/) contiene al massimo 31 unità.

Important

download/*.tdf aggiunge voci al menu di costruzione, non sostituisce nulla. Se lo slot che scegli entra in conflitto con una voce esistente, il comportamento del motore è imprevedibile: di solito vince la voce caricata per ultima, ma l'ordine di caricamento dei .ufo non è garantito su tutte le piattaforme. Per le mod pensate per convivere, scegli una pagina MENU alta (4 o 5).

È questo il punto d'aggancio additivo per le mod: ti permette di distribuire un singolo .ufo senza creare una tua copia modificata del sidedata.tdf da 50 KB. Vedi il tutorial sul modding per un esempio completo, dall'inizio alla fine.


OTA — metadati della mappa

Un .ota accompagna ogni .tnt e contiene tutto ciò che serve al motore per far svolgere una partita sulla mappa (anziché per disegnarne il 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 legge il .ota corrispondente e disegna indicatori numerati in ogni posizione di partenza dello schema scelto.

Ecco come il gioco legge gli schemi e le posizioni di partenza. Tutte le viste di kbot (l'editor di mappe dello studio, la sandbox, l'esploratore di asset, kbot tnt preview, kbot tnt lint e il Quality Checker) li leggono allo stesso modo, tramite la vista di gioco degli OTA di kbot-io:

  • Gli schemi vengono cercati per nome, Schema 0, Schema 1, … fino al primo numero mancante. I nomi vengono confrontati ignorando maiuscole e minuscole ([schema 1] conta), ma il numero va scritto in modo semplice: [Schema0] o [Schema 01] non vengono mai trovati, e uno schema dopo un buco nella numerazione (Schema 0, Schema 1, Schema 3) non viene mai letto. SCHEMACOUNT viene ignorato.
  • Le partite in schermaglia e in multigiocatore scelgono uno schema in base a Type e al numero di posizioni di partenza, non alla posizione nel file. Sono idonei solo gli schemi da Network 1 a Network 4 (confrontati ignorando maiuscole e minuscole) con almeno una posizione di partenza. Per N giocatori il gioco preferisce l'ultimo schema idoneo con esattamente N posizioni di partenza, altrimenti quello che ne ha di più. Una missione della campagna sceglie in base alla difficoltà (Easy, Medium, Hard). numplayers è solo testo mostrato nella lobby (2, 4, 2-8 e Any si caricano tutti).
  • Le posizioni di partenza sono le voci di [specials] il cui specialwhat inizia con StartPos (ignorando maiuscole e minuscole). StartPosN è lo slot del giocatore N-1, anche StartPos0 è lo slot 0, e una voce senza numero dopo StartPos prende per sé il numero successivo (il primo è 1). XPos e ZPos sono pixel della mappa, limitati a 16 bit.
  • Le chiavi mancanti hanno valori predefiniti, non zeri: un missiondescription mancante mostra "No description available", un maxunits mancante (solo nelle campagne) significa 200, e un elemento piazzato in anticipo ([features]) senza XPos o ZPos viene saltato, quindi uno nella colonna o nella riga 0 ha bisogno di uno 0 esplicito.

Note

L'editor di mappe dello studio modifica direttamente il .ota di una mappa. Il salvataggio cambia solo i valori che hai modificato (e aggiunge o rimuove gli schemi e le posizioni di partenza che hai aggiunto o rimosso); tutto il resto (chiavi di vittoria e di trigger, useonlyunits, [units], [features], altri [specials], frazioni come killmul=0.5, commenti) viene riscritto così com'era. Rimuovere uno schema o una posizione di partenza riscrive il file nella disposizione di kbot-io (stesso contenuto, commenti eliminati) e rinumera gli schemi successivi in modo che il gioco li trovi ancora. Un .ota che kbot non riesce a leggere viene mostrato con il suo errore e lasciato invariato al salvataggio, e il testo inserito nelle finestre di dialogo che contiene ;, // o /* viene rifiutato. Lo stesso vale per un salvataggio che farebbe leggere al gioco uno schema che ora salta: uno schema aggiunto prende il numero libero più basso, quindi in un file con [Schema 0] e [Schema 2] il nuovo [Schema 1] metterebbe in gioco [Schema 2]; l'errore indica la sezione da rinominare o rimuovere. Una frazione troppo grande per essere rappresentata (killmul=1e999, che il gioco legge come infinito) viene mostrata come il numero più grande possibile e conservata così come è scritta, a meno che tu non la cambi. Il gioco prende il livello del mare dall'intestazione del .tnt; l'editor mantiene allineata una chiave sealevel= esistente, ma non ne aggiunge mai una.


Esempio svolto — unità minima

Un FBI "finto", completo e funzionante, per una torretta fissa:

[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;
    }
}

Per farne un componente aggiuntivo completo dovresti distribuire:

mymod/
├── units/myturret.fbi
├── objects3d/myturret.3do
├── scripts/MYTURRET.cob
├── features/corpses/myturret.tdf       # contains [MyTurret_Dead]
└── unitpics/MYTURRET.PCX

…e poi impacchettare la directory in un HPI:

kbot hpi pack ./mymod --target myturret.ufo

Insidie

Warning

Ogni valore deve terminare con ;. Un punto e virgola mancante non genera errori: il parser unisce silenziosamente il valore alla riga successiva, con statistiche sconcertanti (un MaxDamage=3000 seguito da un Description=... non terminato dà un'unità con 30.000 punti ferita e senza tooltip).

  • Le chiavi non distinguono tra maiuscole e minuscole, i valori sì. Side=arm corrisponde alla logica di classificazione delle unità per ARM, ma le mod che cambiano fazione al volo con if (Side == "ARM") tramite ricerche per uguaglianza di stringhe si rompono.
  • I valori delle liste sono separati da spazi (Category=COMMANDER MOBILE WEAPON), non da virgole. Il motore spezza la lista a ogni carattere di spaziatura.
  • Alcuni campi degli OTA usano però le virgole: numplayers=2,4,6,8,10. Non c'è un'unica convenzione per il separatore delle liste, e il gioco non analizza affatto numplayers: ne mostra solo il testo.
  • Le sezioni annidate non hanno un limite formale di profondità, ma Cavedog non ha mai distribuito nulla con più di 3 livelli. Gli editor che presuppongono 2 livelli falliscono su una manciata di TDF delle armi con annidamenti in stile [WEAPON][DAMAGE][category].
  • I campi booleani sono interi (canmove=1, canstop=0), non true/false. Il motore accetta solo 1/0.
  • I file .ota hanno spesso mojibake UTF-8 nelle descrizioni delle missioni (virgolette tipografiche di Word, ecc.). Il motore li visualizza con la codepage Windows-1252 e mostrerà come quadratini ("tofu") qualsiasi carattere al di fuori di essa.

Dimensioni tipiche

Elemento Intervallo osservato nei contenuti Cavedog
FBI di un'unità 1–4 KB (comandante: ~3 KB; carro leggero: ~1,5 KB)
TDF di un singolo elemento 200 B – 1 KB
TDF di un'arma 0,5–3 KB per sezione [WEAPON]
File OTA 1–8 KB
gamedata/sidedata.tdf ~50 KB (per lo più la disposizione dell'HUD)
gamedata/sound.tdf ~20 KB
FBI totali in TA + CC ~250 file

Appendice A — Dizionario dei campi FBI

Ogni campo che si trova comunemente in units/*.fbi, raggruppato per scopo. Legenda della colonna Tipo: str = identificatore/stringa; int = intero; float = numero in virgola mobile; bool = 0/1; list = token separati da spazi bianchi; enum = piccolo intero con significati documentati.

I campi non elencati qui sono residui dell'editor (UnitNumber, Copyright) oppure non sono documentati. Il motore ignora silenziosamente le chiavi sconosciute.

Identità e visualizzazione

Campo Tipo Note
UnitName str Chiave di ricerca principale. Vi fanno riferimento altre configurazioni, l'IA, l'OTA, i menu di costruzione.
Side str ARM o CORE (TA), Aramon/Taros/Veruna/Zhon (TA:K). Corrisponde a una [SIDE<N>] in gamedata/sidedata.tdf.
Objectname str Nome di base per la mesh .3do, lo script .cob e il ritratto unitpics/*.pcx dell'unità.
Designation str Il "codice del tipo" mostrato nel pannello informativo dell'unità (ad es. ARM-WM per il comandante Arm).
Name str Nome breve mostrato sopra l'unità.
Description str Testo del tooltip mostrato sul pulsante di costruzione e nel pannello informativo dell'unità.
GermanName / FrenchName / SpanishName / ItalianName / JapaneseName / PigLatinName str Nomi localizzati. Usati in base alla versione localizzata del gioco.
GermanDescription / FrenchDescription / SpanishDescription / ItalianDescription / JapaneseDescription / PigLatinDescription str Testo del tooltip localizzato.
Version int Versione dello schema tenuta dall'editor. Sempre 1 o 2 nei contenuti originali.
UnitNumber int ID usato solo dall'editor. Ignorato durante il gioco.
Copyright str Stringa di copyright in formato libero. Ignorata.
TEDClass str Classificazione dell'editor TAE (KBOT, TANK, COMMANDER, …). Puramente estetica.

Economia e costruzione

Campo Tipo Note
BuildCostMetal int Metallo necessario per costruire questa unità.
BuildCostEnergy int Energia necessaria per costruire questa unità.
BuildTime int Potenza di costruzione × secondi. Il motore lo divide per il WorkerTime del costruttore per ottenere il tempo di costruzione reale.
WorkerTime int Potenza di costruzione erogata da questa unità quando fa da costruttore.
EnergyUse int Energia consumata per tick quando è attiva.
EnergyMake int Energia prodotta per tick quando è attiva.
MetalUse int Metallo consumato per tick.
MetalMake int Metallo prodotto per tick.
EnergyStorage int Capacità di immagazzinamento. Vuoto per le unità che non immagazzinano.
MetalStorage int Capacità di immagazzinamento. Vuoto per le unità che non immagazzinano.
MakesMetal int Metallo che un metal maker converte al secondo mentre è acceso e il suo costo in energia è coperto; letto come numero intero (1.9 vale 1). Distinto da MetalMake, che è sempre attivo.
ExtractsMetal float Metallo che un estrattore rende per ogni unità di metallo della mappa sotto il suo ingombro, mentre è acceso e alimentato.
TidalGenerator bool La produzione di energia di questa unità varia in proporzione al tidalstrength della mappa.
WindGenerator bool La produzione varia con l'intervallo di velocità del vento della mappa.
Builder bool Può costruire altre unità.
Builddistance int Distanza massima del nano-lathe, in celle da 16 px.
CanReclamate bool Può recuperare relitti ed elementi.
CanCapture bool Può catturare le unità nemiche (solo i comandanti).
ActivateWhenBuilt bool Imposta su acceso l'interruttore "attivo" al termine della costruzione.
onoffable bool Ha un interruttore acceso/spento che il giocatore può azionare.

Combattimento e sopravvivenza

Campo Tipo Note
MaxDamage int Punti ferita.
Weapon1 / Weapon2 / Weapon3 str Nomi di sezioni di armi in weapons/*.tdf. Fino a 3 armi.
wpri_badTargetCategory list Categorie contro cui l'arma primaria rende poco (priorità ridotta).
wsec_badTargetCategory list Lo stesso per l'arma secondaria.
BadTargetCategory list Bersagli che l'unità nel suo complesso evita.
NoChaseCategory list Bersagli che l'unità non insegue (spara solo se sono a portata).
canattack bool Può sparare con le armi.
candgun bool Può sparare manualmente con la sua terza arma (il D-gun del comandante).
commandfire bool Ogni colpo deve essere comandato dal giocatore.
ExplodeAs str Nome dell'arma per l'esplosione alla morte (in weapons/*.tdf).
SelfDestructAs str Nome dell'arma per l'esplosione di autodistruzione.
Corpse str Nome della sezione [FEATURE] in features/**/*.tdf per il relitto lasciato a terra.
HealTime int Secondi per ripararsi completamente su una piattaforma di riparazione.
DamageModifier float Moltiplicatore applicato al danno in arrivo. <1 = resistente.
ImmuneToParalyzer bool Ignora le armi paralizzanti.
HideDamage bool Nasconde al nemico la barra del danno.
kamikaze bool Detona al contatto invece di sparare.
firestandorders bool Ha l'interruttore dell'ordine di fuoco permanente.
StandingFireOrder enum Atteggiamento di fuoco predefinito: 0 = non sparare, 1 = rispondi al fuoco, 2 = fuoco a volontà. Una chiave mancante vale 2; un valore esplicito mantiene i suoi due bit bassi, quindi 0 è davvero Hold Fire (non sparare).
mobilestandorders bool Ha l'interruttore dell'ordine di movimento permanente.
StandingMoveOrder enum Atteggiamento di movimento predefinito: 0 = mantieni la posizione, 1 = manovra, 2 = vaga. Una chiave mancante vale 2; un valore esplicito mantiene i suoi due bit bassi (lo 0 dei comandanti è Hold Position, mantieni la posizione).
ShootMe bool Suggerimento per gli avversari IA/computer: dare priorità a questa unità come bersaglio.
Commander bool La contrassegna come unità comandante (la partita è persa quando viene uccisa).

Movimento

Campo Tipo Note
MaxVelocity float Velocità massima in unità del mondo per tick.
Acceleration float Velocità guadagnata per tick.
BrakeRate float Velocità persa per tick in frenata.
TurnRate int Velocità di rotazione in unità di 2π/65536 per tick.
MaxSlope int Pendenza del terreno più ripida che l'unità può affrontare. Predefinito 255.
MaxWaterDepth int Acqua più profonda in cui l'unità può entrare. 0 = solo terraferma; predefinito 10000.
MinWaterDepth int Profondità minima dell'acqua (solo navi). Predefinito -10000.
MovementClass str Nome della classe in gamedata/moveinfo.tdf ([CLASS0]–[CLASS31]). Quando il nome corrisponde a una classe, l'ingombro, le profondità dell'acqua e le pendenze della classe sostituiscono le chiavi dell'FBI stesso (vedi Gamedata).
SteeringMode enum 0/1/2: prima gira e poi si muove, oppure in curva, oppure istantaneo.
Upright bool Mostra l'unità in piedi (kbot) o in piano (veicoli).
BankScale float Quanto l'unità si inclina lateralmente in virata (aerei). Predefinito 1; con uno 0 esplicito non si inclina mai.
PitchScale float Quanto l'unità beccheggia quando accelera.
Scale float Moltiplicatore della scala visiva (1.0 = normale).
CanFly bool Flag degli aerei.
crusisealt int Quota di crociera per le unità volanti.
attackrunlength int Distanza per i passaggi di mitragliamento di VTOL e bombardieri.
HoverAttack bool L'aereo resta sospeso in volo mentre attacca (cannoniere).
floater bool Galleggia sulla superficie dell'acqua.
canmove bool L'unità può muoversi.
canpatrol bool L'ordine di pattuglia è abilitato.
canstop bool L'ordine di stop è abilitato.
canguard bool L'ordine di guardia è abilitato.
canload bool Può caricare unità da trasportare.
transportsize int Classe di dimensione per i controlli di carico dei trasporti.
transportmaxunits / TransMaxUnits int Capacità delle unità da trasporto.
manuverleashlength (anche maneuverleashlength) int Quanto lontano dalla sua posizione di stazionamento l'unità si spingerà in manovra.
BadSlope int Pendenza alla quale il movimento rallenta senza essere bloccato.
BuildAngle int Pendenza massima su cui questa unità può essere costruita.

Sensori

Campo Tipo Note
SightDistance int Raggio della linea di vista (LOS) in celle da 16 px.
RadarDistance int Raggio di copertura radar. 0 = nessun radar.
SonarDistance int Raggio di copertura sonar.
RadarDistanceJam int Raggio entro cui l'unità disturba i radar nemici.
Stealth bool L'unità non compare sui radar nemici.
CloakCost int Energia per tick per restare occultata da ferma.
CloakCostMoving int Energia per tick per restare occultata in movimento.
mincloakdistance int L'occultamento fallisce quando un nemico è entro questo numero di celle.

Menu di costruzione e ingombro

Campo Tipo Note
Bmcode int Codice del menu di costruzione. Lascialo a 1 per le unità costruibili; 0 per gli edifici che non compaiono.
FootprintX / FootprintZ int Ingombro in celle da 16 px. Deve corrispondere all'ingombro della MovementClass.
YardMap str Griglia ASCII su più righe (o=aperto, c=chiuso, w=acqua, g=geotermico) che definisce le restrizioni di ogni cella.
ThreeD bool Viene visualizzata come modello 3D. Sempre 1 per le unità originali.
ZBuffer bool Usa lo Z-buffer. Sempre 1.
NoShadow bool Salta il rendering dell'ombra.
NoAutoFire bool Disattiva il fuoco automatico.
norestrict bool Salta l'applicazione delle zone vietate.
IsAirBase bool Gli aerei possono atterrare/ripararsi qui.
IsFeature bool Va trattata come elemento statico, non come unità.
Category list Fondamentale. Lista di tag separati da spazi bianchi usata dalla scelta dei bersagli delle armi, dai pesi dell'IA, dai menu di costruzione. Token standard: MOBILE, WEAPON, SURFACE, UNDERWATER, VTOL, KBOT, TANK, SHIP, LEVEL1/LEVEL2/LEVEL3, NOTSUB, NOTAIR, COMMANDER, nomi delle fazioni.
WaterLine int Profondità alla quale si assesta un'unità galleggiante.
altfromsealevel int La quota degli aerei si misura dal livello del mare, non dal terreno.

Audio

Campo Tipo Note
SoundCategory str Nome di una sezione in gamedata/sound.tdf che fornisce i campioni vocali dell'unità.
[SOUNDS] (sezione annidata) sottosezione Sostituzioni inline per eventi specifici (canselect=…, select1=…, ecc.).

Varie / poco chiari

Campo Tipo Note
DefaultMissionType str Stato iniziale della missione (Standby, Move, ecc.).
sortbias int Peso di ordinamento nel menu di costruzione.
teleporter bool La contrassegna come piattaforma di teletrasporto (Galactic Gate).
IsAirBase bool Vedi "Menu di costruzione e ingombro": ripetuto per completezza.
Ovradjust bool Attiva una sostituzione del motore non documentata; la usa solo il comandante.
ShowPlayerName bool Mostra il nome del giocatore sopra l'unità (solo il comandante).
MoveRate1 / MoveRate2 int Residui dell'editor. Non usati durante il gioco.
antiweapons bool Usato dalle piattaforme antiarma (Fortitude, antinucleare).

Esempi reali nel catalogo di riferimento

L'uso dei campi si impara meglio dagli FBI reali. I repository di riferimento catalogano ogni unità distribuita:

  • TA — tutti gli FBI: buoni esempi "ricchi" sono ARMCOM (comandante con Commander=1, CloakCost, MaxDamage=3000), ARMSAM (torretta con Weapon1/2/3 tutti impostati), ARMBRAWL (aereo con CanFly, crusisealt, BankScale), ARMMEX (estrattore di metallo con ExtractsMetal).
  • TA — tutti i TDF delle armi: [FLAMETHROWER] per burst/burstrate/firestarter, [NUCLEAR_MISSILE] per i missili guidati a due fasi, [LIGHTNING] per un'arma a raggio.
  • TA — albero di costruzione di elementi e armi: ogni registrazione [MENUENTRY] dell'installazione.
  • Unità di TA: Kingdoms: il diverso insieme di campi (buildcost= con una sola risorsa, damagecategory=, [WEAPONn] inline). ARAKING (Elsin, il monarca di Aramon) e ARAARCH (Archer) sono buoni punti di partenza.

Vedi anche

  • TNT: fa riferimento a nomi di elementi che si risolvono in sezioni TDF [FEATURE].
  • 3DO, COB: richiamati dall'Objectname dell'FBI.
  • GAF: richiamato dal seqname degli elementi e dall'explosiongaf delle armi.
  • TDF di gamedata: moveinfo.tdf, sound.tdf, sidedata.tdf, richiamati dai campi dell'FBI.
  • Audio: come SoundCategory si risolve in file WAV.
  • Glossario: fazione (side), ingombro (footprint), yardmap, schema.