Obj Mure

From CloudModding OoT Wiki
Jump to: navigation, search
Actor 0x0094
ovl_Obj_Mure
Version VRom VRam Size
Debug 00F476C0 00F48B60 {{{ram-start}}} {{{ram-end}}} 14A0
NTSC 1.0 00CE1E70 00CE2E80 {{{ram-start}}} {{{ram-end}}} 1010
PAL MQ 00EDA9D0 00EDB9E0 {{{ram-start}}} {{{ram-end}}} 1010

ovl_Obj_Mure is the actor used to spawn a group of bugs, butterflies, or fish.

Template:Add links

NTSC 1.0 Notes

Instance Variables

Offset Type Description
0x0140 short Number of actors spawned
0x0142 short Table lookup for number of actors to spawn. Valid range 0-3. Lookup only occurs if above <= 0
0x0144 short Unknown. Changes spawn function used.
0x0146 short Type of actor to spawn. 02 = Fish, 03 = Bugs, 04 = Butterflies
0x0148 actor ptr[15] Points to the actors spawned
0x0184 byte[15] Unknown, related to above

Asm Notes

1E8200 - Actor File
1E9240 - Actor Instance

&F000, 0x0140 = Spawn Count
&0700, 0x0142 = Spawn Count Lookup Table 
&0060, 0x0144 = ?
&001F, 0x0146 = Type

828C LH 	V0, 0x001C(A0) //load variable component
8290 SRA	T8, V0, 0x8 
8294 ANDI	T9, T8, 0x0007 //Store in T9 ? (&0700) 
8298 SH 	T9, 0x0142(A0) //Save (&0700)
829C LH 	T3, 0x0142(A0)
82A0 SRA	T6, V0, 0xC
82A4 SRA	T0, V0, 0x5
82A8 ANDI	T7, T6, 0x000F //Store in T7 ? (&F000)
82AC ANDI	T1, T0, 0x0003 //Store in T1 ? (&0060)
82B0 ANDI	T2, V0, 0x001F //Store in T2 Type? (&001F)
82B4 SLTI	AT, T3, 0x0004 //is (&0700) < 4?
82B8 SH 	T7, 0x0140(A0) //Save (&F000)
82BC SH 	T1, 0x0144(A0) //Save (&0060)
82C0 BNEZ	AT, 801E82D8  //Jump if (&0700) < 4
82C4 SH 	T2, 0x0146(A0) //Save (&001F)

82C8 JAL	80020EB4

82D8 LH 	T4, 0x0146(A0)//load (&001F)
82DC SLTI	AT, T4, 0x0005 //is (&001F) < 5?
82E0 BNEZ	AT, 801E82F8

82F8 JAL	801E8258 //-> JAL 801E8200
82FC SW 	A0, 0x0018(SP)

{
820C LH 	V0, 0x0146 //load (&001F)
8214 LUI	A1, 0x801F
//From here, checks if V0 (&001F) is 2, 3, 4, and goes to 1E8230 if so (below),
//else jumps to 1E8240 which zeros V0. Both sync at 1E8248, with V0 being 1 if 
//the program goes to 1E8230

8230 JAL	80063F7C
8234 ADDIU	A1, A1, 0x908C // A1 = 801E908C
8238 BEQ	R0, R0, 801E8248
823C ADDIU	V0, R0, 0x0001

8248 LW 	RA, 0x0014(SP)
8250 JR 	RA

//if V0 is only 1 or 0, these instructions are useless (aside from setting RA)
8268 BNEZ	V0, 801E8278 // (branch if (&001F) is 2-4)
826C LW 	RA, 0x0014(SP)

827C JR 	RA
}

8300 BNEZ	V0, 801E8318 // (branch if (&001F) is 2-4)
8304 LW 	A0, 0x0018(SP)
8308 JAL	80020EB4

8318 LUI	T5, 0x801F
831C ADDIU	T5, T5, 0x88D8 //T5 = 801E88D8
8320 SW 	T5, 0x013C(A0) //Store T5 at 0x013C from instance start

--- (&0060) ---
//(&001F) = 4 in case it matters
86B4 LH 	V0, 0x0144(A0)
86B8 ADDIU	AT, R0, 0x0001 //AT = 1
86BC BEQ	V0, R0, 0x801E86D4 //V0 = 0? goto JAL 801E8398, then returns from function
86C4 BEQ	V0, AT, 0x801E86E4 //V0 = 1? goto JAL 801E8560, then returns from function
86CC BEQ	R0, R0, 0x801E86F0 //return from function


## Function 801E8560 ##
//Spawns V0 number of actors
//pushes variables on the stack
8594 JAL	801E8344
//V0 contains number of things to spawn
859C OR 	S5, V0, R0
85A0 BLEZ	V0, 801E867C //Jumps to the function's end
85A4 OR 	S1, R0, R0 //S1 = 0 (set spawned actor count 0)
85A8 ADDIU	S6, S4, 0x1C24 //S4 = 801C84A0 (global context), S6 = 801CA0C4
85AC OR 	S2, S0, R0 //S0 = instance location
85B0 OR 	S3, S0, R0 //S0 = instance location
85B4 ADDIU	S7, S0, 0x0024 //offset to x,y,z coord
85B8 ADDIU	S8, SP, 0x007C 
85BC OR 	A0, S8, R0
85C0 OR 	A1, S7, R0 //A1 = offset to x,y,z coord
85C4 LH 	A2, 0x0142(S0) // &0700 var
85C8 JAL	801E8370 //Pushes (&0700) var, spawn count, and x,y,z on stack without moving sp
85CC OR 	A3, S1, R0 //A3 = 0?
85D0 LH 	V0, 0x0146(S0) //V0 = (&001F) var
85D4 ADDIU	AT, R0, 0x0004 //AT = butterfly
85D8 OR 	A0, S6, R0 //A0 = 801CA0C4
85DC BNE	V0, AT, 801E85F4 //branch if type != butterfly
85E0 LWC1	F4, 0x0080(SP)//F4 = Y as float
85E4 BNEZ	S1, 801E85F4
84E8 ADDIU	T0, R0, 0x0001
85EC BEQ	R0, R0, 801E8604
85F0 SLL	V1, V0, 0x1

8604 LWC1	F6, 0x0084(SP)//F6 = Z as float
8608 SWC1	F4, 0x0010(SP)
860C LUI	A2, 0x801F
8610 SWC1	F6, 0x0014(SP)
8614 LH 	T6, 0x0030(S0)
8618 ADDIU	A2, A2, V1
861C LH 	A2, 0x9074 //gets actor id from 1E9074 + Type * 2
8620 SW 	T6, 0x0018(SP)
8624 LH 	T7, 0x0032(S0)
8628 OR 	A1, S4, R0 //A1 = Global context
862C LW 	A3, 0x007C(SP)//A3 = X as float
8630 SW 	T7, 0x001C(SP)

863C JAL	80025110 //call spawn actor function
8640 SW 	T8, 0x0020(SP)
8644 BEQ	V0, R0, 801E8660 //jump if the spawn function failed to create an actor
8648 SW 	V0, 0x0148(S2) //store spawned actor pointer at 0x0148 into instance
864C SB 	R0, 0x0184(S3) //store 0 at 0x0184 into instance
8650 LW 	T1, 0x0148(S2)
8654 LB 	T9, 0x0003(S0) //load binding room index
8658 BEQ	R0, R0, 801E8668
865C SB 	T9, 0x0003(T1) //Set spawned actor's current room to this actor's room

8668 ADDIU	S1, S1, 0x0001 //Number of actors spawned += 1
866C SLT	AT, S1, S5 //AT = 1 if number of spawned actors is less than total being spawned
8670 ADDIU 	S2, S2, 0x0004 //Increment S2 by 4 (array at 0x0148)
8674 BNEZ	AT, 801E85BC //loop
8678 ADDIU	S3, S3, 0x0001 //increment S3 by 1 (array at 0x0184)

#######################

## Function 801E8344 ##
//determines whether to use the spawn count, or look up a pre-defined spawn count
8344 LH 	V1, 0x0140(A0) //load (&F000)
8348 BNEZ	V1, 801E8368
834C OR 	V0, V1, R0 //V0 = (&F000)
//(&F000 is 0)
8350 LH 	T6, 0x0142(A0) //load (&0700)
//basically performs a table lookup for the number of things to spawn
//the table is located at 801E9064
//Then returns to caller
8368 JR 	RA

#######################

## Function 801E8370 ## 
//Pushes (&0700) var, spawn count, and x,y,z on stack without moving sp
//A0 = Stack Pointer + 7C
//A1 = Coordinates pointer
//A2 = (&0700) var
//A3 = ?