import mmap import struct from pathlib import Path import json prop_data = Path(f"YGO_2020/bin/CARD_Prop.bin").read_bytes() # Get all the bytes print(prop_data[8]) # one byte supposedly def read_until_null(indx: int, data: tuple) -> int: end = indx while end + 1 < len(data): ## Read 2 bytes at a time until null found if data[end:end+2] == b"\x00\x00": break end += 2 return end # 8 bytes at a time cd_db = {} def get_props(): test = 1 for r in range(0,len(prop_data),8): print(prop_data[r:r+8].hex(' ')) # print the byte range card_prop = prop_data[r:r+8] card_prop = card_prop[::-1] #print(card_prop.hex(' ')) card_first = prop_data[r:r+4] #Get first 4 bytes in range card_second = prop_data[r+4:r+8] #Get first 4 bytes in range # offsets_data[4:8].hex() card_index_name_data = int.from_bytes( offsets_data[r:r+4], byteorder='little' ) card_index_desc_data = int.from_bytes( offsets_data[r+4:r+8], byteorder='little' ) #card_id = card_id[::-1] card_bytes = int.from_bytes(card_first,byteorder='little') card_bytes_2 = int.from_bytes(card_second,byteorder='little') card_id = card_bytes & 16383 if card_id == 0: continue card_attack = ((card_bytes >> 14) & 511) * 10 card_defense = ((card_bytes >> 18) & 511) * 10 print(card_id , card_attack, card_attack, 'idx', card_index_name_data, card_index_desc_data) #read until null found # end = card_index_name_data # while end + 1 < len(name_data): # ## Read 2 bytes at a time until null found # if name_data[end:end+2] == b"\x00\x00": # break # end += 2 # name = name_data[card_index_name_data:end].decode("utf-16le", errors="replace") end_index = read_until_null(card_index_name_data, name_data) name = name_data[card_index_name_data:end_index].decode("utf-16le", errors="replace") end_index = read_until_null(card_index_desc_data, desc_data) desc = desc_data[card_index_desc_data:end_index].decode("utf-16le", errors="replace") print(name) #print(card_id.hex(' ')) # 2. Get last 14 bits using mask 0x3FFF (binary 11 1111 1111 1111) #print([bin(x) for x in card_first]) test += 1 # if test > 3: # break; #print(prop_data[r:r+8]) if cd_db.get(card_id) is None: cd_db[card_id] = {} # { # f"name_{language_code}":name, # f"desc_{language_code}": 'foo', # f"name_addr_{language_code}": hex(card_index_name_data), # f"desc_addr_{language_code}": hex(card_index_desc_data) # } cd_db[card_id][f"name_{language_code}"] = name cd_db[card_id][f"desc_{language_code}"] = desc cd_db[card_id][f"name_addr_{language_code}"] = hex(card_index_name_data) cd_db[card_id][f"desc_addr_{language_code}"] = hex(card_index_desc_data) language_code = 'E' offsets_data = Path(f"YGO_2020/bin/CARD_Indx_{language_code}.bin").read_bytes() # Get all the bytes name_data = Path(f"YGO_2020/bin/CARD_Name_{language_code}.bin").read_bytes() # Get all the bytes desc_data = Path(f"YGO_2020/bin/CARD_Desc_{language_code}.bin").read_bytes() get_props() language_code = 'J' offsets_data = Path(f"YGO_2020/bin/CARD_Indx_{language_code}.bin").read_bytes() # Get all the bytes name_data = Path(f"YGO_2020/bin/CARD_Name_{language_code}.bin").read_bytes() # Get all the bytes desc_data = Path(f"YGO_2020/bin/CARD_Desc_{language_code}.bin").read_bytes() get_props() with open("dump2.json", "w", encoding="utf-16") as outfile: json.dump(cd_db, outfile, ensure_ascii=False, indent=2) print()