diff --git a/ToolsNDX.py b/ToolsNDX.py index 4312a2c..a6ea776 100644 --- a/ToolsNDX.py +++ b/ToolsNDX.py @@ -23,6 +23,7 @@ class ToolsNDX(ToolsTales): self.jsonTblTags = json.load(f) self.jsonTblTags["TBL"] = { int(k):v for k,v in self.jsonTblTags["TBL"].items()} + self.jsonTblTags["COLOR"] = { int(k):v for k,v in self.jsonTblTags["COLOR"].items()} keys = [int(ele, 16) for ele in self.jsonTblTags["TAGS"].keys()] self.jsonTblTags["TAGS"] = dict(zip(keys, list(self.jsonTblTags["TAGS"].values()))) @@ -111,37 +112,36 @@ class ToolsNDX(ToolsTales): self.mkdir('../Data/{}/All/sysdata'.format(self.repo_name)) # Extract the story files - def extract_All_Story(self): + def extract_All_Story(self, extract_XML = False): print("Extracting Story") path = os.path.join( self.all_extract, 'map/pack/') - story_new = "../Data/{}/Story/New".format(self.repo_name) - #self.mkdir(self.story_XML_extract) - #files = glob.glob(story_new+'/*') - #for f in files: - # os.remove(f) for f in os.listdir( path ): if os.path.isfile( path+f) and '.cab' in f: - - #Unpack the CAB into PAK3 file - shutil.copy( path+f,os.path.join(story_new, f)) - self.extract_Cab(f, f.replace(".cab", ".pak3"), story_new) + if extract_XML: + self.extract_CAB_File(path,f, '../Data/{}/Story'.format(self.repo_name)) + else: + self.extract_CAB_File(path,f) + + def extract_CAB_File(self, path, f, xml_path=None): + + #Unpack the CAB into PAK3 file + path_new = '{}/New'.format(xml_path) + shutil.copy( path+f,os.path.join(path_new, f)) + self.extract_Cab(f, f.replace(".cab", ".pak3"), path_new) - #Decompress using PAKCOMPOSER + Comptoe - self.pakComposer_Comptoe(f.replace(".cab", ".dat"), "-d", "-3",0, os.path.join( story_new, f.replace(".cab","")) ) - - #Extract from XML - self.extract_Story_File(os.path.join(story_new, f.replace(".cab", ""), f.replace(".cab", ""))) - - - - - - #super().pakComposerAndComptoe(fileName, "-d", "-3") + #Decompress using PAKCOMPOSER + Comptoe + self.pakComposer_Comptoe(f.replace(".cab", ".dat"), "-d", "-3",0, os.path.join( path_new, f.replace(".cab","")) ) + if xml_path != None: + #Extract from XML + self.extract_TSS_File(os.path.join(path_new, f.replace(".cab", ""), f.replace(".cab", "")), xml_path) + + + # Extract one single CAB file to the XML format - def extract_Story_File(self, pak3_folder): + def extract_TSS_File(self, pak3_folder, xml_path): self.id = 1 @@ -150,11 +150,11 @@ class ToolsNDX(ToolsTales): if os.path.exists(pak3_folder): - #2) Grab TSS file from PAK3 folder + #1) Grab TSS file from PAK3 folder tss, file_tss = self.get_tss_from_pak3( pak3_folder) - #3) Extract TSS to XML - self.extract_tss_XML(tss, pak3_folder) + #2) Extract TSS to XML + self.extract_tss_XML(tss, pak3_folder, xml_path) def get_tss_from_pak3(self, pak3_folder): @@ -187,7 +187,6 @@ class ToolsNDX(ToolsTales): #1) Extract CAB to folder event_path = '../Data/{}/Events/New/map'.format(self.repo_name) - file_path = os.path.join(event_path, event_file) self.extract_Cab(event_file, event_file, event_path) #2) Grab TSS file from the decompressed CAB file @@ -210,10 +209,7 @@ class ToolsNDX(ToolsTales): f.write(tss_data) return io.BytesIO(tss_data), file_tss - - - - + def extract_tss_XML(self, tss, cab_file_name, xml_path): root = etree.Element('SceneText') @@ -227,7 +223,7 @@ class ToolsNDX(ToolsTales): #Create all the Nodes for Struct speaker_node = etree.SubElement(root, 'Speakers') - etree.SubElement(speaker_node, 'Section').text = "Speaker" + etree.SubElement(speaker_node, 'Section').text = "Speaker" strings_node = etree.SubElement(root, 'Strings') etree.SubElement(strings_node, 'Section').text = "Story" @@ -244,7 +240,6 @@ class ToolsNDX(ToolsTales): [ self.extract_From_String(tss, strings_offset, pointer_offset, text_offset, strings_node) for pointer_offset, text_offset in zip(pointers_offset, texts_offset)] text_start = min( min(person_offset, default=0), min(texts_offset, default=0)) - etree.SubElement(root, "TextStart").text = str(text_start) #Write the XML file txt=etree.tostring(root, encoding="UTF-8", pretty_print=True) @@ -296,9 +291,11 @@ class ToolsNDX(ToolsTales): f.read(4) unknown_pointer = struct.unpack('") [self.create_Entry(root.find("Strings"), pointer_offset, jap,1, "Struct", struct_speaker_id, unknown_pointer) for jap in jap_split_bubble] @@ -323,8 +320,8 @@ class ToolsNDX(ToolsTales): entry_node = etree.SubElement(root, "Entry") etree.SubElement(entry_node,"PointerOffset").text = str(pointer_offset) etree.SubElement(entry_node,"JapaneseText").text = str(japText) - etree.SubElement(entry_node,"EnglishText").text = '' - etree.SubElement(entry_node,"Notes").text = '' + etree.SubElement(entry_node,"EnglishText") + etree.SubElement(entry_node,"Notes") etree.SubElement(entry_node,"Id").text = str(self.speaker_id) etree.SubElement(entry_node,"Status").text = "To Do" struct_speaker_id = self.speaker_id @@ -397,6 +394,9 @@ class ToolsNDX(ToolsTales): return [pointers_offset, pointers_value] + + + def get_Direct_Pointers(self, text_start, text_max, base_offset, pointers_list, section,file_path=''): if file_path == '': @@ -427,26 +427,26 @@ class ToolsNDX(ToolsTales): #Add it to the XML node entry_node = etree.SubElement(strings_node, "Entry") etree.SubElement(entry_node,"PointerOffset").text = str(pointer_offset) - etree.SubElement(entry_node,"JapaneseText").text = str(text) - eng_text = '' + text_split = re.split(self.COMMON_TAG, text) - if to_translate == 0: - statusText = 'Done' - eng_text = str(text) + if len(text_split) > 1 and any(possible_value in text for possible_value in self.VALID_VOICEID): + etree.SubElement(entry_node,"VoiceId").text = text_split[1] + etree.SubElement(entry_node, "JapaneseText").text = ''.join(text_split[2:]) + else: + etree.SubElement(entry_node, "JapaneseText").text = text - etree.SubElement(entry_node,"EnglishText").text = eng_text - etree.SubElement(entry_node,"Notes").text = '' + eng_text = '' + + etree.SubElement(entry_node,"EnglishText") + etree.SubElement(entry_node,"Notes") etree.SubElement(entry_node,"Id").text = str(self.id) statusText = "To Do" if entry_type == "Struct": etree.SubElement(entry_node,"StructId").text = str(self.struct_id) + etree.SubElement(entry_node,"SpeakerId").text = str(speaker_id) etree.SubElement(entry_node,"UnknownPointer").text = str(unknown_pointer) - - if to_translate == 1: - etree.SubElement(entry_node,"SpeakerId").text = str(speaker_id) - - etree.SubElement(entry_node,"ToTranslate").text = str(to_translate) + etree.SubElement(entry_node,"Status").text = statusText self.id += 1 @@ -486,8 +486,16 @@ class ToolsNDX(ToolsTales): tss.read(8) struct_offset = struct.unpack("',')') + tss.write(b'\x09') + tss.write( self.text_to_bytes(voice_final)) + + + bytes_text = self.get_Node_Bytes(struct_node) + tss.write(bytes_text) + tss.write(b'\x0C') + + tss.seek(tss.tell()-1) + tss.write(b'\x00\x00\x00') + #Construct Struct struct_dict[ int(struct_node.find("PointerOffset").text)] = struct.pack( "