1
0
Fork 0
mirror of https://github.com/notwa/mm synced 2024-05-18 05:23:22 -07:00

add object spawning to MM

This commit is contained in:
Connor Olding 2015-12-22 14:12:20 -08:00
parent fa082d3a1d
commit 9fbe275189
4 changed files with 758 additions and 65 deletions

View File

@ -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

View File

@ -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"

View File

@ -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

View File

@ -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