From f3aed5e32687d8fc18fe4e43e2eaf9c49a320c56 Mon Sep 17 00:00:00 2001 From: Stewie Date: Sun, 20 Mar 2022 10:10:58 -0400 Subject: [PATCH 1/4] fixing 11181.pak3 and adding preparing Menu File function --- TOR_Test.py | 6 ++-- ToolsTOR.py | 4 +++ ToolsTales.py | 42 ++++++++++++++++---------- __pycache__/ToolsTOR.cpython-38.pyc | Bin 9685 -> 9774 bytes __pycache__/ToolsTales.cpython-38.pyc | Bin 22303 -> 22504 bytes 5 files changed, 34 insertions(+), 18 deletions(-) diff --git a/TOR_Test.py b/TOR_Test.py index 0eed23f..9a8f74f 100644 --- a/TOR_Test.py +++ b/TOR_Test.py @@ -12,7 +12,7 @@ import lxml.etree as etree tool = ToolsTOR.ToolsTOR("TBL_All.json") -tool.extract_All_Menu() +tool.extract_Main_Archive() @@ -29,4 +29,6 @@ tool.pack_Main_Archive() files = os.listdir("abcde_lauren") for file in files: - tool.extract_abcde_text("abcde_lauren/{}".format(file)) \ No newline at end of file + tool.extract_abcde_text("abcde_lauren/{}".format(file)) + + diff --git a/ToolsTOR.py b/ToolsTOR.py index 47134e1..6ec56b2 100644 --- a/ToolsTOR.py +++ b/ToolsTOR.py @@ -341,6 +341,10 @@ class ToolsTOR(ToolsTales): print("Writing file %05d/%05d..." % (i, total_files)) f.close() + #Copy File 11181 + shutil.copy( self.datPathExtract+"BIN/11181.bin", self.datPathExtract+"PAK3/11181.pak3") + os.remove( self.datPathExtract+"BIN/11181.bin") + def pack_Main_Archive(self): sectors = [0] remainders = [] diff --git a/ToolsTales.py b/ToolsTales.py index 93fb7a7..46db661 100644 --- a/ToolsTales.py +++ b/ToolsTales.py @@ -295,19 +295,6 @@ class ToolsTales: # Didn't match anything return "bin" - - def is_compressed(self, data): - if len(data) < 0x09: - return False - - expected_size = struct.unpack("$+FxMY#Jb@ z`ebWvH~m}ONtGq3#Uc411Byf$7#LPE6@h$pi=!kXHM6KVITh+ZkRHj&8@QbrZ%zKf z9b{<^5^x8(h9fmErMNt^B%{azBxVUBtU!bwNS38IH8s0PAH+8R5r&iNdBh}diKSMQ z6eT8?#0Qt;7gfdwj2jaq?*%X(w5b7I_e%z`($uDFk*~ksU|? z9E2=I`S~TcxQk1QGV{`l{qj>%i)=xXZXm)QY>Wo4s?aU|0;mP?`DtmzsU^22$MZ@s z-kMy&t0Z-cy&^XU6af&Q`h&EBg1Ja>^A_GKjQ)_|0*QhHGK7JFp^78I*GIuhp}Mw6 z2V@DWYhFoFNX$zuhQ!k3>-=gdpr9#&ga=rEK~ZL2 zNfF53Md0uQhh!*3DzT_I^%i@2Y6-}%MNuF@mdujWqFXE_sW~~fSkf}{Qi>u#!rUdP z6(u40PM|0)vYMPIAYTuP%c1~~<3WLTOCT?`JRYP98VOqLZ?hGY>);@<2nIFm_Jn1O-e7juzzQjt2y;o$HG2fa3k3kvWeXlmvaF{}qA zaZRaPY{eO+C7C(5Sd#M#DvLxwo)9bsrLBO(k_^Y9B^e`oyB5#L6OTkf05SXaEr=Ai@+xn1P5%AR?+Bq=z>-KewPLwYWGQlxK_LK{Cc5 z0-O(;K}tB%Q%lMcb4pV+g^?05D6!t+$V-X`ML_W_J`fdOoLQ9`pOTqeQse|OqZgzd zTr_}XZgGO_a03PRE!N^ptE$xETa5WdX&_bnAgOqmV^UL!TtT9OVA0Y%BymuRxHY*< zR8at&Q^27QCWIz07oE>|V6(f}bjFAhh6U0!3|Yb{eBumXnqQn@Arm7*iRc0uFrQDH zVIdC$= zr6iU(W#;)q%e-5Y>m=mr!66Td%Uc{i{^9XXo*}`vI6XYwJ-|$G<|zV4KR7Po8L$W* ztG9U5Q%mAgD@s!HiZk=`API@Jw4flhs0g(%DgwuCCCG8C$vOGOsYNpw>OrM?QEF~} zS*oTWB$`3tdy4~_35suVm*kfu=0Ktw9KE+Vi&AqFGxI28N``jj|z(x|6TThFO4QG?~%DN0X^Y3=~8 z&jQsv`GA~+B-l!@QZNCxvS9K@ImvoZa;oAsG%zwTR|pRA4~i`E0U13FM1a!UOC}I& z3IhYfO9v3E3`DE|5tBg#s5H@3gjgpB5&*{_C{HzUP1+21S|(x0!}O7ga=M( zvq55@bX_!K@@sj?cu=8Uv<@T)O1qGX0aR*eN`Mp5E%xHn&P;3J8DW+zE+z1X% zQ1z(E3=W$jWss-}hya@iCcv%{ne3n}!nk3wvT~y8Ly$Zo6(baJW#$#97L~+1=H%>{ zyi(b}9uy0=cmn)A{X$%Wg5zENT#7b;G_MB{Ye2+t5OE$vTmTVZSAlBoTLQ(|nI)hM z2lae0B-wC-RH=eOn-x^G6c>S7O+|_zQE(Lk_R#?l_aOs=Hbc=P5c4reJ#Tz`a!z7# zadK)-PJBE#&>;jrNQuzoMJg7ImXmL*Xb6ByGH`+d7gDDu3#+OtgWC_>t~sf>sd*(K rMX9N`m|R0{aphFx=IEt@OHjd delta 2851 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 z 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 Date: Sun, 20 Mar 2022 10:17:55 -0400 Subject: [PATCH 2/4] Add step to remove folder before unpacking with pakcomposer --- TOR_Test.py | 2 +- ToolsTales.py | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/TOR_Test.py b/TOR_Test.py index 9a8f74f..e625a1e 100644 --- a/TOR_Test.py +++ b/TOR_Test.py @@ -12,7 +12,7 @@ import lxml.etree as etree tool = ToolsTOR.ToolsTOR("TBL_All.json") -tool.extract_Main_Archive() +tool.extract_All_Menu() diff --git a/ToolsTales.py b/ToolsTales.py index 46db661..d8388f2 100644 --- a/ToolsTales.py +++ b/ToolsTales.py @@ -851,6 +851,7 @@ class ToolsTales: #Extract if needed (PakComposer or other) if "pak" in file_name: + shutil.rmtree(menu_path+file_number) self.pakComposer_Comptoe(menu_path+file_name, "-d", "-{}".format(file_name[-1]), True, os.getcwd()) From 98af0d6b8fce6aaf1b4390685b650cc3467cae9f Mon Sep 17 00:00:00 2001 From: Stewie Date: Sun, 20 Mar 2022 10:41:00 -0400 Subject: [PATCH 3/4] fixing path issue with pakComposer_Comptoe --- TOR_Test.py | 2 ++ ToolsTales.py | 21 +++++++++++++-------- __pycache__/ToolsTales.cpython-38.pyc | Bin 22504 -> 22582 bytes 3 files changed, 15 insertions(+), 8 deletions(-) diff --git a/TOR_Test.py b/TOR_Test.py index e625a1e..154374a 100644 --- a/TOR_Test.py +++ b/TOR_Test.py @@ -12,6 +12,8 @@ import lxml.etree as etree tool = ToolsTOR.ToolsTOR("TBL_All.json") +tool.pakComposer_Comptoe("11181.pak3", "-d", "-3", True, r"G:\TalesHacking\PythonLib_Playground\Data\TOR\Menu\New") + tool.extract_All_Menu() diff --git a/ToolsTales.py b/ToolsTales.py index d8388f2..8afe391 100644 --- a/ToolsTales.py +++ b/ToolsTales.py @@ -60,23 +60,30 @@ class ToolsTales: # action is -d or -c # fileType : -0, -1 or -3 # basePath is the location of the PAK file you want to compress/decompress - def pakComposer_Comptoe(self, fileName, action, fileType, do_comptoe, cwd): + def pakComposer_Comptoe(self, fileName, action, fileType, do_comptoe, working): #Delete the file if already there if (action == '-c'): if os.path.exists(fileName): os.remove( fileName.replace(".pak{}", fileType[1])) - + else: + shutil.rmtree(fileName.split(".")[0]) + #Run Pakcomposer with parameters args = [ "pakcomposer", action, fileName, fileType] + if do_comptoe: args.append("-u") - + args.append("-x") + + listFile = subprocess.run( args, - cwd=cwd + cwd=working ) + print(listFile) + def fps4_action(self, action, b_file, dat_file, destination): fps4.dump_fps4(b_file, dat_file, destination) @@ -849,10 +856,8 @@ class ToolsTales: shutil.copy( file_definition['File_Original'], menu_path+file_name) #Extract if needed (PakComposer or other) - if "pak" in file_name: - - shutil.rmtree(menu_path+file_number) - self.pakComposer_Comptoe(menu_path+file_name, "-d", "-{}".format(file_name[-1]), True, os.getcwd()) + if "pak" in file_name: + self.pakComposer_Comptoe(file_name, "-d", "-{}".format(file_name[-1]), True, menu_path) diff --git a/__pycache__/ToolsTales.cpython-38.pyc b/__pycache__/ToolsTales.cpython-38.pyc index 3706220cb3b91cf395aa658bc818958c410b814b..1401b5117534e275eca2dad692614e0649b7bf3b 100644 GIT binary patch delta 3718 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 Date: Sun, 20 Mar 2022 12:48:37 -0400 Subject: [PATCH 4/4] Adding decompress with comptoe --- TOR_Test.py | 2 - ToolsTales.py | 53 ++++++++++++++++---------- __pycache__/ToolsTales.cpython-38.pyc | Bin 22582 -> 23231 bytes 3 files changed, 32 insertions(+), 23 deletions(-) diff --git a/TOR_Test.py b/TOR_Test.py index 154374a..e625a1e 100644 --- a/TOR_Test.py +++ b/TOR_Test.py @@ -12,8 +12,6 @@ import lxml.etree as etree tool = ToolsTOR.ToolsTOR("TBL_All.json") -tool.pakComposer_Comptoe("11181.pak3", "-d", "-3", True, r"G:\TalesHacking\PythonLib_Playground\Data\TOR\Menu\New") - tool.extract_All_Menu() diff --git a/ToolsTales.py b/ToolsTales.py index 8afe391..0f50d75 100644 --- a/ToolsTales.py +++ b/ToolsTales.py @@ -60,30 +60,42 @@ class ToolsTales: # action is -d or -c # fileType : -0, -1 or -3 # basePath is the location of the PAK file you want to compress/decompress - def pakComposer_Comptoe(self, fileName, action, fileType, do_comptoe, working): + def pakComposer_Comptoe(self, file_name, action, file_type, do_comptoe, working): - #Delete the file if already there + #Delete the file if already there + file_number = file_name.split(".")[0] if (action == '-c'): - if os.path.exists(fileName): - os.remove( fileName.replace(".pak{}", fileType[1])) + if os.path.exists(file_name): + os.remove( file_name.replace(".pak{}", file_type[1])) else: - shutil.rmtree(fileName.split(".")[0]) + + if os.path.exists(working+"/"+file_number): + shutil.rmtree(working+"/"+file_number) #Run Pakcomposer with parameters - args = [ "pakcomposer", action, fileName, fileType] - - if do_comptoe: - args.append("-u") - args.append("-x") - + args = [ "pakcomposer", action, file_name, file_type, "-x"] listFile = subprocess.run( args, cwd=working ) - print(listFile) - + if do_comptoe: + + files = [ele for ele in os.listdir(working+"/"+file_number) if ".compress" in ele] + for ele in files: + + ctype=0 + with open(working+"/{}/".format(file_number)+ele, "rb") as f: + ctype = ord(f.read(1)) + + args = ["comptoe", "-d{}".format(ctype), ele, ele.split(".")[0]+"d.unknown"] + listFile = subprocess.run( + args, + cwd=working+"/"+file_number + ) + + def fps4_action(self, action, b_file, dat_file, destination): fps4.dump_fps4(b_file, dat_file, destination) @@ -844,16 +856,13 @@ class ToolsTales: return [pointers_offset, pointers_value] - def prepare_Menu_File(self, file_definition): + def prepare_Menu_File(self, file_original): - file_original = file_definition['File_Original'] file_name = os.path.basename(file_original) - file_number = file_name.split(".")[0] - extension = file_name.split(".")[-1] #Copy the files under Menu Folder menu_path = "../Data/{}/Menu/New/".format(self.gameName) - shutil.copy( file_definition['File_Original'], menu_path+file_name) + shutil.copy( file_original, menu_path+file_name) #Extract if needed (PakComposer or other) if "pak" in file_name: @@ -911,13 +920,15 @@ class ToolsTales: self.mkdir("../Data/{}/Menu/New".format(self.gameName)) + + #Prepare the menu files (Unpack PAK files and use comptoe) + files_to_prepare = list(dict.fromkeys([ele['File_Original'] for ele in self.menu_files_json])) + res = [ self.prepare_Menu_File(ele) for ele in files_to_prepare] + for file_definition in self.menu_files_json: print("...{}".format(file_definition['File_Extract'])) - - self.prepare_Menu_File(file_definition) - self.extract_Menu_File(file_definition) diff --git a/__pycache__/ToolsTales.cpython-38.pyc b/__pycache__/ToolsTales.cpython-38.pyc index 1401b5117534e275eca2dad692614e0649b7bf3b..f8dd4e738f9860a788475aa67b8d5ccaaeb0bbdd 100644 GIT binary patch delta 4882 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 delta 4717 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