Toggle menu
Toggle personal menu
Not logged in
Your IP address will be publicly visible if you make any edits.

PZZ (Gotcha Force): Difference between revisions

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);">Cette section est en cours de rédaction.</div>
<div style="color: rgb(241, 196, 15)">Cette section est en cours de rédaction.</div>
<div style="color: rgb(241, 196, 15); text-align: center;">Des recherches sont encore nécessaires et certains paragraphes peuvent être faux.</div>
<div style="color: rgb(241, 196, 15)">Des recherches sont encore nécessaires et certains paragraphes peuvent être faux.</div>
</div>
</div>


Les fichiers&nbsp;'''PZZ''' sont des dossiers d'archive.
Les fichiers '''PZZ''' sont des dossiers d'archive.
 


== Format ==
== Format ==


Les PZZ se composent d'un header de 2048 octets, soit 0x800 octets. A la suite de ce header se trouvent les fichiers inscrit les uns à la suite des autres. Ces fichiers peuvent être compressés ou non.<br>
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 premier champ du header est un uint32 big endian contenant le nombre de fichiers total de l'archive. On retrouve après une suite de taille variable de descripteurs de fichiers au format uint32 big endian. Chaque fichier est paddé avec des "\x00" pour avoir une taille multiple de 0x800.
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).


* bit 31 - inutilisé,
Autrement dit la taille maximale d'un fichier dans un pzz est de (2^30) * 2048.<br>
* bit 30 - Flag de compression : est à 1 si le fichier est compressé, 0 sinon,
Soit un maximum d'un peut plus de 2 To (2 199 023 255 552 octets).
* bit 0 à 29 (30 bits) - taille du fichier divisée par 2048 (0x800),
 
taille_fichier (octets) = (descripteur_fichier & 0x3FFFFFFF) * 0x800<br>
La taille d'un fichier (en octet) peut donc être calculé de la façon suivante : (descripteur_fichier & 0x3FFFFFFF) * 2048<br>
bCompression = descripteur_fichier & 0x40000000
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 12288 octets et il est compressé, son descripteur est alors (12288/0x800)+0x40000000 = 0x40000006. On le stockera dans l'entête en big endian (40 00 00 06) juste à la suite du nombre de fichiers.
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.


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 ====
==== 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

← Gotcha Force

Cet article est pour les format de fichiers PZZ de Gotcha Force. Voir PZZ (Format de fichier) pour les autres versions de ce fichier.

Cette section est en cours de rédaction.
Des recherches sont encore nécessaires et certains paragraphes peuvent être faux.

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.

Catégorie:Format de fichier Catégorie:Gotcha Force