diff --git a/Lua/inject/actor object table mm.asm b/Lua/inject/actor object table mm.asm new file mode 100644 index 0000000..19eabfe --- /dev/null +++ b/Lua/inject/actor object table mm.asm @@ -0,0 +1,693 @@ +HEX { +00 00 // Player +00 01 // En_Test +00 01 // En_GirlA +00 01 // En_Part +00 01 // En_Light +00 01 // En_Door +00 0C // En_Box +01 28 // En_Pametfrog +00 05 // En_Okuta +00 01 // En_Bom +00 09 // En_Wallmas +00 0A // En_Dodongo +00 0B // En_Firefly +00 01 // En_Horse +00 00 // En_Item00 +00 01 // En_Arrow +00 01 // En_Elf +00 0F // En_Niw +00 12 // En_Tite +00 00 // unset +00 14 // En_Peehat +00 02 // En_Butte +00 01 // En_Insect +00 01 // En_Fish +00 01 // En_Holl +00 17 // En_Dinofos +00 5F // En_Hata +00 19 // En_Zl1 +00 01 // En_Viewer +00 0E // En_Bubble +00 01 // Door_Shutter +00 00 // unset +00 01 // En_Boom +00 01 // En_Torch2 +00 BC // En_Minifrog +00 00 // unset +00 20 // En_St +00 00 // unset +00 00 // En_A_Obj +00 01 // Obj_Wturn +00 01 // En_River_Sound +00 00 // unset +00 01 // En_Ossan +00 00 // unset +00 00 // unset +00 1D // En_Famos +00 00 // unset +00 2A // En_Bombf +00 00 // unset +00 00 // unset +00 30 // En_Am +00 31 // En_Dekubaba +00 01 // En_M_Fire1 +00 01 // En_M_Thunder +00 01 // Bg_Breakwall +00 00 // unset +00 3E // Door_Warp1 +00 80 // Obj_Syokudai +00 96 // Item_B_Heart +00 40 // En_Dekunuts +00 51 // En_Bbfall +00 01 // Arms_Hook +00 51 // En_Bb +01 7E // Bg_Keikoku_Spr +00 00 // unset +00 61 // En_Wood02 +00 00 // unset +00 52 // En_Death +00 52 // En_Minideath +00 00 // unset +00 00 // unset +00 6A // En_Vm +00 01 // Demo_Effect +00 01 // Demo_Kankyo +00 09 // En_Floormas +00 00 // unset +00 75 // En_Rd +00 5C // Bg_F40_Flift +00 00 // Bg_Heavy_Block +00 01 // Obj_Mure +00 20 // En_Sw +00 01 // Object_Kankyo +00 00 // unset +00 00 // unset +00 7D // En_Horse_Link_Child +00 02 // Door_Ana +00 00 // unset +00 00 // unset +00 00 // unset +00 00 // unset +00 00 // unset +00 01 // En_Encount1 +00 0C // Demo_Tre_Lgt +00 00 // unset +00 00 // unset +02 80 // En_Encount2 +00 70 // En_Fire_Rock +00 88 // Bg_Ctower_Rot +00 87 // Mir_Ray +00 00 // unset +00 8E // En_Sb +01 28 // En_Bigslime +00 31 // En_Karebaba +00 99 // En_In +00 00 // unset +00 A2 // En_Ru +00 01 // En_Bom_Chu +01 91 // En_Horse_Game_Check +00 AB // En_Rr +00 00 // unset +00 00 // unset +00 00 // unset +00 00 // unset +00 00 // unset +00 00 // unset +00 01 // En_Fr +00 00 // unset +00 00 // unset +00 00 // unset +00 00 // unset +00 00 // unset +01 24 // En_Fishing +00 03 // Obj_Oshihiki +00 01 // Eff_Dust +00 01 // Bg_Umajump +00 01 // Arrow_Fire +00 01 // Arrow_Ice +00 01 // Arrow_Light +00 01 // Item_Etcetera +00 01 // Obj_Kibako +00 01 // Obj_Tsubo +00 00 // unset +00 D8 // En_Ik +00 00 // unset +00 00 // unset +00 00 // unset +00 00 // unset +01 53 // Demo_Shd +01 34 // En_Dns +00 01 // Elf_Msg +00 03 // En_Honotrap +00 03 // En_Tubo_Trap +00 01 // Obj_Ice_Poly +00 E4 // En_Fz +00 01 // En_Kusa +00 EE // Obj_Bean +01 2A // Obj_Bombiwa +00 03 // Obj_Switch +00 00 // unset +00 ED // Obj_Lift +00 EC // Obj_Hsblock +00 01 // En_Okarina_Tag +00 00 // unset +00 EF // En_Goroiwa +00 00 // unset +00 00 // unset +00 F1 // En_Daiku +00 F2 // En_Nwc +00 01 // Item_Inbox +00 E6 // En_Ge1 +00 01 // Obj_Blockstop +00 01 // En_Sda +00 01 // En_Clear_Tag +00 00 // unset +02 48 // En_Gm +00 F4 // En_Ms +00 F5 // En_Hs +01 7F // Bg_Ingate +00 FC // En_Kanban +00 00 // unset +00 0F // En_Attack_Niw +00 00 // unset +00 00 // unset +00 00 // unset +00 FE // En_Mk +00 FD // En_Owl +00 01 // En_Ishi +01 BA // Obj_Hana +00 F7 // Obj_Lightswitch +00 01 // Obj_Mure2 +00 00 // unset +01 40 // En_Fu +00 00 // unset +00 00 // unset +01 06 // En_Stream +00 01 // En_Mm +00 00 // unset +00 00 // unset +00 01 // En_Weather_Tag +00 C2 // En_Ani +00 00 // unset +02 71 // En_Js +00 00 // unset +00 00 // unset +00 00 // unset +00 00 // unset +00 01 // En_Okarina_Effect +01 15 // En_Mag +00 01 // Elf_Msg2 +00 5C // Bg_F40_Swlift +00 00 // unset +00 00 // unset +01 1D // En_Kakasi +00 01 // Obj_Makeoshihiki +00 01 // Oceff_Spot +00 00 // unset +00 01 // En_Torch +00 00 // unset +00 01 // Shot_Sun +00 00 // unset +00 00 // unset +00 01 // Obj_Roomtimer +01 27 // En_Ssh +00 00 // unset +00 01 // Oceff_Wipe +00 01 // Oceff_Storm +00 01 // Obj_Demo +01 28 // En_Minislime +00 01 // En_Nutsball +00 00 // unset +00 00 // unset +00 00 // unset +00 00 // unset +00 01 // Oceff_Wipe2 +00 01 // Oceff_Wipe3 +00 00 // unset +01 32 // En_Dg +00 20 // En_Si +01 B9 // Obj_Comb +01 33 // Obj_Kibako2 +00 00 // unset +00 01 // En_Hs2 +00 01 // Obj_Mure3 +01 40 // En_Tg +00 00 // unset +00 00 // unset +01 41 // En_Wf +01 42 // En_Skb +00 00 // unset +01 43 // En_Gs +00 01 // Obj_Sound +00 06 // En_Crow +00 00 // unset +01 46 // En_Cow +00 00 // unset +00 00 // unset +00 01 // Oceff_Wipe4 +00 00 // unset +00 D0 // En_Zo +00 01 // Obj_Makekinsuta +01 30 // En_Ge3 +00 00 // unset +00 02 // Obj_Hamishi +01 92 // En_Zl4 +00 01 // En_Mm2 +00 00 // unset +00 01 // Door_Spiral +00 00 // unset +00 01 // Obj_Pzlblock +00 64 // Obj_Toge +00 00 // unset +00 30 // Obj_Armos +01 4F // Obj_Boyo +00 00 // unset +00 00 // unset +01 4E // En_Grasshopper +00 00 // unset +00 02 // Obj_Grass +00 02 // Obj_Grass_Carry +00 02 // Obj_Grass_Unit +00 00 // unset +00 00 // unset +01 53 // Bg_Fire_Wall +00 01 // En_Bu +02 3B // En_Encount3 +01 55 // En_Jso +00 ED // Obj_Chikuwa +01 56 // En_Knight +00 01 // En_Warp_tag +00 D7 // En_Aob_01 +00 01 // En_Boj_01 +00 01 // En_Boj_02 +00 01 // En_Boj_03 +00 01 // En_Encount4 +01 10 // En_Bom_Bowl_Man +01 AC // En_Syateki_Man +00 00 // unset +01 57 // Bg_Icicle +00 06 // En_Syateki_Crow +00 01 // En_Boj_04 +00 01 // En_Cne_01 +00 01 // En_Bba_01 +00 DE // En_Bji_01 +01 58 // Bg_Spdweb +00 00 // unset +00 00 // unset +00 01 // En_Mt_tag +01 5A // Boss_01 +01 5B // Boss_02 +01 5C // Boss_03 +01 5D // Boss_04 +01 5E // Boss_05 +01 56 // Boss_06 +01 60 // Boss_07 +00 08 // Bg_Dy_Yoseizo +00 00 // unset +00 01 // En_Boj_05 +00 00 // unset +00 00 // unset +00 01 // En_Sob1 +00 00 // unset +00 00 // unset +00 A1 // En_Go +00 00 // unset +01 61 // En_Raf +01 62 // Obj_Funen +01 63 // Obj_Raillift +01 64 // Bg_Numa_Hana +01 65 // Obj_Flowerpot +01 66 // Obj_Spinyroll +01 CC // Dm_Hina +01 41 // En_Syateki_Wf +00 03 // Obj_Skateblock +01 67 // Obj_Iceblock +01 A6 // En_Bigpamet +00 40 // En_Syateki_Dekunuts +00 01 // Elf_Msg3 +00 BC // En_Fg +01 69 // Dm_Ravine +01 92 // Dm_Sa +01 6A // En_Slime +01 6B // En_Pr +01 6D // Obj_Toudai +01 6D // Obj_Entotu +01 6C // Obj_Bell +00 05 // En_Syateki_Okuta +00 00 // unset +01 6D // Obj_Shutter +01 4B // Dm_Zl +00 01 // En_Elfgrp +01 9F // Dm_Tsg +01 71 // En_Baguo +01 66 // Obj_Vspinyroll +01 6D // Obj_Smork +00 01 // En_Test2 +00 1C // En_Test3 +00 01 // En_Test4 +01 72 // En_Bat +00 01 // En_Sekihi +01 78 // En_Wiz +01 78 // En_Wiz_Brock +01 78 // En_Wiz_Fire +00 01 // Eff_Change +02 6C // Dm_Statue +00 01 // Obj_Fireshield +01 79 // Bg_Ladder +01 7A // En_Mkk +00 01 // Demo_Getitem +00 00 // unset +01 89 // En_Dnb +02 24 // En_Dnh +00 01 // En_Dnk +01 8B // En_Dnq +00 00 // unset +01 7E // Bg_Keikoku_Saku +01 2A // Obj_Hugebombiwa +00 0B // En_Firefly2 +01 81 // En_Rat +01 82 // En_Water_Effect +00 02 // En_Kusa2 +01 53 // Bg_Spout_Fire +00 00 // unset +01 84 // Bg_Dblue_Movebg +00 08 // En_Dy_Extra +01 85 // En_Bal +00 E3 // En_Ginko_Man +01 86 // En_Warp_Uzu +01 87 // Obj_Driftice +01 35 // En_Look_Nuts +00 01 // En_Mushi2 +00 01 // En_Fall +01 07 // En_Mm3 +01 8A // Bg_Crace_Movebg +01 F3 // En_Dno +01 6B // En_Pr2 +01 6B // En_Prz +01 55 // En_Jso2 +00 01 // Obj_Etcetera +01 8D // En_Egol +00 BB // Obj_Mine +00 01 // Obj_Purify +01 8E // En_Tru +01 8F // En_Trt +00 00 // unset +00 00 // unset +00 01 // En_Test5 +00 01 // En_Test6 +01 98 // En_Az +01 8D // En_Estone +01 90 // Bg_Hakugin_Post +01 69 // Dm_Opstage +01 92 // Dm_Stk +01 C8 // Dm_Char00 +01 A2 // Dm_Char01 +01 BE // Dm_Char02 +01 A3 // Dm_Char03 +00 01 // Dm_Char04 +02 13 // Dm_Char05 +01 E6 // Dm_Char06 +02 12 // Dm_Char07 +02 29 // Dm_Char08 +01 EB // Dm_Char09 +01 8C // Obj_Tokeidai +00 00 // unset +01 95 // En_Mnk +01 8D // En_Egblock +01 35 // En_Guard_Nuts +01 90 // Bg_Hakugin_Bombwall +01 97 // Obj_Tokei_Tobira +01 90 // Bg_Hakugin_Elvpole +00 B7 // En_Ma4 +01 99 // En_Twig +01 9B // En_Po_Fusen +00 01 // En_Door_Etc +01 9E // En_Bigokuta +01 E7 // Bg_Icefloe +01 63 // Obj_Ocarinalift +00 01 // En_Time_Tag +01 9F // Bg_Open_Shutter +01 9F // Bg_Open_Spot +01 A0 // Bg_Fu_Kaiten +00 01 // Obj_Aqua +00 01 // En_Elforg +00 0E // En_Elfbub +00 00 // unset +01 A1 // En_Fu_Mato +01 A1 // En_Fu_Kago +01 A3 // En_Osn +00 88 // Bg_Ctower_Gear +01 8F // En_Trt2 +01 A4 // Obj_Tokei_Step +01 A5 // Bg_Lotus +01 A6 // En_Kame +01 B4 // Obj_Takaraya_Wall +01 A0 // Bg_Fu_Mizu +01 E5 // En_Sellnuts +01 A7 // Bg_Dkjail_Ivy +00 00 // unset +01 A8 // Obj_Visiblock +01 29 // En_Takaraya +01 A9 // En_Tsn +01 AA // En_Ds2n +01 AB // En_Fsn +01 AC // En_Shn +00 00 // unset +01 B6 // En_Stop_heishi +01 AD // Obj_Bigicicle +01 E5 // En_Lift_Nuts +01 AF // En_Tk +00 00 // unset +01 B0 // Bg_Market_Step +01 63 // Obj_Lupygamelift +00 01 // En_Test7 +01 B3 // Obj_Lightblock +00 87 // Mir_Ray2 +01 B5 // En_Wdhand +00 01 // En_Gamelupy +00 01 // Bg_Danpei_Movebg +01 B7 // En_Snowwd +01 07 // En_Pm +00 01 // En_Gakufu +00 01 // Elf_Msg4 +00 01 // Elf_Msg5 +00 01 // En_Col_Man +00 75 // En_Talk_Gibud +01 B8 // En_Giant +00 EF // Obj_Snowball +01 BB // Boss_Hakugin +01 44 // En_Gb2 +00 01 // En_Onpuman +01 BF // Bg_Tobira01 +00 01 // En_Tag_Obj +01 C1 // Obj_Dhouse +01 C2 // Obj_Hakaisi +01 C7 // Bg_Hakugin_Switch +00 00 // unset +01 C4 // En_Snowman +00 01 // TG_Sw +01 C5 // En_Po_Sisters +01 C6 // En_Pp +01 BB // En_Hakurock +00 01 // En_Hanabi +00 01 // Obj_Dowsing +00 01 // Obj_Wind +01 32 // En_Racedog +01 0F // En_Kendo_Js +01 C9 // Bg_Botihasira +01 D7 // En_Fish2 +01 CB // En_Pst +01 C3 // En_Poh +01 CD // Obj_Spidertent +01 CE // En_Zoraegg +01 CF // En_Kbt +01 D0 // En_Gg +01 D1 // En_Maruta +00 EF // Obj_Snowball2 +01 D0 // En_Gg2 +01 D2 // Obj_Ghaka +01 D4 // En_Dnp +01 D5 // En_Dai +01 D3 // Bg_Goron_Oyu +01 D6 // En_Kgy +00 01 // En_Invadepoh +01 DF // En_Gk +00 E2 // En_An +00 00 // unset +01 EB // En_Bee +01 EC // En_Ot +01 ED // En_Dragon +01 EE // Obj_Dora +01 F1 // En_Bigpo +01 EE // Obj_Kendo_Kanban +01 F2 // Obj_Hariko +00 01 // En_Sth +01 F4 // Bg_Sinkai_Kabe +01 E0 // Bg_Haka_Curtain +01 F5 // Bg_Kin2_Bombwall +01 F5 // Bg_Kin2_Fence +01 F5 // Bg_Kin2_Picture +01 F5 // Bg_Kin2_Shelf +01 42 // En_Rail_Skb +01 F8 // En_Jg +01 8E // En_Tru_Mt +01 FC // Obj_Um +02 01 // En_Neo_Reeba +02 02 // Bg_Mbar_Chair +00 03 // Bg_Ikana_Block +02 03 // Bg_Ikana_Mirror +02 03 // Bg_Ikana_Rotaryroom +01 84 // Bg_Dblue_Balance +01 84 // Bg_Dblue_Waterfall +02 04 // En_Kaizoku +01 2E // En_Ge2 +00 B7 // En_Ma_Yts +00 A7 // En_Ma_Yto +02 05 // Obj_Tokei_Turret +01 84 // Bg_Dblue_Elevator +01 70 // Obj_Warpstone +02 06 // En_Zog +02 07 // Obj_Rotlift +01 F8 // Obj_Jg_Gakki +02 0C // Bg_Inibs_Movebg +00 D0 // En_Zot +02 0D // Obj_Tree +02 0E // Obj_Y2lift +02 0E // Obj_Y2shutter +02 0E // Obj_Boat +02 50 // Obj_Taru +02 3D // Obj_Hunsui +01 8E // En_Jc_Mato +00 87 // Mir_Ray3 +02 11 // En_Zob +00 01 // Elf_Msg6 +00 01 // Obj_Nozoki +02 3A // En_Toto +00 75 // En_Railgibud +00 DF // En_Baba +00 E3 // En_Suttari +02 16 // En_Zod +02 63 // En_Kujiya +00 A1 // En_Geg +00 01 // Obj_Kinoko +02 18 // Obj_Yasi +00 01 // En_Tanron1 +01 5D // En_Tanron2 +01 5C // En_Tanron3 +02 1E // Obj_Chan +02 20 // En_Zos +00 A1 // En_S_Goro +00 04 // En_Nb +00 E3 // En_Ja +00 5C // Bg_F40_Block +02 22 // Bg_F40_Switch +00 5D // En_Po_Composer +00 FF // En_Guruguru +00 01 // Oceff_Wipe5 +01 B6 // En_Stone_heishi +00 01 // Oceff_Wipe6 +01 E5 // En_Scopenuts +00 06 // En_Scopecrow +00 01 // Oceff_Wipe7 +02 29 // Eff_Kamejima_Wave +02 2A // En_Hg +02 2A // En_Hgo +02 2B // En_Zov +00 07 // En_Ah +02 2C // Obj_Hgdoor +02 03 // Bg_Ikana_Bombwall +02 03 // Bg_Ikana_Ray +02 03 // Bg_Ikana_Shutter +01 E0 // Bg_Haka_Bombwall +01 E0 // Bg_Haka_Tomb +00 01 // En_Sc_Ruppe +02 37 // Bg_Iknv_Doukutu +02 37 // Bg_Iknv_Obj +02 38 // En_Pamera +02 39 // Obj_HsStump +01 2B // En_Hidden_Nuts +00 D0 // En_Zow +00 01 // En_Talk +00 0D // En_Al +00 13 // En_Tab +00 E3 // En_Nimotsu +00 01 // En_Hit_Tag +00 06 // En_Ruppecrow +02 3F // En_Tanron4 +01 5B // En_Tanron5 +02 40 // En_Tanron6 +00 F1 // En_Daiku2 +00 F0 // En_Muto +02 47 // En_Baisen +01 B6 // En_Heishi +01 B6 // En_Demo_heishi +02 41 // En_Dt +02 43 // En_Cha +02 44 // Obj_Dinner +02 46 // Eff_Lastday +02 03 // Bg_Ikana_Dharma +01 E5 // En_Akindonuts +01 BE // Eff_Stk +01 D5 // En_Ig +00 A1 // En_Rg +02 49 // En_Osk +00 01 // En_Sth2 +02 4A // En_Yb +02 4B // En_Rz +00 01 // En_Scopecoin +02 4F // En_Bjt +01 10 // En_Bomjima +01 10 // En_Bomjimb +01 10 // En_Bombers +01 10 // En_Bombers2 +02 80 // En_Bombal +01 B1 // Obj_Moon_Stone +00 01 // Obj_Mu_Pict +02 36 // Bg_Ikninside +02 55 // Eff_Zoraband +02 56 // Obj_Kepn_Koya +02 57 // Obj_Usiyane +02 5B // En_Nnh +02 60 // Obj_Kzsaku +02 61 // Obj_Milk_Bin +02 64 // En_Kitan +02 67 // Bg_Astr_Bombwall +02 36 // Bg_Iknin_Susceil +02 68 // En_Bsb +01 29 // En_Recepgirl +00 22 // En_Thiefbird +01 A9 // En_Jgame_Tsn +00 80 // Obj_Jgame_Light +02 6E // Obj_Yado +02 6F // Demo_Syoten +02 70 // Demo_Moonend +02 7F // Bg_Lbfshot +02 34 // Bg_Last_Bwall +00 15 // En_And +00 01 // En_Invadepoh_Demo +02 73 // Obj_Danpeilift +02 69 // En_Fall2 +00 0D // Dm_Al +00 E2 // Dm_An +00 07 // Dm_Ah +00 04 // Dm_Nb +00 18 // En_Drs +02 41 // En_Ending_Hero +01 85 // Dm_Bal +01 85 // En_Paper +01 42 // En_Hint_Skb +00 01 // Dm_Tag +02 7A // En_Bh +02 47 // En_Ending_Hero2 +00 F0 // En_Ending_Hero3 +01 B6 // En_Ending_Hero4 +00 F1 // En_Ending_Hero5 +00 01 // En_Ending_Hero6 +00 E2 // Dm_Gm +00 01 // Obj_Swprize +00 01 // En_Invisible_Ruppe +02 81 // Obj_Ending +01 2C // En_Rsn +} +.align diff --git a/Lua/inject/spawn mm.asm b/Lua/inject/spawn mm.asm index f1e7f6b..834b616 100644 --- a/Lua/inject/spawn mm.asm +++ b/Lua/inject/spawn mm.asm @@ -1,4 +1,5 @@ [actor_spawn]: 0x800BAE14 +[object_spawn]: 0x8012F2E0 [max_actor_no]: 0x2B1 [global_context]: 0x803E6B20 @@ -19,7 +20,5 @@ .include "spawn.asm" -load_object: -// unimplemented for now, just return 0 - jr - cl v0 +actor_object_table: +.include "actor object table mm.asm" diff --git a/Lua/inject/spawn oot.asm b/Lua/inject/spawn oot.asm index 0685119..208ae6b 100644 --- a/Lua/inject/spawn oot.asm +++ b/Lua/inject/spawn oot.asm @@ -22,63 +22,3 @@ 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 cd2f7d5..983fd13 100644 --- a/Lua/inject/spawn.asm +++ b/Lua/inject/spawn.asm @@ -95,7 +95,8 @@ simple_spawn: // args: a0 (actor to spawn) li t9, 0x0 sw t9, 0x20(sp) // rotation? - lhu t7, @actor_horiz_angle(t0) + //lhu t7, @actor_horiz_angle(t0) + li t7, 0 sw t7, 0x24(sp) // actor variable li t9, 0x0000007F @@ -111,3 +112,63 @@ simple_spawn_return: hold_delay: .word 0 + +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