Toggle menu
Toggle personal menu
Not logged in
Your IP address will be publicly visible if you make any edits.
Revision as of 09:34, 7 September 2022 by Algoflash (talk | contribs)

← Gotcha Force

This article is about Gotcha Force PZZ file format and ongoing researchs on it. See PZZ (File format) for PZZ file format description.

This section is currently being written.
More research is needed and some paragraphs may be wrong.

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.