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

add object spawning to OoT

This commit is contained in:
Connor Olding 2015-12-22 06:35:50 -08:00
parent 49e51cd6e7
commit 108c4189ef
4 changed files with 550 additions and 1 deletions

View File

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

View File

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

View File

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

View File

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