Cartes de TA: Kingdoms — .tnt + .ota + .crt + .kmp
Source : coreprime/kbot @ 0ab97bf · Modifier sur GitHub
Les cartes de TA: Kingdoms sont une variante du TNT (avec un autre mot IDVersion) accompagnée d'un ou deux fichiers de métadonnées, plus un format d'archive de campagne HPI v2 pour les missions solo. C'est nettement plus proche du modèle de carte de TA que ne le laissaient penser les anciennes notes de recherche sur les « BTM/BMP de hauteurs » : une vraie installation GoG de TA:K ne contient aucun
.btmni aucun BMP compagnon.Le lecteur HPI v2 existant de kbot gère les archives
.kmpde façon transparente. Le lecteur TNT de kbot reconnaît le mot de version de TA:K et décode l'en-tête, la carte des hauteurs par DataUnit, la grille de placage de textures (tables des noms de terrain et des offsets U/V), la grille de placement des éléments et sa table de noms, ainsi que la minicarte intégrée : de quoi rendre une carte complète en pleine résolution en composant les JPG de terrain externes et les sprites GAF des éléments. Cette page documente ce qui est vérifiable dans l'installation livrée, ainsi que les lacunes qui restent.
Important
Mise à jour (par rapport à la version « notes de recherche » d'origine de
cette page). Les types de fichiers dont cette page traitait auparavant —
.btm, BMP compagnons, PCX de palette par camp — ne sont en réalité pas
présents dans l'installation GoG de TA: Kingdoms. Les vrais types de
fichiers sont documentés ci-dessous. Pour comparer avec un autre projet open
source consacré à TA:K, voir
iiCompleteDestruction ;
son analyseur est plus complet que celui de kbot pour certaines structures
propres à TA:K.
Les fichiers qui composent une carte TA:K
Décompte sur le répertoire des cartes de l'installation GoG :
| Extension | Nombre | Rôle |
|---|---|---|
.kmp |
181 | Archive HPI v2 qui regroupe la carte, les scripts et les ressources d'une mission de campagne |
.tnt |
55 | Données de terrain de la carte (binaire de forme TNT avec un mot IDVersion propre à TA:K) |
.ota |
55 | Métadonnées de la carte — format TDF, même forme que le .ota de TA, avec des champs propres à TAK |
.txt |
55 | Description libre de la carte (quelques mots ; affichée dans le salon) |
.crt |
33 | Fichier compagnon de scénario : unités pré-placées, moteur de règles par joueur, zones de déclenchement nommées |
.tdf |
6 | Fichiers d'ajustement du gameplay propres à une carte (réglages de campagne, coups de pouce à l'IA) |
Une carte multijoueur typique est livrée sous forme de trio .tnt + .ota +
.txt, parfois accompagné d'un fichier compagnon .crt. Les missions de
campagne sont empaquetées dans des archives .kmp qui regroupent le même
ensemble avec les scripts de mission.
Tip
Lister le contenu d'une carte TA:K sans rien dépaqueter :
# The HPI v2 reader handles .kmp transparently
kbot hpi list /path/to/tak/maps/adamantine\ gate.kmp -v
kbot hpi info /path/to/tak/maps/adamantine\ gate.kmp
.tnt — terrain de TA:K (TNT v2)
TA:K reprend la structure TNT de TA mais incrémente le mot IDVersion.
Vidage hexadécimal de abnar's terrace.tnt :
00000000: 00 40 00 00 20 01 00 00 e0 00 00 00 3a 00 00 00 .@.. .......:...
00000010: 34 00 00 00 34 fc 00 00 34 f4 02 00 16 00 00 00 4...4...4.......
Le premier uint32 vaut 0x00004000, contre 0x00002000 dans le TNT de
TA. Le conteneur reste un en-tête suivi de sections adressées par pointeurs,
mais TA:K n'est pas du tout un format de mosaïque de tuiles. Là où TA
stocke une grille d'index de tuiles et une palette de graphismes de tuiles
32×32, TA:K stocke le terrain sous forme de grille de placage de textures
qui renvoie à des textures JPG externes, plus une carte des hauteurs
séparée et une grille de placement des éléments. Tout ce qui suit a été
vérifié sur les 55 cartes livrées :
Width/Heightcomptent des DataUnits de 16 px, pas des pixels. Une carte « 15 × 15 » commeathri caystockeWidth = Height = 480DataUnits →480 × 16 = 7680px de côté. La carte des hauteurs et la grille des éléments sont échantillonnées par DataUnit ; le terrain est échantillonné sur une grille plus grossière de Graphic Units de 32 px, exactement la moitié de la grille des DataUnits sur chaque axe (guW = Width/2).- L'en-tête est une suite de douze
uint32d'offsets et de nombres ; les noms de champs de TA n'en décrivent plus le contenu. Le tableau ci-dessous donne leur signification dans TA:K. - Les pointeurs de section sont absolus : chaque section se lit donc à partir de son propre pointeur et d'une longueur calculée.
| Offset | Champ TA:K | Taille de la section | Remarques |
|---|---|---|---|
0x00 |
Version |
— | 0x4000 (TA écrit 0x2000) |
0x04 |
Width |
— | en DataUnits ; ×16 → pixels, ÷2 → Graphic Units |
0x08 |
Height |
— | en DataUnits |
0x0C |
SeaLevel |
— | seuil de hauteur de l'eau |
0x10 |
HeightMapOffset |
Width × Height octets |
un octet de hauteur par DataUnit |
0x14 |
AttributesOffset |
Width × Height × 2 |
grille des éléments : un index uint16 par DataUnit (≥0xFF00 = aucun) |
0x18 |
FeatureNamesOffset |
Count × 132 |
table des noms d'éléments (index de 4 octets + nom de 128 octets) |
0x1C |
FeatureCount |
— | nombre de types d'éléments |
0x20 |
TerrainNamesOffset |
guW × guH × 4 |
nom de texture de chaque GU → terrain/%08x.jpg |
0x24 |
UMappingOffset |
guW × guH octets |
offset de colonne de chaque GU dans sa texture (×32 px) |
0x28 |
VMappingOffset |
guW × guH octets |
offset de ligne de chaque GU dans sa texture (×32 px) |
0x2C |
MiniMapOffset |
8 + 126×126 |
uint32 w, uint32 h, puis les index |
La carte des hauteurs (0x10) compte un octet par DataUnit — un champ
d'altitudes en niveaux de gris, pas une image en couleurs. Le terrain
est reconstruit par placage de textures : pour chaque Graphic Unit, la table
des noms de terrain (0x20) donne un fichier de texture
(terrain/<name>.jpg, le nom étant écrit en hexadécimal minuscule sur 8
chiffres), et les tables U/V (0x24/0x28) donnent la sous-tuile 32×32 à
copier depuis ce JPG en (u×32, v×32). La grille des éléments (0x14)
est la couche de placement : un tableau Width × Height de uint16, dont
chaque case est soit l'index d'un élément dans la table des noms, soit une
sentinelle haute (≥0xFF00) qui signifie « aucun élément ici » ; la case
DataUnit (x, y) d'un placement correspond au pixel de terrain
(x×16, y×16). La table des noms (0x18) utilise la même disposition
d'entrée de 132 octets que la table TileAnim de TA.
Le bloc de la minicarte fait toujours 126 × 126 dans tout le corpus livré
et utilise le même octet de vide 0x64 que TA pour le remplissage autour
des cartes non carrées.
Note
Ce qui fonctionne aujourd'hui sur les TNT de TA:K. kbot tnt describe
affiche l'en-tête, le royaume, les dimensions de la carte des hauteurs et du
terrain, et la répartition des éléments. kbot tnt preview --vfs <root>
rend le terrain texturé en pleine résolution et compose par-dessus le
sprite GAF de chaque élément, ancré à son point chaud : la carte complète
telle que le jeu la dessine. kbot tnt image rend la carte des hauteurs en
niveaux de gris, qui se suffit à elle-même (aucune texture externe
nécessaire ; --features superpose des marqueurs colorés par catégorie).
kbot tnt minimap exporte l'aperçu intégré de 126 × 126.
Palette de la minicarte — une par royaume
TA:K ne colore pas sa minicarte avec une palette globale unique. Chaque
carte a son aperçu 126 × 126 précalculé avec la palette de textures du
royaume auquel elle appartient — le champ kingdom= du .ota voisin
(aramon / taros / veruna / zhon / creon). Rendre les mêmes index
avec la palette d'un autre royaume (ou avec le PALETTE.PAL de TA) produit un
bruit moucheté ; avec la bonne palette, on obtient une eau, des plages et un
terrain naturels.
kbot tnt minimap déduit automatiquement le royaume du .ota voisin. Quand le
.ota est absent (par ex. un .tnt libre), passez --kingdom <name>
explicitement :
kbot tnt minimap "athri cay.tnt" -t mini.png # auto: veruna
kbot tnt minimap loose.tnt --kingdom aramon -t mini.png
.ota — métadonnées de carte (TDF, en terrain connu pour l'essentiel)
Le .ota de TA:K a la même forme TDF que celui de TA, avec plusieurs champs
propres à TAK. Fichier complet de abnar's terrace.ota :
[GlobalHeader]
{
Copyright=Copyright 1998 Cavedog Entertainment. All rights reserved.;
missionname=Abnar's Terrace;
missiondescription=9 x 7 4 Player 32MB;
kingdom=veruna; // ← TA:K-specific: the side the map "belongs" to
numplayers=4;
size=9 x 7; // ← TA:K-specific: free-text size for the lobby
memory=32 MB; // ← TA:K-specific: ~RAM requirement for the lobby
hasscenario=0;
[Map Data]
{
Type=Network 1;
aiprofile=DEFAULT;
[specials]
{
[special0] { specialwhat=StartPos1; XPos=37; ZPos=190; }
[special1] { specialwhat=StartPos2; XPos=215; ZPos=38; }
…
}
}
}
| Champ | Équivalent TA | Remarques |
|---|---|---|
kingdom= |
aucun | Affinité de camp (aramon / taros / veruna / zhon / creon). Le salon filtre selon ce champ ; il choisit aussi la palette de terrain et de minicarte avec laquelle l'aperçu précalculé du .tnt est coloré. |
size= |
aucun | Taille de la carte, lisible par un humain, pour le salon. |
memory= |
aucun | Mémoire vive conseillée. Cosmétique. |
hasscenario= |
aucun | 1 pour les missions de campagne, 0 pour les cartes d'escarmouche. |
[Map Data] |
[Schema N] |
Fait correspondre la sous-section de schéma à un bloc unique (TA:K ne livre jamais qu'un seul schéma par carte). |
Tout le reste (StartPos1..N, aiprofile=, etc.) fonctionne exactement comme
dans TA : la visionneuse OTA de kbot mount gère les deux sans modification.
.kmp — archives HPI v2 des missions de campagne
Un .kmp est une archive HPI v2 renommée. Début
de adamantine gate.kmp en hexadécimal :
00000000: 48 41 50 49 00 00 02 00 57 32 02 00 77 00 00 00 HAPI....W2..w...
00000010: 15 32 02 00 42 00 00 00 20 00 00 00 00 00 00 00 .2..B... .......
00000020: 53 51 53 48 … SQSH…
C'est exactement la forme d'en-tête v2 (marqueur HAPI → version 0x00020000 →
en-tête v2 de 24 octets → chunks SQSH). kbot hpi list, info et extract
fonctionnent tous directement. Un .kmp contient en général :
- Le
.tntet le.otade la mission - Quelques GAF de cinématiques et de briefing
- Des fichiers COB de script de mission — TA:K réutilise le format COB
(
VersionSignature == 6) pour les scripts de mission, au lieu d'un langage de script distinct. Les 3 885 occurrences de l'opcodeMISSION_COMMAND(0x10073000) dans l'installation d'origine de TAK se trouvent ici. Voir TA: Kingdoms — écarts du COB v6 et l'annexe C de cob.md pour le format binaire et le pool de chaînes de noms de sons propre à chaque COB, dans lequel les commandes de mission puisent par index. - Parfois, des remplacements d'unités propres à la mission
.crt — script de scénario (unités, règles, déclencheurs)
Un .crt porte la couche scriptée d'une carte : les unités placées avant le
début de la partie, le moteur de règles par joueur qui pilote l'IA
d'escarmouche et les objectifs de campagne, et les zones de déclenchement
rectangulaires nommées auxquelles ces règles font référence. Les cartes
multijoueur livrent un squelette vide (aucune unité, neuf emplacements de
joueur vides, aucun déclencheur, 56 octets) ; les cartes de campagne et les
cartes spéciales remplissent chaque section, jusqu'à ~120 Ko.
Tout le fichier est en little-endian et constitue une image directe des structures en mémoire du moteur : les enregistrements d'unités contiennent donc plusieurs champs de remplissage non initialisés.
En-tête
| Offset | Type | Champ | Remarques |
|---|---|---|---|
0x00 |
uint32 |
Signature | 0x3F800000 — marqueur IEEE-754 1.0f |
0x04 |
uint32 |
Unknown1 | 0 sur toutes les cartes livrées sauf une |
0x08 |
uint32 |
UnitCount | nombre d'enregistrements d'unités placées qui suivent |
abnar's terrace.crt (un squelette vide) commence ainsi :
00000000: 00 00 80 3f 00 00 00 00 00 00 00 00 09 00 00 00
1.0f, Unknown1 = 0, UnitCount = 0, puis le nombre de joueurs 9.
Enregistrements d'unités (568 octets chacun)
| Offset | Type | Champ |
|---|---|---|
+0 |
char[256] |
UnitType (terminé par NUL) |
+256 |
char[256] |
UniqueName (vide en général) |
+512 |
uint32 |
X (monde) |
+516 |
uint32 |
Y (axe des hauteurs) |
+520 |
uint32 |
Z (monde) |
+524 |
uint32 |
PlayerId (à partir de 0) |
+528 |
uint32 |
HealthPercent (100 en général) |
+532 |
uint32 |
ArmorPercent (100 en général) |
+536 |
uint32 |
WeaponPercent (100 en général) |
+540 |
uint32 |
Angle (180 en général) |
+544 |
uint32 |
Veteran |
+548 |
uint32 |
inconnu |
+552 |
uint32 |
inconnu |
+556 |
uint32 |
FootprintX |
+560 |
uint32 |
FootprintZ |
+564 |
uint32 |
inconnu |
Joueurs, règles, conditions, actions
Après les unités, un uint32 donnant le nombre de joueurs (toujours 9)
précède autant de blocs de joueur. Chaque bloc de joueur est un nombre de
règles uint32 suivi d'autant de règles. Une règle se compose de :
- un nombre de conditions
uint32, puis les conditions, chacune formée d'un opcodeuint32et de cinq emplacements d'argument de 64 octets ; - un nombre d'actions
uint32, puis les actions, chacune formée d'un opcodeuint32et de cinq emplacements d'argument de 64 octets.
Déclencheurs
Un nombre de déclencheurs uint32, en fin de fichier, précède autant
d'enregistrements de déclencheur. Chacun est un nom de 256 octets terminé par
NUL, suivi de quatre bornes uint32 — Left, Top, Right, Bottom — en
cases de carte. Les noms sont lisibles par un humain (The Hill, Player 1).
Outils
kbot crt describe <map.crt> affiche la répartition par type d'unité, le
nombre de règles et les zones de déclenchement ; ajoutez --verbose pour la
liste complète des placements. L'outil MCP crt_describe renvoie les mêmes
données en JSON.
Un fichier — cairbray coast landing.crt — a un en-tête décalé, modifié à la
main, qui ne correspond pas à cette disposition ; l'analyseur le rejette avec
une erreur claire plutôt que de le décoder de travers.
.txt — description libre
Une chaîne ASCII d'une ligne, utilisée dans le salon. Par ex.
abnar's terrace.txt : 9 x 7 4 Player 32MB (la même chaîne que le
missiondescription du .ota). Les outils de création écrivaient
probablement les deux lors de l'export ; le jeu semble afficher la valeur du
.ota.
Travailler avec les cartes TA:K aujourd'hui
Options pratiques, par ordre d'effort croissant :
- Inspecter librement —
kbot hpi list/info/extractfonctionne d'emblée sur les fichiers.kmp..otaet.txtsont du texte brut. - Décrire une carte —
kbot tnt describe <map.tnt>affiche l'en-tête TA:K, le royaume, les dimensions de la carte des hauteurs et du terrain, et une répartition des éléments. - Rendre une minicarte —
kbot tnt minimap <map.tnt> -t mini.pngexporte l'aperçu intégré de 126 × 126 en truecolor, en choisissant automatiquement la palette du royaume d'après le.otavoisin (à forcer avec--kingdom; voir la note sur la palette plus haut). - Rendre la carte texturée complète —
kbot tnt preview <map.tnt> --vfs <flattened-tak-root> -t map.pngplaque sur le terrain les texturesterrain/*.jpgde l'installation et compose le sprite GAF de chaque élément, ce qui produit la carte telle que le jeu la rend (athri cay → 7 680 × 7 680). La palette des sprites d'éléments est lue danspalettes/<kingdom>_features.pcx. - Rendre la carte des hauteurs —
kbot tnt image <map.tnt> -t height.pngn'a besoin d'aucune ressource externe ; il produit la carte des hauteurs par DataUnit en niveaux de gris (--featuressuperpose des marqueurs de placement colorés par catégorie). - Réempaqueter une archive de campagne —
kbot hpi packne produit aujourd'hui que du v1 : un.kmpréempaqueté ne se chargerait donc pas. Pour modifier un.kmpà la main, extrayez-le, modifiez les fichiers libres et utilisez un empaqueteur tiers qui gère le v2, en attendant que kbot sache écrire le v2.
Warning
TA: Kingdoms exige -disablecavedogverification pour charger la plupart
des fichiers modifiés, y compris les cartes modifiées. Sans cette option, le
moteur rejette tout fichier dont l'empreinte ne figure pas sur sa liste
d'autorisation. Indiquez-le dans les instructions d'installation de tout
mod.
Ce que kbot sait faire, ou pas encore, avec les cartes TA:K
| Opération | État |
|---|---|
Lire les en-têtes et la liste de fichiers d'un .kmp (HPI v2) |
✅ |
Extraire des fichiers d'un .kmp |
✅ |
Analyser un .ota (format TDF) |
✅ |
Lire l'en-tête d'un .tnt de TA:K (kbot tnt describe) |
✅ |
Exporter la minicarte d'un .tnt de TA:K (kbot tnt minimap) |
✅ (truecolor — palette du royaume tirée du .ota) |
Rendre une carte TA:K texturée complète (kbot tnt preview --vfs) |
✅ (terrain texturé + sprites GAF des éléments) |
Rendre la carte des hauteurs d'une carte TA:K (kbot tnt image) |
✅ (niveaux de gris, autonome ; --features superpose des marqueurs) |
Écrire un .tnt de TA:K (kbot tnt pack) |
❌ |
Écrire un .kmp (empaquetage HPI v2) |
❌ |
Les pull requests sont les bienvenues sur chacun des points ❌. La carte des
hauteurs, la grille de placage de textures, la grille des éléments et la table
des éléments étant toutes décodées, le terrain et les éléments s'affichent en
pleine résolution ; il reste le chemin d'écriture, pour l'aller-retour des
cartes TA:K modifiées, et l'empaquetage des .kmp v2.
Voir aussi
- HPI — le conteneur d'archive v2 (un
.kmpest un HPI v2 dont l'extension a été renommée). - TNT — le format TNT de TA ; TA:K en reprend la structure avec un IDVersion
0x4000. - TDF — le format selon lequel
.otaest analysé. - GAF — les fichiers d'animation
.tafutilisés partout dans TA:K (cinématiques dans les archives.kmp). - Interface de TA: Kingdoms — le format des widgets des menus et de l'interface (HUD).
- Glossaire — camp, carte des hauteurs.