You've already forked PythonLib
mirror of
https://github.com/lifebottle/PythonLib.git
synced 2026-02-13 15:25:50 -08:00
correct Menu reinsertion of Skits Name
This commit is contained in:
@@ -26,7 +26,7 @@
|
||||
},
|
||||
{
|
||||
"Section": "Skit Names and Other",
|
||||
"Pointer_Offset_Start": 945440,
|
||||
"Pointer_Offset_Start": 1000108,
|
||||
"Nb_Per_Block": 1,
|
||||
"Step": 0,
|
||||
"Text_Start": 1126048,
|
||||
@@ -108,21 +108,63 @@
|
||||
|
||||
},
|
||||
{
|
||||
"File_Extract": "../Data/TOR/DAT/BIN/11181.bin",
|
||||
"File_XML": "../Data/TOR/Menu/XML/11181.xml",
|
||||
"File_New": "../Data/TOR/Menu/New/11181.bin",
|
||||
"Text_Start": 60980,
|
||||
"Text_End": 75466,
|
||||
"Base_Offset": 58880,
|
||||
"File_Extract": "../Data/TOR/Menu/New/11181/11181_0005.unknown",
|
||||
"File_XML": "../Data/TOR/Menu/XML/11181_0005.xml",
|
||||
"File_New": "../Data/TOR/Menu/New/11181.pak3",
|
||||
"Text_Start": 2100,
|
||||
"Text_End": 16585,
|
||||
"Base_Offset": 0,
|
||||
"Sections":
|
||||
[
|
||||
{
|
||||
"Section": "Triangle Menu",
|
||||
"Pointer_Offset_Start": 58888,
|
||||
"Pointer_Offset_Start": 8,
|
||||
"Nb_Per_Block": 1,
|
||||
"Step": 0,
|
||||
"Text_Start": 60980,
|
||||
"Text_End": 75466
|
||||
"Text_Start": 2100,
|
||||
"Text_End": 16585
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"File_Extract": "../Data/TOR/Menu/New/00023/00023_0000d.unknown",
|
||||
"File_XML": "../Data/TOR/Menu/XML/00023_0000.xml",
|
||||
"File_New": "../Data/TOR/Menu/New/00023.pak3",
|
||||
"Base_Offset": 0,
|
||||
"Sections":
|
||||
[
|
||||
{
|
||||
"Section": "Panic Mini Game 1",
|
||||
"Pointer_Offset_Start": 6268,
|
||||
"Nb_Per_Block": 1,
|
||||
"Step": 28,
|
||||
"Text_Start": 14676,
|
||||
"Text_End": 16086
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"File_Extract": "../Data/TOR/Menu/New/00023/00023_0002.unknown",
|
||||
"File_XML": "../Data/TOR/Menu/XML/00023_0002.xml",
|
||||
"File_New": "../Data/TOR/Menu/New/00023.pak3",
|
||||
"Base_Offset": 0,
|
||||
"Sections":
|
||||
[
|
||||
{
|
||||
"Section": "Panic Mini Game 2.1",
|
||||
"Pointer_Offset_Start": 8,
|
||||
"Nb_Per_Block": 1,
|
||||
"Step": 0,
|
||||
"Text_Start": 364,
|
||||
"Text_End": 478
|
||||
},
|
||||
{
|
||||
"Section": "Panic Mini Game 2.2",
|
||||
"Pointer_Offset_Start": 84,
|
||||
"Nb_Per_Block": 1,
|
||||
"Step": 0,
|
||||
"Text_Start": 556,
|
||||
"Text_End": 1278
|
||||
}
|
||||
]
|
||||
},
|
||||
|
||||
1491
TOR_Consumable_dump_eng.txt
Normal file
1491
TOR_Consumable_dump_eng.txt
Normal file
File diff suppressed because it is too large
Load Diff
29
TOR_Test.py
29
TOR_Test.py
@@ -7,18 +7,37 @@ import re
|
||||
import string
|
||||
import pandas as pd
|
||||
import json
|
||||
import os
|
||||
|
||||
|
||||
tool = ToolsTOR.ToolsTOR("tbl")
|
||||
|
||||
tool.bytes_to_text_with_offset("../Data/TOR/Disc/Original/SLPS_254.50", 0x119890)
|
||||
|
||||
with open("MenuFiles.json") as f:
|
||||
menu_files_json = json.load(f)
|
||||
|
||||
file_def = [ele for ele in menu_files_json if ele['File_Extract'] == "../Data/TOR/Menu/New/00013/00013_0000d.unknown" ][0]
|
||||
file_def = [ele for ele in menu_files_json if ele['File_Extract'] == "../Data/TOR/Disc/Original/SLPS_254.50" ][0]
|
||||
tool.extract_Menu_File(file_def)
|
||||
#tool.insert_Menu_File("../Data/TOR/Disc/Original/SLPS_254.50")
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
myDir = "../Data/TOR/DAT"
|
||||
extensions = ['bin', 'pak1', 'pak2', 'pak3', 'unknown', 'ovl', 'scpk']
|
||||
for path, subdirs, files in os.walk(myDir):
|
||||
for name in [ele for ele in files if ele.split(".")[-1] in extensions]:
|
||||
|
||||
print("File : {}".format(name))
|
||||
tool.bytes_to_text_with_offset(os.path.join(path,name), 0x0)
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
tool.bytes_to_text_with_offset("../Data/TOR/Disc/Original/SLPS_254.50", 0x0)
|
||||
|
||||
|
||||
tool.insert_Menu_File("../Data/TOR/Disc/Original/SLPS_254.50")
|
||||
|
||||
|
||||
|
||||
|
||||
30
ToolsTOR.py
30
ToolsTOR.py
@@ -160,29 +160,15 @@ class ToolsTOR(ToolsTales):
|
||||
theirsce.seek(pointer_block, 0) #Go the the start of the pointer section
|
||||
pointers_offset, texts_offset = self.extraxtStoryPointers(theirsce, strings_offset, fsize)
|
||||
|
||||
text_list = [self.bytesToText(theirsce, ele)[0] for ele in texts_offset]
|
||||
|
||||
|
||||
#Remove duplicates
|
||||
list_informations = self.remove_duplicates(["Story"] * len(pointers_offset), pointers_offset, text_list)
|
||||
|
||||
|
||||
#Extract the text from each pointers
|
||||
textList = []
|
||||
for i in range(len(texts_offset)):
|
||||
|
||||
#Extract the text
|
||||
theirsce.seek(texts_offset[i], 0)
|
||||
text = self.bytesToText(theirsce)
|
||||
|
||||
#Add it to the XML node
|
||||
entry_node = etree.SubElement(stringsNode, "Entry")
|
||||
etree.SubElement(entry_node,"PointerOffset").text = str(pointers_offset[i])
|
||||
etree.SubElement(entry_node,"JapaneseText").text = text
|
||||
etree.SubElement(entry_node,"EnglishText").text = ''
|
||||
etree.SubElement(entry_node,"Notes").text = ''
|
||||
|
||||
if text == '':
|
||||
statusText = 'Done'
|
||||
else:
|
||||
statusText = 'To Do'
|
||||
etree.SubElement(entry_node,"Status").text = statusText
|
||||
|
||||
#Build the XML Structure with the information
|
||||
file_path = self.storyPathXML + self.get_file_name(scpkFileName)
|
||||
root = self.create_Node_XML(file_path, list_informations, "SceneText")
|
||||
|
||||
#Write the XML file
|
||||
txt=etree.tostring(root, encoding="UTF-8", pretty_print=True)
|
||||
|
||||
@@ -241,10 +241,10 @@ class ToolsTales:
|
||||
|
||||
|
||||
offset = hex(pos).replace("0x","")
|
||||
print(offset)
|
||||
text = self.bytesToText(f)
|
||||
text, hex_values = self.bytesToText(f)
|
||||
node = etree.SubElement( root, "Entry")
|
||||
etree.SubElement(node, "TextOffset").text = offset
|
||||
etree.SubElement(node, "HexValues").text = hex_values
|
||||
etree.SubElement(node, "Japanese").text = text
|
||||
|
||||
|
||||
@@ -266,18 +266,20 @@ class ToolsTales:
|
||||
|
||||
|
||||
#Convert a bytes object to text using TAGS and TBL in the json file
|
||||
def bytesToText(self, fileRead, end_strings = b"\x00", offset=-1):
|
||||
def bytesToText(self, fileRead, offset=-1, end_strings = b"\x00"):
|
||||
|
||||
finalText = ''
|
||||
TAGS = self.jsonTblTags['TAGS']
|
||||
|
||||
if (offset > 0):
|
||||
fileRead.seek(offset, 0)
|
||||
|
||||
|
||||
pos = fileRead.tell()
|
||||
b = fileRead.read(1)
|
||||
while b != end_strings:
|
||||
|
||||
#print(hex(fileRead.tell()))
|
||||
b = ord(b)
|
||||
|
||||
if (b >= 0x99 and b <= 0x9F) or (b >= 0xE0 and b <= 0xEB):
|
||||
c = (b << 8) + ord(fileRead.read(1))
|
||||
|
||||
@@ -317,10 +319,12 @@ class ToolsTales:
|
||||
next_b = b""
|
||||
while next_b != b"\x80":
|
||||
|
||||
if next_b != b'':
|
||||
finalText += "{%02X}" % ord(next_b)
|
||||
else:
|
||||
next_b = b"\x80"
|
||||
next_b = fileRead.read(1)
|
||||
finalText += "{%02X}" % ord(next_b)
|
||||
#if next_b != b'':
|
||||
|
||||
#else:
|
||||
# next_b = b"\x80"
|
||||
elif b == 0x81:
|
||||
next_b = fileRead.read(1)
|
||||
if next_b == b"\x40":
|
||||
@@ -332,8 +336,13 @@ class ToolsTales:
|
||||
finalText += "{%02X}" % b
|
||||
b = fileRead.read(1)
|
||||
|
||||
|
||||
return finalText
|
||||
end = fileRead.tell()
|
||||
size = fileRead.tell() - pos - 1
|
||||
fileRead.seek(pos)
|
||||
hex_string = fileRead.read(size).hex()
|
||||
hex_values = ' '.join(a+b for a,b in zip(hex_string[::2], hex_string[1::2]))
|
||||
fileRead.seek(end)
|
||||
return finalText, hex_values
|
||||
|
||||
#Convert text to Bytes object to reinsert text into THEIRSCE and other files
|
||||
def textToBytes(self, text):
|
||||
@@ -385,7 +394,12 @@ class ToolsTales:
|
||||
|
||||
return bytesFinal
|
||||
|
||||
def create_Menu_Entry(self, strings_node, section, pointer_offset, text):
|
||||
def search_all_files(self, japanese_text):
|
||||
|
||||
#Return the bytes for that specific text
|
||||
bytes_from_text = self.textToBytes(japanese_text)
|
||||
|
||||
def create_Entry(self, strings_node, section, pointer_offset, text):
|
||||
|
||||
#Add it to the XML node
|
||||
entry_node = etree.SubElement(strings_node, "Entry")
|
||||
@@ -401,9 +415,9 @@ class ToolsTales:
|
||||
etree.SubElement(entry_node,"Status").text = statusText
|
||||
|
||||
|
||||
def create_Menu_XML(self, fileName, list_informations):
|
||||
def create_Node_XML(self, fileName, list_informations, parent):
|
||||
|
||||
root = etree.Element('MenuText')
|
||||
root = etree.Element(parent)
|
||||
|
||||
|
||||
|
||||
@@ -417,7 +431,7 @@ class ToolsTales:
|
||||
|
||||
|
||||
for s, pointers_offset, text in list_section:
|
||||
self.create_Menu_Entry( strings_node, s, pointers_offset, text)
|
||||
self.create_Entry( strings_node, s, pointers_offset, text)
|
||||
|
||||
return root
|
||||
|
||||
@@ -577,6 +591,8 @@ class ToolsTales:
|
||||
# nb_per_block : number of pointers per block before adding step
|
||||
# step : number of bytes before the next block
|
||||
def get_special_pointers(self, text_start, text_max, base_offset, start_offset, nb_per_block, step, section,file_path=''):
|
||||
|
||||
|
||||
|
||||
if file_path == '':
|
||||
file_path = self.elfOriginal
|
||||
@@ -595,8 +611,6 @@ class ToolsTales:
|
||||
|
||||
|
||||
block_pointers_offset = [f.tell()+4*i for i in range(nb_per_block)]
|
||||
if section == "Artes":
|
||||
print( [hex(ele) for ele in block_pointers_offset])
|
||||
|
||||
block_pointers_value = struct.unpack(f"<{nb_per_block}L", f.read(4 * nb_per_block))
|
||||
list_test.extend(block_pointers_value)
|
||||
@@ -622,6 +636,7 @@ class ToolsTales:
|
||||
pointers_value = [pointers_value[i] for i in good_indexes]
|
||||
|
||||
return [pointers_offset, pointers_value]
|
||||
|
||||
def extract_Menu_File(self, file_definition):
|
||||
|
||||
|
||||
@@ -643,11 +658,10 @@ class ToolsTales:
|
||||
|
||||
#Extract Pointers of the file
|
||||
pointers_offset, pointers_value = self.get_special_pointers( text_start, text_end, base_offset, section['Pointer_Offset_Start'], section['Nb_Per_Block'], section['Step'], section['Section'], file_path)
|
||||
|
||||
|
||||
#Extract Text from the pointers
|
||||
texts = [ self.bytesToText(f, ele + base_offset) for ele in pointers_value]
|
||||
|
||||
texts_offset = [ele + base_offset for ele in pointers_value]
|
||||
texts = [ self.bytesToText(f, ele + base_offset)[0] for ele in pointers_value]
|
||||
|
||||
|
||||
#Make a list
|
||||
section_list.extend( [section['Section']] * len(texts))
|
||||
@@ -658,7 +672,7 @@ class ToolsTales:
|
||||
list_informations = self.remove_duplicates(section_list, pointers_offset_list, texts_list)
|
||||
|
||||
#Build the XML Structure with the information
|
||||
root = self.create_Menu_XML(file_path, list_informations)
|
||||
root = self.create_Node_XML(file_path, list_informations, "MenuText")
|
||||
|
||||
#Write to XML file
|
||||
txt=etree.tostring(root, encoding="UTF-8", pretty_print=True)
|
||||
|
||||
@@ -177,7 +177,7 @@ def hex2bytes(tales_instance, hex_value):
|
||||
#print(bytes_value)
|
||||
f = io.BytesIO(bytes_value)
|
||||
f.seek(0)
|
||||
txt = tales_instance.bytesToText(f, b'', -1)
|
||||
txt, offset = tales_instance.bytesToText(f, -1, b'')
|
||||
txt = "\n\n".join([ele for ele in txt.split("{00}") if ele != ""])
|
||||
with open("text_dump.txt", "w",encoding="utf-8") as f:
|
||||
f.write(txt)
|
||||
|
||||
Binary file not shown.
Binary file not shown.
198
text_dump.txt
198
text_dump.txt
@@ -1,197 +1 @@
|
||||
円周上に石片を生み出し、巨大な石槍で貫く
|
||||
地系導術。
|
||||
|
||||
ストーンブレイク
|
||||
|
||||
術者から地面を這う雷撃を放つ光系導術。
|
||||
ラインを合わせてから詠唱する必要がある。
|
||||
|
||||
サンダースピア
|
||||
|
||||
地面から垂直に水流を噴き出す水系導術。
|
||||
浮かし効果があるが、範囲が狭い。
|
||||
|
||||
スプラッシャー
|
||||
|
||||
地面から岩つぶてを射出する地系導術。
|
||||
敵の背が低すぎると当たりづらい。
|
||||
|
||||
ロックバラージ
|
||||
|
||||
範囲内の敵を逃さない無数の曲撃ちを
|
||||
繰り出す奥義。
|
||||
|
||||
ソウハツイレンセン
|
||||
|
||||
蒼破墜蓮閃
|
||||
|
||||
鋭い踏み込みで間合いを詰め、水流と
|
||||
共に拳を突き上げる奥義。
|
||||
|
||||
クウハソウショウセン
|
||||
|
||||
空破蒼翔閃
|
||||
|
||||
強烈極まるカカト落としで敵を地面に釘付けに
|
||||
する奥義。衝撃波で他の敵も巻き込む。
|
||||
|
||||
クウハツイレンセン
|
||||
|
||||
空破墜蓮閃
|
||||
|
||||
斜め上に向けての拡散連射奥義。普段は
|
||||
なにげにヒットしないが、巨大な敵には……
|
||||
|
||||
グレンソウショウセン
|
||||
|
||||
愚連蒼翔閃
|
||||
|
||||
樹砲閃の3連射を繰り出す奥義。
|
||||
浮かし能力にも優れる。
|
||||
|
||||
グレンツイレンセン
|
||||
|
||||
愚連墜蓮閃
|
||||
|
||||
脚を使った往復ビンタをかます奥義。
|
||||
締めの蹴りで敵を奥ラインに吹き飛ばす。
|
||||
|
||||
グレンザンクウキャク
|
||||
|
||||
愚連斬空脚
|
||||
|
||||
間合いが開いた敵を更に吹き飛ばせる、
|
||||
踏み込みからの水圧射撃を放つ奥義。
|
||||
|
||||
ゴウレツソウショウセン
|
||||
|
||||
轟裂蒼翔閃
|
||||
|
||||
気功弾を放ち、間合いの離れた敵も狙える
|
||||
奥義。密着状態で6ヒットする。
|
||||
|
||||
ヒオウゴウショウガ
|
||||
|
||||
緋桜轟衝牙
|
||||
|
||||
アッパー、そして謎の三角蹴りで敵を
|
||||
目も当てられないくらい吹き飛ばす奥義。
|
||||
|
||||
ゴウレツザンクウキャク
|
||||
|
||||
轟裂斬空脚
|
||||
|
||||
気を溜めて多段ヒットする気功弾を生み出す
|
||||
奥義。
|
||||
|
||||
ゴウレツレンガダン
|
||||
|
||||
轟裂連牙弾
|
||||
|
||||
曲撃ちで敵を引き寄せ、連続蹴りを見舞う
|
||||
奥義。初段のショットはガードを破れる。
|
||||
|
||||
ソウハレンテンキャク
|
||||
|
||||
蒼破連天脚
|
||||
|
||||
気合の蹴り上げから、貫通ショットを放つ
|
||||
奥義。後ろに複数の敵がいる場合に有効。
|
||||
|
||||
ヒレンツイレンセン
|
||||
|
||||
飛連墜蓮閃
|
||||
|
||||
果てしなく蹴り上げる奥義。一人旅に注意。
|
||||
あるいは狙って攻撃回避にも使える?
|
||||
|
||||
ヒレンザンクウキャク
|
||||
|
||||
飛連斬空脚
|
||||
|
||||
蹴りと拳を交えた連続攻撃を繰り出す奥義。
|
||||
|
||||
|
||||
グレンレンテンキャク
|
||||
|
||||
愚連連天脚
|
||||
|
||||
連続回し蹴りから轟裂破に繋げる奥義。
|
||||
吹き飛び方はやや短い。
|
||||
|
||||
ヒレンゴウショウガ
|
||||
|
||||
飛連轟衝牙
|
||||
|
||||
体内に眠る全ての力を解放し、打撃特技後の
|
||||
スキをなくす錬術。のけぞり時間も短くなる。
|
||||
|
||||
ゲキ・シュンサツレン
|
||||
|
||||
激・瞬殺連
|
||||
|
||||
自然の加護を得て、防御中にHPが回復する
|
||||
ようになる錬術。
|
||||
|
||||
ゲキ・ジュソウヘキ
|
||||
|
||||
激・樹装壁
|
||||
|
||||
上空に射撃し、矢を炸裂させて広範囲の敵を
|
||||
狙う射撃特技。敵によってヒット数が変わる。
|
||||
|
||||
センショウセン
|
||||
|
||||
扇翔閃
|
||||
|
||||
足元に射撃した矢を反射させて敵を狙う
|
||||
射撃特技。単発だが追尾能力は高い。
|
||||
|
||||
ジュホウセン
|
||||
|
||||
樹砲閃
|
||||
|
||||
スライディングから繋ぐ回転蹴りで、敵を
|
||||
手前ラインに蹴り飛ばす特技。自分も飛んでく。
|
||||
|
||||
シックウハ
|
||||
|
||||
疾空波
|
||||
|
||||
拳の連撃を叩き込む特技。
|
||||
連携のしやすさではトップクラス。
|
||||
|
||||
ガレンゲキ
|
||||
|
||||
牙連撃
|
||||
|
||||
強烈に吹き飛ばす特技。
|
||||
間合いを開けるのに重宝する。
|
||||
|
||||
ゴウレッパ
|
||||
|
||||
轟裂破
|
||||
|
||||
空中回転二連蹴りを繰り出す特技。
|
||||
敵の背が低いとあたりづらいのが欠点。
|
||||
|
||||
ショウレンキャク
|
||||
|
||||
翔連脚
|
||||
|
||||
発動中、敵のガードを破れるようになる陣術奥義。
|
||||
|
||||
|
||||
ブレイク・レーゲン
|
||||
|
||||
発動中、味方全員が、RGに関係なく
|
||||
奥義を発動できるようになる陣術奥義。
|
||||
|
||||
アーツ・レーゲン
|
||||
|
||||
広範囲の味方の移動速度を上げる陣術奥義。
|
||||
|
||||
|
||||
ファスト・レーゲン
|
||||
|
||||
発動中、敵からの攻撃を無効化する陣術奥義。
|
||||
アイテムいろいろ
|
||||
Reference in New Issue
Block a user