def test_write(): b = io.BytesIO() b_io = b # type: BinaryIO writer = BinaryWriter(b_io) writer.write_string("foo") writer.write_byte(5) writer.write_short(1505) writer.write_bool(False) assert b.getvalue() == b"foo\x00\x05\x05\xe1\x00"
def encode(original_data: Dict, x: BinaryIO) -> dict: data = copy.copy(original_data) writer = BinaryWriter(x) x.write(b"Req.") writer.write_uint(current_format_version) writer.write_byte(data.pop("game")) writer.write_string(data.pop("game_name")) # Resource Info database resource_database = data.pop("resource_database") write_array(writer, resource_database["items"], write_resource_info) write_array(writer, resource_database["events"], write_resource_info) write_array(writer, resource_database["tricks"], write_resource_info) write_array(writer, resource_database["damage"], write_damage_resource_info) write_array(writer, resource_database["versions"], write_resource_info) write_array(writer, resource_database["misc"], write_resource_info) write_array(writer, resource_database["difficulty"], write_resource_info) # Dock Weakness Database dock_weakness_database = data.pop("dock_weakness_database") write_array(writer, dock_weakness_database["door"], write_dock_weakness) write_array(writer, dock_weakness_database["portal"], write_dock_weakness) # Worlds List write_array(writer, data.pop("worlds"), write_world) return data
def write_area(writer: BinaryWriter, item: Dict): writer.write_string(item["name"]) writer.write_uint(item["asset_id"]) writer.write_byte(len(item["nodes"])) writer.write_byte(item["default_node_index"]) for node in item["nodes"]: write_node(writer, node) for origin in item["nodes"]: for target in item["nodes"]: if origin != target: requirement_set = origin["connections"].get(target["name"], _IMPOSSIBLE_SET) write_requirement_set(writer, requirement_set)
def write_world(writer: BinaryWriter, item: Dict): writer.write_string(item["name"]) writer.write_uint(item["asset_id"]) write_array(writer, item["areas"], write_area)
def write_node(writer: BinaryWriter, node: Dict): writer.write_string(node["name"]) writer.write_bool(node["heal"]) writer.write_byte(node["node_type"]) node_type = node["node_type"] if node_type == 0: pass elif node_type == 1: writer.write_byte(node["dock_index"]) writer.write_uint(node["connected_area_asset_id"]) writer.write_byte(node["connected_dock_index"]) writer.write_byte(node["dock_type"]) writer.write_byte(node["dock_weakness_index"]) writer.write_byte(0) writer.write_byte(0) writer.write_byte(0) elif node_type == 2: writer.write_byte(node["pickup_index"]) elif node_type == 3: writer.write_uint(node["destination_world_asset_id"]) writer.write_uint(node["destination_area_asset_id"]) writer.write_uint(node["teleporter_instance_id"]) elif node_type == 4: writer.write_byte(node["event_index"]) else: raise Exception("Unknown node type: {}".format(node_type))
def write_dock_weakness(writer: BinaryWriter, item: Dict): writer.write_byte(item["index"]) writer.write_string(item["name"]) writer.write_bool(item["is_blast_door"]) write_requirement_set(writer, item["requirement_set"])
def write_individual_requirement(writer: BinaryWriter, item: Dict): writer.write_byte(item["requirement_type"]) writer.write_byte(item["requirement_index"]) writer.write_short(item["amount"]) writer.write_bool(item["negate"])
def write_damage_reduction(writer: BinaryWriter, item: Dict): writer.write_byte(item["index"]) writer.write_float(item["multiplier"])
def write_resource_info(writer: BinaryWriter, item: Dict): writer.write_byte(item["index"]) writer.write_string(item["long_name"]) writer.write_string(item["short_name"])
def write_array(writer: BinaryWriter, array: List[X], item_writer: Callable[[BinaryWriter, X], None]): writer.write_byte(len(array)) for item in array: item_writer(writer, item)