#!/usr/bin/python3 import os import sys import struct from multiprocessing import Pool, cpu_count ROM_FILE_NAME = 'zlp_f.n64' FILE_TABLE_OFFSET = 0x7170 FILE_NAMES = [ 'makerom', 'boot', 'dmadata', 'Audiobank', 'Audioseq', 'Audiotable', 'link_animetion', 'icon_item_static', 'icon_item_24_static', 'icon_item_field_static', 'icon_item_dungeon_static', 'icon_item_gameover_static', 'icon_item_nes_static', 'icon_item_ger_static', 'icon_item_fra_static', 'item_name_static', 'map_name_static', 'do_action_static', 'message_static', 'message_texture_static', 'nes_font_static', 'nes_message_data_static', 'ger_message_data_static', 'fra_message_data_static', 'staff_message_data_static', 'map_grand_static', 'map_48x85_static', 'map_i_static', 'code', 'ovl_title', 'ovl_select', 'ovl_opening', 'ovl_file_choose', 'ovl_kaleido_scope', 'ovl_player_actor', 'ovl_map_mark_data', 'ovl_En_Test', 'ovl_Arms_Hook', 'ovl_Arrow_Fire', 'ovl_Arrow_Ice', 'ovl_Arrow_Light', 'ovl_Bg_Bdan_Objects', 'ovl_Bg_Bdan_Switch', 'ovl_Bg_Bom_Guard', 'ovl_Bg_Bombwall', 'ovl_Bg_Bowl_Wall', 'ovl_Bg_Breakwall', 'ovl_Bg_Ddan_Jd', 'ovl_Bg_Ddan_Kd', 'ovl_Bg_Dodoago', 'ovl_Bg_Dy_Yoseizo', 'ovl_Bg_Ganon_Otyuka', 'ovl_Bg_Gate_Shutter', 'ovl_Bg_Gjyo_Bridge', 'ovl_Bg_Gnd_Darkmeiro', 'ovl_Bg_Gnd_Firemeiro', 'ovl_Bg_Gnd_Iceblock', 'ovl_Bg_Gnd_Nisekabe', 'ovl_Bg_Gnd_Soulmeiro', 'ovl_Bg_Haka', 'ovl_Bg_Haka_Gate', 'ovl_Bg_Haka_Huta', 'ovl_Bg_Haka_Megane', 'ovl_Bg_Haka_MeganeBG', 'ovl_Bg_Haka_Sgami', 'ovl_Bg_Haka_Ship', 'ovl_Bg_Haka_Trap', 'ovl_Bg_Haka_Tubo', 'ovl_Bg_Haka_Water', 'ovl_Bg_Haka_Zou', 'ovl_Bg_Heavy_Block', 'ovl_Bg_Hidan_Curtain', 'ovl_Bg_Hidan_Dalm', 'ovl_Bg_Hidan_Firewall', 'ovl_Bg_Hidan_Fslift', 'ovl_Bg_Hidan_Fwbig', 'ovl_Bg_Hidan_Hamstep', 'ovl_Bg_Hidan_Hrock', 'ovl_Bg_Hidan_Kousi', 'ovl_Bg_Hidan_Kowarerukabe', 'ovl_Bg_Hidan_Rock', 'ovl_Bg_Hidan_Rsekizou', 'ovl_Bg_Hidan_Sekizou', 'ovl_Bg_Hidan_Sima', 'ovl_Bg_Hidan_Syoku', 'ovl_Bg_Ice_Objects', 'ovl_Bg_Ice_Shelter', 'ovl_Bg_Ice_Shutter', 'ovl_Bg_Ice_Turara', 'ovl_Bg_Ingate', 'ovl_Bg_Jya_1flift', 'ovl_Bg_Jya_Amishutter', 'ovl_Bg_Jya_Bigmirror', 'ovl_Bg_Jya_Block', 'ovl_Bg_Jya_Bombchuiwa', 'ovl_Bg_Jya_Bombiwa', 'ovl_Bg_Jya_Cobra', 'ovl_Bg_Jya_Goroiwa', 'ovl_Bg_Jya_Haheniron', 'ovl_Bg_Jya_Ironobj', 'ovl_Bg_Jya_Kanaami', 'ovl_Bg_Jya_Lift', 'ovl_Bg_Jya_Megami', 'ovl_Bg_Jya_Zurerukabe', 'ovl_Bg_Menkuri_Eye', 'ovl_Bg_Menkuri_Kaiten', 'ovl_Bg_Menkuri_Nisekabe', 'ovl_Bg_Mizu_Bwall', 'ovl_Bg_Mizu_Movebg', 'ovl_Bg_Mizu_Shutter', 'ovl_Bg_Mizu_Uzu', 'ovl_Bg_Mizu_Water', 'ovl_Bg_Mjin', 'ovl_Bg_Mori_Bigst', 'ovl_Bg_Mori_Elevator', 'ovl_Bg_Mori_Hashigo', 'ovl_Bg_Mori_Hashira4', 'ovl_Bg_Mori_Hineri', 'ovl_Bg_Mori_Idomizu', 'ovl_Bg_Mori_Kaitenkabe', 'ovl_Bg_Mori_Rakkatenjo', 'ovl_Bg_Po_Event', 'ovl_Bg_Po_Syokudai', 'ovl_Bg_Pushbox', 'ovl_Bg_Relay_Objects', 'ovl_Bg_Spot00_Break', 'ovl_Bg_Spot00_Hanebasi', 'ovl_Bg_Spot01_Fusya', 'ovl_Bg_Spot01_Idohashira', 'ovl_Bg_Spot01_Idomizu', 'ovl_Bg_Spot01_Idosoko', 'ovl_Bg_Spot01_Objects2', 'ovl_Bg_Spot02_Objects', 'ovl_Bg_Spot03_Taki', 'ovl_Bg_Spot05_Soko', 'ovl_Bg_Spot06_Objects', 'ovl_Bg_Spot07_Taki', 'ovl_Bg_Spot08_Bakudankabe', 'ovl_Bg_Spot08_Iceblock', 'ovl_Bg_Spot09_Obj', 'ovl_Bg_Spot11_Bakudankabe', 'ovl_Bg_Spot11_Oasis', 'ovl_Bg_Spot12_Gate', 'ovl_Bg_Spot12_Saku', 'ovl_Bg_Spot15_Rrbox', 'ovl_Bg_Spot15_Saku', 'ovl_Bg_Spot16_Bombstone', 'ovl_Bg_Spot16_Doughnut', 'ovl_Bg_Spot17_Bakudankabe', 'ovl_Bg_Spot17_Funen', 'ovl_Bg_Spot18_Basket', 'ovl_Bg_Spot18_Futa', 'ovl_Bg_Spot18_Obj', 'ovl_Bg_Spot18_Shutter', 'ovl_Bg_Sst_Floor', 'ovl_Bg_Toki_Hikari', 'ovl_Bg_Toki_Swd', 'ovl_Bg_Treemouth', 'ovl_Bg_Umajump', 'ovl_Bg_Vb_Sima', 'ovl_Bg_Ydan_Hasi', 'ovl_Bg_Ydan_Maruta', 'ovl_Bg_Ydan_Sp', 'ovl_Bg_Zg', 'ovl_Boss_Dodongo', 'ovl_Boss_Fd', 'ovl_Boss_Fd2', 'ovl_Boss_Ganon', 'ovl_Boss_Ganon2', 'ovl_Boss_Ganondrof', 'ovl_Boss_Goma', 'ovl_Boss_Mo', 'ovl_Boss_Sst', 'ovl_Boss_Tw', 'ovl_Boss_Va', 'ovl_Demo_6K', 'ovl_Demo_Du', 'ovl_Demo_Ec', 'ovl_Demo_Effect', 'ovl_Demo_Ext', 'ovl_Demo_Geff', 'ovl_Demo_Gj', 'ovl_Demo_Go', 'ovl_Demo_Gt', 'ovl_Demo_Ik', 'ovl_Demo_Im', 'ovl_Demo_Kankyo', 'ovl_Demo_Kekkai', 'ovl_Demo_Sa', 'ovl_Demo_Shd', 'ovl_Demo_Tre_Lgt', 'ovl_Door_Ana', 'ovl_Door_Gerudo', 'ovl_Door_Killer', 'ovl_Door_Shutter', 'ovl_Door_Toki', 'ovl_Door_Warp1', 'ovl_Efc_Erupc', 'ovl_Eff_Dust', 'ovl_Effect_Ss_Blast', 'ovl_Effect_Ss_Bomb', 'ovl_Effect_Ss_Bomb2', 'ovl_Effect_Ss_Bubble', 'ovl_Effect_Ss_D_Fire', 'ovl_Effect_Ss_Dead_Db', 'ovl_Effect_Ss_Dead_Dd', 'ovl_Effect_Ss_Dead_Ds', 'ovl_Effect_Ss_Dead_Sound', 'ovl_Effect_Ss_Dt_Bubble', 'ovl_Effect_Ss_Dust', 'ovl_Effect_Ss_En_Fire', 'ovl_Effect_Ss_En_Ice', 'ovl_Effect_Ss_Extra', 'ovl_Effect_Ss_Fcircle', 'ovl_Effect_Ss_Fhg_Flash', 'ovl_Effect_Ss_Fire_Tail', 'ovl_Effect_Ss_G_Fire', 'ovl_Effect_Ss_G_Magma', 'ovl_Effect_Ss_G_Magma2', 'ovl_Effect_Ss_G_Ripple', 'ovl_Effect_Ss_G_Spk', 'ovl_Effect_Ss_G_Splash', 'ovl_Effect_Ss_Hahen', 'ovl_Effect_Ss_HitMark', 'ovl_Effect_Ss_Ice_Piece', 'ovl_Effect_Ss_Ice_Smoke', 'ovl_Effect_Ss_K_Fire', 'ovl_Effect_Ss_Kakera', 'ovl_Effect_Ss_KiraKira', 'ovl_Effect_Ss_Lightning', 'ovl_Effect_Ss_Sibuki', 'ovl_Effect_Ss_Sibuki2', 'ovl_Effect_Ss_Solder_Srch_Ball', 'ovl_Effect_Ss_Stick', 'ovl_Effect_Ss_Stone1', 'ovl_Elf_Msg', 'ovl_Elf_Msg2', 'ovl_En_Am', 'ovl_En_Ani', 'ovl_En_Anubice', 'ovl_En_Anubice_Fire', 'ovl_En_Anubice_Tag', 'ovl_En_Arow_Trap', 'ovl_En_Arrow', 'ovl_En_Attack_Niw', 'ovl_En_Ba', 'ovl_En_Bb', 'ovl_En_Bdfire', 'ovl_En_Bigokuta', 'ovl_En_Bili', 'ovl_En_Bird', 'ovl_En_Blkobj', 'ovl_En_Bom', 'ovl_En_Bom_Bowl_Man', 'ovl_En_Bom_Bowl_Pit', 'ovl_En_Bom_Chu', 'ovl_En_Bombf', 'ovl_En_Boom', 'ovl_En_Box', 'ovl_En_Brob', 'ovl_En_Bubble', 'ovl_En_Butte', 'ovl_En_Bw', 'ovl_En_Bx', 'ovl_En_Changer', 'ovl_En_Clear_Tag', 'ovl_En_Cow', 'ovl_En_Crow', 'ovl_En_Cs', 'ovl_En_Daiku', 'ovl_En_Daiku_Kakariko', 'ovl_En_Dekubaba', 'ovl_En_Dekunuts', 'ovl_En_Dh', 'ovl_En_Dha', 'ovl_En_Diving_Game', 'ovl_En_Dns', 'ovl_En_Dnt_Demo', 'ovl_En_Dnt_Jiji', 'ovl_En_Dnt_Nomal', 'ovl_En_Dodojr', 'ovl_En_Dodongo', 'ovl_En_Dog', 'ovl_En_Door', 'ovl_En_Ds', 'ovl_En_Du', 'ovl_En_Dy_Extra', 'ovl_En_Eg', 'ovl_En_Eiyer', 'ovl_En_Elf', 'ovl_En_Encount1', 'ovl_En_Encount2', 'ovl_En_Ex_Item', 'ovl_En_Ex_Ruppy', 'ovl_En_Fd', 'ovl_En_Fd_Fire', 'ovl_En_Fhg_Fire', 'ovl_En_Fire_Rock', 'ovl_En_Firefly', 'ovl_En_Fish', 'ovl_En_Floormas', 'ovl_En_Fr', 'ovl_En_Fu', 'ovl_En_Fw', 'ovl_En_Fz', 'ovl_En_G_Switch', 'ovl_En_Ganon_Mant', 'ovl_En_Ganon_Organ', 'ovl_En_Gb', 'ovl_En_Ge1', 'ovl_En_Ge2', 'ovl_En_Ge3', 'ovl_En_GeldB', 'ovl_En_GirlA', 'ovl_En_Gm', 'ovl_En_Go', 'ovl_En_Go2', 'ovl_En_Goma', 'ovl_En_Goroiwa', 'ovl_En_Gs', 'ovl_En_Guest', 'ovl_En_Hata', 'ovl_En_Heishi1', 'ovl_En_Heishi2', 'ovl_En_Heishi3', 'ovl_En_Heishi4', 'ovl_En_Hintnuts', 'ovl_En_Holl', 'ovl_En_Honotrap', 'ovl_En_Horse', 'ovl_En_Horse_Game_Check', 'ovl_En_Horse_Ganon', 'ovl_En_Horse_Link_Child', 'ovl_En_Horse_Normal', 'ovl_En_Horse_Zelda', 'ovl_En_Hs', 'ovl_En_Hs2', 'ovl_En_Hy', 'ovl_En_Ice_Hono', 'ovl_En_Ik', 'ovl_En_In', 'ovl_En_Insect', 'ovl_En_Ishi', 'ovl_En_It', 'ovl_En_Jj', 'ovl_En_Js', 'ovl_En_Jsjutan', 'ovl_En_Kakasi', 'ovl_En_Kakasi2', 'ovl_En_Kakasi3', 'ovl_En_Kanban', 'ovl_En_Karebaba', 'ovl_En_Ko', 'ovl_En_Kusa', 'ovl_En_Kz', 'ovl_En_Light', 'ovl_En_Lightbox', 'ovl_En_M_Fire1', 'ovl_En_M_Thunder', 'ovl_En_Ma1', 'ovl_En_Ma2', 'ovl_En_Ma3', 'ovl_En_Mag', 'ovl_En_Mb', 'ovl_En_Md', 'ovl_En_Mk', 'ovl_En_Mm', 'ovl_En_Mm2', 'ovl_En_Ms', 'ovl_En_Mu', 'ovl_En_Nb', 'ovl_En_Niw', 'ovl_En_Niw_Girl', 'ovl_En_Niw_Lady', 'ovl_En_Nutsball', 'ovl_En_Nwc', 'ovl_En_Ny', 'ovl_En_OE2', 'ovl_En_Okarina_Effect', 'ovl_En_Okarina_Tag', 'ovl_En_Okuta', 'ovl_En_Ossan', 'ovl_En_Owl', 'ovl_En_Part', 'ovl_En_Peehat', 'ovl_En_Po_Desert', 'ovl_En_Po_Field', 'ovl_En_Po_Relay', 'ovl_En_Po_Sisters', 'ovl_En_Poh', 'ovl_En_Pu_box', 'ovl_En_Rd', 'ovl_En_Reeba', 'ovl_En_River_Sound', 'ovl_En_Rl', 'ovl_En_Rr', 'ovl_En_Ru1', 'ovl_En_Ru2', 'ovl_En_Sa', 'ovl_En_Sb', 'ovl_En_Scene_Change', 'ovl_En_Sda', 'ovl_En_Shopnuts', 'ovl_En_Si', 'ovl_En_Siofuki', 'ovl_En_Skb', 'ovl_En_Skj', 'ovl_En_Skjneedle', 'ovl_En_Ssh', 'ovl_En_St', 'ovl_En_Sth', 'ovl_En_Stream', 'ovl_En_Sw', 'ovl_En_Syateki_Itm', 'ovl_En_Syateki_Man', 'ovl_En_Syateki_Niw', 'ovl_En_Ta', 'ovl_En_Takara_Man', 'ovl_En_Tana', 'ovl_En_Tg', 'ovl_En_Tite', 'ovl_En_Tk', 'ovl_En_Torch', 'ovl_En_Torch2', 'ovl_En_Toryo', 'ovl_En_Tp', 'ovl_En_Tr', 'ovl_En_Trap', 'ovl_En_Tubo_Trap', 'ovl_En_Vali', 'ovl_En_Vase', 'ovl_En_Vb_Ball', 'ovl_En_Viewer', 'ovl_En_Vm', 'ovl_En_Wall_Tubo', 'ovl_En_Wallmas', 'ovl_En_Weather_Tag', 'ovl_En_Weiyer', 'ovl_En_Wf', 'ovl_En_Wonder_Item', 'ovl_En_Wonder_Talk', 'ovl_En_Wonder_Talk2', 'ovl_En_Wood02', 'ovl_En_Xc', 'ovl_En_Yabusame_Mark', 'ovl_En_Yukabyun', 'ovl_En_Zf', 'ovl_En_Zl1', 'ovl_En_Zl2', 'ovl_En_Zl3', 'ovl_En_Zl4', 'ovl_En_Zo', 'ovl_En_fHG', 'ovl_End_Title', 'ovl_Fishing', 'ovl_Item_B_Heart', 'ovl_Item_Etcetera', 'ovl_Item_Inbox', 'ovl_Item_Ocarina', 'ovl_Item_Shield', 'ovl_Magic_Dark', 'ovl_Magic_Fire', 'ovl_Magic_Wind', 'ovl_Mir_Ray', 'ovl_Obj_Bean', 'ovl_Obj_Blockstop', 'ovl_Obj_Bombiwa', 'ovl_Obj_Comb', 'ovl_Obj_Dekujr', 'ovl_Obj_Elevator', 'ovl_Obj_Hamishi', 'ovl_Obj_Hana', 'ovl_Obj_Hsblock', 'ovl_Obj_Ice_Poly', 'ovl_Obj_Kibako', 'ovl_Obj_Kibako2', 'ovl_Obj_Lift', 'ovl_Obj_Lightswitch', 'ovl_Obj_Makekinsuta', 'ovl_Obj_Makeoshihiki', 'ovl_Obj_Mure', 'ovl_Obj_Mure2', 'ovl_Obj_Mure3', 'ovl_Obj_Oshihiki', 'ovl_Obj_Roomtimer', 'ovl_Obj_Switch', 'ovl_Obj_Syokudai', 'ovl_Obj_Timeblock', 'ovl_Obj_Tsubo', 'ovl_Obj_Warp2block', 'ovl_Object_Kankyo', 'ovl_Oceff_Spot', 'ovl_Oceff_Storm', 'ovl_Oceff_Wipe', 'ovl_Oceff_Wipe2', 'ovl_Oceff_Wipe3', 'ovl_Oceff_Wipe4', 'ovl_Shot_Sun', 'gameplay_keep', 'gameplay_field_keep', 'gameplay_dangeon_keep', 'gameplay_object_exchange_static', 'object_link_boy', 'object_link_child', 'object_box', 'object_human', 'object_okuta', 'object_poh', 'object_wallmaster', 'object_dy_obj', 'object_firefly', 'object_dodongo', 'object_fire', 'object_niw', 'object_tite', 'object_reeba', 'object_peehat', 'object_kingdodongo', 'object_horse', 'object_zf', 'object_goma', 'object_zl1', 'object_gol', 'object_bubble', 'object_dodojr', 'object_torch2', 'object_bl', 'object_tp', 'object_oA1', 'object_st', 'object_bw', 'object_ei', 'object_horse_normal', 'object_oB1', 'object_o_anime', 'object_spot04_objects', 'object_ddan_objects', 'object_hidan_objects', 'object_horse_ganon', 'object_oA2', 'object_spot00_objects', 'object_mb', 'object_bombf', 'object_sk2', 'object_oE1', 'object_oE_anime', 'object_oE2', 'object_ydan_objects', 'object_gnd', 'object_am', 'object_dekubaba', 'object_oA3', 'object_oA4', 'object_oA5', 'object_oA6', 'object_oA7', 'object_jj', 'object_oA8', 'object_oA9', 'object_oB2', 'object_oB3', 'object_oB4', 'object_horse_zelda', 'object_opening_demo1', 'object_warp1', 'object_b_heart', 'object_dekunuts', 'object_oE3', 'object_oE4', 'object_menkuri_objects', 'object_oE5', 'object_oE6', 'object_oE7', 'object_oE8', 'object_oE9', 'object_oE10', 'object_oE11', 'object_oE12', 'object_vali', 'object_oA10', 'object_oA11', 'object_mizu_objects', 'object_fhg', 'object_ossan', 'object_mori_hineri1', 'object_Bb', 'object_toki_objects', 'object_yukabyun', 'object_zl2', 'object_mjin', 'object_mjin_flash', 'object_mjin_dark', 'object_mjin_flame', 'object_mjin_ice', 'object_mjin_soul', 'object_mjin_wind', 'object_mjin_oka', 'object_haka_objects', 'object_spot06_objects', 'object_ice_objects', 'object_relay_objects', 'object_mori_hineri1a', 'object_mori_hineri2', 'object_mori_hineri2a', 'object_mori_objects', 'object_mori_tex', 'object_spot08_obj', 'object_warp2', 'object_hata', 'object_bird', 'object_wood02', 'object_lightbox', 'object_pu_box', 'object_trap', 'object_vase', 'object_im', 'object_ta', 'object_tk', 'object_xc', 'object_vm', 'object_bv', 'object_hakach_objects', 'object_efc_crystal_light', 'object_efc_fire_ball', 'object_efc_flash', 'object_efc_lgt_shower', 'object_efc_star_field', 'object_god_lgt', 'object_light_ring', 'object_triforce_spot', 'object_medal', 'object_bdan_objects', 'object_sd', 'object_rd', 'object_po_sisters', 'object_heavy_object', 'object_gndd', 'object_fd', 'object_du', 'object_fw', 'object_horse_link_child', 'object_spot02_objects', 'object_haka', 'object_ru1', 'object_syokudai', 'object_fd2', 'object_dh', 'object_rl', 'object_efc_tw', 'object_demo_tre_lgt', 'object_gi_key', 'object_mir_ray', 'object_brob', 'object_gi_jewel', 'object_spot09_obj', 'object_spot18_obj', 'object_bdoor', 'object_spot17_obj', 'object_shop_dungen', 'object_nb', 'object_mo', 'object_sb', 'object_gi_melody', 'object_gi_heart', 'object_gi_compass', 'object_gi_bosskey', 'object_gi_medal', 'object_gi_nuts', 'object_sa', 'object_gi_hearts', 'object_gi_arrowcase', 'object_gi_bombpouch', 'object_in', 'object_tr', 'object_spot16_obj', 'object_oE1s', 'object_oE4s', 'object_os_anime', 'object_gi_bottle', 'object_gi_stick', 'object_gi_map', 'object_oF1d_map', 'object_ru2', 'object_gi_shield_1', 'object_dekujr', 'object_gi_magicpot', 'object_gi_bomb_1', 'object_oF1s', 'object_ma2', 'object_gi_purse', 'object_hni', 'object_tw', 'object_rr', 'object_bxa', 'object_anubice', 'object_gi_gerudo', 'object_gi_arrow', 'object_gi_bomb_2', 'object_gi_egg', 'object_gi_scale', 'object_gi_shield_2', 'object_gi_hookshot', 'object_gi_ocarina', 'object_gi_milk', 'object_ma1', 'object_ganon', 'object_sst', 'object_ny', 'object_fr', 'object_gi_pachinko', 'object_gi_boomerang', 'object_gi_bow', 'object_gi_glasses', 'object_gi_liquid', 'object_ani', 'object_demo_6k', 'object_gi_shield_3', 'object_gi_letter', 'object_spot15_obj', 'object_jya_obj', 'object_gi_clothes', 'object_gi_bean', 'object_gi_fish', 'object_gi_saw', 'object_gi_hammer', 'object_gi_grass', 'object_gi_longsword', 'object_spot01_objects', 'object_md', 'object_km1', 'object_kw1', 'object_zo', 'object_kz', 'object_umajump', 'object_masterkokiri', 'object_masterkokirihead', 'object_mastergolon', 'object_masterzoora', 'object_aob', 'object_ik', 'object_ahg', 'object_cne', 'object_gi_niwatori', 'object_skj', 'object_gi_bottle_letter', 'object_bji', 'object_bba', 'object_gi_ocarina_0', 'object_ds', 'object_ane', 'object_boj', 'object_spot03_object', 'object_spot07_object', 'object_fz', 'object_bob', 'object_ge1', 'object_yabusame_point', 'object_gi_boots_2', 'object_gi_seed', 'object_gnd_magic', 'object_d_elevator', 'object_d_hsblock', 'object_d_lift', 'object_mamenoki', 'object_goroiwa', 'object_toryo', 'object_daiku', 'object_nwc', 'object_blkobj', 'object_gm', 'object_ms', 'object_hs', 'object_ingate', 'object_lightswitch', 'object_kusa', 'object_tsubo', 'object_gi_gloves', 'object_gi_coin', 'object_kanban', 'object_gjyo_objects', 'object_owl', 'object_mk', 'object_fu', 'object_gi_ki_tan_mask', 'object_gi_redead_mask', 'object_gi_skj_mask', 'object_gi_rabit_mask', 'object_gi_truth_mask', 'object_ganon_objects', 'object_siofuki', 'object_stream', 'object_mm', 'object_fa', 'object_os', 'object_gi_eye_lotion', 'object_gi_powder', 'object_gi_mushroom', 'object_gi_ticketstone', 'object_gi_brokensword', 'object_js', 'object_cs', 'object_gi_prescription', 'object_gi_bracelet', 'object_gi_soldout', 'object_gi_frog', 'object_mag', 'object_door_gerudo', 'object_gt', 'object_efc_erupc', 'object_zl2_anime1', 'object_zl2_anime2', 'object_gi_golonmask', 'object_gi_zoramask', 'object_gi_gerudomask', 'object_ganon2', 'object_ka', 'object_ts', 'object_zg', 'object_gi_hoverboots', 'object_gi_m_arrow', 'object_ds2', 'object_ec', 'object_fish', 'object_gi_sutaru', 'object_gi_goddess', 'object_ssh', 'object_bigokuta', 'object_bg', 'object_spot05_objects', 'object_spot12_obj', 'object_bombiwa', 'object_hintnuts', 'object_rs', 'object_spot00_break', 'object_gla', 'object_shopnuts', 'object_geldb', 'object_gr', 'object_dog', 'object_jya_iron', 'object_jya_door', 'object_spot01_objects2', 'object_spot11_obj', 'object_kibako2', 'object_dns', 'object_dnk', 'object_gi_fire', 'object_gi_insect', 'object_gi_butterfly', 'object_gi_ghost', 'object_gi_soul', 'object_bowl', 'object_po_field', 'object_demo_kekkai', 'object_efc_doughnut', 'object_gi_dekupouch', 'object_ganon_anime1', 'object_ganon_anime2', 'object_ganon_anime3', 'object_gi_rupy', 'object_spot01_matoya', 'object_spot01_matoyab', 'object_po_composer', 'object_mu', 'object_wf', 'object_skb', 'object_gj', 'object_geff', 'object_haka_door', 'object_gs', 'object_ps', 'object_bwall', 'object_crow', 'object_cow', 'object_cob', 'object_gi_sword_1', 'object_door_killer', 'object_ouke_haka', 'object_timeblock', 'object_zl4', 'g_pn_01', 'g_pn_02', 'g_pn_03', 'g_pn_04', 'g_pn_05', 'g_pn_06', 'g_pn_07', 'g_pn_08', 'g_pn_09', 'g_pn_10', 'g_pn_11', 'g_pn_12', 'g_pn_13', 'g_pn_14', 'g_pn_15', 'g_pn_16', 'g_pn_17', 'g_pn_18', 'g_pn_19', 'g_pn_20', 'g_pn_21', 'g_pn_22', 'g_pn_23', 'g_pn_24', 'g_pn_25', 'g_pn_26', 'g_pn_27', 'g_pn_28', 'g_pn_29', 'g_pn_30', 'g_pn_31', 'g_pn_32', 'g_pn_33', 'g_pn_34', 'g_pn_35', 'g_pn_36', 'g_pn_37', 'g_pn_38', 'g_pn_39', 'g_pn_40', 'g_pn_41', 'g_pn_42', 'g_pn_43', 'g_pn_44', 'g_pn_45', 'g_pn_46', 'g_pn_47', 'g_pn_48', 'g_pn_49', 'g_pn_50', 'g_pn_51', 'g_pn_52', 'g_pn_53', 'g_pn_54', 'g_pn_55', 'g_pn_56', 'g_pn_57', 'z_select_static', 'nintendo_rogo_static', 'title_static', 'parameter_static', 'vr_fine0_static', 'vr_fine0_pal_static', 'vr_fine1_static', 'vr_fine1_pal_static', 'vr_fine2_static', 'vr_fine2_pal_static', 'vr_fine3_static', 'vr_fine3_pal_static', 'vr_cloud0_static', 'vr_cloud0_pal_static', 'vr_cloud1_static', 'vr_cloud1_pal_static', 'vr_cloud2_static', 'vr_cloud2_pal_static', 'vr_cloud3_static', 'vr_cloud3_pal_static', 'vr_holy0_static', 'vr_holy0_pal_static', 'vr_holy1_static', 'vr_holy1_pal_static', 'vr_MDVR_static', 'vr_MDVR_pal_static', 'vr_MNVR_static', 'vr_MNVR_pal_static', 'vr_RUVR_static', 'vr_RUVR_pal_static', 'vr_LHVR_static', 'vr_LHVR_pal_static', 'vr_KHVR_static', 'vr_KHVR_pal_static', 'vr_K3VR_static', 'vr_K3VR_pal_static', 'vr_K4VR_static', 'vr_K4VR_pal_static', 'vr_K5VR_static', 'vr_K5VR_pal_static', 'vr_SP1a_static', 'vr_SP1a_pal_static', 'vr_MLVR_static', 'vr_MLVR_pal_static', 'vr_KKRVR_static', 'vr_KKRVR_pal_static', 'vr_KR3VR_static', 'vr_KR3VR_pal_static', 'vr_IPVR_static', 'vr_IPVR_pal_static', 'vr_KSVR_static', 'vr_KSVR_pal_static', 'vr_GLVR_static', 'vr_GLVR_pal_static', 'vr_ZRVR_static', 'vr_ZRVR_pal_static', 'vr_DGVR_static', 'vr_DGVR_pal_static', 'vr_ALVR_static', 'vr_ALVR_pal_static', 'vr_NSVR_static', 'vr_NSVR_pal_static', 'vr_LBVR_static', 'vr_LBVR_pal_static', 'vr_TTVR_static', 'vr_TTVR_pal_static', 'vr_FCVR_static', 'vr_FCVR_pal_static', 'elf_message_field', 'elf_message_ydan', 'ydan_scene', 'ydan_room_0', 'ydan_room_1', 'ydan_room_2', 'ydan_room_3', 'ydan_room_4', 'ydan_room_5', 'ydan_room_6', 'ydan_room_7', 'ydan_room_8', 'ydan_room_9', 'ydan_room_10', 'ydan_room_11', 'ddan_scene', 'ddan_room_0', 'ddan_room_1', 'ddan_room_2', 'ddan_room_3', 'ddan_room_4', 'ddan_room_5', 'ddan_room_6', 'ddan_room_7', 'ddan_room_8', 'ddan_room_9', 'ddan_room_10', 'ddan_room_11', 'ddan_room_12', 'ddan_room_13', 'ddan_room_14', 'ddan_room_15', 'ddan_room_16', 'bdan_scene', 'bdan_room_0', 'bdan_room_1', 'bdan_room_2', 'bdan_room_3', 'bdan_room_4', 'bdan_room_5', 'bdan_room_6', 'bdan_room_7', 'bdan_room_8', 'bdan_room_9', 'bdan_room_10', 'bdan_room_11', 'bdan_room_12', 'bdan_room_13', 'bdan_room_14', 'bdan_room_15', 'Bmori1_scene', 'Bmori1_room_0', 'Bmori1_room_1', 'Bmori1_room_2', 'Bmori1_room_3', 'Bmori1_room_4', 'Bmori1_room_5', 'Bmori1_room_6', 'Bmori1_room_7', 'Bmori1_room_8', 'Bmori1_room_9', 'Bmori1_room_10', 'Bmori1_room_11', 'Bmori1_room_12', 'Bmori1_room_13', 'Bmori1_room_14', 'Bmori1_room_15', 'Bmori1_room_16', 'Bmori1_room_17', 'Bmori1_room_18', 'Bmori1_room_19', 'Bmori1_room_20', 'Bmori1_room_21', 'Bmori1_room_22', 'HIDAN_scene', 'HIDAN_room_0', 'HIDAN_room_1', 'HIDAN_room_2', 'HIDAN_room_3', 'HIDAN_room_4', 'HIDAN_room_5', 'HIDAN_room_6', 'HIDAN_room_7', 'HIDAN_room_8', 'HIDAN_room_9', 'HIDAN_room_10', 'HIDAN_room_11', 'HIDAN_room_12', 'HIDAN_room_13', 'HIDAN_room_14', 'HIDAN_room_15', 'HIDAN_room_16', 'HIDAN_room_17', 'HIDAN_room_18', 'HIDAN_room_19', 'HIDAN_room_20', 'HIDAN_room_21', 'HIDAN_room_22', 'HIDAN_room_23', 'HIDAN_room_24', 'HIDAN_room_25', 'HIDAN_room_26', 'MIZUsin_scene', 'MIZUsin_room_0', 'MIZUsin_room_1', 'MIZUsin_room_2', 'MIZUsin_room_3', 'MIZUsin_room_4', 'MIZUsin_room_5', 'MIZUsin_room_6', 'MIZUsin_room_7', 'MIZUsin_room_8', 'MIZUsin_room_9', 'MIZUsin_room_10', 'MIZUsin_room_11', 'MIZUsin_room_12', 'MIZUsin_room_13', 'MIZUsin_room_14', 'MIZUsin_room_15', 'MIZUsin_room_16', 'MIZUsin_room_17', 'MIZUsin_room_18', 'MIZUsin_room_19', 'MIZUsin_room_20', 'MIZUsin_room_21', 'MIZUsin_room_22', 'jyasinzou_scene', 'jyasinzou_room_0', 'jyasinzou_room_1', 'jyasinzou_room_2', 'jyasinzou_room_3', 'jyasinzou_room_4', 'jyasinzou_room_5', 'jyasinzou_room_6', 'jyasinzou_room_7', 'jyasinzou_room_8', 'jyasinzou_room_9', 'jyasinzou_room_10', 'jyasinzou_room_11', 'jyasinzou_room_12', 'jyasinzou_room_13', 'jyasinzou_room_14', 'jyasinzou_room_15', 'jyasinzou_room_16', 'jyasinzou_room_17', 'jyasinzou_room_18', 'jyasinzou_room_19', 'jyasinzou_room_20', 'jyasinzou_room_21', 'jyasinzou_room_22', 'jyasinzou_room_23', 'jyasinzou_room_24', 'jyasinzou_room_25', 'jyasinzou_room_26', 'jyasinzou_room_27', 'jyasinzou_room_28', 'HAKAdan_scene', 'HAKAdan_room_0', 'HAKAdan_room_1', 'HAKAdan_room_2', 'HAKAdan_room_3', 'HAKAdan_room_4', 'HAKAdan_room_5', 'HAKAdan_room_6', 'HAKAdan_room_7', 'HAKAdan_room_8', 'HAKAdan_room_9', 'HAKAdan_room_10', 'HAKAdan_room_11', 'HAKAdan_room_12', 'HAKAdan_room_13', 'HAKAdan_room_14', 'HAKAdan_room_15', 'HAKAdan_room_16', 'HAKAdan_room_17', 'HAKAdan_room_18', 'HAKAdan_room_19', 'HAKAdan_room_20', 'HAKAdan_room_21', 'HAKAdan_room_22', 'HAKAdanCH_scene', 'HAKAdanCH_room_0', 'HAKAdanCH_room_1', 'HAKAdanCH_room_2', 'HAKAdanCH_room_3', 'HAKAdanCH_room_4', 'HAKAdanCH_room_5', 'HAKAdanCH_room_6', 'ice_doukutu_scene', 'ice_doukutu_room_0', 'ice_doukutu_room_1', 'ice_doukutu_room_2', 'ice_doukutu_room_3', 'ice_doukutu_room_4', 'ice_doukutu_room_5', 'ice_doukutu_room_6', 'ice_doukutu_room_7', 'ice_doukutu_room_8', 'ice_doukutu_room_9', 'ice_doukutu_room_10', 'ice_doukutu_room_11', 'men_scene', 'men_room_0', 'men_room_1', 'men_room_2', 'men_room_3', 'men_room_4', 'men_room_5', 'men_room_6', 'men_room_7', 'men_room_8', 'men_room_9', 'men_room_10', 'ganontika_scene', 'ganontika_room_0', 'ganontika_room_1', 'ganontika_room_2', 'ganontika_room_3', 'ganontika_room_4', 'ganontika_room_5', 'ganontika_room_6', 'ganontika_room_7', 'ganontika_room_8', 'ganontika_room_9', 'ganontika_room_10', 'ganontika_room_11', 'ganontika_room_12', 'ganontika_room_13', 'ganontika_room_14', 'ganontika_room_15', 'ganontika_room_16', 'ganontika_room_17', 'ganontika_room_18', 'ganontika_room_19', 'spot00_scene', 'spot00_room_0', 'spot01_scene', 'spot01_room_0', 'spot02_scene', 'spot02_room_0', 'spot02_room_1', 'spot03_scene', 'spot03_room_0', 'spot03_room_1', 'spot04_scene', 'spot04_room_0', 'spot04_room_1', 'spot04_room_2', 'spot05_scene', 'spot05_room_0', 'spot06_scene', 'spot06_room_0', 'spot07_scene', 'spot07_room_0', 'spot07_room_1', 'spot08_scene', 'spot08_room_0', 'spot09_scene', 'spot09_room_0', 'spot10_scene', 'spot10_room_0', 'spot10_room_1', 'spot10_room_2', 'spot10_room_3', 'spot10_room_4', 'spot10_room_5', 'spot10_room_6', 'spot10_room_7', 'spot10_room_8', 'spot10_room_9', 'spot11_scene', 'spot11_room_0', 'spot12_scene', 'spot12_room_0', 'spot12_room_1', 'spot13_scene', 'spot13_room_0', 'spot13_room_1', 'spot15_scene', 'spot15_room_0', 'spot16_scene', 'spot16_room_0', 'spot17_scene', 'spot17_room_0', 'spot17_room_1', 'spot18_scene', 'spot18_room_0', 'spot18_room_1', 'spot18_room_2', 'spot18_room_3', 'market_day_scene', 'market_day_room_0', 'market_night_scene', 'market_night_room_0', 'kenjyanoma_scene', 'kenjyanoma_room_0', 'tokinoma_scene', 'tokinoma_room_0', 'tokinoma_room_1', 'link_home_scene', 'link_home_room_0', 'kokiri_shop_scene', 'kokiri_shop_room_0', 'kokiri_home_scene', 'kokiri_home_room_0', 'kakusiana_scene', 'kakusiana_room_0', 'kakusiana_room_1', 'kakusiana_room_2', 'kakusiana_room_3', 'kakusiana_room_4', 'kakusiana_room_5', 'kakusiana_room_6', 'kakusiana_room_7', 'kakusiana_room_8', 'kakusiana_room_9', 'kakusiana_room_10', 'kakusiana_room_11', 'kakusiana_room_12', 'kakusiana_room_13', 'entra_scene', 'entra_room_0', 'moribossroom_scene', 'moribossroom_room_0', 'moribossroom_room_1', 'syatekijyou_scene', 'syatekijyou_room_0', 'shop1_scene', 'shop1_room_0', 'hairal_niwa_scene', 'hairal_niwa_room_0', 'ganon_tou_scene', 'ganon_tou_room_0', 'market_alley_scene', 'market_alley_room_0', 'spot20_scene', 'spot20_room_0', 'market_ruins_scene', 'market_ruins_room_0', 'entra_n_scene', 'entra_n_room_0', 'enrui_scene', 'enrui_room_0', 'market_alley_n_scene', 'market_alley_n_room_0', 'hiral_demo_scene', 'hiral_demo_room_0', 'kokiri_home3_scene', 'kokiri_home3_room_0', 'malon_stable_scene', 'malon_stable_room_0', 'kakariko_scene', 'kakariko_room_0', 'bdan_boss_scene', 'bdan_boss_room_0', 'bdan_boss_room_1', 'FIRE_bs_scene', 'FIRE_bs_room_0', 'FIRE_bs_room_1', 'hut_scene', 'hut_room_0', 'daiyousei_izumi_scene', 'daiyousei_izumi_room_0', 'hakaana_scene', 'hakaana_room_0', 'yousei_izumi_tate_scene', 'yousei_izumi_tate_room_0', 'yousei_izumi_yoko_scene', 'yousei_izumi_yoko_room_0', 'golon_scene', 'golon_room_0', 'zoora_scene', 'zoora_room_0', 'drag_scene', 'drag_room_0', 'alley_shop_scene', 'alley_shop_room_0', 'night_shop_scene', 'night_shop_room_0', 'impa_scene', 'impa_room_0', 'labo_scene', 'labo_room_0', 'tent_scene', 'tent_room_0', 'nakaniwa_scene', 'nakaniwa_room_0', 'ddan_boss_scene', 'ddan_boss_room_0', 'ddan_boss_room_1', 'ydan_boss_scene', 'ydan_boss_room_0', 'ydan_boss_room_1', 'HAKAdan_bs_scene', 'HAKAdan_bs_room_0', 'HAKAdan_bs_room_1', 'MIZUsin_bs_scene', 'MIZUsin_bs_room_0', 'MIZUsin_bs_room_1', 'ganon_scene', 'ganon_room_0', 'ganon_room_1', 'ganon_room_2', 'ganon_room_3', 'ganon_room_4', 'ganon_room_5', 'ganon_room_6', 'ganon_room_7', 'ganon_room_8', 'ganon_room_9', 'ganon_boss_scene', 'ganon_boss_room_0', 'jyasinboss_scene', 'jyasinboss_room_0', 'jyasinboss_room_1', 'jyasinboss_room_2', 'jyasinboss_room_3', 'kokiri_home4_scene', 'kokiri_home4_room_0', 'kokiri_home5_scene', 'kokiri_home5_room_0', 'ganon_final_scene', 'ganon_final_room_0', 'kakariko3_scene', 'kakariko3_room_0', 'hakasitarelay_scene', 'hakasitarelay_room_0', 'hakasitarelay_room_1', 'hakasitarelay_room_2', 'hakasitarelay_room_3', 'hakasitarelay_room_4', 'hakasitarelay_room_5', 'hakasitarelay_room_6', 'shrine_scene', 'shrine_room_0', 'turibori_scene', 'turibori_room_0', 'shrine_n_scene', 'shrine_n_room_0', 'shrine_r_scene', 'shrine_r_room_0', 'hakaana2_scene', 'hakaana2_room_0', 'gerudoway_scene', 'gerudoway_room_0', 'gerudoway_room_1', 'gerudoway_room_2', 'gerudoway_room_3', 'gerudoway_room_4', 'gerudoway_room_5', 'hairal_niwa_n_scene', 'hairal_niwa_n_room_0', 'bowling_scene', 'bowling_room_0', 'hakaana_ouke_scene', 'hakaana_ouke_room_0', 'hakaana_ouke_room_1', 'hakaana_ouke_room_2', 'hylia_labo_scene', 'hylia_labo_room_0', 'souko_scene', 'souko_room_0', 'souko_room_1', 'souko_room_2', 'miharigoya_scene', 'miharigoya_room_0', 'mahouya_scene', 'mahouya_room_0', 'takaraya_scene', 'takaraya_room_0', 'takaraya_room_1', 'takaraya_room_2', 'takaraya_room_3', 'takaraya_room_4', 'takaraya_room_5', 'takaraya_room_6', 'ganon_sonogo_scene', 'ganon_sonogo_room_0', 'ganon_sonogo_room_1', 'ganon_sonogo_room_2', 'ganon_sonogo_room_3', 'ganon_sonogo_room_4', 'ganon_demo_scene', 'ganon_demo_room_0', 'face_shop_scene', 'face_shop_room_0', 'kinsuta_scene', 'kinsuta_room_0', 'ganontikasonogo_scene', 'ganontikasonogo_room_0', 'ganontikasonogo_room_1', 'bump_texture_static', 'anime_model_1_static', 'anime_model_2_static', 'anime_model_3_static', 'anime_model_4_static', 'anime_model_5_static', 'anime_model_6_static', 'anime_texture_1_static', 'anime_texture_2_static', 'anime_texture_3_static', 'anime_texture_4_static', 'anime_texture_5_static', 'anime_texture_6_static', 'softsprite_matrix_static', ] romData = None def initialize_worker(rom_data): global romData romData = rom_data def read_uint32_be(offset): return struct.unpack('>I', romData[offset:offset+4])[0] def write_output_file(name, offset, size): try: with open(name, 'wb') as f: f.write(romData[offset:offset+size]) except IOError: print('failed to write file ' + name) def ExtractFunc(i): filename = 'baserom/' + FILE_NAMES[i] entryOffset = FILE_TABLE_OFFSET + 16 * i virtStart = read_uint32_be(entryOffset + 0) virtEnd = read_uint32_be(entryOffset + 4) physStart = read_uint32_be(entryOffset + 8) physEnd = read_uint32_be(entryOffset + 12) if physEnd == 0: # uncompressed compressed = False size = virtEnd - virtStart else: # compressed compressed = True size = physEnd - physStart print('extracting ' + filename + " (0x%08X, 0x%08X)" % (virtStart, virtEnd)) write_output_file(filename, physStart, size) if compressed: os.system('tools/yaz0 -d ' + filename + ' ' + filename) ##################################################################### def main(): try: os.mkdir('baserom') except: pass # read baserom data try: with open(ROM_FILE_NAME, 'rb') as f: rom_data = f.read() except IOError: print('failed to read ' + ROM_FILE_NAME) sys.exit(1) # extract files num_cores = cpu_count() print("Extracting baserom with " + str(num_cores) + " CPU cores.") with Pool(num_cores, initialize_worker, (rom_data,)) as p: p.map(ExtractFunc, range(len(FILE_NAMES))) if __name__ == "__main__": main()