mirror of
https://github.com/Virtual-World-RE/NeoGF.git
synced 2024-11-15 10:45:33 +01:00
Update pzztool.py
CRITICAL - BUG FIX ON PACK
This commit is contained in:
parent
6365cb205a
commit
2b8d576332
53
pzztool.py
53
pzztool.py
|
@ -5,7 +5,7 @@ from struct import unpack
|
|||
from os import listdir
|
||||
import logging
|
||||
|
||||
__version__ = "1.3.10"
|
||||
__version__ = "1.3.11"
|
||||
__author__ = "rigodron, algoflash, GGLinnk"
|
||||
__OriginalAutor__ = "infval"
|
||||
__license__ = "MIT"
|
||||
|
@ -229,44 +229,47 @@ def pzz_pack(src_path, dest_file):
|
|||
# On écrit file_count au début de header
|
||||
pzz_file.write(file_count.to_bytes(4, byteorder='big'))
|
||||
|
||||
# On écrit les file_descriptor dans le header du PZZ pour chaque fichier
|
||||
for src_file_name in src_files:
|
||||
index = int(src_file_name[0:3])
|
||||
|
||||
# Compression status permet de verrifier si le fichier doit être finalement compressé ou non
|
||||
compression_status = src_file_name[3:4]
|
||||
|
||||
# file_descriptor = arrondi supérieur de la taille / CHUNK_SIZE
|
||||
file_descriptor = ceil((src_path / src_file_name).stat().st_size / CHUNK_SIZE)
|
||||
|
||||
# On ajoute le flag de compression au file_descriptor
|
||||
if compression_status == 'C':
|
||||
file_descriptor |= BIT_COMPRESSION_FLAG
|
||||
|
||||
# On ecrit le file_descriptor
|
||||
pzz_file.write(file_descriptor.to_bytes(4, byteorder='big'))
|
||||
|
||||
# On se place à la fin du header PZZ
|
||||
pzz_file.seek(CHUNK_SIZE)
|
||||
|
||||
file_descriptors = []
|
||||
# On écrit tous les fichiers à la suite du header
|
||||
for src_file_name in src_files:
|
||||
is_compressed = "_compressed" in src_file_name
|
||||
compression_status = src_file_name[3:4]
|
||||
|
||||
with (src_path / src_file_name).open("rb") as src_file:
|
||||
src_file = src_file.read()
|
||||
|
||||
# Le fichier doit être compressé avant d'être pack
|
||||
if compression_status == 'C' and not is_compressed:
|
||||
pzz_file.write(pzz_compress(src_file.read()))
|
||||
src_file = pzz_compress(src_file)
|
||||
# Le fichier doit être décompressé avant d'être pack
|
||||
elif compression_status == 'U' and is_compressed:
|
||||
pzz_file.write(pzz_decompress(src_file.read()))
|
||||
else:
|
||||
pzz_file.write(src_file.read())
|
||||
src_file = pzz_decompress(src_file) # padding à gérer
|
||||
|
||||
# Si le fichier n'est pas compressé, on ajoute le padding pour correspondre à un multiple de CHUNK_SIZE
|
||||
if compression_status == 'U' and (pzz_file.tell() % CHUNK_SIZE) > 0:
|
||||
pzz_file.write(b"\x00" * (CHUNK_SIZE - (pzz_file.tell() % CHUNK_SIZE)))
|
||||
# on ajoute le padding pour correspondre à un multiple de CHUNK_SIZE
|
||||
if compression_status == 'U':
|
||||
if (len(src_file) % CHUNK_SIZE) > 0:
|
||||
src_file.extend(b"\x00" * (CHUNK_SIZE - (len(src_file) % CHUNK_SIZE)))
|
||||
|
||||
|
||||
# file_descriptor = arrondi supérieur de la taille / CHUNK_SIZE
|
||||
file_descriptor = ceil(len(src_file) / CHUNK_SIZE)
|
||||
|
||||
# On ajoute le flag de compression au file_descriptor
|
||||
if compression_status == 'C':
|
||||
file_descriptor |= BIT_COMPRESSION_FLAG
|
||||
|
||||
file_descriptors.append(file_descriptor)
|
||||
pzz_file.write(src_file)
|
||||
|
||||
pzz_file.seek(4)
|
||||
# On écrit les file_descriptor dans le header du PZZ pour chaque fichier
|
||||
tmp = bytearray()
|
||||
for file_descriptor in file_descriptors:
|
||||
tmp.extend(file_descriptor.to_bytes(4, byteorder='big'))
|
||||
pzz_file.write(tmp)
|
||||
|
||||
|
||||
def get_argparser():
|
||||
|
|
Loading…
Reference in New Issue
Block a user