======== Behavior Commands ========
The behavior layout commands define how the objects and Mario are initialized and interact. Like the [[super_mario_64:geometry_layout_commands]], the behavior commands start with a type byte and have no length byte.
===== Behavior Commands =====
==== 00: Start ====
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 |
^ List ^ Description ^
| 00 | Mario |
| 01 | Unused |
| 02 | Objects that can be used to destroy other objects, like bob-ombs and corkboxes. |
| 03 | Unused |
| 04 | Most normal 'enemies' or actors are on this list. |
| 05 | This is a group of objects which can push each other around as well as their parent objects. |
| 06 | General level objects such as heart, star. |
| 07 | Unused |
| 08 | Default list. |
| 09 | Objects that use a collision model. |
| 0A | Objects that attract or otherwise "cling" mario similar to a pole action. |
| 0B | Spawners |
| 0C | Objects that will not load if there are not enough object slots. |
Length: 4
----
==== 01: State Loop ====
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
----
==== 02: Jump and Link? ====
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
----
==== 03: Return? ====
Writes something to 0x1D0. jumps into behavior at object->0x1d4.
''03 00 00 00''
Length: 4
----
==== 04: Jump ====
Jumps into another behavior.
''04 00 00 00 [AA AA AA AA]''
| A | Segmented address of behavior to jump to |
Length: 8
----
==== 05: Loop N ====
Loop specified amount of times.
''05 00 [AA AA]''
| A | Number of times to loop |
Length: 4
----
==== 06: End Loop N ====
End 0x05 loop.
''06 00 00 00''
Length: 4
----
==== 07: Infinite Loop ====
Jumps back 4 bytes (usually results in infinite loop).
''07 00 00 00''
Length: 4
----
==== 08: Loop Start ====
Loop start.
''08 00 00 00''
Length: 4
----
==== 09: Loop End ====
End of 08 loop. Behavior script normally ends with this, looping around ASM function (0x0C command).
''09 00 00 00''
Length: 4
----
==== 0A: End Behavior script ====
Marks the end of a behavior that doesn't use a loop.
''0A 00 00 00''
Length: 4
----
==== 0B: End Behavior script (Unused) ====
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
----
==== 0C: Call Function ====
Calls an ASM function in RAM.
''0C 00 00 00 [AA AA AA AA]''
| A | RAM address of ASM function to call |
Length: 8
----
==== 0D: Offset by Float ====
Used to offset the value of an address by a float.
''0D [AA] [BB BB]''
| A | Address = A*4+88 |
| B | s16 |
| obj->address += B(float) ||
Length: 4
----
==== 0E: Set to Float ====
Used to set the value of an address to a float.
''0E [AA] [BB BB]''
| A | Address = A*4+88 |
| B | s16 |
| obj->address = B(float) ||
Length: 4
----
==== 0F: Offset by Integer ====
Used to offset the value of an address by an integer.
''0F [AA] [BB BB]''
| A | Address = A*4+88 |
| B | u16 |
| obj->address += B ||
Length: 4
----
==== 10: Set to Integer ====
Used to set the value of an address to an integer.
''10 [AA] [BB BB]''
| A | Address = A*4+88 |
| B | u16 |
| obj->address = B ||
Length: 4
----
==== 11: Bit-set ====
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
----
==== 12: Bit-clear ====
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
----
==== 13: Add RNG ====
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
----
==== 14: Object Type? ====
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
----
==== 15: Float Multiply ====
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
----
==== 16: Float Add ====
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
----
==== 17: Add RNG 2 ====
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
----
==== 18: No Operation ====
Does nothing. Unused.
''18 ?? ?? ??''
Length: 4
----
==== 19: No Operation ====
Does nothing. Unused.
''19 ?? ?? ??''
Length: 4
----
==== 1A: No Operation ====
Does nothing. Unused.
''1A ?? ?? ??''
Length: 4
----
==== 1B: Change Model ID ====
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
----
==== 1C: Load Child Object ====
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
----
==== 1D: Deactivate ====
Deactivates object. obj->active (0x74) = 0
''1D 00 00 00''
Length: 4
----
==== 1E: Drop to Ground? ====
Calls 80381794(). Drop to ground? and object->0xEC |= 0x2;
''1E 00 00 00''
Length: 4
----
==== 1F: Used for Waves ====
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
----
==== 20: Unused ====
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
----
==== 21: Set Billboarding ====
Sets billboarding flag (0x04) in graph flags.
''21 00 00 00''
Length: 4
----
==== 22: Set Render Invisible flag ====
Sets Render Invisible (0x10) in graph flags.
''22 00 00 00''
Length: 4
----
==== 23: Collision cylinder size ====
Define the collision cylinder size.
''23 00 00 00 [RR RR] [HH HH]''
| R | Radius of collision cylinder|
| H | Height of collision cylinder|
Length: 8
----
==== 24: Nothing ====
Does nothing. Unused.
''24 [AA] [BB BB]''
| A | Unused |
| B | Unused |
Length: 4
----
==== 25: State Cycle ====
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
----
==== 26: Loop? ====
Similar to behavior command 0x05, except parameter is only 1 byte. Unused.
''26 [AA] 00 00''
| A | Loops? |
Length: 4
----
==== 27: Set Word ====
Store word B at address A of object. Always used with A = 0x26 (addressA = 0x120) to set initial [[sm64: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
----
==== 28: Animates ====
Animates object by advancing [[sm64:animation]] pointer (obj->0x120).
''28 [AA] 00 00''
| A | animation number (*4) |
| ''8037C658(obj, obj->0x120 + A*4)'' ||
Length: 4
----
==== 29: Load Child Object ====
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
----
==== 2A: Set Collision ====
Set collision data.
''2A 00 00 00 [AA AA AA AA]''
| A | Segmented address of collision pointer |
Length: 8
----
==== 2B: Set Collision Sphere ====
Set collision data.
''2B 00 00 00 [AA AA] [BB BB] [CC CC] 00 00''
| A | X/Z sphere as int |
| B | Y sphere as int |
| C | obj->-Y offset(0x208) = (float)C |
Length: C
----
==== 2C: Spawn Object ====
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]''
| A | model ID |
| B | Segmented address of behavior |
Length: C
----
==== 2D: Set Init Position ====
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
----
==== 2E: Set Hurtbox ====
Sets object hurtbox radius and height
''2E 00 00 00 [AA AA] [BB BB]''
| A | obj->Hurtbox Radius (0x200) = (float) A |
| B | obj->Hurtbox Height (0x204) = (float) B |
Length: 8
----
==== 2F: Set Interaction ====
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 | Cap |
| 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
----
==== 30: Set Gravity ====
Set gravity.
''30 00 00 00 [AA AA] [BB BB] [CC CC] [DD DD] [EE EE] [FF FF] [GG GG] [HH HH]''
| A | obj->oWallHitboxRadius = (float)A |
| B | obj->oGravity = (float)B/100 |
| C | obj->oBounce = (float)C/100 |
| D | obj->oDragStrength = (float)D/100 |
| E | obj->oFriction = (float)E/100 |
| F | obj->oBuoyancy = (float)F/100 |
| G | Ignored |
| H | Ignored |
Length: 0x14
----
==== 31: Set Interaction Sub-Type ====
Sets obj->0x190
''31 00 00 00 [AA AA AA AA]''
| A | obj->Interaction SubType (0x190) = A |
Length: 8
----
==== 32: Scale Object ====
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
----
==== 33: Child Object Change ====
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
----
==== 34: Texture Animate Rate ====
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
----
==== 35: Clear Graph Flag ====
Clears least significant bit of graph (obj->0x02 &= 0xFFFE).
''35 00 00 00''
Length: 4
----
==== 36: Set Value ====
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
----
==== 37: Spawn Something ====
Spawns something. Only used in waves generator and surface waves.
''37 00 00 00 [AA AA AA AA]''
| A | Spawn function address |
Length: 8
===== See Also =====
[[sm64:list_of_behaviors]]
===== References =====
* https://sites.google.com/site/kazemario64/home/all-behavior-commands