예제 #1
0
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"
예제 #2
0
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
예제 #3
0
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)
예제 #4
0
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)
예제 #5
0
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))
예제 #6
0
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"])
예제 #7
0
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"])
예제 #8
0
def write_damage_reduction(writer: BinaryWriter, item: Dict):
    writer.write_byte(item["index"])
    writer.write_float(item["multiplier"])
예제 #9
0
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"])
예제 #10
0
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)