Alle Formatseiten ↓
Einheiten, Skripte, Konfiguration

Gamedata-TDFs – Konfigurationstabellen der Engine

Aus coreprime/kbot @ 0ab97bf · Auf GitHub bearbeiten

Die Dateien in gamedata/ sind TDF-Textdateien, die die Engine selbst konfigurieren: Bewegungsklassen, Schadenskategorien der Waffen, Seitendaten (Oberflächen-Layout, Baumenüs, Starteinheiten), Sound-Zuordnungen und eine Handvoll kleiner Nachschlagetabellen. Mods, die die Spielregeln ändern (statt Einheiten hinzuzufügen), sitzen fast immer hier.

Diese Seite dokumentiert die nützlichsten Gamedata-Dateien. Sie alle verwenden die INI-artige TDF-Grammatik – Einzelheiten auf Parser-Ebene stehen unter TDF.

Tip

Probier es selbst.

ls $(kbot ctx path)/gamedata/
# The web UI renders these as collapsible section trees
kbot mount $(kbot ctx path) --server
# → browse to gamedata/sidedata.tdf, then sidedata > [CANBUILD]

Die Dateien auf einen Blick

Datei Was sie steuert
sidedata.tdf Oberflächen-Layout pro Seite, Start-Commander, Baumenüs. Die größte Datei in gamedata/.
moveinfo.tdf Bewegungsklassen – welches Gelände jede „MovementClass“ befahren kann.
weapons.tdf Referenzdokument zur Grammatik der Waffen-TDFs (größtenteils Kommentare – keine Tabelle, die zur Laufzeit verwendet wird).
category.tdf Lesbare Beschreibungen der Einheitenkategorien. Rein kosmetisch.
sound.tdf Soundkategorien pro Einheit (referenziert über SoundCategory= in der FBI).
allsound.tdf Sounds für Oberfläche und Spielereignisse (Klicks auf Schaltflächen, Pings der Punkteleiste, Hintergrundmusik).
los.tdf Feinabstimmung der Sichtlinie (Modifikatoren des Sichtradius pro Gelände).
meteor.tdf Parameter für Asteroidenstürme (von einigen Kampagnenkarten verwendet).
unitview.tdf Layout des Infopanels für Einheiten im Spiel.
buildinfo.tdf Tastenkürzel und Tooltip-Texte des Baumenüs.
version.tdf Versions-String des Spiels, den die Lobby meldet.
translate.tdf Nachschlagetabelle für die Lokalisierung von Oberflächen-Strings.
help.tdf Einträge des Hilfesystems im Spiel.

Die großen drei fürs Modding sind sidedata.tdf (Baumenüs, Seiten), moveinfo.tdf (Bewegungsklassen) und weapons.tdf (das Dokumentation ist, keine Daten – die eigentlichen Waffen stehen in weapons/*.tdf).


moveinfo.tdf – Bewegungsklassen

Die FBI einer Einheit deklariert ihre MovementClass=KBOTSS2 (oder ähnlich); die Engine sucht diese Klasse in moveinfo.tdf, um zu entscheiden, welches Gelände die Einheit befahren kann.

TA 3.1c liest nur die Abschnitte [CLASS0] bis [CLASS31] (jeweils den ersten Abschnitt mit diesem Namen) und findet eine Klasse über ihr Name=, ohne Rücksicht auf Groß- und Kleinschreibung, beginnend beim niedrigsten Platz. Lässt sich die Klasse der Einheit auflösen, ersetzen die Werte der Klasse die eigenen Schlüssel FootprintX/FootprintZ, MaxWaterDepth, MinWaterDepth und die Steigungsschlüssel der Einheit vollständig – das MaxSlope=20 des Commanders weicht den 32 von TANKDS2 –, und ein Schlüssel, den die Klasse weglässt, bekommt den Standardwert des Spiels (siehe unten), nicht den Wert aus der FBI. Eine Einheit ohne Klasse oder mit einer Klasse, die das Spiel nicht findet, liest ihre eigenen FBI-Schlüssel mit denselben Standardwerten. Die Einheiten-Metadaten, die Sandbox und die gehosteten Partien von KBot Studio lösen die Bewegung auf diese Weise auf.

[CLASS0]
{
    Name=KBOTSS2;        // Class name referenced from FBIs
    FootprintX=2;        // Cells wide (16-px units)
    FootprintZ=2;        // Cells deep
    MaxWaterDepth=12;    // Deepest water it can enter
    MaxSlope=32;         // Steepest land slope it can climb
}

[CLASS3]
{
    Name=TANKDH3;
    FootprintX=3;
    FootprintZ=3;
    MaxWaterDepth=100;   // Heavy tank — can ford deep water
    MaxWaterSlope=30;    // Slope limit *underwater* (separate from MaxSlope)
    MaxSlope=15;
}

Felder

Feld Typ Bedeutung
Name string Bezeichner der Klasse, auf den MovementClass= in den FBIs der Einheiten verweist. Ohne Unterscheidung von Groß- und Kleinschreibung.
FootprintX, FootprintZ int Grundfläche für die Wegfindung, in Attributzellen zu 16 px. Ersetzt die Grundfläche aus der FBI der Einheit; 0, wenn die Klasse sie weglässt.
MaxWaterDepth int Tiefstes Wasser (in Einheiten der Geländehöhe), das die Einheit betreten kann. 0 = nur Land. Standard 10000 (jede Tiefe) – Hovercraft-Klassen lassen den Schlüssel weg, also fährt ein Hovercraft über jedes Wasser, egal was in seiner FBI steht.
MinWaterDepth int Erforderliche Mindestwassertiefe (Schiffe, U-Boote). Standard -10000 (kein Minimum).
MaxSlope int Steilste Steigung, die die Einheit an Land erklimmen kann (Einheiten = 2π / 256 Radiant). Standard 255; begrenzt durch MaxWaterSlope.
BadSlope int Steigung, ab der sich die Einheit mit verringerter Geschwindigkeit bewegt (langsamer, aber nicht blockiert). Standardmäßig die Hälfte von MaxSlope; begrenzt durch MaxSlope.
MaxWaterSlope int Wie MaxSlope, gilt unter Wasser. Standard 255 (keine Grenze, für Hovercraft verwendet).
BadWaterSlope int Unterwasser-Gegenstück zu BadSlope; standardmäßig die Hälfte von MaxWaterSlope.

Namenskonventionen

Der Klassenname kodiert die Form in einem kurzen Kürzel – nach Cavedogs Konvention:

Präfix Bedeutung
KBOT Zweibeiniger Kbot
TANK Ketten- oder Radfahrzeug
BOAT Überwasserfahrzeug
SPID Spinne / vielbeiniger Krabbler
HOVER Hovercraft

Danach folgt ein Suffix SS / SF / DS / DH / SH (klein/tief/schwer/usw.) und eine Ziffer für die Grundfläche. Die Benennung ist reine Konvention – die Engine behandelt Name= als undurchsichtigen Schlüssel.

Important

Zwei Einheiten mit derselben MovementClass= teilen sich das Verhalten bei der Wegfindung. Änderst du KBOTSS2 auf MaxWaterDepth=50, watet jeder kleine Kbot durchs Wasser. Lege stattdessen eine neue Klasse an, wenn du einzelne Einheiten abstimmen willst.


sidedata.tdf – Konfiguration pro Seite

Das ist die längste Datei in gamedata/, weil sie drei verschiedene Aufgaben bündelt:

  1. Seitendeklarationen – Name, Präfix, Commander, Schriften, Farben.
  2. HUD-Layout – Pixelkoordinaten für jede Statusleiste, jede Beschriftung und jede Schaltfläche der Oberfläche im Spiel.
  3. Baumenüs – der Abschnitt [CANBUILD], der auflistet, was jede Baueinheit bauen kann.

Seitenblock

[SIDE0]
{
    name=ARM;
    nameprefix=ARM;
    commander=ARMCOM;          // UnitName of the commander unit
    intgaf=ARMINT;             // GAF used for intro screen

    font=console;              // FNT for general text
    fontgui=armbutt;           // FNT for buttons
    energycolor=208;           // Palette index for energy bars
    metalcolor=224;            // Palette index for metal bars

    // …followed by ~60 HUD coordinate sub-sections
    [LOGO]      { x1=132; y1=5;   x2=152; y2=25; }
    [ENERGYBAR] { x1=471; y1=12;  x2=598; y2=14; }
    [METALBAR]  { x1=218; y1=12;  x2=345; y2=14; }
    ...
}

[SIDE1] { name=CORE; ... }
Feld Bedeutung
name Anzeigename der Seite (wird auch für den Abgleich von Kategorien verwendet).
nameprefix String-Präfix, das Nachschlagevorgängen der Lokalisierung vorangestellt wird.
commander UnitName der Commander-Einheit der Seite.
intgaf GAF-Sequenz, die während der Fraktionsauswahl angezeigt wird.
font / fontgui FNT-Dateien für HUD-Text und Schaltflächen.
energycolor / metalcolor Palettenindizes für die HUD-Leisten (Indizes in palette.pal).

TA 3.1c liest die Seiten [SIDE0], [SIDE1], … der Reihe nach und hört bei der ersten fehlenden Nummer und nach fünf Seiten auf. Ein Abschnitt mit einem anderen Namen ([SIDE01], ein [SIDE3] nach einem fehlenden [SIDE2], eine sechste Seite) wird nie gelesen, und jede gelesene Seite braucht jedes der HUD-Rechtecke unten (ta.SideRectangles in kbot-io), sonst lädt das Spiel überhaupt keine Seiten. Die Seitenauswahl in der Sandbox des Studios bietet dieselben Seiten an.

HUD-Koordinaten in Unterabschnitten

Jedes sichtbare HUD-Element ist ein [NAME]-Block mit den Pixelkoordinaten x1/y1/x2/y2. Sie beziehen sich auf die Basisauflösung 640×480; in höheren Modi skaliert die Engine.

[ENERGYBAR] { x1=471; y1=12; x2=598; y2=14; }

Um die Energieleiste zu verschieben, bearbeite die vier Zahlen. Um ihr ein neues Aussehen zu geben, tausche das GAF aus, mit dem das HUD an dieser Position zeichnet (festgelegt in unitview.tdf).

Baumenüs mit [CANBUILD]

Die statische Definition des Baumenüs. Jede Baueinheit listet auf, was sie zu Spielbeginn bauen kann:

[CANBUILD]
{
    [ARMCOM]
    {
        canbuild1=ARMSOLAR;    // Slot 1 on the build menu
        canbuild2=ARMWIN;
        canbuild3=ARMESTOR;
        canbuild4=ARMMSTOR;
        canbuild5=ARMMEX;
        ...
    }
    [ARMLAB]
    {
        canbuild1=ARMCK;
        canbuild2=ARMPW;
        ...
    }
}

Die Platznummer ist die Position auf der Seite des Baumenüs. Das Baumenü von TA ist ein Raster aus 2 Spalten × 3 Zeilen, jede Seite fasst also 6 Plätze: canbuild1–canbuild6 sind Seite 1, canbuild7–canbuild12 sind Seite 2 und so weiter.

Wie TA 3.1c die Tabelle liest (CanBuildBuilder.BuildList in kbot-io; kbot document, der Einheiten-Viewer und das Baumenü der Sandbox folgen dem):

  • Nur eine Einheit, deren FBI Builder=1 setzt, bekommt eine Liste; ein Unterabschnitt für jede andere Einheit wird ignoriert.
  • Das Spiel liest den ersten [CANBUILD]-Abschnitt und darin den ersten Unterabschnitt, der nach der Baueinheit benannt ist (ohne Rücksicht auf Groß- und Kleinschreibung).
  • Es liest canbuild1, canbuild2, … und hört bei der ersten fehlenden Nummer auf: canbuild1=ARMSOLAR; canbuild3=ARMLAB; ergibt einen Eintrag.
  • Ein Name, der zu keiner Einheit passt, wird übersprungen, und eine Liste fasst höchstens 30 Einheiten. Einträge aus download (siehe unten) können das Menü einer Baueinheit auf 31 bringen. (Ältere Dokumentation behauptete gelegentlich 12 Plätze pro Seite; das tatsächliche Raster im Spiel hat 6.) Das Layout jeder Baueinheit des Grundspiels pro Seite zeigt die Referenz zum TA-Baubaum.

Important

Bearbeite für Mods NICHT sidedata.tdf, um Einheiten hinzuzufügen. Das von Cavedog abgesegnete Muster, um eine Einheit ins Baumenü aufzunehmen, ist, eine Datei download/<UNITNAME>.tdf mit dem Rest deines Mods auszuliefern – die Engine legt beim Start jede download/*.tdf über die statische [CANBUILD]-Tabelle von sidedata.tdf.

sidedata.tdf zu bearbeiten ist nur angebracht, wenn du eine Total Conversion auslieferst, die das ganze Layout von HUD und Baumenü neu schreibt. Selbst Cavedogs eigene Erweiterung Core Contingency fügt ihre neuen Einheiten über download/*.tdf hinzu, nicht durch Änderungen an sidedata.tdf.

Siehe TDF: [MENUENTRY] und das Modding-Tutorial.


weapons.tdf – Referenz zu Waffen-TDFs

Trotz des Namens besteht gamedata/weapons.tdf größtenteils aus Kommentaren – es ist Cavedogs veröffentlichte Referenz zur Grammatik der Waffen-TDFs, und das Spiel lädt die Datei nie. Die eigentlichen Waffendefinitionen stehen in weapons/*.tdf, ein Abschnitt pro Waffe (siehe TDF). kbot document listet die Abschnitte von gamedata/weapons.tdf nicht als Waffen auf.

Die Waffentabelle

TA 3.1c baut eine Tabelle mit 256 Waffenplätzen aus den .tdf-Dateien, die direkt in weapons/ liegen (nicht in dessen Unterverzeichnissen), in der Reihenfolge, in der es sie auflistet:

  • Ein Abschnitt kommt auf den Platz, den sein ID= nennt, 0–255. Ein Abschnitt ohne ID oder mit einer ID außerhalb dieses Bereichs wird übersprungen.
  • Ein späterer Abschnitt mit derselben ID – in derselben oder einer späteren Datei – ersetzt den früheren.
  • Weapon1/Weapon2/Weapon3, ExplodeAs und SelfDestructAs einer Einheit nennen einen Abschnitt; der Name (ohne Rücksicht auf Groß- und Kleinschreibung) wird zum niedrigsten Platz aufgelöst, der einen Abschnitt dieses Namens enthält.
  • Werte werden als Zahlenpräfixe gelesen: weaponacceleration=13O; ist 13, und ein ungültiger Wert lässt nie den Rest der Datei wegfallen.
  • Eine kaputte Struktur bringt das Spiel dazu, die ganze Datei abzulehnen, sodass keine ihrer Waffen geladen wird, die Abschnitte vor dem Fehler eingeschlossen: ein Abschnittskopf ohne ] oder ohne {, Text ohne = oder ein Wert ohne ; vor dem Dateiende, eine Datei, die innerhalb eines Abschnitts endet, oder eine leere Datei. Andere Dateien sind nicht betroffen. (Eine verirrte } außerhalb jedes Abschnitts führt nicht zur Ablehnung: Das Spiel hört dort auf zu lesen und behält, was davor kam.)
  • Ein fehlendes range ist 32767; ein fehlendes minbarrelangle ist -11.25 Grad; reloadtime zählt in ganzen Ticks (30 pro Sekunde, reloadtime*30 abgeschnitten: 0.35 lädt nach 10 Ticks nach, 0,333 s); turnrate ist in Winkeleinheiten pro Sekunde angegeben (65.536 = ein voller Kreis).

KBot Studio, Packs und kbot host lösen Waffen alle über diese Tabelle auf. Dateien, die das Spiel ablehnt, und Abschnitte, die es überspringt oder ersetzt, werden als Warnungen gemeldet (kbot pack gibt sie aus; das Studio stellt sie unter /api/studio/weapons/warnings bereit).

Sprites mit rendertype=4

Eine Waffe mit rendertype=4 fliegt als 2D-Sprite aus anims/fx.gaf, und ihr color= wählt, welches: 0 cannonshell, 1 plasmasm, 2 plasmamd, 3 ultrashell, 4 noch einmal plasmasm; jeder andere Wert (etwa color=255 von EARTHQUAKE) zeichnet kein Sprite. Das Sprite rückt ab dem Moment, in dem der Schuss abgefeuert wird, pro Spiel-Tick um einen Frame weiter, unabhängig davon, welche Dauern die GAF-Frames angeben.

Die Referenzkommentare dokumentieren:

  • Drei Grundtypen von Waffen: ballistic, lineofsight, dropped. Jede Waffen-TDF muss einen davon auf 1 setzen.
  • Reichweite, Geschwindigkeit, Beschleunigung – in Pixeln und Pixeln/Sekunde.
  • Wirkungsbereich – Radius in Pixeln, mit edgeeffectiveness als Anteil für den Abfall zum Rand hin (z. B. 0.5 = halber Schaden am Rand).
  • Salven und Streuung – burst, burstrate, sprayangle.
  • Zweiphasige Waffen – twophase, weapontype2, flighttime für Projektile im Starburst-Stil.
  • Darstellungstyp – rendertype=N wählt 3D-Modell, Bitmap mit Palette, Strahl usw.

Im Unterabschnitt [DAMAGE] stehen die Schadensmodifikatoren pro Zielkategorie:

[FLAMETHROWER] {
    ...
    [DAMAGE]
    {
        default=10;     // Damage applied to anything not listed
        corpyro=2;      // Pyros are nearly fire-proof
    }
}

Die Schlüssel in [DAMAGE] sind Einheitennamen: Eine aufgeführte Einheit erleidet diesen Schaden statt default=, jede andere Einheit erleidet default=. Die Werte werden auf 16 Bit beschränkt. Todesexplosionen (ExplodeAs, SelfDestructAs) verwenden dieselbe Tabelle – CORPYRO_BLAST richtet standardmäßig 60 Schaden an, bei einem Pyro aber nur 15.


category.tdf – Beschreibungen der Einheitenkategorien

Eine kosmetische flache Liste, die Kategorie-Tokens lesbarem Text zuordnet. Die Engine zeigt diese im Infopanel der Einheit an:

[Plant]      { description = Unit Creation plant; }
[KBOT]       { description = Some type of units; }
[Tank]       { description = Some type of units; }
[Metal]      { description = Some type of units; }

Die Striche anstelle von Beschreibungen sind unbeabsichtigter Standardtext von Cavedog. Die meisten Mods lassen diese Datei in Ruhe; manche ersetzen die Beschreibungen durch richtigen atmosphärischen Text. Änderungen daran wirken sich nicht auf das Spielgeschehen aus.


sound.tdf und allsound.tdf

Behandelt unter WAV / Sound. Zusammengefasst:

  • sound.tdf – Sound-Zuordnungen pro Einheitenkategorie (die Abschnitte [ARM_COM], [ARM_KBOT]). Referenziert über SoundCategory= in der FBI. Das Spiel liest 23 Ereignisse, jedes als KEY, dann KEY1, KEY2, … bis zur ersten fehlenden Nummer.
  • allsound.tdf – globale Sound-Zuordnungen der Oberfläche ([BIGBUTTON], [SKIRMISH], [BGM]).

Beispiel im Detail – eine Bewegungsklasse hinzufügen

So erstellst du eine Klasse „Boot, das sehr flaches Wasser durchqueren kann“:

  1. An gamedata/moveinfo.tdf anhängen:

    [CLASS20]
    {
        Name=AMPHIB3;
        FootprintX=3;
        FootprintZ=3;
        MaxWaterDepth=100;    // Deep water OK
        MaxSlope=20;          // Reasonable land climbing
        MaxWaterSlope=200;    // Smooth underwater movement
    }
  2. In der FBI deiner Einheit:

    MovementClass=AMPHIB3;

    Grundfläche und Grenzen der Klasse ersetzen die eigenen Werte der FBI, die Schlüssel FootprintX/FootprintZ/MaxWaterDepth der Einheit spielen also keine Rolle mehr.

  3. Packen:

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

Die Einheit bewegt sich jetzt nahtlos über Land und Wasser.

Note

Es werden immer nur [CLASS0] bis [CLASS31] gelesen. Eine Klasse in [CLASS32], [CLASS100] oder [HOVERXL] wird nie gefunden, und Einheiten, die sie nennen, fallen auf ihre eigenen FBI-Schlüssel zurück. Wähle einen freien Platz unter 32 (die Verkaufsversion verwendet CLASS0 bis CLASS14); ein zweiter Abschnitt mit demselben Platznamen wird ignoriert.


Typische Größen

Datei Beobachteter Bereich in Cavedogs gamedata/
sidedata.tdf ~50 KB
moveinfo.tdf ~3 KB (15–20 Klassen)
sound.tdf ~20 KB (über 300 Kategorien)
weapons.tdf ~2 KB (größtenteils Kommentare)
category.tdf ~1 KB
Andere Gamedata-Dateien < 5 KB pro Datei

Stolperfallen

Warning

Viele Gamedata-Dateien werden einmal beim Start der Engine geladen, nicht pro Karte. Um eine Änderung zu testen, musst du das Spiel neu starten – die Lobby neu zu laden reicht nicht. Darüber stolpern viele Modder, die glauben, ihre Änderung habe „nicht gegriffen“.

  • Die Plätze der Bewegungsklassen sind fest. Nur [CLASS0] bis [CLASS31] werden gelesen; Lücken in der Nummerierung innerhalb dieses Bereichs sind kein Problem.
  • Kommentare verwenden in den meisten Dateien //, nicht /*…*/ – aber weapons.tdf verwendet beides. Test-Parser tolerieren beides; manche Werkzeuge von Drittanbietern nicht.
  • Die HUD-Koordinaten in sidedata.tdf beziehen sich auf die Basis 640×480 und werden von der Engine für höhere Auflösungen hochskaliert. Schreibe keine Koordinaten in modernen Auflösungen.
  • Die Nummerierung in [CANBUILD] darf keine Lücken haben. Das Spiel hört beim ersten fehlenden canbuildN auf, die Liste einer Baueinheit zu lesen, canbuild11 gefolgt von canbuild14 verliert also den 14. Eintrag und jeden danach, ohne Fehlermeldung.
  • Eine MovementClass, die das Spiel nicht findet, ist kein Fehler. Die Einheit verwendet stillschweigend ihre eigenen FBI-Schlüssel, mit den Standardwerten des Spiels für fehlende – eine Einheit ohne MaxWaterDepth watet dann bis zu einer Tiefe von 10000.

Siehe auch

  • TDF – die Grammatik auf Parser-Ebene, die FBI/OTA teilen.
  • Sound – die Verdrahtung von sound.tdf und allsound.tdf.
  • FBI – Einheiten verweisen auf MovementClass, SoundCategory und Namen von Waffen-TDFs.
  • Glossar – movement class, footprint, side.