Exemple #1
0
def _reader_for(file_name):
    if not (file_name.lower().endswith(".scn")
            or file_name.lower().endswith(".scx")
            or file_name.lower().endswith(".aoescn")):
        raise Exception("Scenario file must end with .scn, .scx or .aoescn")
    with open(file_name, 'rb') as f:
        # Read entire file
        data = ScnDataReader(f.read())
    return data
Exemple #2
0
def load(filename: str) -> GameDataFile:
    with open(filename, 'rb') as f:
        # Read entire file
        data = ScnDataReader(f.read())
        data.decompress()
        # Decompress only!
        # open("Empires_uncompressed.dat", 'wb').write(data.read())
        # exit(0)
        game_data_file = GameDataFile.read(data)
        data.done()
    return game_data_file
Exemple #3
0
def test_read_write_one_player():
    """
    Read/rewrite info for an individual player
    """
    original_data = b'\t\x00Player 1\x00\x00\x00\xaaB\x00\x00lBH\x00H\x00\x00\t\x00\x01\x01\x03\x03\x03\x03\x03\x03\x03\x00\x00\x00\x00\x01\x00\x00\x00\x04\x00\x00\x00\x04\x00\x00\x00\x04\x00\x00\x00\x04\x00\x00\x00\x04\x00\x00\x00\x04\x00\x00\x00\x04\x00\x00\x00\x00\x00\x80?\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
    reader = ScnDataReader(original_data)
    structure = UnknownPlayerDataStructure.read(reader)
    # try to write it back
    writer = ScnDataWriter()
    structure.write(writer)
    new_data = writer.done()
    assert original_data == new_data
Exemple #4
0
def test_default():
    """
    Write then read back the default version of this data
    """
    writer = ScnDataWriter()
    scn_unknown_data_structure.default().write(writer)
    default_structure_binary = writer.done()
    assert len(default_structure_binary) == 708
    # try to read it back
    reader = ScnDataReader(default_structure_binary)
    structure = UnknownDataStructure.read(reader)
    assert structure.player_count == 9
    assert structure.unknown_player_data_structure[7].field1 == 'Player 8'
Exemple #5
0
def load(file_name: str):
    if not (file_name.endswith(".slp")):
        raise Exception("SLP file must end with .slp")

    with open(file_name, 'rb') as f:
        all_data = f.read()
        data = ScnDataReader(all_data)

    header = SlpHeader.read(data)
    frames = []
    for i in range(0, header.frames):
        data.mark('frame {}'.format(i))
        frame_info = SlpFrameInfo.read(data)
        # Sub-reader for outline data (identified by offset)
        outline_region_start = frame_info.outline_table_offset
        outline_region_end = outline_region_start + frame_info.height * 4
        outline_reader = ScnDataReader(
            all_data[outline_region_start:outline_region_end])
        frame_outline = SlpOutline.read(outline_reader, frame_info.height)
        # Sub-reader for pixel offsets
        command_offset_region_start = frame_info.command_table_offset
        command_offset_region_end = command_offset_region_start + frame_info.height * 4
        command_offset_reader = ScnDataReader(
            all_data[command_offset_region_start:command_offset_region_end])
        command_offset = SlpCommandOffset.read(command_offset_reader,
                                               frame_info.height)
        # Sub-reader for pixel data (very inefficient..)
        command_data_reader = ScnDataReader(all_data)
        command_data_reader.read(
            command_offset.row[0]
        )  # read and discard so that we don't need to do maths to find in-file offset
        rows = []
        for y in range(0, frame_info.height):
            row = SlpRow.read(command_data_reader, frame_outline.row[y])
            rows.append(row)
        frames.append(SlpFrame(frame_info, rows))
    return SlpFile(header, frames)
Exemple #6
0
def test_read_write():
    """
    Read/write entire 508 byte data structure found at the end of a blank scenario file.
    """
    original_data = b'\t\x00\x00\x00\t\x00Player 1\x00\x00\x00\xaaB\x00\x00lBH\x00H\x00\x00\t\x00\x01\x01\x03\x03\x03\x03\x03\x03\x03\x00\x00\x00\x00\x01\x00\x00\x00\x04\x00\x00\x00\x04\x00\x00\x00\x04\x00\x00\x00\x04\x00\x00\x00\x04\x00\x00\x00\x04\x00\x00\x00\x04\x00\x00\x00\x00\x00\x80?\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\t\x00Player 2\x00\x00\x00\x90B\x00\x00\x90BH\x00H\x00\x00\t\x00\x01\x03\x01\x03\x03\x03\x03\x03\x03\x00\x00\x00\x00\x04\x00\x00\x00\x01\x00\x00\x00\x04\x00\x00\x00\x04\x00\x00\x00\x04\x00\x00\x00\x04\x00\x00\x00\x04\x00\x00\x00\x04\x00\x00\x00\x00\x00\x80?\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\t\x00Player 3\x00\x00\x00\x90B\x00\x00\x90BH\x00H\x00\x00\t\x00\x01\x03\x03\x01\x03\x03\x03\x03\x03\x00\x00\x00\x00\x04\x00\x00\x00\x04\x00\x00\x00\x01\x00\x00\x00\x04\x00\x00\x00\x04\x00\x00\x00\x04\x00\x00\x00\x04\x00\x00\x00\x04\x00\x00\x00\x00\x00\x80?\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\t\x00Player 4\x00\x00\x00\x90B\x00\x00\x90BH\x00H\x00\x00\t\x00\x01\x03\x03\x03\x01\x03\x03\x03\x03\x00\x00\x00\x00\x04\x00\x00\x00\x04\x00\x00\x00\x04\x00\x00\x00\x01\x00\x00\x00\x04\x00\x00\x00\x04\x00\x00\x00\x04\x00\x00\x00\x04\x00\x00\x00\x00\x00\x80?\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\t\x00Player 5\x00\x00\x00\x90B\x00\x00\x90BH\x00H\x00\x00\t\x00\x01\x03\x03\x03\x03\x01\x03\x03\x03\x00\x00\x00\x00\x04\x00\x00\x00\x04\x00\x00\x00\x04\x00\x00\x00\x04\x00\x00\x00\x01\x00\x00\x00\x04\x00\x00\x00\x04\x00\x00\x00\x04\x00\x00\x00\x00\x00\x80?\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\t\x00Player 6\x00\x00\x00\x90B\x00\x00\x90BH\x00H\x00\x00\t\x00\x01\x03\x03\x03\x03\x03\x01\x03\x03\x00\x00\x00\x00\x04\x00\x00\x00\x04\x00\x00\x00\x04\x00\x00\x00\x04\x00\x00\x00\x04\x00\x00\x00\x01\x00\x00\x00\x04\x00\x00\x00\x04\x00\x00\x00\x00\x00\x80?\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\t\x00Player 7\x00\x00\x00\x90B\x00\x00\x90BH\x00H\x00\x00\t\x00\x01\x03\x03\x03\x03\x03\x03\x01\x03\x00\x00\x00\x00\x04\x00\x00\x00\x04\x00\x00\x00\x04\x00\x00\x00\x04\x00\x00\x00\x04\x00\x00\x00\x04\x00\x00\x00\x01\x00\x00\x00\x04\x00\x00\x00\x00\x00\x80?\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\t\x00Player 8\x00\x00\x00\x90B\x00\x00\x90BH\x00H\x00\x00\t\x00\x01\x03\x03\x03\x03\x03\x03\x03\x01\x00\x00\x00\x00\x04\x00\x00\x00\x04\x00\x00\x00\x04\x00\x00\x00\x04\x00\x00\x00\x04\x00\x00\x00\x04\x00\x00\x00\x04\x00\x00\x00\x01\x00\x00\x00\x00\x00\x80?\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
    # try to read it
    reader = ScnDataReader(original_data)
    structure = UnknownDataStructure.read(reader)
    assert structure.player_count == 9
    assert structure.unknown_player_data_structure[7].field1 == 'Player 8'
    # try to write it back
    writer = ScnDataWriter()
    structure.write(writer)
    # check it was the same
    new_data = writer.done()
    assert original_data == new_data
Exemple #7
0
def load(file_name: str, extract: bool = False, extract_dir: str = '.'):
    if not (file_name.endswith(".drs")):
        raise Exception("Game asset archive must end with .drs")

    with open(file_name, 'rb') as f:
        logging.info("Reading {}".format(file_name))
        all_data_bytes = f.read()
        data = ScnDataReader(all_data_bytes)
        header = DRSHeader.read(data)
        logging.debug(header)

        logging.info("File has {} tables".format(header.num_tables))
        tables = []
        for i in range(0, header.num_tables):
            table = DRSTable.read(data)
            tables.append(table)

        table_resource_lists = []
        for i in range(0, header.num_tables):
            table_resource_list = DRSResources.read(data,
                                                    tables[i].num_resources)
            table_resource_lists.append(table_resource_list)

        for i in range(0, header.num_tables):
            table = tables[i]
            resource_list = table_resource_lists[i]
            for resource in resource_list.resources:
                resource_start = resource.offset
                resource_end = resource.offset + resource.size
                resource_content = all_data_bytes[resource_start:resource_end]
                if extract:
                    resource_fn = ("{}/{}.{}".format(
                        extract_dir, resource.id,
                        table.resource_type.to_fileext()))
                    logging.info("Writing {}".format(resource_fn))
                    open(resource_fn, 'wb').write(resource_content)

    return ArchiveFile(header, tables, table_resource_lists)