diff --git a/include/types.h b/include/types.h index 63c1e12ad..92cb1e4da 100644 --- a/include/types.h +++ b/include/types.h @@ -386,8 +386,8 @@ struct MarioState // Variables for a spline curve animation (used for the flight path in the grand star cutscene) /*????*/ Vec4s* splineKeyframe; - /*????*/ float splineKeyframeFraction; - /*????*/ int splineState; + /*????*/ f32 splineKeyframeFraction; + /*????*/ s32 splineState; /*????*/ Vec3f nonInstantWarpPos; /*????*/ struct Character* character; diff --git a/mods/constants.lua b/mods/constants.lua index 28b207b35..18331b299 100644 --- a/mods/constants.lua +++ b/mods/constants.lua @@ -1,7 +1,66 @@ +----------- +-- co-op -- +----------- + +MAX_PLAYERS = 16 + +_gMarioStatesIndices = {} +do + _MarioStateMeta = { + __index = function (t,k) + return get_mario_state_field(_gMarioStatesIndices[t], k) + end, + __newindex = function (t,k,v) + set_mario_state_field(_gMarioStatesIndices[t], k, v) + end + } +end + +gMarioStates = {} +for i=0,(MAX_PLAYERS-1) do + gMarioStates[i] = setmetatable({}, _MarioStateMeta) + _gMarioStatesIndices[gMarioStates[i]] = i +end + +_Vec3sMeta = { + __index = function (t,k) + return get_vec3s_field(t['_pointer'], k); + end, + __newindex = function (t,k,v) + set_vec3s_field(t['_pointer'], k, v); + end +} + +_Vec3fMeta = { + __index = function (t,k) + return get_vec3f_field(t['_pointer'], k); + end, + __newindex = function (t,k,v) + set_vec3f_field(t['_pointer'], k, v); + end +} + +_CObject = { + __index = function (t,k) + return _get_field(t['_lot'], t['_pointer'], k); + end, + __newindex = function (t,k,v) + _set_field(t['_lot'], t['_pointer'], k, v); + end +} + +--------- +-- lua -- +--------- + HOOK_UPDATE = 0 HOOK_MARIO_UPDATE = 1 HOOK_MAX = 2 +------------ +-- layers -- +------------ + LAYER_FORCE = 0 LAYER_OPAQUE = 1 LAYER_OPAQUE_DECAL = 2 @@ -11,6 +70,40 @@ LAYER_TRANSPARENT = 5 LAYER_TRANSPARENT_DECAL = 6 LAYER_TRANSPARENT_INTER = 7 +-------------- +-- controls -- +-------------- + +CONT_A = 0x8000 +CONT_B = 0x4000 +CONT_G = 0x2000 +CONT_START = 0x1000 +CONT_UP = 0x0800 +CONT_DOWN = 0x0400 +CONT_LEFT = 0x0200 +CONT_RIGHT = 0x0100 +CONT_L = 0x0020 +CONT_R = 0x0010 +CONT_E = 0x0008 +CONT_D = 0x0004 +CONT_C = 0x0002 +CONT_F = 0x0001 + +A_BUTTON = CONT_A +B_BUTTON = CONT_B +L_TRIG = CONT_L +R_TRIG = CONT_R +Z_TRIG = CONT_G +START_BUTTON = CONT_START +U_JPAD = CONT_UP +L_JPAD = CONT_LEFT +R_JPAD = CONT_RIGHT +D_JPAD = CONT_DOWN +U_CBUTTONS = CONT_E +L_CBUTTONS = CONT_C +R_CBUTTONS = CONT_F +D_CBUTTONS = CONT_D + INPUT_NONZERO_ANALOG = 0x0001 INPUT_A_PRESSED = 0x0002 INPUT_OFF_FLOOR = 0x0004 @@ -28,6 +121,10 @@ INPUT_B_PRESSED = 0x2000 INPUT_Z_DOWN = 0x4000 INPUT_Z_PRESSED = 0x8000 +------------- +-- physics -- +------------- + GROUND_STEP_LEFT_GROUND = 0 GROUND_STEP_NONE = 1 GROUND_STEP_HIT_WALL = 2 @@ -49,6 +146,10 @@ WATER_STEP_HIT_CEILING = 2 WATER_STEP_CANCELLED = 3 WATER_STEP_HIT_WALL = 4 +--------------- +-- particles -- +--------------- + PARTICLE_DUST = (1 << 0) PARTICLE_VERTICAL_STAR = (1 << 1) PARTICLE_2 = (1 << 2) @@ -73,6 +174,10 @@ PARTICLE_19 = (1 << 19) MODEL_STATE_NOISE_ALPHA = 0x180 MODEL_STATE_METAL = 0x200 +---------- +-- caps -- +---------- + MARIO_NORMAL_CAP = 0x00000001 MARIO_VANISH_CAP = 0x00000002 MARIO_METAL_CAP = 0x00000004 @@ -94,6 +199,10 @@ MARIO_UNKNOWN_30 = 0x40000000 MARIO_UNKNOWN_31 = 0x80000000 MARIO_CAP_FLAGS = 0x0000001F +------------- +-- actions -- +------------- + ACT_ID_MASK = 0x000001FF ACT_GROUP_MASK = 0x000001C0 ACT_GROUP_STATIONARY = (0 << 6) @@ -358,3 +467,727 @@ ACT_HEAVY_THROW = 0x80000589 ACT_PICKING_UP_BOWSER = 0x00000390 ACT_HOLDING_BOWSER = 0x00000391 ACT_RELEASING_BOWSER = 0x00000392 + + +------------ +-- sounds -- +------------ + +SOUNDARGS_MASK_BANK = 0xF0000000 +SOUNDARGS_MASK_SOUNDID = 0x00FF0000 +SOUNDARGS_MASK_PRIORITY = 0x0000FF00 +SOUNDARGS_MASK_STATUS = 0x0000000F + +SOUNDARGS_SHIFT_BANK = 28 +SOUNDARGS_SHIFT_SOUNDID = 16 +SOUNDARGS_SHIFT_PRIORITY = 8 + +SOUND_STATUS_STOPPED = 0 +SOUND_STATUS_STARTING = 1 +SOUND_STATUS_PLAYING = 2 + +function SOUND_ARG_LOAD(bank, playFlags, soundID, priority, flags2) + return ((bank << 28) | (playFlags << 24) | (soundID << 16) | (priority << 8) | (flags2 << 4) | 1) +end + +SOUND_LO_BITFLAG_UNK1 = 0x10 +SOUND_NO_ECHO = 0x20 +SOUND_LO_BITFLAG_UNK8 = 0x80 + + +SOUND_NO_VOLUME_LOSS = 0x1000000 +SOUND_VIBRATO = 0x2000000 +SOUND_NO_PRIORITY_LOSS = 0x4000000 +SOUND_NO_FREQUENCY_LOSS = 0x8000000 + +NO_SOUND = 0 + +SOUND_TERRAIN_DEFAULT = 0 +SOUND_TERRAIN_GRASS = 1 +SOUND_TERRAIN_WATER = 2 +SOUND_TERRAIN_STONE = 3 +SOUND_TERRAIN_SPOOKY = 4 +SOUND_TERRAIN_SNOW = 5 +SOUND_TERRAIN_ICE = 6 +SOUND_TERRAIN_SAND = 7 + +SOUND_ACTION_TERRAIN_JUMP = SOUND_ARG_LOAD(0, 4, 0x00, 0x80, 8) +SOUND_ACTION_TERRAIN_LANDING = SOUND_ARG_LOAD(0, 4, 0x08, 0x80, 8) +SOUND_ACTION_TERRAIN_STEP = SOUND_ARG_LOAD(0, 6, 0x10, 0x80, 8) +SOUND_ACTION_TERRAIN_BODY_HIT_GROUND = SOUND_ARG_LOAD(0, 4, 0x18, 0x80, 8) +SOUND_ACTION_TERRAIN_STEP_TIPTOE = SOUND_ARG_LOAD(0, 6, 0x20, 0x80, 8) +SOUND_ACTION_TERRAIN_STUCK_IN_GROUND = SOUND_ARG_LOAD(0, 4, 0x48, 0x80, 8) +SOUND_ACTION_TERRAIN_HEAVY_LANDING = SOUND_ARG_LOAD(0, 4, 0x60, 0x80, 8) + +SOUND_ACTION_METAL_JUMP = SOUND_ARG_LOAD(0, 4, 0x28, 0x90, 8) +SOUND_ACTION_METAL_LANDING = SOUND_ARG_LOAD(0, 4, 0x29, 0x90, 8) +SOUND_ACTION_METAL_STEP = SOUND_ARG_LOAD(0, 4, 0x2A, 0x90, 8) +SOUND_ACTION_METAL_HEAVY_LANDING = SOUND_ARG_LOAD(0, 4, 0x2B, 0x90, 8) +SOUND_ACTION_CLAP_HANDS_COLD = SOUND_ARG_LOAD(0, 6, 0x2C, 0x00, 8) +SOUND_ACTION_HANGING_STEP = SOUND_ARG_LOAD(0, 4, 0x2D, 0xA0, 8) +SOUND_ACTION_QUICKSAND_STEP = SOUND_ARG_LOAD(0, 4, 0x2E, 0x00, 8) +SOUND_ACTION_METAL_STEP_TIPTOE = SOUND_ARG_LOAD(0, 4, 0x2F, 0x90, 8) +SOUND_ACTION_UNKNOWN430 = SOUND_ARG_LOAD(0, 4, 0x30, 0xC0, 8) +SOUND_ACTION_UNKNOWN431 = SOUND_ARG_LOAD(0, 4, 0x31, 0x60, 8) +SOUND_ACTION_UNKNOWN432 = SOUND_ARG_LOAD(0, 4, 0x32, 0x80, 8) +SOUND_ACTION_SWIM = SOUND_ARG_LOAD(0, 4, 0x33, 0x80, 8) +SOUND_ACTION_UNKNOWN434 = SOUND_ARG_LOAD(0, 4, 0x34, 0x80, 8) +SOUND_ACTION_THROW = SOUND_ARG_LOAD(0, 4, 0x35, 0x80, 8) +SOUND_ACTION_KEY_SWISH = SOUND_ARG_LOAD(0, 4, 0x36, 0x80, 8) +SOUND_ACTION_SPIN = SOUND_ARG_LOAD(0, 4, 0x37, 0x80, 8) +SOUND_ACTION_TWIRL = SOUND_ARG_LOAD(0, 4, 0x38, 0x80, 8) +SOUND_ACTION_CLIMB_UP_TREE = SOUND_ARG_LOAD(0, 4, 0x3A, 0x80, 8) +SOUND_ACTION_CLIMB_DOWN_TREE = 0x003B +SOUND_ACTION_UNK3C = 0x003C +SOUND_ACTION_UNKNOWN43D = SOUND_ARG_LOAD(0, 4, 0x3D, 0x80, 8) +SOUND_ACTION_UNKNOWN43E = SOUND_ARG_LOAD(0, 4, 0x3E, 0x80, 8) +SOUND_ACTION_PAT_BACK = SOUND_ARG_LOAD(0, 4, 0x3F, 0x80, 8) +SOUND_ACTION_BRUSH_HAIR = SOUND_ARG_LOAD(0, 4, 0x40, 0x80, 8) +SOUND_ACTION_CLIMB_UP_POLE = SOUND_ARG_LOAD(0, 4, 0x41, 0x80, 8) +SOUND_ACTION_METAL_BONK = SOUND_ARG_LOAD(0, 4, 0x42, 0x80, 8) +SOUND_ACTION_UNSTUCK_FROM_GROUND = SOUND_ARG_LOAD(0, 4, 0x43, 0x80, 8) +SOUND_ACTION_HIT = SOUND_ARG_LOAD(0, 4, 0x44, 0xC0, 8) +SOUND_ACTION_HIT_2 = SOUND_ARG_LOAD(0, 4, 0x44, 0xB0, 8) +SOUND_ACTION_HIT_3 = SOUND_ARG_LOAD(0, 4, 0x44, 0xA0, 8) +SOUND_ACTION_BONK = SOUND_ARG_LOAD(0, 4, 0x45, 0xA0, 8) +SOUND_ACTION_SHRINK_INTO_BBH = SOUND_ARG_LOAD(0, 4, 0x46, 0xA0, 8) +SOUND_ACTION_SWIM_FAST = SOUND_ARG_LOAD(0, 4, 0x47, 0xA0, 8) +SOUND_ACTION_METAL_JUMP_WATER = SOUND_ARG_LOAD(0, 4, 0x50, 0x90, 8) +SOUND_ACTION_METAL_LAND_WATER = SOUND_ARG_LOAD(0, 4, 0x51, 0x90, 8) +SOUND_ACTION_METAL_STEP_WATER = SOUND_ARG_LOAD(0, 4, 0x52, 0x90, 8) +SOUND_ACTION_UNK53 = 0x0053 +SOUND_ACTION_UNK54 = 0x0054 +SOUND_ACTION_UNK55 = 0x0055 +SOUND_ACTION_FLYING_FAST = SOUND_ARG_LOAD(0, 4, 0x56, 0x80, 8) +SOUND_ACTION_TELEPORT = SOUND_ARG_LOAD(0, 4, 0x57, 0xC0, 8) +SOUND_ACTION_UNKNOWN458 = SOUND_ARG_LOAD(0, 4, 0x58, 0xA0, 8) +SOUND_ACTION_BOUNCE_OFF_OBJECT = SOUND_ARG_LOAD(0, 4, 0x59, 0xB0, 8) +SOUND_ACTION_SIDE_FLIP_UNK = SOUND_ARG_LOAD(0, 4, 0x5A, 0x80, 8) +SOUND_ACTION_READ_SIGN = SOUND_ARG_LOAD(0, 4, 0x5B, 0xFF, 8) +SOUND_ACTION_UNKNOWN45C = SOUND_ARG_LOAD(0, 4, 0x5C, 0x80, 8) +SOUND_ACTION_UNK5D = 0x005D +SOUND_ACTION_INTRO_UNK45E = SOUND_ARG_LOAD(0, 4, 0x5E, 0x80, 8) +SOUND_ACTION_INTRO_UNK45F = SOUND_ARG_LOAD(0, 4, 0x5F, 0x80, 8) + +SOUND_MOVING_TERRAIN_SLIDE = SOUND_ARG_LOAD(1, 4, 0x00, 0x00, 0) +SOUND_MOVING_TERRAIN_RIDING_SHELL = SOUND_ARG_LOAD(1, 4, 0x20, 0x00, 0) + +SOUND_MOVING_LAVA_BURN = SOUND_ARG_LOAD(1, 4, 0x10, 0x00, 0) +SOUND_MOVING_SLIDE_DOWN_POLE = SOUND_ARG_LOAD(1, 4, 0x11, 0x00, 0) +SOUND_MOVING_SLIDE_DOWN_TREE = SOUND_ARG_LOAD(1, 4, 0x12, 0x80, 0) +SOUND_MOVING_QUICKSAND_DEATH = SOUND_ARG_LOAD(1, 4, 0x14, 0x00, 0) +SOUND_MOVING_SHOCKED = SOUND_ARG_LOAD(1, 4, 0x16, 0x00, 0) +SOUND_MOVING_FLYING = SOUND_ARG_LOAD(1, 4, 0x17, 0x00, 0) +SOUND_MOVING_ALMOST_DROWNING = SOUND_ARG_LOAD(1, 0xC, 0x18, 0x00, 0) +SOUND_MOVING_AIM_CANNON = SOUND_ARG_LOAD(1, 0xD, 0x19, 0x20, 0) +SOUND_MOVING_UNK1A = 0x101A +SOUND_MOVING_RIDING_SHELL_LAVA = SOUND_ARG_LOAD(1, 4, 0x28, 0x00, 0) + +SOUND_MARIO_YAH_WAH_HOO = SOUND_ARG_LOAD(2, 4, 0x00, 0x80, 8) +SOUND_MARIO_HOOHOO = SOUND_ARG_LOAD(2, 4, 0x03, 0x80, 8) +SOUND_MARIO_YAHOO = SOUND_ARG_LOAD(2, 4, 0x04, 0x80, 8) +SOUND_MARIO_UH = SOUND_ARG_LOAD(2, 4, 0x05, 0x80, 8) +SOUND_MARIO_HRMM = SOUND_ARG_LOAD(2, 4, 0x06, 0x80, 8) +SOUND_MARIO_WAH2 = SOUND_ARG_LOAD(2, 4, 0x07, 0x80, 8) +SOUND_MARIO_WHOA = SOUND_ARG_LOAD(2, 4, 0x08, 0xC0, 8) +SOUND_MARIO_EEUH = SOUND_ARG_LOAD(2, 4, 0x09, 0x80, 8) +SOUND_MARIO_ATTACKED = SOUND_ARG_LOAD(2, 4, 0x0A, 0xFF, 8) +SOUND_MARIO_OOOF = SOUND_ARG_LOAD(2, 4, 0x0B, 0x80, 8) +SOUND_MARIO_OOOF2 = SOUND_ARG_LOAD(2, 4, 0x0B, 0xD0, 8) +SOUND_MARIO_HERE_WE_GO = SOUND_ARG_LOAD(2, 4, 0x0C, 0x80, 8) +SOUND_MARIO_YAWNING = SOUND_ARG_LOAD(2, 4, 0x0D, 0x80, 8) +SOUND_MARIO_SNORING1 = SOUND_ARG_LOAD(2, 4, 0x0E, 0x00, 8) +SOUND_MARIO_SNORING2 = SOUND_ARG_LOAD(2, 4, 0x0F, 0x00, 8) +SOUND_MARIO_WAAAOOOW = SOUND_ARG_LOAD(2, 4, 0x10, 0xC0, 8) +SOUND_MARIO_HAHA = SOUND_ARG_LOAD(2, 4, 0x11, 0x80, 8) +SOUND_MARIO_HAHA_2 = SOUND_ARG_LOAD(2, 4, 0x11, 0xF0, 8) +SOUND_MARIO_UH2 = SOUND_ARG_LOAD(2, 4, 0x13, 0xD0, 8) +SOUND_MARIO_UH2_2 = SOUND_ARG_LOAD(2, 4, 0x13, 0x80, 8) +SOUND_MARIO_ON_FIRE = SOUND_ARG_LOAD(2, 4, 0x14, 0xA0, 8) +SOUND_MARIO_DYING = SOUND_ARG_LOAD(2, 4, 0x15, 0xFF, 8) +SOUND_MARIO_PANTING_COLD = SOUND_ARG_LOAD(2, 4, 0x16, 0x80, 8) + +SOUND_MARIO_PANTING = SOUND_ARG_LOAD(2, 4, 0x18, 0x80, 8) + +SOUND_MARIO_COUGHING1 = SOUND_ARG_LOAD(2, 4, 0x1B, 0x80, 8) +SOUND_MARIO_COUGHING2 = SOUND_ARG_LOAD(2, 4, 0x1C, 0x80, 8) +SOUND_MARIO_COUGHING3 = SOUND_ARG_LOAD(2, 4, 0x1D, 0x80, 8) +SOUND_MARIO_PUNCH_YAH = SOUND_ARG_LOAD(2, 4, 0x1E, 0x80, 8) +SOUND_MARIO_PUNCH_HOO = SOUND_ARG_LOAD(2, 4, 0x1F, 0x80, 8) +SOUND_MARIO_MAMA_MIA = SOUND_ARG_LOAD(2, 4, 0x20, 0x80, 8) +SOUND_MARIO_OKEY_DOKEY = 0x2021 +SOUND_MARIO_GROUND_POUND_WAH = SOUND_ARG_LOAD(2, 4, 0x22, 0x80, 8) +SOUND_MARIO_DROWNING = SOUND_ARG_LOAD(2, 4, 0x23, 0xF0, 8) +SOUND_MARIO_PUNCH_WAH = SOUND_ARG_LOAD(2, 4, 0x24, 0x80, 8) + +SOUND_PEACH_DEAR_MARIO = SOUND_ARG_LOAD(2, 4, 0x28, 0xFF, 8) + +SOUND_MARIO_YAHOO_WAHA_YIPPEE = SOUND_ARG_LOAD(2, 4, 0x2B, 0x80, 8) + +SOUND_MARIO_DOH = SOUND_ARG_LOAD(2, 4, 0x30, 0x80, 8) +SOUND_MARIO_GAME_OVER = SOUND_ARG_LOAD(2, 4, 0x31, 0xFF, 8) +SOUND_MARIO_HELLO = SOUND_ARG_LOAD(2, 4, 0x32, 0xFF, 8) +SOUND_MARIO_PRESS_START_TO_PLAY = SOUND_ARG_LOAD(2, 4, 0x33, 0xFF, 0xA) +SOUND_MARIO_TWIRL_BOUNCE = SOUND_ARG_LOAD(2, 4, 0x34, 0x80, 8) +SOUND_MARIO_SNORING3 = SOUND_ARG_LOAD(2, 4, 0x35, 0x00, 8) +SOUND_MARIO_SO_LONGA_BOWSER = SOUND_ARG_LOAD(2, 4, 0x36, 0x80, 8) +SOUND_MARIO_IMA_TIRED = SOUND_ARG_LOAD(2, 4, 0x37, 0x80, 8) + +SOUND_PEACH_MARIO = SOUND_ARG_LOAD(2, 4, 0x38, 0xFF, 8) +SOUND_PEACH_POWER_OF_THE_STARS = SOUND_ARG_LOAD(2, 4, 0x39, 0xFF, 8) +SOUND_PEACH_THANKS_TO_YOU = SOUND_ARG_LOAD(2, 4, 0x3A, 0xFF, 8) +SOUND_PEACH_THANK_YOU_MARIO = SOUND_ARG_LOAD(2, 4, 0x3B, 0xFF, 8) +SOUND_PEACH_SOMETHING_SPECIAL = SOUND_ARG_LOAD(2, 4, 0x3C, 0xFF, 8) +SOUND_PEACH_BAKE_A_CAKE = SOUND_ARG_LOAD(2, 4, 0x3D, 0xFF, 8) +SOUND_PEACH_FOR_MARIO = SOUND_ARG_LOAD(2, 4, 0x3E, 0xFF, 8) +SOUND_PEACH_MARIO2 = SOUND_ARG_LOAD(2, 4, 0x3F, 0xFF, 8) + +SOUND_GENERAL_ACTIVATE_CAP_SWITCH = SOUND_ARG_LOAD(3, 0, 0x00, 0x80, 8) +SOUND_GENERAL_FLAME_OUT = SOUND_ARG_LOAD(3, 0, 0x03, 0x80, 8) +SOUND_GENERAL_OPEN_WOOD_DOOR = SOUND_ARG_LOAD(3, 0, 0x04, 0xC0, 8) +SOUND_GENERAL_CLOSE_WOOD_DOOR = SOUND_ARG_LOAD(3, 0, 0x05, 0xC0, 8) +SOUND_GENERAL_OPEN_IRON_DOOR = SOUND_ARG_LOAD(3, 0, 0x06, 0xC0, 8) +SOUND_GENERAL_CLOSE_IRON_DOOR = SOUND_ARG_LOAD(3, 0, 0x07, 0xC0, 8) +SOUND_GENERAL_BUBBLES = 0x3008 +SOUND_GENERAL_MOVING_WATER = SOUND_ARG_LOAD(3, 0, 0x09, 0x00, 8) +SOUND_GENERAL_SWISH_WATER = SOUND_ARG_LOAD(3, 0, 0x0A, 0x00, 8) +SOUND_GENERAL_QUIET_BUBBLE = SOUND_ARG_LOAD(3, 0, 0x0B, 0x00, 8) +SOUND_GENERAL_VOLCANO_EXPLOSION = SOUND_ARG_LOAD(3, 0, 0x0C, 0x80, 8) +SOUND_GENERAL_QUIET_BUBBLE2 = SOUND_ARG_LOAD(3, 0, 0x0D, 0x00, 8) +SOUND_GENERAL_CASTLE_TRAP_OPEN = SOUND_ARG_LOAD(3, 0, 0x0E, 0x80, 8) +SOUND_GENERAL_WALL_EXPLOSION = SOUND_ARG_LOAD(3, 0, 0x0F, 0x00, 8) +SOUND_GENERAL_COIN = SOUND_ARG_LOAD(3, 8, 0x11, 0x80, 8) +SOUND_GENERAL_COIN_WATER = SOUND_ARG_LOAD(3, 8, 0x12, 0x80, 8) +SOUND_GENERAL_SHORT_STAR = SOUND_ARG_LOAD(3, 0, 0x16, 0x00, 9) +SOUND_GENERAL_BIG_CLOCK = SOUND_ARG_LOAD(3, 0, 0x17, 0x00, 8) +SOUND_GENERAL_LOUD_POUND = 0x3018 +SOUND_GENERAL_LOUD_POUND2 = 0x3019 +SOUND_GENERAL_SHORT_POUND1 = 0x301A +SOUND_GENERAL_SHORT_POUND2 = 0x301B +SOUND_GENERAL_SHORT_POUND3 = 0x301C +SOUND_GENERAL_SHORT_POUND4 = 0x301D +SOUND_GENERAL_SHORT_POUND5 = 0x301E +SOUND_GENERAL_SHORT_POUND6 = 0x301F +SOUND_GENERAL_OPEN_CHEST = SOUND_ARG_LOAD(3, 1, 0x20, 0x80, 8) +SOUND_GENERAL_CLAM_SHELL1 = SOUND_ARG_LOAD(3, 1, 0x22, 0x80, 8) +SOUND_GENERAL_BOX_LANDING = SOUND_ARG_LOAD(3, 0, 0x24, 0x00, 8) +SOUND_GENERAL_BOX_LANDING_2 = SOUND_ARG_LOAD(3, 2, 0x24, 0x00, 8) +SOUND_GENERAL_UNKNOWN1 = SOUND_ARG_LOAD(3, 0, 0x25, 0x00, 8) +SOUND_GENERAL_UNKNOWN1_2 = SOUND_ARG_LOAD(3, 2, 0x25, 0x00, 8) +SOUND_GENERAL_CLAM_SHELL2 = SOUND_ARG_LOAD(3, 0, 0x26, 0x40, 8) +SOUND_GENERAL_CLAM_SHELL3 = SOUND_ARG_LOAD(3, 0, 0x27, 0x40, 8) +SOUND_GENERAL_PAINTING_EJECT = SOUND_ARG_LOAD(3, 9, 0x28, 0x00, 8) +SOUND_GENERAL_LEVEL_SELECT_CHANGE = SOUND_ARG_LOAD(3, 0, 0x2B, 0x00, 8) +SOUND_GENERAL_PLATFORM = SOUND_ARG_LOAD(3, 0, 0x2D, 0x80, 8) +SOUND_GENERAL_DONUT_PLATFORM_EXPLOSION = SOUND_ARG_LOAD(3, 0, 0x2E, 0x20, 8) +SOUND_GENERAL_BOWSER_BOMB_EXPLOSION = SOUND_ARG_LOAD(3, 1, 0x2F, 0x00, 8) +SOUND_GENERAL_COIN_SPURT = SOUND_ARG_LOAD(3, 0, 0x30, 0x00, 8) +SOUND_GENERAL_COIN_SPURT_2 = SOUND_ARG_LOAD(3, 8, 0x30, 0x00, 8) +SOUND_GENERAL_COIN_SPURT_EU = SOUND_ARG_LOAD(3, 8, 0x30, 0x20, 8) + +SOUND_GENERAL_EXPLOSION6 = 0x3031 +SOUND_GENERAL_UNK32 = 0x3032 +SOUND_GENERAL_BOAT_TILT1 = SOUND_ARG_LOAD(3, 0, 0x34, 0x40, 8) +SOUND_GENERAL_BOAT_TILT2 = SOUND_ARG_LOAD(3, 0, 0x35, 0x40, 8) +SOUND_GENERAL_COIN_DROP = SOUND_ARG_LOAD(3, 0, 0x36, 0x40, 8) +SOUND_GENERAL_UNKNOWN3_LOWPRIO = SOUND_ARG_LOAD(3, 0, 0x37, 0x00, 8) +SOUND_GENERAL_UNKNOWN3 = SOUND_ARG_LOAD(3, 0, 0x37, 0x80, 8) +SOUND_GENERAL_UNKNOWN3_2 = SOUND_ARG_LOAD(3, 8, 0x37, 0x80, 8) +SOUND_GENERAL_PENDULUM_SWING = SOUND_ARG_LOAD(3, 0, 0x38, 0x00, 8) +SOUND_GENERAL_CHAIN_CHOMP1 = SOUND_ARG_LOAD(3, 0, 0x39, 0x00, 8) +SOUND_GENERAL_CHAIN_CHOMP2 = SOUND_ARG_LOAD(3, 0, 0x3A, 0x00, 8) +SOUND_GENERAL_DOOR_TURN_KEY = SOUND_ARG_LOAD(3, 0, 0x3B, 0x00, 8) +SOUND_GENERAL_MOVING_IN_SAND = SOUND_ARG_LOAD(3, 0, 0x3C, 0x00, 8) +SOUND_GENERAL_UNKNOWN4_LOWPRIO = SOUND_ARG_LOAD(3, 0, 0x3D, 0x00, 8) +SOUND_GENERAL_UNKNOWN4 = SOUND_ARG_LOAD(3, 0, 0x3D, 0x80, 8) +SOUND_GENERAL_MOVING_PLATFORM_SWITCH = SOUND_ARG_LOAD(3, 0, 0x3E, 0x00, 8) +SOUND_GENERAL_CAGE_OPEN = SOUND_ARG_LOAD(3, 0, 0x3F, 0xA0, 8) +SOUND_GENERAL_QUIET_POUND1_LOWPRIO = SOUND_ARG_LOAD(3, 0, 0x40, 0x00, 8) +SOUND_GENERAL_QUIET_POUND1 = SOUND_ARG_LOAD(3, 0, 0x40, 0x40, 8) +SOUND_GENERAL_BREAK_BOX = SOUND_ARG_LOAD(3, 0, 0x41, 0xC0, 8) +SOUND_GENERAL_DOOR_INSERT_KEY = SOUND_ARG_LOAD(3, 0, 0x42, 0x00, 8) +SOUND_GENERAL_QUIET_POUND2 = SOUND_ARG_LOAD(3, 0, 0x43, 0x00, 8) +SOUND_GENERAL_BIG_POUND = SOUND_ARG_LOAD(3, 0, 0x44, 0x00, 8) +SOUND_GENERAL_UNK45 = SOUND_ARG_LOAD(3, 0, 0x45, 0x00, 8) +SOUND_GENERAL_UNK46_LOWPRIO = SOUND_ARG_LOAD(3, 0, 0x46, 0x00, 8) +SOUND_GENERAL_UNK46 = SOUND_ARG_LOAD(3, 0, 0x46, 0x80, 8) +SOUND_GENERAL_CANNON_UP = SOUND_ARG_LOAD(3, 0, 0x47, 0x80, 8) +SOUND_GENERAL_GRINDEL_ROLL = SOUND_ARG_LOAD(3, 0, 0x48, 0x00, 8) +SOUND_GENERAL_EXPLOSION7 = 0x3049 +SOUND_GENERAL_SHAKE_COFFIN = 0x304A +SOUND_GENERAL_RACE_GUN_SHOT = SOUND_ARG_LOAD(3, 1, 0x4D, 0x40, 8) +SOUND_GENERAL_STAR_DOOR_OPEN = SOUND_ARG_LOAD(3, 0, 0x4E, 0xC0, 8) +SOUND_GENERAL_STAR_DOOR_CLOSE = SOUND_ARG_LOAD(3, 0, 0x4F, 0xC0, 8) +SOUND_GENERAL_POUND_ROCK = SOUND_ARG_LOAD(3, 0, 0x56, 0x00, 8) +SOUND_GENERAL_STAR_APPEARS = SOUND_ARG_LOAD(3, 0, 0x57, 0xFF, 9) +SOUND_GENERAL_COLLECT_1UP = SOUND_ARG_LOAD(3, 0, 0x58, 0xFF, 8) +SOUND_GENERAL_BUTTON_PRESS_LOWPRIO = SOUND_ARG_LOAD(3, 0, 0x5A, 0x00, 8) +SOUND_GENERAL_BUTTON_PRESS = SOUND_ARG_LOAD(3, 0, 0x5A, 0x40, 8) +SOUND_GENERAL_BUTTON_PRESS_2_LOWPRIO = SOUND_ARG_LOAD(3, 1, 0x5A, 0x00, 8) +SOUND_GENERAL_BUTTON_PRESS_2 = SOUND_ARG_LOAD(3, 1, 0x5A, 0x40, 8) +SOUND_GENERAL_ELEVATOR_MOVE = SOUND_ARG_LOAD(3, 0, 0x5B, 0x00, 8) +SOUND_GENERAL_ELEVATOR_MOVE_2 = SOUND_ARG_LOAD(3, 1, 0x5B, 0x00, 8) +SOUND_GENERAL_SWISH_AIR = SOUND_ARG_LOAD(3, 0, 0x5C, 0x00, 8) +SOUND_GENERAL_SWISH_AIR_2 = SOUND_ARG_LOAD(3, 1, 0x5C, 0x00, 8) +SOUND_GENERAL_HAUNTED_CHAIR = SOUND_ARG_LOAD(3, 0, 0x5D, 0x00, 8) +SOUND_GENERAL_SOFT_LANDING = SOUND_ARG_LOAD(3, 0, 0x5E, 0x00, 8) +SOUND_GENERAL_HAUNTED_CHAIR_MOVE = SOUND_ARG_LOAD(3, 0, 0x5F, 0x00, 8) +SOUND_GENERAL_BOWSER_PLATFORM = SOUND_ARG_LOAD(3, 0, 0x62, 0x80, 8) +SOUND_GENERAL_BOWSER_PLATFORM_2 = SOUND_ARG_LOAD(3, 1, 0x62, 0x80, 8) +SOUND_GENERAL_HEART_SPIN = SOUND_ARG_LOAD(3, 0, 0x64, 0xC0, 8) +SOUND_GENERAL_POUND_WOOD_POST = SOUND_ARG_LOAD(3, 0, 0x65, 0xC0, 8) +SOUND_GENERAL_WATER_LEVEL_TRIG = SOUND_ARG_LOAD(3, 0, 0x66, 0x80, 8) +SOUND_GENERAL_SWITCH_DOOR_OPEN = SOUND_ARG_LOAD(3, 0, 0x67, 0xA0, 8) +SOUND_GENERAL_RED_COIN = SOUND_ARG_LOAD(3, 0, 0x68, 0x90, 8) +SOUND_GENERAL_BIRDS_FLY_AWAY = SOUND_ARG_LOAD(3, 0, 0x69, 0x00, 8) +SOUND_GENERAL_METAL_POUND = SOUND_ARG_LOAD(3, 0, 0x6B, 0x80, 8) +SOUND_GENERAL_BOING1 = SOUND_ARG_LOAD(3, 0, 0x6C, 0x40, 8) +SOUND_GENERAL_BOING2_LOWPRIO = SOUND_ARG_LOAD(3, 0, 0x6D, 0x20, 8) +SOUND_GENERAL_BOING2 = SOUND_ARG_LOAD(3, 0, 0x6D, 0x40, 8) +SOUND_GENERAL_YOSHI_WALK = SOUND_ARG_LOAD(3, 0, 0x6E, 0x20, 8) +SOUND_GENERAL_ENEMY_ALERT1 = SOUND_ARG_LOAD(3, 0, 0x6F, 0x30, 8) +SOUND_GENERAL_YOSHI_TALK = SOUND_ARG_LOAD(3, 0, 0x70, 0x30, 8) +SOUND_GENERAL_SPLATTERING = SOUND_ARG_LOAD(3, 0, 0x71, 0x30, 8) +SOUND_GENERAL_BOING3 = 0x3072 +SOUND_GENERAL_GRAND_STAR = SOUND_ARG_LOAD(3, 0, 0x73, 0x00, 8) +SOUND_GENERAL_GRAND_STAR_JUMP = SOUND_ARG_LOAD(3, 0, 0x74, 0x00, 8) +SOUND_GENERAL_BOAT_ROCK = SOUND_ARG_LOAD(3, 0, 0x75, 0x00, 8) +SOUND_GENERAL_VANISH_SFX = SOUND_ARG_LOAD(3, 0, 0x76, 0x20, 8) + +SOUND_ENV_WATERFALL1 = SOUND_ARG_LOAD(4, 0, 0x00, 0x00, 0) +SOUND_ENV_WATERFALL2 = SOUND_ARG_LOAD(4, 0, 0x01, 0x00, 0) +SOUND_ENV_ELEVATOR1 = SOUND_ARG_LOAD(4, 0, 0x02, 0x00, 0) +SOUND_ENV_DRONING1 = SOUND_ARG_LOAD(4, 1, 0x03, 0x00, 0) +SOUND_ENV_DRONING2 = SOUND_ARG_LOAD(4, 0, 0x04, 0x00, 0) +SOUND_ENV_WIND1 = SOUND_ARG_LOAD(4, 0, 0x05, 0x00, 0) +SOUND_ENV_MOVING_SAND_SNOW = 0x4006 +SOUND_ENV_UNK07 = 0x4007 +SOUND_ENV_ELEVATOR2 = SOUND_ARG_LOAD(4, 0, 0x08, 0x00, 0) +SOUND_ENV_WATER = SOUND_ARG_LOAD(4, 0, 0x09, 0x00, 0) +SOUND_ENV_UNKNOWN2 = SOUND_ARG_LOAD(4, 0, 0x0A, 0x00, 0) +SOUND_ENV_BOAT_ROCKING1 = SOUND_ARG_LOAD(4, 0, 0x0B, 0x00, 0) +SOUND_ENV_ELEVATOR3 = SOUND_ARG_LOAD(4, 0, 0x0C, 0x00, 0) +SOUND_ENV_ELEVATOR4 = SOUND_ARG_LOAD(4, 0, 0x0D, 0x00, 0) +SOUND_ENV_ELEVATOR4_2 = SOUND_ARG_LOAD(4, 1, 0x0D, 0x00, 0) +SOUND_ENV_MOVINGSAND = SOUND_ARG_LOAD(4, 0, 0x0E, 0x00, 0) +SOUND_ENV_MERRY_GO_ROUND_CREAKING = SOUND_ARG_LOAD(4, 0, 0x0F, 0x40, 0) +SOUND_ENV_WIND2 = SOUND_ARG_LOAD(4, 0, 0x10, 0x80, 0) +SOUND_ENV_UNK12 = 0x4012 +SOUND_ENV_SLIDING = SOUND_ARG_LOAD(4, 0, 0x13, 0x00, 0) +SOUND_ENV_STAR = SOUND_ARG_LOAD(4, 0, 0x14, 0x00, 1) +SOUND_ENV_UNKNOWN4 = SOUND_ARG_LOAD(4, 1, 0x15, 0x00, 0) +SOUND_ENV_WATER_DRAIN = SOUND_ARG_LOAD(4, 1, 0x16, 0x00, 0) +SOUND_ENV_METAL_BOX_PUSH = SOUND_ARG_LOAD(4, 0, 0x17, 0x80, 0) +SOUND_ENV_SINK_QUICKSAND = SOUND_ARG_LOAD(4, 0, 0x18, 0x80, 0) + +SOUND_OBJ_SUSHI_SHARK_WATER_SOUND = SOUND_ARG_LOAD(5, 0, 0x00, 0x80, 8) +SOUND_OBJ_MRI_SHOOT = SOUND_ARG_LOAD(5, 0, 0x01, 0x00, 8) +SOUND_OBJ_BABY_PENGUIN_WALK = SOUND_ARG_LOAD(5, 0, 0x02, 0x00, 8) +SOUND_OBJ_BOWSER_WALK = SOUND_ARG_LOAD(5, 0, 0x03, 0x00, 8) +SOUND_OBJ_BOWSER_TAIL_PICKUP = SOUND_ARG_LOAD(5, 0, 0x05, 0x00, 8) +SOUND_OBJ_BOWSER_DEFEATED = SOUND_ARG_LOAD(5, 0, 0x06, 0x00, 8) +SOUND_OBJ_BOWSER_SPINNING = SOUND_ARG_LOAD(5, 0, 0x07, 0x00, 8) +SOUND_OBJ_BOWSER_INHALING = SOUND_ARG_LOAD(5, 0, 0x08, 0x00, 8) +SOUND_OBJ_BIG_PENGUIN_WALK = SOUND_ARG_LOAD(5, 0, 0x09, 0x80, 8) +SOUND_OBJ_BOO_BOUNCE_TOP = SOUND_ARG_LOAD(5, 0, 0x0A, 0x00, 8) +SOUND_OBJ_BOO_LAUGH_SHORT = SOUND_ARG_LOAD(5, 0, 0x0B, 0x00, 8) +SOUND_OBJ_THWOMP = SOUND_ARG_LOAD(5, 0, 0x0C, 0xA0, 8) +SOUND_OBJ_CANNON1 = SOUND_ARG_LOAD(5, 0, 0x0D, 0xF0, 8) +SOUND_OBJ_CANNON2 = SOUND_ARG_LOAD(5, 0, 0x0E, 0xF0, 8) +SOUND_OBJ_CANNON3 = SOUND_ARG_LOAD(5, 0, 0x0F, 0xF0, 8) +SOUND_OBJ_JUMP_WALK_WATER = 0x5012 +SOUND_OBJ_UNKNOWN2 = SOUND_ARG_LOAD(5, 0, 0x13, 0x00, 8) +SOUND_OBJ_MRI_DEATH = SOUND_ARG_LOAD(5, 0, 0x14, 0x00, 8) +SOUND_OBJ_POUNDING1 = SOUND_ARG_LOAD(5, 0, 0x15, 0x50, 8) +SOUND_OBJ_POUNDING1_HIGHPRIO = SOUND_ARG_LOAD(5, 0, 0x15, 0x80, 8) +SOUND_OBJ_WHOMP_LOWPRIO = SOUND_ARG_LOAD(5, 0, 0x16, 0x60, 8) +SOUND_OBJ_KING_BOBOMB = SOUND_ARG_LOAD(5, 0, 0x16, 0x80, 8) +SOUND_OBJ_BULLY_METAL = SOUND_ARG_LOAD(5, 0, 0x17, 0x80, 8) +SOUND_OBJ_BULLY_EXPLODE = SOUND_ARG_LOAD(5, 0, 0x18, 0xA0, 8) +SOUND_OBJ_BULLY_EXPLODE_2 = SOUND_ARG_LOAD(5, 1, 0x18, 0xA0, 8) +SOUND_OBJ_POUNDING_CANNON = SOUND_ARG_LOAD(5, 0, 0x1A, 0x50, 8) +SOUND_OBJ_BULLY_WALK = SOUND_ARG_LOAD(5, 0, 0x1B, 0x30, 8) +SOUND_OBJ_UNKNOWN3 = SOUND_ARG_LOAD(5, 0, 0x1D, 0x80, 8) +SOUND_OBJ_UNKNOWN4 = SOUND_ARG_LOAD(5, 0, 0x1E, 0xA0, 8) +SOUND_OBJ_BABY_PENGUIN_DIVE = SOUND_ARG_LOAD(5, 0, 0x1F, 0x40, 8) +SOUND_OBJ_GOOMBA_WALK = SOUND_ARG_LOAD(5, 0, 0x20, 0x00, 8) +SOUND_OBJ_UKIKI_CHATTER_LONG = SOUND_ARG_LOAD(5, 0, 0x21, 0x00, 8) +SOUND_OBJ_MONTY_MOLE_ATTACK = SOUND_ARG_LOAD(5, 0, 0x22, 0x00, 8) +SOUND_OBJ_EVIL_LAKITU_THROW = SOUND_ARG_LOAD(5, 0, 0x22, 0x20, 8) +SOUND_OBJ_UNK23 = 0x5023 +SOUND_OBJ_DYING_ENEMY1 = SOUND_ARG_LOAD(5, 0, 0x24, 0x40, 8) +SOUND_OBJ_CANNON4 = SOUND_ARG_LOAD(5, 0, 0x25, 0x40, 8) +SOUND_OBJ_DYING_ENEMY2 = 0x5026 +SOUND_OBJ_BOBOMB_WALK = SOUND_ARG_LOAD(5, 0, 0x27, 0x00, 8) +SOUND_OBJ_SOMETHING_LANDING = SOUND_ARG_LOAD(5, 0, 0x28, 0x80, 8) +SOUND_OBJ_DIVING_IN_WATER = SOUND_ARG_LOAD(5, 0, 0x29, 0xA0, 8) +SOUND_OBJ_SNOW_SAND1 = SOUND_ARG_LOAD(5, 0, 0x2A, 0x00, 8) +SOUND_OBJ_SNOW_SAND2 = SOUND_ARG_LOAD(5, 0, 0x2B, 0x00, 8) +SOUND_OBJ_DEFAULT_DEATH = SOUND_ARG_LOAD(5, 0, 0x2C, 0x80, 8) +SOUND_OBJ_BIG_PENGUIN_YELL = SOUND_ARG_LOAD(5, 0, 0x2D, 0x00, 8) +SOUND_OBJ_WATER_BOMB_BOUNCING = SOUND_ARG_LOAD(5, 0, 0x2E, 0x80, 8) +SOUND_OBJ_GOOMBA_ALERT = SOUND_ARG_LOAD(5, 0, 0x2F, 0x00, 8) +SOUND_OBJ_WIGGLER_JUMP = SOUND_ARG_LOAD(5, 0, 0x2F, 0x60, 8) +SOUND_OBJ_STOMPED = SOUND_ARG_LOAD(5, 0, 0x30, 0x80, 8) +SOUND_OBJ_UNKNOWN6 = SOUND_ARG_LOAD(5, 0, 0x31, 0x00, 8) +SOUND_OBJ_DIVING_INTO_WATER = SOUND_ARG_LOAD(5, 0, 0x32, 0x40, 8) +SOUND_OBJ_PIRANHA_PLANT_SHRINK = SOUND_ARG_LOAD(5, 0, 0x33, 0x40, 8) +SOUND_OBJ_KOOPA_THE_QUICK_WALK = SOUND_ARG_LOAD(5, 0, 0x34, 0x20, 8) +SOUND_OBJ_KOOPA_WALK = SOUND_ARG_LOAD(5, 0, 0x35, 0x00, 8) +SOUND_OBJ_BULLY_WALKING = SOUND_ARG_LOAD(5, 0, 0x36, 0x60, 8) +SOUND_OBJ_DORRIE = SOUND_ARG_LOAD(5, 0, 0x37, 0x60, 8) +SOUND_OBJ_BOWSER_LAUGH = SOUND_ARG_LOAD(5, 0, 0x38, 0x80, 8) +SOUND_OBJ_UKIKI_CHATTER_SHORT = SOUND_ARG_LOAD(5, 0, 0x39, 0x00, 8) +SOUND_OBJ_UKIKI_CHATTER_IDLE = SOUND_ARG_LOAD(5, 0, 0x3A, 0x00, 8) +SOUND_OBJ_UKIKI_STEP_DEFAULT = SOUND_ARG_LOAD(5, 0, 0x3B, 0x00, 8) +SOUND_OBJ_UKIKI_STEP_LEAVES = SOUND_ARG_LOAD(5, 0, 0x3C, 0x00, 8) +SOUND_OBJ_KOOPA_TALK = SOUND_ARG_LOAD(5, 0, 0x3D, 0xA0, 8) +SOUND_OBJ_KOOPA_DAMAGE = SOUND_ARG_LOAD(5, 0, 0x3E, 0xA0, 8) +SOUND_OBJ_KLEPTO1 = SOUND_ARG_LOAD(5, 0, 0x3F, 0x40, 8) +SOUND_OBJ_KLEPTO2 = SOUND_ARG_LOAD(5, 0, 0x40, 0x60, 8) +SOUND_OBJ_KING_BOBOMB_TALK = SOUND_ARG_LOAD(5, 0, 0x41, 0x00, 8) +SOUND_OBJ_KING_BOBOMB_JUMP = SOUND_ARG_LOAD(5, 0, 0x46, 0x80, 8) +SOUND_OBJ_KING_WHOMP_DEATH = SOUND_ARG_LOAD(5, 1, 0x47, 0xC0, 8) +SOUND_OBJ_BOO_LAUGH_LONG = SOUND_ARG_LOAD(5, 0, 0x48, 0x00, 8) +SOUND_OBJ_EEL = SOUND_ARG_LOAD(5, 0, 0x4A, 0x00, 8) +SOUND_OBJ_EEL_2 = SOUND_ARG_LOAD(5, 2, 0x4A, 0x00, 8) +SOUND_OBJ_EYEROK_SHOW_EYE = SOUND_ARG_LOAD(5, 2, 0x4B, 0x00, 8) +SOUND_OBJ_MR_BLIZZARD_ALERT = SOUND_ARG_LOAD(5, 0, 0x4C, 0x00, 8) +SOUND_OBJ_SNUFIT_SHOOT = SOUND_ARG_LOAD(5, 0, 0x4D, 0x00, 8) +SOUND_OBJ_SKEETER_WALK = SOUND_ARG_LOAD(5, 0, 0x4E, 0x00, 8) +SOUND_OBJ_WALKING_WATER = SOUND_ARG_LOAD(5, 0, 0x4F, 0x00, 8) +SOUND_OBJ_BIRD_CHIRP3 = SOUND_ARG_LOAD(5, 0, 0x51, 0x40, 0) +SOUND_OBJ_PIRANHA_PLANT_APPEAR = SOUND_ARG_LOAD(5, 0, 0x54, 0x20, 8) +SOUND_OBJ_FLAME_BLOWN = SOUND_ARG_LOAD(5, 0, 0x55, 0x80, 8) +SOUND_OBJ_MAD_PIANO_CHOMPING = SOUND_ARG_LOAD(5, 2, 0x56, 0x40, 8) +SOUND_OBJ_BOBOMB_BUDDY_TALK = SOUND_ARG_LOAD(5, 0, 0x58, 0x40, 8) +SOUND_OBJ_SPINY_UNK59 = SOUND_ARG_LOAD(5, 0, 0x59, 0x10, 8) +SOUND_OBJ_WIGGLER_HIGH_PITCH = SOUND_ARG_LOAD(5, 0, 0x5C, 0x40, 8) +SOUND_OBJ_HEAVEHO_TOSSED = SOUND_ARG_LOAD(5, 0, 0x5D, 0x40, 8) +SOUND_OBJ_WIGGLER_DEATH = 0x505E +SOUND_OBJ_BOWSER_INTRO_LAUGH = SOUND_ARG_LOAD(5, 0, 0x5F, 0x80, 9) +SOUND_OBJ_ENEMY_DEATH_HIGH = SOUND_ARG_LOAD(5, 0, 0x60, 0xB0, 8) +SOUND_OBJ_ENEMY_DEATH_LOW = SOUND_ARG_LOAD(5, 0, 0x61, 0xB0, 8) +SOUND_OBJ_SWOOP_DEATH = SOUND_ARG_LOAD(5, 0, 0x62, 0xB0, 8) +SOUND_OBJ_KOOPA_FLYGUY_DEATH = SOUND_ARG_LOAD(5, 0, 0x63, 0xB0, 8) +SOUND_OBJ_POKEY_DEATH = SOUND_ARG_LOAD(5, 0, 0x63, 0xC0, 8) +SOUND_OBJ_SNOWMAN_BOUNCE = SOUND_ARG_LOAD(5, 0, 0x64, 0xC0, 8) +SOUND_OBJ_SNOWMAN_EXPLODE = SOUND_ARG_LOAD(5, 0, 0x65, 0xD0, 8) +SOUND_OBJ_POUNDING_LOUD = SOUND_ARG_LOAD(5, 0, 0x68, 0x40, 8) +SOUND_OBJ_MIPS_RABBIT = SOUND_ARG_LOAD(5, 0, 0x6A, 0x00, 8) +SOUND_OBJ_MIPS_RABBIT_WATER = SOUND_ARG_LOAD(5, 0, 0x6C, 0x00, 8) +SOUND_OBJ_EYEROK_EXPLODE = SOUND_ARG_LOAD(5, 0, 0x6D, 0x00, 8) +SOUND_OBJ_CHUCKYA_DEATH = SOUND_ARG_LOAD(5, 1, 0x6E, 0x00, 8) +SOUND_OBJ_WIGGLER_TALK = SOUND_ARG_LOAD(5, 0, 0x6F, 0x00, 8) +SOUND_OBJ_WIGGLER_ATTACKED = SOUND_ARG_LOAD(5, 0, 0x70, 0x60, 8) +SOUND_OBJ_WIGGLER_LOW_PITCH = SOUND_ARG_LOAD(5, 0, 0x71, 0x20, 8) +SOUND_OBJ_SNUFIT_SKEETER_DEATH = SOUND_ARG_LOAD(5, 0, 0x72, 0xC0, 8) +SOUND_OBJ_BUBBA_CHOMP = SOUND_ARG_LOAD(5, 0, 0x73, 0x40, 8) +SOUND_OBJ_ENEMY_DEFEAT_SHRINK = SOUND_ARG_LOAD(5, 0, 0x74, 0x40, 8) + +SOUND_AIR_BOWSER_SPIT_FIRE = SOUND_ARG_LOAD(6, 0, 0x00, 0x00, 0) +SOUND_AIR_UNK01 = 0x6001 +SOUND_AIR_LAKITU_FLY = SOUND_ARG_LOAD(6, 0, 0x02, 0x80, 0) +SOUND_AIR_LAKITU_FLY_HIGHPRIO = SOUND_ARG_LOAD(6, 0, 0x02, 0xFF, 0) +SOUND_AIR_AMP_BUZZ = SOUND_ARG_LOAD(6, 0, 0x03, 0x40, 0) +SOUND_AIR_BLOW_FIRE = SOUND_ARG_LOAD(6, 0, 0x04, 0x80, 0) +SOUND_AIR_BLOW_WIND = SOUND_ARG_LOAD(6, 0, 0x04, 0x40, 0) +SOUND_AIR_ROUGH_SLIDE = SOUND_ARG_LOAD(6, 0, 0x05, 0x00, 0) +SOUND_AIR_HEAVEHO_MOVE = SOUND_ARG_LOAD(6, 0, 0x06, 0x40, 0) +SOUND_AIR_UNK07 = 0x6007 +SOUND_AIR_BOBOMB_LIT_FUSE = SOUND_ARG_LOAD(6, 0, 0x08, 0x60, 0) +SOUND_AIR_HOWLING_WIND = SOUND_ARG_LOAD(6, 0, 0x09, 0x80, 0) +SOUND_AIR_CHUCKYA_MOVE = SOUND_ARG_LOAD(6, 0, 0x0A, 0x40, 0) +SOUND_AIR_PEACH_TWINKLE = SOUND_ARG_LOAD(6, 0, 0x0B, 0x40, 0) +SOUND_AIR_CASTLE_OUTDOORS_AMBIENT = SOUND_ARG_LOAD(6, 0, 0x10, 0x40, 0) + +SOUND_MENU_CHANGE_SELECT = SOUND_ARG_LOAD(7, 0, 0x00, 0xF8, 8) +SOUND_MENU_REVERSE_PAUSE = 0x7001 +SOUND_MENU_PAUSE = SOUND_ARG_LOAD(7, 0, 0x02, 0xF0, 8) +SOUND_MENU_PAUSE_HIGHPRIO = SOUND_ARG_LOAD(7, 0, 0x02, 0xFF, 8) +SOUND_MENU_PAUSE_2 = SOUND_ARG_LOAD(7, 0, 0x03, 0xFF, 8) +SOUND_MENU_MESSAGE_APPEAR = SOUND_ARG_LOAD(7, 0, 0x04, 0x00, 8) +SOUND_MENU_MESSAGE_DISAPPEAR = SOUND_ARG_LOAD(7, 0, 0x05, 0x00, 8) +SOUND_MENU_CAMERA_ZOOM_IN = SOUND_ARG_LOAD(7, 0, 0x06, 0x00, 8) +SOUND_MENU_CAMERA_ZOOM_OUT = SOUND_ARG_LOAD(7, 0, 0x07, 0x00, 8) +SOUND_MENU_PINCH_MARIO_FACE = SOUND_ARG_LOAD(7, 0, 0x08, 0x00, 8) +SOUND_MENU_LET_GO_MARIO_FACE = SOUND_ARG_LOAD(7, 0, 0x09, 0x00, 8) +SOUND_MENU_HAND_APPEAR = SOUND_ARG_LOAD(7, 0, 0x0A, 0x00, 8) +SOUND_MENU_HAND_DISAPPEAR = SOUND_ARG_LOAD(7, 0, 0x0B, 0x00, 8) +SOUND_MENU_UNK0C = SOUND_ARG_LOAD(7, 0, 0x0C, 0x00, 8) +SOUND_MENU_POWER_METER = SOUND_ARG_LOAD(7, 0, 0x0D, 0x00, 8) +SOUND_MENU_CAMERA_BUZZ = SOUND_ARG_LOAD(7, 0, 0x0E, 0x00, 8) +SOUND_MENU_CAMERA_TURN = SOUND_ARG_LOAD(7, 0, 0x0F, 0x00, 8) +SOUND_MENU_UNK10 = 0x7010 +SOUND_MENU_CLICK_FILE_SELECT = SOUND_ARG_LOAD(7, 0, 0x11, 0x00, 8) +SOUND_MENU_MESSAGE_NEXT_PAGE = SOUND_ARG_LOAD(7, 0, 0x13, 0x00, 8) +SOUND_MENU_COIN_ITS_A_ME_MARIO = SOUND_ARG_LOAD(7, 0, 0x14, 0x00, 8) +SOUND_MENU_YOSHI_GAIN_LIVES = SOUND_ARG_LOAD(7, 0, 0x15, 0x00, 8) +SOUND_MENU_ENTER_PIPE = SOUND_ARG_LOAD(7, 0, 0x16, 0xA0, 8) +SOUND_MENU_EXIT_PIPE = SOUND_ARG_LOAD(7, 0, 0x17, 0xA0, 8) +SOUND_MENU_BOWSER_LAUGH = SOUND_ARG_LOAD(7, 0, 0x18, 0x80, 8) +SOUND_MENU_ENTER_HOLE = SOUND_ARG_LOAD(7, 1, 0x19, 0x80, 8) +SOUND_MENU_CLICK_CHANGE_VIEW = SOUND_ARG_LOAD(7, 0, 0x1A, 0x80, 8) +SOUND_MENU_CAMERA_UNUSED1 = 0x701B +SOUND_MENU_CAMERA_UNUSED2 = 0x701C +SOUND_MENU_MARIO_CASTLE_WARP = SOUND_ARG_LOAD(7, 0, 0x1D, 0xB0, 8) +SOUND_MENU_STAR_SOUND = SOUND_ARG_LOAD(7, 0, 0x1E, 0xFF, 8) +SOUND_MENU_THANK_YOU_PLAYING_MY_GAME = SOUND_ARG_LOAD(7, 0, 0x1F, 0xFF, 8) +SOUND_MENU_READ_A_SIGN = 0x7020 +SOUND_MENU_EXIT_A_SIGN = 0x7021 +SOUND_MENU_MARIO_CASTLE_WARP2 = SOUND_ARG_LOAD(7, 0, 0x22, 0x20, 8) +SOUND_MENU_STAR_SOUND_OKEY_DOKEY = SOUND_ARG_LOAD(7, 0, 0x23, 0xFF, 8) +SOUND_MENU_STAR_SOUND_LETS_A_GO = SOUND_ARG_LOAD(7, 0, 0x24, 0xFF, 8) + +SOUND_MENU_COLLECT_RED_COIN = SOUND_ARG_LOAD(7, 8, 0x28, 0x90, 8) +SOUND_MENU_COLLECT_SECRET = SOUND_ARG_LOAD(7, 0, 0x30, 0x20, 8) + +SOUND_GENERAL2_BOBOMB_EXPLOSION = SOUND_ARG_LOAD(8, 0, 0x2E, 0x20, 8) +SOUND_GENERAL2_PURPLE_SWITCH = SOUND_ARG_LOAD(8, 0, 0x3E, 0xC0, 8) +SOUND_GENERAL2_ROTATING_BLOCK_CLICK = SOUND_ARG_LOAD(8, 0, 0x40, 0x00, 8) +SOUND_GENERAL2_SPINDEL_ROLL = SOUND_ARG_LOAD(8, 0, 0x48, 0x20, 8) +SOUND_GENERAL2_PYRAMID_TOP_SPIN = SOUND_ARG_LOAD(8, 1, 0x4B, 0xE0, 8) +SOUND_GENERAL2_PYRAMID_TOP_EXPLOSION = SOUND_ARG_LOAD(8, 1, 0x4C, 0xF0, 8) +SOUND_GENERAL2_BIRD_CHIRP2 = SOUND_ARG_LOAD(8, 0, 0x50, 0x40, 0) +SOUND_GENERAL2_SWITCH_TICK_FAST = SOUND_ARG_LOAD(8, 0, 0x54, 0xF0, 1) +SOUND_GENERAL2_SWITCH_TICK_SLOW = SOUND_ARG_LOAD(8, 0, 0x55, 0xF0, 1) +SOUND_GENERAL2_STAR_APPEARS = SOUND_ARG_LOAD(8, 0, 0x57, 0xFF, 9) +SOUND_GENERAL2_ROTATING_BLOCK_ALERT = SOUND_ARG_LOAD(8, 0, 0x59, 0x00, 8) +SOUND_GENERAL2_BOWSER_EXPLODE = SOUND_ARG_LOAD(8, 0, 0x60, 0x00, 8) +SOUND_GENERAL2_BOWSER_KEY = SOUND_ARG_LOAD(8, 0, 0x61, 0x00, 8) +SOUND_GENERAL2_1UP_APPEAR = SOUND_ARG_LOAD(8, 0, 0x63, 0xD0, 8) +SOUND_GENERAL2_RIGHT_ANSWER = SOUND_ARG_LOAD(8, 0, 0x6A, 0xA0, 8) + +SOUND_OBJ2_BOWSER_ROAR = SOUND_ARG_LOAD(9, 0, 0x04, 0x00, 8) +SOUND_OBJ2_PIRANHA_PLANT_BITE = SOUND_ARG_LOAD(9, 0, 0x10, 0x50, 8) +SOUND_OBJ2_PIRANHA_PLANT_DYING = SOUND_ARG_LOAD(9, 0, 0x11, 0x60, 8) +SOUND_OBJ2_BOWSER_PUZZLE_PIECE_MOVE = SOUND_ARG_LOAD(9, 0, 0x19, 0x20, 8) +SOUND_OBJ2_BULLY_ATTACKED = SOUND_ARG_LOAD(9, 0, 0x1C, 0x00, 8) +SOUND_OBJ2_KING_BOBOMB_DAMAGE = SOUND_ARG_LOAD(9, 1, 0x42, 0x40, 8) +SOUND_OBJ2_SCUTTLEBUG_WALK = SOUND_ARG_LOAD(9, 0, 0x43, 0x40, 8) +SOUND_OBJ2_SCUTTLEBUG_ALERT = SOUND_ARG_LOAD(9, 0, 0x44, 0x40, 8) +SOUND_OBJ2_BABY_PENGUIN_YELL = SOUND_ARG_LOAD(9, 0, 0x45, 0x00, 8) +SOUND_OBJ2_SWOOP = SOUND_ARG_LOAD(9, 0, 0x49, 0x00, 8) +SOUND_OBJ2_BIRD_CHIRP1 = SOUND_ARG_LOAD(9, 0, 0x52, 0x40, 0) +SOUND_OBJ2_LARGE_BULLY_ATTACKED = SOUND_ARG_LOAD(9, 0, 0x57, 0x00, 8) +SOUND_OBJ2_EYEROK_SOUND_SHORT = SOUND_ARG_LOAD(9, 3, 0x5A, 0x00, 8) +SOUND_OBJ2_WHOMP_SOUND_SHORT = SOUND_ARG_LOAD(9, 3, 0x5A, 0xC0, 8) +SOUND_OBJ2_EYEROK_SOUND_LONG = SOUND_ARG_LOAD(9, 2, 0x5B, 0x00, 8) +SOUND_OBJ2_BOWSER_TELEPORT = SOUND_ARG_LOAD(9, 0, 0x66, 0x80, 8) +SOUND_OBJ2_MONTY_MOLE_APPEAR = SOUND_ARG_LOAD(9, 0, 0x67, 0x80, 8) +SOUND_OBJ2_BOSS_DIALOG_GRUNT = SOUND_ARG_LOAD(9, 0, 0x69, 0x40, 8) +SOUND_OBJ2_MRI_SPINNING = SOUND_ARG_LOAD(9, 0, 0x6B, 0x00, 8) + +---------------- +-- animations -- +---------------- + +MARIO_ANIM_SLOW_LEDGE_GRAB = 0 +MARIO_ANIM_FALL_OVER_BACKWARDS = 1 +MARIO_ANIM_BACKWARD_AIR_KB = 2 +MARIO_ANIM_DYING_ON_BACK = 3 +MARIO_ANIM_BACKFLIP = 4 +MARIO_ANIM_CLIMB_UP_POLE = 5 +MARIO_ANIM_GRAB_POLE_SHORT = 6 +MARIO_ANIM_GRAB_POLE_SWING_PART1 = 7 +MARIO_ANIM_GRAB_POLE_SWING_PART2 = 8 +MARIO_ANIM_HANDSTAND_IDLE = 9 +MARIO_ANIM_HANDSTAND_JUMP = 10 +MARIO_ANIM_START_HANDSTAND = 11 +MARIO_ANIM_RETURN_FROM_HANDSTAND = 12 +MARIO_ANIM_IDLE_ON_POLE = 13 +MARIO_ANIM_A_POSE = 14 +MARIO_ANIM_SKID_ON_GROUND = 15 +MARIO_ANIM_STOP_SKID = 16 +MARIO_ANIM_CROUCH_FROM_FAST_LONGJUMP = 17 +MARIO_ANIM_CROUCH_FROM_SLOW_LONGJUMP = 18 +MARIO_ANIM_FAST_LONGJUMP = 19 +MARIO_ANIM_SLOW_LONGJUMP = 20 +MARIO_ANIM_AIRBORNE_ON_STOMACH = 21 +MARIO_ANIM_WALK_WITH_LIGHT_OBJ = 22 +MARIO_ANIM_RUN_WITH_LIGHT_OBJ = 23 +MARIO_ANIM_SLOW_WALK_WITH_LIGHT_OBJ = 24 +MARIO_ANIM_SHIVERING_WARMING_HAND = 25 +MARIO_ANIM_SHIVERING_RETURN_TO_IDLE = 26 +MARIO_ANIM_SHIVERING = 27 +MARIO_ANIM_CLIMB_DOWN_LEDGE = 28 +MARIO_ANIM_CREDITS_WAVING = 29 +MARIO_ANIM_CREDITS_LOOK_UP = 30 +MARIO_ANIM_CREDITS_RETURN_FROM_LOOK_UP = 31 +MARIO_ANIM_CREDITS_RAISE_HAND = 32 +MARIO_ANIM_CREDITS_LOWER_HAND = 33 +MARIO_ANIM_CREDITS_TAKE_OFF_CAP = 34 +MARIO_ANIM_CREDITS_START_WALK_LOOK_UP = 35 +MARIO_ANIM_CREDITS_LOOK_BACK_THEN_RUN = 36 +MARIO_ANIM_FINAL_BOWSER_RAISE_HAND_SPIN = 37 +MARIO_ANIM_FINAL_BOWSER_WING_CAP_TAKE_OFF = 38 +MARIO_ANIM_CREDITS_PEACE_SIGN = 39 +MARIO_ANIM_STAND_UP_FROM_LAVA_BOOST = 40 +MARIO_ANIM_FIRE_LAVA_BURN = 41 +MARIO_ANIM_WING_CAP_FLY = 42 +MARIO_ANIM_HANG_ON_OWL = 43 +MARIO_ANIM_LAND_ON_STOMACH = 44 +MARIO_ANIM_AIR_FORWARD_KB = 45 +MARIO_ANIM_DYING_ON_STOMACH = 46 +MARIO_ANIM_SUFFOCATING = 47 +MARIO_ANIM_COUGHING = 48 +MARIO_ANIM_THROW_CATCH_KEY = 49 +MARIO_ANIM_DYING_FALL_OVER = 50 +MARIO_ANIM_IDLE_ON_LEDGE = 51 +MARIO_ANIM_FAST_LEDGE_GRAB = 52 +MARIO_ANIM_HANG_ON_CEILING = 53 +MARIO_ANIM_PUT_CAP_ON = 54 +MARIO_ANIM_TAKE_CAP_OFF_THEN_ON = 55 +MARIO_ANIM_QUICKLY_PUT_CAP_ON = 56 +MARIO_ANIM_HEAD_STUCK_IN_GROUND = 57 +MARIO_ANIM_GROUND_POUND_LANDING = 58 +MARIO_ANIM_TRIPLE_JUMP_GROUND_POUND = 59 +MARIO_ANIM_START_GROUND_POUND = 60 +MARIO_ANIM_GROUND_POUND = 61 +MARIO_ANIM_BOTTOM_STUCK_IN_GROUND = 62 +MARIO_ANIM_IDLE_WITH_LIGHT_OBJ = 63 +MARIO_ANIM_JUMP_LAND_WITH_LIGHT_OBJ = 64 +MARIO_ANIM_JUMP_WITH_LIGHT_OBJ = 65 +MARIO_ANIM_FALL_LAND_WITH_LIGHT_OBJ = 66 +MARIO_ANIM_FALL_WITH_LIGHT_OBJ = 67 +MARIO_ANIM_FALL_FROM_SLIDING_WITH_LIGHT_OBJ = 68 +MARIO_ANIM_SLIDING_ON_BOTTOM_WITH_LIGHT_OBJ = 69 +MARIO_ANIM_STAND_UP_FROM_SLIDING_WITH_LIGHT_OBJ = 70 +MARIO_ANIM_RIDING_SHELL = 71 +MARIO_ANIM_WALKING = 72 +MARIO_ANIM_FORWARD_FLIP = 73 +MARIO_ANIM_JUMP_RIDING_SHELL = 74 +MARIO_ANIM_LAND_FROM_DOUBLE_JUMP = 75 +MARIO_ANIM_DOUBLE_JUMP_FALL = 76 +MARIO_ANIM_SINGLE_JUMP = 77 +MARIO_ANIM_LAND_FROM_SINGLE_JUMP = 78 +MARIO_ANIM_AIR_KICK = 79 +MARIO_ANIM_DOUBLE_JUMP_RISE = 80 +MARIO_ANIM_START_FORWARD_SPINNING = 81 +MARIO_ANIM_THROW_LIGHT_OBJECT = 82 +MARIO_ANIM_FALL_FROM_SLIDE_KICK = 83 +MARIO_ANIM_BEND_KNESS_RIDING_SHELL = 84 +MARIO_ANIM_LEGS_STUCK_IN_GROUND = 85 +MARIO_ANIM_GENERAL_FALL = 86 +MARIO_ANIM_GENERAL_LAND = 87 +MARIO_ANIM_BEING_GRABBED = 88 +MARIO_ANIM_GRAB_HEAVY_OBJECT = 89 +MARIO_ANIM_SLOW_LAND_FROM_DIVE = 90 +MARIO_ANIM_FLY_FROM_CANNON = 91 +MARIO_ANIM_MOVE_ON_WIRE_NET_RIGHT = 92 +MARIO_ANIM_MOVE_ON_WIRE_NET_LEFT = 93 +MARIO_ANIM_MISSING_CAP = 94 +MARIO_ANIM_PULL_DOOR_WALK_IN = 95 +MARIO_ANIM_PUSH_DOOR_WALK_IN = 96 +MARIO_ANIM_UNLOCK_DOOR = 97 +MARIO_ANIM_START_REACH_POCKET = 98 +MARIO_ANIM_REACH_POCKET = 99 +MARIO_ANIM_STOP_REACH_POCKET = 100 +MARIO_ANIM_GROUND_THROW = 101 +MARIO_ANIM_GROUND_KICK = 102 +MARIO_ANIM_FIRST_PUNCH = 103 +MARIO_ANIM_SECOND_PUNCH = 104 +MARIO_ANIM_FIRST_PUNCH_FAST = 105 +MARIO_ANIM_SECOND_PUNCH_FAST = 106 +MARIO_ANIM_PICK_UP_LIGHT_OBJ = 107 +MARIO_ANIM_PUSHING = 108 +MARIO_ANIM_START_RIDING_SHELL = 109 +MARIO_ANIM_PLACE_LIGHT_OBJ = 110 +MARIO_ANIM_FORWARD_SPINNING = 111 +MARIO_ANIM_BACKWARD_SPINNING = 112 +MARIO_ANIM_BREAKDANCE = 113 +MARIO_ANIM_RUNNING = 114 +MARIO_ANIM_RUNNING_UNUSED = 115 +MARIO_ANIM_SOFT_BACK_KB = 116 +MARIO_ANIM_SOFT_FRONT_KB = 117 +MARIO_ANIM_DYING_IN_QUICKSAND = 118 +MARIO_ANIM_IDLE_IN_QUICKSAND = 119 +MARIO_ANIM_MOVE_IN_QUICKSAND = 120 +MARIO_ANIM_ELECTROCUTION = 121 +MARIO_ANIM_SHOCKED = 122 +MARIO_ANIM_BACKWARD_KB = 123 +MARIO_ANIM_FORWARD_KB = 124 +MARIO_ANIM_IDLE_HEAVY_OBJ = 125 +MARIO_ANIM_STAND_AGAINST_WALL = 126 +MARIO_ANIM_SIDESTEP_LEFT = 127 +MARIO_ANIM_SIDESTEP_RIGHT = 128 +MARIO_ANIM_START_SLEEP_IDLE = 129 +MARIO_ANIM_START_SLEEP_SCRATCH = 130 +MARIO_ANIM_START_SLEEP_YAWN = 131 +MARIO_ANIM_START_SLEEP_SITTING = 132 +MARIO_ANIM_SLEEP_IDLE = 133 +MARIO_ANIM_SLEEP_START_LYING = 134 +MARIO_ANIM_SLEEP_LYING = 135 +MARIO_ANIM_DIVE = 136 +MARIO_ANIM_SLIDE_DIVE = 137 +MARIO_ANIM_GROUND_BONK = 138 +MARIO_ANIM_STOP_SLIDE_LIGHT_OBJ = 139 +MARIO_ANIM_SLIDE_KICK = 140 +MARIO_ANIM_CROUCH_FROM_SLIDE_KICK = 141 +MARIO_ANIM_SLIDE_MOTIONLESS = 142 +MARIO_ANIM_STOP_SLIDE = 143 +MARIO_ANIM_FALL_FROM_SLIDE = 144 +MARIO_ANIM_SLIDE = 145 +MARIO_ANIM_TIPTOE = 146 +MARIO_ANIM_TWIRL_LAND = 147 +MARIO_ANIM_TWIRL = 148 +MARIO_ANIM_START_TWIRL = 149 +MARIO_ANIM_STOP_CROUCHING = 150 +MARIO_ANIM_START_CROUCHING = 151 +MARIO_ANIM_CROUCHING = 152 +MARIO_ANIM_CRAWLING = 153 +MARIO_ANIM_STOP_CRAWLING = 154 +MARIO_ANIM_START_CRAWLING = 155 +MARIO_ANIM_SUMMON_STAR = 156 +MARIO_ANIM_RETURN_STAR_APPROACH_DOOR = 157 +MARIO_ANIM_BACKWARDS_WATER_KB = 158 +MARIO_ANIM_SWIM_WITH_OBJ_PART1 = 159 +MARIO_ANIM_SWIM_WITH_OBJ_PART2 = 160 +MARIO_ANIM_FLUTTERKICK_WITH_OBJ = 161 +MARIO_ANIM_WATER_ACTION_END_WITH_OBJ = 162 +MARIO_ANIM_STOP_GRAB_OBJ_WATER = 163 +MARIO_ANIM_WATER_IDLE_WITH_OBJ = 164 +MARIO_ANIM_DROWNING_PART1 = 165 +MARIO_ANIM_DROWNING_PART2 = 166 +MARIO_ANIM_WATER_DYING = 167 +MARIO_ANIM_WATER_FORWARD_KB = 168 +MARIO_ANIM_FALL_FROM_WATER = 169 +MARIO_ANIM_SWIM_PART1 = 170 +MARIO_ANIM_SWIM_PART2 = 171 +MARIO_ANIM_FLUTTERKICK = 172 +MARIO_ANIM_WATER_ACTION_END = 173 +MARIO_ANIM_WATER_PICK_UP_OBJ = 174 +MARIO_ANIM_WATER_GRAB_OBJ_PART2 = 175 +MARIO_ANIM_WATER_GRAB_OBJ_PART1 = 176 +MARIO_ANIM_WATER_THROW_OBJ = 177 +MARIO_ANIM_WATER_IDLE = 178 +MARIO_ANIM_WATER_STAR_DANCE = 179 +MARIO_ANIM_RETURN_FROM_WATER_STAR_DANCE = 180 +MARIO_ANIM_GRAB_BOWSER = 181 +MARIO_ANIM_SWINGING_BOWSER = 182 +MARIO_ANIM_RELEASE_BOWSER = 183 +MARIO_ANIM_HOLDING_BOWSER = 184 +MARIO_ANIM_HEAVY_THROW = 185 +MARIO_ANIM_WALK_PANTING = 186 +MARIO_ANIM_WALK_WITH_HEAVY_OBJ = 187 +MARIO_ANIM_TURNING_PART1 = 188 +MARIO_ANIM_TURNING_PART2 = 189 +MARIO_ANIM_SLIDEFLIP_LAND = 190 +MARIO_ANIM_SLIDEFLIP = 191 +MARIO_ANIM_TRIPLE_JUMP_LAND = 192 +MARIO_ANIM_TRIPLE_JUMP = 193 +MARIO_ANIM_FIRST_PERSON = 194 +MARIO_ANIM_IDLE_HEAD_LEFT = 195 +MARIO_ANIM_IDLE_HEAD_RIGHT = 196 +MARIO_ANIM_IDLE_HEAD_CENTER = 197 +MARIO_ANIM_HANDSTAND_LEFT = 198 +MARIO_ANIM_HANDSTAND_RIGHT = 199 +MARIO_ANIM_WAKE_FROM_SLEEP = 200 +MARIO_ANIM_WAKE_FROM_LYING = 201 +MARIO_ANIM_START_TIPTOE = 202 +MARIO_ANIM_SLIDEJUMP = 203 +MARIO_ANIM_START_WALLKICK = 204 +MARIO_ANIM_STAR_DANCE = 205 +MARIO_ANIM_RETURN_FROM_STAR_DANCE = 206 +MARIO_ANIM_FORWARD_SPINNING_FLIP = 207 +MARIO_ANIM_TRIPLE_JUMP_FLY = 208 diff --git a/mods/test.lua b/mods/test.lua index 69e69589f..808dde801 100644 --- a/mods/test.lua +++ b/mods/test.lua @@ -1,16 +1,124 @@ -function mario_update(index) - local m = get_mario_state(index) - if m.vel.y > 0 then - m.vel.y = m.vel.y + 2 + +ACT_ROLL = (0x05B | ACT_FLAG_MOVING | ACT_FLAG_BUTT_OR_STOMACH_SLIDE) +ACT_ROLL_AIR = (0x0BA | ACT_FLAG_AIR | ACT_FLAG_ALLOW_VERTICAL_WIND_ACTION) + +function act_roll(mario_index) + print("rolling!") + local m = get_mario_state(mario_index) + + local MAX_NORMAL_ROLL_SPEED = 50.0 + local ROLL_BOOST_GAIN = 10.0 + local ROLL_CANCEL_LOCKOUT_TIME = 10 + local BOOST_LOCKOUT_TIME = 20 + + -- m.spareFloat is used for Mario's rotation angle during the roll (persists when going into ACT_ROLL_AIR and back) + -- m.spareInt is used for the boost lockout timer (persists when going into ACT_ROLL_AIR and back) + -- m.actionTimer is used to lockout walk canceling out of rollout (reset each action switch) + + if m.actionTimer == 0 then + if m.prevAction ~= ACT_ROLL_AIR then + m.spareFloat = 0 + m.spareInt = 0 + end + elseif m.actionTimer >= ROLL_CANCEL_LOCKOUT_TIME or m.actionArg == 1 then + if (m.input & INPUT_Z_DOWN) == 0 then + print("rolling -> walking") + return set_mario_action(mario_index, ACT_WALKING, 0); + end end - set_mario_state(index, m) - if m.action == ACT_DIVE then - set_mario_action(index, ACT_TWIRLING, 0); + + if (m.input & INPUT_B_PRESSED) ~= 0 then + print("rolling -> rollout") + return set_jumping_action(mario_index, ACT_FORWARD_ROLLOUT, 0); end + + if (m.input & INPUT_A_PRESSED) ~= 0 then + print("rolling -> long jump") + return set_jumping_action(mario_index, ACT_LONG_JUMP, 0); + end + + if (m.controller.buttonPressed & R_TRIG) ~= 0 and m.actionTimer > 0 then + m.vel[1] = 19.0; + play_mario_sound(mario_index, SOUND_ACTION_TERRAIN_JUMP, 0); + + if m.spareInt >= BOOST_LOCKOUT_TIME then + m.spareInt = 0; + + if m.forwardVel < MAX_NORMAL_ROLL_SPEED then + mario_set_forward_vel(mario_index, math.min(m.forwardVel + ROLL_BOOST_GAIN, MAX_NORMAL_ROLL_SPEED)); + end + + m.particleFlags = m.particleFlags | PARTICLE_HORIZONTAL_STAR; + + -- ! playing this after the call to play_mario_sound seems to matter in making this sound play + ------ play_sound(SOUND_ACTION_SPIN, m.marioObj->header.gfx.cameraToObject); + end + + print("rolling -> rolling air") + return set_mario_action(mario_index, ACT_ROLL_AIR, m.actionArg); + end + + set_mario_animation(mario_index, MARIO_ANIM_FORWARD_SPINNING); + + if update_sliding(mario_index, 10.0) ~= 0 then + print("rolling -> crouch slide") + return set_mario_action(mario_index, ACT_CROUCH_SLIDE, 0); + end + + common_slide_action(mario_index, ACT_CROUCH_SLIDE, ACT_ROLL_AIR, MARIO_ANIM_FORWARD_SPINNING); + + ------------------------------------ + -- todo: implement spareFloat/int -- + ------------------------------------ + if m.spareFloat == nil then m.spareFloat = 0 end -- remove me + if m.spareInt == nil then m.spareInt = 0 end -- remove me + + m.spareFloat = m.spareFloat + (0x80 * m.forwardVel); + if m.spareFloat > 0x10000 then + m.spareFloat = m.spareFloat - 0x10000; + end + set_anim_to_frame(mario_index, 10 * m.spareFloat / 0x10000); + + m.spareInt = m.spareInt + 1; + + m = get_mario_state(mario_index) + m.actionTimer = m.actionTimer + 1; + + set_mario_state(mario_index, m) + return 0; +end + +function act_roll_air(mario_index) + print("rolling air!") + return set_mario_action(mario_index, ACT_DIVE, 0); end function update() + print("----------") + print(gMarioStates[0].pos) + print(gMarioStates[0].pos.x) + print(gMarioStates[0].pos.y) + print(gMarioStates[0].pos.z) +end + +function mario_update(mario_index) + local m = get_mario_state(mario_index) + -- if m.vel.y > 0 then + -- m.vel.y = m.vel.y + 2 + -- end + + -- set_mario_state(mario_index, m) + + if m.action == ACT_DIVE_SLIDE then + set_mario_action(mario_index, ACT_ROLL, 0); + end +end + +function override_mario_action(mario_index, action) + return (action == ACT_ROLL) or (action == ACT_ROLL_AIR) end hook_event(HOOK_UPDATE, update) hook_event(HOOK_MARIO_UPDATE, mario_update) +hook_mario_action(ACT_ROLL, act_roll) +hook_mario_action(ACT_ROLL_AIR, act_roll_air) diff --git a/src/game/mario_actions_airborne.c b/src/game/mario_actions_airborne.c index 5c590752a..de2fa83e3 100644 --- a/src/game/mario_actions_airborne.c +++ b/src/game/mario_actions_airborne.c @@ -21,6 +21,7 @@ #include "object_helpers.h" #include "pc/configfile.h" #include "pc/network/network.h" +#include "pc/lua/smlua.h" void play_flip_sounds(struct MarioState *m, s16 frame1, s16 frame2, s16 frame3) { s32 animFrame = m->marioObj->header.gfx.unk38.animFrame; @@ -2184,55 +2185,57 @@ s32 mario_execute_airborne_action(struct MarioState *m) { play_far_fall_sound(m); - /* clang-format off */ - switch (m->action) { - case ACT_JUMP: cancel = act_jump(m); break; - case ACT_DOUBLE_JUMP: cancel = act_double_jump(m); break; - case ACT_FREEFALL: cancel = act_freefall(m); break; - case ACT_HOLD_JUMP: cancel = act_hold_jump(m); break; - case ACT_HOLD_FREEFALL: cancel = act_hold_freefall(m); break; - case ACT_SIDE_FLIP: cancel = act_side_flip(m); break; - case ACT_WALL_KICK_AIR: cancel = act_wall_kick_air(m); break; - case ACT_TWIRLING: cancel = act_twirling(m); break; - case ACT_WATER_JUMP: cancel = act_water_jump(m); break; - case ACT_HOLD_WATER_JUMP: cancel = act_hold_water_jump(m); break; - case ACT_STEEP_JUMP: cancel = act_steep_jump(m); break; - case ACT_BURNING_JUMP: cancel = act_burning_jump(m); break; - case ACT_BURNING_FALL: cancel = act_burning_fall(m); break; - case ACT_TRIPLE_JUMP: cancel = act_triple_jump(m); break; - case ACT_BACKFLIP: cancel = act_backflip(m); break; - case ACT_LONG_JUMP: cancel = act_long_jump(m); break; - case ACT_RIDING_SHELL_JUMP: - case ACT_RIDING_SHELL_FALL: cancel = act_riding_shell_air(m); break; - case ACT_DIVE: cancel = act_dive(m); break; - case ACT_AIR_THROW: cancel = act_air_throw(m); break; - case ACT_BACKWARD_AIR_KB: cancel = act_backward_air_kb(m); break; - case ACT_FORWARD_AIR_KB: cancel = act_forward_air_kb(m); break; - case ACT_HARD_FORWARD_AIR_KB: cancel = act_hard_forward_air_kb(m); break; - case ACT_HARD_BACKWARD_AIR_KB: cancel = act_hard_backward_air_kb(m); break; - case ACT_SOFT_BONK: cancel = act_soft_bonk(m); break; - case ACT_AIR_HIT_WALL: cancel = act_air_hit_wall(m); break; - case ACT_FORWARD_ROLLOUT: cancel = act_forward_rollout(m); break; - case ACT_SHOT_FROM_CANNON: cancel = act_shot_from_cannon(m); break; - case ACT_BUTT_SLIDE_AIR: cancel = act_butt_slide_air(m); break; - case ACT_HOLD_BUTT_SLIDE_AIR: cancel = act_hold_butt_slide_air(m); break; - case ACT_LAVA_BOOST: cancel = act_lava_boost(m); break; - case ACT_GETTING_BLOWN: cancel = act_getting_blown(m); break; - case ACT_BACKWARD_ROLLOUT: cancel = act_backward_rollout(m); break; - case ACT_CRAZY_BOX_BOUNCE: cancel = act_crazy_box_bounce(m); break; - case ACT_SPECIAL_TRIPLE_JUMP: cancel = act_special_triple_jump(m); break; - case ACT_GROUND_POUND: cancel = act_ground_pound(m); break; - case ACT_THROWN_FORWARD: cancel = act_thrown_forward(m); break; - case ACT_THROWN_BACKWARD: cancel = act_thrown_backward(m); break; - case ACT_FLYING_TRIPLE_JUMP: cancel = act_flying_triple_jump(m); break; - case ACT_SLIDE_KICK: cancel = act_slide_kick(m); break; - case ACT_JUMP_KICK: cancel = act_jump_kick(m); break; - case ACT_FLYING: cancel = act_flying(m); break; - case ACT_RIDING_HOOT: cancel = act_riding_hoot(m); break; - case ACT_TOP_OF_POLE_JUMP: cancel = act_top_of_pole_jump(m); break; - case ACT_VERTICAL_WIND: cancel = act_vertical_wind(m); break; + if (!smlua_call_action_hook(m, (s32*)&cancel)) { + /* clang-format off */ + switch (m->action) { + case ACT_JUMP: cancel = act_jump(m); break; + case ACT_DOUBLE_JUMP: cancel = act_double_jump(m); break; + case ACT_FREEFALL: cancel = act_freefall(m); break; + case ACT_HOLD_JUMP: cancel = act_hold_jump(m); break; + case ACT_HOLD_FREEFALL: cancel = act_hold_freefall(m); break; + case ACT_SIDE_FLIP: cancel = act_side_flip(m); break; + case ACT_WALL_KICK_AIR: cancel = act_wall_kick_air(m); break; + case ACT_TWIRLING: cancel = act_twirling(m); break; + case ACT_WATER_JUMP: cancel = act_water_jump(m); break; + case ACT_HOLD_WATER_JUMP: cancel = act_hold_water_jump(m); break; + case ACT_STEEP_JUMP: cancel = act_steep_jump(m); break; + case ACT_BURNING_JUMP: cancel = act_burning_jump(m); break; + case ACT_BURNING_FALL: cancel = act_burning_fall(m); break; + case ACT_TRIPLE_JUMP: cancel = act_triple_jump(m); break; + case ACT_BACKFLIP: cancel = act_backflip(m); break; + case ACT_LONG_JUMP: cancel = act_long_jump(m); break; + case ACT_RIDING_SHELL_JUMP: + case ACT_RIDING_SHELL_FALL: cancel = act_riding_shell_air(m); break; + case ACT_DIVE: cancel = act_dive(m); break; + case ACT_AIR_THROW: cancel = act_air_throw(m); break; + case ACT_BACKWARD_AIR_KB: cancel = act_backward_air_kb(m); break; + case ACT_FORWARD_AIR_KB: cancel = act_forward_air_kb(m); break; + case ACT_HARD_FORWARD_AIR_KB: cancel = act_hard_forward_air_kb(m); break; + case ACT_HARD_BACKWARD_AIR_KB: cancel = act_hard_backward_air_kb(m); break; + case ACT_SOFT_BONK: cancel = act_soft_bonk(m); break; + case ACT_AIR_HIT_WALL: cancel = act_air_hit_wall(m); break; + case ACT_FORWARD_ROLLOUT: cancel = act_forward_rollout(m); break; + case ACT_SHOT_FROM_CANNON: cancel = act_shot_from_cannon(m); break; + case ACT_BUTT_SLIDE_AIR: cancel = act_butt_slide_air(m); break; + case ACT_HOLD_BUTT_SLIDE_AIR: cancel = act_hold_butt_slide_air(m); break; + case ACT_LAVA_BOOST: cancel = act_lava_boost(m); break; + case ACT_GETTING_BLOWN: cancel = act_getting_blown(m); break; + case ACT_BACKWARD_ROLLOUT: cancel = act_backward_rollout(m); break; + case ACT_CRAZY_BOX_BOUNCE: cancel = act_crazy_box_bounce(m); break; + case ACT_SPECIAL_TRIPLE_JUMP: cancel = act_special_triple_jump(m); break; + case ACT_GROUND_POUND: cancel = act_ground_pound(m); break; + case ACT_THROWN_FORWARD: cancel = act_thrown_forward(m); break; + case ACT_THROWN_BACKWARD: cancel = act_thrown_backward(m); break; + case ACT_FLYING_TRIPLE_JUMP: cancel = act_flying_triple_jump(m); break; + case ACT_SLIDE_KICK: cancel = act_slide_kick(m); break; + case ACT_JUMP_KICK: cancel = act_jump_kick(m); break; + case ACT_FLYING: cancel = act_flying(m); break; + case ACT_RIDING_HOOT: cancel = act_riding_hoot(m); break; + case ACT_TOP_OF_POLE_JUMP: cancel = act_top_of_pole_jump(m); break; + case ACT_VERTICAL_WIND: cancel = act_vertical_wind(m); break; + } + /* clang-format on */ } - /* clang-format on */ return cancel; } diff --git a/src/game/mario_actions_automatic.c b/src/game/mario_actions_automatic.c index d7797f4f5..f5df09cb6 100644 --- a/src/game/mario_actions_automatic.c +++ b/src/game/mario_actions_automatic.c @@ -22,6 +22,7 @@ #include "mario_step.h" #include "pc/configfile.h" #include "pc/network/network.h" +#include "pc/lua/smlua.h" #define POLE_NONE 0 #define POLE_TOUCHED_FLOOR 1 @@ -1048,28 +1049,30 @@ s32 mario_execute_automatic_action(struct MarioState *m) { m->quicksandDepth = 0.0f; - /* clang-format off */ - switch (m->action) { - case ACT_HOLDING_POLE: cancel = act_holding_pole(m); break; - case ACT_GRAB_POLE_SLOW: cancel = act_grab_pole_slow(m); break; - case ACT_GRAB_POLE_FAST: cancel = act_grab_pole_fast(m); break; - case ACT_CLIMBING_POLE: cancel = act_climbing_pole(m); break; - case ACT_TOP_OF_POLE_TRANSITION: cancel = act_top_of_pole_transition(m); break; - case ACT_TOP_OF_POLE: cancel = act_top_of_pole(m); break; - case ACT_START_HANGING: cancel = act_start_hanging(m); break; - case ACT_HANGING: cancel = act_hanging(m); break; - case ACT_HANG_MOVING: cancel = act_hang_moving(m); break; - case ACT_LEDGE_GRAB: cancel = act_ledge_grab(m); break; - case ACT_LEDGE_CLIMB_SLOW_1: cancel = act_ledge_climb_slow(m); break; - case ACT_LEDGE_CLIMB_SLOW_2: cancel = act_ledge_climb_slow(m); break; - case ACT_LEDGE_CLIMB_DOWN: cancel = act_ledge_climb_down(m); break; - case ACT_LEDGE_CLIMB_FAST: cancel = act_ledge_climb_fast(m); break; - case ACT_GRABBED: cancel = act_grabbed(m); break; - case ACT_IN_CANNON: cancel = act_in_cannon(m); break; - case ACT_TORNADO_TWIRLING: cancel = act_tornado_twirling(m); break; - case ACT_BUBBLED: cancel = act_bubbled(m); break; + if (!smlua_call_action_hook(m, &cancel)) { + /* clang-format off */ + switch (m->action) { + case ACT_HOLDING_POLE: cancel = act_holding_pole(m); break; + case ACT_GRAB_POLE_SLOW: cancel = act_grab_pole_slow(m); break; + case ACT_GRAB_POLE_FAST: cancel = act_grab_pole_fast(m); break; + case ACT_CLIMBING_POLE: cancel = act_climbing_pole(m); break; + case ACT_TOP_OF_POLE_TRANSITION: cancel = act_top_of_pole_transition(m); break; + case ACT_TOP_OF_POLE: cancel = act_top_of_pole(m); break; + case ACT_START_HANGING: cancel = act_start_hanging(m); break; + case ACT_HANGING: cancel = act_hanging(m); break; + case ACT_HANG_MOVING: cancel = act_hang_moving(m); break; + case ACT_LEDGE_GRAB: cancel = act_ledge_grab(m); break; + case ACT_LEDGE_CLIMB_SLOW_1: cancel = act_ledge_climb_slow(m); break; + case ACT_LEDGE_CLIMB_SLOW_2: cancel = act_ledge_climb_slow(m); break; + case ACT_LEDGE_CLIMB_DOWN: cancel = act_ledge_climb_down(m); break; + case ACT_LEDGE_CLIMB_FAST: cancel = act_ledge_climb_fast(m); break; + case ACT_GRABBED: cancel = act_grabbed(m); break; + case ACT_IN_CANNON: cancel = act_in_cannon(m); break; + case ACT_TORNADO_TWIRLING: cancel = act_tornado_twirling(m); break; + case ACT_BUBBLED: cancel = act_bubbled(m); break; + } + /* clang-format on */ } - /* clang-format on */ return cancel; } diff --git a/src/game/mario_actions_cutscene.c b/src/game/mario_actions_cutscene.c index 6260de40f..d2f25455e 100644 --- a/src/game/mario_actions_cutscene.c +++ b/src/game/mario_actions_cutscene.c @@ -33,6 +33,7 @@ #include "pc/pc_main.h" #include "pc/configfile.h" #include "pc/network/network.h" +#include "pc/lua/smlua.h" // TODO: put this elsewhere enum SaveOption { SAVE_OPT_SAVE_AND_CONTINUE = 1, /*SAVE_OPT_SAVE_AND_QUIT, SAVE_OPT_SAVE_EXIT_GAME,*/ SAVE_OPT_CONTINUE_DONT_SAVE }; @@ -2880,61 +2881,63 @@ s32 mario_execute_cutscene_action(struct MarioState *m) { return TRUE; } - /* clang-format off */ - switch (m->action) { - case ACT_DISAPPEARED: cancel = act_disappeared(m); break; - case ACT_INTRO_CUTSCENE: cancel = act_intro_cutscene(m); break; - case ACT_STAR_DANCE_EXIT: cancel = act_star_dance(m); break; - case ACT_STAR_DANCE_NO_EXIT: cancel = act_star_dance(m); break; - case ACT_STAR_DANCE_WATER: cancel = act_star_dance_water(m); break; - case ACT_FALL_AFTER_STAR_GRAB: cancel = act_fall_after_star_grab(m); break; - case ACT_READING_AUTOMATIC_DIALOG: cancel = act_reading_automatic_dialog(m); break; - case ACT_READING_NPC_DIALOG: cancel = act_reading_npc_dialog(m); break; - case ACT_DEBUG_FREE_MOVE: cancel = act_debug_free_move(m); break; - case ACT_READING_SIGN: cancel = act_reading_sign(m); break; - case ACT_JUMBO_STAR_CUTSCENE: cancel = act_jumbo_star_cutscene(m); break; - case ACT_WAITING_FOR_DIALOG: cancel = act_waiting_for_dialog(m); break; - case ACT_STANDING_DEATH: cancel = act_standing_death(m); break; - case ACT_QUICKSAND_DEATH: cancel = act_quicksand_death(m); break; - case ACT_ELECTROCUTION: cancel = act_electrocution(m); break; - case ACT_SUFFOCATION: cancel = act_suffocation(m); break; - case ACT_DEATH_ON_STOMACH: cancel = act_death_on_stomach(m); break; - case ACT_DEATH_ON_BACK: cancel = act_death_on_back(m); break; - case ACT_EATEN_BY_BUBBA: cancel = act_eaten_by_bubba(m); break; - case ACT_END_PEACH_CUTSCENE: cancel = act_end_peach_cutscene(m); break; - case ACT_CREDITS_CUTSCENE: cancel = act_credits_cutscene(m); break; - case ACT_END_WAVING_CUTSCENE: cancel = act_end_waving_cutscene(m); break; - case ACT_PULLING_DOOR: - case ACT_PUSHING_DOOR: cancel = act_going_through_door(m); break; - case ACT_WARP_DOOR_SPAWN: cancel = act_warp_door_spawn(m); break; - case ACT_EMERGE_FROM_PIPE: cancel = act_emerge_from_pipe(m); break; - case ACT_SPAWN_SPIN_AIRBORNE: cancel = act_spawn_spin_airborne(m); break; - case ACT_SPAWN_SPIN_LANDING: cancel = act_spawn_spin_landing(m); break; - case ACT_EXIT_AIRBORNE: cancel = act_exit_airborne(m); break; - case ACT_EXIT_LAND_SAVE_DIALOG: cancel = act_exit_land_save_dialog(m); break; - case ACT_DEATH_EXIT: cancel = act_death_exit(m); break; - case ACT_UNUSED_DEATH_EXIT: cancel = act_unused_death_exit(m); break; - case ACT_FALLING_DEATH_EXIT: cancel = act_falling_death_exit(m); break; - case ACT_SPECIAL_EXIT_AIRBORNE: cancel = act_special_exit_airborne(m); break; - case ACT_SPECIAL_DEATH_EXIT: cancel = act_special_death_exit(m); break; - case ACT_FALLING_EXIT_AIRBORNE: cancel = act_falling_exit_airborne(m); break; - case ACT_UNLOCKING_KEY_DOOR: cancel = act_unlocking_key_door(m); break; - case ACT_UNLOCKING_STAR_DOOR: cancel = act_unlocking_star_door(m); break; - case ACT_ENTERING_STAR_DOOR: cancel = act_entering_star_door(m); break; - case ACT_SPAWN_NO_SPIN_AIRBORNE: cancel = act_spawn_no_spin_airborne(m); break; - case ACT_SPAWN_NO_SPIN_LANDING: cancel = act_spawn_no_spin_landing(m); break; - case ACT_BBH_ENTER_JUMP: cancel = act_bbh_enter_jump(m); break; - case ACT_BBH_ENTER_SPIN: cancel = act_bbh_enter_spin(m); break; - case ACT_TELEPORT_FADE_OUT: cancel = act_teleport_fade_out(m); break; - case ACT_TELEPORT_FADE_IN: cancel = act_teleport_fade_in(m); break; - case ACT_SHOCKED: cancel = act_shocked(m); break; - case ACT_SQUISHED: cancel = act_squished(m); break; - case ACT_HEAD_STUCK_IN_GROUND: cancel = act_head_stuck_in_ground(m); break; - case ACT_BUTT_STUCK_IN_GROUND: cancel = act_butt_stuck_in_ground(m); break; - case ACT_FEET_STUCK_IN_GROUND: cancel = act_feet_stuck_in_ground(m); break; - case ACT_PUTTING_ON_CAP: cancel = act_putting_on_cap(m); break; + if (!smlua_call_action_hook(m, &cancel)) { + /* clang-format off */ + switch (m->action) { + case ACT_DISAPPEARED: cancel = act_disappeared(m); break; + case ACT_INTRO_CUTSCENE: cancel = act_intro_cutscene(m); break; + case ACT_STAR_DANCE_EXIT: cancel = act_star_dance(m); break; + case ACT_STAR_DANCE_NO_EXIT: cancel = act_star_dance(m); break; + case ACT_STAR_DANCE_WATER: cancel = act_star_dance_water(m); break; + case ACT_FALL_AFTER_STAR_GRAB: cancel = act_fall_after_star_grab(m); break; + case ACT_READING_AUTOMATIC_DIALOG: cancel = act_reading_automatic_dialog(m); break; + case ACT_READING_NPC_DIALOG: cancel = act_reading_npc_dialog(m); break; + case ACT_DEBUG_FREE_MOVE: cancel = act_debug_free_move(m); break; + case ACT_READING_SIGN: cancel = act_reading_sign(m); break; + case ACT_JUMBO_STAR_CUTSCENE: cancel = act_jumbo_star_cutscene(m); break; + case ACT_WAITING_FOR_DIALOG: cancel = act_waiting_for_dialog(m); break; + case ACT_STANDING_DEATH: cancel = act_standing_death(m); break; + case ACT_QUICKSAND_DEATH: cancel = act_quicksand_death(m); break; + case ACT_ELECTROCUTION: cancel = act_electrocution(m); break; + case ACT_SUFFOCATION: cancel = act_suffocation(m); break; + case ACT_DEATH_ON_STOMACH: cancel = act_death_on_stomach(m); break; + case ACT_DEATH_ON_BACK: cancel = act_death_on_back(m); break; + case ACT_EATEN_BY_BUBBA: cancel = act_eaten_by_bubba(m); break; + case ACT_END_PEACH_CUTSCENE: cancel = act_end_peach_cutscene(m); break; + case ACT_CREDITS_CUTSCENE: cancel = act_credits_cutscene(m); break; + case ACT_END_WAVING_CUTSCENE: cancel = act_end_waving_cutscene(m); break; + case ACT_PULLING_DOOR: + case ACT_PUSHING_DOOR: cancel = act_going_through_door(m); break; + case ACT_WARP_DOOR_SPAWN: cancel = act_warp_door_spawn(m); break; + case ACT_EMERGE_FROM_PIPE: cancel = act_emerge_from_pipe(m); break; + case ACT_SPAWN_SPIN_AIRBORNE: cancel = act_spawn_spin_airborne(m); break; + case ACT_SPAWN_SPIN_LANDING: cancel = act_spawn_spin_landing(m); break; + case ACT_EXIT_AIRBORNE: cancel = act_exit_airborne(m); break; + case ACT_EXIT_LAND_SAVE_DIALOG: cancel = act_exit_land_save_dialog(m); break; + case ACT_DEATH_EXIT: cancel = act_death_exit(m); break; + case ACT_UNUSED_DEATH_EXIT: cancel = act_unused_death_exit(m); break; + case ACT_FALLING_DEATH_EXIT: cancel = act_falling_death_exit(m); break; + case ACT_SPECIAL_EXIT_AIRBORNE: cancel = act_special_exit_airborne(m); break; + case ACT_SPECIAL_DEATH_EXIT: cancel = act_special_death_exit(m); break; + case ACT_FALLING_EXIT_AIRBORNE: cancel = act_falling_exit_airborne(m); break; + case ACT_UNLOCKING_KEY_DOOR: cancel = act_unlocking_key_door(m); break; + case ACT_UNLOCKING_STAR_DOOR: cancel = act_unlocking_star_door(m); break; + case ACT_ENTERING_STAR_DOOR: cancel = act_entering_star_door(m); break; + case ACT_SPAWN_NO_SPIN_AIRBORNE: cancel = act_spawn_no_spin_airborne(m); break; + case ACT_SPAWN_NO_SPIN_LANDING: cancel = act_spawn_no_spin_landing(m); break; + case ACT_BBH_ENTER_JUMP: cancel = act_bbh_enter_jump(m); break; + case ACT_BBH_ENTER_SPIN: cancel = act_bbh_enter_spin(m); break; + case ACT_TELEPORT_FADE_OUT: cancel = act_teleport_fade_out(m); break; + case ACT_TELEPORT_FADE_IN: cancel = act_teleport_fade_in(m); break; + case ACT_SHOCKED: cancel = act_shocked(m); break; + case ACT_SQUISHED: cancel = act_squished(m); break; + case ACT_HEAD_STUCK_IN_GROUND: cancel = act_head_stuck_in_ground(m); break; + case ACT_BUTT_STUCK_IN_GROUND: cancel = act_butt_stuck_in_ground(m); break; + case ACT_FEET_STUCK_IN_GROUND: cancel = act_feet_stuck_in_ground(m); break; + case ACT_PUTTING_ON_CAP: cancel = act_putting_on_cap(m); break; + } + /* clang-format on */ } - /* clang-format on */ if (!cancel) { if (m->input & INPUT_IN_WATER) { diff --git a/src/game/mario_actions_moving.c b/src/game/mario_actions_moving.c index 01c96c766..5e5d0113a 100644 --- a/src/game/mario_actions_moving.c +++ b/src/game/mario_actions_moving.c @@ -15,6 +15,7 @@ #include "pc/configfile.h" #include "pc/cheats.h" #include "pc/network/network.h" +#include "pc/lua/smlua.h" struct LandingAction { s16 numFrames; @@ -186,7 +187,7 @@ void update_sliding_angle(struct MarioState *m, f32 accel, f32 lossFactor) { if ((newFacingDYaw -= 0x200) < 0) { newFacingDYaw = 0; } - } else if (newFacingDYaw > -0x4000 && newFacingDYaw < 0) { + } else if (newFacingDYaw >= -0x4000 && newFacingDYaw < 0) { if ((newFacingDYaw += 0x200) > 0) { newFacingDYaw = 0; } @@ -259,6 +260,8 @@ s32 update_sliding(struct MarioState *m, f32 stopSpeed) { lossFactor = m->intendedMag / 32.0f * forward * 0.02f + 0.92f; break; } + accel = 4.0f; + lossFactor = 0.994f; oldSpeed = sqrtf(m->slideVelX * m->slideVelX + m->slideVelZ * m->slideVelZ); @@ -1997,48 +2000,50 @@ s32 mario_execute_moving_action(struct MarioState *m) { return TRUE; } - /* clang-format off */ - switch (m->action) { - case ACT_WALKING: cancel = act_walking(m); break; - case ACT_HOLD_WALKING: cancel = act_hold_walking(m); break; - case ACT_HOLD_HEAVY_WALKING: cancel = act_hold_heavy_walking(m); break; - case ACT_TURNING_AROUND: cancel = act_turning_around(m); break; - case ACT_FINISH_TURNING_AROUND: cancel = act_finish_turning_around(m); break; - case ACT_BRAKING: cancel = act_braking(m); break; - case ACT_RIDING_SHELL_GROUND: cancel = act_riding_shell_ground(m); break; - case ACT_CRAWLING: cancel = act_crawling(m); break; - case ACT_BURNING_GROUND: cancel = act_burning_ground(m); break; - case ACT_DECELERATING: cancel = act_decelerating(m); break; - case ACT_HOLD_DECELERATING: cancel = act_hold_decelerating(m); break; - case ACT_BUTT_SLIDE: cancel = act_butt_slide(m); break; - case ACT_STOMACH_SLIDE: cancel = act_stomach_slide(m); break; - case ACT_HOLD_BUTT_SLIDE: cancel = act_hold_butt_slide(m); break; - case ACT_HOLD_STOMACH_SLIDE: cancel = act_hold_stomach_slide(m); break; - case ACT_DIVE_SLIDE: cancel = act_dive_slide(m); break; - case ACT_MOVE_PUNCHING: cancel = act_move_punching(m); break; - case ACT_CROUCH_SLIDE: cancel = act_crouch_slide(m); break; - case ACT_SLIDE_KICK_SLIDE: cancel = act_slide_kick_slide(m); break; - case ACT_HARD_BACKWARD_GROUND_KB: cancel = act_hard_backward_ground_kb(m); break; - case ACT_HARD_FORWARD_GROUND_KB: cancel = act_hard_forward_ground_kb(m); break; - case ACT_BACKWARD_GROUND_KB: cancel = act_backward_ground_kb(m); break; - case ACT_FORWARD_GROUND_KB: cancel = act_forward_ground_kb(m); break; - case ACT_SOFT_BACKWARD_GROUND_KB: cancel = act_soft_backward_ground_kb(m); break; - case ACT_SOFT_FORWARD_GROUND_KB: cancel = act_soft_forward_ground_kb(m); break; - case ACT_GROUND_BONK: cancel = act_ground_bonk(m); break; - case ACT_DEATH_EXIT_LAND: cancel = act_death_exit_land(m); break; - case ACT_JUMP_LAND: cancel = act_jump_land(m); break; - case ACT_FREEFALL_LAND: cancel = act_freefall_land(m); break; - case ACT_DOUBLE_JUMP_LAND: cancel = act_double_jump_land(m); break; - case ACT_SIDE_FLIP_LAND: cancel = act_side_flip_land(m); break; - case ACT_HOLD_JUMP_LAND: cancel = act_hold_jump_land(m); break; - case ACT_HOLD_FREEFALL_LAND: cancel = act_hold_freefall_land(m); break; - case ACT_TRIPLE_JUMP_LAND: cancel = act_triple_jump_land(m); break; - case ACT_BACKFLIP_LAND: cancel = act_backflip_land(m); break; - case ACT_QUICKSAND_JUMP_LAND: cancel = act_quicksand_jump_land(m); break; - case ACT_HOLD_QUICKSAND_JUMP_LAND: cancel = act_hold_quicksand_jump_land(m); break; - case ACT_LONG_JUMP_LAND: cancel = act_long_jump_land(m); break; + if (!smlua_call_action_hook(m, &cancel)) { + /* clang-format off */ + switch (m->action) { + case ACT_WALKING: cancel = act_walking(m); break; + case ACT_HOLD_WALKING: cancel = act_hold_walking(m); break; + case ACT_HOLD_HEAVY_WALKING: cancel = act_hold_heavy_walking(m); break; + case ACT_TURNING_AROUND: cancel = act_turning_around(m); break; + case ACT_FINISH_TURNING_AROUND: cancel = act_finish_turning_around(m); break; + case ACT_BRAKING: cancel = act_braking(m); break; + case ACT_RIDING_SHELL_GROUND: cancel = act_riding_shell_ground(m); break; + case ACT_CRAWLING: cancel = act_crawling(m); break; + case ACT_BURNING_GROUND: cancel = act_burning_ground(m); break; + case ACT_DECELERATING: cancel = act_decelerating(m); break; + case ACT_HOLD_DECELERATING: cancel = act_hold_decelerating(m); break; + case ACT_BUTT_SLIDE: cancel = act_butt_slide(m); break; + case ACT_STOMACH_SLIDE: cancel = act_stomach_slide(m); break; + case ACT_HOLD_BUTT_SLIDE: cancel = act_hold_butt_slide(m); break; + case ACT_HOLD_STOMACH_SLIDE: cancel = act_hold_stomach_slide(m); break; + case ACT_DIVE_SLIDE: cancel = act_dive_slide(m); break; + case ACT_MOVE_PUNCHING: cancel = act_move_punching(m); break; + case ACT_CROUCH_SLIDE: cancel = act_crouch_slide(m); break; + case ACT_SLIDE_KICK_SLIDE: cancel = act_slide_kick_slide(m); break; + case ACT_HARD_BACKWARD_GROUND_KB: cancel = act_hard_backward_ground_kb(m); break; + case ACT_HARD_FORWARD_GROUND_KB: cancel = act_hard_forward_ground_kb(m); break; + case ACT_BACKWARD_GROUND_KB: cancel = act_backward_ground_kb(m); break; + case ACT_FORWARD_GROUND_KB: cancel = act_forward_ground_kb(m); break; + case ACT_SOFT_BACKWARD_GROUND_KB: cancel = act_soft_backward_ground_kb(m); break; + case ACT_SOFT_FORWARD_GROUND_KB: cancel = act_soft_forward_ground_kb(m); break; + case ACT_GROUND_BONK: cancel = act_ground_bonk(m); break; + case ACT_DEATH_EXIT_LAND: cancel = act_death_exit_land(m); break; + case ACT_JUMP_LAND: cancel = act_jump_land(m); break; + case ACT_FREEFALL_LAND: cancel = act_freefall_land(m); break; + case ACT_DOUBLE_JUMP_LAND: cancel = act_double_jump_land(m); break; + case ACT_SIDE_FLIP_LAND: cancel = act_side_flip_land(m); break; + case ACT_HOLD_JUMP_LAND: cancel = act_hold_jump_land(m); break; + case ACT_HOLD_FREEFALL_LAND: cancel = act_hold_freefall_land(m); break; + case ACT_TRIPLE_JUMP_LAND: cancel = act_triple_jump_land(m); break; + case ACT_BACKFLIP_LAND: cancel = act_backflip_land(m); break; + case ACT_QUICKSAND_JUMP_LAND: cancel = act_quicksand_jump_land(m); break; + case ACT_HOLD_QUICKSAND_JUMP_LAND: cancel = act_hold_quicksand_jump_land(m); break; + case ACT_LONG_JUMP_LAND: cancel = act_long_jump_land(m); break; + } + /* clang-format on */ } - /* clang-format on */ if (!cancel && (m->input & INPUT_IN_WATER)) { m->particleFlags |= PARTICLE_WAVE_TRAIL; diff --git a/src/game/mario_actions_object.c b/src/game/mario_actions_object.c index 04a1e54b7..38bbe77b3 100644 --- a/src/game/mario_actions_object.c +++ b/src/game/mario_actions_object.c @@ -14,6 +14,7 @@ #include "pc/configfile.h" #include "pc/network/network.h" #include "object_helpers.h" +#include "pc/lua/smlua.h" /** * Used by act_punching() to determine Mario's forward velocity during each @@ -492,20 +493,22 @@ s32 mario_execute_object_action(struct MarioState *m) { return TRUE; } - /* clang-format off */ - switch (m->action) { - case ACT_PUNCHING: cancel = act_punching(m); break; - case ACT_PICKING_UP: cancel = act_picking_up(m); break; - case ACT_DIVE_PICKING_UP: cancel = act_dive_picking_up(m); break; - case ACT_STOMACH_SLIDE_STOP: cancel = act_stomach_slide_stop(m); break; - case ACT_PLACING_DOWN: cancel = act_placing_down(m); break; - case ACT_THROWING: cancel = act_throwing(m); break; - case ACT_HEAVY_THROW: cancel = act_heavy_throw(m); break; - case ACT_PICKING_UP_BOWSER: cancel = act_picking_up_bowser(m); break; - case ACT_HOLDING_BOWSER: cancel = act_holding_bowser(m); break; - case ACT_RELEASING_BOWSER: cancel = act_releasing_bowser(m); break; + if (!smlua_call_action_hook(m, &cancel)) { + /* clang-format off */ + switch (m->action) { + case ACT_PUNCHING: cancel = act_punching(m); break; + case ACT_PICKING_UP: cancel = act_picking_up(m); break; + case ACT_DIVE_PICKING_UP: cancel = act_dive_picking_up(m); break; + case ACT_STOMACH_SLIDE_STOP: cancel = act_stomach_slide_stop(m); break; + case ACT_PLACING_DOWN: cancel = act_placing_down(m); break; + case ACT_THROWING: cancel = act_throwing(m); break; + case ACT_HEAVY_THROW: cancel = act_heavy_throw(m); break; + case ACT_PICKING_UP_BOWSER: cancel = act_picking_up_bowser(m); break; + case ACT_HOLDING_BOWSER: cancel = act_holding_bowser(m); break; + case ACT_RELEASING_BOWSER: cancel = act_releasing_bowser(m); break; + } + /* clang-format on */ } - /* clang-format on */ if (!cancel && (m->input & INPUT_IN_WATER)) { m->particleFlags |= PARTICLE_IDLE_WATER_WAVE; diff --git a/src/game/mario_actions_stationary.c b/src/game/mario_actions_stationary.c index 3388c65ce..2594900a9 100644 --- a/src/game/mario_actions_stationary.c +++ b/src/game/mario_actions_stationary.c @@ -19,6 +19,7 @@ #include "thread6.h" #include "pc/configfile.h" #include "pc/network/network.h" +#include "pc/lua/smlua.h" s32 check_common_idle_cancels(struct MarioState *m) { mario_drop_held_object(m); @@ -1146,46 +1147,48 @@ s32 mario_execute_stationary_action(struct MarioState *m) { return 1; } - /* clang-format off */ - switch (m->action) { - case ACT_IDLE: sp24 = act_idle(m); break; - case ACT_START_SLEEPING: sp24 = act_start_sleeping(m); break; - case ACT_SLEEPING: sp24 = act_sleeping(m); break; - case ACT_WAKING_UP: sp24 = act_waking_up(m); break; - case ACT_PANTING: sp24 = act_panting(m); break; - case ACT_HOLD_PANTING_UNUSED: sp24 = act_hold_panting_unused(m); break; - case ACT_HOLD_IDLE: sp24 = act_hold_idle(m); break; - case ACT_HOLD_HEAVY_IDLE: sp24 = act_hold_heavy_idle(m); break; - case ACT_IN_QUICKSAND: sp24 = act_in_quicksand(m); break; - case ACT_STANDING_AGAINST_WALL: sp24 = act_standing_against_wall(m); break; - case ACT_COUGHING: sp24 = act_coughing(m); break; - case ACT_SHIVERING: sp24 = act_shivering(m); break; - case ACT_CROUCHING: sp24 = act_crouching(m); break; - case ACT_START_CROUCHING: sp24 = act_start_crouching(m); break; - case ACT_STOP_CROUCHING: sp24 = act_stop_crouching(m); break; - case ACT_START_CRAWLING: sp24 = act_start_crawling(m); break; - case ACT_STOP_CRAWLING: sp24 = act_stop_crawling(m); break; - case ACT_SLIDE_KICK_SLIDE_STOP: sp24 = act_slide_kick_slide_stop(m); break; - case ACT_SHOCKWAVE_BOUNCE: sp24 = act_shockwave_bounce(m); break; - case ACT_FIRST_PERSON: sp24 = act_first_person(m); break; - case ACT_JUMP_LAND_STOP: sp24 = act_jump_land_stop(m); break; - case ACT_DOUBLE_JUMP_LAND_STOP: sp24 = act_double_jump_land_stop(m); break; - case ACT_FREEFALL_LAND_STOP: sp24 = act_freefall_land_stop(m); break; - case ACT_SIDE_FLIP_LAND_STOP: sp24 = act_side_flip_land_stop(m); break; - case ACT_HOLD_JUMP_LAND_STOP: sp24 = act_hold_jump_land_stop(m); break; - case ACT_HOLD_FREEFALL_LAND_STOP: sp24 = act_hold_freefall_land_stop(m); break; - case ACT_AIR_THROW_LAND: sp24 = act_air_throw_land(m); break; - case ACT_LAVA_BOOST_LAND: sp24 = act_lava_boost_land(m); break; - case ACT_TWIRL_LAND: sp24 = act_twirl_land(m); break; - case ACT_TRIPLE_JUMP_LAND_STOP: sp24 = act_triple_jump_land_stop(m); break; - case ACT_BACKFLIP_LAND_STOP: sp24 = act_backflip_land_stop(m); break; - case ACT_LONG_JUMP_LAND_STOP: sp24 = act_long_jump_land_stop(m); break; - case ACT_GROUND_POUND_LAND: sp24 = act_ground_pound_land(m); break; - case ACT_BRAKING_STOP: sp24 = act_braking_stop(m); break; - case ACT_BUTT_SLIDE_STOP: sp24 = act_butt_slide_stop(m); break; - case ACT_HOLD_BUTT_SLIDE_STOP: sp24 = act_hold_butt_slide_stop(m); break; + if (!smlua_call_action_hook(m, &sp24)) { + /* clang-format off */ + switch (m->action) { + case ACT_IDLE: sp24 = act_idle(m); break; + case ACT_START_SLEEPING: sp24 = act_start_sleeping(m); break; + case ACT_SLEEPING: sp24 = act_sleeping(m); break; + case ACT_WAKING_UP: sp24 = act_waking_up(m); break; + case ACT_PANTING: sp24 = act_panting(m); break; + case ACT_HOLD_PANTING_UNUSED: sp24 = act_hold_panting_unused(m); break; + case ACT_HOLD_IDLE: sp24 = act_hold_idle(m); break; + case ACT_HOLD_HEAVY_IDLE: sp24 = act_hold_heavy_idle(m); break; + case ACT_IN_QUICKSAND: sp24 = act_in_quicksand(m); break; + case ACT_STANDING_AGAINST_WALL: sp24 = act_standing_against_wall(m); break; + case ACT_COUGHING: sp24 = act_coughing(m); break; + case ACT_SHIVERING: sp24 = act_shivering(m); break; + case ACT_CROUCHING: sp24 = act_crouching(m); break; + case ACT_START_CROUCHING: sp24 = act_start_crouching(m); break; + case ACT_STOP_CROUCHING: sp24 = act_stop_crouching(m); break; + case ACT_START_CRAWLING: sp24 = act_start_crawling(m); break; + case ACT_STOP_CRAWLING: sp24 = act_stop_crawling(m); break; + case ACT_SLIDE_KICK_SLIDE_STOP: sp24 = act_slide_kick_slide_stop(m); break; + case ACT_SHOCKWAVE_BOUNCE: sp24 = act_shockwave_bounce(m); break; + case ACT_FIRST_PERSON: sp24 = act_first_person(m); break; + case ACT_JUMP_LAND_STOP: sp24 = act_jump_land_stop(m); break; + case ACT_DOUBLE_JUMP_LAND_STOP: sp24 = act_double_jump_land_stop(m); break; + case ACT_FREEFALL_LAND_STOP: sp24 = act_freefall_land_stop(m); break; + case ACT_SIDE_FLIP_LAND_STOP: sp24 = act_side_flip_land_stop(m); break; + case ACT_HOLD_JUMP_LAND_STOP: sp24 = act_hold_jump_land_stop(m); break; + case ACT_HOLD_FREEFALL_LAND_STOP: sp24 = act_hold_freefall_land_stop(m); break; + case ACT_AIR_THROW_LAND: sp24 = act_air_throw_land(m); break; + case ACT_LAVA_BOOST_LAND: sp24 = act_lava_boost_land(m); break; + case ACT_TWIRL_LAND: sp24 = act_twirl_land(m); break; + case ACT_TRIPLE_JUMP_LAND_STOP: sp24 = act_triple_jump_land_stop(m); break; + case ACT_BACKFLIP_LAND_STOP: sp24 = act_backflip_land_stop(m); break; + case ACT_LONG_JUMP_LAND_STOP: sp24 = act_long_jump_land_stop(m); break; + case ACT_GROUND_POUND_LAND: sp24 = act_ground_pound_land(m); break; + case ACT_BRAKING_STOP: sp24 = act_braking_stop(m); break; + case ACT_BUTT_SLIDE_STOP: sp24 = act_butt_slide_stop(m); break; + case ACT_HOLD_BUTT_SLIDE_STOP: sp24 = act_hold_butt_slide_stop(m); break; + } + /* clang-format on */ } - /* clang-format on */ if (!sp24) { if (m->input & INPUT_IN_WATER) { diff --git a/src/game/mario_actions_submerged.c b/src/game/mario_actions_submerged.c index 711a97b9c..87f1fe9a2 100644 --- a/src/game/mario_actions_submerged.c +++ b/src/game/mario_actions_submerged.c @@ -18,6 +18,7 @@ #include "thread6.h" #include "pc/configfile.h" #include "pc/network/network.h" +#include "pc/lua/smlua.h" #define MIN_SWIM_STRENGTH 160 #define MIN_SWIM_SPEED 16.0f @@ -1543,42 +1544,44 @@ s32 mario_execute_submerged_action(struct MarioState *m) { m->marioBodyState->headAngle[1] = 0; m->marioBodyState->headAngle[2] = 0; - /* clang-format off */ - switch (m->action) { - case ACT_WATER_IDLE: cancel = act_water_idle(m); break; - case ACT_HOLD_WATER_IDLE: cancel = act_hold_water_idle(m); break; - case ACT_WATER_ACTION_END: cancel = act_water_action_end(m); break; - case ACT_HOLD_WATER_ACTION_END: cancel = act_hold_water_action_end(m); break; - case ACT_DROWNING: cancel = act_drowning(m); break; - case ACT_BACKWARD_WATER_KB: cancel = act_backward_water_kb(m); break; - case ACT_FORWARD_WATER_KB: cancel = act_forward_water_kb(m); break; - case ACT_WATER_DEATH: cancel = act_water_death(m); break; - case ACT_WATER_SHOCKED: cancel = act_water_shocked(m); break; - case ACT_BREASTSTROKE: cancel = act_breaststroke(m); break; - case ACT_SWIMMING_END: cancel = act_swimming_end(m); break; - case ACT_FLUTTER_KICK: cancel = act_flutter_kick(m); break; - case ACT_HOLD_BREASTSTROKE: cancel = act_hold_breaststroke(m); break; - case ACT_HOLD_SWIMMING_END: cancel = act_hold_swimming_end(m); break; - case ACT_HOLD_FLUTTER_KICK: cancel = act_hold_flutter_kick(m); break; - case ACT_WATER_SHELL_SWIMMING: cancel = act_water_shell_swimming(m); break; - case ACT_WATER_THROW: cancel = act_water_throw(m); break; - case ACT_WATER_PUNCH: cancel = act_water_punch(m); break; - case ACT_WATER_PLUNGE: cancel = act_water_plunge(m); break; - case ACT_CAUGHT_IN_WHIRLPOOL: cancel = act_caught_in_whirlpool(m); break; - case ACT_METAL_WATER_STANDING: cancel = act_metal_water_standing(m); break; - case ACT_METAL_WATER_WALKING: cancel = act_metal_water_walking(m); break; - case ACT_METAL_WATER_FALLING: cancel = act_metal_water_falling(m); break; - case ACT_METAL_WATER_FALL_LAND: cancel = act_metal_water_fall_land(m); break; - case ACT_METAL_WATER_JUMP: cancel = act_metal_water_jump(m); break; - case ACT_METAL_WATER_JUMP_LAND: cancel = act_metal_water_jump_land(m); break; - case ACT_HOLD_METAL_WATER_STANDING: cancel = act_hold_metal_water_standing(m); break; - case ACT_HOLD_METAL_WATER_WALKING: cancel = act_hold_metal_water_walking(m); break; - case ACT_HOLD_METAL_WATER_FALLING: cancel = act_hold_metal_water_falling(m); break; - case ACT_HOLD_METAL_WATER_FALL_LAND: cancel = act_hold_metal_water_fall_land(m); break; - case ACT_HOLD_METAL_WATER_JUMP: cancel = act_hold_metal_water_jump(m); break; - case ACT_HOLD_METAL_WATER_JUMP_LAND: cancel = act_hold_metal_water_jump_land(m); break; + if (!smlua_call_action_hook(m, &cancel)) { + /* clang-format off */ + switch (m->action) { + case ACT_WATER_IDLE: cancel = act_water_idle(m); break; + case ACT_HOLD_WATER_IDLE: cancel = act_hold_water_idle(m); break; + case ACT_WATER_ACTION_END: cancel = act_water_action_end(m); break; + case ACT_HOLD_WATER_ACTION_END: cancel = act_hold_water_action_end(m); break; + case ACT_DROWNING: cancel = act_drowning(m); break; + case ACT_BACKWARD_WATER_KB: cancel = act_backward_water_kb(m); break; + case ACT_FORWARD_WATER_KB: cancel = act_forward_water_kb(m); break; + case ACT_WATER_DEATH: cancel = act_water_death(m); break; + case ACT_WATER_SHOCKED: cancel = act_water_shocked(m); break; + case ACT_BREASTSTROKE: cancel = act_breaststroke(m); break; + case ACT_SWIMMING_END: cancel = act_swimming_end(m); break; + case ACT_FLUTTER_KICK: cancel = act_flutter_kick(m); break; + case ACT_HOLD_BREASTSTROKE: cancel = act_hold_breaststroke(m); break; + case ACT_HOLD_SWIMMING_END: cancel = act_hold_swimming_end(m); break; + case ACT_HOLD_FLUTTER_KICK: cancel = act_hold_flutter_kick(m); break; + case ACT_WATER_SHELL_SWIMMING: cancel = act_water_shell_swimming(m); break; + case ACT_WATER_THROW: cancel = act_water_throw(m); break; + case ACT_WATER_PUNCH: cancel = act_water_punch(m); break; + case ACT_WATER_PLUNGE: cancel = act_water_plunge(m); break; + case ACT_CAUGHT_IN_WHIRLPOOL: cancel = act_caught_in_whirlpool(m); break; + case ACT_METAL_WATER_STANDING: cancel = act_metal_water_standing(m); break; + case ACT_METAL_WATER_WALKING: cancel = act_metal_water_walking(m); break; + case ACT_METAL_WATER_FALLING: cancel = act_metal_water_falling(m); break; + case ACT_METAL_WATER_FALL_LAND: cancel = act_metal_water_fall_land(m); break; + case ACT_METAL_WATER_JUMP: cancel = act_metal_water_jump(m); break; + case ACT_METAL_WATER_JUMP_LAND: cancel = act_metal_water_jump_land(m); break; + case ACT_HOLD_METAL_WATER_STANDING: cancel = act_hold_metal_water_standing(m); break; + case ACT_HOLD_METAL_WATER_WALKING: cancel = act_hold_metal_water_walking(m); break; + case ACT_HOLD_METAL_WATER_FALLING: cancel = act_hold_metal_water_falling(m); break; + case ACT_HOLD_METAL_WATER_FALL_LAND: cancel = act_hold_metal_water_fall_land(m); break; + case ACT_HOLD_METAL_WATER_JUMP: cancel = act_hold_metal_water_jump(m); break; + case ACT_HOLD_METAL_WATER_JUMP_LAND: cancel = act_hold_metal_water_jump_land(m); break; + } + /* clang-format on */ } - /* clang-format on */ return cancel; } diff --git a/src/game/object_list_processor.c b/src/game/object_list_processor.c index 77223b72a..ea484e182 100644 --- a/src/game/object_list_processor.c +++ b/src/game/object_list_processor.c @@ -286,7 +286,7 @@ void bhv_mario_update(void) { particleFlags = execute_mario_action(gCurrentObject); gCurrentObject->oMarioParticleFlags = particleFlags; - smlua_call_hooks_param(HOOK_MARIO_UPDATE, stateIndex); + smlua_call_event_hooks_param(HOOK_MARIO_UPDATE, stateIndex); // Mario code updates MarioState's versions of position etc, so we need // to sync it with the Mario object diff --git a/src/pc/lua/smlua.c b/src/pc/lua/smlua.c index 1a37418a9..627996499 100644 --- a/src/pc/lua/smlua.c +++ b/src/pc/lua/smlua.c @@ -2,6 +2,10 @@ lua_State* gLuaState = NULL; + /////////////////// + // hooked events // +/////////////////// + #define MAX_HOOKED_REFERENCES 64 struct LuaHookedEvent { @@ -29,30 +33,7 @@ int smlua_hook_event(lua_State* L) { return 1; } -static void smlua_execfile(char* path) { - lua_State* L = gLuaState; - if (luaL_dofile(L, path) != LUA_OK) { - LOG_LUA("LUA: Failed to load lua file."); - puts(lua_tostring(L, lua_gettop(L))); - } - lua_pop(L, lua_gettop(L)); -} - -void smlua_init(void) { - gLuaState = luaL_newstate(); - lua_State* L = gLuaState; - luaL_openlibs(L); - - lua_pushcfunction(L, smlua_hook_event); - lua_setglobal(L, "hook_event"); - - smlua_bind_get_set(); - - smlua_execfile("mods/constants.lua"); - smlua_execfile("mods/test.lua"); -} - -void smlua_call_hooks(enum LuaHookedEventType hookType) { +void smlua_call_event_hooks(enum LuaHookedEventType hookType) { lua_State* L = gLuaState; struct LuaHookedEvent* hook = &sHookedEvents[hookType]; for (int i = 0; i < hook->count; i++) { @@ -67,7 +48,7 @@ void smlua_call_hooks(enum LuaHookedEventType hookType) { } } -void smlua_call_hooks_param(enum LuaHookedEventType hookType, int param) { +void smlua_call_event_hooks_param(enum LuaHookedEventType hookType, int param) { lua_State* L = gLuaState; struct LuaHookedEvent* hook = &sHookedEvents[hookType]; for (int i = 0; i < hook->count; i++) { @@ -85,11 +66,112 @@ void smlua_call_hooks_param(enum LuaHookedEventType hookType, int param) { } } + //////////////////// + // hooked actions // +//////////////////// + +struct LuaHookedMarioAction { + u32 action; + int reference; +}; + +#define MAX_HOOKED_ACTIONS 64 + +static struct LuaHookedMarioAction sHookedMarioActions[MAX_HOOKED_ACTIONS] = { 0 }; +static int sHookedMarioActionsCount = 0; + +int smlua_hook_mario_action(lua_State* L) { + if (sHookedMarioActionsCount >= MAX_HOOKED_ACTIONS) { + LOG_LUA("LUA: Hooked mario actions exceeded maximum references!"); + return 0; + } + + struct LuaHookedMarioAction* hooked = &sHookedMarioActions[sHookedMarioActionsCount]; + hooked->action = lua_tointeger(L, -2); + hooked->reference = luaL_ref(L, LUA_REGISTRYINDEX); + + sHookedMarioActionsCount++; + return 1; +} + +bool smlua_call_action_hook(struct MarioState* m, s32* returnValue) { + lua_State* L = gLuaState; + for (int i = 0; i < sHookedMarioActionsCount; i++) { + if (sHookedMarioActions[i].action == m->action) { + // push the callback onto the stack + lua_rawgeti(L, LUA_REGISTRYINDEX, sHookedMarioActions[i].reference); + + // push param + lua_pushinteger(L, m->playerIndex); + + // call the callback + if (0 != lua_pcall(L, 1, 1, 0)) { + LOG_LUA("LUA: Failed to call the callback: %s", lua_tostring(L, -1)); + continue; + } + + // output the return value + *returnValue = lua_tointeger(L, -1); + lua_pop(L, 1); + + printf(">> action hook return: %d\n", *returnValue); + fflush(stdout); + return true; + } + } + + return false; +} + + ////////// + // main // +////////// + +static void smlua_execfile(char* path) { + lua_State* L = gLuaState; + if (luaL_dofile(L, path) != LUA_OK) { + LOG_LUA("LUA: Failed to load lua file."); + puts(lua_tostring(L, lua_gettop(L))); + } + lua_pop(L, lua_gettop(L)); +} + +void smlua_init(void) { + gLuaState = luaL_newstate(); + lua_State* L = gLuaState; + luaL_openlibs(L); + + lua_pushcfunction(L, smlua_hook_event); + lua_setglobal(L, "hook_event"); + + lua_pushcfunction(L, smlua_hook_mario_action); + lua_setglobal(L, "hook_mario_action"); + + smlua_bind_get_set(); + + smlua_execfile("mods/constants.lua"); + smlua_execfile("mods/test.lua"); +} + void smlua_update(void) { - smlua_call_hooks(HOOK_UPDATE); + smlua_call_event_hooks(HOOK_UPDATE); } void smlua_shutdown(void) { lua_State* L = gLuaState; lua_close(L); + + for (int i = 0; i < HOOK_MAX; i++) { + for (int j = 0; j < sHookedEvents[i].count; j++) { + sHookedEvents[i].reference[j] = 0; + } + sHookedEvents[i].count = 0; + } + + for (int i = 0; i < sHookedMarioActionsCount; i++) { + sHookedMarioActions[i].action = 0; + sHookedMarioActions[i].reference = 0; + } + sHookedMarioActionsCount = 0; + } diff --git a/src/pc/lua/smlua.h b/src/pc/lua/smlua.h index 6c8a83bea..ae74f2c6e 100644 --- a/src/pc/lua/smlua.h +++ b/src/pc/lua/smlua.h @@ -22,11 +22,14 @@ enum LuaHookedEventType { extern lua_State* gLuaState; +void smlua_call_event_hooks(enum LuaHookedEventType hookType); +void smlua_call_event_hooks_param(enum LuaHookedEventType hookType, int param); + + +bool smlua_call_action_hook(struct MarioState* m, s32* returnValue); + void smlua_init(void); void smlua_update(void); void smlua_shutdown(void); -void smlua_call_hooks(enum LuaHookedEventType hookType); -void smlua_call_hooks_param(enum LuaHookedEventType hookType, int param); - #endif \ No newline at end of file diff --git a/src/pc/lua/smlua_get_set.c b/src/pc/lua/smlua_get_set.c index 2a2e5350c..5c80c5816 100644 --- a/src/pc/lua/smlua_get_set.c +++ b/src/pc/lua/smlua_get_set.c @@ -1,10 +1,434 @@ #include "smlua.h" -#include "game\level_update.h" -#include "game\area.h" -#include "game\mario.h" +#include "game/level_update.h" +#include "game/area.h" +#include "game/mario.h" +#include "audio/external.h" #include "object_fields.h" +enum LuaValueType { + LVT_U8, + LVT_U16, + LVT_U32, + LVT_S8, + LVT_S16, + LVT_S32, + LVT_F32, + LVT_VEC3S, + LVT_VEC3F, +}; + +struct LuaObjectField { + const char* key; + enum LuaValueType valueType; + size_t valueOffset; + bool immutable; +}; + +#define LUA_VEC3S_FIELD_COUNT 3 +static struct LuaObjectField sVec3sFields[LUA_VEC3S_FIELD_COUNT] = { + { "x", LVT_S16, sizeof(s16) * 0, false }, + { "y", LVT_S16, sizeof(s16) * 1, false }, + { "z", LVT_S16, sizeof(s16) * 2, false }, +}; + +#define LUA_VEC3F_FIELD_COUNT 3 +static struct LuaObjectField sVec3fFields[LUA_VEC3F_FIELD_COUNT] = { + { "x", LVT_F32, sizeof(f32) * 0, false }, + { "y", LVT_F32, sizeof(f32) * 1, false }, + { "z", LVT_F32, sizeof(f32) * 2, false }, +}; + +#define LUA_MARIO_STATE_FIELD_COUNT 55 +static struct LuaObjectField sMarioStateFields[LUA_MARIO_STATE_FIELD_COUNT] = { + { "playerIndex", LVT_U16, offsetof(struct MarioState, playerIndex) , true }, + { "input", LVT_U16, offsetof(struct MarioState, input) , false }, + { "flags", LVT_U32, offsetof(struct MarioState, flags) , false }, + { "particleFlags", LVT_U32, offsetof(struct MarioState, particleFlags) , false }, + { "action", LVT_U32, offsetof(struct MarioState, action) , false }, + { "prevAction", LVT_U32, offsetof(struct MarioState, prevAction) , false }, + { "terrainSoundAddend", LVT_U32, offsetof(struct MarioState, terrainSoundAddend) , false }, + { "actionState", LVT_U16, offsetof(struct MarioState, actionState) , false }, + { "actionTimer", LVT_U16, offsetof(struct MarioState, actionTimer) , false }, + { "actionArg", LVT_U32, offsetof(struct MarioState, actionArg) , false }, + { "intendedMag", LVT_F32, offsetof(struct MarioState, intendedMag) , false }, + { "intendedYaw", LVT_S16, offsetof(struct MarioState, intendedYaw) , false }, + { "invincTimer", LVT_S16, offsetof(struct MarioState, invincTimer) , false }, + { "framesSinceA", LVT_U8, offsetof(struct MarioState, framesSinceA) , false }, + { "framesSinceB", LVT_U8, offsetof(struct MarioState, framesSinceB) , false }, + { "wallKickTimer", LVT_U8, offsetof(struct MarioState, wallKickTimer) , false }, + { "doubleJumpTimer", LVT_U8, offsetof(struct MarioState, doubleJumpTimer) , false }, + { "faceAngle", LVT_VEC3S, offsetof(struct MarioState, faceAngle) , true }, + { "angleVel", LVT_VEC3S, offsetof(struct MarioState, angleVel) , true }, + { "slideYaw", LVT_S16, offsetof(struct MarioState, slideYaw) , false }, + { "twirlYaw", LVT_S16, offsetof(struct MarioState, twirlYaw) , false }, + { "pos", LVT_VEC3F, offsetof(struct MarioState, pos) , true }, + { "vel", LVT_VEC3F, offsetof(struct MarioState, vel) , true }, + { "forwardVel", LVT_F32, offsetof(struct MarioState, forwardVel) , false }, + { "slideVelX", LVT_F32, offsetof(struct MarioState, slideVelX) , false }, + { "slideVelZ", LVT_F32, offsetof(struct MarioState, slideVelZ) , false }, + { "ceilHeight", LVT_F32, offsetof(struct MarioState, ceilHeight) , false }, + { "floorHeight", LVT_F32, offsetof(struct MarioState, floorHeight) , false }, + { "floorAngle", LVT_S16, offsetof(struct MarioState, floorAngle) , false }, + { "waterLevel", LVT_S16, offsetof(struct MarioState, waterLevel) , false }, + { "collidedObjInteractTypes", LVT_U32, offsetof(struct MarioState, collidedObjInteractTypes), false }, + { "numCoins", LVT_S16, offsetof(struct MarioState, numCoins) , false }, + { "numStars", LVT_S16, offsetof(struct MarioState, numStars) , false }, + { "mechani", LVT_S8, offsetof(struct MarioState, numKeys) , false }, + { "numLives", LVT_S8, offsetof(struct MarioState, numLives) , false }, + { "health", LVT_S16, offsetof(struct MarioState, health) , false }, + { "unkB0", LVT_S16, offsetof(struct MarioState, unkB0) , false }, + { "hurtCounter", LVT_U8, offsetof(struct MarioState, hurtCounter) , false }, + { "healCounter", LVT_U8, offsetof(struct MarioState, healCounter) , false }, + { "squishTimer", LVT_U8, offsetof(struct MarioState, squishTimer) , false }, + { "fadeWarpOpacity", LVT_U8, offsetof(struct MarioState, fadeWarpOpacity) , false }, + { "capTimer", LVT_U16, offsetof(struct MarioState, capTimer) , false }, + { "prevNumStarsForDialog", LVT_S16, offsetof(struct MarioState, prevNumStarsForDialog) , false }, + { "peakHeight", LVT_F32, offsetof(struct MarioState, peakHeight) , false }, + { "quicksandDepth", LVT_F32, offsetof(struct MarioState, quicksandDepth) , false }, + { "unkC4", LVT_F32, offsetof(struct MarioState, unkC4) , false }, + { "currentRoom", LVT_S16, offsetof(struct MarioState, currentRoom) , false }, + { "isSnoring", LVT_U8, offsetof(struct MarioState, isSnoring) , false }, + { "freeze", LVT_U8, offsetof(struct MarioState, freeze) , false }, + { "splineKeyframeFraction", LVT_F32, offsetof(struct MarioState, splineKeyframeFraction) , false }, + { "splineState", LVT_S32, offsetof(struct MarioState, splineState) , false }, + { "nonInstantWarpPos", LVT_VEC3F, offsetof(struct MarioState, nonInstantWarpPos) , true }, + { "wasNetworkVisible", LVT_U8, offsetof(struct MarioState, wasNetworkVisible) , false }, + { "minimumBoneY", LVT_F32, offsetof(struct MarioState, minimumBoneY) , false }, + { "curAnimOffset", LVT_F32, offsetof(struct MarioState, curAnimOffset) , false }, + /* TODO: implement + struct Surface *wall; + struct Surface *ceil; + struct Surface *floor; + struct Object *interactObj; + struct Object *heldObj; + struct Object *usedObj; + struct Object *riddenObj; + struct Object *marioObj; + struct SpawnInfo *spawnInfo; + struct Area *area; + struct PlayerCameraState *statusForCamera; + struct MarioBodyState *marioBodyState; + struct Controller *controller; + struct MarioAnimation *animation; + struct Object* heldByObj; + struct Object* bubbleObj; + Vec4s* splineKeyframe; + struct Character* character; + */ +}; + +enum LuaObjectType { + LOT_VEC3S, + LOT_VEC3F, + LOT_MARIO_STATE, + LOT_MAX, +}; + +struct LuaObjectTable { + enum LuaObjectType objectType; + struct LuaObjectField* fields; + u16 fieldCount; +}; + +struct LuaObjectTable sLuaObjectTable[LOT_MAX] = { + { LOT_VEC3S, sVec3sFields, LUA_VEC3S_FIELD_COUNT }, + { LOT_VEC3F, sVec3fFields, LUA_VEC3F_FIELD_COUNT }, + { LOT_MARIO_STATE, sMarioStateFields, LUA_MARIO_STATE_FIELD_COUNT }, +}; + +static struct LuaObjectField* smlua_get_object_field(struct LuaObjectTable* ot, const char* key) { + // TODO: change this to binary search or hash table or something + for (int i = 0; i < ot->fieldCount; i++) { + if (!strcmp(ot->fields[i].key, key)) { + return &ot->fields[i]; + } + } + + return NULL; +} + +// iteration 3 + +static void smlua_push_object(lua_State* L, enum LuaObjectType lot, void* p) { + lua_newtable(L); + smlua_push_integer_field(lot, "_lot"); + smlua_push_integer_field((u64)p, "_pointer"); + lua_pushglobaltable(L); + lua_getfield(gLuaState, -1, "_CObject"); + lua_setmetatable(L, -3); + lua_pop(L, 1); // pop global table +} + +static int smlua__get_field(lua_State* L) { + enum LuaObjectType lot = lua_tointeger(L, -3); + u64 pointer = lua_tointeger(L, -2); + const char* key = lua_tostring(L, -1); + + if (pointer == 0) { + LOG_LUA("_get_field on null pointer"); + return 0; + } + + if (lot >= LOT_MAX) { + LOG_LUA("_get_field on invalid LOT '%u'", lot); + return 0; + } + + struct LuaObjectField* data = smlua_get_object_field(&sLuaObjectTable[lot], key); + if (data == NULL) { + LOG_LUA("_get_field on invalid key '%s'", key); + return 0; + } + + u8* p = ((u8*)pointer) + data->valueOffset; + switch (data->valueType) { + case LVT_U8: lua_pushinteger(L, *(u8* )p); break; + case LVT_U16: lua_pushinteger(L, *(u16*)p); break; + case LVT_U32: lua_pushinteger(L, *(u32*)p); break; + case LVT_S8: lua_pushinteger(L, *(s8* )p); break; + case LVT_S16: lua_pushinteger(L, *(s16*)p); break; + case LVT_S32: lua_pushinteger(L, *(s32*)p); break; + case LVT_F32: lua_pushnumber( L, *(f32*)p); break; + case LVT_VEC3S: smlua_push_object(L, LOT_VEC3S, p); break; + case LVT_VEC3F: smlua_push_object(L, LOT_VEC3F, p); break; + default: + LOG_LUA("_get_field on unimplemented type '%d', key '%s'", data->valueType, key); + return 0; + } + + return 1; +} + +static int smlua__set_field(lua_State* L) { + enum LuaObjectType lot = lua_tointeger(L, -4); + u64 pointer = lua_tointeger(L, -3); + const char* key = lua_tostring(L, -2); + + if (pointer == 0) { + LOG_LUA("_get_field on null pointer"); + return 0; + } + + if (lot >= LOT_MAX) { + LOG_LUA("_get_field on invalid LOT '%u'", lot); + return 0; + } + + struct LuaObjectField* data = smlua_get_object_field(&sLuaObjectTable[lot], key); + if (data == NULL) { + LOG_LUA("_get_field on invalid key '%s'", key); + return 0; + } + + if (data->immutable) { + LOG_LUA("_get_field on immutable key '%s'", key); + return 0; + } + + u8* p = ((u8*)pointer) + data->valueOffset; + switch (data->valueType) { + case LVT_U8: *(u8*) p = lua_tointeger(L, -1); break; + case LVT_U16: *(u16*)p = lua_tointeger(L, -1); break; + case LVT_U32: *(u32*)p = lua_tointeger(L, -1); break; + case LVT_S8: *(s8*) p = lua_tointeger(L, -1); break; + case LVT_S16: *(s16*)p = lua_tointeger(L, -1); break; + case LVT_S32: *(s32*)p = lua_tointeger(L, -1); break; + case LVT_F32: *(f32*)p = lua_tonumber(L, -1); break; + default: + LOG_LUA("_get_field on unimplemented type '%d', key '%s'", data->valueType, key); + return 0; + } + + return 1; +} + +// iteration 2 + +static int smlua_get_mario_state_field(lua_State* L) { + u8 index = lua_tointeger(L, -2); + const char* key = lua_tostring(L, -1); + if (index >= MAX_PLAYERS) { + LOG_LUA("get_mario_state_field() on invalid index '%d'", index); + return 0; + } + + struct LuaObjectField* data = smlua_get_object_field(&sLuaObjectTable[LOT_MARIO_STATE], key); + if (data == NULL) { + LOG_LUA("get_mario_state_field() on invalid key '%s'", key); + return 0; + } + + u8* p = ((u8*)&gMarioStates[index]) + data->valueOffset; + switch (data->valueType) { + case LVT_U8: lua_pushinteger(L, *(u8* )p); break; + case LVT_U16: lua_pushinteger(L, *(u16*)p); break; + case LVT_U32: lua_pushinteger(L, *(u32*)p); break; + case LVT_S8: lua_pushinteger(L, *(s8* )p); break; + case LVT_S16: lua_pushinteger(L, *(s16*)p); break; + case LVT_S32: lua_pushinteger(L, *(s32*)p); break; + case LVT_F32: lua_pushnumber( L, *(f32*)p); break; + case LVT_VEC3S: + lua_newtable(L); + smlua_push_integer_field((u64)p, "_pointer"); + lua_pushglobaltable(L); + lua_getfield(gLuaState, -1, "_Vec3sMeta"); + lua_setmetatable(L, -3); + lua_pop(L, 1); // pop global table + break; + case LVT_VEC3F: + lua_newtable(L); + smlua_push_integer_field((u64)p, "_pointer"); + lua_pushglobaltable(L); + lua_getfield(gLuaState, -1, "_Vec3fMeta"); + lua_setmetatable(L, -3); + lua_pop(L, 1); // pop global table + break; + default: + LOG_LUA("get_mario_state_field() on unimplemented type '%d', key '%s'", data->valueType, key); + return 0; + } + + return 1; +} + +static int smlua_set_mario_state_field(lua_State* L) { + u8 index = lua_tointeger(L, -3); + const char* key = lua_tostring(L, -2); + if (index >= MAX_PLAYERS) { + LOG_LUA("set_mario_state_field() on invalid index '%d'", index); + return 0; + } + + struct LuaObjectField* data = smlua_get_object_field(&sLuaObjectTable[LOT_MARIO_STATE], key); + if (data == NULL) { + LOG_LUA("set_mario_state_field() on invalid key '%s'", key); + return 0; + } + if (data->immutable) { + LOG_LUA("set_mario_state_field() on immutable key '%s'", key); + return 0; + } + + u8* p = ((u8*)&gMarioStates[index]) + data->valueOffset; + switch (data->valueType) { + case LVT_U8: *(u8* )p = lua_tointeger(L, -1); break; + case LVT_U16: *(u16*)p = lua_tointeger(L, -1); break; + case LVT_U32: *(u32*)p = lua_tointeger(L, -1); break; + case LVT_S8: *(s8* )p = lua_tointeger(L, -1); break; + case LVT_S16: *(s16*)p = lua_tointeger(L, -1); break; + case LVT_S32: *(s32*)p = lua_tointeger(L, -1); break; + case LVT_F32: *(f32*)p = lua_tonumber( L, -1); break; + default: + LOG_LUA("set_mario_state_field() on unimplemented type '%d', key '%s'", data->valueType, key); + return 0; + } + + return 1; +} + +static int smlua_get_vec3s_field(lua_State* L) { + u64 pointer = lua_tointeger(L, -2); + const char* key = lua_tostring(L, -1); + + if (pointer == 0) { + LOG_LUA("get_vec3s_field() on null pointer"); + return 0; + } + + if (!strcmp("x", key)) { + lua_pushinteger(L, ((s16*)pointer)[0]); + } + else if (!strcmp("y", key)) { + lua_pushinteger(L, ((s16*)pointer)[1]); + } + else if (!strcmp("z", key)) { + lua_pushinteger(L, ((s16*)pointer)[2]); + } + else { + LOG_LUA("get_vec3s_field() on invalid key '%s'", key); + return 0; + } + + return 1; +} + +static int smlua_set_vec3s_field(lua_State* L) { + u64 pointer = lua_tointeger(L, -3); + const char* key = lua_tostring(L, -2); + s16 value = lua_tointeger(L, -1); + + if (pointer == 0) { + LOG_LUA("set_vec3s_field() on null pointer"); + return 0; + } + + if (!strcmp("x", key)) { + ((s16*)pointer)[0] = value; + } + else if (!strcmp("y", key)) { + ((s16*)pointer)[1] = value; + } + else if (!strcmp("z", key)) { + ((s16*)pointer)[2] = value; + } + else { + LOG_LUA("set_vec3s_field() on invalid key '%s'", key); + return 0; + } + + return 1; +} + +static int smlua_get_vec3f_field(lua_State* L) { + u64 pointer = lua_tointeger(L, -2); + const char* key = lua_tostring(L, -1); + + if (pointer == 0) { + LOG_LUA("get_vec3f_field() on null pointer"); + return 0; + } + + if (!strcmp("x", key)) { + lua_pushnumber(L, ((f32*)pointer)[0]); + } else if (!strcmp("y", key)) { + lua_pushnumber(L, ((f32*)pointer)[1]); + } else if (!strcmp("z", key)) { + lua_pushnumber(L, ((f32*)pointer)[2]); + } else { + LOG_LUA("get_vec3f_field() on invalid key '%s'", key); + return 0; + } + + return 1; +} + +static int smlua_set_vec3f_field(lua_State* L) { + u64 pointer = lua_tointeger(L, -3); + const char* key = lua_tostring(L, -2); + f32 value = lua_tonumber(L, -1); + + if (pointer == 0) { + LOG_LUA("set_vec3f_field() on null pointer"); + return 0; + } + + if (!strcmp("x", key)) { + ((f32*)pointer)[0] = value; + } else if (!strcmp("y", key)) { + ((f32*)pointer)[1] = value; + } else if (!strcmp("z", key)) { + ((f32*)pointer)[2] = value; + } else { + LOG_LUA("set_vec3f_field() on invalid key '%s'", key); + return 0; + } + + return 1; +} + +// iteration 1 + static int smlua_get_mario_state(lua_State* L) { int index = lua_tointeger(L, -1); lua_newtable(L); @@ -88,7 +512,24 @@ static int smlua_get_mario_state(lua_State* L) { //struct Area* area; //struct PlayerCameraState* statusForCamera; //struct MarioBodyState* marioBodyState; - //struct Controller* controller; + + { + lua_newtable(L); + smlua_push_integer_field(m->controller->buttonDown, "buttonDown"); + smlua_push_integer_field(m->controller->buttonPressed, "buttonPressed"); + smlua_push_integer_field(m->controller->extStickX, "extStickX"); + smlua_push_integer_field(m->controller->extStickY, "extStickY"); + smlua_push_integer_field(m->controller->port, "port"); + smlua_push_integer_field(m->controller->rawStickX, "rawStickX"); + smlua_push_integer_field(m->controller->rawStickY, "rawStickY"); + smlua_push_number_field(m->controller->stickMag, "stickMag"); + smlua_push_number_field(m->controller->stickX, "stickX"); + smlua_push_number_field(m->controller->stickY, "stickY"); + //m->controller->controllerData + //m->controller->statusData + lua_setfield(L, t, "controller"); + } + //struct MarioAnimation* animation; smlua_push_integer_field(m->collidedObjInteractTypes, "collidedObjInteractTypes"); @@ -237,7 +678,23 @@ static int smlua_set_mario_state(lua_State* L) { //struct Area* area; //struct PlayerCameraState* statusForCamera; //struct MarioBodyState* marioBodyState; - //struct Controller* controller; + + { + lua_getfield(L, -1, "controller"); + smlua_get_u16_field(&m->controller->buttonDown, "buttonDown"); + smlua_get_u16_field(&m->controller->buttonPressed, "buttonPressed"); + smlua_get_s16_field(&m->controller->extStickX, "extStickX"); + smlua_get_s16_field(&m->controller->extStickY, "extStickY"); + smlua_get_s32_field(&m->controller->port, "port"); + smlua_get_s16_field(&m->controller->rawStickX, "rawStickX"); + smlua_get_s16_field(&m->controller->rawStickY, "rawStickY"); + smlua_get_number_field(&m->controller->stickMag, "stickMag"); + smlua_get_number_field(&m->controller->stickX, "stickX"); + //m->controller->controllerData + //m->controller->statusData + lua_pop(L, 1); + } + //struct MarioAnimation* animation; smlua_get_u32_field(&m->collidedObjInteractTypes, "collidedObjInteractTypes"); @@ -291,17 +748,100 @@ static int smlua_set_mario_state(lua_State* L) { return 1; } +// END iteration 1 + int smlua_set_mario_action(lua_State* L) { int index = lua_tointeger(L, -3); u32 action = lua_tointeger(L, -2); u32 actionArg = lua_tointeger(L, -1); - set_mario_action(&gMarioStates[index], action, actionArg); + lua_pushinteger(L, set_mario_action(&gMarioStates[index], action, actionArg)); + return 1; +} + +int smlua_set_jumping_action(lua_State* L) { + int index = lua_tointeger(L, -3); + u32 action = lua_tointeger(L, -2); + u32 actionArg = lua_tointeger(L, -1); + lua_pushinteger(L, set_jumping_action(&gMarioStates[index], action, actionArg)); + return 1; +} + +int smlua_play_mario_sound(lua_State* L) { + int index = lua_tointeger(L, -3); + s32 actionSound = lua_tointeger(L, -2); + s32 marioSound = lua_tointeger(L, -1); + play_mario_sound(&gMarioStates[index], actionSound, marioSound); + return 1; +} + +int smlua_mario_set_forward_vel(lua_State* L) { + int index = lua_tointeger(L, -2); + f32 forwardVel = lua_tonumber(L, -1); + mario_set_forward_vel(&gMarioStates[index], forwardVel); + return 1; +} + +int smlua_play_sound(lua_State* L) { + s32 soundsBits = lua_tointeger(L, -4); + f32 pos[3] = { lua_tonumber(L, -3), lua_tonumber(L, -2), lua_tonumber(L, -1) }; + extern void play_sound(s32 soundBits, f32 * pos); + play_sound(soundsBits, pos); + return 1; +} + +int smlua_set_mario_animation(lua_State* L) { + int index = lua_tointeger(L, -2); + s32 targetAnimID = lua_tointeger(L, -1); + lua_pushinteger(L, set_mario_animation(&gMarioStates[index], targetAnimID)); + return 1; +} + +int smlua_update_sliding(lua_State* L) { + int index = lua_tointeger(L, -2); + f32 stopSpeed = lua_tonumber(L, -1); + extern s32 update_sliding(struct MarioState* m, f32 stopSpeed); + lua_pushinteger(L, update_sliding(&gMarioStates[index], stopSpeed)); + return 1; +} + +int smlua_common_slide_action(lua_State* L) { + int index = lua_tointeger(L, -4); + u32 endAction = lua_tointeger(L, -3); + u32 airAction = lua_tointeger(L, -2); + u32 animation = lua_tointeger(L, -1); + extern void common_slide_action(struct MarioState* m, u32 endAction, u32 airAction, s32 animation); + common_slide_action(&gMarioStates[index], endAction, airAction, animation); + return 1; +} + +int smlua_set_anim_to_frame(lua_State* L) { + int index = lua_tointeger(L, -2); + s16 animFrame = lua_tonumber(L, -1); + set_anim_to_frame(&gMarioStates[index], animFrame); return 1; } void smlua_bind_get_set(void) { lua_State* L = gLuaState; + lua_pushcfunction(L, smlua_get_mario_state_field); + lua_setglobal(L, "get_mario_state_field"); + + lua_pushcfunction(L, smlua_set_mario_state_field); + lua_setglobal(L, "set_mario_state_field"); + + lua_pushcfunction(L, smlua_get_vec3s_field); + lua_setglobal(L, "get_vec3s_field"); + + lua_pushcfunction(L, smlua_set_vec3s_field); + lua_setglobal(L, "set_vec3s_field"); + + lua_pushcfunction(L, smlua_get_vec3f_field); + lua_setglobal(L, "get_vec3f_field"); + + lua_pushcfunction(L, smlua_set_vec3f_field); + lua_setglobal(L, "set_vec3f_field"); + lua_pushcfunction(L, smlua_get_mario_state); lua_setglobal(L, "get_mario_state"); @@ -311,4 +851,28 @@ void smlua_bind_get_set(void) { lua_pushcfunction(L, smlua_set_mario_action); lua_setglobal(L, "set_mario_action"); + lua_pushcfunction(L, smlua_set_jumping_action); + lua_setglobal(L, "set_jumping_action"); + + lua_pushcfunction(L, smlua_play_mario_sound); + lua_setglobal(L, "play_mario_sound"); + + lua_pushcfunction(L, smlua_mario_set_forward_vel); + lua_setglobal(L, "mario_set_forward_vel"); + + lua_pushcfunction(L, smlua_play_sound); + lua_setglobal(L, "play_sound"); + + lua_pushcfunction(L, smlua_set_mario_animation); + lua_setglobal(L, "set_mario_animation"); + + lua_pushcfunction(L, smlua_update_sliding); + lua_setglobal(L, "update_sliding"); + + lua_pushcfunction(L, smlua_common_slide_action); + lua_setglobal(L, "common_slide_action"); + + lua_pushcfunction(L, smlua_set_anim_to_frame); + lua_setglobal(L, "set_anim_to_frame"); + } \ No newline at end of file diff --git a/src/pc/lua/smlua_utils.c b/src/pc/lua/smlua_utils.c index c332892ce..65e20900e 100644 --- a/src/pc/lua/smlua_utils.c +++ b/src/pc/lua/smlua_utils.c @@ -3,6 +3,7 @@ void smlua_dump_stack(void) { lua_State* L = gLuaState; int top = lua_gettop(L); + printf("--------------\n"); for (int i = 1; i <= top; i++) { printf("%d\t%s\t", i, luaL_typename(L, i)); switch (lua_type(L, i)) { @@ -23,9 +24,35 @@ void smlua_dump_stack(void) { break; } } + printf("--------------\n"); } -void smlua_push_integer_field(int val, char* name) { +void smlua_dump_globals(void) { + lua_State* L = gLuaState; + printf("--------------\n"); + lua_pushglobaltable(L); + + // table is in the stack at index 't' + lua_pushnil(L); // first key + while (lua_next(L, -2) != 0) { + // uses 'key' (at index -2) and 'value' (at index -1) + if (lua_type(L, -2) == LUA_TSTRING) { + printf("%s - %s\n", + lua_tostring(L, -2), + lua_typename(L, lua_type(L, -1))); + } else { + printf("%s - %s\n", + lua_typename(L, lua_type(L, -2)), + lua_typename(L, lua_type(L, -1))); + } + // removes 'value'; keeps 'key' for next iteration + lua_pop(L, 1); + } + lua_pop(L, 1); // remove global table(-1) + printf("--------------\n"); +} + +void smlua_push_integer_field(lua_Integer val, char* name) { int t = lua_gettop(gLuaState); lua_pushinteger(gLuaState, val); lua_setfield(gLuaState, t, name); diff --git a/src/pc/lua/smlua_utils.h b/src/pc/lua/smlua_utils.h index 987e58e7c..bdf6b7e3d 100644 --- a/src/pc/lua/smlua_utils.h +++ b/src/pc/lua/smlua_utils.h @@ -2,8 +2,9 @@ #define SMLUA_UTILS_H void smlua_dump_stack(void); +void smlua_dump_globals(void); -void smlua_push_integer_field(int val, char* name); +void smlua_push_integer_field(lua_Integer val, char* name); void smlua_push_number_field(float val, char* name); void smlua_get_u8_field(u8* val, char* name);