diff --git a/various-tools/stage_param/reader.py b/various-tools/stage_param/reader.py new file mode 100644 index 0000000..6215c2a --- /dev/null +++ b/various-tools/stage_param/reader.py @@ -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") \ No newline at end of file diff --git a/various-tools/stage_param.dat b/various-tools/stage_param/stage_param.dat similarity index 100% rename from various-tools/stage_param.dat rename to various-tools/stage_param/stage_param.dat diff --git a/various-tools/stage_param_structure_wip.txt b/various-tools/stage_param/stage_param_structure_wip.txt similarity index 100% rename from various-tools/stage_param_structure_wip.txt rename to various-tools/stage_param/stage_param_structure_wip.txt diff --git a/various-tools/stage_param/writer.py b/various-tools/stage_param/writer.py new file mode 100644 index 0000000..1c89100 --- /dev/null +++ b/various-tools/stage_param/writer.py @@ -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") \ No newline at end of file