Merge pull request #64 from lifebottle/fix/TOPX-Main-and-Story-Extract

Fix/topx main and story extract
This commit is contained in:
fortiersteven
2022-07-13 22:19:59 -04:00
committed by GitHub
3 changed files with 66 additions and 62 deletions

View File

@@ -15,20 +15,25 @@ class ToolsTOPX(ToolsTales):
def __init__(self, tbl):
super().__init__("TOPX", tbl)
#super().__init__("TOPX", tbl, "Narikiri-Dungeon-X")
#Load the hash table for the files
json_file = open('../Data/Misc/hashes.json', 'r')
json_file = open('../Data/Narikiri-Dungeon-X/Misc/hashes.json', 'r')
self.hashes = json.load(json_file)
json_file.close()
self.discPath = '../Data/Disc'
self.storyPathExtract = '../Data/Archives/Story/' #Files are the result of PAKCOMPOSER + Comptoe here
self.storyPathInsert = '../Data/Archives/All/map/pack' #Files need to be .CAB here
self.skitPathExtract = '../Data/' #Files are the result of PAKCOMPOSER + Comptoe here
self.allPathExtract = '../Data/Archives/All/'
self.allPathInsert = '../Data/Disc/PSP_GAME/USRDIR' #File is all.dat
self.repo_name = 'Narikiri-Dungeon-X'
self.misc = '../Data/{}/Misc'.format(self.repo_name)
self.disc_path = '../Data/{}/Disc'.format(self.repo_name)
self.story_XML_extract = '../Data/{}/Story/'.format(self.repo_name) #Files are the result of PAKCOMPOSER + Comptoe here
self.story_XML_new = '../{}/Data/NDX/Story/XML/All/'.format(self.repo_name) #Files need to be .CAB here
self.skit_extract = '../Data/{}/Skit/'.format(self.repo_name) #Files are the result of PAKCOMPOSER + Comptoe here
self.all_extract = '../Data/{}/All/'.format(self.repo_name)
self.all_original = '../Data/{}/Disc/Original/PSP_GAME/USRDIR/all.dat'.format(self.repo_name)
self.all_new = '../Data/{}/Disc/New/PSP_GAME/USRDIR/all.dat'.format(self.repo_name) #File is all.dat
self.make_dirs()
#############################
#
# Extraction of files and unpacking
@@ -37,64 +42,64 @@ class ToolsTOPX(ToolsTales):
# Make the basic directories for extracting all.dat
def make_dirs(self):
self.mkdir('../Data/Archives/All')
self.mkdir('../Data/Archives/All/battle')
self.mkdir('../Data/Archives/All/battle/character')
self.mkdir('../Data/Archives/All/battle/charsnd')
self.mkdir('../Data/Archives/All/battle/data')
self.mkdir('../Data/Archives/All/battle/effect')
self.mkdir('../Data/Archives/All/battle/event')
self.mkdir('../Data/Archives/All/battle/gui')
self.mkdir('../Data/Archives/All/battle/map')
self.mkdir('../Data/Archives/All/battle/resident')
self.mkdir('../Data/Archives/All/battle/tutorial')
self.mkdir('../Data/Archives/All/chat')
self.mkdir('../Data/Archives/All/gim')
self.mkdir('../Data/Archives/All/map')
self.mkdir('../Data/Archives/All/map/data')
self.mkdir('../Data/Archives/All/map/pack')
self.mkdir('../Data/Archives/All/movie')
self.mkdir('../Data/Archives/All/snd')
self.mkdir('../Data/Archives/All/snd/init')
self.mkdir('../Data/Archives/All/snd/se3')
self.mkdir('../Data/Archives/All/snd/se3/map_mus')
self.mkdir('../Data/Archives/All/snd/strpck')
self.mkdir('../Data/Archives/All/sysdata')
self.mkdir('../Data/{}/All'.format(self.repo_name))
self.mkdir('../Data/{}/All/battle'.format(self.repo_name))
self.mkdir('../Data/{}/All/battle/character'.format(self.repo_name))
self.mkdir('../Data/{}/All/battle/charsnd'.format(self.repo_name))
self.mkdir('../Data/{}/All/battle/data'.format(self.repo_name))
self.mkdir('../Data/{}/All/battle/effect'.format(self.repo_name))
self.mkdir('../Data/{}/All/battle/event'.format(self.repo_name))
self.mkdir('../Data/{}/All/battle/gui'.format(self.repo_name))
self.mkdir('../Data/{}/All/battle/map'.format(self.repo_name))
self.mkdir('../Data/{}/All/battle/resident'.format(self.repo_name))
self.mkdir('../Data/{}/All/battle/tutorial'.format(self.repo_name))
self.mkdir('../Data/{}/All/chat'.format(self.repo_name))
self.mkdir('../Data/{}/All/gim'.format(self.repo_name))
self.mkdir('../Data/{}/All/map'.format(self.repo_name))
self.mkdir('../Data/{}/All/map/data'.format(self.repo_name))
self.mkdir('../Data/{}/All/map/pack'.format(self.repo_name))
self.mkdir('../Data/{}/All/movie'.format(self.repo_name))
self.mkdir('../Data/{}/All/snd'.format(self.repo_name))
self.mkdir('../Data/{}/All/snd/init'.format(self.repo_name))
self.mkdir('../Data/{}/All/snd/se3'.format(self.repo_name))
self.mkdir('../Data/{}/All/snd/se3/map_mus'.format(self.repo_name))
self.mkdir('../Data/{}/All/snd/strpck'.format(self.repo_name))
self.mkdir('../Data/{}/All/sysdata'.format(self.repo_name))
# Extract each of the file from the all.dat
def extract_files(self, start, size, filename):
if filename in self.hashes.keys():
filename = self.hashes[filename]
input_file = open( '../Data/Disc/Original/PSP_GAME/USRDIR/all.dat', 'rb')
input_file = open( self.all_original, 'rb')
input_file.seek(start, 0)
data = input_file.read(size)
output_file = open( os.path.join(self.allPathExtract, filename), 'wb')
output_file = open( os.path.join(self.all_extract, filename), 'wb')
output_file.write(data)
output_file.close()
input_file.close()
# Extract the story files
def extractAllStory(self):
def extract_All_Story(self):
print("Extracting Story")
path = os.path.join( self.allPathExtract, 'map/pack/')
storyPath = '../Data/Archives/Story/'
self.mkdir(storyPath)
path = os.path.join( self.all_extract, 'map/pack/')
self.mkdir(self.story_XML_extract)
for f in os.listdir( path ):
if os.path.isfile( path+f) and '.cab' in f:
#Unpack the CAB into PAK3 file
fileName = storyPath+f.replace(".cab", ".pak3")
fileName = self.story_XML_extract+f.replace(".cab", ".pak3")
subprocess.run(['expand', path+f, fileName])
#Decompress using PAKCOMPOSER + Comptoe
super().pakComposerAndComptoe(fileName, "-d", "-3")
#super().pakComposerAndComptoe(fileName, "-d", "-3")
def extractAllSkits(self):
def extract_All_Skit(self):
print("Extracting Skits")
path = os.path.join( self.allPathExtract, 'chat/')
path = os.path.join( self.all_extract, 'chat/')
skitsPath ='../Data/Archives/Skits/'
self.mkdir(skitsPath)
@@ -106,9 +111,9 @@ class ToolsTOPX(ToolsTales):
subprocess.run(['expand', path + f, fileName])
#Decompress using PAKCOMPOSER + Comptoe
super().pakComposerAndComptoe(fileName, "-d", "-3")
self.pakComposerAndComptoe(fileName, "-d", "-3")
def extractAllEvents(self):
def extract_All_Events(self):
print("Extract Events")
path = os.path.join( self.allPathExtract, 'map/')
@@ -123,22 +128,22 @@ class ToolsTOPX(ToolsTales):
subprocess.run(['expand', path + f, fileName])
#Decompress using PAKCOMPOSER + Comptoe
super().pakComposerAndComptoe(fileName, "-d", "-3")
self.pakComposerAndComptoe(fileName, "-d", "-3")
# Extract the file all.dat to the different directorties
def extractMainArchive(self):
def extract_Main_Archive(self):
self.make_dirs()
order = {}
order['order'] = []
order_json = open( os.path.join( self.miscPath, 'order.json'), 'w')
order_json = open( os.path.join( self.misc, 'order.json'), 'w')
#Extract decrypted eboot
super().extractDecryptedEboot()
self.extract_Decripted_Eboot()
print("Extract All.dat")
#Open the eboot
eboot = open( os.path.join( self.miscPath, 'EBOOT_DEC.BIN'), 'rb')
eboot = open( os.path.join( self.misc, 'EBOOT_DEC.BIN'), 'rb')
eboot.seek(0x1FF624)
while True:
@@ -151,7 +156,11 @@ class ToolsTOPX(ToolsTales):
json.dump(order, order_json, indent = 4)
order_json.close()
def extract_Decripted_Eboot(self):
print("Extracting Eboot")
args = ["deceboot", "../Data/{}Disc/Original/PSP_GAME/SYSDIR/EBOOT.BIN".format(self.repo_name), "../Data/{}/Misc/EBOOT_DEC.BIN".format(self.repo_name)]
listFile = subprocess.run(
args,
cwd= os.getcwd(),
)
def extractDecryptedEboot(self):
super().extractDecryptedEboot()

View File

@@ -706,9 +706,10 @@ class ToolsTales:
japanese_text = entry_node.find("JapaneseText").text
english_text = entry_node.find("EnglishText").text
print(english_text)
#Use the values only for Status = Done and use English if non empty
final_text = ''
if (status == "Done"):
if (status not in ['Problematic', 'To Do']):
final_text = english_text or japanese_text or ''
else:
final_text = japanese_text or ''
@@ -783,13 +784,7 @@ class ToolsTales:
#
#############################
def extractDecryptedEboot(self):
print("Extracting Eboot")
args = ["deceboot", os.path.join(self.basePath,"../Data/Disc/Original/PSP_GAME/SYSDIR/EBOOT.BIN"), os.path.join("../Data/Misc/EBOOT_DEC.BIN")]
listFile = subprocess.run(
args,
cwd= self.basePath,
)
def extract_abcde_text(self, filename, modify_xml = True):

BIN
deceboot.exe Normal file

Binary file not shown.