Skip to content

Instantly share code, notes, and snippets.

@Prof9
Last active December 29, 2023 23:20
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save Prof9/2b121db5dfd4d2e11279bb383ed48bcc to your computer and use it in GitHub Desktop.
Save Prof9/2b121db5dfd4d2e11279bb383ed48bcc to your computer and use it in GitHub Desktop.
LoN and PoN text dump
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