From 050415dda965b48dc03937b2a8740969ba93fa2a Mon Sep 17 00:00:00 2001 From: Stewie Date: Sun, 27 Mar 2022 20:35:17 -0400 Subject: [PATCH] Extracting 00016_0000d --- TODDC_Test.py | 50 +++++++++++++++++++++++++- ToolsTODDC.py | 27 ++------------ ToolsTales.py | 20 ++++++----- __pycache__/ToolsTODDC.cpython-38.pyc | Bin 1622 -> 928 bytes __pycache__/ToolsTales.cpython-38.pyc | Bin 23413 -> 23748 bytes 5 files changed, 63 insertions(+), 34 deletions(-) diff --git a/TODDC_Test.py b/TODDC_Test.py index 2f510f6..ed3c0cd 100644 --- a/TODDC_Test.py +++ b/TODDC_Test.py @@ -11,8 +11,56 @@ import os import lxml.etree as etree -tool = ToolsTODDC.ToolsTODDC("toddc.tbl") +tool = ToolsTODDC.ToolsTODDC("TBL_All.json") ele = tool.menu_files_json[0] tool.extract_Menu_File(ele) +repo_name = "Tales-Of-Destiny-DC" +tblFile = "TBL_ALL.json" +with open("../{}/Data/Misc/{}".format(repo_name, tblFile), encoding="utf-8") as f: + jsonRaw = json.load(f) + jsonTblTags ={ k1:{ int(k2) if (k2 != "TBL") else int(k2):v2 for k2,v2 in jsonRaw[k1].items()} for k1,v1 in jsonRaw.items()} + #jsonTblTags = {k2:v2 for k2,v2 in jsonRaw[k1].items()} for k1,v1 in jsonRaw.items()} + + +TAGS = jsonTblTags['TAGS'] + +with open("../Data/Tales-Of-Destiny-DC/Menu/New/00016/00016_0000d.unknown", "rb") as fileRead: + + + fileRead.seek(0x3C87D) + b = fileRead.read(1) + + b = ord(b) + finalText="" + if (b >= 0x99 and b <= 0x9F) or (b >= 0xE0 and b <= 0xEB): + c = (b << 8) + ord(fileRead.read(1)) + + # if str(c) not in json_data.keys(): + # json_data[str(c)] = char_index[decode(c)] + try: + finalText += (jsonTblTags['TBL'][str(c)]) + except KeyError: + b_u = (c >> 8) & 0xff + b_l = c & 0xff + finalText += ("{%02X}" % b_u) + finalText += ("{%02X}" % b_l) + elif b == 0x1: + finalText += ("\n") + elif b in (0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0x9, 0xB, 0xC, 0xD, 0xE, 0xF): + b2 = struct.unpack("" % (tag_name, b2)) + else: + finalText += "<%02X:%08X>" % (b, b2) \ No newline at end of file diff --git a/ToolsTODDC.py b/ToolsTODDC.py index e06df4c..f43525a 100644 --- a/ToolsTODDC.py +++ b/ToolsTODDC.py @@ -20,29 +20,6 @@ class ToolsTODDC(ToolsTales): def __init__(self, tbl): - self.gameName = "TODDC" - self.repo_name = "Tales-of-Destiny-DC" - self.basePath = os.getcwd() - - - with open("../Tales-of-Destiny-DC/Data/Misc/toddc.tbl", encoding="utf-8") as f: - data = f.readlines() - hex_list = [bytes.fromhex(str(ele.split("=",1)[0])) for ele in data] - self.itable = dict([[ele.split("=",1)[1].replace("\n",""), bytes.fromhex(ele.split("=",1)[0])] for ele in data]) - - - - #with open("../{}/Data/{}/Misc/{}".format(repo_name, gameName, tblFile)) as f: - # jsonRaw = json.load(f) - # self.jsonTblTags ={ k1:{ int(k2,16) if (k1 != "TBL") else k2:v2 for k2,v2 in jsonRaw[k1].items()} for k1,v1 in jsonRaw.items()} - - #self.itable = dict([[i, struct.pack(">H", int(j))] for j, i in self.jsonTblTags['TBL'].items()]) - #self.itags = dict([[i, j] for j, i in self.jsonTblTags['TAGS'].items()]) - #self.inames = dict([[i, j] for j, i in self.jsonTblTags['NAMES'].items()]) - #self.icolors = dict([[i, j] for j, i in self.jsonTblTags['COLORS'].items()]) - - - with open("../{}/Data/Menu/MenuFiles.json".format(self.repo_name, self.gameName)) as f: - self.menu_files_json = json.load(f) + super().__init__("TODDC", tbl, "Tales-of-Destiny-DC") - \ No newline at end of file + diff --git a/ToolsTales.py b/ToolsTales.py index ecf6fe3..ffa6acd 100644 --- a/ToolsTales.py +++ b/ToolsTales.py @@ -31,17 +31,21 @@ class ToolsTales: self.repo_name = repo_name self.basePath = os.getcwd() - with open("../{}/Data/{}/Misc/{}".format(repo_name, gameName, tblFile)) as f: + with open("../{}/Data/Misc/{}".format(repo_name, tblFile), encoding="utf-8") as f: jsonRaw = json.load(f) - self.jsonTblTags ={ k1:{ int(k2,16) if (k1 != "TBL") else k2:v2 for k2,v2 in jsonRaw[k1].items()} for k1,v1 in jsonRaw.items()} + if self.repo_name == "Tales-of-Destiny-DC": + self.jsonTblTags ={ k1:{ int(k2) if (k1 != "TBL") else k2:v2 for k2,v2 in jsonRaw[k1].items()} for k1,v1 in jsonRaw.items()} + else: + self.jsonTblTags ={ k1:{ int(k2,16) if (k1 != "TBL") else k2:v2 for k2,v2 in jsonRaw[k1].items()} for k1,v1 in jsonRaw.items()} + self.itable = dict([[i, struct.pack(">H", int(j))] for j, i in self.jsonTblTags['TBL'].items()]) self.itags = dict([[i, j] for j, i in self.jsonTblTags['TAGS'].items()]) - self.inames = dict([[i, j] for j, i in self.jsonTblTags['NAMES'].items()]) - self.icolors = dict([[i, j] for j, i in self.jsonTblTags['COLORS'].items()]) + self.inames = dict([[i, j] for j, i in self.jsonTblTags['NAME'].items()]) + self.icolors = dict([[i, j] for j, i in self.jsonTblTags['COLOR'].items()]) - with open("../{}/Data/{}/Menu/MenuFiles.json".format(repo_name, gameName)) as f: + with open("../{}/Data/Menu/MenuFiles.json".format(repo_name)) as f: self.menu_files_json = json.load(f) @@ -469,7 +473,7 @@ class ToolsTales: tag_name = TAGS.get(b) tag_param = None - tag_search = tag_name.upper()+'S' + tag_search = tag_name.upper() if (tag_search in self.jsonTblTags.keys()): tags2 = self.jsonTblTags[tag_search] tag_param = tags2.get(b2, None) @@ -913,7 +917,7 @@ class ToolsTales: #Write to XML file txt=etree.tostring(root, encoding="UTF-8", pretty_print=True) - with open(file_definition['File_XML'].replace("/{}".format(self.repo_name),""), "wb") as xmlFile: + with open(file_definition['File_XML'].replace("/{}".format(self.repo_name),"").replace("/Data","/Data/{}".format(self.repo_name)), "wb") as xmlFile: xmlFile.write(txt) @@ -922,7 +926,7 @@ class ToolsTales: print("Extracting Menu Files") - self.mkdir("../Data/{}/Menu/New".format(self.gameName)) + self.mkdir("../Data/{}/Menu/New".format(self.repo_name)) #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])) diff --git a/__pycache__/ToolsTODDC.cpython-38.pyc b/__pycache__/ToolsTODDC.cpython-38.pyc index 21457e040333a37170f5c2ac5fc3811162ee4ff1..032585fb482c54d6de939649e5140639c53ffe9b 100644 GIT binary patch delta 307 zcmcb{vw)p1l$V!_fq{X+FL$M4414Al96k`fQ6jM7x8enUNud0i=KOKSo(SO{QC{#ia$QMYlNO<1_OzOXA}-nQpNZr{<*HVlGL_ zS;=^dGd?~!C$YFVK7QroJ52ThMVt%_45A=6f-GWSn*4!9lu46yG6$=w3P|b}FH}Qv zYEDjkd=Vc50|SKM0kQZeJFyx_-D1fq&d=tvI8!Bs1q0Q-1N}9@Z8C NgdQ-9f3gCb836iVNDcr1 delta 1062 zcmZ3$evOAOl$V!_fq{Wx>s^PW8*Cf-BpK_O7#J8F7#J9eMHmHcQy8L{QW#U1 zS{S03Q<#GpG+AzOh2-bw6o>e`xHu<+)PsxwVO9nP22KVB24|4|4h9B>6vi5cc!m_F z8ishr5~c;r3mIw{;#o>qQB)>B??W*tL_nbs3ffd$*_Pig(-!3AyY{`(*kBBDHchFg^cM;Q17u8aWXJ46oJy)Ek>?e z3{X!N@i8zk++r_EEyzhsPA%dFso?<;{2)RIP6&fopfo9u;x9QpJ^kuhXf)NQ=9TLE zrskEpW#*(7>tz+^=V|iZ;z&=-P4!F6O})iglvF3|k(5}R z8jx6$af>CtAT*^W%#y^UoYY%vY57IDi6ysKKqlW}$;nSl zxy7HGnpYa12C^`|9we^GdW)qvH7D&Bb4gOpEylE4EGda4iMKd1QY+#?kpqe>aEvh& zf&6rf0~Q^kAdi7O%)rFP$i~RU%*V*V$j2zhC&pMMj3xT~G+98JLEedvzr__FpF25- zNla7=6i^^zkS&_r!(<>;qy!3Tw&IeaQjn*LGfGP`bBd%G7#JpBV`>q=(38b%1^|3$ B4~PH& diff --git a/__pycache__/ToolsTales.cpython-38.pyc b/__pycache__/ToolsTales.cpython-38.pyc index 9141a6d6ed0f057d9c8f34f22484a874cd54ea19..2e7f96d3d79d39c8961b4890bd3885ebd30a0e86 100644 GIT binary patch delta 7391 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 delta 7183 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