diff --git a/assets/xml/code/fbdemo_circle.xml b/assets/xml/code/fbdemo_circle.xml
index 1aa2de764a..530506369c 100644
--- a/assets/xml/code/fbdemo_circle.xml
+++ b/assets/xml/code/fbdemo_circle.xml
@@ -1,13 +1,13 @@
-
-
-
-
-
-
+
+
+
+
+
+
-
+
diff --git a/assets/xml/code/fbdemo_triforce.xml b/assets/xml/code/fbdemo_triforce.xml
index a20e07075f..613f7995d2 100644
--- a/assets/xml/code/fbdemo_triforce.xml
+++ b/assets/xml/code/fbdemo_triforce.xml
@@ -1,7 +1,7 @@
-
-
-
+
+
+
diff --git a/assets/xml/code/fbdemo_wipe1.xml b/assets/xml/code/fbdemo_wipe1.xml
index f459c9f8ec..74f129776b 100644
--- a/assets/xml/code/fbdemo_wipe1.xml
+++ b/assets/xml/code/fbdemo_wipe1.xml
@@ -1,10 +1,10 @@
-
-
+
+
-
+
-
+
diff --git a/assets/xml/overlays/ovl_Arrow_Fire.xml b/assets/xml/overlays/ovl_Arrow_Fire.xml
index 621df71cea..061e11f84b 100644
--- a/assets/xml/overlays/ovl_Arrow_Fire.xml
+++ b/assets/xml/overlays/ovl_Arrow_Fire.xml
@@ -1,11 +1,11 @@
-
-
-
-
+
+
+
+
-
-
+
+
diff --git a/assets/xml/overlays/ovl_Arrow_Ice.xml b/assets/xml/overlays/ovl_Arrow_Ice.xml
index e216ff02a7..d2a0df3be8 100644
--- a/assets/xml/overlays/ovl_Arrow_Ice.xml
+++ b/assets/xml/overlays/ovl_Arrow_Ice.xml
@@ -1,11 +1,11 @@
-
-
-
-
+
+
+
+
-
-
+
+
diff --git a/assets/xml/overlays/ovl_Arrow_Light.xml b/assets/xml/overlays/ovl_Arrow_Light.xml
index e9827c2c95..1f449dd7b9 100644
--- a/assets/xml/overlays/ovl_Arrow_Light.xml
+++ b/assets/xml/overlays/ovl_Arrow_Light.xml
@@ -1,11 +1,11 @@
-
-
-
-
+
+
+
+
-
-
+
+
diff --git a/assets/xml/overlays/ovl_Bg_Ganon_Otyuka.xml b/assets/xml/overlays/ovl_Bg_Ganon_Otyuka.xml
index 6b9a9a7441..7b294e65b2 100644
--- a/assets/xml/overlays/ovl_Bg_Ganon_Otyuka.xml
+++ b/assets/xml/overlays/ovl_Bg_Ganon_Otyuka.xml
@@ -1,29 +1,29 @@
-
-
+
+
-
+
-
-
+
+
-
+
-
+
-
+
-
+
-
-
+
+
-
+
-
+
diff --git a/assets/xml/overlays/ovl_Bg_Jya_Cobra.xml b/assets/xml/overlays/ovl_Bg_Jya_Cobra.xml
index 874bb1ec67..52f65678c5 100644
--- a/assets/xml/overlays/ovl_Bg_Jya_Cobra.xml
+++ b/assets/xml/overlays/ovl_Bg_Jya_Cobra.xml
@@ -1,10 +1,10 @@
-
-
+
+
-
+
diff --git a/assets/xml/overlays/ovl_Boss_Dodongo.xml b/assets/xml/overlays/ovl_Boss_Dodongo.xml
index f2ee5b7b8c..78d2f8e5b3 100644
--- a/assets/xml/overlays/ovl_Boss_Dodongo.xml
+++ b/assets/xml/overlays/ovl_Boss_Dodongo.xml
@@ -1,6 +1,6 @@
-
-
-
+
+
+
diff --git a/assets/xml/overlays/ovl_Boss_Ganon.xml b/assets/xml/overlays/ovl_Boss_Ganon.xml
index cdb87e9c16..83a19c9b59 100644
--- a/assets/xml/overlays/ovl_Boss_Ganon.xml
+++ b/assets/xml/overlays/ovl_Boss_Ganon.xml
@@ -1,53 +1,53 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
-
+
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/assets/xml/overlays/ovl_Boss_Ganon2.xml b/assets/xml/overlays/ovl_Boss_Ganon2.xml
index 3d5bfdfba0..4b1879a17b 100644
--- a/assets/xml/overlays/ovl_Boss_Ganon2.xml
+++ b/assets/xml/overlays/ovl_Boss_Ganon2.xml
@@ -1,29 +1,29 @@
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/assets/xml/overlays/ovl_Boss_Sst.xml b/assets/xml/overlays/ovl_Boss_Sst.xml
index e65a58ccd1..35584224de 100644
--- a/assets/xml/overlays/ovl_Boss_Sst.xml
+++ b/assets/xml/overlays/ovl_Boss_Sst.xml
@@ -1,8 +1,8 @@
-
-
-
-
-
+
+
+
+
+
diff --git a/assets/xml/overlays/ovl_Demo_Shd.xml b/assets/xml/overlays/ovl_Demo_Shd.xml
index 2ac9a9b484..967f383ec3 100644
--- a/assets/xml/overlays/ovl_Demo_Shd.xml
+++ b/assets/xml/overlays/ovl_Demo_Shd.xml
@@ -1,8 +1,8 @@
-
+
-
-
-
+
+
+
diff --git a/assets/xml/overlays/ovl_Effect_Ss_Fhg_Flash.xml b/assets/xml/overlays/ovl_Effect_Ss_Fhg_Flash.xml
index d2de328dad..b8c0613ee4 100644
--- a/assets/xml/overlays/ovl_Effect_Ss_Fhg_Flash.xml
+++ b/assets/xml/overlays/ovl_Effect_Ss_Fhg_Flash.xml
@@ -1,9 +1,9 @@
-
-
+
+
-
-
+
+
diff --git a/assets/xml/overlays/ovl_Elf_Msg.xml b/assets/xml/overlays/ovl_Elf_Msg.xml
index 82cd468a3e..61e28d31b7 100644
--- a/assets/xml/overlays/ovl_Elf_Msg.xml
+++ b/assets/xml/overlays/ovl_Elf_Msg.xml
@@ -1,16 +1,16 @@
-
+
-
+
-
+
-
+
-
+
-
+
diff --git a/assets/xml/overlays/ovl_Elf_Msg2.xml b/assets/xml/overlays/ovl_Elf_Msg2.xml
index fb2199424e..a0ea055e26 100644
--- a/assets/xml/overlays/ovl_Elf_Msg2.xml
+++ b/assets/xml/overlays/ovl_Elf_Msg2.xml
@@ -1,11 +1,11 @@
-
+
-
+
-
+
-
+
diff --git a/assets/xml/overlays/ovl_En_Bili.xml b/assets/xml/overlays/ovl_En_Bili.xml
index 35c3fa301e..ed2fda6cac 100644
--- a/assets/xml/overlays/ovl_En_Bili.xml
+++ b/assets/xml/overlays/ovl_En_Bili.xml
@@ -1,7 +1,7 @@
-
-
-
+
+
+
diff --git a/assets/xml/overlays/ovl_En_Clear_Tag.xml b/assets/xml/overlays/ovl_En_Clear_Tag.xml
index cd67b1f486..05c9c29865 100644
--- a/assets/xml/overlays/ovl_En_Clear_Tag.xml
+++ b/assets/xml/overlays/ovl_En_Clear_Tag.xml
@@ -1,14 +1,14 @@
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
diff --git a/assets/xml/overlays/ovl_En_Ganon_Mant.xml b/assets/xml/overlays/ovl_En_Ganon_Mant.xml
index 900ec46ac8..a9242f1781 100644
--- a/assets/xml/overlays/ovl_En_Ganon_Mant.xml
+++ b/assets/xml/overlays/ovl_En_Ganon_Mant.xml
@@ -1,21 +1,21 @@
-
-
+
+
-
+
-
+
-
+
-
+
-
+
-
+
diff --git a/assets/xml/overlays/ovl_En_Ganon_Organ.xml b/assets/xml/overlays/ovl_En_Ganon_Organ.xml
index 7d4f8bc785..05257fb6f6 100644
--- a/assets/xml/overlays/ovl_En_Ganon_Organ.xml
+++ b/assets/xml/overlays/ovl_En_Ganon_Organ.xml
@@ -1,19 +1,19 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
+
+
diff --git a/assets/xml/overlays/ovl_En_Holl.xml b/assets/xml/overlays/ovl_En_Holl.xml
index 6fa7d36433..b219524d8a 100644
--- a/assets/xml/overlays/ovl_En_Holl.xml
+++ b/assets/xml/overlays/ovl_En_Holl.xml
@@ -1,8 +1,8 @@
-
-
+
+
-
+
diff --git a/assets/xml/overlays/ovl_En_Jsjutan.xml b/assets/xml/overlays/ovl_En_Jsjutan.xml
index 44229419cd..b3b012b1f5 100644
--- a/assets/xml/overlays/ovl_En_Jsjutan.xml
+++ b/assets/xml/overlays/ovl_En_Jsjutan.xml
@@ -1,38 +1,38 @@
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
diff --git a/assets/xml/overlays/ovl_En_Kanban.xml b/assets/xml/overlays/ovl_En_Kanban.xml
index 546de14d0c..d8f50f425a 100644
--- a/assets/xml/overlays/ovl_En_Kanban.xml
+++ b/assets/xml/overlays/ovl_En_Kanban.xml
@@ -1,8 +1,8 @@
-
-
+
+
-
+
diff --git a/assets/xml/overlays/ovl_En_Sda.xml b/assets/xml/overlays/ovl_En_Sda.xml
index c4293e92bd..5652ce7e68 100644
--- a/assets/xml/overlays/ovl_En_Sda.xml
+++ b/assets/xml/overlays/ovl_En_Sda.xml
@@ -1,9 +1,9 @@
-
-
+
+
-
-
+
+
diff --git a/assets/xml/overlays/ovl_En_Ssh.xml b/assets/xml/overlays/ovl_En_Ssh.xml
index 5467eed62d..23e2aa81cf 100644
--- a/assets/xml/overlays/ovl_En_Ssh.xml
+++ b/assets/xml/overlays/ovl_En_Ssh.xml
@@ -1,8 +1,8 @@
-
-
+
+
-
+
diff --git a/assets/xml/overlays/ovl_En_St.xml b/assets/xml/overlays/ovl_En_St.xml
index 0252a1387a..bfa7505913 100644
--- a/assets/xml/overlays/ovl_En_St.xml
+++ b/assets/xml/overlays/ovl_En_St.xml
@@ -1,8 +1,8 @@
-
-
+
+
-
+
diff --git a/assets/xml/overlays/ovl_En_Sth.xml b/assets/xml/overlays/ovl_En_Sth.xml
index ccc45fb1c9..46a30a7185 100644
--- a/assets/xml/overlays/ovl_En_Sth.xml
+++ b/assets/xml/overlays/ovl_En_Sth.xml
@@ -1,15 +1,15 @@
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/assets/xml/overlays/ovl_End_Title.xml b/assets/xml/overlays/ovl_End_Title.xml
index 841d45f6dd..53d085681d 100644
--- a/assets/xml/overlays/ovl_End_Title.xml
+++ b/assets/xml/overlays/ovl_End_Title.xml
@@ -1,17 +1,17 @@
-
-
-
-
-
-
-
+
+
+
+
+
+
+
-
+
-
+
-
+
diff --git a/assets/xml/overlays/ovl_File_Choose.xml b/assets/xml/overlays/ovl_File_Choose.xml
deleted file mode 100644
index 8bebff602a..0000000000
--- a/assets/xml/overlays/ovl_File_Choose.xml
+++ /dev/null
@@ -1,28 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/assets/xml/overlays/ovl_Magic_Dark.xml b/assets/xml/overlays/ovl_Magic_Dark.xml
index 874150ab35..5c8b75c1fb 100644
--- a/assets/xml/overlays/ovl_Magic_Dark.xml
+++ b/assets/xml/overlays/ovl_Magic_Dark.xml
@@ -1,13 +1,13 @@
-
-
+
+
-
+
-
-
+
+
diff --git a/assets/xml/overlays/ovl_Magic_Fire.xml b/assets/xml/overlays/ovl_Magic_Fire.xml
index 696bdc0dc2..81de7a989f 100644
--- a/assets/xml/overlays/ovl_Magic_Fire.xml
+++ b/assets/xml/overlays/ovl_Magic_Fire.xml
@@ -1,10 +1,10 @@
-
-
-
+
+
+
-
-
+
+
diff --git a/assets/xml/overlays/ovl_Magic_Wind.xml b/assets/xml/overlays/ovl_Magic_Wind.xml
index 8fc20ce1ba..7da59209b8 100644
--- a/assets/xml/overlays/ovl_Magic_Wind.xml
+++ b/assets/xml/overlays/ovl_Magic_Wind.xml
@@ -1,15 +1,15 @@
-
-
-
-
-
-
-
+
+
+
+
+
+
+
-
-
-
+
+
+
diff --git a/assets/xml/overlays/ovl_Oceff_Spot.xml b/assets/xml/overlays/ovl_Oceff_Spot.xml
index 9a53952f03..6c81549060 100644
--- a/assets/xml/overlays/ovl_Oceff_Spot.xml
+++ b/assets/xml/overlays/ovl_Oceff_Spot.xml
@@ -1,10 +1,10 @@
-
-
-
+
+
+
-
-
+
+
diff --git a/assets/xml/overlays/ovl_Oceff_Storm.xml b/assets/xml/overlays/ovl_Oceff_Storm.xml
index 5893b6f8e8..d8217a6157 100644
--- a/assets/xml/overlays/ovl_Oceff_Storm.xml
+++ b/assets/xml/overlays/ovl_Oceff_Storm.xml
@@ -1,12 +1,12 @@
-
-
-
-
+
+
+
+
-
-
+
+
diff --git a/assets/xml/overlays/ovl_Oceff_Wipe.xml b/assets/xml/overlays/ovl_Oceff_Wipe.xml
index 52e29f1bc3..64b3f1332e 100644
--- a/assets/xml/overlays/ovl_Oceff_Wipe.xml
+++ b/assets/xml/overlays/ovl_Oceff_Wipe.xml
@@ -1,10 +1,10 @@
-
-
-
+
+
+
-
-
+
+
diff --git a/assets/xml/overlays/ovl_Oceff_Wipe2.xml b/assets/xml/overlays/ovl_Oceff_Wipe2.xml
index b42c72a66f..0166d1909f 100644
--- a/assets/xml/overlays/ovl_Oceff_Wipe2.xml
+++ b/assets/xml/overlays/ovl_Oceff_Wipe2.xml
@@ -1,11 +1,11 @@
-
-
-
-
+
+
+
+
-
-
+
+
diff --git a/assets/xml/overlays/ovl_Oceff_Wipe3.xml b/assets/xml/overlays/ovl_Oceff_Wipe3.xml
index 11f2788669..d797d1675f 100644
--- a/assets/xml/overlays/ovl_Oceff_Wipe3.xml
+++ b/assets/xml/overlays/ovl_Oceff_Wipe3.xml
@@ -1,10 +1,10 @@
-
-
-
+
+
+
-
-
+
+
diff --git a/assets/xml/overlays/ovl_Oceff_Wipe4.xml b/assets/xml/overlays/ovl_Oceff_Wipe4.xml
index b2be9073a4..086491fa3a 100644
--- a/assets/xml/overlays/ovl_Oceff_Wipe4.xml
+++ b/assets/xml/overlays/ovl_Oceff_Wipe4.xml
@@ -1,12 +1,12 @@
-
-
-
+
+
+
-
-
-
+
+
+
diff --git a/assets/xml/overlays/ovl_file_choose.xml b/assets/xml/overlays/ovl_file_choose.xml
new file mode 100644
index 0000000000..aa9dcbb84b
--- /dev/null
+++ b/assets/xml/overlays/ovl_file_choose.xml
@@ -0,0 +1,28 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/baseroms/gc-eu-mq-dbg/config.yml b/baseroms/gc-eu-mq-dbg/config.yml
index dd6123e33a..6971ae3925 100644
--- a/baseroms/gc-eu-mq-dbg/config.yml
+++ b/baseroms/gc-eu-mq-dbg/config.yml
@@ -6,3 +6,634 @@ variables:
sFraMessageEntryTable: 0x80151658
sStaffMessageEntryTable: 0x80153768
sNesMessageEntryTablePtr: 0x801538F0
+assets:
+- xml_path: assets/xml/code/fbdemo_circle.xml
+ start_offset: 0x10ED48
+ end_offset: 0x10FF68
+- xml_path: assets/xml/code/fbdemo_triforce.xml
+ start_offset: 0x10E1D0
+ end_offset: 0x10E2A0
+- xml_path: assets/xml/code/fbdemo_wipe1.xml
+ start_offset: 0x10E2A0
+ end_offset: 0x10EC30
+- xml_path: assets/xml/misc/link_animetion.xml
+- xml_path: assets/xml/misc/z_select_static.xml
+- xml_path: assets/xml/objects/gameplay_dangeon_keep.xml
+- xml_path: assets/xml/objects/gameplay_field_keep.xml
+- xml_path: assets/xml/objects/gameplay_keep.xml
+- xml_path: assets/xml/objects/object_ahg.xml
+- xml_path: assets/xml/objects/object_am.xml
+- xml_path: assets/xml/objects/object_ane.xml
+- xml_path: assets/xml/objects/object_ani.xml
+- xml_path: assets/xml/objects/object_anubice.xml
+- xml_path: assets/xml/objects/object_aob.xml
+- xml_path: assets/xml/objects/object_b_heart.xml
+- xml_path: assets/xml/objects/object_Bb.xml
+- xml_path: assets/xml/objects/object_bba.xml
+- xml_path: assets/xml/objects/object_bdan_objects.xml
+- xml_path: assets/xml/objects/object_bdoor.xml
+- xml_path: assets/xml/objects/object_bg.xml
+- xml_path: assets/xml/objects/object_bigokuta.xml
+- xml_path: assets/xml/objects/object_bird.xml
+- xml_path: assets/xml/objects/object_bji.xml
+- xml_path: assets/xml/objects/object_bl.xml
+- xml_path: assets/xml/objects/object_blkobj.xml
+- xml_path: assets/xml/objects/object_bob.xml
+- xml_path: assets/xml/objects/object_boj.xml
+- xml_path: assets/xml/objects/object_bombf.xml
+- xml_path: assets/xml/objects/object_bombiwa.xml
+- xml_path: assets/xml/objects/object_bowl.xml
+- xml_path: assets/xml/objects/object_box.xml
+- xml_path: assets/xml/objects/object_brob.xml
+- xml_path: assets/xml/objects/object_bubble.xml
+- xml_path: assets/xml/objects/object_bv.xml
+- xml_path: assets/xml/objects/object_bw.xml
+- xml_path: assets/xml/objects/object_bwall.xml
+- xml_path: assets/xml/objects/object_bxa.xml
+- xml_path: assets/xml/objects/object_cne.xml
+- xml_path: assets/xml/objects/object_cob.xml
+- xml_path: assets/xml/objects/object_cow.xml
+- xml_path: assets/xml/objects/object_crow.xml
+- xml_path: assets/xml/objects/object_cs.xml
+- xml_path: assets/xml/objects/object_d_elevator.xml
+- xml_path: assets/xml/objects/object_d_hsblock.xml
+- xml_path: assets/xml/objects/object_d_lift.xml
+- xml_path: assets/xml/objects/object_daiku.xml
+- xml_path: assets/xml/objects/object_ddan_objects.xml
+- xml_path: assets/xml/objects/object_dekubaba.xml
+- xml_path: assets/xml/objects/object_dekujr.xml
+- xml_path: assets/xml/objects/object_dekunuts.xml
+- xml_path: assets/xml/objects/object_demo_6k.xml
+- xml_path: assets/xml/objects/object_demo_kekkai.xml
+- xml_path: assets/xml/objects/object_demo_tre_lgt.xml
+- xml_path: assets/xml/objects/object_dh.xml
+- xml_path: assets/xml/objects/object_dnk.xml
+- xml_path: assets/xml/objects/object_dns.xml
+- xml_path: assets/xml/objects/object_dodojr.xml
+- xml_path: assets/xml/objects/object_dodongo.xml
+- xml_path: assets/xml/objects/object_dog.xml
+- xml_path: assets/xml/objects/object_door_gerudo.xml
+- xml_path: assets/xml/objects/object_door_killer.xml
+- xml_path: assets/xml/objects/object_ds.xml
+- xml_path: assets/xml/objects/object_ds2.xml
+- xml_path: assets/xml/objects/object_du.xml
+- xml_path: assets/xml/objects/object_dy_obj.xml
+- xml_path: assets/xml/objects/object_ec.xml
+- xml_path: assets/xml/objects/object_efc_crystal_light.xml
+- xml_path: assets/xml/objects/object_efc_doughnut.xml
+- xml_path: assets/xml/objects/object_efc_erupc.xml
+- xml_path: assets/xml/objects/object_efc_fire_ball.xml
+- xml_path: assets/xml/objects/object_efc_flash.xml
+- xml_path: assets/xml/objects/object_efc_lgt_shower.xml
+- xml_path: assets/xml/objects/object_efc_star_field.xml
+- xml_path: assets/xml/objects/object_efc_tw.xml
+- xml_path: assets/xml/objects/object_ei.xml
+- xml_path: assets/xml/objects/object_fa.xml
+- xml_path: assets/xml/objects/object_fd.xml
+- xml_path: assets/xml/objects/object_fd2.xml
+- xml_path: assets/xml/objects/object_fhg.xml
+- xml_path: assets/xml/objects/object_fire.xml
+- xml_path: assets/xml/objects/object_firefly.xml
+- xml_path: assets/xml/objects/object_fish.xml
+- xml_path: assets/xml/objects/object_fr.xml
+- xml_path: assets/xml/objects/object_fu.xml
+- xml_path: assets/xml/objects/object_fw.xml
+- xml_path: assets/xml/objects/object_fz.xml
+- xml_path: assets/xml/objects/object_ganon.xml
+- xml_path: assets/xml/objects/object_ganon2.xml
+- xml_path: assets/xml/objects/object_ganon_anime1.xml
+- xml_path: assets/xml/objects/object_ganon_anime2.xml
+- xml_path: assets/xml/objects/object_ganon_anime3.xml
+- xml_path: assets/xml/objects/object_ganon_objects.xml
+- xml_path: assets/xml/objects/object_ge1.xml
+- xml_path: assets/xml/objects/object_geff.xml
+- xml_path: assets/xml/objects/object_geldb.xml
+- xml_path: assets/xml/objects/object_gi_arrow.xml
+- xml_path: assets/xml/objects/object_gi_arrowcase.xml
+- xml_path: assets/xml/objects/object_gi_bean.xml
+- xml_path: assets/xml/objects/object_gi_bomb_1.xml
+- xml_path: assets/xml/objects/object_gi_bomb_2.xml
+- xml_path: assets/xml/objects/object_gi_bombpouch.xml
+- xml_path: assets/xml/objects/object_gi_boomerang.xml
+- xml_path: assets/xml/objects/object_gi_boots_2.xml
+- xml_path: assets/xml/objects/object_gi_bosskey.xml
+- xml_path: assets/xml/objects/object_gi_bottle.xml
+- xml_path: assets/xml/objects/object_gi_bottle_letter.xml
+- xml_path: assets/xml/objects/object_gi_bow.xml
+- xml_path: assets/xml/objects/object_gi_bracelet.xml
+- xml_path: assets/xml/objects/object_gi_brokensword.xml
+- xml_path: assets/xml/objects/object_gi_butterfly.xml
+- xml_path: assets/xml/objects/object_gi_clothes.xml
+- xml_path: assets/xml/objects/object_gi_coin.xml
+- xml_path: assets/xml/objects/object_gi_compass.xml
+- xml_path: assets/xml/objects/object_gi_dekupouch.xml
+- xml_path: assets/xml/objects/object_gi_egg.xml
+- xml_path: assets/xml/objects/object_gi_eye_lotion.xml
+- xml_path: assets/xml/objects/object_gi_fire.xml
+- xml_path: assets/xml/objects/object_gi_fish.xml
+- xml_path: assets/xml/objects/object_gi_frog.xml
+- xml_path: assets/xml/objects/object_gi_gerudo.xml
+- xml_path: assets/xml/objects/object_gi_gerudomask.xml
+- xml_path: assets/xml/objects/object_gi_ghost.xml
+- xml_path: assets/xml/objects/object_gi_glasses.xml
+- xml_path: assets/xml/objects/object_gi_gloves.xml
+- xml_path: assets/xml/objects/object_gi_goddess.xml
+- xml_path: assets/xml/objects/object_gi_golonmask.xml
+- xml_path: assets/xml/objects/object_gi_grass.xml
+- xml_path: assets/xml/objects/object_gi_hammer.xml
+- xml_path: assets/xml/objects/object_gi_heart.xml
+- xml_path: assets/xml/objects/object_gi_hearts.xml
+- xml_path: assets/xml/objects/object_gi_hookshot.xml
+- xml_path: assets/xml/objects/object_gi_hoverboots.xml
+- xml_path: assets/xml/objects/object_gi_insect.xml
+- xml_path: assets/xml/objects/object_gi_jewel.xml
+- xml_path: assets/xml/objects/object_gi_key.xml
+- xml_path: assets/xml/objects/object_gi_ki_tan_mask.xml
+- xml_path: assets/xml/objects/object_gi_letter.xml
+- xml_path: assets/xml/objects/object_gi_liquid.xml
+- xml_path: assets/xml/objects/object_gi_longsword.xml
+- xml_path: assets/xml/objects/object_gi_m_arrow.xml
+- xml_path: assets/xml/objects/object_gi_magicpot.xml
+- xml_path: assets/xml/objects/object_gi_map.xml
+- xml_path: assets/xml/objects/object_gi_medal.xml
+- xml_path: assets/xml/objects/object_gi_melody.xml
+- xml_path: assets/xml/objects/object_gi_milk.xml
+- xml_path: assets/xml/objects/object_gi_mushroom.xml
+- xml_path: assets/xml/objects/object_gi_niwatori.xml
+- xml_path: assets/xml/objects/object_gi_nuts.xml
+- xml_path: assets/xml/objects/object_gi_ocarina.xml
+- xml_path: assets/xml/objects/object_gi_ocarina_0.xml
+- xml_path: assets/xml/objects/object_gi_pachinko.xml
+- xml_path: assets/xml/objects/object_gi_powder.xml
+- xml_path: assets/xml/objects/object_gi_prescription.xml
+- xml_path: assets/xml/objects/object_gi_purse.xml
+- xml_path: assets/xml/objects/object_gi_rabit_mask.xml
+- xml_path: assets/xml/objects/object_gi_redead_mask.xml
+- xml_path: assets/xml/objects/object_gi_rupy.xml
+- xml_path: assets/xml/objects/object_gi_saw.xml
+- xml_path: assets/xml/objects/object_gi_scale.xml
+- xml_path: assets/xml/objects/object_gi_seed.xml
+- xml_path: assets/xml/objects/object_gi_shield_1.xml
+- xml_path: assets/xml/objects/object_gi_shield_2.xml
+- xml_path: assets/xml/objects/object_gi_shield_3.xml
+- xml_path: assets/xml/objects/object_gi_skj_mask.xml
+- xml_path: assets/xml/objects/object_gi_soldout.xml
+- xml_path: assets/xml/objects/object_gi_soul.xml
+- xml_path: assets/xml/objects/object_gi_stick.xml
+- xml_path: assets/xml/objects/object_gi_sutaru.xml
+- xml_path: assets/xml/objects/object_gi_sword_1.xml
+- xml_path: assets/xml/objects/object_gi_ticketstone.xml
+- xml_path: assets/xml/objects/object_gi_truth_mask.xml
+- xml_path: assets/xml/objects/object_gi_zoramask.xml
+- xml_path: assets/xml/objects/object_gj.xml
+- xml_path: assets/xml/objects/object_gjyo_objects.xml
+- xml_path: assets/xml/objects/object_gla.xml
+- xml_path: assets/xml/objects/object_gm.xml
+- xml_path: assets/xml/objects/object_gnd.xml
+- xml_path: assets/xml/objects/object_gnd_magic.xml
+- xml_path: assets/xml/objects/object_gndd.xml
+- xml_path: assets/xml/objects/object_god_lgt.xml
+- xml_path: assets/xml/objects/object_gol.xml
+- xml_path: assets/xml/objects/object_goma.xml
+- xml_path: assets/xml/objects/object_goroiwa.xml
+- xml_path: assets/xml/objects/object_gr.xml
+- xml_path: assets/xml/objects/object_gs.xml
+- xml_path: assets/xml/objects/object_gt.xml
+- xml_path: assets/xml/objects/object_haka.xml
+- xml_path: assets/xml/objects/object_haka_door.xml
+- xml_path: assets/xml/objects/object_haka_objects.xml
+- xml_path: assets/xml/objects/object_hakach_objects.xml
+- xml_path: assets/xml/objects/object_hata.xml
+- xml_path: assets/xml/objects/object_heavy_object.xml
+- xml_path: assets/xml/objects/object_hidan_objects.xml
+- xml_path: assets/xml/objects/object_hintnuts.xml
+- xml_path: assets/xml/objects/object_hni.xml
+- xml_path: assets/xml/objects/object_horse.xml
+- xml_path: assets/xml/objects/object_horse_ganon.xml
+- xml_path: assets/xml/objects/object_horse_link_child.xml
+- xml_path: assets/xml/objects/object_horse_normal.xml
+- xml_path: assets/xml/objects/object_horse_zelda.xml
+- xml_path: assets/xml/objects/object_hs.xml
+- xml_path: assets/xml/objects/object_human.xml
+- xml_path: assets/xml/objects/object_ice_objects.xml
+- xml_path: assets/xml/objects/object_ik.xml
+- xml_path: assets/xml/objects/object_im.xml
+- xml_path: assets/xml/objects/object_in.xml
+- xml_path: assets/xml/objects/object_ingate.xml
+- xml_path: assets/xml/objects/object_jj.xml
+- xml_path: assets/xml/objects/object_js.xml
+- xml_path: assets/xml/objects/object_jya_door.xml
+- xml_path: assets/xml/objects/object_jya_iron.xml
+- xml_path: assets/xml/objects/object_jya_obj.xml
+- xml_path: assets/xml/objects/object_ka.xml
+- xml_path: assets/xml/objects/object_kanban.xml
+- xml_path: assets/xml/objects/object_kibako2.xml
+- xml_path: assets/xml/objects/object_kingdodongo.xml
+- xml_path: assets/xml/objects/object_km1.xml
+- xml_path: assets/xml/objects/object_kusa.xml
+- xml_path: assets/xml/objects/object_kw1.xml
+- xml_path: assets/xml/objects/object_kz.xml
+- xml_path: assets/xml/objects/object_light_ring.xml
+- xml_path: assets/xml/objects/object_lightbox.xml
+- xml_path: assets/xml/objects/object_lightswitch.xml
+- xml_path: assets/xml/objects/object_link_boy.xml
+- xml_path: assets/xml/objects/object_link_child.xml
+- xml_path: assets/xml/objects/object_ma1.xml
+- xml_path: assets/xml/objects/object_ma2.xml
+- xml_path: assets/xml/objects/object_mag.xml
+- xml_path: assets/xml/objects/object_mamenoki.xml
+- xml_path: assets/xml/objects/object_mastergolon.xml
+- xml_path: assets/xml/objects/object_masterkokiri.xml
+- xml_path: assets/xml/objects/object_masterkokirihead.xml
+- xml_path: assets/xml/objects/object_masterzoora.xml
+- xml_path: assets/xml/objects/object_mb.xml
+- xml_path: assets/xml/objects/object_md.xml
+- xml_path: assets/xml/objects/object_medal.xml
+- xml_path: assets/xml/objects/object_menkuri_objects.xml
+- xml_path: assets/xml/objects/object_mir_ray.xml
+- xml_path: assets/xml/objects/object_mizu_objects.xml
+- xml_path: assets/xml/objects/object_mjin.xml
+- xml_path: assets/xml/objects/object_mjin_dark.xml
+- xml_path: assets/xml/objects/object_mjin_flame.xml
+- xml_path: assets/xml/objects/object_mjin_flash.xml
+- xml_path: assets/xml/objects/object_mjin_ice.xml
+- xml_path: assets/xml/objects/object_mjin_oka.xml
+- xml_path: assets/xml/objects/object_mjin_soul.xml
+- xml_path: assets/xml/objects/object_mjin_wind.xml
+- xml_path: assets/xml/objects/object_mk.xml
+- xml_path: assets/xml/objects/object_mm.xml
+- xml_path: assets/xml/objects/object_mo.xml
+- xml_path: assets/xml/objects/object_mori_hineri1.xml
+- xml_path: assets/xml/objects/object_mori_hineri1a.xml
+- xml_path: assets/xml/objects/object_mori_hineri2.xml
+- xml_path: assets/xml/objects/object_mori_hineri2a.xml
+- xml_path: assets/xml/objects/object_mori_objects.xml
+- xml_path: assets/xml/objects/object_mori_tex.xml
+- xml_path: assets/xml/objects/object_ms.xml
+- xml_path: assets/xml/objects/object_mu.xml
+- xml_path: assets/xml/objects/object_nb.xml
+- xml_path: assets/xml/objects/object_niw.xml
+- xml_path: assets/xml/objects/object_nwc.xml
+- xml_path: assets/xml/objects/object_ny.xml
+- xml_path: assets/xml/objects/object_o_anime.xml
+- xml_path: assets/xml/objects/object_oA1.xml
+- xml_path: assets/xml/objects/object_oA2.xml
+- xml_path: assets/xml/objects/object_oA3.xml
+- xml_path: assets/xml/objects/object_oA4.xml
+- xml_path: assets/xml/objects/object_oA5.xml
+- xml_path: assets/xml/objects/object_oA6.xml
+- xml_path: assets/xml/objects/object_oA7.xml
+- xml_path: assets/xml/objects/object_oA8.xml
+- xml_path: assets/xml/objects/object_oA9.xml
+- xml_path: assets/xml/objects/object_oA10.xml
+- xml_path: assets/xml/objects/object_oA11.xml
+- xml_path: assets/xml/objects/object_oB1.xml
+- xml_path: assets/xml/objects/object_oB2.xml
+- xml_path: assets/xml/objects/object_oB3.xml
+- xml_path: assets/xml/objects/object_oB4.xml
+- xml_path: assets/xml/objects/object_oE1.xml
+- xml_path: assets/xml/objects/object_oE1s.xml
+- xml_path: assets/xml/objects/object_oE2.xml
+- xml_path: assets/xml/objects/object_oE3.xml
+- xml_path: assets/xml/objects/object_oE4.xml
+- xml_path: assets/xml/objects/object_oE4s.xml
+- xml_path: assets/xml/objects/object_oE5.xml
+- xml_path: assets/xml/objects/object_oE6.xml
+- xml_path: assets/xml/objects/object_oE7.xml
+- xml_path: assets/xml/objects/object_oE8.xml
+- xml_path: assets/xml/objects/object_oE9.xml
+- xml_path: assets/xml/objects/object_oE10.xml
+- xml_path: assets/xml/objects/object_oE11.xml
+- xml_path: assets/xml/objects/object_oE12.xml
+- xml_path: assets/xml/objects/object_oE_anime.xml
+- xml_path: assets/xml/objects/object_oF1d_map.xml
+- xml_path: assets/xml/objects/object_oF1s.xml
+- xml_path: assets/xml/objects/object_okuta.xml
+- xml_path: assets/xml/objects/object_opening_demo1.xml
+- xml_path: assets/xml/objects/object_os.xml
+- xml_path: assets/xml/objects/object_os_anime.xml
+- xml_path: assets/xml/objects/object_ossan.xml
+- xml_path: assets/xml/objects/object_ouke_haka.xml
+- xml_path: assets/xml/objects/object_owl.xml
+- xml_path: assets/xml/objects/object_peehat.xml
+- xml_path: assets/xml/objects/object_po_composer.xml
+- xml_path: assets/xml/objects/object_po_field.xml
+- xml_path: assets/xml/objects/object_po_sisters.xml
+- xml_path: assets/xml/objects/object_poh.xml
+- xml_path: assets/xml/objects/object_ps.xml
+- xml_path: assets/xml/objects/object_pu_box.xml
+- xml_path: assets/xml/objects/object_rd.xml
+- xml_path: assets/xml/objects/object_reeba.xml
+- xml_path: assets/xml/objects/object_relay_objects.xml
+- xml_path: assets/xml/objects/object_rl.xml
+- xml_path: assets/xml/objects/object_rr.xml
+- xml_path: assets/xml/objects/object_rs.xml
+- xml_path: assets/xml/objects/object_ru1.xml
+- xml_path: assets/xml/objects/object_ru2.xml
+- xml_path: assets/xml/objects/object_sa.xml
+- xml_path: assets/xml/objects/object_sb.xml
+- xml_path: assets/xml/objects/object_sd.xml
+- xml_path: assets/xml/objects/object_shop_dungen.xml
+- xml_path: assets/xml/objects/object_shopnuts.xml
+- xml_path: assets/xml/objects/object_siofuki.xml
+- xml_path: assets/xml/objects/object_sk2.xml
+- xml_path: assets/xml/objects/object_skb.xml
+- xml_path: assets/xml/objects/object_skj.xml
+- xml_path: assets/xml/objects/object_spot00_break.xml
+- xml_path: assets/xml/objects/object_spot00_objects.xml
+- xml_path: assets/xml/objects/object_spot01_matoya.xml
+- xml_path: assets/xml/objects/object_spot01_matoyab.xml
+- xml_path: assets/xml/objects/object_spot01_objects.xml
+- xml_path: assets/xml/objects/object_spot01_objects2.xml
+- xml_path: assets/xml/objects/object_spot02_objects.xml
+- xml_path: assets/xml/objects/object_spot03_object.xml
+- xml_path: assets/xml/objects/object_spot04_objects.xml
+- xml_path: assets/xml/objects/object_spot05_objects.xml
+- xml_path: assets/xml/objects/object_spot06_objects.xml
+- xml_path: assets/xml/objects/object_spot07_object.xml
+- xml_path: assets/xml/objects/object_spot08_obj.xml
+- xml_path: assets/xml/objects/object_spot09_obj.xml
+- xml_path: assets/xml/objects/object_spot11_obj.xml
+- xml_path: assets/xml/objects/object_spot12_obj.xml
+- xml_path: assets/xml/objects/object_spot15_obj.xml
+- xml_path: assets/xml/objects/object_spot16_obj.xml
+- xml_path: assets/xml/objects/object_spot17_obj.xml
+- xml_path: assets/xml/objects/object_spot18_obj.xml
+- xml_path: assets/xml/objects/object_ssh.xml
+- xml_path: assets/xml/objects/object_sst.xml
+- xml_path: assets/xml/objects/object_st.xml
+- xml_path: assets/xml/objects/object_stream.xml
+- xml_path: assets/xml/objects/object_syokudai.xml
+- xml_path: assets/xml/objects/object_ta.xml
+- xml_path: assets/xml/objects/object_timeblock.xml
+- xml_path: assets/xml/objects/object_tite.xml
+- xml_path: assets/xml/objects/object_tk.xml
+- xml_path: assets/xml/objects/object_toki_objects.xml
+- xml_path: assets/xml/objects/object_torch2.xml
+- xml_path: assets/xml/objects/object_toryo.xml
+- xml_path: assets/xml/objects/object_tp.xml
+- xml_path: assets/xml/objects/object_tr.xml
+- xml_path: assets/xml/objects/object_trap.xml
+- xml_path: assets/xml/objects/object_triforce_spot.xml
+- xml_path: assets/xml/objects/object_ts.xml
+- xml_path: assets/xml/objects/object_tsubo.xml
+- xml_path: assets/xml/objects/object_tw.xml
+- xml_path: assets/xml/objects/object_umajump.xml
+- xml_path: assets/xml/objects/object_vali.xml
+- xml_path: assets/xml/objects/object_vase.xml
+- xml_path: assets/xml/objects/object_vm.xml
+- xml_path: assets/xml/objects/object_wallmaster.xml
+- xml_path: assets/xml/objects/object_warp1.xml
+- xml_path: assets/xml/objects/object_warp2.xml
+- xml_path: assets/xml/objects/object_wf.xml
+- xml_path: assets/xml/objects/object_wood02.xml
+- xml_path: assets/xml/objects/object_xc.xml
+- xml_path: assets/xml/objects/object_yabusame_point.xml
+- xml_path: assets/xml/objects/object_ydan_objects.xml
+- xml_path: assets/xml/objects/object_yukabyun.xml
+- xml_path: assets/xml/objects/object_zf.xml
+- xml_path: assets/xml/objects/object_zg.xml
+- xml_path: assets/xml/objects/object_zl1.xml
+- xml_path: assets/xml/objects/object_zl2.xml
+- xml_path: assets/xml/objects/object_zl2_anime1.xml
+- xml_path: assets/xml/objects/object_zl2_anime2.xml
+- xml_path: assets/xml/objects/object_zl4.xml
+- xml_path: assets/xml/objects/object_zo.xml
+- xml_path: assets/xml/overlays/ovl_Arrow_Fire.xml
+ start_offset: 0x9D0
+ end_offset: 0x1DF0
+- xml_path: assets/xml/overlays/ovl_Arrow_Ice.xml
+ start_offset: 0x9F0
+ end_offset: 0x1E10
+- xml_path: assets/xml/overlays/ovl_Arrow_Light.xml
+ start_offset: 0xA00
+ end_offset: 0x1E20
+- xml_path: assets/xml/overlays/ovl_Bg_Ganon_Otyuka.xml
+ start_offset: 0x11C0
+ end_offset: 0x259C
+- xml_path: assets/xml/overlays/ovl_Bg_Jya_Cobra.xml
+ start_offset: 0x1980
+ end_offset: 0x19F8
+- xml_path: assets/xml/overlays/ovl_Boss_Dodongo.xml
+ start_offset: 0x6238
+ end_offset: 0x9238
+- xml_path: assets/xml/overlays/ovl_Boss_Ganon.xml
+ start_offset: 0xE6B8
+ end_offset: 0x211D8
+- xml_path: assets/xml/overlays/ovl_Boss_Ganon2.xml
+ start_offset: 0xA2C8
+ end_offset: 0x10778
+- xml_path: assets/xml/overlays/ovl_Boss_Sst.xml
+ start_offset: 0xA3C0
+ end_offset: 0xAD70
+- xml_path: assets/xml/overlays/ovl_Demo_Shd.xml
+ start_offset: 0x450
+ end_offset: 0x23D0
+- xml_path: assets/xml/overlays/ovl_Effect_Ss_Fhg_Flash.xml
+ start_offset: 0xA60
+ end_offset: 0xF18
+- xml_path: assets/xml/overlays/ovl_Elf_Msg.xml
+ start_offset: 0x758
+ end_offset: 0x9D8
+- xml_path: assets/xml/overlays/ovl_Elf_Msg2.xml
+ start_offset: 0x538
+ end_offset: 0x638
+- xml_path: assets/xml/overlays/ovl_En_Bili.xml
+ start_offset: 0x1E50
+ end_offset: 0x1E70
+- xml_path: assets/xml/overlays/ovl_En_Clear_Tag.xml
+ start_offset: 0x26F0
+ end_offset: 0x89F0
+- xml_path: assets/xml/overlays/ovl_En_Ganon_Mant.xml
+ start_offset: 0x1218
+ end_offset: 0x4118
+- xml_path: assets/xml/overlays/ovl_En_Ganon_Organ.xml
+ start_offset: 0x3E8
+ end_offset: 0x6F70
+- xml_path: assets/xml/overlays/ovl_En_Holl.xml
+ start_offset: 0xE78
+ end_offset: 0xEE0
+- xml_path: assets/xml/overlays/ovl_En_Jsjutan.xml
+ start_offset: 0x12F8
+ end_offset: 0x4C90
+- xml_path: assets/xml/overlays/ovl_En_Kanban.xml
+ start_offset: 0x2F80
+ end_offset: 0x3040
+- xml_path: assets/xml/overlays/ovl_En_Sda.xml
+ start_offset: 0x1578
+ end_offset: 0x1608
+- xml_path: assets/xml/overlays/ovl_En_Ssh.xml
+ start_offset: 0x2150
+ end_offset: 0x21E0
+- xml_path: assets/xml/overlays/ovl_En_St.xml
+ start_offset: 0x26B0
+ end_offset: 0x2740
+- xml_path: assets/xml/overlays/ovl_En_Sth.xml
+ start_offset: 0xEF0
+ end_offset: 0x3EC4
+- xml_path: assets/xml/overlays/ovl_End_Title.xml
+ start_offset: 0x780
+ end_offset: 0x4128
+- xml_path: assets/xml/overlays/ovl_file_choose.xml
+ start_offset: 0xDE70
+ end_offset: 0xE6B0
+- xml_path: assets/xml/overlays/ovl_Magic_Dark.xml
+ start_offset: 0xD10
+ end_offset: 0x1740
+- xml_path: assets/xml/overlays/ovl_Magic_Fire.xml
+ start_offset: 0xB90
+ end_offset: 0x21E0
+- xml_path: assets/xml/overlays/ovl_Magic_Wind.xml
+ start_offset: 0x780
+ end_offset: 0x1C98
+- xml_path: assets/xml/overlays/ovl_Oceff_Spot.xml
+ start_offset: 0x7F0
+ end_offset: 0xEC8
+- xml_path: assets/xml/overlays/ovl_Oceff_Storm.xml
+ start_offset: 0x7B0
+ end_offset: 0x1B40
+- xml_path: assets/xml/overlays/ovl_Oceff_Wipe.xml
+ start_offset: 0x550
+ end_offset: 0xD10
+- xml_path: assets/xml/overlays/ovl_Oceff_Wipe2.xml
+ start_offset: 0x480
+ end_offset: 0x16E8
+- xml_path: assets/xml/overlays/ovl_Oceff_Wipe3.xml
+ start_offset: 0x480
+ end_offset: 0x16C8
+- xml_path: assets/xml/overlays/ovl_Oceff_Wipe4.xml
+ start_offset: 0x460
+ end_offset: 0xF48
+- xml_path: assets/xml/scenes/dungeons/bdan.xml
+- xml_path: assets/xml/scenes/dungeons/bdan_boss.xml
+- xml_path: assets/xml/scenes/dungeons/Bmori1.xml
+- xml_path: assets/xml/scenes/dungeons/ddan.xml
+- xml_path: assets/xml/scenes/dungeons/ddan_boss.xml
+- xml_path: assets/xml/scenes/dungeons/FIRE_bs.xml
+- xml_path: assets/xml/scenes/dungeons/ganon.xml
+- xml_path: assets/xml/scenes/dungeons/ganon_boss.xml
+- xml_path: assets/xml/scenes/dungeons/ganon_demo.xml
+- xml_path: assets/xml/scenes/dungeons/ganon_final.xml
+- xml_path: assets/xml/scenes/dungeons/ganon_sonogo.xml
+- xml_path: assets/xml/scenes/dungeons/ganontika.xml
+- xml_path: assets/xml/scenes/dungeons/ganontikasonogo.xml
+- xml_path: assets/xml/scenes/dungeons/gerudoway.xml
+- xml_path: assets/xml/scenes/dungeons/HAKAdan.xml
+- xml_path: assets/xml/scenes/dungeons/HAKAdan_bs.xml
+- xml_path: assets/xml/scenes/dungeons/HAKAdanCH.xml
+- xml_path: assets/xml/scenes/dungeons/HIDAN.xml
+- xml_path: assets/xml/scenes/dungeons/ice_doukutu.xml
+- xml_path: assets/xml/scenes/dungeons/jyasinboss.xml
+- xml_path: assets/xml/scenes/dungeons/jyasinzou.xml
+- xml_path: assets/xml/scenes/dungeons/men.xml
+- xml_path: assets/xml/scenes/dungeons/MIZUsin.xml
+- xml_path: assets/xml/scenes/dungeons/MIZUsin_bs.xml
+- xml_path: assets/xml/scenes/dungeons/moribossroom.xml
+- xml_path: assets/xml/scenes/dungeons/ydan.xml
+- xml_path: assets/xml/scenes/dungeons/ydan_boss.xml
+- xml_path: assets/xml/scenes/indoors/bowling.xml
+- xml_path: assets/xml/scenes/indoors/daiyousei_izumi.xml
+- xml_path: assets/xml/scenes/indoors/hairal_niwa.xml
+- xml_path: assets/xml/scenes/indoors/hairal_niwa2.xml
+- xml_path: assets/xml/scenes/indoors/hairal_niwa_n.xml
+- xml_path: assets/xml/scenes/indoors/hakasitarelay.xml
+- xml_path: assets/xml/scenes/indoors/hut.xml
+- xml_path: assets/xml/scenes/indoors/hylia_labo.xml
+- xml_path: assets/xml/scenes/indoors/impa.xml
+- xml_path: assets/xml/scenes/indoors/kakariko.xml
+- xml_path: assets/xml/scenes/indoors/kenjyanoma.xml
+- xml_path: assets/xml/scenes/indoors/kokiri_home.xml
+- xml_path: assets/xml/scenes/indoors/kokiri_home3.xml
+- xml_path: assets/xml/scenes/indoors/kokiri_home4.xml
+- xml_path: assets/xml/scenes/indoors/kokiri_home5.xml
+- xml_path: assets/xml/scenes/indoors/labo.xml
+- xml_path: assets/xml/scenes/indoors/link_home.xml
+- xml_path: assets/xml/scenes/indoors/mahouya.xml
+- xml_path: assets/xml/scenes/indoors/malon_stable.xml
+- xml_path: assets/xml/scenes/indoors/miharigoya.xml
+- xml_path: assets/xml/scenes/indoors/nakaniwa.xml
+- xml_path: assets/xml/scenes/indoors/souko.xml
+- xml_path: assets/xml/scenes/indoors/syatekijyou.xml
+- xml_path: assets/xml/scenes/indoors/takaraya.xml
+- xml_path: assets/xml/scenes/indoors/tent.xml
+- xml_path: assets/xml/scenes/indoors/tokinoma.xml
+- xml_path: assets/xml/scenes/indoors/yousei_izumi_tate.xml
+- xml_path: assets/xml/scenes/indoors/yousei_izumi_yoko.xml
+- xml_path: assets/xml/scenes/misc/enrui.xml
+- xml_path: assets/xml/scenes/misc/entra.xml
+- xml_path: assets/xml/scenes/misc/entra_n.xml
+- xml_path: assets/xml/scenes/misc/hakaana.xml
+- xml_path: assets/xml/scenes/misc/hakaana2.xml
+- xml_path: assets/xml/scenes/misc/hakaana_ouke.xml
+- xml_path: assets/xml/scenes/misc/hiral_demo.xml
+- xml_path: assets/xml/scenes/misc/kakariko3.xml
+- xml_path: assets/xml/scenes/misc/kakusiana.xml
+- xml_path: assets/xml/scenes/misc/kinsuta.xml
+- xml_path: assets/xml/scenes/misc/market_alley.xml
+- xml_path: assets/xml/scenes/misc/market_alley_n.xml
+- xml_path: assets/xml/scenes/misc/market_day.xml
+- xml_path: assets/xml/scenes/misc/market_night.xml
+- xml_path: assets/xml/scenes/misc/market_ruins.xml
+- xml_path: assets/xml/scenes/misc/shrine.xml
+- xml_path: assets/xml/scenes/misc/shrine_n.xml
+- xml_path: assets/xml/scenes/misc/shrine_r.xml
+- xml_path: assets/xml/scenes/misc/turibori.xml
+- xml_path: assets/xml/scenes/overworld/ganon_tou.xml
+- xml_path: assets/xml/scenes/overworld/spot00.xml
+- xml_path: assets/xml/scenes/overworld/spot01.xml
+- xml_path: assets/xml/scenes/overworld/spot02.xml
+- xml_path: assets/xml/scenes/overworld/spot03.xml
+- xml_path: assets/xml/scenes/overworld/spot04.xml
+- xml_path: assets/xml/scenes/overworld/spot05.xml
+- xml_path: assets/xml/scenes/overworld/spot06.xml
+- xml_path: assets/xml/scenes/overworld/spot07.xml
+- xml_path: assets/xml/scenes/overworld/spot08.xml
+- xml_path: assets/xml/scenes/overworld/spot09.xml
+- xml_path: assets/xml/scenes/overworld/spot10.xml
+- xml_path: assets/xml/scenes/overworld/spot11.xml
+- xml_path: assets/xml/scenes/overworld/spot12.xml
+- xml_path: assets/xml/scenes/overworld/spot13.xml
+- xml_path: assets/xml/scenes/overworld/spot15.xml
+- xml_path: assets/xml/scenes/overworld/spot16.xml
+- xml_path: assets/xml/scenes/overworld/spot17.xml
+- xml_path: assets/xml/scenes/overworld/spot18.xml
+- xml_path: assets/xml/scenes/overworld/spot20.xml
+- xml_path: assets/xml/scenes/shops/alley_shop.xml
+- xml_path: assets/xml/scenes/shops/drag.xml
+- xml_path: assets/xml/scenes/shops/face_shop.xml
+- xml_path: assets/xml/scenes/shops/golon.xml
+- xml_path: assets/xml/scenes/shops/kokiri_shop.xml
+- xml_path: assets/xml/scenes/shops/night_shop.xml
+- xml_path: assets/xml/scenes/shops/shop1.xml
+- xml_path: assets/xml/scenes/shops/zoora.xml
+- xml_path: assets/xml/scenes/test_levels/besitu.xml
+- xml_path: assets/xml/scenes/test_levels/depth_test.xml
+- xml_path: assets/xml/scenes/test_levels/sasatest.xml
+- xml_path: assets/xml/scenes/test_levels/sutaru.xml
+- xml_path: assets/xml/scenes/test_levels/syotes.xml
+- xml_path: assets/xml/scenes/test_levels/syotes2.xml
+- xml_path: assets/xml/scenes/test_levels/test01.xml
+- xml_path: assets/xml/scenes/test_levels/testroom.xml
+- xml_path: assets/xml/textures/backgrounds.xml
+- xml_path: assets/xml/textures/do_action_static.xml
+- xml_path: assets/xml/textures/icon_item_24_static.xml
+- xml_path: assets/xml/textures/icon_item_dungeon_static.xml
+- xml_path: assets/xml/textures/icon_item_field_static.xml
+- xml_path: assets/xml/textures/icon_item_fra_static.xml
+- xml_path: assets/xml/textures/icon_item_gameover_static.xml
+- xml_path: assets/xml/textures/icon_item_ger_static.xml
+- xml_path: assets/xml/textures/icon_item_nes_static.xml
+- xml_path: assets/xml/textures/icon_item_static.xml
+- xml_path: assets/xml/textures/item_name_static.xml
+- xml_path: assets/xml/textures/map_48x85_static.xml
+- xml_path: assets/xml/textures/map_grand_static.xml
+- xml_path: assets/xml/textures/map_i_static.xml
+- xml_path: assets/xml/textures/map_name_static.xml
+- xml_path: assets/xml/textures/message_static.xml
+- xml_path: assets/xml/textures/message_texture_static.xml
+- xml_path: assets/xml/textures/nes_font_static.xml
+- xml_path: assets/xml/textures/nintendo_rogo_static.xml
+- xml_path: assets/xml/textures/parameter_static.xml
+- xml_path: assets/xml/textures/place_title_cards.xml
+- xml_path: assets/xml/textures/skyboxes.xml
+- xml_path: assets/xml/textures/title_static.xml
diff --git a/extract_assets.py b/extract_assets.py
index dc5ba9df3b..8c92bc9118 100755
--- a/extract_assets.py
+++ b/extract_assets.py
@@ -8,6 +8,8 @@ import time
import multiprocessing
from pathlib import Path
+from tools import version_config
+
EXTRACTED_ASSETS_FILENAME = ".extracted-assets.json"
@@ -17,7 +19,9 @@ def SignalHandler(sig, frame):
mainAbort.set()
# Don't exit immediately to update the extracted assets file.
-def ExtractFile(xmlPath, outputPath, outputSourcePath):
+def ExtractFile(assetConfig, outputPath, outputSourcePath):
+ xmlPath = assetConfig.xml_path
+ version = globalVersionConfig.version
if globalAbort.is_set():
# Don't extract if another file wasn't extracted properly.
return
@@ -31,7 +35,22 @@ def ExtractFile(xmlPath, outputPath, outputSourcePath):
# TODO: Extract assets from the correct version instead of the Debug ROM
execStr = f"{zapdPath} e -eh -i {xmlPath} -b extracted/gc-eu-mq-dbg/baserom -o {outputPath} -osf {outputSourcePath} -gsf 1 -rconf {configPath} --cs-float both {ZAPDArgs}"
- if "overlays" in xmlPath:
+ if "/code/" in xmlPath:
+ assert assetConfig.start_offset is not None
+ assert assetConfig.end_offset is not None
+
+ execStr += f" --start-offset 0x{assetConfig.start_offset:X}"
+ execStr += f" --end-offset 0x{assetConfig.end_offset:X}"
+ elif "/overlays/" in xmlPath:
+ assert assetConfig.start_offset is not None
+ assert assetConfig.end_offset is not None
+
+ overlayName = os.path.splitext(os.path.basename(xmlPath))[0]
+ baseAddress = globalVersionConfig.dmadata_segments[overlayName].vram + assetConfig.start_offset
+
+ execStr += f" --base-address 0x{baseAddress:X}"
+ execStr += f" --start-offset 0x{assetConfig.start_offset:X}"
+ execStr += f" --end-offset 0x{assetConfig.end_offset:X}"
execStr += " --static"
if globalUnaccounted:
@@ -46,11 +65,13 @@ def ExtractFile(xmlPath, outputPath, outputSourcePath):
print("Aborting...", file=os.sys.stderr)
print("\n")
-def ExtractFunc(fullPath):
+def ExtractFunc(assetConfig):
+ fullPath = assetConfig.xml_path
*pathList, xmlName = fullPath.split(os.sep)
objectName = os.path.splitext(xmlName)[0]
- outPath = os.path.join("extracted", globalVersion, "assets", *pathList[2:], objectName)
+ version = globalVersionConfig.version
+ outPath = os.path.join("extracted", version, "assets", *pathList[2:], objectName)
outSourcePath = outPath
if fullPath in globalExtractedAssetsTracker:
@@ -62,7 +83,7 @@ def ExtractFunc(fullPath):
currentTimeStamp = int(time.time())
- ExtractFile(fullPath, outPath, outSourcePath)
+ ExtractFile(assetConfig, outPath, outSourcePath)
if not globalAbort.is_set():
# Only update timestamp on succesful extractions
@@ -70,13 +91,13 @@ def ExtractFunc(fullPath):
globalExtractedAssetsTracker[fullPath] = globalManager.dict()
globalExtractedAssetsTracker[fullPath]["timestamp"] = currentTimeStamp
-def initializeWorker(version, abort, unaccounted: bool, extractedAssetsTracker: dict, manager):
- global globalVersion
+def initializeWorker(versionConfig, abort, unaccounted: bool, extractedAssetsTracker: dict, manager):
+ global globalVersionConfig
global globalAbort
global globalUnaccounted
global globalExtractedAssetsTracker
global globalManager
- globalVersion = version
+ globalVersionConfig = versionConfig
globalAbort = abort
globalUnaccounted = unaccounted
globalExtractedAssetsTracker = extractedAssetsTracker
@@ -106,6 +127,9 @@ def main():
parser.add_argument("-Z", help="Pass the argument on to ZAPD, e.g. `-ZWunaccounted` to warn about unaccounted blocks in XMLs. Each argument should be passed separately, *without* the leading dash.", metavar="ZAPD_ARG", action="append")
args = parser.parse_args()
+ version = args.oot_version
+ versionConfig = version_config.load_version_config(args.oot_version)
+
global ZAPDArgs
ZAPDArgs = processZAPDArgs(args.Z) if args.Z else ""
@@ -114,7 +138,6 @@ def main():
manager = multiprocessing.Manager()
signal.signal(signal.SIGINT, SignalHandler)
- version = args.oot_version
extracted_assets_filename = os.path.join("extracted", version, EXTRACTED_ASSETS_FILENAME)
extractedAssetsTracker = manager.dict()
if os.path.exists(extracted_assets_filename) and not args.force:
@@ -128,19 +151,21 @@ def main():
print(f"Error. File {fullPath} does not exist.", file=os.sys.stderr)
exit(1)
- initializeWorker(version, mainAbort, args.unaccounted, extractedAssetsTracker, manager)
+ assetConfig = None
+ for asset in versionConfig.assets:
+ if asset.xml_path == fullPath:
+ assetConfig = asset
+ break
+ else:
+ print(f"Error. Asset {fullPath} not found in config.", file=os.sys.stderr)
+ exit(1)
+
+ initializeWorker(versionConfig, mainAbort, args.unaccounted, extractedAssetsTracker, manager)
# Always extract if -s is used.
if fullPath in extractedAssetsTracker:
del extractedAssetsTracker[fullPath]
- ExtractFunc(fullPath)
+ ExtractFunc(assetConfig)
else:
- xmlFiles = []
- for currentPath, _, files in os.walk(os.path.join("assets", "xml")):
- for file in files:
- fullPath = os.path.join(currentPath, file)
- if file.endswith(".xml"):
- xmlFiles.append(fullPath)
-
class CannotMultiprocessError(Exception):
pass
@@ -153,15 +178,15 @@ def main():
mp_context = multiprocessing.get_context("fork")
except ValueError as e:
raise CannotMultiprocessError() from e
- with mp_context.Pool(numCores, initializer=initializeWorker, initargs=(version, mainAbort, args.unaccounted, extractedAssetsTracker, manager)) as p:
- p.map(ExtractFunc, xmlFiles)
+ with mp_context.Pool(numCores, initializer=initializeWorker, initargs=(versionConfig, mainAbort, args.unaccounted, extractedAssetsTracker, manager)) as p:
+ p.map(ExtractFunc, versionConfig.assets)
except (multiprocessing.ProcessError, TypeError, CannotMultiprocessError):
print("Warning: Multiprocessing exception ocurred.", file=os.sys.stderr)
print("Disabling mutliprocessing.", file=os.sys.stderr)
- initializeWorker(version, mainAbort, args.unaccounted, extractedAssetsTracker, manager)
- for singlePath in xmlFiles:
- ExtractFunc(singlePath)
+ initializeWorker(versionConfig, mainAbort, args.unaccounted, extractedAssetsTracker, manager)
+ for assetConfig in versionConfig.assets:
+ ExtractFunc(assetConfig)
with open(extracted_assets_filename, 'w', encoding='utf-8') as f:
serializableDict = dict()
diff --git a/src/overlays/gamestates/ovl_file_choose/z_file_nameset_PAL.c b/src/overlays/gamestates/ovl_file_choose/z_file_nameset_PAL.c
index ccc64727df..186878b0e8 100644
--- a/src/overlays/gamestates/ovl_file_choose/z_file_nameset_PAL.c
+++ b/src/overlays/gamestates/ovl_file_choose/z_file_nameset_PAL.c
@@ -1,7 +1,7 @@
#include "file_select.h"
#include "terminal.h"
#include "assets/textures/title_static/title_static.h"
-#include "assets/overlays/ovl_File_Choose/ovl_file_choose.h"
+#include "assets/overlays/ovl_file_choose/ovl_file_choose.h"
static s16 D_808124C0[] = {
0x0002, 0x0003, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0001, 0x0002, 0x0000, 0x0001,
diff --git a/src/overlays/gamestates/ovl_file_choose/z_file_nameset_data.c b/src/overlays/gamestates/ovl_file_choose/z_file_nameset_data.c
index 2fa7cd78f3..d6bc09c282 100644
--- a/src/overlays/gamestates/ovl_file_choose/z_file_nameset_data.c
+++ b/src/overlays/gamestates/ovl_file_choose/z_file_nameset_data.c
@@ -1,6 +1,6 @@
#include "file_select.h"
-#include "assets/overlays/ovl_File_Choose/ovl_file_choose.c"
+#include "assets/overlays/ovl_file_choose/ovl_file_choose.c"
s16 D_808123F0[] = {
0x000A, 0x000B, 0x000C, 0x000D, 0x000E, 0x000F, 0x0010, 0x0011, 0x0012, 0x0013, 0x0014, 0x0015, 0x0016,
diff --git a/tools/version_config.py b/tools/version_config.py
index f41bdfc515..c7f0e6053d 100644
--- a/tools/version_config.py
+++ b/tools/version_config.py
@@ -18,12 +18,16 @@ PROJECT_ROOT = Path(__file__).parent.parent
@dataclasses.dataclass
class VersionConfig:
+ # Version name
+ version: str
# ROM offset to start of DMA table
dmadata_start: int
# DMA segment information, in ROM order
dmadata_segments: OrderedDict[str, SegmentInfo]
# Addresses of important variables needed for asset extraction
variables: Dict[str, int]
+ # Assets to extract
+ assets: list[AssetConfig]
@dataclasses.dataclass
@@ -32,6 +36,13 @@ class SegmentInfo:
vram: int | None
+@dataclasses.dataclass
+class AssetConfig:
+ xml_path: Path
+ start_offset: int | None
+ end_offset: int | None
+
+
def load_dmadata_segments(version: str) -> OrderedDict[str, SegmentInfo]:
segments = OrderedDict()
with open(PROJECT_ROOT / f"baseroms/{version}/segments.csv", "r") as f:
@@ -46,8 +57,18 @@ def load_dmadata_segments(version: str) -> OrderedDict[str, SegmentInfo]:
def load_version_config(version: str) -> VersionConfig:
with open(PROJECT_ROOT / f"baseroms/{version}/config.yml", "r") as f:
config = yaml.load(f, Loader=yaml.Loader)
+
+ assets = []
+ for asset in config["assets"]:
+ xml_path = asset["xml_path"]
+ start_offset = asset.get("start_offset", None)
+ end_offset = asset.get("end_offset", None)
+ assets.append(AssetConfig(xml_path, start_offset, end_offset))
+
return VersionConfig(
+ version=version,
dmadata_start=config["dmadata_start"],
dmadata_segments=load_dmadata_segments(version),
variables=config["variables"],
+ assets=assets,
)