from ToolsTales import ToolsTales import subprocess from dicttoxml import dicttoxml import json import struct import shutil import os import re import pandas as pd import xml.etree.ElementTree as ET import lxml.etree as etree import comptolib from xml.dom import minidom from pathlib import Path import string import io class ToolsTOR(ToolsTales): POINTERS_BEGIN = 0xD76B0 # Offset to DAT.BIN pointer list start in SLPS_254.50 file POINTERS_END = 0xE60C8 # Offset to DAT.BIN pointer list end in SLPS_254.50 file HIGH_BITS = 0xFFFFFFC0 LOW_BITS = 0x3F #Path to used datBinOriginal = '../Data/Tales-Of-Rebirth/Disc/Original/DAT.BIN' datBinNew = '../Data/Tales-Of-Rebirth/Disc/New/DAT.BIN' elfOriginal = '../Data/Tales-Of-Rebirth/Disc/Original/SLPS_254.50' elfNew = '../Data/Tales-Of-Rebirth/Disc/New/SLPS_254.50' storyPathArchives= '../Tales-Of-Rebirth/Data/TOR/Story/New/' #Story XML files will be extracted here storyPathXML = '../Tales-Of-Rebirth/Data/TOR/Story/XML/' #SCPK will be repacked here skitPathArchives = '../Tales-Of-Rebirth/Data/TOR/Skits/' #Skits XML files will be extracted here datPathExtract = '../Data/Tales-Of-Rebirth/DAT/' def __init__(self, tbl): super().__init__("TOR", tbl, "Tales-of-Rebirth") #byteCode self.story_byte_code = b"\xF8" # Extract the story files def extract_All_Story_Files(self,debug=False): self.mkdir( self.storyPathXML) listFiles = [self.datPathExtract + 'SCPK/' + ele for ele in os.listdir( os.path.join(self.datPathExtract, "SCPK"))] for scpkFile in listFiles: self.extract_TheirSce_XML(scpkFile,debug) def get_theirsce_from_scpk(self, scpk, scpkFileName, debug=False)->bytes: header = scpk.read(4) if header != b"SCPK": # sys.exit(f"{file} is not a .scpk file!") raise ValueError("File is not a .scpk file!") scpk.read(4) nbFiles = struct.unpack(" 0: file_list.extend( [os.path.join(path,file) for file in filenames]) list_test = [os.path.splitext(os.path.basename(ele))[0] for ele in file_list] previous = -1 dummies = 0 for file in sorted(file_list, key=self.get_file_name): size = 0 remainder = 0 current = int(re.search(self.VALID_FILE_NAME, file).group(1)) if current != previous + 1: while previous < current - 1: remainders.append(remainder) buffer += size + remainder sectors.append(buffer) previous += 1 dummies += 1 file_name = self.get_file_name(file) if file_name in story_file_list: print("10247 STORY") data = self.pack_Story_File(file_name+".scpk") with open("10247.scpk","wb") as f: f.write(data) else: with open(file, "rb") as f2: data = f2.read() #data = f2.read() comp_type = re.search(self.VALID_FILE_NAME, file).group(2) if comp_type != None: data = comptolib.compress_data(data, version=int(comp_type)) output_dat.write(data) size = len(data) #print("file: {} size: {}".format(file, size)) remainder = 0x40 - (size % 0x40) if remainder == 0x40: remainder = 0 output_dat.write(b"\x00" * remainder) remainders.append(remainder) buffer += size + remainder sectors.append(buffer) previous += 1 #print( # "Writing file %05d/%05d..." % (current - dummies, len(file_list)), end="\r" #) print("Writing file %05d/%05d..." % (current - dummies, len(file_list))) shutil.copy( self.elfOriginal, self.elfNew) with open(self.elfNew, "r+b") as output_elf: output_elf.seek(self.POINTERS_BEGIN) for i in range(len(sectors) - 1): output_elf.write(struct.pack("