The behavior layout commands define how the objects and Mario are initialized and interact. Like the Geometry Layout Commands, the behavior commands start with a type byte and have no length byte.
Marks start of behavior. If haunted chair (4FD4) or mad piano (5024), it calls BehCommonInit (802A4120). If it is message panel (32E0), it sets 0x194 to 0x43160000 (150.0).
00 [TT] [AA AA]
T | Type of object. Used to determine which linked list placed in. |
A | Might be a bit-field, but Behavior00 ignores them |
Length: 4
Used by some small effects. if A > current 0x1F4, adds 1 to 0x1F4 of object, otherwise sets to 0. It loops obj→0x1F4 from 0 up to A - 1 and then back to 0.
01 00 [AA AA]
A | obj→0x1F4 = (A >= obj→0x1F4) ? obj→0x1F4 + 1 : 0 |
Length: 4
Jumps into another behavior and changes obj→0x1D0.
02 00 00 00 [AA AA AA AA]
A | Segmented address of behavior to jump to |
Length: 8
Writes something to 0x1D0. jumps into behavior at object→0x1d4.
03 00 00 00
Length: 4
Jumps into another behavior.
04 00 00 00 [AA AA AA AA]
A | Segmented address of behavior to jump to |
Length: 8
Loop specified amount of times.
05 00 [AA AA]
A | Number of times to loop |
Length: 4
End 0x05 loop.
06 00 00 00
Length: 4
Jumps back 4 bytes (usually results in infinite loop).
07 00 00 00
Length: 4
Loop start.
08 00 00 00
Length: 4
End of 08 loop. Behavior script normally ends with this, looping around ASM function (0x0C command).
09 00 00 00
Length: 4
Marks the end of a behavior that doesn't use a loop.
0A 00 00 00
Length: 4
Marks the end of a behavior that doesn't use a loop. Exactly the same as command 0xA, except this never seems to be used.
0B 00 00 00
Length: 4
Calls ASM function. Usually used to call object init routine or looping routine between 0x08/0x09 commands.
0C 00 00 00 [AA AA AA AA]
A | ASM routine to call |
Length: 8
Used to offset X, Y, or Z position a bit. It's useless except for Dorrie.
0D [AA] [BB BB]
A | Address = A*4+88 |
B | float |
obj→address += (float)B (special cases are 06, 07 and 08. 06 is X, 07 is Y, and 08 is Z-position) |
Length: 4
Mostly used for sight distance, does nearly the same as 0x0D.
0E [AA] [BB BB]
A | Address = A*4+88 |
B | float |
obj→address = (float)B (special case is 45 for sight distance) |
Length: 4
Mostly used as texture animation rate. Same as 0x0D, but without float.
0F [AA] [BB BB]
A | Address = A*4+88 |
B | u16 |
obj→address = B (special case is 1A for texture animation rate) |
Length: 4
Special Parameter.
10 [AA] [BB BB]
A | Address = A*4+88 |
B | u16 |
obj→address += B (special case is 2A for interaction or 2F for Bparam2 rate) |
Length: 4
Sets bits designated by mask B at object offset A*4+88.
11 [AA] [BB BB]
A | Address = A*4+88 |
B | u16 |
obj→address |= B |
Length: 4
Clears bits designated by mask B at object offset A*4+88. This is not used by any of the behavior scripts.
12 [AA] [BB BB]
A | Address = A*4+88 |
B | u16 |
obj→address &= (B ^ 0xFFFF) |
Length: 4
Used in dirt and arrow lift. Calls 80383BB0 (some RNG).
13 [AA] [BB BB] [CC CC] 00 00
A | Address = A*4+88 |
B | u16 |
C | u16 |
obj→address = B + (80383BB0() » C) |
Length: 8
Mostly used for object type and once for Y-speed.
14 [AA] [BB BB] [CC CC] 00 00
A | Address = A*4+88 |
B | float |
C | float |
obj→address = (float)B * (float)C |
Length: 8
Floating point multiple with float return from 80383CB4(). Used only in bubbles.
15 [AA] [BB BB] [CC CC] 00 00
A | Address = A*4+88 |
B | float |
C | float |
obj→address = B + 80383CB4() * C |
Length: 8
Floating point add with float return from 80383CB4(). Used only in water particles.
16 [AA] [BB BB] [CC CC] 00 00
A | Address = A*4+88 |
B | float |
C | float |
obj→address = (float)B + 80383CB4() + (float)C |
Length: 8
Right shift C with return from 80383BB0(). Unused.
17 [AA] [BB BB] [CC CC] 00 00
A | Address = A*4+88 |
B | u16 |
C | u16 |
obj→address = (obj→address + B) + (80383BB0() » C) |
Length: 8
Does nothing. Unused.
18 ?? ?? ??
Length: 4
Does nothing. Unused.
19 ?? ?? ??
Length: 4
Does nothing. Unused.
1A ?? ?? ??
Length: 4
Changes the model ID of current behavior. Used by Mr. I, Bowser flame spawn, and floating wood bridge.
1B 00 [II II]
I | model ID |
Length: 4
Load child object and save child object pointer to 0x6C (automatically follows?).
1C 00 00 00 [II II II II] [AA AA AA AA]
I | model ID |
A | segmented address of child object behavior |
Length: C
Deactivates object. obj→active (0x74) = 0
1D 00 00 00
Length: 4
Calls 80381794(). Drop to ground? and object→0xEC |= 0x2;
1E 00 00 00
Length: 4
Sums two floats at offsets B and C and stores in offset A. Used for waves and bubbles.
1F [AA] [BB] [CC]
A | AddressA = A*4+88 |
B | AddressB = B*4+88 |
C | AddressC = C*4+88 |
obj→addressA = obj→addressB + obj→addressC |
Length: 4
Sums two values at offsets B C and stores in offset A?
20 [AA] [BB] [CC]
A | AddressA = A*4+88 |
B | AddressB = B*4+88 |
C | AddressC = C*4+88 |
obj→addressA = obj→addressB + obj→addressC |
Length: 4
Sets billboarding flag (0x04) in graph flags.
21 00 00 00
Length: 4
Sets 0x10 in graph flags.
22 00 00 00
Length: 4
Define the collision sphere size.
23 00 00 00 [XZ XZ] [YY YY]
XZ | X and Z sphere |
Y | Y sphere |
Length: 8
Does nothing. Unused.
24 [AA] [BB BB]
A | Unused |
B | Unused |
Length: 4
Increment obj→0x1F4 or cycle back to 0 when it reaches obj→AddressA. Only used in Bubble (Mario) behavior.
25 [AA] 00 00
A | AddressA = A*4+88 |
if (obj->0x1F4 < obj->AddressA - 1) { obj->0x1F4 += 1; } else { obj->0x1F4 = 0; } |
Length: 4
Similar to behavior command 0x05, except parameter is only 1 byte. Unused.
26 [AA] 00 00
A | Loops? |
Length: 4
Store word B at address A of object. Always used with A = 0x26 (addressA = 0x120) to set initial animation with segmented address.
27 [AA] 00 00 [BB BB BB BB]
A | AddressA = A*4+88 |
B | value to store in AddressA |
obj→addressA = B |
Length: 8
Animates object by advancing animation pointer (obj→0x120).
28 [AA] 00 00
A | animation number (*4) |
8037C658(obj, obj→0x120 + A*4) |
Length: 4
Load child object. Only used in Koopa flag and poundable.
29 00 [AA AA] [BB BB BB BB] [CC CC CC CC]
A | Bparam for child object |
B | model ID |
C | Segmented address of behavior |
Length: C
Set collision data.
2A 00 00 00 [AA AA AA AA]
A | Segmented address of collision pointer |
Length: 8
Set collision data.
2B 00 00 00 [AA AA] [BB BB] [CC CC]
A | X/Z sphere as int |
B | Y sphere as int |
C | obj→0x208 = (float)C |
Length: C
Spawns object. Same as 0x1C, but stores child obj pointer to parent→0x6C.
2C 00 00 00 [AA AA AA AA] [BB BB BB BB] [CC CC]
A | model ID |
B | Segmented address of behavior |
Length: C
Declare initial position. Saves positions to 0x164, 0x168, and 0x16C. Used in Dorrie, Fly guys, etc. to determine in which range they can move.
2D 00 00 00
Length: 4
Uselessly long version of 0E?
2E 00 00 00 [AA AA] [BB BB]
A | obj→0x200 = (float) A |
B | obj→0x204 = (float) B |
Length: 8
Set interaction (obj→0x130). Same as 27 2A.
2F 00 00 00 [AA AA AA AA]
A | Interaction (see table below) |
Interaction | Description |
---|---|
00000001 | Mario can hang from it |
00000002 | Mario can pick it up |
00000004 | Door |
00000008 | Damages Mario (normal) |
00000010 | Coin |
00000020 | Nothing? |
00000040 | Pole |
00000080 | Damages Mario (can be punched, bounced on) |
00000100 | Damages Mario (can be punched) |
00000200 | Nothing (can be punched) |
00000400 | Blows Mario away |
00000800 | Warp door |
00001000 | Star |
00002000 | Warp hole |
00004000 | Cannon |
00008000 | Damages Mario (can be punched, bounced on) |
00010000 | Replenishes health |
00020000 | Bully |
00040000 | Flame |
00080000 | Koopa shell |
00100000 | Damages Mario (can be punched, bounced on) |
00200000 | Damages Mario |
00400000 | Damages Mario (can be punched and bounced on) |
00800000 | Message |
01000000 | Makes Mario spin |
02000000 | Makes Mario fall? |
04000000 | Damages Mario |
08000000 | Warp (Mario shrinks in) |
10000000 | Damages Mario |
20000000 | Electrocutes Mario |
40000000 | Normal |
Length: 8
Set gravity.
30 00 00 00 [AA AA] [BB BB] [CC CC] [DD DD] [EE EE] [FF FF] [GG GG] [HH HH]
A | obj→0x128 = (float)A |
B | obj→0xE8 = (float)B/100 |
C | obj→0x158 = (float)C/100 |
D | obj→0x12C = (float)D/100 |
E | obj→0x170 = (float)E/100 |
F | obj→0x174 = (float)F/100 |
G | Ignored |
H | Ignored |
Length: 0x14
Sets obj→0x190. Unused.
31 00 00 00 [AA AA AA AA]
A | obj→0x190 = A |
Length: 8
Scale object uniformly, sets X, Y, Z scaling to A as percent.
32 00 [AA AA]
A | scale value (percent) |
ScaleObject((float)A/100.0f; |
Length: 4
Clear flags in address of child object.
33 [AA] 00 00 [BB BB BB BB]
A | AddressA = A*4+88 |
B | bit values to clear |
obj→child(0x68)→addressA &= ~B |
Length: 8
Clear flags in address of child object. Only used for texture animation rate (0x1A).
34 [AA] [BB BB]
A | AddressA = A*4+0x88 |
B | divide value at 0x8032d5d4 with this (see code below) |
if ((*0x8032d5d4 / B) == 0) { addressA = A*4 + 0x88; obj->addressA += 1; } return 0;
Length: 4
Clears least significant bit of graph (obj→0x02 &= 0xFFFE).
35 00 00 00
Length: 4
Store value B at address A. Unused.
36 [AA] 00 00 [BB BB] 00 00
A | AddressA = A*4+0x88 |
B | value (u16) |
obj→addressA = (u32)value |
Length: 8
Spawns something. Only used in waves generator and surface waves.
37 00 00 00 [AA AA AA AA]
A | Spawn function address |
Length: 8