No edit summary |
No edit summary |
||
Line 4: | Line 4: | ||
<div style="text-align: center;"> | <div style="text-align: center;"> | ||
<div style="color: rgb(241, 196, 15) | <div style="color: rgb(241, 196, 15)">Cette section est en cours de rédaction.</div> | ||
<div style="color: rgb(241, 196, 15) | <div style="color: rgb(241, 196, 15)">Des recherches sont encore nécessaires et certains paragraphes peuvent être faux.</div> | ||
</div> | </div> | ||
Les fichiers | Les fichiers '''PZZ''' sont des dossiers d'archive. | ||
== Format == | == Format == | ||
Les PZZ se composent d'un header de 2048 | Les fichiers PZZ se composent d'un [[#Header|header]] de 2048 octets.<br> | ||
A la suite de ce [[#Header|header]] se trouvent les fichiers inscrit les uns à la suite des autres (Voir [[#note_format_1|note]]).<br> | |||
Ces fichiers peuvent être compressés ou non.<br> | |||
Un fichier pzz ne peut pas contenir plus de 511 fichiers (voir [[#Header|Header]]). | |||
Dans le cas de Gotcha Force les fichiers pzz sont arrangé en big endian. | |||
<div id="note_format_1"> | |||
Note: Chaque fichier est paddé avec des "\x00" pour avoir une taille correspondant a un multiple de 2048 octets. | |||
</div> | |||
=== Header === | === Header === | ||
Le | Le header est constitué de 512 entiers non signé de 32 bit (4 octets) (uint32). | ||
==== Format descripteur de fichier ==== | Le premier contient le nombre de fichiers total de l'archive. | ||
Le reste est une suite de [[#Format des descripteur de fichier|descripteur de fichiers]]. | |||
Note: La taille du header étant de 2048 octets et vu que chaque descripteur ou en-tête fait 4 octets, cela nous laisse 2048/4-1 descripteurs de fichiers, autrement dit, un PZZ ne peut pas contenir plus de 511 fichiers. | |||
==== Format des descripteur de fichier ==== | |||
Si on numérote les bits d'un descripteur de fichier de 0 (poids faible) à 31 (poids fort) : | Si on numérote les bits d'un descripteur de fichier de 0 (poids faible) à 31 (poids fort) : | ||
* Bit 31 - Inutilisé. | |||
* Bit 30 - Flag de compression : est à 1 si le fichier est compressé, 0 sinon. | |||
* Bit 0 à 29 (30 bits) - Taille du fichier divisée par 2048 (0x800). | |||
Autrement dit la taille maximale d'un fichier dans un pzz est de (2^30) * 2048.<br> | |||
Soit un maximum d'un peut plus de 2 To (2 199 023 255 552 octets). | |||
La taille d'un fichier (en octet) peut donc être calculé de la façon suivante : (descripteur_fichier & 0x3FFFFFFF) * 2048<br> | |||
Ici 0x3FFFFFFF est un masque permettant de récupérer 30 bits sur nos 32 bits de descripteur. | |||
Le flag de compression peut être récupéré de la même façon avec un masque différent : descripteur_fichier & 0x40000000. | |||
Pour mieux comprendre le format du descripteur de fichier, voici un exemple : | Pour mieux comprendre le format du descripteur de fichier, voici un exemple : | ||
Le premier fichier de l'archive fait | Le premier fichier de l'archive fait 12ko (12 288 octets) et il est compressé, son descripteur est alors (12288/0x800)+0x40000000 = 0x40000006. <br> | ||
La valeur du descripteur sera donc ``40 00 00 06`` juste à la suite du nombre de fichiers ou d'un autre descripteur. | |||
Le descripteur de fichier peut décrire un fichier vide.<br> | |||
Il correspondra alors à "00 00 00 00" mais sera compté dans le nombre de fichier au début du header. | |||
==== Padding des fichiers ==== | ==== Padding des fichiers ==== | ||
<span style="color: rgb(241, 196, 15);">Lors ce que le fichier à extraire du pzz n'est pas compressé, on a alors un padding présent à sa fin. Il devient alors impossible de déterminer quel padding enlever précisément. En effet, le fichier peut se terminer par des "00".</span> | <span style="color: rgb(241, 196, 15);">Lors ce que le fichier à extraire du pzz n'est pas compressé, on a alors un padding présent à sa fin. Il devient alors impossible de déterminer quel padding enlever précisément. En effet, le fichier peut se terminer par des "00".</span> | ||
=== Algorithme de compression === | === Algorithme de compression === | ||
Line 42: | Line 69: | ||
==== Fichiers et compression ==== | ==== Fichiers et compression ==== | ||
Tous les fichiers stxx.pzz -> 000 sont packés non compressés ainsi que les fichiers firstld.pzz -> 000, 001, 002 et 005. Les autres fichiers des pzz sont tous packés compressés. | Tous les fichiers stxx.pzz -> 000 sont packés non compressés ainsi que les fichiers firstld.pzz -> 000, 001, 002 et 005. Les autres fichiers des pzz sont tous packés compressés. | ||
==== Fichiers stxx.pzz (40) ==== | ==== Fichiers stxx.pzz (40) ==== | ||
Line 52: | Line 80: | ||
Les fichiers hits commencent par le magic number "STIH" soit HITS en big endian. | Les fichiers hits commencent par le magic number "STIH" soit HITS en big endian. | ||
==== Fichier gets.pzz ==== | ==== Fichier gets.pzz ==== | ||
Line 65: | Line 94: | ||
* 009 -> hit001.bin de l'afs_data | * 009 -> hit001.bin de l'afs_data | ||
* 010 -> hit002.bin de l'afs_data | * 010 -> hit002.bin de l'afs_data | ||
=== Fichier firstld.pzz === | === Fichier firstld.pzz === | ||
Line 74: | Line 104: | ||
* 005 -> mc_msg00.mdt de l'afs_data (à implémenter dans pzztool.py) | * 005 -> mc_msg00.mdt de l'afs_data (à implémenter dans pzztool.py) | ||
* 006 -> as_icon.tpl de l'afs_data (à implémenter dans pzztool.py) | * 006 -> as_icon.tpl de l'afs_data (à implémenter dans pzztool.py) | ||
=== Fichier efct.tpl === | === Fichier efct.tpl === | ||
Line 79: | Line 110: | ||
* 001 -> efct00_mdl.arc de l'afs_data | * 001 -> efct00_mdl.arc de l'afs_data | ||
* 002 -> efct01_mdl.arc de l'afs_data | * 002 -> efct01_mdl.arc de l'afs_data | ||
=== Fichier cmn_data.pzz === | === Fichier cmn_data.pzz === | ||
Line 85: | Line 117: | ||
* 002 -> dm0000mot.bin (à implémenter dans pzztool.py) | * 002 -> dm0000mot.bin (à implémenter dans pzztool.py) | ||
* 003 -> plcmndata.bin (à implémenter dans pzztool.py) | * 003 -> plcmndata.bin (à implémenter dans pzztool.py) | ||
== Logiciel == | == Logiciel == |
Revision as of 19:36, 25 July 2022
Cet article est pour les format de fichiers PZZ de Gotcha Force. Voir PZZ (Format de fichier) pour les autres versions de ce fichier.
Les fichiers PZZ sont des dossiers d'archive.
Format
Les fichiers PZZ se composent d'un header de 2048 octets.
A la suite de ce header se trouvent les fichiers inscrit les uns à la suite des autres (Voir note).
Ces fichiers peuvent être compressés ou non.
Un fichier pzz ne peut pas contenir plus de 511 fichiers (voir Header).
Dans le cas de Gotcha Force les fichiers pzz sont arrangé en big endian.
Note: Chaque fichier est paddé avec des "\x00" pour avoir une taille correspondant a un multiple de 2048 octets.
Header
Le header est constitué de 512 entiers non signé de 32 bit (4 octets) (uint32).
Le premier contient le nombre de fichiers total de l'archive. Le reste est une suite de descripteur de fichiers.
Note: La taille du header étant de 2048 octets et vu que chaque descripteur ou en-tête fait 4 octets, cela nous laisse 2048/4-1 descripteurs de fichiers, autrement dit, un PZZ ne peut pas contenir plus de 511 fichiers.
Format des descripteur de fichier
Si on numérote les bits d'un descripteur de fichier de 0 (poids faible) à 31 (poids fort) :
- Bit 31 - Inutilisé.
- Bit 30 - Flag de compression : est à 1 si le fichier est compressé, 0 sinon.
- Bit 0 à 29 (30 bits) - Taille du fichier divisée par 2048 (0x800).
Autrement dit la taille maximale d'un fichier dans un pzz est de (2^30) * 2048.
Soit un maximum d'un peut plus de 2 To (2 199 023 255 552 octets).
La taille d'un fichier (en octet) peut donc être calculé de la façon suivante : (descripteur_fichier & 0x3FFFFFFF) * 2048
Ici 0x3FFFFFFF est un masque permettant de récupérer 30 bits sur nos 32 bits de descripteur.
Le flag de compression peut être récupéré de la même façon avec un masque différent : descripteur_fichier & 0x40000000.
Pour mieux comprendre le format du descripteur de fichier, voici un exemple :
Le premier fichier de l'archive fait 12ko (12 288 octets) et il est compressé, son descripteur est alors (12288/0x800)+0x40000000 = 0x40000006.
La valeur du descripteur sera donc ``40 00 00 06`` juste à la suite du nombre de fichiers ou d'un autre descripteur.
Le descripteur de fichier peut décrire un fichier vide.
Il correspondra alors à "00 00 00 00" mais sera compté dans le nombre de fichier au début du header.
Padding des fichiers
Lors ce que le fichier à extraire du pzz n'est pas compressé, on a alors un padding présent à sa fin. Il devient alors impossible de déterminer quel padding enlever précisément. En effet, le fichier peut se terminer par des "00".
Algorithme de compression
L'algorithme de compression reste à déterminer.
Observations
Fichiers et compression
Tous les fichiers stxx.pzz -> 000 sont packés non compressés ainsi que les fichiers firstld.pzz -> 000, 001, 002 et 005. Les autres fichiers des pzz sont tous packés compressés.
Fichiers stxx.pzz (40)
- 001 -> fichier identique dans les fichiers hitxxx.bin
- 002 -> fichier identique dans les fichiers hitxxx.bin
- 003 -> fichier identique dans les fichiers hitxxx.bin
- 004 -> ?
Une même position peux correspondre à plusieurs fichiers hitxxx.bin à la fois. En effet, les fichiers hitxxx.bin peuvent être identiques les uns des autres.
Les fichiers hits commencent par le magic number "STIH" soit HITS en big endian.
Fichier gets.pzz
- 000 -> ?
- 001 -> ?
- 002 -> ?
- 003 -> ?
- 004 -> ?
- 005 -> ?
- 006 -> ?
- 007 -> ?
- 008 -> hit000.bin de l'afs_data
- 009 -> hit001.bin de l'afs_data
- 010 -> hit002.bin de l'afs_data
Fichier firstld.pzz
- 000 -> snd_com04.tsb (problème de padding car le fichier est unpack en "U")
- 001 -> snd_com04.chd (problème de padding car le fichier est unpack en "U")
- 002 -> ?
- 003 -> icon.bin de l'afs_data
- 004 -> ?
- 005 -> mc_msg00.mdt de l'afs_data (à implémenter dans pzztool.py)
- 006 -> as_icon.tpl de l'afs_data (à implémenter dans pzztool.py)
Fichier efct.tpl
- 000 -> efct00.tpl de l'afs_data
- 001 -> efct00_mdl.arc de l'afs_data
- 002 -> efct01_mdl.arc de l'afs_data
Fichier cmn_data.pzz
- 000 -> comhit.bin (à implémenter dans pzztool.py)
- 001 -> comhit2.bin (à implémenter dans pzztool.py)
- 002 -> dm0000mot.bin (à implémenter dans pzztool.py)
- 003 -> plcmndata.bin (à implémenter dans pzztool.py)
Logiciel
Virtual World RE a développé le script python pzztool.py permettant de manipuler les archives PZZ et leurs fichiers internes, en s'inspirant d'un script de manipulation pzz de PS2.