예제 #1
0
def get_behavior_data(rom_contents, tileset_header, game='RS'):
    behavior_data_ptr = mapped.get_rom_addr(tileset_header['behavior_data_ptr'])
    t_type = tileset_header['tileset_type']
    if t_type == 0:
        if game == 'RS' or game == 'EM':
            num_of_blocks = 512
        else:
            num_of_blocks = 640
    else:
        block_data_ptr = mapped.get_rom_addr(tileset_header['block_data_ptr'])
        num_of_blocks = (behavior_data_ptr - block_data_ptr) // 16
    length = num_of_blocks*16
    mem = rom_contents[behavior_data_ptr:behavior_data_ptr+num_of_blocks*4]
    return mem
예제 #2
0
        map_data_header = mapped.parse_map_data(
            rom_contents, map_header['map_data_ptr'], game_id)
        tilesets.add((
            map_data_header['global_tileset_ptr'], 
            map_data_header['local_tileset_ptr']))

global_blocks = {}
local_blocks = {}
global_behavior = {}
local_behavior = {}

for tileset1, tileset2 in list(tilesets):
    t1_header = mapped.parse_tileset_header(rom_contents, tileset1, game_id)
    t2_header = mapped.parse_tileset_header(rom_contents, tileset2, game_id)
    
    pals1_ptr = mapped.get_rom_addr(t1_header["palettes_ptr"])
    pals2_ptr = mapped.get_rom_addr(t2_header["palettes_ptr"])
    pals = mapped.get_pals(rom_contents, game_id, pals1_ptr, pals2_ptr)
    imgs = mapped.load_tilesets(rom_contents, game_id, t1_header, t2_header, pals)
    
    # Check if the tileset has been rendered already
    if tileset1 not in global_blocks:
        print(hex(tileset1))
        behavior_data1 = get_behavior_data(rom_contents, t1_header, game_id)
        global_behavior[tileset1] = behavior_data1
        
        block_data_mem = mapped.get_block_data(rom_contents, t1_header, game_id)
        blocks_imgs = build_block_imgs(
            block_data_mem, imgs, pals, behavior_data1)
        global_blocks[tileset1] = blocks_imgs
    
예제 #3
0
for bank_n in range(len(banks)):
    print("Exporting bank", bank_n)
    map_headers = get_map_headers(rom_contents, bank_n, banks)
    
    for map_n, map_header_address in enumerate(map_headers):
        # Last map, I haven't found a better way to handle this
        if bank_n >= 42 and map_n > 0:
            break

        map_header = parse_map_header(rom_contents, map_header_address)
        map_data_header = mapped.parse_map_data(
                rom_contents, map_header['map_data_ptr'], game_id)
        
        # Parse tile data
        tilemap_ptr = mapped.get_rom_addr(map_data_header['tilemap_ptr'])
        map_size = map_data_header['w'] * map_data_header['h'] * 2
        map_mem = rom_contents[tilemap_ptr:tilemap_ptr+map_size]
        map_data = mapped.parse_map_mem(map_mem, map_data_header['h'],
                map_data_header['w'])
        
        # Parse tileset offsets and label
        global_t = map_data_header['global_tileset_ptr']
        local_t = map_data_header['local_tileset_ptr']
        label_index = map_header['label_index'] - 88
        label = map_labels[label_index]
        
        # Parse events
        events_header = mapped.parse_events_header(rom_contents,
                map_header['event_data_ptr'])
        events = mapped.parse_events(rom_contents, events_header)