Alors, je vais te faire un petit détail de la structure du fichier, par contre je ne pourrais pas te dire avec certitude à quoi correspondent toutes les valeurs (certaines m'échappent pour le moment), et bien entendu, je peux éventuellement me tromper pour certaines (à voir sur le tas par la suite)
Mon analyse ne reste basée que sur les fichiers que tu m'as fourni, et je n'ai fait aucune vérification sur le jeu lui même, mais ça te donnera toujours un bon aperçu général et une bonne base de travail pour comprendre leur structure
Let's go!!
Note : Je prends le fichier le plus petit "npc.tr2" pour exemple, mais à priori c'est valable également pour tous les autres fichiers que tu as fourniTout d'abord, comme indiqué dans mon post précédent, ces fichiers sont des archives.
C'est à dire, un fichier conteneur qui embarque plusieurs sous fichiers.
Pour que ces sous fichiers puissent être facilement retrouvés dans le code du jeu, comme dans toute bonne archive, on trouve un index correspondant ou sont répertoriées diverses informations qui concernent les sous-fichiers.
C'est généralement de l'ordre de la taille de chacun, de l'adresse où les trouver, etc...
Dans ce type d'archive, l'index est inclus dans le fichier, il est même situé directement au début (assez classique dans le style bien que parfois un index peut être externe et se retrouver dans un autre fichier).
Il semble aussi qu'à la fin de l'archive, on trouve quelques datas
Index en rouge / Sous-fichiers en bleu / Data finales en vertDu coup on a là une structure pour chaque fichier qui donnera : Index + sous-fichier 1 + sous-fichier 2 + sous-fichier 3 , etc... + données finales
Faisons maintenant le détail de chaque partie :
IndexCe dernier se divise en 3 parties distinctes :
- Header (en jaune)
- Données des sous-fichiers (en rouge)
- Autres données (en bleu - je ne sais pas à quoi elles correspondent exactement)
Partie 1 : Le header
- En rouge => extension du fichier (.tr2)
- En violet => aucune idée, peut être une simple balise pour marquer quelque chose (on retrouve DF07 plusieurs fois à divers endroits)
- En vert => nom du fichier (sans extension) + padding (0x00)
- En bleu => taille du header
- En rose => nombre "de sous fichiers/d'entrées" indexées dans la partie 2
Partie 2 : Données des sous-fichiersChaque entrée pour chaque sous-fichier est sur 0x14 octets (cadres rouge, bleu, vert et orange, puisqu'on a ici 4 entrées comme indiqué en rose dans la partie précedente)
Et voici le détail des données contenues dans ces 0x14 octets :- 4 octets (jaune) => N° ID attribué au fichier (généralement il s'incrémente de 1 mais pas toujours)
- 4 octets (rouge) => Adresse (offset) ou se trouve le sous-fichier en question dans l'archive (en partant du début de l'archive)
- 4 octets (vert) => Taille des données dédiées à ce sous-fichier dans l'index (donc les 0x14 octets)
- 4 octets (bleu ciel) => Taille du sous-fichier en octets
- 4 octets (bleu foncé) => Taille du sous-fichier en octets (bis repetita)
Pour ce qui est des 2 bleu, dans les fichiers que tu as fourni ils sont toujours similaires, mais je dirais qu'il est possible que ce ne soit pas systématiquement le cas, pour exemple il pourrait peut être avoir quelques octets de différences entre les deux et dans ce cas l'un représenterait la taille réelle du fichier, et l'autre la taille + le padding ajouté pour la mise en forme dans le fichier (à voir sur le tas donc, c'est juste un exemple de la différence qu'il pourrait y avoir entre ces deux valeurs)Partie 3 : Autres donnéesIci c'est très simple, chaque entrée est sur 4 octets, et on a d'abord le nombre d'entrées, puis ensuite les entrées
- En rouge (sur "4 octets") => Nombre d'entrées dans la partie 3
- En bleu (sur "nb d'entrées * 4 octets") => Entrées
- En vert ( sur "0x0, 0x4, 0x8 ou 0xC octets") => Padding (de 0x00) pour la mise en forme du fichier
Je ne sais pas à quoi correspondent ces données mais elles s'incrémentent toujours (un peu comme dans une table de pointeurs), je ne pense pas pour le moment qu'il soit nécessaire d'y toucher de toute façon.
Toujours est-il que ces données semblent être liées aux pointeurs puisque le nombre d'entrées est similaire au nombre de pointeurs qu'on retrouvera dans chaque sous-fichier.Pour résumer un peu cet index, la seule partie qu'il sera nécessaire de modifier en cas d'extension de fichiers (ayant pour but d'ajouter de la place pour les textes traduits) sera situé dans la partie 2 : les tailles des sous-fichiers, et leurs adresses dans l'archive
Sous-fichiersLes sous-fichiers semblent tous fonctionner sur une même structure de base bien que certains contiennent du texte et d'autres des datas
On distingue 4 parties distinctes dans ces derniers- Header 1 (en jaune)
- Header 2 (en rouge)
- Table des pointeurs (en vert)
- Datas/textes (en bleu)
Note : la partie en blanc c'est juste du padding de mise en formePartie 1 : Header 1- Il fait 0x40 octets et ne contient que le nom du sous-fichier en question + du padding
- On retrouve aussi sur les 4 derniers octets, la balise DF07 qui etait présente dans le header de l'indexPartie 2 : Header 2- Là encore il est sur 0x40 octets
- Sur les 1ers octets, on trouve ce qui semble être à priori l'encodage (UTF-8, ASCII, etc ...), vient ensuite du padding, puis vers la fin des datas que je n'ai pas réussi à identifier (il y a peut être l'identifiant du fichier dans le lot)
- Reste les 4 derniers octets de cette partie qui eux sont le nombre de pointeurs (ou d'entrées dans la table des pointeurs), nombre correspondant au passage au "nombres d'entrées" qu'on a sur la partie 3 de l'index. Ce nombre restera le même dans tous les sous-fichiers d'une même archivePartie 3 : Table des pointeurs- Chaque pointeur est sur 4 octets (32 bits)
- Ils sont stockés en Little Endian (LE)
- Les adresses contenues dans cette table de pointeurs font référence à l'offset/adresse ou se trouve(nt) "le mot/la phrase/les datas" qui lui correspondent, sachant que le début du sous fichier est à considérer comme l'adresse (l'offset) 0x00Pour expliquer ça via un exemple, le 1er sous-fichier se trouve à l'adresse 0xE0 du fichier, si on considère que cette adresse est l'offset 0x00 du sous fichier et qu'on se rend à l'adresse 0xCC indiquée par notre 1er pointeur, on tombera sur notre 1er mot pointé.
Même chose pour notre 2ème pointeur qui indique l'adresse 0xD1, etc ...
Partie 4 : Mots/phrases/données- Ici c'est très simple, il s'agit du contenu pointé
- Généralement pour les mots ou encore les phrases, chaque entrée est terminée par un 0x00 (qui marque la fin). Pour les datas, ces 0x00 ne sont pas forcément présents.
- Sur les phrases toujours, comme très souvent, une valeur 0x0A marquera un retour à la ligne
- A la fin de cette partie, si nécessaire, on trouve quelques octets de padding pour conserver la mise en forme avant le prochain sous-fichier.Dans cette partie ou se trouvent les textes donc, chaque fois qu'une phrase sera plus longue ou plus courte, il faudra adapter les pointeurs qui suivront en conséquence des modifications appliquées

Pour exemple si on ajoute 3 octets à notre 1er mot correspondant au 1er pointeur, alors il faudra incrémenter le 2ème pointeur de 3 (donc 0xD1 => 0xD4) ainsi que tous ceux qui suivront dans la table.
Données finales- Ces dernières sont situées à la toute fin du fichier archive et semblent embarquer 3 pointeurs en 32 bits LE, suivi du nom du fichier archive, puis son extension (sans le point)Je ne sais pas trop à quoi correspondent les valeurs des pointeurs qu'on trouve ici.
Voilà, je pense en avoir fait le tour
Donc en gros, dans la théorie, pour appliquer des modifs sur ces fichiers, faut adapter les pointeurs en conséquences des modifications, et si les sous-fichiers contenant du texte sont étendus (ou rétrécis), il faudra adapter les tailles et adresses dans l'index de l'archive également

Toujours penser à conserver la mise en forme (en gros pour ça suffit d'utiliser du padding de 0x00 comme on trouve à la fin des sous-fichiers)
Si tu as des questions, n'hésite pas
