TDF / FBI / OTA – Konfigurationsdateien im Textformat
TDF („Text Data File“), FBI („Feature/Building/Item“) und OTA („Online Total Annihilation“) teilen sich alle dasselbe INI-ähnliche Textformat. Mit ihnen hat Cavedog grundsätzlich alles deklariert, was nicht binär war – Einheitenwerte, Waffenparameter, Definitionen von Kartenobjekten, Missions-Metadaten, Soundkategorien, Hinweise für die KI.
| Endung | Wo du sie findest | Beispiele |
|---|---|---|
.fbi |
units/ |
ARMCOM.FBI, CORRAID.FBI – Einheitendefinitionen |
.tdf |
features/, weapons/, sounds/, gamedata/ usw. |
armflak_weapon.tdf, treeb.tdf |
.ota |
maps/ |
metal heck.ota – Karten-Metadaten, Startpositionen, KI-Briefing |
Diese Dateien sind reines ASCII; du kannst sie in jedem Texteditor öffnen.
Tip
Probier es selbst.
# The web UI renders FBI/TDF/OTA as collapsible section trees
kbot mount ~/games/totala --server
# → browse to units/ARMCOM.FBI
Die Nutzung des Terminal-Browsers und die Optionen zum Flatten stehen in
der kbot mount-Referenz der CLI.
Aus Go heraus. Verwende 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"))
Syntax
Eine TDF-Datei ist ein Baum aus Abschnitten. Jeder Abschnitt hat einen
Namen in eckigen Klammern, danach einen Rumpf { ... } mit
Schlüssel=Wert-Paaren und/oder verschachtelten Abschnitten.
[UNITINFO]
{
UnitName=ARMCOM;
Designation=Commander;
Description=Commander, Arm;
Side=ARM;
Objectname=armcom;
BuildCostEnergy=2500;
BuildCostMetal=2500;
MaxDamage=3000;
[SOUNDS]
{
canselect=cmdsel1;
select1=cmdok1;
}
}
Regeln:
- Abschnittsnamen stehen in eckigen Klammern; alles, was bis zur
passenden
}folgt, gehört zu diesem Abschnitt. Ein Abschnitt kann in einer Zeile stehen ([special0] { specialwhat=StartPos1; XPos=464; ZPos=216; }). - Ein Wert reicht vom
=bis zum nächsten;, auch über Zeilenumbrüche hinweg: Nichts anderes beendet ihn; geschweifte und eckige Klammern und=innerhalb eines Werts sind also einfacher Text, und ein Wert kann nie ein;enthalten. Leerzeichen, Tabs und Zeilenumbrüche an beiden Enden eines Schlüssels oder Werts werden abgeschnitten. Ein zweimal zugewiesener Schlüssel behält seinen letzten Wert. - Schlüssel unterscheiden nicht zwischen Groß- und Kleinschreibung.
UnitName,unitnameundUNITNAMEbezeichnen alle dasselbe Feld; Werkzeuge normalisieren beim Lesen üblicherweise auf Kleinbuchstaben. Auch Abschnittsnamen werden ohne Beachtung der Groß- und Kleinschreibung verglichen. - Werte sind standardmäßig Strings. Zahlen werden wie in C aus den
führenden Ziffern gelesen:
12abcwird als 12 gelesen und56.8als 56, wo das Spiel eine ganze Zahl erwartet (Felder wiekillmulundtidalstrengthwerden als Kommazahlen gelesen). Listen sind durch Leerzeichen getrennt (z. B.Category=NOTSUB COMMANDER NOTAIR ...). - Kommentare werden entfernt, bevor irgendetwas anderes gelesen wird:
//bis zum Zeilenende und/* ... */-Blöcke, die über mehrere Zeilen gehen dürfen. Deshalb verliertmissiondescription=See http://tauniverse.com;alles ab//, einschließlich seines;, und der Wert läuft bis in die nächste Zeile weiter. kbot weigert sich, einen Wert zu schreiben, der;,//oder/*enthält. - Leerraum und Leerzeilen werden ignoriert.
Verschachtelte Abschnitte (wie [SOUNDS] innerhalb von [UNITINFO] oben)
sind in FBI/OTA häufig. Die TDF-Spezifikation legt keine maximale Tiefe
fest; in der Praxis wirst du nicht mehr als 3 Ebenen sehen.
FBI – Einheitendefinitionen
Eine FBI ist die vollständige Sicht der Engine auf eine Einheit. Sie führt das 3D-Modell der Einheit, das Skript, die Waffenliste, die Soundbank, die Baukosten und das Kampfverhalten an einer Stelle zusammen. Ein gekürztes Beispiel am 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;
...
}
}
Der FBI-Leitfaden der Community von 1998 (in den Quellmaterialien dieses Repos aufbewahrt) dokumentiert über hundert Felder. Die meisten erklären sich selbst; die nicht offensichtlichen sind meist diese:
| Feld | Was es wirklich steuert |
|---|---|
Bmcode |
Seitencode des Baumenüs – bei normalen Einheiten auf 1 lassen. |
Category |
Durch Leerzeichen getrennte Tag-Liste, die von BadTargetCategory der Waffen, NoChaseCategory, der KI und den Baumenüs verwendet wird. |
MovementClass |
Verweist auf eine Klasse in gamedata/movinfo.tdf, die zulässige Geländesteigungen, Wassertiefe usw. festlegt. |
YardMap |
ASCII-Bild (z. B. oooo\noooo\n), das die Grundfläche der Einheit und die Wasser-/Land-Beschränkungen pro Zelle festlegt. |
Corpse |
Name eines [FEATURE] (siehe unten), das als Wrack zurückbleibt. |
SoundCategory |
Wählt die Soundbank in gamedata/sound.tdf. |
TEDClass |
Hinweis für Cavedogs Editor; zur Laufzeit ignoriert. |
Important
UnitName ist überall sonst der Suchschlüssel – die OTA verweist
darauf, die KI verweist darauf, das Baumenü verweist darauf. Wenn du eine
FBI umbenennst, musst du den ganzen Mod per grep nach Verweisen
durchsuchen.
TDF – Definitionen von Kartenobjekten, Waffen und Sounds
Die Dateien features/**/*.tdf enthalten [FEATURE]-Abschnitte, einen pro
statischem Kartenobjekt. Das TNT-Format (TNT) verweist über den
Abschnittsnamen auf sie:
[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)
}
weapons/*.tdf folgen demselben Muster, mit Abschnitten [WEAPON_NAME].
Das FBI-Feld Weapon1=COMMANDER_WEAPON wird zum Abschnitt
[COMMANDER_WEAPON] in irgendeiner TDF in weapons/ aufgelöst, und zwar
über die nach ID indizierte Waffentabelle des Spiels: Jeder Abschnitt
braucht ein ID= im Bereich 0–255, ein späterer Abschnitt mit
derselben ID ersetzt einen früheren, und ein Name wird zum niedrigsten Platz
aufgelöst, der ihn enthält (siehe
Gamedata: die Waffentabelle). Der
Waffen-Leitfaden der Community dokumentiert etwa 60 verschiedene Felder; die
wichtigsten sind ballistic/lineofsight/dropped (der Grundtyp der
Waffe), weapontimer, weaponvelocity, areaofeffect,
edgeeffectiveness, burst/burstrate und der Unterabschnitt [DAMAGE]
(Schadensmodifikatoren pro Kategorie).
[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] – Erweiterung des Baumenüs
Dateien in download/*.tdf tragen eine Einheit in die Baumenüs einer oder
mehrerer Baueinheiten ein, ohne sidedata.tdf zu verändern. Über diesen
Mechanismus fügt Cavedogs Erweiterung Core Contingency ihre Einheiten hinzu,
und jedes .ufo-Add-on mit einer einzelnen Einheit folgt dieser Konvention.
[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;
}
| Feld | Typ | Bedeutung |
|---|---|---|
UNITMENU |
str | UnitName der Baueinheit, deren Menü wir ergänzen. |
MENU |
int | Seitennummer des Baumenüs. 1–2 hat Cavedog für die Standardeinheiten reserviert; nach Konvention der Community beginnt man bei 3. |
BUTTON |
int | Platz innerhalb der Seite (0–5, angeordnet als Raster aus 2 Spalten × 3 Zeilen: 0=oben links, 1=oben rechts, 2=Mitte links, 3=Mitte rechts, 4=unten links, 5=unten rechts). |
UNITNAME |
str | Die Einheit, die hinzugefügt wird – muss mit dem UnitName= in der FBI deiner Einheit übereinstimmen. |
Namenskonvention für Dateien. Die Datei heißt üblicherweise
download/<UNITNAME>.tdf (passend zum UNITNAME= des ersten Eintrags),
aber die Engine liest jede *.tdf in download/, der Dateiname ist also
nur ein Hinweis für den Modder. Eine Einheit pro Datei ist die Regel.
Mehrere Einträge. Eine einzelne Datei kann mehrere Einträge enthalten –
Cavedogs download/Armfort.tdf verwendet drei, damit die Arm Fortification
Wall von ACK, ACV und ACA gebaut werden kann. TA 3.1c liest die ersten
fünf Abschnitte jeder Datei, unabhängig von ihren Namen ([MENUENTRY1]
ist die Konvention, [ENTRY0] funktioniert ebenso); ein sechster Abschnitt
wird nie gelesen. Ein Eintrag, dessen UNITMENU keine Einheit nennt oder
keine Einheit mit Builder=1, wird ignoriert, ebenso einer, dessen
UNITNAME keine Einheit nennt. MENU und BUTTON werden auf 8 Bit
beschränkt, und das Menü einer Baueinheit – ihre [CANBUILD]-Liste plus
die Ergänzungen aus download – fasst höchstens 31 Einheiten.
Important
download/*.tdf ergänzt das Baumenü; es ersetzt nichts. Kollidiert
der gewählte Platz mit einem vorhandenen Eintrag, ist das Verhalten der
Engine unvorhersehbar – meist gewinnt der später geladene Eintrag, aber
die Ladereihenfolge von .ufo-Dateien ist nicht auf allen Plattformen
garantiert. Wähle für Mods, die nebeneinander bestehen sollen, eine hohe
MENU-Seite (4 oder 5).
Das ist der additive Mod-Hook, mit dem du eine einzelne .ufo ausliefern
kannst, ohne eine eigene Fassung der 50 KB großen sidedata.tdf zu pflegen. Die
Anwendung von Anfang bis Ende zeigt das
Modding-Tutorial.
OTA – Karten-Metadaten
Eine .ota liegt jeder .tnt bei und enthält alles, was die Engine braucht,
um die Karte zu spielen (anders als zum Rendern ihres Geländes):
[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 liest die passende .ota und zeichnet nummerierte
Markierungen an jeder Startposition des gewählten Schemas.
Wie das Spiel die Schemata und Startpositionen liest (jede Ansicht in kbot –
der Karteneditor des Studios, die Sandbox, der Asset-Explorer,
kbot tnt preview, kbot tnt lint und der Quality Checker – liest sie auf
dieselbe Weise, über die OTA-Spielsicht von kbot-io):
- Schemata werden über ihren Namen gefunden,
Schema 0,Schema 1, … bis zur ersten fehlenden Nummer. Namen werden ohne Beachtung der Groß- und Kleinschreibung verglichen ([schema 1]zählt), aber die Nummer muss schlicht geschrieben sein:[Schema0]oder[Schema 01]wird nie gefunden, und ein Schema nach einer Lücke (Schema 0,Schema 1,Schema 3) wird nie gelesen.SCHEMACOUNTwird ignoriert. - Skirmish- und Mehrspielerpartien wählen ein Schema nach
Typeund Anzahl der Startpositionen, nicht nach seiner Position. Infrage kommen nur SchemataNetwork 1bisNetwork 4(ohne Beachtung der Groß- und Kleinschreibung verglichen) mit mindestens einer Startposition. Bei N Spielern bevorzugt das Spiel das letzte infrage kommende Schema mit genau N Startpositionen, andernfalls das mit den meisten. Eine Kampagnenmission wählt nach Schwierigkeitsgrad (Easy,Medium,Hard).numplayersist nur Text, der in der Lobby angezeigt wird (2, 4,2-8undAnyladen alle). - Startpositionen sind die Einträge in
[specials], derenspecialwhatmitStartPosbeginnt (ohne Beachtung der Groß- und Kleinschreibung).StartPosNist der Spielerplatz N-1,StartPos0ist ebenfalls Platz 0, und ein Eintrag ohne Nummer hinterStartPosbekommt die nächste eigene Nummer (die erste ist 1).XPosundZPossind Kartenpixel, auf 16 Bit beschränkt. - Fehlende Schlüssel haben Standardwerte, nicht Nullen: Fehlt
missiondescription, wird „No description available“ angezeigt, ein fehlendesmaxunits(nur Kampagnen) bedeutet 200, und ein vorab platziertes Kartenobjekt ([features]) ohneXPosoderZPoswird übersprungen; ein Objekt in Spalte oder Zeile 0 braucht also eine ausdrückliche0.
Note
Der Karteneditor des Studios bearbeitet die .ota einer Karte direkt.
Beim Speichern ändern sich nur die Werte, die du bearbeitet hast (und es
kommen die Schemata und Startpositionen hinzu oder fallen weg, die du
hinzugefügt oder entfernt hast); alles andere – Sieg- und
Auslöserschlüssel, useonlyunits, [units], [features], andere
[specials], Kommazahlen wie killmul=0.5, Kommentare – wird so
zurückgeschrieben, wie es war. Das Entfernen eines Schemas oder einer
Startposition schreibt die Datei im Layout von kbot-io neu (gleicher
Inhalt, Kommentare entfallen) und nummeriert spätere Schemata neu, damit
das Spiel sie weiterhin findet. Eine .ota, die kbot nicht lesen kann,
wird mit ihrem Fehler angezeigt und beim Speichern unverändert gelassen,
und Dialogtext mit ;, // oder /* wird abgelehnt. Abgelehnt wird
auch ein Speichern, nach dem das Spiel ein Schema lesen würde, das es
bisher überspringt: Ein neues Schema bekommt die niedrigste freie Nummer;
in einer Datei mit [Schema 0] und [Schema 2] würde das neue
[Schema 1] also [Schema 2] ins Spiel bringen; die Fehlermeldung nennt den Abschnitt, der
umbenannt oder entfernt werden muss. Eine Kommazahl, die zu groß ist, um
sie darzustellen (killmul=1e999, die das Spiel als unendlich liest), wird
als größte darstellbare Zahl angezeigt und so beibehalten, wie sie
geschrieben wurde, sofern du sie nicht änderst. Das Spiel nimmt den
Meeresspiegel aus dem Header der .tnt; der Editor hält einen vorhandenen
Schlüssel sealevel= auf dem gleichen Stand, fügt aber nie einen hinzu.
Beispiel im Detail – minimale Einheit
Eine vollständige, funktionierende „Fake“-FBI für einen stationären Geschützturm:
[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;
}
}
Um daraus ein vollständiges Einheiten-Add-on zu erstellen, würdest du Folgendes ausliefern:
mymod/
├── units/myturret.fbi
├── objects3d/myturret.3do
├── scripts/MYTURRET.cob
├── features/corpses/myturret.tdf # contains [MyTurret_Dead]
└── unitpics/MYTURRET.PCX
…und das Verzeichnis dann als HPI packen:
kbot hpi pack ./mymod --target myturret.ufo
Stolperfallen
Warning
Jeder Wert muss mit ; enden. Ein fehlendes Semikolon löst keinen
Fehler aus – der Parser verschmilzt den Wert stillschweigend mit der
nächsten Zeile, was zu rätselhaften Werten führt (ein MaxDamage=3000,
gefolgt von einem nicht abgeschlossenen Description=..., ergibt eine
Einheit mit 30.000 Trefferpunkten und ohne Tooltip).
- Schlüssel unterscheiden nicht zwischen Groß- und Kleinschreibung, Werte
schon.
Side=armpasst zur Logik, die Einheiten ARM zuordnet, aber Mods, die mitif (Side == "ARM")per String-Gleichheit zur Laufzeit die Seite wechseln, gehen kaputt. - Listenwerte sind durch Leerzeichen getrennt (
Category=COMMANDER MOBILE WEAPON) – nicht durch Kommas. Die Engine trennt an beliebigem Leerraum. - Manche OTA-Felder verwenden allerdings Kommas:
numplayers=2,4,6,8,10. Es gibt keine einheitliche Konvention für Listentrennzeichen, und das Spiel parstnumplayersüberhaupt nicht – es zeigt nur den Text an. - Verschachtelte Abschnitte haben keine formale Tiefengrenze, aber
Cavedog hat nie etwas ausgeliefert, das tiefer als 3 Ebenen ist. Editoren,
die von 2 Ebenen ausgehen, scheitern an einer Handvoll Waffen-TDFs mit
Verschachtelung im Stil von
[WEAPON][DAMAGE][category]. - Boolesche Felder sind Ganzzahlen (
canmove=1,canstop=0), nichttrue/false. Die Engine akzeptiert nur1/0. .ota-Dateien enthalten regelmäßig UTF-8-Mojibake in Missionsbeschreibungen (typografische Anführungszeichen aus Word usw.). Die Engine stellt sie mit der Codepage Windows-1252 dar und macht aus allem außerhalb davon Tofu-Kästchen.
Typische Größen
| Asset | Beobachteter Bereich in Cavedogs Inhalten |
|---|---|
| FBI einer Einheit | 1–4 KB (Commander: ~3 KB; leichter Panzer: ~1,5 KB) |
| TDF mit einem Kartenobjekt | 200 B – 1 KB |
| Waffen-TDF | 0,5–3 KB pro [WEAPON]-Abschnitt |
| OTA-Datei | 1–8 KB |
gamedata/sidedata.tdf |
~50 KB (das HUD-Layout macht den Großteil aus) |
gamedata/sound.tdf |
~20 KB |
| FBIs in TA + CC insgesamt | ~250 Dateien |
Anhang A – FBI-Feldverzeichnis
Jedes Feld, das häufig in units/*.fbi vorkommt, nach Zweck gruppiert.
Legende der Spalte Typ: str = Bezeichner/String; int = Ganzzahl;
float = Gleitkommazahl; bool = 0/1; list = durch Leerraum
getrennte Tokens; enum = kleine Ganzzahl mit dokumentierten Bedeutungen.
Felder, die hier nicht aufgeführt sind, sind entweder Hilfsfelder des
Editors (UnitNumber, Copyright) oder undokumentiert. Die Engine ignoriert
unbekannte Schlüssel stillschweigend.
Identität und Anzeige
| Feld | Typ | Anmerkungen |
|---|---|---|
UnitName |
str | Primärer Suchschlüssel. Wird von anderen Konfigurationen, der KI, der OTA und den Baumenüs referenziert. |
Side |
str | ARM oder CORE (TA), Aramon/Taros/Veruna/Zhon (TA:K). Entspricht einem [SIDE<N>] in gamedata/sidedata.tdf. |
Objectname |
str | Basisname für das .3do-Mesh, das .cob-Skript und das Porträt unitpics/*.pcx der Einheit. |
Designation |
str | Der „Typcode“, der im Infopanel der Einheit angezeigt wird (z. B. ARM-WM für den Arm Commander). |
Name |
str | Kurzer Anzeigename, der über der Einheit erscheint. |
Description |
str | Tooltip-Text auf der Bauschaltfläche und im Infopanel der Einheit. |
GermanName / FrenchName / SpanishName / ItalianName / JapaneseName / PigLatinName |
str | Lokalisierte Namen. Werden je nach ausgelieferter Sprachversion verwendet. |
GermanDescription / FrenchDescription / SpanishDescription / ItalianDescription / JapaneseDescription / PigLatinDescription |
str | Lokalisierter Tooltip-Text. |
Version |
int | Vom Editor verwaltete Schemaversion. In den Inhalten der Verkaufsversion immer 1 oder 2. |
UnitNumber |
int | ID nur für den Editor. Zur Laufzeit ignoriert. |
Copyright |
str | Frei formulierter Copyright-String. Wird ignoriert. |
TEDClass |
str | Klassifizierung für den TAE-Editor (KBOT, TANK, COMMANDER, …). Rein kosmetisch. |
Wirtschaft und Bau
| Feld | Typ | Anmerkungen |
|---|---|---|
BuildCostMetal |
int | Metall, das zum Bau dieser Einheit nötig ist. |
BuildCostEnergy |
int | Energie, die zum Bau dieser Einheit nötig ist. |
BuildTime |
int | Baukraft × Sekunden. Die Engine teilt durch das WorkerTime der Baueinheit, um die tatsächliche Bauzeit zu erhalten. |
WorkerTime |
int | Baukraft, die diese Einheit abgibt, wenn sie eine Baueinheit ist. |
EnergyUse |
int | Energieverbrauch pro Tick, wenn aktiv. |
EnergyMake |
int | Energieerzeugung pro Tick, wenn aktiv. |
MetalUse |
int | Metallverbrauch pro Tick. |
MetalMake |
int | Metallerzeugung pro Tick. |
EnergyStorage |
int | Speicherkapazität. Leer bei Einheiten ohne Speicher. |
MetalStorage |
int | Speicherkapazität. Leer bei Einheiten ohne Speicher. |
MakesMetal |
int | Metall, das ein Metallerzeuger pro Sekunde umwandelt, solange er eingeschaltet ist und seine Energie bezahlt wird; als ganze Zahl gelesen (1.9 ist 1). Unabhängig von MetalMake, das immer aktiv ist. |
ExtractsMetal |
float | Metall, das ein Extraktor pro Einheit Kartenmetall unter seiner Grundfläche fördert, solange er eingeschaltet ist und Energie hat. |
TidalGenerator |
bool | Die Energieabgabe dieser Einheit skaliert mit tidalstrength der Karte. |
WindGenerator |
bool | Die Abgabe skaliert mit dem Windgeschwindigkeitsbereich der Karte. |
Builder |
bool | Kann andere Einheiten bauen. |
Builddistance |
int | Maximale Reichweite der Nano-Lathe, in Zellen zu 16 px. |
CanReclamate |
bool | Kann Wracks/Kartenobjekte zurückgewinnen. |
CanCapture |
bool | Kann feindliche Einheiten übernehmen (nur Commander). |
ActivateWhenBuilt |
bool | Setzt den Schalter „Aktiv“ standardmäßig auf Ein, sobald der Bau abgeschlossen ist. |
onoffable |
bool | Hat einen Ein-/Aus-Schalter, den der Spieler umlegen kann. |
Kampf und Überlebensfähigkeit
| Feld | Typ | Anmerkungen |
|---|---|---|
MaxDamage |
int | Trefferpunkte. |
Weapon1 / Weapon2 / Weapon3 |
str | Namen von Waffenabschnitten in weapons/*.tdf. Bis zu 3 Waffen. |
wpri_badTargetCategory |
list | Kategorien, gegen die die Primärwaffe schlecht wirkt (niedriger priorisiert). |
wsec_badTargetCategory |
list | Dasselbe für die Sekundärwaffe. |
BadTargetCategory |
list | Ziele, die die Einheit als Ganzes meidet. |
NoChaseCategory |
list | Ziele, die die Einheit nicht verfolgt (sie feuert nur auf sie, wenn sie in Reichweite sind). |
canattack |
bool | Kann überhaupt Waffen abfeuern. |
candgun |
bool | Kann ihre 3. Waffe manuell abfeuern (die D-Gun des Commanders). |
commandfire |
bool | Erzwingt, dass jeder Schuss vom Spieler ausgelöst wird. |
ExplodeAs |
str | Waffenname für die Explosion beim Tod (in weapons/*.tdf). |
SelfDestructAs |
str | Waffenname für die Explosion bei der Selbstzerstörung. |
Corpse |
str | Name des [FEATURE]-Abschnitts in features/**/*.tdf für das zurückbleibende Wrack. |
HealTime |
int | Sekunden bis zur vollständigen Heilung auf einer Reparaturplattform. |
DamageModifier |
float | Multiplikator für eingehenden Schaden. <1 = widerstandsfähig. |
ImmuneToParalyzer |
bool | Ignoriert Stasiswaffen. |
HideDamage |
bool | Verbirgt den Schadensbalken vor dem Gegner. |
kamikaze |
bool | Detoniert bei Kontakt, statt zu feuern. |
firestandorders |
bool | Hat den Schalter für die Feuerhaltung. |
StandingFireOrder |
enum | Standard-Feuerhaltung: 0 = Feuer halten, 1 = Feuer erwidern, 2 = Feuer frei. Ein fehlender Schlüssel bedeutet 2; ein ausdrücklicher Wert behält seine unteren zwei Bits, 0 ist also wirklich Hold Fire. |
mobilestandorders |
bool | Hat den Schalter für die Bewegungshaltung. |
StandingMoveOrder |
enum | Standard-Bewegungshaltung: 0 = Position halten, 1 = manövrieren, 2 = umherstreifen. Ein fehlender Schlüssel bedeutet 2; ein ausdrücklicher Wert behält seine unteren zwei Bits (das 0 der Commander ist Hold Position). |
ShootMe |
bool | Hinweis an KI-/Computergegner: diese Einheit bevorzugt ins Visier nehmen. |
Commander |
bool | Kennzeichnet die Einheit als Commander (das Spiel ist verloren, wenn sie zerstört wird). |
Bewegung
| Feld | Typ | Anmerkungen |
|---|---|---|
MaxVelocity |
float | Höchstgeschwindigkeit in Welteinheiten pro Tick. |
Acceleration |
float | Geschwindigkeitszuwachs pro Tick. |
BrakeRate |
float | Geschwindigkeitsverlust pro Tick beim Anhalten. |
TurnRate |
int | Drehgeschwindigkeit in Einheiten von 2π/65536 pro Tick. |
MaxSlope |
int | Steilste Landsteigung, die die Einheit erklimmen kann. Standard 255. |
MaxWaterDepth |
int | Tiefstes Wasser, das die Einheit betreten kann. 0 = nur Land; Standard 10000. |
MinWaterDepth |
int | Minimale Wassertiefe (nur Schiffe). Standard -10000. |
MovementClass |
str | Klassenname in gamedata/moveinfo.tdf ([CLASS0]–[CLASS31]). Wenn er aufgelöst wird, ersetzen Grundfläche, Wassertiefen und Steigungen der Klasse die eigenen Schlüssel der FBI (siehe Gamedata). |
SteeringMode |
enum | 0/1/2 – erst drehen, dann fahren vs. Bogen vs. sofort. |
Upright |
bool | Stellt die Einheit aufrecht (Kbots) oder flach (Fahrzeuge) dar. |
BankScale |
float | Wie stark die Einheit beim Wenden in die Kurve rollt (Flugzeuge). Standard 1; mit einem ausdrücklichen 0 legt sie sich nie in die Kurve. |
PitchScale |
float | Wie stark die Einheit beim Beschleunigen nickt. |
Scale |
float | Multiplikator für die visuelle Skalierung (1.0 = normal). |
CanFly |
bool | Flag für Flugzeuge. |
crusisealt |
int | Reiseflughöhe für Flieger. |
attackrunlength |
int | Strecke für Angriffsanflüge von VTOLs/Bombern. |
HoverAttack |
bool | Das Flugzeug schwebt beim Angriff (Kampfhubschrauber). |
floater |
bool | Schwimmt auf der Wasseroberfläche. |
canmove |
bool | Die Einheit kann sich überhaupt bewegen. |
canpatrol |
bool | Der Patrouillenbefehl ist verfügbar. |
canstop |
bool | Der Stoppbefehl ist verfügbar. |
canguard |
bool | Der Bewachungsbefehl ist verfügbar. |
canload |
bool | Kann Einheiten zum Transport aufnehmen. |
transportsize |
int | Größenklasse für Ladeprüfungen von Transportern. |
transportmaxunits / TransMaxUnits |
int | Kapazität von Transporteinheiten. |
manuverleashlength (auch maneuverleashlength) |
int | Wie weit sich die Einheit beim Manövrieren von ihrer Ausgangsposition entfernt. |
BadSlope |
int | Steigung, ab der die Bewegung langsamer wird, aber nicht blockiert ist. |
BuildAngle |
int | Maximale Steigung, auf der diese Einheit gebaut werden kann. |
Wahrnehmung
| Feld | Typ | Anmerkungen |
|---|---|---|
SightDistance |
int | Sichtradius (LOS) in Zellen zu 16 px. |
RadarDistance |
int | Radius der Radarabdeckung. 0 = kein Radar. |
SonarDistance |
int | Radius der Sonarabdeckung. |
RadarDistanceJam |
int | Radius, in dem die Einheit feindliches Radar stört. |
Stealth |
bool | Die Einheit erscheint nicht auf feindlichem Radar. |
CloakCost |
int | Energie pro Tick, um im Stillstand getarnt zu bleiben. |
CloakCostMoving |
int | Energie pro Tick, um in Bewegung getarnt zu bleiben. |
mincloakdistance |
int | Die Tarnung versagt, wenn ein Gegner höchstens so viele Zellen entfernt ist. |
Baumenü und Grundfläche
| Feld | Typ | Anmerkungen |
|---|---|---|
Bmcode |
int | Baumenü-Code. Für baubare Einheiten auf 1 lassen; 0 für Gebäude, die nicht erscheinen. |
FootprintX / FootprintZ |
int | Grundfläche in Zellen zu 16 px. Muss zur Grundfläche der MovementClass passen. |
YardMap |
str | Mehrzeiliges ASCII-Raster (o=offen, c=geschlossen, w=Wasser, g=geothermisch), das die Beschränkungen pro Zelle festlegt. |
ThreeD |
bool | Wird als 3D-Modell dargestellt. Bei Einheiten der Verkaufsversion immer 1. |
ZBuffer |
bool | Z-Buffering verwenden. Immer 1. |
NoShadow |
bool | Schattendarstellung überspringen. |
NoAutoFire |
bool | Automatisches Feuern abschalten. |
norestrict |
bool | Durchsetzung gesperrter Zonen überspringen. |
IsAirBase |
bool | Flugzeuge können hier landen und sich reparieren lassen. |
IsFeature |
bool | Als statisches Kartenobjekt statt als Einheit behandeln. |
Category |
list | Entscheidend. Durch Leerraum getrennte Tag-Liste, die von der Zielauswahl der Waffen, den KI-Gewichten und den Baumenüs verwendet wird. Standard-Tokens: MOBILE, WEAPON, SURFACE, UNDERWATER, VTOL, KBOT, TANK, SHIP, LEVEL1/LEVEL2/LEVEL3, NOTSUB, NOTAIR, COMMANDER, Seitennamen. |
WaterLine |
int | Tiefe, auf der sich eine schwimmende Einheit einpendelt. |
altfromsealevel |
int | Die Flughöhe wird vom Meeresspiegel aus gemessen, nicht vom Gelände. |
Audio
| Feld | Typ | Anmerkungen |
|---|---|---|
SoundCategory |
str | Name eines Abschnitts in gamedata/sound.tdf, der die Sprachsamples der Einheit liefert. |
[SOUNDS] (verschachtelter Abschnitt) |
Unterabschnitt | Inline-Überschreibungen für bestimmte Ereignisse (canselect=…, select1=… usw.). |
Sonstiges / wenig verstanden
| Feld | Typ | Anmerkungen |
|---|---|---|
DefaultMissionType |
str | Anfänglicher Auftragszustand (Standby, Move usw.). |
sortbias |
int | Sortiergewicht im Baumenü. |
teleporter |
bool | Kennzeichnet eine Teleporterplattform (Galactic Gate). |
IsAirBase |
bool | Siehe „Baumenü und Grundfläche“ – der Vollständigkeit halber doppelt aufgeführt. |
Ovradjust |
bool | Löst eine undokumentierte Sonderbehandlung der Engine aus; nur der Commander verwendet es. |
ShowPlayerName |
bool | Zeigt den Namen des Spielers über der Einheit an (nur Commander). |
MoveRate1 / MoveRate2 |
int | Hilfsfelder des Editors. Zur Laufzeit nicht verwendet. |
antiweapons |
bool | Wird von Abwehrplattformen verwendet (Fortitude, Anti-Atomraketen). |
Echte Beispiele im Referenzkatalog
Wie die Felder verwendet werden, lernt man am besten an echten FBIs. Die Referenz-Repos katalogisieren jede ausgelieferte Einheit:
- TA – jede FBI:
gute „reichhaltige“ Beispiele sind
ARMCOM(Commander mitCommander=1,CloakCost,MaxDamage=3000),ARMSAM(Geschützturm mit gefülltenWeapon1/2/3),ARMBRAWL(Flugzeug mitCanFly,crusisealt,BankScale),ARMMEX(Metallextraktor mitExtractsMetal). - TA – jede Waffen-TDF:
[FLAMETHROWER]fürburst/burstrate/firestarter,[NUCLEAR_MISSILE]für zweiphasige Lenkraketen,[LIGHTNING]für eine Strahlwaffe. - TA – Baubaum von Kartenobjekten und Waffen
– jede
[MENUENTRY]-Registrierung der Installation. - Einheiten von TA: Kingdoms
– der andere Feldsatz (
buildcost=als einzige Ressource,damagecategory=, inline[WEAPONn]).ARAKING(Aramons Monarch Elsin) undARAARCH(Archer) sind gute Einstiegspunkte.
Siehe auch
- TNT – verweist auf Namen von Kartenobjekten, die zu
[FEATURE]-Abschnitten in TDFs aufgelöst werden. - 3DO, COB – werden über
Objectnamein der FBI referenziert. - GAF – wird über
seqnamevon Kartenobjekten und überexplosiongafvon Waffen referenziert. - Gamedata-TDFs –
moveinfo.tdf,sound.tdf,sidedata.tdf, auf die FBI-Felder verweisen. - Sound – wie
SoundCategoryzu WAV-Dateien aufgelöst wird. - Glossar – side, footprint, yardmap, schema.