add pak reader/writer

This commit is contained in:
UnitedAirforce
2025-01-29 15:31:03 +08:00
parent 02dc9c5188
commit 31c9b35057
4 changed files with 122 additions and 0 deletions

View File

@@ -0,0 +1,62 @@
import struct
import json
def read_string(f):
length = struct.unpack("B", f.read(1))[0]
return f.read(length).decode("utf-8")
def read_int(f, size=2):
return int.from_bytes(f.read(size), byteorder="big")
def read_list_of_ints(f):
levels = []
for _ in range(6):
levels.append(struct.unpack('B', f.read(1))[0])
return levels
def read_hex_string(f, size):
return " ".join(f"{b:02X}" for b in f.read(size))
def read_flag_list(f):
byte = f.read(1)[0]
return [(byte >> i) & 1 for i in range(7, -1, -1)]
def parse_stage_param(file_path):
with open(file_path, "rb") as f:
num_elements = read_int(f, 2)
print(num_elements)
data = []
for _ in range(num_elements):
element = {
"name_ja": read_string(f),
"name_en": read_string(f),
"image_id": read_int(f),
"artist_ja": read_string(f),
"artist_en": read_string(f),
"length": read_string(f),
"difficulty": read_list_of_ints(f),
"bpm": read_string(f),
"sample_name": read_string(f),
"stage_id": read_string(f),
"dd": f.read(2).decode("utf-8"),
"ver": read_int(f, 1),
"easy_name": read_string(f),
"normal_name": read_string(f),
"hard_name": read_string(f),
"adlib_max_easy": read_int(f, 4),
"adlib_max_normal": read_int(f, 4),
"adlib_max_hard": read_int(f, 4),
"no_adlib_max_easy": read_int(f, 4),
"no_adlib_max_normal": read_int(f, 4),
"no_adlib_max_hard": read_int(f, 4),
"field_1": read_hex_string(f, 4),
"padding_1": read_hex_string(f, 11),
"flag_1": read_flag_list(f),
"padding_2": read_hex_string(f, 5)
}
data.append(element)
with open("stage_param.json", "w", encoding="utf-8") as f:
json.dump(data, f, indent=4, ensure_ascii=False)
parse_stage_param("stage_param.dat")

View File

@@ -0,0 +1,60 @@
import json
import struct
def write_string(f, s):
data = s.encode("utf-8")
f.write(struct.pack("B", len(data)))
f.write(data)
def write_int(f, value, size=2):
f.write(value.to_bytes(size, byteorder="big"))
def write_list_of_ints(f, values):
f.write(bytes(values))
def write_hex_string(f, hex_string):
f.write(bytes.fromhex(hex_string))
def write_flag_list(f, flag_list):
byte_value = sum((bit << (7 - i)) for i, bit in enumerate(flag_list))
f.write(struct.pack("B", byte_value))
def convert_json_to_dat(json_path, output_path):
with open(json_path, "r", encoding="utf-8") as f:
data = json.load(f)
with open(output_path, "wb") as f:
write_int(f, len(data), 2)
for element in data:
write_string(f, element["name_ja"])
write_string(f, element["name_en"])
write_int(f, element["image_id"], 2)
write_string(f, element["artist_ja"])
write_string(f, element["artist_en"])
write_string(f, element["length"])
write_list_of_ints(f, element["difficulty"])
write_string(f, element["bpm"])
write_string(f, element["sample_name"])
write_string(f, element["stage_id"])
f.write(element["dd"].encode("utf-8"))
write_int(f, element["ver"], 1)
write_string(f, element["easy_name"])
write_string(f, element["normal_name"])
write_string(f, element["hard_name"])
write_int(f, element["adlib_max_easy"], 4)
write_int(f, element["adlib_max_normal"], 4)
write_int(f, element["adlib_max_hard"], 4)
write_int(f, element["no_adlib_max_easy"], 4)
write_int(f, element["no_adlib_max_normal"], 4)
write_int(f, element["no_adlib_max_hard"], 4)
write_hex_string(f, element["field_1"])
write_hex_string(f, element["padding_1"])
write_flag_list(f, element["flag_1"])
write_hex_string(f, element["padding_2"])
convert_json_to_dat("stage_param.json", "out_stage_param.dat")