diff --git a/Lua/inject/actor object table oot.asm b/Lua/inject/actor object table oot.asm new file mode 100644 index 0000000..62ff9c5 --- /dev/null +++ b/Lua/inject/actor object table oot.asm @@ -0,0 +1,474 @@ +HEX { +00 00 // Player +00 00 // unset +00 32 // En_Test +00 00 // unset +00 01 // En_GirlA +00 00 // unset +00 00 // unset +00 01 // En_Part +00 01 // En_Light +00 01 // En_Door +00 0E // En_Box +00 0A // Bg_Dy_Yoseizo +00 2C // Bg_Hidan_Firewall +00 01 // En_Poh +00 07 // En_Okuta +00 36 // Bg_Ydan_Sp +00 01 // En_Bom +00 0B // En_Wallmas +00 0C // En_Dodongo +00 0D // En_Firefly +00 1A // En_Horse +00 00 // En_Item00 +00 01 // En_Arrow +00 00 // unset +00 01 // En_Elf +00 13 // En_Niw +00 00 // unset +00 16 // En_Tite +00 17 // En_Reeba +00 18 // En_Peehat +00 02 // En_Butte +00 00 // unset +00 01 // En_Insect +00 01 // En_Fish +00 00 // unset +00 01 // En_Holl +00 40 // En_Scene_Change +00 1B // En_Zf +00 76 // En_Hata +00 19 // Boss_Dodongo +00 1C // Boss_Goma +00 1D // En_Zl1 +00 01 // En_Viewer +00 1E // En_Goma +00 03 // Bg_Pushbox +00 12 // En_Bubble +00 01 // Door_Shutter +00 1F // En_Dodojr +00 19 // En_Bdfire +00 00 // unset +00 01 // En_Boom +00 20 // En_Torch2 +00 21 // En_Bili +00 22 // En_Tp +00 00 // unset +00 24 // En_St +00 25 // En_Bw +00 00 // En_A_Obj +00 26 // En_Eiyer +00 01 // En_River_Sound +00 27 // En_Horse_Normal +00 01 // En_Ossan +00 2A // Bg_Treemouth +00 2B // Bg_Dodoago +00 2C // Bg_Hidan_Dalm +00 2C // Bg_Hidan_Hrock +00 2D // En_Horse_Ganon +00 2C // Bg_Hidan_Rock +00 2C // Bg_Hidan_Rsekizou +00 2C // Bg_Hidan_Sekizou +00 2C // Bg_Hidan_Sima +00 2C // Bg_Hidan_Syoku +00 8A // En_Xc +00 01 // Bg_Hidan_Curtain +00 2F // Bg_Spot00_Hanebasi +00 30 // En_Mb +00 31 // En_Bombf +00 60 // En_Zl2 +00 2C // Bg_Hidan_Fslift +00 35 // En_OE2 +00 36 // Bg_Ydan_Hasi +00 36 // Bg_Ydan_Maruta +00 37 // Boss_Ganondrof +00 00 // unset +00 38 // En_Am +00 39 // En_Dekubaba +00 01 // En_M_Fire1 +00 01 // En_M_Thunder +00 2B // Bg_Ddan_Jd +00 01 // Bg_Breakwall +00 40 // En_Jj +00 46 // En_Horse_Zelda +00 2B // Bg_Ddan_Kd +00 48 // Door_Warp1 +00 A4 // Obj_Syokudai +00 BD // Item_B_Heart +00 4A // En_Dekunuts +00 4D // Bg_Menkuri_Kaiten +00 4D // Bg_Menkuri_Eye +00 56 // En_Vali +00 59 // Bg_Mizu_Movebg +00 59 // Bg_Mizu_Water +00 14 // Arms_Hook +00 5A // En_fHG +00 01 // Bg_Mori_Hineri +00 5D // En_Bb +00 5E // Bg_Toki_Hikari +00 5F // En_Yukabyun +00 5E // Bg_Toki_Swd +00 5A // En_Fhg_Fire +00 01 // Bg_Mjin +00 2C // Bg_Hidan_Kousi +00 5E // Door_Toki +00 2C // Bg_Hidan_Hamstep +00 77 // En_Bird +00 00 // unset +00 00 // unset +00 00 // unset +00 00 // unset +00 7C // En_Wood02 +00 00 // unset +00 00 // unset +00 00 // unset +00 00 // unset +00 81 // En_Lightbox +00 82 // En_Pu_box +00 00 // unset +00 00 // unset +00 85 // En_Trap +00 01 // En_Arow_Trap +00 86 // En_Vase +00 00 // unset +00 88 // En_Ta +00 89 // En_Tk +00 72 // Bg_Mori_Bigst +00 72 // Bg_Mori_Elevator +00 72 // Bg_Mori_Kaitenkabe +00 72 // Bg_Mori_Rakkatenjo +00 8B // En_Vm +00 01 // Demo_Effect +00 01 // Demo_Kankyo +00 2C // Bg_Hidan_Fwbig +00 0B // En_Floormas +00 97 // En_Heishi1 +00 98 // En_Rd +00 99 // En_Po_Sisters +00 9A // Bg_Heavy_Block +00 99 // Bg_Po_Event +00 01 // Obj_Mure +00 24 // En_Sw +00 9C // Boss_Fd +00 01 // Object_Kankyo +00 9D // En_Du +00 9E // En_Fd +00 A0 // En_Horse_Link_Child +00 02 // Door_Ana +00 A1 // Bg_Spot02_Objects +00 A2 // Bg_Haka +00 01 // Magic_Wind +00 01 // Magic_Fire +00 00 // unset +00 A3 // En_Ru1 +00 A5 // Boss_Fd2 +00 03 // En_Fd_Fire +00 A6 // En_Dh +00 A6 // En_Dha +00 A7 // En_Rl +00 01 // En_Encount1 +00 9D // Demo_Du +00 87 // Demo_Im +00 0E // Demo_Tre_Lgt +00 9E // En_Fw +00 9C // Bg_Vb_Sima +00 9C // En_Vb_Ball +00 01 // Bg_Haka_Megane +00 69 // Bg_Haka_MeganeBG +00 69 // Bg_Haka_Ship +00 01 // Bg_Haka_Sgami +00 00 // unset +00 97 // En_Heishi2 +00 92 // En_Encount2 +00 92 // En_Fire_Rock +00 AC // En_Brob +00 AB // Mir_Ray +00 AE // Bg_Spot09_Obj +00 AF // Bg_Spot18_Obj +00 8C // Boss_Va +00 69 // Bg_Haka_Tubo +00 69 // Bg_Haka_Trap +00 8D // Bg_Haka_Huta +00 01 // Bg_Haka_Zou +00 B1 // Bg_Spot17_Funen +00 01 // En_Syateki_Itm +00 5B // En_Syateki_Man +00 B2 // En_Tana +00 B3 // En_Nb +00 B4 // Boss_Mo +00 B5 // En_Sb +01 5F // En_Bigokuta +00 39 // En_Karebaba +00 96 // Bg_Bdan_Objects +00 BC // Demo_Sa +00 C9 // Demo_Go +00 C0 // En_In +00 C1 // En_Tr +00 C2 // Bg_Spot16_Bombstone +00 00 // unset +00 2C // Bg_Hidan_Kowarerukabe +00 02 // Bg_Bombwall +00 74 // Bg_Spot08_Iceblock +00 CA // En_Ru2 +00 CC // Obj_Dekujr +00 59 // Bg_Mizu_Uzu +00 6A // Bg_Spot06_Objects +00 6B // Bg_Ice_Objects +00 8D // Bg_Haka_Water +00 00 // unset +00 D0 // En_Ma2 +00 01 // En_Bom_Chu +00 01 // En_Horse_Game_Check +00 D3 // Boss_Tw +00 D4 // En_Rr +00 D5 // En_Ba +00 D5 // En_Bx +00 D6 // En_Anubice +00 D6 // En_Anubice_Fire +00 72 // Bg_Mori_Hashigo +00 72 // Bg_Mori_Hashira4 +00 72 // Bg_Mori_Idomizu +01 7A // Bg_Spot16_Doughnut +00 96 // Bg_Bdan_Switch +00 E0 // En_Ma1 +00 E1 // Boss_Ganon +00 E2 // Boss_Sst +00 00 // unset +00 00 // unset +00 E5 // En_Ny +00 E6 // En_Fr +00 15 // Item_Shield +00 6B // Bg_Ice_Shelter +00 01 // En_Ice_Hono +00 DE // Item_Ocarina +00 00 // unset +00 00 // unset +00 01 // Magic_Dark +00 01 // Demo_6K +00 01 // En_Anubice_Tag +00 69 // Bg_Haka_Gate +00 F0 // Bg_Spot15_Saku +01 1F // Bg_Jya_Goroiwa +00 F1 // Bg_Jya_Zurerukabe +00 00 // unset +00 F1 // Bg_Jya_Cobra +00 F1 // Bg_Jya_Kanaami +01 5B // Fishing +00 03 // Obj_Oshihiki +01 81 // Bg_Gate_Shutter +00 01 // Eff_Dust +00 F9 // Bg_Spot01_Fusya +00 F9 // Bg_Spot01_Idohashira +00 F9 // Bg_Spot01_Idomizu +00 A4 // Bg_Po_Syokudai +00 E1 // Bg_Ganon_Otyuka +00 F0 // Bg_Spot15_Rrbox +01 00 // Bg_Umajump +00 00 // unset +00 01 // Arrow_Fire +00 01 // Arrow_Ice +00 01 // Arrow_Light +00 00 // unset +00 00 // unset +00 01 // Item_Etcetera +00 03 // Obj_Kibako +00 01 // Obj_Tsubo +00 01 // En_Wonder_Item +01 06 // En_Ik +01 06 // Demo_Ik +01 0A // En_Skj +01 0A // En_Skjneedle +00 01 // En_G_Switch +00 5A // Demo_Ext +00 01 // Demo_Shd +01 68 // En_Dns +00 01 // Elf_Msg +00 03 // En_Honotrap +00 03 // En_Tubo_Trap +00 01 // Obj_Ice_Poly +01 12 // Bg_Spot03_Taki +01 13 // Bg_Spot07_Taki +01 14 // En_Fz +00 89 // En_Po_Relay +00 6C // Bg_Relay_Objects +00 FE // En_Diving_Game +00 01 // En_Kusa +01 1E // Obj_Bean +01 63 // Obj_Bombiwa +00 00 // unset +00 00 // unset +00 03 // Obj_Switch +01 1B // Obj_Elevator +01 1D // Obj_Lift +01 1C // Obj_Hsblock +00 01 // En_Okarina_Tag +00 01 // En_Yabusame_Mark +01 1F // En_Goroiwa +00 01 // En_Ex_Ruppy +01 21 // En_Toryo +01 22 // En_Daiku +00 00 // unset +01 24 // En_Nwc +01 25 // En_Blkobj +00 01 // Item_Inbox +01 16 // En_Ge1 +00 01 // Obj_Blockstop +00 01 // En_Sda +00 01 // En_Clear_Tag +01 10 // En_Niw_Lady +00 C9 // En_Gm +01 27 // En_Ms +01 28 // En_Hs +01 29 // Bg_Ingate +01 2F // En_Kanban +00 97 // En_Heishi3 +00 13 // En_Syateki_Niw +00 13 // En_Attack_Niw +01 80 // Bg_Spot01_Idosoko +00 BC // En_Sa +00 01 // En_Wonder_Talk +01 30 // Bg_Gjyo_Bridge +01 0F // En_Ds +01 32 // En_Mk +01 60 // En_Bom_Bowl_Man +00 01 // En_Bom_Bowl_Pit +01 31 // En_Owl +00 02 // En_Ishi +00 02 // Obj_Hana +01 2A // Obj_Lightswitch +00 01 // Obj_Mure2 +00 C9 // En_Go +01 33 // En_Fu +00 00 // unset +00 01 // En_Changer +00 F1 // Bg_Jya_Megami +00 F1 // Bg_Jya_Lift +00 F1 // Bg_Jya_Bigmirror +00 F1 // Bg_Jya_Bombchuiwa +00 F1 // Bg_Jya_Amishutter +00 F1 // Bg_Jya_Bombiwa +00 AF // Bg_Spot18_Basket +00 00 // unset +00 E1 // En_Ganon_Organ +01 3A // En_Siofuki +01 3B // En_Stream +00 00 // unset +01 3C // En_Mm +00 01 // En_Ko +00 FF // En_Kz +00 01 // En_Weather_Tag +00 E2 // Bg_Sst_Floor +00 EC // En_Ani +00 01 // En_Ex_Item +01 6C // Bg_Jya_Ironobj +01 44 // En_Js +00 01 // En_Jsjutan +01 45 // En_Cs +00 FB // En_Md +00 01 // En_Hy +00 01 // En_Ganon_Mant +00 01 // En_Okarina_Effect +01 4A // En_Mag +01 4B // Door_Gerudo +00 01 // Elf_Msg2 +01 4C // Demo_Gt +00 6D // En_Po_Field +01 4D // Efc_Erupc +01 56 // Bg_Zg +00 97 // En_Heishi4 +00 60 // En_Zl3 +01 53 // Boss_Ganon2 +01 54 // En_Kakasi +01 55 // En_Takara_Man +00 03 // Obj_Makeoshihiki +00 01 // Oceff_Spot +00 01 // End_Title +00 00 // unset +00 01 // En_Torch +01 5A // Demo_Ec +00 01 // Shot_Sun +00 0A // En_Dy_Extra +00 01 // En_Wonder_Talk2 +01 67 // En_Ge2 +00 01 // Obj_Roomtimer +01 5E // En_Ssh +00 01 // En_Sth +00 01 // Oceff_Wipe +00 01 // Oceff_Storm +00 26 // En_Weiyer +01 61 // Bg_Spot05_Soko +00 F1 // Bg_Jya_1flift +01 6C // Bg_Jya_Haheniron +01 62 // Bg_Spot12_Gate +01 62 // Bg_Spot12_Saku +01 64 // En_Hintnuts +00 01 // En_Nutsball +01 66 // Bg_Spot00_Break +01 68 // En_Shopnuts +00 01 // En_It +01 69 // En_GeldB +00 01 // Oceff_Wipe2 +00 01 // Oceff_Wipe3 +01 6A // En_Niw_Girl +01 6B // En_Dog +00 24 // En_Si +00 01 // Bg_Spot01_Objects2 +00 02 // Obj_Comb +01 6F // Bg_Spot11_Bakudankabe +01 70 // Obj_Kibako2 +00 01 // En_Dnt_Demo +01 71 // En_Dnt_Jiji +00 01 // En_Dnt_Nomal +01 11 // En_Guest +01 78 // Bg_Bom_Guard +01 28 // En_Hs2 +01 79 // Demo_Kekkai +00 74 // Bg_Spot08_Bakudankabe +00 B1 // Bg_Spot17_Bakudankabe +00 00 // unset +00 01 // Obj_Mure3 +01 82 // En_Tg +01 82 // En_Mu +00 C9 // En_Go2 +01 83 // En_Wf +01 84 // En_Skb +01 85 // Demo_Gj +01 86 // Demo_Geff +01 79 // Bg_Gnd_Firemeiro +01 79 // Bg_Gnd_Darkmeiro +01 79 // Bg_Gnd_Soulmeiro +01 79 // Bg_Gnd_Nisekabe +01 79 // Bg_Gnd_Iceblock +01 89 // En_Gb +01 88 // En_Gs +00 59 // Bg_Mizu_Bwall +00 59 // Bg_Mizu_Shutter +01 22 // En_Daiku_Kakariko +01 78 // Bg_Bowl_Wall +00 01 // En_Wall_Tubo +00 6D // En_Po_Desert +00 08 // En_Crow +01 8E // Door_Killer +01 6F // Bg_Spot11_Oasis +00 AF // Bg_Spot18_Futa +00 AF // Bg_Spot18_Shutter +00 D0 // En_Ma3 +01 8B // En_Cow +00 6B // Bg_Ice_Turara +00 6B // Bg_Ice_Shutter +01 54 // En_Kakasi2 +01 54 // En_Kakasi3 +00 01 // Oceff_Wipe4 +00 60 // En_Eg +00 4D // Bg_Menkuri_Nisekabe +00 FE // En_Zo +00 01 // Obj_Makekinsuta +01 69 // En_Ge3 +01 90 // Obj_Timeblock +00 02 // Obj_Hamishi +01 91 // En_Zl4 +01 3C // En_Mm2 +00 03 // Bg_Jya_Block +01 90 // Obj_Warp2block +} +.align diff --git a/Lua/inject/spawn mm.asm b/Lua/inject/spawn mm.asm index 2077ce7..f1e7f6b 100644 --- a/Lua/inject/spawn mm.asm +++ b/Lua/inject/spawn mm.asm @@ -4,6 +4,7 @@ [global_context]: 0x803E6B20 [buttons_offset]: 0x14 [actor_spawn_offset]: 0x1CA0 +[object_spawn_offset]: 0x17D88 [link_actor]: 0x803FFDB0 [actor_x]: 0x24 @@ -17,3 +18,8 @@ [upgrades_2_offset]: 0xBA .include "spawn.asm" + +load_object: +// unimplemented for now, just return 0 + jr + cl v0 diff --git a/Lua/inject/spawn oot.asm b/Lua/inject/spawn oot.asm index 2178fc2..0685119 100644 --- a/Lua/inject/spawn oot.asm +++ b/Lua/inject/spawn oot.asm @@ -1,9 +1,11 @@ [actor_spawn]: 0x80025110 +[object_spawn]: 0x800812F0 [max_actor_no]: 0x1D6 [global_context]: 0x801C84A0 [buttons_offset]: 0x14 [actor_spawn_offset]: 0x1C24 +[object_spawn_offset]: 0x117A4 [link_actor]: 0x801DAA30 [actor_x]: 0x24 @@ -17,3 +19,66 @@ [upgrades_2_offset]: 0xA2 .include "spawn.asm" + +actor_object_table: +.include "actor object table oot.asm" + +load_object: +// args: a0 (actor number) +// returns v0 (0 if ok, 1 on error) + push 4, s0, ra + li v0, 1 + la t0, actor_object_table + sll t1, a0, 1 + addu t0, t0, t1 + lhu s0, 0(t0) // object number + beq s0, r0, load_object_return + nop + bal is_object_loaded + mov a0, s0 + bne v0, r0, load_object_return + cl v0 + li t8, @global_context + li t9, @object_spawn_offset + add a0, t8, t9 + mov a1, s0 + jal @object_spawn + nop +load_object_return: + jpop 4, s0, ra + +/* +we'll be dealing with structs like +typedef struct { + uint_ptr region_start; // ? + uint_ptr region_end; // ? + byte loaded_count; // only set in first item + byte loaded_count_alt; // usually fewer than the above + uint16 unknown; + uint16 object_number; + uint16 padding; + uint_ptr start; + uint32 size; + uint32 unknowns[11]; // more pointers and sizes +} loaded_object; // total size: 68 bytes +*/ + +is_object_loaded: +// args: a0 (object number) +// returns v0 (1 if loaded, 0 if not) + push 4 + li t8, @global_context + li t9, @object_spawn_offset + add t0, t8, t9 // current item + lb t1, 8(t0) // remaining items + li v0, 1 +is_object_loaded_loop: + lh t2, 12(t0) // item's object number + beq a0, t2, is_object_loaded_return + subi t1, t1, 1 // TODO: double check there's no off-by-one error + addi t0, t0, 68 + bne t1, r0, is_object_loaded_loop + nop + cl v0 +is_object_loaded_return: + jpop 4 diff --git a/Lua/inject/spawn.asm b/Lua/inject/spawn.asm index cb06830..cd2f7d5 100644 --- a/Lua/inject/spawn.asm +++ b/Lua/inject/spawn.asm @@ -74,7 +74,10 @@ return: simple_spawn: // args: a0 (actor to spawn) push 4, 9, ra - mov a2, a0 + jal load_object + sw a0, 56(sp) // keep me updated! + bne v0, r0, simple_spawn_return + lw a2, 56(sp) // keep me updated! li a1, @global_context addi a0, a1, @actor_spawn_offset li t0, @link_actor @@ -103,6 +106,7 @@ simple_spawn: // args: a0 (actor to spawn) sw t9, 0x30(sp) // unknown jal @actor_spawn nop +simple_spawn_return: jpop 4, 9, ra hold_delay: