TDF di gamedata — Tabelle di configurazione del motore
I file in
gamedata/sono file di testo TDF che configurano il motore stesso: classi di movimento, categorie di danno delle armi, dati delle fazioni (disposizione dell'interfaccia, menu di costruzione, unità iniziali), associazioni dei suoni e una manciata di piccole tabelle di ricerca. Le mod che cambiano le regole del gioco (anziché aggiungere unità) stanno quasi sempre qui.
Questa pagina documenta i file di gamedata più utili. Usano tutti la grammatica TDF in stile INI: vedi TDF per i dettagli a livello di parser.
Tip
Provalo tu stesso.
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]
I file in breve
| File | Che cosa controlla |
|---|---|
sidedata.tdf |
Disposizione dell'interfaccia per fazione, comandante iniziale, menu di costruzione. Il file più grande di gamedata/. |
moveinfo.tdf |
Classi di movimento: quale terreno può attraversare ciascuna "MovementClass". |
weapons.tdf |
Documento di riferimento sulla grammatica dei TDF delle armi (per lo più commenti: non è una tabella usata durante il gioco). |
category.tdf |
Descrizioni leggibili delle categorie di unità. Puramente estetico. |
sound.tdf |
Categorie di suoni per unità (richiamate da SoundCategory= nell'FBI). |
allsound.tdf |
Suoni dell'interfaccia e degli eventi di gioco (clic sui pulsanti, segnali della barra del punteggio, musica di sottofondo). |
los.tdf |
Regolazione della linea di vista (modificatori del raggio visivo per terreno). |
meteor.tdf |
Parametri delle tempeste di asteroidi (usati da alcune mappe della campagna). |
unitview.tdf |
Disposizione del pannello informativo dell'unità durante il gioco. |
buildinfo.tdf |
Tasti rapidi e testi dei tooltip del menu di costruzione. |
version.tdf |
Stringa della versione del gioco riportata nella lobby. |
translate.tdf |
Tabella di localizzazione per le stringhe dell'interfaccia. |
help.tdf |
Voci del sistema di aiuto nel gioco. |
I tre file più importanti per il modding sono sidedata.tdf (menu di
costruzione, fazioni), moveinfo.tdf (classi di movimento) e
weapons.tdf (che è documentazione, non dati: le armi vere e proprie
stanno in weapons/*.tdf).
moveinfo.tdf — Classi di movimento
L'FBI di un'unità dichiara la sua MovementClass=KBOTSS2 (o
simile); il motore cerca quella classe in moveinfo.tdf per decidere quale
terreno l'unità può attraversare.
TA 3.1c legge solo le sezioni da [CLASS0] a [CLASS31] (la prima sezione
con ciascuno di quei nomi) e trova una classe tramite il suo Name=,
ignorando maiuscole e minuscole, a partire dallo slot più basso. Quando la
classe dell'unità si risolve, i valori della classe sostituiscono
completamente le chiavi FootprintX/FootprintZ, MaxWaterDepth,
MinWaterDepth e di pendenza dell'unità stessa (il MaxSlope=20 del
comandante cede il posto al 32 di TANKDS2), e una chiave che la classe
omette prende il valore predefinito del gioco indicato più sotto, non il
valore dell'FBI. Un'unità senza classe, o che ne nomina una che il gioco non
trova, legge le proprie chiavi dell'FBI con gli stessi valori predefiniti. I
metadati delle unità, la sandbox e le partite ospitate di KBot Studio
risolvono il movimento in questo modo.
[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;
}
Campi
| Campo | Tipo | Significato |
|---|---|---|
Name |
string | Identificatore della classe richiamato da MovementClass= negli FBI delle unità. Non distingue tra maiuscole e minuscole. |
FootprintX, FootprintZ |
int | Ingombro per la ricerca del percorso, in celle di attributo da 16 px. Sostituisce l'ingombro dell'FBI dell'unità; 0 quando la classe lo omette. |
MaxWaterDepth |
int | Acqua più profonda (in unità di altezza del terreno) in cui l'unità può entrare. 0 = solo terraferma. Predefinito 10000 (qualsiasi profondità): le classi degli hovercraft lo omettono, quindi un hovercraft si muove su qualsiasi acqua, qualunque cosa dica il suo FBI. |
MinWaterDepth |
int | Profondità minima dell'acqua richiesta (navi, sottomarini). Predefinito -10000 (nessun minimo). |
MaxSlope |
int | Pendenza più ripida che l'unità può affrontare sulla terraferma (unità = 2π / 256 radianti). Predefinito 255; limitato da MaxWaterSlope. |
BadSlope |
int | Pendenza alla quale l'unità si muove a velocità ridotta (più lenta ma non bloccata). Predefinito: metà di MaxSlope; limitato da MaxSlope. |
MaxWaterSlope |
int | Come MaxSlope, applicato sott'acqua. Predefinito 255 (nessun limite, usato per gli hovercraft). |
BadWaterSlope |
int | Equivalente subacqueo di BadSlope; predefinito: metà di MaxWaterSlope. |
Convenzioni sui nomi
Il nome della classe ne codifica la forma in una breve sigla, secondo la convenzione di Cavedog:
| Prefisso | Significato |
|---|---|
KBOT |
Kbot bipede |
TANK |
Veicolo cingolato o su ruote |
BOAT |
Imbarcazione di superficie |
SPID |
Ragno / camminatore con molte zampe |
HOVER |
Hovercraft |
Segue un suffisso SS / SF / DS / DH / SH (piccolo/profondo/pesante/
ecc.) e una cifra per l'ingombro. I nomi sono solo una convenzione: il
motore tratta Name= come una chiave opaca.
Important
Due unità con la stessa MovementClass= condividono il comportamento di
ricerca del percorso (pathfinding). Se cambi KBOTSS2 in
MaxWaterDepth=50, ogni piccolo kbot ora guada l'acqua. Se vuoi una
regolazione per singola unità, aggiungi invece una nuova classe.
sidedata.tdf — Configurazione per fazione
È il file più lungo di gamedata/ perché riunisce tre aspetti distinti:
- Dichiarazioni delle fazioni: nome, prefisso, comandante, font, colori.
- Disposizione dell'HUD: coordinate in pixel di ogni barra di stato, etichetta e pulsante dell'interfaccia di gioco.
- Menu di costruzione: la sezione
[CANBUILD], che elenca ciò che ogni costruttore può costruire.
Blocco della fazione
[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; ... }
| Campo | Significato |
|---|---|
name |
Nome visualizzato della fazione (usato anche per l'associazione con le categorie). |
nameprefix |
Prefisso di stringa aggiunto alle ricerche di localizzazione. |
commander |
UnitName dell'unità comandante della fazione. |
intgaf |
Sequenza GAF mostrata durante la scelta della fazione. |
font / fontgui |
File FNT per il testo dell'HUD e per i pulsanti. |
energycolor / metalcolor |
Indici della palette per le barre dell'HUD (indici di palette.pal). |
TA 3.1c legge le fazioni [SIDE0], [SIDE1], … in ordine, fermandosi al
primo numero mancante e comunque dopo cinque. Una sezione con qualsiasi altro
nome ([SIDE01], un [SIDE3] dopo un [SIDE2] mancante, una sesta fazione)
non viene mai letta, e ogni fazione letta ha bisogno di tutti i rettangoli
dell'HUD qui sotto (ta.SideRectangles di kbot-io), altrimenti il gioco non
carica nessuna fazione. Il selettore di fazione della sandbox dello studio
offre le stesse fazioni.
Sottosezioni delle coordinate dell'HUD
Ogni elemento visibile dell'HUD è un blocco [NAME] con coordinate in pixel
x1/y1/x2/y2. Sono relative alla risoluzione di base 640×480; alle modalità
più alte le scala il motore.
[ENERGYBAR] { x1=471; y1=12; x2=598; y2=14; }
Per riposizionare la barra dell'energia, modifica i quattro numeri. Per
cambiarne l'aspetto, sostituisci il GAF che l'HUD usa per disegnare in quella
posizione (impostato in unitview.tdf).
Menu di costruzione [CANBUILD]
La definizione statica del menu di costruzione. Ogni costruttore elenca ciò che può costruire all'inizio della partita:
[CANBUILD]
{
[ARMCOM]
{
canbuild1=ARMSOLAR; // Slot 1 on the build menu
canbuild2=ARMWIN;
canbuild3=ARMESTOR;
canbuild4=ARMMSTOR;
canbuild5=ARMMEX;
...
}
[ARMLAB]
{
canbuild1=ARMCK;
canbuild2=ARMPW;
...
}
}
Il numero dello slot è la posizione nella pagina del menu di costruzione. Il
menu di costruzione di TA è una griglia di 2 colonne × 3 righe, quindi
ogni pagina contiene 6 slot: da canbuild1 a canbuild6 è la pagina 1,
da canbuild7 a canbuild12 la pagina 2, e così via.
Come TA 3.1c legge la tabella (CanBuildBuilder.BuildList di kbot-io;
kbot document, il visualizzatore di unità e il menu di costruzione della
sandbox lo seguono):
- Ottiene una lista solo un'unità il cui FBI imposta
Builder=1; una sottosezione per qualsiasi altra unità viene ignorata. - Il gioco legge la prima sezione
[CANBUILD]e, al suo interno, la prima sottosezione che porta il nome del costruttore (ignorando maiuscole e minuscole). - Legge
canbuild1,canbuild2, … e si ferma al primo numero mancante:canbuild1=ARMSOLAR; canbuild3=ARMLAB;dà una sola voce. - Un nome che non corrisponde a nessuna unità viene saltato, e una lista contiene al massimo 30 unità. Le voci di download (vedi sotto) possono portare il menu di un costruttore a 31. (La documentazione più vecchia sosteneva a volte che ci fossero 12 slot per pagina; la griglia reale nel gioco è di 6.) Vedi il riferimento all'albero di costruzione di TA per la disposizione pagina per pagina di ogni costruttore del gioco base.
Important
Per le mod, NON modificare sidedata.tdf per aggiungere unità. Lo
schema approvato da Cavedog per aggiungere un'unità al menu di costruzione
è distribuire un file download/<UNITNAME>.tdf insieme al resto della mod:
all'avvio il motore fonde ogni download/*.tdf sopra la tabella statica
[CANBUILD] di sidedata.tdf.
Modificare sidedata.tdf è appropriato solo se distribuisci una total
conversion che riscrive l'intera disposizione dell'HUD e del menu di
costruzione. Persino l'espansione Core Contingency di Cavedog aggiunge le
sue nuove unità tramite download/*.tdf, non modificando sidedata.tdf.
Vedi TDF: [MENUENTRY]
e il tutorial sul modding.
weapons.tdf — Riferimento dei TDF delle armi
Nonostante il nome, gamedata/weapons.tdf è composto per lo più da
commenti: è il riferimento pubblicato da Cavedog per la grammatica dei TDF
delle armi, e il gioco non lo carica mai. Le definizioni effettive delle armi
stanno in weapons/*.tdf, una sezione per arma (vedi TDF).
kbot document non elenca come armi le sezioni di gamedata/weapons.tdf.
La tabella delle armi
TA 3.1c costruisce una tabella di 256 slot per le armi a partire dai file
.tdf che si trovano direttamente in weapons/ (non nelle sue
sottodirectory), nell'ordine in cui li elenca:
- Una sezione va nello slot indicato dal suo
ID=, da0a255. Una sezione senzaID, o con un ID fuori da quell'intervallo, viene saltata. - Una sezione successiva con lo stesso
ID(nello stesso file o in uno successivo) sostituisce quella precedente. Weapon1/Weapon2/Weapon3,ExplodeAseSelfDestructAsdi un'unità nominano una sezione; il nome (ignorando maiuscole e minuscole) si risolve nello slot più basso che contiene una sezione con quel nome.- I valori vengono letti come prefissi numerici:
weaponacceleration=13O;vale 13, e un valore non valido non fa mai scartare il resto del file. - Una struttura rotta fa rifiutare al gioco l'intero file, quindi nessuna
delle sue armi viene caricata, comprese le sezioni che precedono l'errore:
un'intestazione di sezione senza
]o senza{, testo senza=o un valore senza;prima della fine del file, il file che termina all'interno di una sezione, oppure un file vuoto. Gli altri file non ne risentono. (Una}isolata fuori da qualsiasi sezione non viene rifiutata: il gioco smette di leggere in quel punto e conserva ciò che c'era prima.) - Un
rangemancante vale32767; unminbarrelanglemancante vale-11.25gradi;reloadtimesi conta in tick interi (30 al secondo,reloadtime*30troncato:0.35ricarica dopo 10 tick, 0,333 s);turnrateè in unità angolari al secondo (65536 = un giro completo).
KBot Studio, i pacchetti e kbot host risolvono tutti le armi tramite questa
tabella. I file che il gioco rifiuta e le sezioni che salta o sostituisce
vengono segnalati come avvisi
(kbot pack li stampa; lo studio li fornisce su
/api/studio/weapons/warnings).
Sprite di rendertype=4
Un'arma con rendertype=4 fa volare uno sprite 2D preso da anims/fx.gaf,
e il suo color= sceglie quale: 0 cannonshell, 1 plasmasm, 2
plasmamd, 3 ultrashell, 4 di nuovo plasmasm; qualsiasi altro valore (come
il color=255 di EARTHQUAKE) non disegna alcuno sprite. Lo sprite avanza di
un frame per tick di gioco dal momento in cui parte il colpo, qualunque siano
le durate riportate dai frame del GAF.
I commenti di riferimento documentano:
- Tre archetipi di arma:
ballistic,lineofsight,dropped. Ogni TDF di un'arma deve impostarne uno a1. - Gittata, velocità, accelerazione: in pixel e pixel/secondo.
- Area d'effetto: raggio in pixel, con
edgeeffectivenesscome frazione di attenuazione (ad es.0.5= metà del danno sul bordo). - Raffica e dispersione:
burst,burstrate,sprayangle. - Armi a due fasi:
twophase,weapontype2,flighttimeper i proiettili in stile starburst. - Tipo di rendering:
rendertype=Nsceglie tra modello 3D, bitmap con palette, raggio, ecc.
La sottosezione [DAMAGE] è dove si trovano i modificatori del danno per
categoria di bersaglio:
[FLAMETHROWER] {
...
[DAMAGE]
{
default=10; // Damage applied to anything not listed
corpyro=2; // Pyros are nearly fire-proof
}
}
Le chiavi in [DAMAGE] sono nomi di unità: un'unità elencata subisce quel
danno invece di default=, ogni altra unità subisce default=. I valori sono
limitati a 16 bit. Le esplosioni alla morte (ExplodeAs, SelfDestructAs)
usano la stessa tabella: CORPYRO_BLAST infligge 60 per impostazione
predefinita, ma 15 a un Pyro.
category.tdf — Descrizioni delle categorie di unità
Una lista piatta, puramente estetica, che associa i token delle categorie a un testo leggibile. Il motore li mostra nel pannello informativo dell'unità:
[Plant] { description = Unit Creation plant; }
[KBOT] { description = Some type of units; }
[Tank] { description = Some type of units; }
[Metal] { description = Some type of units; }
I trattini al posto delle descrizioni sono testo di riempimento lasciato involontariamente da Cavedog. La maggior parte delle mod non tocca questo file; alcune sostituiscono le descrizioni con testi descrittivi veri e propri. Modificarlo non influisce sul gameplay.
sound.tdf e allsound.tdf
Trattati in WAV / Audio. In sintesi:
sound.tdf: associazioni dei suoni per categoria di unità (le sezioni[ARM_COM],[ARM_KBOT]). Richiamato daSoundCategory=nell'FBI. Il gioco legge 23 eventi, ciascuno comeKEYe poiKEY1,KEY2, … fino al primo numero mancante.allsound.tdf: associazioni globali dei suoni dell'interfaccia ([BIGBUTTON],[SKIRMISH],[BGM]).
Esempio svolto — aggiungere una classe di movimento
Per creare una classe "nave che può guadare acque molto basse":
Aggiungi in fondo a
gamedata/moveinfo.tdf:[CLASS20] { Name=AMPHIB3; FootprintX=3; FootprintZ=3; MaxWaterDepth=100; // Deep water OK MaxSlope=20; // Reasonable land climbing MaxWaterSlope=200; // Smooth underwater movement }Nell'FBI della tua unità:
MovementClass=AMPHIB3;L'ingombro e i limiti della classe sostituiscono quelli dell'FBI, quindi le chiavi
FootprintX/FootprintZ/MaxWaterDepthdell'unità non contano più.Impacchetta:
kbot hpi pack ./mymod --target mymod.ufo
Ora l'unità attraverserà senza interruzioni sia la terraferma sia l'acqua.
Note
Vengono lette solo le sezioni da [CLASS0] a [CLASS31]. Una classe
in [CLASS32], [CLASS100] o [HOVERXL] non viene mai trovata, e le
unità che la nominano ripiegano sulle proprie chiavi dell'FBI. Scegli uno
slot libero sotto il 32 (i file originali usano da CLASS0 a CLASS14);
una seconda sezione con lo stesso nome di slot viene ignorata.
Dimensioni tipiche
| File | Intervallo osservato nella gamedata/ di Cavedog |
|---|---|
sidedata.tdf |
~50 KB |
moveinfo.tdf |
~3 KB (15–20 classi) |
sound.tdf |
~20 KB (oltre 300 categorie) |
weapons.tdf |
~2 KB (per lo più commenti) |
category.tdf |
~1 KB |
| Altri file di gamedata | < 5 KB ciascuno |
Insidie
Warning
Molti file di gamedata vengono caricati una sola volta all'avvio del motore, non per ogni mappa. Per provare una modifica devi riavviare il gioco: ricaricare la lobby non basta. Questo coglie in fallo molti modder, convinti che la loro modifica "non abbia preso".
- Gli slot delle classi di movimento sono fissi. Vengono lette solo le
sezioni da
[CLASS0]a[CLASS31]; i buchi nella numerazione all'interno di quell'intervallo non sono un problema. - Nella maggior parte dei file i commenti usano
//, non/*…*/, maweapons.tdfli usa entrambi. I parser di test li tollerano entrambi; alcuni strumenti di terze parti no. - Le coordinate dell'HUD di
sidedata.tdfsi riferiscono alla base 640×480 e il motore le scala per le risoluzioni più alte. Non scrivere coordinate in risoluzioni moderne. - La numerazione di
[CANBUILD]non deve avere buchi. Il gioco smette di leggere la lista di un costruttore al primocanbuildNmancante, quindi uncanbuild11seguito dacanbuild14perde la quattordicesima voce e tutte quelle successive, senza alcun errore. - Una
MovementClassche il gioco non trova non è un errore. L'unità usa silenziosamente le proprie chiavi dell'FBI, con i valori predefiniti del gioco per quelle mancanti: un'unità senzaMaxWaterDepthguada allora fino a una profondità di 10000.