#ifndef BEHAVIOR_COMMANDS_H #define BEHAVIOR_COMMANDS_H #define BC_B(a) _SHIFTL(a, 24, 8) #define BC_BB(a, b) (_SHIFTL(a, 24, 8) | _SHIFTL(b, 16, 8)) #define BC_BBBB(a, b, c, d) (_SHIFTL(a, 24, 8) | _SHIFTL(b, 16, 8) | _SHIFTL(c, 8, 8) | _SHIFTL(d, 0, 8)) #define BC_BBH(a, b, c) (_SHIFTL(a, 24, 8) | _SHIFTL(b, 16, 8) | _SHIFTL(c, 0, 16)) #define BC_B0H(a, b) (_SHIFTL(a, 24, 8) | _SHIFTL(b, 0, 16)) #define BC_H(a) _SHIFTL(a, 16, 16) #define BC_HH(a, b) (_SHIFTL(a, 16, 16) | _SHIFTL(b, 0, 16)) #define BC_W(a) ((uintptr_t)(u32)(a)) #define BC_PTR(a) ((uintptr_t)(a)) // Defines the start of the behavior script as well as the object list the object belongs to. // Has some special behavior for certain objects. #define BEGIN(objList) \ BC_BB(0x00, objList) // Delays the behavior script for a certain number of frames. #define DELAY(num) \ BC_B0H(0x01, num) // Jumps to a new behavior command and stores the return address in the object's stack. #define CALL(addr) \ BC_B(0x02), \ BC_PTR(addr) // Jumps back to the behavior command stored in the object's stack. #define RETURN() \ BC_B(0x03) // Jumps to a new behavior script without saving anything. #define GOTO(addr) \ BC_B(0x04), \ BC_PTR(addr) // Marks the start of a loop that will repeat a certain number of times. #define BEGIN_REPEAT(count) \ BC_B0H(0x05, count) // Marks the end of a repeating loop. #define END_REPEAT() \ BC_B(0x06) // Also marks the end of a repeating loop, but continues executing commands following the loop on the same frame. #define END_REPEAT_CONTINUE() \ BC_B(0x07) // Marks the beginning of an infinite loop. #define BEGIN_LOOP() \ BC_B(0x08) // Marks the end of an infinite loop. #define END_LOOP() \ BC_B(0x09) // Exits the behavior script. // Often used to end behavior scripts that do not contain an infinite loop. #define BREAK() \ BC_B(0x0A) // Exits the behavior script, unused. #define BREAK_UNUSED() \ BC_B(0x0B) // Executes a native game function. #define CALL_NATIVE(func) \ BC_B(0x0C), \ BC_PTR(func) // Adds a float to the specified field. #define ADD_FLOAT(field, value) \ BC_BBH(0x0D, field, value) // Sets the specified field to a float. #define SET_FLOAT(field, value) \ BC_BBH(0x0E, field, value) // Adds an integer to the specified field. #define ADD_INT(field, value) \ BC_BBH(0x0F, field, value) // Sets the specified field to an integer. #define SET_INT(field, value) \ BC_BBH(0x10, field, value) // Performs a bitwise OR with the specified field and the given integer. // Usually used to set an object's flags. #define OR_INT(field, value) \ BC_BBH(0x11, field, value) // Performs a bit clear with the specified short. Unused in favor of the 32-bit version. #define BIT_CLEAR(field, value) \ BC_BBH(0x12, field, value) // TODO: this one needs a better name / labelling // Gets a random short, right shifts it the specified amount and adds min to it, then sets the specified field to that value. #define SET_INT_RAND_RSHIFT(field, min, rshift) \ BC_BBH(0x13, field, min), \ BC_H(rshift) // Sets the specified field to a random float in the given range. #define SET_RANDOM_FLOAT(field, min, range) \ BC_BBH(0x14, field, min), \ BC_H(range) // Sets the specified field to a random integer in the given range. #define SET_RANDOM_INT(field, min, range) \ BC_BBH(0x15, field, min), \ BC_H(range) // Adds a random float in the given range to the specified field. #define ADD_RANDOM_FLOAT(field, min, range) \ BC_BBH(0x16, field, min), \ BC_H(range) // TODO: better name (unused anyway) // Gets a random short, right shifts it the specified amount and adds min to it, then adds the value to the specified field. Unused. #define ADD_INT_RAND_RSHIFT(field, min, rshift) \ BC_BBH(0x17, field, min), \ BC_H(rshift) // No operation. Unused. #define CMD_NOP_1(field) \ BC_BB(0x18, field) // No operation. Unused. #define CMD_NOP_2(field) \ BC_BB(0x19, field) // No operation. Unused. #define CMD_NOP_3(field) \ BC_BB(0x1A, field) // Sets the current model ID of the object. #define SET_MODEL(modelID) \ BC_B0H(0x1B, modelID) // Spawns a child object with the specified model and behavior. #define SPAWN_CHILD(modelID, behavior) \ BC_B(0x1C), \ BC_W(modelID), \ BC_PTR(behavior) // Exits the behavior script and despawns the object. // Often used to end behavior scripts that do not contain an infinite loop. #define DEACTIVATE() \ BC_B(0x1D) // Finds the floor triangle directly under the object and moves the object down to it. #define DROP_TO_FLOOR() \ BC_B(0x1E) // Sets the destination float field to the sum of the values of the given float fields. #define SUM_FLOAT(fieldDst, fieldSrc1, fieldSrc2) \ BC_BBBB(0x1F, fieldDst, fieldSrc1, fieldSrc2) // Sets the destination integer field to the sum of the values of the given integer fields. Unused. #define SUM_INT(fieldDst, fieldSrc1, fieldSrc2) \ BC_BBBB(0x20, fieldDst, fieldSrc1, fieldSrc2) // Billboards the current object, making it always face the camera. #define BILLBOARD() \ BC_B(0x21) #define CYLBOARD() \ BC_B(0x38) // Hides the current object. #define HIDE() \ BC_B(0x22) // Sets the size of the object's cylindrical hitbox. #define SET_HITBOX(radius, height) \ BC_B(0x23), \ BC_HH(radius, height) // No operation. Unused. #define CMD_NOP_4(field, value) \ BC_BBH(0x24, field, value) // Delays the behavior script for the number of frames given by the value of the specified field. #define DELAY_VAR(field) \ BC_BB(0x25, field) // Unused. Marks the start of a loop that will repeat a certain number of times. // Uses a u8 as the argument, instead of a s16 like the other version does. #define BEGIN_REPEAT_UNUSED(count) \ BC_BB(0x26, count) // Loads the animations for the object. is always set to oAnimations. #define LOAD_ANIMATIONS(field, anims) \ BC_BB(0x27, field), \ BC_PTR(anims) // Begins animation and sets the object's current animation index to the specified value. #define ANIMATE(animIndex) \ BC_BB(0x28, animIndex) // Spawns a child object with the specified model and behavior, plus a behavior param. #define SPAWN_CHILD_WITH_PARAM(bhvParam, modelID, behavior) \ BC_B0H(0x29, bhvParam), \ BC_W(modelID), \ BC_PTR(behavior) // Loads collision data for the object. #define LOAD_COLLISION_DATA(collisionData) \ BC_B(0x2A), \ BC_PTR(collisionData) // Sets the size of the object's cylindrical hitbox, and applies a downwards offset. #define SET_HITBOX_WITH_OFFSET(radius, height, downOffset) \ BC_B(0x2B), \ BC_HH(radius, height), \ BC_H(downOffset) // Spawns a new object with the specified model and behavior. #define SPAWN_OBJ(modelID, behavior) \ BC_B(0x2C), \ BC_W(modelID), \ BC_PTR(behavior) // Sets the home position of the object to its current position. #define SET_HOME() \ BC_B(0x2D) // Sets the size of the object's cylindrical hurtbox. #define SET_HURTBOX(radius, height) \ BC_B(0x2E), \ BC_HH(radius, height) // Sets the object's interaction type. #define SET_INTERACT_TYPE(type) \ BC_B(0x2F), \ BC_W(type) // Sets various parameters that the object uses for calculating physics. #define SET_OBJ_PHYSICS(wallHitboxRadius, gravity, bounciness, dragStrength, friction, buoyancy, unused1, unused2) \ BC_B(0x30), \ BC_HH(wallHitboxRadius, gravity), \ BC_HH(bounciness, dragStrength), \ BC_HH(friction, buoyancy), \ BC_HH(unused1, unused2) // Sets the object's interaction subtype. Unused. #define SET_INTERACT_SUBTYPE(subtype) \ BC_B(0x31), \ BC_W(subtype) // Sets the object's size to the specified percentage. #define SCALE(unusedField, percent) \ BC_BBH(0x32, unusedField, percent) // Performs a bit clear on the object's parent's field with the specified value. // Used for clearing active particle flags fron Mario's object. #define PARENT_BIT_CLEAR(field, flags) \ BC_BB(0x33, field), \ BC_W(flags) // Animates an object using texture animation. is always set to oAnimState. #define ANIMATE_TEXTURE(field, rate) \ BC_BBH(0x34, field, rate) // Disables rendering for the object. #define DISABLE_RENDERING() \ BC_B(0x35) // Unused. Sets the specified field to an integer. Wastes 4 bytes of space for no reason at all. #define SET_INT_UNUSED(field, value) \ BC_BB(0x36, field), \ BC_HH(0, value) // Spawns a water droplet with the given parameters. #define SPAWN_WATER_DROPLET(dropletParams) \ BC_B(0x37), \ BC_PTR(dropletParams) // coop // Defines the id of the behavior script #define ID(id) \ BC_B0H(0x39, id) // Jumps to a new behavior command and stores the return address in the object's stack. #define CALL_EXT(addr) \ BC_B(0x3A), \ BC_PTR(addr) // Jumps to a new behavior script without saving anything. #define GOTO_EXT(addr) \ BC_B(0x3B), \ BC_PTR(addr) // Executes a native game function. #define CALL_NATIVE_EXT(func) \ BC_B(0x3C), \ BC_PTR(func) // Spawns a child object with the specified model and behavior. #define SPAWN_CHILD_EXT(modelID, behavior) \ BC_B(0x3D), \ BC_W(modelID), \ BC_PTR(behavior) // Spawns a child object with the specified model and behavior, plus a behavior param. #define SPAWN_CHILD_WITH_PARAM_EXT(bhvParam, modelID, behavior) \ BC_B0H(0x3E, bhvParam), \ BC_W(modelID), \ BC_PTR(behavior) // Spawns a new object with the specified model and behavior. #define SPAWN_OBJ_EXT(modelID, behavior) \ BC_B(0x3F), \ BC_W(modelID), \ BC_PTR(behavior) // Loads the animations for the object. is always set to oAnimations. #define LOAD_ANIMATIONS_EXT(field, anims) \ BC_BB(0x40, field), \ BC_PTR(anims) // Loads collision data for the object. #define LOAD_COLLISION_DATA_EXT(collisionData) \ BC_B(0x41), \ BC_PTR(collisionData) // This is a special case for behaviors hooked from LUA. #define CALL_LUA_FUNC(func) \ BC_B(0x42), \ BC_W(func) #endif // BEHAVIOR_COMMANDS_H