Last active
December 29, 2023 23:20
-
-
Save Prof9/2b121db5dfd4d2e11279bb383ed48bcc to your computer and use it in GitHub Desktop.
LoN and PoN text dump
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import struct | |
import subprocess | |
from datetime import datetime | |
from pathlib import Path | |
path_7zip = Path("C:\\Program Files\\7-Zip\\7z.exe") | |
path_lon = Path("LoN_ch1\\DoJa_5_1_files\\LoN") | |
path_pon = Path("PoN_ch1to3\\DoJa_5_1_files\\PoN") | |
path_lon_sp = Path("LoN_sp") | |
path_pon_sp = Path("PoN_sp") | |
# Dump LoN and PoN base JARs | |
subprocess.run( | |
[path_7zip, "x", path_lon.absolute() / "bin" / "LoN.jar", "-oLoN", "-aoa"] | |
).check_returncode() | |
subprocess.run( | |
[path_7zip, "x", path_pon.absolute() / "bin" / "PoN.jar", "-oPoN", "-aoa"] | |
).check_returncode() | |
def dump_archive(base_path, path, line_split=30, line_count=3, box_count=1): | |
name = path.replace("\\", "_") | |
dump = [] | |
dump.append(f"###TextArchive:{name}\n") | |
with open(f"{base_path}\\{path}", "rb") as s: | |
script_num = 0 | |
box_num = 0 | |
while len(s.peek(1)) != 0: | |
string = s.read(line_split * line_count) | |
if len(string) == 0: | |
break | |
lines = [ | |
string[i * line_split : (i + 1) * line_split] for i in range(line_count) | |
] | |
lines = [ | |
l.decode("cp932").replace("\0", "").replace("\u3000", " ") | |
for l in lines | |
] | |
for i in reversed(range(line_count)): | |
if len(lines[i]) == 0: | |
lines.pop() | |
else: | |
break | |
if len(lines) > 0: | |
if box_num == 0: | |
dump.append(f"###Script:{script_num}\n") | |
for l in lines: | |
dump.append(f"{l}\n") | |
dump.append("###--------\n") | |
box_num += 1 | |
if box_num >= box_count: | |
box_num = 0 | |
script_num += 1 | |
return dump | |
def dump_archive_stringarray(base_path, path): | |
name = path.replace("\\", "_") | |
dump = [] | |
dump.append(f"###TextArchive:{name}\n") | |
with open(f"{base_path}\\{path}", "rb") as s: | |
lines = s.readlines() | |
lines = [l.decode("cp932") for l in lines] | |
for i in range(len(lines)): | |
l = lines[i].rstrip() | |
dump.append(f"###Script:{i}\n") | |
dump.append(f"{l}\n") | |
dump.append("###--------\n") | |
return dump | |
def dump_archive_jar(base_path, path): | |
subprocess.run( | |
[ | |
path_7zip, | |
"x", | |
f"{base_path}\\{path}\\s.jar", | |
f"-o{base_path}\\{path}\\s", | |
"-aoa", | |
] | |
).check_returncode() | |
return dump_archive(base_path, f"{path}\\s\\data.dat") | |
def dump_archive_packed(base_path, path, num_subfiles): | |
dump = [] | |
base_path = Path(base_path) | |
path = Path(path) | |
(base_path / path / "s").mkdir(parents=True, exist_ok=True) | |
with open(base_path / path / "s.dat", "rb") as s: | |
sizes = [] | |
for i in range(num_subfiles): | |
(size,) = struct.unpack_from(">I", s.read(4)) | |
sizes.append(size) | |
for i in range(num_subfiles): | |
zip_bytes = s.read(sizes[i]) | |
(base_path / path / "s" / f"s_{i}.jar").write_bytes(zip_bytes) | |
for i in range(num_subfiles): | |
subprocess.run( | |
[ | |
path_7zip, | |
"x", | |
f"{base_path}\\{path}\\s\\s_{i}.jar", | |
f"-o{base_path}\\{path}\\s\\s_{i}", | |
"-aoa", | |
] | |
).check_returncode() | |
dump += dump_archive(base_path, f"{path}\\s\\s_{i}\\data.dat") | |
return dump | |
# Dump PoN text | |
dump = [] | |
file_count = 4 + 64 + 9 * 5 + 9 | |
date = datetime.utcnow().strftime("%Y-%m-%d %H:%M:%SZ") | |
dump.append(f"## Text Dump\n") | |
dump.append(f"## Game: Rockman EXE: Phantom of Network\n") | |
dump.append(f"## Files: {file_count}\n") | |
dump.append(f"## Date: {date}\n") | |
dump += dump_archive(f"PoN\\data", f"new\\10mail_mes.dat") | |
dump += dump_archive(f"PoN\\data", f"new\\sina_mes2.dat") | |
dump += dump_archive(f"PoN\\data", f"new\\sys_mes2.dat") | |
dump += dump_archive(f"PoN\\data", f"quest\\quest.dat", box_count=4) | |
for i in range(1, 64): | |
dump += dump_archive_jar(f"PoN\\data", f"quest\\{i}") | |
for i in range(1, 9): | |
dump += dump_archive_packed(f"PoN\\data", f"scenario\\{i}", 5) | |
dump += dump_archive(path_pon_sp, "sp_jar9.bin", line_count=1) | |
dump += dump_archive(path_pon_sp, "sp_jar10.bin") | |
dump += dump_archive(path_pon_sp, "sp_jar11.bin") | |
dump += dump_archive(path_pon_sp, "sp_jar12.bin", line_count=2) | |
dump += dump_archive(path_pon_sp, "sp_jar13.bin", line_count=2) | |
dump += dump_archive(path_pon_sp, "sp_jar19.bin", line_split=16, line_count=1) | |
dump += dump_archive(path_pon_sp, "sp_jar22.bin", line_split=16, line_count=1) | |
dump += dump_archive(path_pon_sp, "sp_jar29.bin", line_split=16, line_count=1) | |
dump += dump_archive(path_pon_sp, "sp_jar35.bin") | |
with open("exepon.txt", "w", encoding="utf-8") as f: | |
f.writelines(dump) | |
# Dump LoN text | |
dump = [] | |
file_count = 3 + 65 + 10 * 6 + 9 | |
date = datetime.utcnow().strftime("%Y-%m-%d %H:%M:%SZ") | |
dump.append(f"## Text Dump\n") | |
dump.append(f"## Game: Rockman EXE: Legend of Network\n") | |
dump.append(f"## Files: {file_count}\n") | |
dump.append(f"## Date: {date}\n") | |
dump += dump_archive(f"LoN\\data", f"new\\sina_mes2.dat") | |
dump += dump_archive(f"LoN\\data", f"new\\sys_mes2.dat") | |
dump += dump_archive(f"LoN\\data", f"quest\\quest.dat") | |
for i in range(1, 65): | |
dump += dump_archive_jar(f"LoN\\data", f"quest\\{i}") | |
for i in range(1, 10): | |
dump += dump_archive_packed(f"LoN\\data", f"scenario\\{i}", 6) | |
dump += dump_archive(path_lon_sp, "sp_jar11.bin") | |
dump += dump_archive(path_lon_sp, "sp_jar12.bin", line_count=2) | |
dump += dump_archive(path_lon_sp, "sp_jar13.bin", line_count=2) | |
dump += dump_archive(path_lon_sp, "sp_jar19.bin", line_split=16, line_count=1) | |
dump += dump_archive(path_lon_sp, "sp_jar22.bin", line_split=16, line_count=1) | |
dump += dump_archive(path_lon_sp, "sp_jar29.bin", line_split=16, line_count=1) | |
dump += dump_archive(path_lon_sp, "sp_jar35.bin") | |
dump += dump_archive_stringarray(path_lon_sp, "sp_jar37.bin") | |
dump += dump_archive_stringarray(path_lon_sp, "sp_jar38.bin") | |
with open("exelon.txt", "w", encoding="utf-8") as f: | |
f.writelines(dump) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment