mirror of
https://github.com/qwerfd2/Groove_Coaster_2_Server.git
synced 2025-12-22 03:30:18 +00:00
add pak reader/writer
This commit is contained in:
62
various-tools/stage_param/reader.py
Normal file
62
various-tools/stage_param/reader.py
Normal 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")
|
||||
60
various-tools/stage_param/writer.py
Normal file
60
various-tools/stage_param/writer.py
Normal 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")
|
||||
Reference in New Issue
Block a user