From 767809f56a2502a498f17bcb46160d4ca10e1921 Mon Sep 17 00:00:00 2001 From: MysterD Date: Sat, 22 Jan 2022 23:14:00 -0800 Subject: [PATCH] Lua mod table and download Mods are now loaded into a table Clients now request a mod list from the server, then download each file one at a time before joining Embedded constants.lua into the program --- autogen/convert_constants.py | 18 + {mods => autogen/lua_constants}/constants.lua | 0 build-windows-visual-studio/sm64ex.vcxproj | 9 +- .../sm64ex.vcxproj.filters | 21 + mods/character-abilities.lua | 60 + mods/extended-moveset.lua | 6 +- mods/test.lua | 2 - src/pc/lua/smlua.c | 34 +- src/pc/lua/smlua_constants_autogen.c | 1157 +++++++++++++++++ src/pc/lua/smlua_hooks.c | 5 + src/pc/mod_list.c | 130 ++ src/pc/mod_list.h | 32 + src/pc/network/network.c | 25 +- src/pc/network/network.h | 1 + src/pc/network/packets/packet.c | 9 +- src/pc/network/packets/packet.h | 18 + src/pc/network/packets/packet_download.c | 145 +++ src/pc/network/packets/packet_join.c | 3 + src/pc/network/packets/packet_mod_list.c | 86 ++ src/pc/network/socket/socket.c | 2 +- src/pc/pc_main.c | 5 +- 21 files changed, 1747 insertions(+), 21 deletions(-) create mode 100644 autogen/convert_constants.py rename {mods => autogen/lua_constants}/constants.lua (100%) create mode 100644 mods/character-abilities.lua delete mode 100644 mods/test.lua create mode 100644 src/pc/lua/smlua_constants_autogen.c create mode 100644 src/pc/mod_list.c create mode 100644 src/pc/mod_list.h create mode 100644 src/pc/network/packets/packet_download.c create mode 100644 src/pc/network/packets/packet_mod_list.c diff --git a/autogen/convert_constants.py b/autogen/convert_constants.py new file mode 100644 index 000000000..a805e9460 --- /dev/null +++ b/autogen/convert_constants.py @@ -0,0 +1,18 @@ +import os + +in_filename = os.path.dirname(os.path.realpath(__file__)) + "/lua_constants/constants.lua" +out_filename = os.path.dirname(os.path.realpath(__file__)) + '/../src/pc/lua/smlua_constants_autogen.c' + +built = "char gSmluaConstants[] = " +with open(in_filename) as fp: + lines = fp.readlines() + for line in lines: + if line.startswith('--'): + continue + if line.strip() == '': + continue + built += '"' + line.replace('\n', '').replace('\r', '') + '\\n"' + "\n" +built += ';' + +with open(out_filename, 'w') as out: + out.write(built) diff --git a/mods/constants.lua b/autogen/lua_constants/constants.lua similarity index 100% rename from mods/constants.lua rename to autogen/lua_constants/constants.lua diff --git a/build-windows-visual-studio/sm64ex.vcxproj b/build-windows-visual-studio/sm64ex.vcxproj index c983651b1..3c502a579 100644 --- a/build-windows-visual-studio/sm64ex.vcxproj +++ b/build-windows-visual-studio/sm64ex.vcxproj @@ -71,7 +71,7 @@ true - ../;../include/;../src/;C:/msys64/mingw64/include;../lib/lua/include/;$(IncludePath) + ../;../include/;../src/;C:/msys64/mingw64/include;../lib/lua/include/;C:\msys64\mingw64\x86_64-w64-mingw32\include;$(IncludePath) $(SolutionDir)\..\build\us_pc\ sm64.us.f3dex2e @@ -510,11 +510,13 @@ + + @@ -527,6 +529,7 @@ + @@ -544,10 +547,12 @@ + + @@ -961,6 +966,7 @@ + @@ -970,6 +976,7 @@ + diff --git a/build-windows-visual-studio/sm64ex.vcxproj.filters b/build-windows-visual-studio/sm64ex.vcxproj.filters index 29a0926e1..1a1bbc0de 100644 --- a/build-windows-visual-studio/sm64ex.vcxproj.filters +++ b/build-windows-visual-studio/sm64ex.vcxproj.filters @@ -4836,6 +4836,21 @@ Source Files\src\pc\lua + + Source Files\src\pc + + + Source Files\src\pc\lua + + + Source Files\src\pc\network\packets + + + Source Files\src\pc\network\packets + + + Source Files\src\pc\network\packets + @@ -5962,5 +5977,11 @@ Source Files\src\pc\lua + + Source Files\src\pc + + + Source Files\src\pc\network\packets + \ No newline at end of file diff --git a/mods/character-abilities.lua b/mods/character-abilities.lua new file mode 100644 index 000000000..0857df088 --- /dev/null +++ b/mods/character-abilities.lua @@ -0,0 +1,60 @@ + +gMarioStateExtras = {} +for i=0,(MAX_PLAYERS-1) do + gMarioStateExtras[i] = {} + local m = gMarioStates[i] + local e = gMarioStateExtras[i] + e.actionLastFrame = m.action +end + +----------- +-- luigi -- +----------- + +function luigi_action_on_change(m) + local e = gMarioStateExtras[m.playerIndex] + + -- extra height to the backflip + if m.action == ACT_BACKFLIP then + m.vel.y = m.vel.y + 25 + end +end + +function luigi_update(m) + local e = gMarioStateExtras[m.playerIndex] + -- backflip turns into twirl + if m.action == ACT_BACKFLIP and m.marioObj.header.gfx.animInfo.animFrame > 18 then + m.angleVel.y = 0x1800 + set_mario_action(m, ACT_TWIRLING, 1) + end +end + +---------- +-- main -- +---------- + +function mario_action_on_change(m) + -- if luigi then + luigi_update(m) + -- end +end + +function mario_update(m) + local e = gMarioStateExtras[m.playerIndex] + + -- if luigi then + luigi_update(m) + -- end + + -- action change event + if e.actionLastFrame ~= m.action then + mario_action_on_change(m) + end + e.actionLastFrame = m.action +end + +----------- +-- hooks -- +----------- + +hook_event(HOOK_MARIO_UPDATE, mario_update) diff --git a/mods/extended-moveset.lua b/mods/extended-moveset.lua index 168daae0c..c80825d0b 100644 --- a/mods/extended-moveset.lua +++ b/mods/extended-moveset.lua @@ -1085,10 +1085,10 @@ function mario_update(m) after_mario_update(m) end -function update() -end +----------- +-- hooks -- +----------- -hook_event(HOOK_UPDATE, update) hook_event(HOOK_BEFORE_MARIO_UPDATE, before_mario_update) hook_event(HOOK_MARIO_UPDATE, mario_update) diff --git a/mods/test.lua b/mods/test.lua deleted file mode 100644 index 400723a68..000000000 --- a/mods/test.lua +++ /dev/null @@ -1,2 +0,0 @@ -print('loaded2!') -print(ANGLE_QUEUE_SIZE) \ No newline at end of file diff --git a/src/pc/lua/smlua.c b/src/pc/lua/smlua.c index 80a88d4c9..4d444efbb 100644 --- a/src/pc/lua/smlua.c +++ b/src/pc/lua/smlua.c @@ -1,8 +1,9 @@ #include "smlua.h" +#include "pc/mod_list.h" lua_State* gLuaState = NULL; -static void smlua_execfile(char* path) { +static void smlua_exec_file(char* path) { lua_State* L = gLuaState; if (luaL_dofile(L, path) != LUA_OK) { LOG_LUA("LUA: Failed to load lua file '%s'.", path); @@ -11,6 +12,15 @@ static void smlua_execfile(char* path) { lua_pop(L, lua_gettop(L)); } +static void smlua_exec_str(char* str) { + lua_State* L = gLuaState; + if (luaL_dostring(L, str) != LUA_OK) { + LOG_LUA("LUA: Failed to load lua string."); + puts(lua_tostring(L, lua_gettop(L))); + } + lua_pop(L, lua_gettop(L)); +} + static void smlua_load_script(char* path) { lua_State* L = gLuaState; if (luaL_loadfile(L, path) != LUA_OK) { @@ -54,6 +64,7 @@ static void smlua_init_mario_states(void) { } void smlua_init(void) { + smlua_shutdown(); gLuaState = luaL_newstate(); lua_State* L = gLuaState; @@ -74,17 +85,30 @@ void smlua_init(void) { smlua_bind_functions(); smlua_bind_functions_autogen(); - smlua_execfile("mods/constants.lua"); + extern char gSmluaConstants[]; + smlua_exec_str(gSmluaConstants); + smlua_init_mario_states(); - smlua_load_script("mods/extended-moveset.lua"); - smlua_load_script("mods/test.lua"); + + // load scripts + LOG_INFO("Loading scripts:"); + for (int i = 0; i < sModEntryCount; i++) { + struct ModListEntry* entry = &gModEntries[i]; + LOG_INFO(" %s", entry->path); + smlua_load_script(entry->path); + } } void smlua_update(void) { + lua_State* L = gLuaState; + if (L == NULL) { return; } smlua_call_event_hooks(HOOK_UPDATE); } void smlua_shutdown(void) { lua_State* L = gLuaState; - lua_close(L); + if (L != NULL) { + lua_close(L); + gLuaState = NULL; + } } diff --git a/src/pc/lua/smlua_constants_autogen.c b/src/pc/lua/smlua_constants_autogen.c new file mode 100644 index 000000000..a1c856c84 --- /dev/null +++ b/src/pc/lua/smlua_constants_autogen.c @@ -0,0 +1,1157 @@ +char gSmluaConstants[] = "HOOK_UPDATE = 0\n" +"HOOK_MARIO_UPDATE = 1\n" +"HOOK_BEFORE_MARIO_UPDATE = 2\n" +"HOOK_MAX = 3\n" +"_CObject = {\n" +" __index = function (t,k)\n" +" return _get_field(t['_lot'], t['_pointer'], k);\n" +" end,\n" +" __newindex = function (t,k,v)\n" +" _set_field(t['_lot'], t['_pointer'], k, v);\n" +" end\n" +"}\n" +"function vec3f_copy(dest, src)\n" +" dest.x = src.x\n" +" dest.y = src.y\n" +" dest.z = src.z\n" +" return dest\n" +"end\n" +"function vec3f_set(dest, x, y, z)\n" +" dest.x = x\n" +" dest.y = y\n" +" dest.z = z\n" +" return dest\n" +"end\n" +"function vec3f_add(dest, a)\n" +" dest.x = dest.x + a.x\n" +" dest.y = dest.y + a.y\n" +" dest.z = dest.z + a.z\n" +" return dest\n" +"end\n" +"function vec3f_sum(dest, a, b)\n" +" dest.x = a.x + b.x\n" +" dest.y = a.y + b.y\n" +" dest.z = a.z + b.z\n" +" return dest\n" +"end\n" +"function vec3f_mul(dest, a)\n" +" dest.x = dest.x * a\n" +" dest.y = dest.y * a\n" +" dest.z = dest.z * a\n" +" return dest\n" +"end\n" +"function vec3s_copy(dest, src)\n" +" dest.x = src.x\n" +" dest.y = src.y\n" +" dest.z = src.z\n" +" return dest\n" +"end\n" +"function vec3s_set(dest, x, y, z)\n" +" dest.x = x\n" +" dest.y = y\n" +" dest.z = z\n" +" return dest\n" +"end\n" +"function vec3s_add(dest, a)\n" +" dest.x = dest.x + a.x\n" +" dest.y = dest.y + a.y\n" +" dest.z = dest.z + a.z\n" +" return dest\n" +"end\n" +"function vec3s_sum(dest, a, b)\n" +" dest.x = a.x + b.x\n" +" dest.y = a.y + b.y\n" +" dest.z = a.z + b.z\n" +" return dest\n" +"end\n" +"function vec3s_mul(dest, a)\n" +" dest.x = dest.x * a\n" +" dest.y = dest.y * a\n" +" dest.z = dest.z * a\n" +" return dest\n" +"end\n" +"function approach_f32(current, target, inc, dec)\n" +" if current < target then\n" +" current = current + inc\n" +" if current > target then\n" +" current = target\n" +" end\n" +" else\n" +" current = current - dec\n" +" if current < target then\n" +" current = target\n" +" end\n" +" end\n" +" return current;\n" +"end\n" +"MAX_PLAYERS = 16\n" +"LAYER_FORCE = 0\n" +"LAYER_OPAQUE = 1\n" +"LAYER_OPAQUE_DECAL = 2\n" +"LAYER_OPAQUE_INTER = 3\n" +"LAYER_ALPHA = 4\n" +"LAYER_TRANSPARENT = 5\n" +"LAYER_TRANSPARENT_DECAL = 6\n" +"LAYER_TRANSPARENT_INTER = 7\n" +"CONT_A = 0x8000\n" +"CONT_B = 0x4000\n" +"CONT_G = 0x2000\n" +"CONT_START = 0x1000\n" +"CONT_UP = 0x0800\n" +"CONT_DOWN = 0x0400\n" +"CONT_LEFT = 0x0200\n" +"CONT_RIGHT = 0x0100\n" +"CONT_L = 0x0020\n" +"CONT_R = 0x0010\n" +"CONT_E = 0x0008\n" +"CONT_D = 0x0004\n" +"CONT_C = 0x0002\n" +"CONT_F = 0x0001\n" +"A_BUTTON = CONT_A\n" +"B_BUTTON = CONT_B\n" +"L_TRIG = CONT_L\n" +"R_TRIG = CONT_R\n" +"Z_TRIG = CONT_G\n" +"START_BUTTON = CONT_START\n" +"U_JPAD = CONT_UP\n" +"L_JPAD = CONT_LEFT\n" +"R_JPAD = CONT_RIGHT\n" +"D_JPAD = CONT_DOWN\n" +"U_CBUTTONS = CONT_E\n" +"L_CBUTTONS = CONT_C\n" +"R_CBUTTONS = CONT_F\n" +"D_CBUTTONS = CONT_D\n" +"INPUT_NONZERO_ANALOG = 0x0001\n" +"INPUT_A_PRESSED = 0x0002\n" +"INPUT_OFF_FLOOR = 0x0004\n" +"INPUT_ABOVE_SLIDE = 0x0008\n" +"INPUT_FIRST_PERSON = 0x0010\n" +"INPUT_ZERO_MOVEMENT = 0x0020\n" +"INPUT_SQUISHED = 0x0040\n" +"INPUT_A_DOWN = 0x0080\n" +"INPUT_IN_POISON_GAS = 0x0100\n" +"INPUT_IN_WATER = 0x0200\n" +"INPUT_UNKNOWN_10 = 0x0400\n" +"INPUT_INTERACT_OBJ_GRABBABLE = 0x0800\n" +"INPUT_UNKNOWN_12 = 0x1000\n" +"INPUT_B_PRESSED = 0x2000\n" +"INPUT_Z_DOWN = 0x4000\n" +"INPUT_Z_PRESSED = 0x8000\n" +"GROUND_STEP_LEFT_GROUND = 0\n" +"GROUND_STEP_NONE = 1\n" +"GROUND_STEP_HIT_WALL = 2\n" +"GROUND_STEP_HIT_WALL_STOP_QSTEPS = 2\n" +"GROUND_STEP_HIT_WALL_CONTINUE_QSTEPS = 3\n" +"AIR_STEP_CHECK_LEDGE_GRAB = 0x00000001\n" +"AIR_STEP_CHECK_HANG = 0x00000002\n" +"AIR_STEP_NONE = 0\n" +"AIR_STEP_LANDED = 1\n" +"AIR_STEP_HIT_WALL = 2\n" +"AIR_STEP_GRABBED_LEDGE = 3\n" +"AIR_STEP_GRABBED_CEILING = 4\n" +"AIR_STEP_HIT_LAVA_WALL = 6\n" +"WATER_STEP_NONE = 0\n" +"WATER_STEP_HIT_FLOOR = 1\n" +"WATER_STEP_HIT_CEILING = 2\n" +"WATER_STEP_CANCELLED = 3\n" +"WATER_STEP_HIT_WALL = 4\n" +"PARTICLE_DUST = (1 << 0)\n" +"PARTICLE_VERTICAL_STAR = (1 << 1)\n" +"PARTICLE_2 = (1 << 2)\n" +"PARTICLE_SPARKLES = (1 << 3)\n" +"PARTICLE_HORIZONTAL_STAR = (1 << 4)\n" +"PARTICLE_BUBBLE = (1 << 5)\n" +"PARTICLE_WATER_SPLASH = (1 << 6)\n" +"PARTICLE_IDLE_WATER_WAVE = (1 << 7)\n" +"PARTICLE_SHALLOW_WATER_WAVE = (1 << 8)\n" +"PARTICLE_PLUNGE_BUBBLE = (1 << 9)\n" +"PARTICLE_WAVE_TRAIL = (1 << 10)\n" +"PARTICLE_FIRE = (1 << 11)\n" +"PARTICLE_SHALLOW_WATER_SPLASH = (1 << 12)\n" +"PARTICLE_LEAF = (1 << 13)\n" +"PARTICLE_SNOW = (1 << 14)\n" +"PARTICLE_DIRT = (1 << 15)\n" +"PARTICLE_MIST_CIRCLE = (1 << 16)\n" +"PARTICLE_BREATH = (1 << 17)\n" +"PARTICLE_TRIANGLE = (1 << 18)\n" +"PARTICLE_19 = (1 << 19)\n" +"MODEL_STATE_NOISE_ALPHA = 0x180\n" +"MODEL_STATE_METAL = 0x200\n" +"MARIO_NORMAL_CAP = 0x00000001\n" +"MARIO_VANISH_CAP = 0x00000002\n" +"MARIO_METAL_CAP = 0x00000004\n" +"MARIO_WING_CAP = 0x00000008\n" +"MARIO_CAP_ON_HEAD = 0x00000010\n" +"MARIO_CAP_IN_HAND = 0x00000020\n" +"MARIO_METAL_SHOCK = 0x00000040\n" +"MARIO_TELEPORTING = 0x00000080\n" +"MARIO_UNKNOWN_08 = 0x00000100\n" +"MARIO_UNKNOWN_13 = 0x00002000\n" +"MARIO_ACTION_SOUND_PLAYED = 0x00010000\n" +"MARIO_MARIO_SOUND_PLAYED = 0x00020000\n" +"MARIO_UNKNOWN_18 = 0x00040000\n" +"MARIO_PUNCHING = 0x00100000\n" +"MARIO_KICKING = 0x00200000\n" +"MARIO_TRIPPING = 0x00400000\n" +"MARIO_UNKNOWN_25 = 0x02000000\n" +"MARIO_UNKNOWN_30 = 0x40000000\n" +"MARIO_UNKNOWN_31 = 0x80000000\n" +"MARIO_CAP_FLAGS = 0x0000001F\n" +"ACT_ID_MASK = 0x000001FF\n" +"ACT_GROUP_MASK = 0x000001C0\n" +"ACT_GROUP_STATIONARY = (0 << 6)\n" +"ACT_GROUP_MOVING = (1 << 6)\n" +"ACT_GROUP_AIRBORNE = (2 << 6)\n" +"ACT_GROUP_SUBMERGED = (3 << 6)\n" +"ACT_GROUP_CUTSCENE = (4 << 6)\n" +"ACT_GROUP_AUTOMATIC = (5 << 6)\n" +"ACT_GROUP_OBJECT = (6 << 6)\n" +"ACT_FLAG_STATIONARY = (1 << 9)\n" +"ACT_FLAG_MOVING = (1 << 10)\n" +"ACT_FLAG_AIR = (1 << 11)\n" +"ACT_FLAG_INTANGIBLE = (1 << 12)\n" +"ACT_FLAG_SWIMMING = (1 << 13)\n" +"ACT_FLAG_METAL_WATER = (1 << 14)\n" +"ACT_FLAG_SHORT_HITBOX = (1 << 15)\n" +"ACT_FLAG_RIDING_SHELL = (1 << 16)\n" +"ACT_FLAG_INVULNERABLE = (1 << 17)\n" +"ACT_FLAG_BUTT_OR_STOMACH_SLIDE = (1 << 18)\n" +"ACT_FLAG_DIVING = (1 << 19)\n" +"ACT_FLAG_ON_POLE = (1 << 20)\n" +"ACT_FLAG_HANGING = (1 << 21)\n" +"ACT_FLAG_IDLE = (1 << 22)\n" +"ACT_FLAG_ATTACKING = (1 << 23)\n" +"ACT_FLAG_ALLOW_VERTICAL_WIND_ACTION = (1 << 24)\n" +"ACT_FLAG_CONTROL_JUMP_HEIGHT = (1 << 25)\n" +"ACT_FLAG_ALLOW_FIRST_PERSON = (1 << 26)\n" +"ACT_FLAG_PAUSE_EXIT = (1 << 27)\n" +"ACT_FLAG_SWIMMING_OR_FLYING = (1 << 28)\n" +"ACT_FLAG_WATER_OR_TEXT = (1 << 29)\n" +"ACT_FLAG_THROWING = (1 << 31)\n" +"ACT_UNINITIALIZED = 0x00000000\n" +"ACT_IDLE = 0x0C400201\n" +"ACT_START_SLEEPING = 0x0C400202\n" +"ACT_SLEEPING = 0x0C000203\n" +"ACT_WAKING_UP = 0x0C000204\n" +"ACT_PANTING = 0x0C400205\n" +"ACT_HOLD_PANTING_UNUSED = 0x08000206\n" +"ACT_HOLD_IDLE = 0x08000207\n" +"ACT_HOLD_HEAVY_IDLE = 0x08000208\n" +"ACT_STANDING_AGAINST_WALL = 0x0C400209\n" +"ACT_COUGHING = 0x0C40020A\n" +"ACT_SHIVERING = 0x0C40020B\n" +"ACT_IN_QUICKSAND = 0x0002020D\n" +"ACT_CROUCHING = 0x0C008220\n" +"ACT_START_CROUCHING = 0x0C008221\n" +"ACT_STOP_CROUCHING = 0x0C008222\n" +"ACT_START_CRAWLING = 0x0C008223\n" +"ACT_STOP_CRAWLING = 0x0C008224\n" +"ACT_SLIDE_KICK_SLIDE_STOP = 0x08000225\n" +"ACT_SHOCKWAVE_BOUNCE = 0x00020226\n" +"ACT_FIRST_PERSON = 0x0C000227\n" +"ACT_BACKFLIP_LAND_STOP = 0x0800022F\n" +"ACT_JUMP_LAND_STOP = 0x0C000230\n" +"ACT_DOUBLE_JUMP_LAND_STOP = 0x0C000231\n" +"ACT_FREEFALL_LAND_STOP = 0x0C000232\n" +"ACT_SIDE_FLIP_LAND_STOP = 0x0C000233\n" +"ACT_HOLD_JUMP_LAND_STOP = 0x08000234\n" +"ACT_HOLD_FREEFALL_LAND_STOP = 0x08000235\n" +"ACT_AIR_THROW_LAND = 0x80000A36\n" +"ACT_TWIRL_LAND = 0x18800238\n" +"ACT_LAVA_BOOST_LAND = 0x08000239\n" +"ACT_TRIPLE_JUMP_LAND_STOP = 0x0800023A\n" +"ACT_LONG_JUMP_LAND_STOP = 0x0800023B\n" +"ACT_GROUND_POUND_LAND = 0x0080023C\n" +"ACT_BRAKING_STOP = 0x0C00023D\n" +"ACT_BUTT_SLIDE_STOP = 0x0C00023E\n" +"ACT_HOLD_BUTT_SLIDE_STOP = 0x0800043F\n" +"ACT_WALKING = 0x04000440\n" +"ACT_HOLD_WALKING = 0x00000442\n" +"ACT_TURNING_AROUND = 0x00000443\n" +"ACT_FINISH_TURNING_AROUND = 0x00000444\n" +"ACT_BRAKING = 0x04000445\n" +"ACT_RIDING_SHELL_GROUND = 0x20810446\n" +"ACT_HOLD_HEAVY_WALKING = 0x00000447\n" +"ACT_CRAWLING = 0x04008448\n" +"ACT_BURNING_GROUND = 0x00020449\n" +"ACT_DECELERATING = 0x0400044A\n" +"ACT_HOLD_DECELERATING = 0x0000044B\n" +"ACT_BEGIN_SLIDING = 0x00000050\n" +"ACT_HOLD_BEGIN_SLIDING = 0x00000051\n" +"ACT_BUTT_SLIDE = 0x00840452\n" +"ACT_STOMACH_SLIDE = 0x008C0453\n" +"ACT_HOLD_BUTT_SLIDE = 0x00840454\n" +"ACT_HOLD_STOMACH_SLIDE = 0x008C0455\n" +"ACT_DIVE_SLIDE = 0x00880456\n" +"ACT_MOVE_PUNCHING = 0x00800457\n" +"ACT_CROUCH_SLIDE = 0x04808459\n" +"ACT_SLIDE_KICK_SLIDE = 0x0080045A\n" +"ACT_HARD_BACKWARD_GROUND_KB = 0x00020460\n" +"ACT_HARD_FORWARD_GROUND_KB = 0x00020461\n" +"ACT_BACKWARD_GROUND_KB = 0x00020462\n" +"ACT_FORWARD_GROUND_KB = 0x00020463\n" +"ACT_SOFT_BACKWARD_GROUND_KB = 0x00020464\n" +"ACT_SOFT_FORWARD_GROUND_KB = 0x00020465\n" +"ACT_GROUND_BONK = 0x00020466\n" +"ACT_DEATH_EXIT_LAND = 0x00020467\n" +"ACT_JUMP_LAND = 0x04000470\n" +"ACT_FREEFALL_LAND = 0x04000471\n" +"ACT_DOUBLE_JUMP_LAND = 0x04000472\n" +"ACT_SIDE_FLIP_LAND = 0x04000473\n" +"ACT_HOLD_JUMP_LAND = 0x00000474\n" +"ACT_HOLD_FREEFALL_LAND = 0x00000475\n" +"ACT_QUICKSAND_JUMP_LAND = 0x00000476\n" +"ACT_HOLD_QUICKSAND_JUMP_LAND = 0x00000477\n" +"ACT_TRIPLE_JUMP_LAND = 0x04000478\n" +"ACT_LONG_JUMP_LAND = 0x00000479\n" +"ACT_BACKFLIP_LAND = 0x0400047A\n" +"ACT_JUMP = 0x03000880\n" +"ACT_DOUBLE_JUMP = 0x03000881\n" +"ACT_TRIPLE_JUMP = 0x01000882\n" +"ACT_BACKFLIP = 0x01000883\n" +"ACT_STEEP_JUMP = 0x03000885\n" +"ACT_WALL_KICK_AIR = 0x03000886\n" +"ACT_SIDE_FLIP = 0x01000887\n" +"ACT_LONG_JUMP = 0x03000888\n" +"ACT_WATER_JUMP = 0x01000889\n" +"ACT_DIVE = 0x0188088A\n" +"ACT_FREEFALL = 0x0100088C\n" +"ACT_TOP_OF_POLE_JUMP = 0x0300088D\n" +"ACT_BUTT_SLIDE_AIR = 0x0300088E\n" +"ACT_FLYING_TRIPLE_JUMP = 0x03000894\n" +"ACT_SHOT_FROM_CANNON = 0x00880898\n" +"ACT_FLYING = 0x10880899\n" +"ACT_RIDING_SHELL_JUMP = 0x0281089A\n" +"ACT_RIDING_SHELL_FALL = 0x0081089B\n" +"ACT_VERTICAL_WIND = 0x1008089C\n" +"ACT_HOLD_JUMP = 0x030008A0\n" +"ACT_HOLD_FREEFALL = 0x010008A1\n" +"ACT_HOLD_BUTT_SLIDE_AIR = 0x010008A2\n" +"ACT_HOLD_WATER_JUMP = 0x010008A3\n" +"ACT_TWIRLING = 0x108008A4\n" +"ACT_FORWARD_ROLLOUT = 0x010008A6\n" +"ACT_AIR_HIT_WALL = 0x000008A7\n" +"ACT_RIDING_HOOT = 0x000004A8\n" +"ACT_GROUND_POUND = 0x008008A9\n" +"ACT_SLIDE_KICK = 0x018008AA\n" +"ACT_AIR_THROW = 0x830008AB\n" +"ACT_JUMP_KICK = 0x018008AC\n" +"ACT_BACKWARD_ROLLOUT = 0x010008AD\n" +"ACT_CRAZY_BOX_BOUNCE = 0x000008AE\n" +"ACT_SPECIAL_TRIPLE_JUMP = 0x030008AF\n" +"ACT_BACKWARD_AIR_KB = 0x010208B0\n" +"ACT_FORWARD_AIR_KB = 0x010208B1\n" +"ACT_HARD_FORWARD_AIR_KB = 0x010208B2\n" +"ACT_HARD_BACKWARD_AIR_KB = 0x010208B3\n" +"ACT_BURNING_JUMP = 0x010208B4\n" +"ACT_BURNING_FALL = 0x010208B5\n" +"ACT_SOFT_BONK = 0x010208B6\n" +"ACT_LAVA_BOOST = 0x010208B7\n" +"ACT_GETTING_BLOWN = 0x010208B8\n" +"ACT_THROWN_FORWARD = 0x010208BD\n" +"ACT_THROWN_BACKWARD = 0x010208BE\n" +"ACT_WATER_IDLE = 0x380022C0\n" +"ACT_HOLD_WATER_IDLE = 0x380022C1\n" +"ACT_WATER_ACTION_END = 0x300022C2\n" +"ACT_HOLD_WATER_ACTION_END = 0x300022C3\n" +"ACT_DROWNING = 0x300032C4\n" +"ACT_BACKWARD_WATER_KB = 0x300222C5\n" +"ACT_FORWARD_WATER_KB = 0x300222C6\n" +"ACT_WATER_DEATH = 0x300032C7\n" +"ACT_WATER_SHOCKED = 0x300222C8\n" +"ACT_BREASTSTROKE = 0x300024D0\n" +"ACT_SWIMMING_END = 0x300024D1\n" +"ACT_FLUTTER_KICK = 0x300024D2\n" +"ACT_HOLD_BREASTSTROKE = 0x300024D3\n" +"ACT_HOLD_SWIMMING_END = 0x300024D4\n" +"ACT_HOLD_FLUTTER_KICK = 0x300024D5\n" +"ACT_WATER_SHELL_SWIMMING = 0x300024D6\n" +"ACT_WATER_THROW = 0x300024E0\n" +"ACT_WATER_PUNCH = 0x300024E1\n" +"ACT_WATER_PLUNGE = 0x300022E2\n" +"ACT_CAUGHT_IN_WHIRLPOOL = 0x300222E3\n" +"ACT_METAL_WATER_STANDING = 0x080042F0\n" +"ACT_HOLD_METAL_WATER_STANDING = 0x080042F1\n" +"ACT_METAL_WATER_WALKING = 0x000044F2\n" +"ACT_HOLD_METAL_WATER_WALKING = 0x000044F3\n" +"ACT_METAL_WATER_FALLING = 0x000042F4\n" +"ACT_HOLD_METAL_WATER_FALLING = 0x000042F5\n" +"ACT_METAL_WATER_FALL_LAND = 0x000042F6\n" +"ACT_HOLD_METAL_WATER_FALL_LAND = 0x000042F7\n" +"ACT_METAL_WATER_JUMP = 0x000044F8\n" +"ACT_HOLD_METAL_WATER_JUMP = 0x000044F9\n" +"ACT_METAL_WATER_JUMP_LAND = 0x000044FA\n" +"ACT_HOLD_METAL_WATER_JUMP_LAND = 0x000044FB\n" +"ACT_DISAPPEARED = 0x00001300\n" +"ACT_INTRO_CUTSCENE = 0x04001301\n" +"ACT_STAR_DANCE_EXIT = 0x00001302\n" +"ACT_STAR_DANCE_WATER = 0x00001303\n" +"ACT_FALL_AFTER_STAR_GRAB = 0x00001904\n" +"ACT_READING_AUTOMATIC_DIALOG = 0x20001305\n" +"ACT_READING_NPC_DIALOG = 0x20001306\n" +"ACT_STAR_DANCE_NO_EXIT = 0x00001307\n" +"ACT_READING_SIGN = 0x00001308\n" +"ACT_JUMBO_STAR_CUTSCENE = 0x00001909\n" +"ACT_WAITING_FOR_DIALOG = 0x0000130A\n" +"ACT_DEBUG_FREE_MOVE = 0x0000130F\n" +"ACT_STANDING_DEATH = 0x00021311\n" +"ACT_QUICKSAND_DEATH = 0x00021312\n" +"ACT_ELECTROCUTION = 0x00021313\n" +"ACT_SUFFOCATION = 0x00021314\n" +"ACT_DEATH_ON_STOMACH = 0x00021315\n" +"ACT_DEATH_ON_BACK = 0x00021316\n" +"ACT_EATEN_BY_BUBBA = 0x00021317\n" +"ACT_END_PEACH_CUTSCENE = 0x00001918\n" +"ACT_CREDITS_CUTSCENE = 0x00001319\n" +"ACT_END_WAVING_CUTSCENE = 0x0000131A\n" +"ACT_PULLING_DOOR = 0x00001320\n" +"ACT_PUSHING_DOOR = 0x00001321\n" +"ACT_WARP_DOOR_SPAWN = 0x00001322\n" +"ACT_EMERGE_FROM_PIPE = 0x00001923\n" +"ACT_SPAWN_SPIN_AIRBORNE = 0x00001924\n" +"ACT_SPAWN_SPIN_LANDING = 0x00001325\n" +"ACT_EXIT_AIRBORNE = 0x00001926\n" +"ACT_EXIT_LAND_SAVE_DIALOG = 0x00001327\n" +"ACT_DEATH_EXIT = 0x00001928\n" +"ACT_UNUSED_DEATH_EXIT = 0x00001929\n" +"ACT_FALLING_DEATH_EXIT = 0x0000192A\n" +"ACT_SPECIAL_EXIT_AIRBORNE = 0x0000192B\n" +"ACT_SPECIAL_DEATH_EXIT = 0x0000192C\n" +"ACT_FALLING_EXIT_AIRBORNE = 0x0000192D\n" +"ACT_UNLOCKING_KEY_DOOR = 0x0000132E\n" +"ACT_UNLOCKING_STAR_DOOR = 0x0000132F\n" +"ACT_ENTERING_STAR_DOOR = 0x00001331\n" +"ACT_SPAWN_NO_SPIN_AIRBORNE = 0x00001932\n" +"ACT_SPAWN_NO_SPIN_LANDING = 0x00001333\n" +"ACT_BBH_ENTER_JUMP = 0x00001934\n" +"ACT_BBH_ENTER_SPIN = 0x00001535\n" +"ACT_TELEPORT_FADE_OUT = 0x00001336\n" +"ACT_TELEPORT_FADE_IN = 0x00001337\n" +"ACT_SHOCKED = 0x00020338\n" +"ACT_SQUISHED = 0x00020339\n" +"ACT_HEAD_STUCK_IN_GROUND = 0x0002033A\n" +"ACT_BUTT_STUCK_IN_GROUND = 0x0002033B\n" +"ACT_FEET_STUCK_IN_GROUND = 0x0002033C\n" +"ACT_PUTTING_ON_CAP = 0x0000133D\n" +"ACT_HOLDING_POLE = 0x08100340\n" +"ACT_GRAB_POLE_SLOW = 0x00100341\n" +"ACT_GRAB_POLE_FAST = 0x00100342\n" +"ACT_CLIMBING_POLE = 0x00100343\n" +"ACT_TOP_OF_POLE_TRANSITION = 0x00100344\n" +"ACT_TOP_OF_POLE = 0x00100345\n" +"ACT_START_HANGING = 0x08200348\n" +"ACT_HANGING = 0x00200349\n" +"ACT_HANG_MOVING = 0x0020054A\n" +"ACT_LEDGE_GRAB = 0x0800034B\n" +"ACT_LEDGE_CLIMB_SLOW_1 = 0x0000054C\n" +"ACT_LEDGE_CLIMB_SLOW_2 = 0x0000054D\n" +"ACT_LEDGE_CLIMB_DOWN = 0x0000054E\n" +"ACT_LEDGE_CLIMB_FAST = 0x0000054F\n" +"ACT_GRABBED = 0x00020370\n" +"ACT_IN_CANNON = 0x00001371\n" +"ACT_TORNADO_TWIRLING = 0x10020372\n" +"ACT_BUBBLED = (0x173 | ACT_FLAG_MOVING | ACT_FLAG_PAUSE_EXIT)\n" +"ACT_PUNCHING = 0x00800380\n" +"ACT_PICKING_UP = 0x00000383\n" +"ACT_DIVE_PICKING_UP = 0x00000385\n" +"ACT_STOMACH_SLIDE_STOP = 0x00000386\n" +"ACT_PLACING_DOWN = 0x00000387\n" +"ACT_THROWING = 0x80000588\n" +"ACT_HEAVY_THROW = 0x80000589\n" +"ACT_PICKING_UP_BOWSER = 0x00000390\n" +"ACT_HOLDING_BOWSER = 0x00000391\n" +"ACT_RELEASING_BOWSER = 0x00000392\n" +"SOUNDARGS_MASK_BANK = 0xF0000000\n" +"SOUNDARGS_MASK_SOUNDID = 0x00FF0000\n" +"SOUNDARGS_MASK_PRIORITY = 0x0000FF00\n" +"SOUNDARGS_MASK_STATUS = 0x0000000F\n" +"SOUNDARGS_SHIFT_BANK = 28\n" +"SOUNDARGS_SHIFT_SOUNDID = 16\n" +"SOUNDARGS_SHIFT_PRIORITY = 8\n" +"SOUND_STATUS_STOPPED = 0\n" +"SOUND_STATUS_STARTING = 1\n" +"SOUND_STATUS_PLAYING = 2\n" +"function SOUND_ARG_LOAD(bank, playFlags, soundID, priority, flags2)\n" +" return ((bank << 28) | (playFlags << 24) | (soundID << 16) | (priority << 8) | (flags2 << 4) | 1)\n" +"end\n" +"SOUND_LO_BITFLAG_UNK1 = 0x10\n" +"SOUND_NO_ECHO = 0x20\n" +"SOUND_LO_BITFLAG_UNK8 = 0x80\n" +"SOUND_NO_VOLUME_LOSS = 0x1000000\n" +"SOUND_VIBRATO = 0x2000000\n" +"SOUND_NO_PRIORITY_LOSS = 0x4000000\n" +"SOUND_NO_FREQUENCY_LOSS = 0x8000000\n" +"NO_SOUND = 0\n" +"SOUND_TERRAIN_DEFAULT = 0\n" +"SOUND_TERRAIN_GRASS = 1\n" +"SOUND_TERRAIN_WATER = 2\n" +"SOUND_TERRAIN_STONE = 3\n" +"SOUND_TERRAIN_SPOOKY = 4\n" +"SOUND_TERRAIN_SNOW = 5\n" +"SOUND_TERRAIN_ICE = 6\n" +"SOUND_TERRAIN_SAND = 7\n" +"SOUND_ACTION_TERRAIN_JUMP = SOUND_ARG_LOAD(0, 4, 0x00, 0x80, 8)\n" +"SOUND_ACTION_TERRAIN_LANDING = SOUND_ARG_LOAD(0, 4, 0x08, 0x80, 8)\n" +"SOUND_ACTION_TERRAIN_STEP = SOUND_ARG_LOAD(0, 6, 0x10, 0x80, 8)\n" +"SOUND_ACTION_TERRAIN_BODY_HIT_GROUND = SOUND_ARG_LOAD(0, 4, 0x18, 0x80, 8)\n" +"SOUND_ACTION_TERRAIN_STEP_TIPTOE = SOUND_ARG_LOAD(0, 6, 0x20, 0x80, 8)\n" +"SOUND_ACTION_TERRAIN_STUCK_IN_GROUND = SOUND_ARG_LOAD(0, 4, 0x48, 0x80, 8)\n" +"SOUND_ACTION_TERRAIN_HEAVY_LANDING = SOUND_ARG_LOAD(0, 4, 0x60, 0x80, 8)\n" +"SOUND_ACTION_METAL_JUMP = SOUND_ARG_LOAD(0, 4, 0x28, 0x90, 8)\n" +"SOUND_ACTION_METAL_LANDING = SOUND_ARG_LOAD(0, 4, 0x29, 0x90, 8)\n" +"SOUND_ACTION_METAL_STEP = SOUND_ARG_LOAD(0, 4, 0x2A, 0x90, 8)\n" +"SOUND_ACTION_METAL_HEAVY_LANDING = SOUND_ARG_LOAD(0, 4, 0x2B, 0x90, 8)\n" +"SOUND_ACTION_CLAP_HANDS_COLD = SOUND_ARG_LOAD(0, 6, 0x2C, 0x00, 8)\n" +"SOUND_ACTION_HANGING_STEP = SOUND_ARG_LOAD(0, 4, 0x2D, 0xA0, 8)\n" +"SOUND_ACTION_QUICKSAND_STEP = SOUND_ARG_LOAD(0, 4, 0x2E, 0x00, 8)\n" +"SOUND_ACTION_METAL_STEP_TIPTOE = SOUND_ARG_LOAD(0, 4, 0x2F, 0x90, 8)\n" +"SOUND_ACTION_UNKNOWN430 = SOUND_ARG_LOAD(0, 4, 0x30, 0xC0, 8)\n" +"SOUND_ACTION_UNKNOWN431 = SOUND_ARG_LOAD(0, 4, 0x31, 0x60, 8)\n" +"SOUND_ACTION_UNKNOWN432 = SOUND_ARG_LOAD(0, 4, 0x32, 0x80, 8)\n" +"SOUND_ACTION_SWIM = SOUND_ARG_LOAD(0, 4, 0x33, 0x80, 8)\n" +"SOUND_ACTION_UNKNOWN434 = SOUND_ARG_LOAD(0, 4, 0x34, 0x80, 8)\n" +"SOUND_ACTION_THROW = SOUND_ARG_LOAD(0, 4, 0x35, 0x80, 8)\n" +"SOUND_ACTION_KEY_SWISH = SOUND_ARG_LOAD(0, 4, 0x36, 0x80, 8)\n" +"SOUND_ACTION_SPIN = SOUND_ARG_LOAD(0, 4, 0x37, 0x80, 8)\n" +"SOUND_ACTION_TWIRL = SOUND_ARG_LOAD(0, 4, 0x38, 0x80, 8)\n" +"SOUND_ACTION_CLIMB_UP_TREE = SOUND_ARG_LOAD(0, 4, 0x3A, 0x80, 8)\n" +"SOUND_ACTION_CLIMB_DOWN_TREE = 0x003B\n" +"SOUND_ACTION_UNK3C = 0x003C\n" +"SOUND_ACTION_UNKNOWN43D = SOUND_ARG_LOAD(0, 4, 0x3D, 0x80, 8)\n" +"SOUND_ACTION_UNKNOWN43E = SOUND_ARG_LOAD(0, 4, 0x3E, 0x80, 8)\n" +"SOUND_ACTION_PAT_BACK = SOUND_ARG_LOAD(0, 4, 0x3F, 0x80, 8)\n" +"SOUND_ACTION_BRUSH_HAIR = SOUND_ARG_LOAD(0, 4, 0x40, 0x80, 8)\n" +"SOUND_ACTION_CLIMB_UP_POLE = SOUND_ARG_LOAD(0, 4, 0x41, 0x80, 8)\n" +"SOUND_ACTION_METAL_BONK = SOUND_ARG_LOAD(0, 4, 0x42, 0x80, 8)\n" +"SOUND_ACTION_UNSTUCK_FROM_GROUND = SOUND_ARG_LOAD(0, 4, 0x43, 0x80, 8)\n" +"SOUND_ACTION_HIT = SOUND_ARG_LOAD(0, 4, 0x44, 0xC0, 8)\n" +"SOUND_ACTION_HIT_2 = SOUND_ARG_LOAD(0, 4, 0x44, 0xB0, 8)\n" +"SOUND_ACTION_HIT_3 = SOUND_ARG_LOAD(0, 4, 0x44, 0xA0, 8)\n" +"SOUND_ACTION_BONK = SOUND_ARG_LOAD(0, 4, 0x45, 0xA0, 8)\n" +"SOUND_ACTION_SHRINK_INTO_BBH = SOUND_ARG_LOAD(0, 4, 0x46, 0xA0, 8)\n" +"SOUND_ACTION_SWIM_FAST = SOUND_ARG_LOAD(0, 4, 0x47, 0xA0, 8)\n" +"SOUND_ACTION_METAL_JUMP_WATER = SOUND_ARG_LOAD(0, 4, 0x50, 0x90, 8)\n" +"SOUND_ACTION_METAL_LAND_WATER = SOUND_ARG_LOAD(0, 4, 0x51, 0x90, 8)\n" +"SOUND_ACTION_METAL_STEP_WATER = SOUND_ARG_LOAD(0, 4, 0x52, 0x90, 8)\n" +"SOUND_ACTION_UNK53 = 0x0053\n" +"SOUND_ACTION_UNK54 = 0x0054\n" +"SOUND_ACTION_UNK55 = 0x0055\n" +"SOUND_ACTION_FLYING_FAST = SOUND_ARG_LOAD(0, 4, 0x56, 0x80, 8)\n" +"SOUND_ACTION_TELEPORT = SOUND_ARG_LOAD(0, 4, 0x57, 0xC0, 8)\n" +"SOUND_ACTION_UNKNOWN458 = SOUND_ARG_LOAD(0, 4, 0x58, 0xA0, 8)\n" +"SOUND_ACTION_BOUNCE_OFF_OBJECT = SOUND_ARG_LOAD(0, 4, 0x59, 0xB0, 8)\n" +"SOUND_ACTION_SIDE_FLIP_UNK = SOUND_ARG_LOAD(0, 4, 0x5A, 0x80, 8)\n" +"SOUND_ACTION_READ_SIGN = SOUND_ARG_LOAD(0, 4, 0x5B, 0xFF, 8)\n" +"SOUND_ACTION_UNKNOWN45C = SOUND_ARG_LOAD(0, 4, 0x5C, 0x80, 8)\n" +"SOUND_ACTION_UNK5D = 0x005D\n" +"SOUND_ACTION_INTRO_UNK45E = SOUND_ARG_LOAD(0, 4, 0x5E, 0x80, 8)\n" +"SOUND_ACTION_INTRO_UNK45F = SOUND_ARG_LOAD(0, 4, 0x5F, 0x80, 8)\n" +"SOUND_MOVING_TERRAIN_SLIDE = SOUND_ARG_LOAD(1, 4, 0x00, 0x00, 0)\n" +"SOUND_MOVING_TERRAIN_RIDING_SHELL = SOUND_ARG_LOAD(1, 4, 0x20, 0x00, 0)\n" +"SOUND_MOVING_LAVA_BURN = SOUND_ARG_LOAD(1, 4, 0x10, 0x00, 0)\n" +"SOUND_MOVING_SLIDE_DOWN_POLE = SOUND_ARG_LOAD(1, 4, 0x11, 0x00, 0)\n" +"SOUND_MOVING_SLIDE_DOWN_TREE = SOUND_ARG_LOAD(1, 4, 0x12, 0x80, 0)\n" +"SOUND_MOVING_QUICKSAND_DEATH = SOUND_ARG_LOAD(1, 4, 0x14, 0x00, 0)\n" +"SOUND_MOVING_SHOCKED = SOUND_ARG_LOAD(1, 4, 0x16, 0x00, 0)\n" +"SOUND_MOVING_FLYING = SOUND_ARG_LOAD(1, 4, 0x17, 0x00, 0)\n" +"SOUND_MOVING_ALMOST_DROWNING = SOUND_ARG_LOAD(1, 0xC, 0x18, 0x00, 0)\n" +"SOUND_MOVING_AIM_CANNON = SOUND_ARG_LOAD(1, 0xD, 0x19, 0x20, 0)\n" +"SOUND_MOVING_UNK1A = 0x101A\n" +"SOUND_MOVING_RIDING_SHELL_LAVA = SOUND_ARG_LOAD(1, 4, 0x28, 0x00, 0)\n" +"SOUND_MARIO_YAH_WAH_HOO = SOUND_ARG_LOAD(2, 4, 0x00, 0x80, 8)\n" +"SOUND_MARIO_HOOHOO = SOUND_ARG_LOAD(2, 4, 0x03, 0x80, 8)\n" +"SOUND_MARIO_YAHOO = SOUND_ARG_LOAD(2, 4, 0x04, 0x80, 8)\n" +"SOUND_MARIO_UH = SOUND_ARG_LOAD(2, 4, 0x05, 0x80, 8)\n" +"SOUND_MARIO_HRMM = SOUND_ARG_LOAD(2, 4, 0x06, 0x80, 8)\n" +"SOUND_MARIO_WAH2 = SOUND_ARG_LOAD(2, 4, 0x07, 0x80, 8)\n" +"SOUND_MARIO_WHOA = SOUND_ARG_LOAD(2, 4, 0x08, 0xC0, 8)\n" +"SOUND_MARIO_EEUH = SOUND_ARG_LOAD(2, 4, 0x09, 0x80, 8)\n" +"SOUND_MARIO_ATTACKED = SOUND_ARG_LOAD(2, 4, 0x0A, 0xFF, 8)\n" +"SOUND_MARIO_OOOF = SOUND_ARG_LOAD(2, 4, 0x0B, 0x80, 8)\n" +"SOUND_MARIO_OOOF2 = SOUND_ARG_LOAD(2, 4, 0x0B, 0xD0, 8)\n" +"SOUND_MARIO_HERE_WE_GO = SOUND_ARG_LOAD(2, 4, 0x0C, 0x80, 8)\n" +"SOUND_MARIO_YAWNING = SOUND_ARG_LOAD(2, 4, 0x0D, 0x80, 8)\n" +"SOUND_MARIO_SNORING1 = SOUND_ARG_LOAD(2, 4, 0x0E, 0x00, 8)\n" +"SOUND_MARIO_SNORING2 = SOUND_ARG_LOAD(2, 4, 0x0F, 0x00, 8)\n" +"SOUND_MARIO_WAAAOOOW = SOUND_ARG_LOAD(2, 4, 0x10, 0xC0, 8)\n" +"SOUND_MARIO_HAHA = SOUND_ARG_LOAD(2, 4, 0x11, 0x80, 8)\n" +"SOUND_MARIO_HAHA_2 = SOUND_ARG_LOAD(2, 4, 0x11, 0xF0, 8)\n" +"SOUND_MARIO_UH2 = SOUND_ARG_LOAD(2, 4, 0x13, 0xD0, 8)\n" +"SOUND_MARIO_UH2_2 = SOUND_ARG_LOAD(2, 4, 0x13, 0x80, 8)\n" +"SOUND_MARIO_ON_FIRE = SOUND_ARG_LOAD(2, 4, 0x14, 0xA0, 8)\n" +"SOUND_MARIO_DYING = SOUND_ARG_LOAD(2, 4, 0x15, 0xFF, 8)\n" +"SOUND_MARIO_PANTING_COLD = SOUND_ARG_LOAD(2, 4, 0x16, 0x80, 8)\n" +"SOUND_MARIO_PANTING = SOUND_ARG_LOAD(2, 4, 0x18, 0x80, 8)\n" +"SOUND_MARIO_COUGHING1 = SOUND_ARG_LOAD(2, 4, 0x1B, 0x80, 8)\n" +"SOUND_MARIO_COUGHING2 = SOUND_ARG_LOAD(2, 4, 0x1C, 0x80, 8)\n" +"SOUND_MARIO_COUGHING3 = SOUND_ARG_LOAD(2, 4, 0x1D, 0x80, 8)\n" +"SOUND_MARIO_PUNCH_YAH = SOUND_ARG_LOAD(2, 4, 0x1E, 0x80, 8)\n" +"SOUND_MARIO_PUNCH_HOO = SOUND_ARG_LOAD(2, 4, 0x1F, 0x80, 8)\n" +"SOUND_MARIO_MAMA_MIA = SOUND_ARG_LOAD(2, 4, 0x20, 0x80, 8)\n" +"SOUND_MARIO_OKEY_DOKEY = 0x2021\n" +"SOUND_MARIO_GROUND_POUND_WAH = SOUND_ARG_LOAD(2, 4, 0x22, 0x80, 8)\n" +"SOUND_MARIO_DROWNING = SOUND_ARG_LOAD(2, 4, 0x23, 0xF0, 8)\n" +"SOUND_MARIO_PUNCH_WAH = SOUND_ARG_LOAD(2, 4, 0x24, 0x80, 8)\n" +"SOUND_PEACH_DEAR_MARIO = SOUND_ARG_LOAD(2, 4, 0x28, 0xFF, 8)\n" +"SOUND_MARIO_YAHOO_WAHA_YIPPEE = SOUND_ARG_LOAD(2, 4, 0x2B, 0x80, 8)\n" +"SOUND_MARIO_DOH = SOUND_ARG_LOAD(2, 4, 0x30, 0x80, 8)\n" +"SOUND_MARIO_GAME_OVER = SOUND_ARG_LOAD(2, 4, 0x31, 0xFF, 8)\n" +"SOUND_MARIO_HELLO = SOUND_ARG_LOAD(2, 4, 0x32, 0xFF, 8)\n" +"SOUND_MARIO_PRESS_START_TO_PLAY = SOUND_ARG_LOAD(2, 4, 0x33, 0xFF, 0xA)\n" +"SOUND_MARIO_TWIRL_BOUNCE = SOUND_ARG_LOAD(2, 4, 0x34, 0x80, 8)\n" +"SOUND_MARIO_SNORING3 = SOUND_ARG_LOAD(2, 4, 0x35, 0x00, 8)\n" +"SOUND_MARIO_SO_LONGA_BOWSER = SOUND_ARG_LOAD(2, 4, 0x36, 0x80, 8)\n" +"SOUND_MARIO_IMA_TIRED = SOUND_ARG_LOAD(2, 4, 0x37, 0x80, 8)\n" +"SOUND_PEACH_MARIO = SOUND_ARG_LOAD(2, 4, 0x38, 0xFF, 8)\n" +"SOUND_PEACH_POWER_OF_THE_STARS = SOUND_ARG_LOAD(2, 4, 0x39, 0xFF, 8)\n" +"SOUND_PEACH_THANKS_TO_YOU = SOUND_ARG_LOAD(2, 4, 0x3A, 0xFF, 8)\n" +"SOUND_PEACH_THANK_YOU_MARIO = SOUND_ARG_LOAD(2, 4, 0x3B, 0xFF, 8)\n" +"SOUND_PEACH_SOMETHING_SPECIAL = SOUND_ARG_LOAD(2, 4, 0x3C, 0xFF, 8)\n" +"SOUND_PEACH_BAKE_A_CAKE = SOUND_ARG_LOAD(2, 4, 0x3D, 0xFF, 8)\n" +"SOUND_PEACH_FOR_MARIO = SOUND_ARG_LOAD(2, 4, 0x3E, 0xFF, 8)\n" +"SOUND_PEACH_MARIO2 = SOUND_ARG_LOAD(2, 4, 0x3F, 0xFF, 8)\n" +"SOUND_GENERAL_ACTIVATE_CAP_SWITCH = SOUND_ARG_LOAD(3, 0, 0x00, 0x80, 8)\n" +"SOUND_GENERAL_FLAME_OUT = SOUND_ARG_LOAD(3, 0, 0x03, 0x80, 8)\n" +"SOUND_GENERAL_OPEN_WOOD_DOOR = SOUND_ARG_LOAD(3, 0, 0x04, 0xC0, 8)\n" +"SOUND_GENERAL_CLOSE_WOOD_DOOR = SOUND_ARG_LOAD(3, 0, 0x05, 0xC0, 8)\n" +"SOUND_GENERAL_OPEN_IRON_DOOR = SOUND_ARG_LOAD(3, 0, 0x06, 0xC0, 8)\n" +"SOUND_GENERAL_CLOSE_IRON_DOOR = SOUND_ARG_LOAD(3, 0, 0x07, 0xC0, 8)\n" +"SOUND_GENERAL_BUBBLES = 0x3008\n" +"SOUND_GENERAL_MOVING_WATER = SOUND_ARG_LOAD(3, 0, 0x09, 0x00, 8)\n" +"SOUND_GENERAL_SWISH_WATER = SOUND_ARG_LOAD(3, 0, 0x0A, 0x00, 8)\n" +"SOUND_GENERAL_QUIET_BUBBLE = SOUND_ARG_LOAD(3, 0, 0x0B, 0x00, 8)\n" +"SOUND_GENERAL_VOLCANO_EXPLOSION = SOUND_ARG_LOAD(3, 0, 0x0C, 0x80, 8)\n" +"SOUND_GENERAL_QUIET_BUBBLE2 = SOUND_ARG_LOAD(3, 0, 0x0D, 0x00, 8)\n" +"SOUND_GENERAL_CASTLE_TRAP_OPEN = SOUND_ARG_LOAD(3, 0, 0x0E, 0x80, 8)\n" +"SOUND_GENERAL_WALL_EXPLOSION = SOUND_ARG_LOAD(3, 0, 0x0F, 0x00, 8)\n" +"SOUND_GENERAL_COIN = SOUND_ARG_LOAD(3, 8, 0x11, 0x80, 8)\n" +"SOUND_GENERAL_COIN_WATER = SOUND_ARG_LOAD(3, 8, 0x12, 0x80, 8)\n" +"SOUND_GENERAL_SHORT_STAR = SOUND_ARG_LOAD(3, 0, 0x16, 0x00, 9)\n" +"SOUND_GENERAL_BIG_CLOCK = SOUND_ARG_LOAD(3, 0, 0x17, 0x00, 8)\n" +"SOUND_GENERAL_LOUD_POUND = 0x3018\n" +"SOUND_GENERAL_LOUD_POUND2 = 0x3019\n" +"SOUND_GENERAL_SHORT_POUND1 = 0x301A\n" +"SOUND_GENERAL_SHORT_POUND2 = 0x301B\n" +"SOUND_GENERAL_SHORT_POUND3 = 0x301C\n" +"SOUND_GENERAL_SHORT_POUND4 = 0x301D\n" +"SOUND_GENERAL_SHORT_POUND5 = 0x301E\n" +"SOUND_GENERAL_SHORT_POUND6 = 0x301F\n" +"SOUND_GENERAL_OPEN_CHEST = SOUND_ARG_LOAD(3, 1, 0x20, 0x80, 8)\n" +"SOUND_GENERAL_CLAM_SHELL1 = SOUND_ARG_LOAD(3, 1, 0x22, 0x80, 8)\n" +"SOUND_GENERAL_BOX_LANDING = SOUND_ARG_LOAD(3, 0, 0x24, 0x00, 8)\n" +"SOUND_GENERAL_BOX_LANDING_2 = SOUND_ARG_LOAD(3, 2, 0x24, 0x00, 8)\n" +"SOUND_GENERAL_UNKNOWN1 = SOUND_ARG_LOAD(3, 0, 0x25, 0x00, 8)\n" +"SOUND_GENERAL_UNKNOWN1_2 = SOUND_ARG_LOAD(3, 2, 0x25, 0x00, 8)\n" +"SOUND_GENERAL_CLAM_SHELL2 = SOUND_ARG_LOAD(3, 0, 0x26, 0x40, 8)\n" +"SOUND_GENERAL_CLAM_SHELL3 = SOUND_ARG_LOAD(3, 0, 0x27, 0x40, 8)\n" +"SOUND_GENERAL_PAINTING_EJECT = SOUND_ARG_LOAD(3, 9, 0x28, 0x00, 8)\n" +"SOUND_GENERAL_LEVEL_SELECT_CHANGE = SOUND_ARG_LOAD(3, 0, 0x2B, 0x00, 8)\n" +"SOUND_GENERAL_PLATFORM = SOUND_ARG_LOAD(3, 0, 0x2D, 0x80, 8)\n" +"SOUND_GENERAL_DONUT_PLATFORM_EXPLOSION = SOUND_ARG_LOAD(3, 0, 0x2E, 0x20, 8)\n" +"SOUND_GENERAL_BOWSER_BOMB_EXPLOSION = SOUND_ARG_LOAD(3, 1, 0x2F, 0x00, 8)\n" +"SOUND_GENERAL_COIN_SPURT = SOUND_ARG_LOAD(3, 0, 0x30, 0x00, 8)\n" +"SOUND_GENERAL_COIN_SPURT_2 = SOUND_ARG_LOAD(3, 8, 0x30, 0x00, 8)\n" +"SOUND_GENERAL_COIN_SPURT_EU = SOUND_ARG_LOAD(3, 8, 0x30, 0x20, 8)\n" +"SOUND_GENERAL_EXPLOSION6 = 0x3031\n" +"SOUND_GENERAL_UNK32 = 0x3032\n" +"SOUND_GENERAL_BOAT_TILT1 = SOUND_ARG_LOAD(3, 0, 0x34, 0x40, 8)\n" +"SOUND_GENERAL_BOAT_TILT2 = SOUND_ARG_LOAD(3, 0, 0x35, 0x40, 8)\n" +"SOUND_GENERAL_COIN_DROP = SOUND_ARG_LOAD(3, 0, 0x36, 0x40, 8)\n" +"SOUND_GENERAL_UNKNOWN3_LOWPRIO = SOUND_ARG_LOAD(3, 0, 0x37, 0x00, 8)\n" +"SOUND_GENERAL_UNKNOWN3 = SOUND_ARG_LOAD(3, 0, 0x37, 0x80, 8)\n" +"SOUND_GENERAL_UNKNOWN3_2 = SOUND_ARG_LOAD(3, 8, 0x37, 0x80, 8)\n" +"SOUND_GENERAL_PENDULUM_SWING = SOUND_ARG_LOAD(3, 0, 0x38, 0x00, 8)\n" +"SOUND_GENERAL_CHAIN_CHOMP1 = SOUND_ARG_LOAD(3, 0, 0x39, 0x00, 8)\n" +"SOUND_GENERAL_CHAIN_CHOMP2 = SOUND_ARG_LOAD(3, 0, 0x3A, 0x00, 8)\n" +"SOUND_GENERAL_DOOR_TURN_KEY = SOUND_ARG_LOAD(3, 0, 0x3B, 0x00, 8)\n" +"SOUND_GENERAL_MOVING_IN_SAND = SOUND_ARG_LOAD(3, 0, 0x3C, 0x00, 8)\n" +"SOUND_GENERAL_UNKNOWN4_LOWPRIO = SOUND_ARG_LOAD(3, 0, 0x3D, 0x00, 8)\n" +"SOUND_GENERAL_UNKNOWN4 = SOUND_ARG_LOAD(3, 0, 0x3D, 0x80, 8)\n" +"SOUND_GENERAL_MOVING_PLATFORM_SWITCH = SOUND_ARG_LOAD(3, 0, 0x3E, 0x00, 8)\n" +"SOUND_GENERAL_CAGE_OPEN = SOUND_ARG_LOAD(3, 0, 0x3F, 0xA0, 8)\n" +"SOUND_GENERAL_QUIET_POUND1_LOWPRIO = SOUND_ARG_LOAD(3, 0, 0x40, 0x00, 8)\n" +"SOUND_GENERAL_QUIET_POUND1 = SOUND_ARG_LOAD(3, 0, 0x40, 0x40, 8)\n" +"SOUND_GENERAL_BREAK_BOX = SOUND_ARG_LOAD(3, 0, 0x41, 0xC0, 8)\n" +"SOUND_GENERAL_DOOR_INSERT_KEY = SOUND_ARG_LOAD(3, 0, 0x42, 0x00, 8)\n" +"SOUND_GENERAL_QUIET_POUND2 = SOUND_ARG_LOAD(3, 0, 0x43, 0x00, 8)\n" +"SOUND_GENERAL_BIG_POUND = SOUND_ARG_LOAD(3, 0, 0x44, 0x00, 8)\n" +"SOUND_GENERAL_UNK45 = SOUND_ARG_LOAD(3, 0, 0x45, 0x00, 8)\n" +"SOUND_GENERAL_UNK46_LOWPRIO = SOUND_ARG_LOAD(3, 0, 0x46, 0x00, 8)\n" +"SOUND_GENERAL_UNK46 = SOUND_ARG_LOAD(3, 0, 0x46, 0x80, 8)\n" +"SOUND_GENERAL_CANNON_UP = SOUND_ARG_LOAD(3, 0, 0x47, 0x80, 8)\n" +"SOUND_GENERAL_GRINDEL_ROLL = SOUND_ARG_LOAD(3, 0, 0x48, 0x00, 8)\n" +"SOUND_GENERAL_EXPLOSION7 = 0x3049\n" +"SOUND_GENERAL_SHAKE_COFFIN = 0x304A\n" +"SOUND_GENERAL_RACE_GUN_SHOT = SOUND_ARG_LOAD(3, 1, 0x4D, 0x40, 8)\n" +"SOUND_GENERAL_STAR_DOOR_OPEN = SOUND_ARG_LOAD(3, 0, 0x4E, 0xC0, 8)\n" +"SOUND_GENERAL_STAR_DOOR_CLOSE = SOUND_ARG_LOAD(3, 0, 0x4F, 0xC0, 8)\n" +"SOUND_GENERAL_POUND_ROCK = SOUND_ARG_LOAD(3, 0, 0x56, 0x00, 8)\n" +"SOUND_GENERAL_STAR_APPEARS = SOUND_ARG_LOAD(3, 0, 0x57, 0xFF, 9)\n" +"SOUND_GENERAL_COLLECT_1UP = SOUND_ARG_LOAD(3, 0, 0x58, 0xFF, 8)\n" +"SOUND_GENERAL_BUTTON_PRESS_LOWPRIO = SOUND_ARG_LOAD(3, 0, 0x5A, 0x00, 8)\n" +"SOUND_GENERAL_BUTTON_PRESS = SOUND_ARG_LOAD(3, 0, 0x5A, 0x40, 8)\n" +"SOUND_GENERAL_BUTTON_PRESS_2_LOWPRIO = SOUND_ARG_LOAD(3, 1, 0x5A, 0x00, 8)\n" +"SOUND_GENERAL_BUTTON_PRESS_2 = SOUND_ARG_LOAD(3, 1, 0x5A, 0x40, 8)\n" +"SOUND_GENERAL_ELEVATOR_MOVE = SOUND_ARG_LOAD(3, 0, 0x5B, 0x00, 8)\n" +"SOUND_GENERAL_ELEVATOR_MOVE_2 = SOUND_ARG_LOAD(3, 1, 0x5B, 0x00, 8)\n" +"SOUND_GENERAL_SWISH_AIR = SOUND_ARG_LOAD(3, 0, 0x5C, 0x00, 8)\n" +"SOUND_GENERAL_SWISH_AIR_2 = SOUND_ARG_LOAD(3, 1, 0x5C, 0x00, 8)\n" +"SOUND_GENERAL_HAUNTED_CHAIR = SOUND_ARG_LOAD(3, 0, 0x5D, 0x00, 8)\n" +"SOUND_GENERAL_SOFT_LANDING = SOUND_ARG_LOAD(3, 0, 0x5E, 0x00, 8)\n" +"SOUND_GENERAL_HAUNTED_CHAIR_MOVE = SOUND_ARG_LOAD(3, 0, 0x5F, 0x00, 8)\n" +"SOUND_GENERAL_BOWSER_PLATFORM = SOUND_ARG_LOAD(3, 0, 0x62, 0x80, 8)\n" +"SOUND_GENERAL_BOWSER_PLATFORM_2 = SOUND_ARG_LOAD(3, 1, 0x62, 0x80, 8)\n" +"SOUND_GENERAL_HEART_SPIN = SOUND_ARG_LOAD(3, 0, 0x64, 0xC0, 8)\n" +"SOUND_GENERAL_POUND_WOOD_POST = SOUND_ARG_LOAD(3, 0, 0x65, 0xC0, 8)\n" +"SOUND_GENERAL_WATER_LEVEL_TRIG = SOUND_ARG_LOAD(3, 0, 0x66, 0x80, 8)\n" +"SOUND_GENERAL_SWITCH_DOOR_OPEN = SOUND_ARG_LOAD(3, 0, 0x67, 0xA0, 8)\n" +"SOUND_GENERAL_RED_COIN = SOUND_ARG_LOAD(3, 0, 0x68, 0x90, 8)\n" +"SOUND_GENERAL_BIRDS_FLY_AWAY = SOUND_ARG_LOAD(3, 0, 0x69, 0x00, 8)\n" +"SOUND_GENERAL_METAL_POUND = SOUND_ARG_LOAD(3, 0, 0x6B, 0x80, 8)\n" +"SOUND_GENERAL_BOING1 = SOUND_ARG_LOAD(3, 0, 0x6C, 0x40, 8)\n" +"SOUND_GENERAL_BOING2_LOWPRIO = SOUND_ARG_LOAD(3, 0, 0x6D, 0x20, 8)\n" +"SOUND_GENERAL_BOING2 = SOUND_ARG_LOAD(3, 0, 0x6D, 0x40, 8)\n" +"SOUND_GENERAL_YOSHI_WALK = SOUND_ARG_LOAD(3, 0, 0x6E, 0x20, 8)\n" +"SOUND_GENERAL_ENEMY_ALERT1 = SOUND_ARG_LOAD(3, 0, 0x6F, 0x30, 8)\n" +"SOUND_GENERAL_YOSHI_TALK = SOUND_ARG_LOAD(3, 0, 0x70, 0x30, 8)\n" +"SOUND_GENERAL_SPLATTERING = SOUND_ARG_LOAD(3, 0, 0x71, 0x30, 8)\n" +"SOUND_GENERAL_BOING3 = 0x3072\n" +"SOUND_GENERAL_GRAND_STAR = SOUND_ARG_LOAD(3, 0, 0x73, 0x00, 8)\n" +"SOUND_GENERAL_GRAND_STAR_JUMP = SOUND_ARG_LOAD(3, 0, 0x74, 0x00, 8)\n" +"SOUND_GENERAL_BOAT_ROCK = SOUND_ARG_LOAD(3, 0, 0x75, 0x00, 8)\n" +"SOUND_GENERAL_VANISH_SFX = SOUND_ARG_LOAD(3, 0, 0x76, 0x20, 8)\n" +"SOUND_ENV_WATERFALL1 = SOUND_ARG_LOAD(4, 0, 0x00, 0x00, 0)\n" +"SOUND_ENV_WATERFALL2 = SOUND_ARG_LOAD(4, 0, 0x01, 0x00, 0)\n" +"SOUND_ENV_ELEVATOR1 = SOUND_ARG_LOAD(4, 0, 0x02, 0x00, 0)\n" +"SOUND_ENV_DRONING1 = SOUND_ARG_LOAD(4, 1, 0x03, 0x00, 0)\n" +"SOUND_ENV_DRONING2 = SOUND_ARG_LOAD(4, 0, 0x04, 0x00, 0)\n" +"SOUND_ENV_WIND1 = SOUND_ARG_LOAD(4, 0, 0x05, 0x00, 0)\n" +"SOUND_ENV_MOVING_SAND_SNOW = 0x4006\n" +"SOUND_ENV_UNK07 = 0x4007\n" +"SOUND_ENV_ELEVATOR2 = SOUND_ARG_LOAD(4, 0, 0x08, 0x00, 0)\n" +"SOUND_ENV_WATER = SOUND_ARG_LOAD(4, 0, 0x09, 0x00, 0)\n" +"SOUND_ENV_UNKNOWN2 = SOUND_ARG_LOAD(4, 0, 0x0A, 0x00, 0)\n" +"SOUND_ENV_BOAT_ROCKING1 = SOUND_ARG_LOAD(4, 0, 0x0B, 0x00, 0)\n" +"SOUND_ENV_ELEVATOR3 = SOUND_ARG_LOAD(4, 0, 0x0C, 0x00, 0)\n" +"SOUND_ENV_ELEVATOR4 = SOUND_ARG_LOAD(4, 0, 0x0D, 0x00, 0)\n" +"SOUND_ENV_ELEVATOR4_2 = SOUND_ARG_LOAD(4, 1, 0x0D, 0x00, 0)\n" +"SOUND_ENV_MOVINGSAND = SOUND_ARG_LOAD(4, 0, 0x0E, 0x00, 0)\n" +"SOUND_ENV_MERRY_GO_ROUND_CREAKING = SOUND_ARG_LOAD(4, 0, 0x0F, 0x40, 0)\n" +"SOUND_ENV_WIND2 = SOUND_ARG_LOAD(4, 0, 0x10, 0x80, 0)\n" +"SOUND_ENV_UNK12 = 0x4012\n" +"SOUND_ENV_SLIDING = SOUND_ARG_LOAD(4, 0, 0x13, 0x00, 0)\n" +"SOUND_ENV_STAR = SOUND_ARG_LOAD(4, 0, 0x14, 0x00, 1)\n" +"SOUND_ENV_UNKNOWN4 = SOUND_ARG_LOAD(4, 1, 0x15, 0x00, 0)\n" +"SOUND_ENV_WATER_DRAIN = SOUND_ARG_LOAD(4, 1, 0x16, 0x00, 0)\n" +"SOUND_ENV_METAL_BOX_PUSH = SOUND_ARG_LOAD(4, 0, 0x17, 0x80, 0)\n" +"SOUND_ENV_SINK_QUICKSAND = SOUND_ARG_LOAD(4, 0, 0x18, 0x80, 0)\n" +"SOUND_OBJ_SUSHI_SHARK_WATER_SOUND = SOUND_ARG_LOAD(5, 0, 0x00, 0x80, 8)\n" +"SOUND_OBJ_MRI_SHOOT = SOUND_ARG_LOAD(5, 0, 0x01, 0x00, 8)\n" +"SOUND_OBJ_BABY_PENGUIN_WALK = SOUND_ARG_LOAD(5, 0, 0x02, 0x00, 8)\n" +"SOUND_OBJ_BOWSER_WALK = SOUND_ARG_LOAD(5, 0, 0x03, 0x00, 8)\n" +"SOUND_OBJ_BOWSER_TAIL_PICKUP = SOUND_ARG_LOAD(5, 0, 0x05, 0x00, 8)\n" +"SOUND_OBJ_BOWSER_DEFEATED = SOUND_ARG_LOAD(5, 0, 0x06, 0x00, 8)\n" +"SOUND_OBJ_BOWSER_SPINNING = SOUND_ARG_LOAD(5, 0, 0x07, 0x00, 8)\n" +"SOUND_OBJ_BOWSER_INHALING = SOUND_ARG_LOAD(5, 0, 0x08, 0x00, 8)\n" +"SOUND_OBJ_BIG_PENGUIN_WALK = SOUND_ARG_LOAD(5, 0, 0x09, 0x80, 8)\n" +"SOUND_OBJ_BOO_BOUNCE_TOP = SOUND_ARG_LOAD(5, 0, 0x0A, 0x00, 8)\n" +"SOUND_OBJ_BOO_LAUGH_SHORT = SOUND_ARG_LOAD(5, 0, 0x0B, 0x00, 8)\n" +"SOUND_OBJ_THWOMP = SOUND_ARG_LOAD(5, 0, 0x0C, 0xA0, 8)\n" +"SOUND_OBJ_CANNON1 = SOUND_ARG_LOAD(5, 0, 0x0D, 0xF0, 8)\n" +"SOUND_OBJ_CANNON2 = SOUND_ARG_LOAD(5, 0, 0x0E, 0xF0, 8)\n" +"SOUND_OBJ_CANNON3 = SOUND_ARG_LOAD(5, 0, 0x0F, 0xF0, 8)\n" +"SOUND_OBJ_JUMP_WALK_WATER = 0x5012\n" +"SOUND_OBJ_UNKNOWN2 = SOUND_ARG_LOAD(5, 0, 0x13, 0x00, 8)\n" +"SOUND_OBJ_MRI_DEATH = SOUND_ARG_LOAD(5, 0, 0x14, 0x00, 8)\n" +"SOUND_OBJ_POUNDING1 = SOUND_ARG_LOAD(5, 0, 0x15, 0x50, 8)\n" +"SOUND_OBJ_POUNDING1_HIGHPRIO = SOUND_ARG_LOAD(5, 0, 0x15, 0x80, 8)\n" +"SOUND_OBJ_WHOMP_LOWPRIO = SOUND_ARG_LOAD(5, 0, 0x16, 0x60, 8)\n" +"SOUND_OBJ_KING_BOBOMB = SOUND_ARG_LOAD(5, 0, 0x16, 0x80, 8)\n" +"SOUND_OBJ_BULLY_METAL = SOUND_ARG_LOAD(5, 0, 0x17, 0x80, 8)\n" +"SOUND_OBJ_BULLY_EXPLODE = SOUND_ARG_LOAD(5, 0, 0x18, 0xA0, 8)\n" +"SOUND_OBJ_BULLY_EXPLODE_2 = SOUND_ARG_LOAD(5, 1, 0x18, 0xA0, 8)\n" +"SOUND_OBJ_POUNDING_CANNON = SOUND_ARG_LOAD(5, 0, 0x1A, 0x50, 8)\n" +"SOUND_OBJ_BULLY_WALK = SOUND_ARG_LOAD(5, 0, 0x1B, 0x30, 8)\n" +"SOUND_OBJ_UNKNOWN3 = SOUND_ARG_LOAD(5, 0, 0x1D, 0x80, 8)\n" +"SOUND_OBJ_UNKNOWN4 = SOUND_ARG_LOAD(5, 0, 0x1E, 0xA0, 8)\n" +"SOUND_OBJ_BABY_PENGUIN_DIVE = SOUND_ARG_LOAD(5, 0, 0x1F, 0x40, 8)\n" +"SOUND_OBJ_GOOMBA_WALK = SOUND_ARG_LOAD(5, 0, 0x20, 0x00, 8)\n" +"SOUND_OBJ_UKIKI_CHATTER_LONG = SOUND_ARG_LOAD(5, 0, 0x21, 0x00, 8)\n" +"SOUND_OBJ_MONTY_MOLE_ATTACK = SOUND_ARG_LOAD(5, 0, 0x22, 0x00, 8)\n" +"SOUND_OBJ_EVIL_LAKITU_THROW = SOUND_ARG_LOAD(5, 0, 0x22, 0x20, 8)\n" +"SOUND_OBJ_UNK23 = 0x5023\n" +"SOUND_OBJ_DYING_ENEMY1 = SOUND_ARG_LOAD(5, 0, 0x24, 0x40, 8)\n" +"SOUND_OBJ_CANNON4 = SOUND_ARG_LOAD(5, 0, 0x25, 0x40, 8)\n" +"SOUND_OBJ_DYING_ENEMY2 = 0x5026\n" +"SOUND_OBJ_BOBOMB_WALK = SOUND_ARG_LOAD(5, 0, 0x27, 0x00, 8)\n" +"SOUND_OBJ_SOMETHING_LANDING = SOUND_ARG_LOAD(5, 0, 0x28, 0x80, 8)\n" +"SOUND_OBJ_DIVING_IN_WATER = SOUND_ARG_LOAD(5, 0, 0x29, 0xA0, 8)\n" +"SOUND_OBJ_SNOW_SAND1 = SOUND_ARG_LOAD(5, 0, 0x2A, 0x00, 8)\n" +"SOUND_OBJ_SNOW_SAND2 = SOUND_ARG_LOAD(5, 0, 0x2B, 0x00, 8)\n" +"SOUND_OBJ_DEFAULT_DEATH = SOUND_ARG_LOAD(5, 0, 0x2C, 0x80, 8)\n" +"SOUND_OBJ_BIG_PENGUIN_YELL = SOUND_ARG_LOAD(5, 0, 0x2D, 0x00, 8)\n" +"SOUND_OBJ_WATER_BOMB_BOUNCING = SOUND_ARG_LOAD(5, 0, 0x2E, 0x80, 8)\n" +"SOUND_OBJ_GOOMBA_ALERT = SOUND_ARG_LOAD(5, 0, 0x2F, 0x00, 8)\n" +"SOUND_OBJ_WIGGLER_JUMP = SOUND_ARG_LOAD(5, 0, 0x2F, 0x60, 8)\n" +"SOUND_OBJ_STOMPED = SOUND_ARG_LOAD(5, 0, 0x30, 0x80, 8)\n" +"SOUND_OBJ_UNKNOWN6 = SOUND_ARG_LOAD(5, 0, 0x31, 0x00, 8)\n" +"SOUND_OBJ_DIVING_INTO_WATER = SOUND_ARG_LOAD(5, 0, 0x32, 0x40, 8)\n" +"SOUND_OBJ_PIRANHA_PLANT_SHRINK = SOUND_ARG_LOAD(5, 0, 0x33, 0x40, 8)\n" +"SOUND_OBJ_KOOPA_THE_QUICK_WALK = SOUND_ARG_LOAD(5, 0, 0x34, 0x20, 8)\n" +"SOUND_OBJ_KOOPA_WALK = SOUND_ARG_LOAD(5, 0, 0x35, 0x00, 8)\n" +"SOUND_OBJ_BULLY_WALKING = SOUND_ARG_LOAD(5, 0, 0x36, 0x60, 8)\n" +"SOUND_OBJ_DORRIE = SOUND_ARG_LOAD(5, 0, 0x37, 0x60, 8)\n" +"SOUND_OBJ_BOWSER_LAUGH = SOUND_ARG_LOAD(5, 0, 0x38, 0x80, 8)\n" +"SOUND_OBJ_UKIKI_CHATTER_SHORT = SOUND_ARG_LOAD(5, 0, 0x39, 0x00, 8)\n" +"SOUND_OBJ_UKIKI_CHATTER_IDLE = SOUND_ARG_LOAD(5, 0, 0x3A, 0x00, 8)\n" +"SOUND_OBJ_UKIKI_STEP_DEFAULT = SOUND_ARG_LOAD(5, 0, 0x3B, 0x00, 8)\n" +"SOUND_OBJ_UKIKI_STEP_LEAVES = SOUND_ARG_LOAD(5, 0, 0x3C, 0x00, 8)\n" +"SOUND_OBJ_KOOPA_TALK = SOUND_ARG_LOAD(5, 0, 0x3D, 0xA0, 8)\n" +"SOUND_OBJ_KOOPA_DAMAGE = SOUND_ARG_LOAD(5, 0, 0x3E, 0xA0, 8)\n" +"SOUND_OBJ_KLEPTO1 = SOUND_ARG_LOAD(5, 0, 0x3F, 0x40, 8)\n" +"SOUND_OBJ_KLEPTO2 = SOUND_ARG_LOAD(5, 0, 0x40, 0x60, 8)\n" +"SOUND_OBJ_KING_BOBOMB_TALK = SOUND_ARG_LOAD(5, 0, 0x41, 0x00, 8)\n" +"SOUND_OBJ_KING_BOBOMB_JUMP = SOUND_ARG_LOAD(5, 0, 0x46, 0x80, 8)\n" +"SOUND_OBJ_KING_WHOMP_DEATH = SOUND_ARG_LOAD(5, 1, 0x47, 0xC0, 8)\n" +"SOUND_OBJ_BOO_LAUGH_LONG = SOUND_ARG_LOAD(5, 0, 0x48, 0x00, 8)\n" +"SOUND_OBJ_EEL = SOUND_ARG_LOAD(5, 0, 0x4A, 0x00, 8)\n" +"SOUND_OBJ_EEL_2 = SOUND_ARG_LOAD(5, 2, 0x4A, 0x00, 8)\n" +"SOUND_OBJ_EYEROK_SHOW_EYE = SOUND_ARG_LOAD(5, 2, 0x4B, 0x00, 8)\n" +"SOUND_OBJ_MR_BLIZZARD_ALERT = SOUND_ARG_LOAD(5, 0, 0x4C, 0x00, 8)\n" +"SOUND_OBJ_SNUFIT_SHOOT = SOUND_ARG_LOAD(5, 0, 0x4D, 0x00, 8)\n" +"SOUND_OBJ_SKEETER_WALK = SOUND_ARG_LOAD(5, 0, 0x4E, 0x00, 8)\n" +"SOUND_OBJ_WALKING_WATER = SOUND_ARG_LOAD(5, 0, 0x4F, 0x00, 8)\n" +"SOUND_OBJ_BIRD_CHIRP3 = SOUND_ARG_LOAD(5, 0, 0x51, 0x40, 0)\n" +"SOUND_OBJ_PIRANHA_PLANT_APPEAR = SOUND_ARG_LOAD(5, 0, 0x54, 0x20, 8)\n" +"SOUND_OBJ_FLAME_BLOWN = SOUND_ARG_LOAD(5, 0, 0x55, 0x80, 8)\n" +"SOUND_OBJ_MAD_PIANO_CHOMPING = SOUND_ARG_LOAD(5, 2, 0x56, 0x40, 8)\n" +"SOUND_OBJ_BOBOMB_BUDDY_TALK = SOUND_ARG_LOAD(5, 0, 0x58, 0x40, 8)\n" +"SOUND_OBJ_SPINY_UNK59 = SOUND_ARG_LOAD(5, 0, 0x59, 0x10, 8)\n" +"SOUND_OBJ_WIGGLER_HIGH_PITCH = SOUND_ARG_LOAD(5, 0, 0x5C, 0x40, 8)\n" +"SOUND_OBJ_HEAVEHO_TOSSED = SOUND_ARG_LOAD(5, 0, 0x5D, 0x40, 8)\n" +"SOUND_OBJ_WIGGLER_DEATH = 0x505E\n" +"SOUND_OBJ_BOWSER_INTRO_LAUGH = SOUND_ARG_LOAD(5, 0, 0x5F, 0x80, 9)\n" +"SOUND_OBJ_ENEMY_DEATH_HIGH = SOUND_ARG_LOAD(5, 0, 0x60, 0xB0, 8)\n" +"SOUND_OBJ_ENEMY_DEATH_LOW = SOUND_ARG_LOAD(5, 0, 0x61, 0xB0, 8)\n" +"SOUND_OBJ_SWOOP_DEATH = SOUND_ARG_LOAD(5, 0, 0x62, 0xB0, 8)\n" +"SOUND_OBJ_KOOPA_FLYGUY_DEATH = SOUND_ARG_LOAD(5, 0, 0x63, 0xB0, 8)\n" +"SOUND_OBJ_POKEY_DEATH = SOUND_ARG_LOAD(5, 0, 0x63, 0xC0, 8)\n" +"SOUND_OBJ_SNOWMAN_BOUNCE = SOUND_ARG_LOAD(5, 0, 0x64, 0xC0, 8)\n" +"SOUND_OBJ_SNOWMAN_EXPLODE = SOUND_ARG_LOAD(5, 0, 0x65, 0xD0, 8)\n" +"SOUND_OBJ_POUNDING_LOUD = SOUND_ARG_LOAD(5, 0, 0x68, 0x40, 8)\n" +"SOUND_OBJ_MIPS_RABBIT = SOUND_ARG_LOAD(5, 0, 0x6A, 0x00, 8)\n" +"SOUND_OBJ_MIPS_RABBIT_WATER = SOUND_ARG_LOAD(5, 0, 0x6C, 0x00, 8)\n" +"SOUND_OBJ_EYEROK_EXPLODE = SOUND_ARG_LOAD(5, 0, 0x6D, 0x00, 8)\n" +"SOUND_OBJ_CHUCKYA_DEATH = SOUND_ARG_LOAD(5, 1, 0x6E, 0x00, 8)\n" +"SOUND_OBJ_WIGGLER_TALK = SOUND_ARG_LOAD(5, 0, 0x6F, 0x00, 8)\n" +"SOUND_OBJ_WIGGLER_ATTACKED = SOUND_ARG_LOAD(5, 0, 0x70, 0x60, 8)\n" +"SOUND_OBJ_WIGGLER_LOW_PITCH = SOUND_ARG_LOAD(5, 0, 0x71, 0x20, 8)\n" +"SOUND_OBJ_SNUFIT_SKEETER_DEATH = SOUND_ARG_LOAD(5, 0, 0x72, 0xC0, 8)\n" +"SOUND_OBJ_BUBBA_CHOMP = SOUND_ARG_LOAD(5, 0, 0x73, 0x40, 8)\n" +"SOUND_OBJ_ENEMY_DEFEAT_SHRINK = SOUND_ARG_LOAD(5, 0, 0x74, 0x40, 8)\n" +"SOUND_AIR_BOWSER_SPIT_FIRE = SOUND_ARG_LOAD(6, 0, 0x00, 0x00, 0)\n" +"SOUND_AIR_UNK01 = 0x6001\n" +"SOUND_AIR_LAKITU_FLY = SOUND_ARG_LOAD(6, 0, 0x02, 0x80, 0)\n" +"SOUND_AIR_LAKITU_FLY_HIGHPRIO = SOUND_ARG_LOAD(6, 0, 0x02, 0xFF, 0)\n" +"SOUND_AIR_AMP_BUZZ = SOUND_ARG_LOAD(6, 0, 0x03, 0x40, 0)\n" +"SOUND_AIR_BLOW_FIRE = SOUND_ARG_LOAD(6, 0, 0x04, 0x80, 0)\n" +"SOUND_AIR_BLOW_WIND = SOUND_ARG_LOAD(6, 0, 0x04, 0x40, 0)\n" +"SOUND_AIR_ROUGH_SLIDE = SOUND_ARG_LOAD(6, 0, 0x05, 0x00, 0)\n" +"SOUND_AIR_HEAVEHO_MOVE = SOUND_ARG_LOAD(6, 0, 0x06, 0x40, 0)\n" +"SOUND_AIR_UNK07 = 0x6007\n" +"SOUND_AIR_BOBOMB_LIT_FUSE = SOUND_ARG_LOAD(6, 0, 0x08, 0x60, 0)\n" +"SOUND_AIR_HOWLING_WIND = SOUND_ARG_LOAD(6, 0, 0x09, 0x80, 0)\n" +"SOUND_AIR_CHUCKYA_MOVE = SOUND_ARG_LOAD(6, 0, 0x0A, 0x40, 0)\n" +"SOUND_AIR_PEACH_TWINKLE = SOUND_ARG_LOAD(6, 0, 0x0B, 0x40, 0)\n" +"SOUND_AIR_CASTLE_OUTDOORS_AMBIENT = SOUND_ARG_LOAD(6, 0, 0x10, 0x40, 0)\n" +"SOUND_MENU_CHANGE_SELECT = SOUND_ARG_LOAD(7, 0, 0x00, 0xF8, 8)\n" +"SOUND_MENU_REVERSE_PAUSE = 0x7001\n" +"SOUND_MENU_PAUSE = SOUND_ARG_LOAD(7, 0, 0x02, 0xF0, 8)\n" +"SOUND_MENU_PAUSE_HIGHPRIO = SOUND_ARG_LOAD(7, 0, 0x02, 0xFF, 8)\n" +"SOUND_MENU_PAUSE_2 = SOUND_ARG_LOAD(7, 0, 0x03, 0xFF, 8)\n" +"SOUND_MENU_MESSAGE_APPEAR = SOUND_ARG_LOAD(7, 0, 0x04, 0x00, 8)\n" +"SOUND_MENU_MESSAGE_DISAPPEAR = SOUND_ARG_LOAD(7, 0, 0x05, 0x00, 8)\n" +"SOUND_MENU_CAMERA_ZOOM_IN = SOUND_ARG_LOAD(7, 0, 0x06, 0x00, 8)\n" +"SOUND_MENU_CAMERA_ZOOM_OUT = SOUND_ARG_LOAD(7, 0, 0x07, 0x00, 8)\n" +"SOUND_MENU_PINCH_MARIO_FACE = SOUND_ARG_LOAD(7, 0, 0x08, 0x00, 8)\n" +"SOUND_MENU_LET_GO_MARIO_FACE = SOUND_ARG_LOAD(7, 0, 0x09, 0x00, 8)\n" +"SOUND_MENU_HAND_APPEAR = SOUND_ARG_LOAD(7, 0, 0x0A, 0x00, 8)\n" +"SOUND_MENU_HAND_DISAPPEAR = SOUND_ARG_LOAD(7, 0, 0x0B, 0x00, 8)\n" +"SOUND_MENU_UNK0C = SOUND_ARG_LOAD(7, 0, 0x0C, 0x00, 8)\n" +"SOUND_MENU_POWER_METER = SOUND_ARG_LOAD(7, 0, 0x0D, 0x00, 8)\n" +"SOUND_MENU_CAMERA_BUZZ = SOUND_ARG_LOAD(7, 0, 0x0E, 0x00, 8)\n" +"SOUND_MENU_CAMERA_TURN = SOUND_ARG_LOAD(7, 0, 0x0F, 0x00, 8)\n" +"SOUND_MENU_UNK10 = 0x7010\n" +"SOUND_MENU_CLICK_FILE_SELECT = SOUND_ARG_LOAD(7, 0, 0x11, 0x00, 8)\n" +"SOUND_MENU_MESSAGE_NEXT_PAGE = SOUND_ARG_LOAD(7, 0, 0x13, 0x00, 8)\n" +"SOUND_MENU_COIN_ITS_A_ME_MARIO = SOUND_ARG_LOAD(7, 0, 0x14, 0x00, 8)\n" +"SOUND_MENU_YOSHI_GAIN_LIVES = SOUND_ARG_LOAD(7, 0, 0x15, 0x00, 8)\n" +"SOUND_MENU_ENTER_PIPE = SOUND_ARG_LOAD(7, 0, 0x16, 0xA0, 8)\n" +"SOUND_MENU_EXIT_PIPE = SOUND_ARG_LOAD(7, 0, 0x17, 0xA0, 8)\n" +"SOUND_MENU_BOWSER_LAUGH = SOUND_ARG_LOAD(7, 0, 0x18, 0x80, 8)\n" +"SOUND_MENU_ENTER_HOLE = SOUND_ARG_LOAD(7, 1, 0x19, 0x80, 8)\n" +"SOUND_MENU_CLICK_CHANGE_VIEW = SOUND_ARG_LOAD(7, 0, 0x1A, 0x80, 8)\n" +"SOUND_MENU_CAMERA_UNUSED1 = 0x701B\n" +"SOUND_MENU_CAMERA_UNUSED2 = 0x701C\n" +"SOUND_MENU_MARIO_CASTLE_WARP = SOUND_ARG_LOAD(7, 0, 0x1D, 0xB0, 8)\n" +"SOUND_MENU_STAR_SOUND = SOUND_ARG_LOAD(7, 0, 0x1E, 0xFF, 8)\n" +"SOUND_MENU_THANK_YOU_PLAYING_MY_GAME = SOUND_ARG_LOAD(7, 0, 0x1F, 0xFF, 8)\n" +"SOUND_MENU_READ_A_SIGN = 0x7020\n" +"SOUND_MENU_EXIT_A_SIGN = 0x7021\n" +"SOUND_MENU_MARIO_CASTLE_WARP2 = SOUND_ARG_LOAD(7, 0, 0x22, 0x20, 8)\n" +"SOUND_MENU_STAR_SOUND_OKEY_DOKEY = SOUND_ARG_LOAD(7, 0, 0x23, 0xFF, 8)\n" +"SOUND_MENU_STAR_SOUND_LETS_A_GO = SOUND_ARG_LOAD(7, 0, 0x24, 0xFF, 8)\n" +"SOUND_MENU_COLLECT_RED_COIN = SOUND_ARG_LOAD(7, 8, 0x28, 0x90, 8)\n" +"SOUND_MENU_COLLECT_SECRET = SOUND_ARG_LOAD(7, 0, 0x30, 0x20, 8)\n" +"SOUND_GENERAL2_BOBOMB_EXPLOSION = SOUND_ARG_LOAD(8, 0, 0x2E, 0x20, 8)\n" +"SOUND_GENERAL2_PURPLE_SWITCH = SOUND_ARG_LOAD(8, 0, 0x3E, 0xC0, 8)\n" +"SOUND_GENERAL2_ROTATING_BLOCK_CLICK = SOUND_ARG_LOAD(8, 0, 0x40, 0x00, 8)\n" +"SOUND_GENERAL2_SPINDEL_ROLL = SOUND_ARG_LOAD(8, 0, 0x48, 0x20, 8)\n" +"SOUND_GENERAL2_PYRAMID_TOP_SPIN = SOUND_ARG_LOAD(8, 1, 0x4B, 0xE0, 8)\n" +"SOUND_GENERAL2_PYRAMID_TOP_EXPLOSION = SOUND_ARG_LOAD(8, 1, 0x4C, 0xF0, 8)\n" +"SOUND_GENERAL2_BIRD_CHIRP2 = SOUND_ARG_LOAD(8, 0, 0x50, 0x40, 0)\n" +"SOUND_GENERAL2_SWITCH_TICK_FAST = SOUND_ARG_LOAD(8, 0, 0x54, 0xF0, 1)\n" +"SOUND_GENERAL2_SWITCH_TICK_SLOW = SOUND_ARG_LOAD(8, 0, 0x55, 0xF0, 1)\n" +"SOUND_GENERAL2_STAR_APPEARS = SOUND_ARG_LOAD(8, 0, 0x57, 0xFF, 9)\n" +"SOUND_GENERAL2_ROTATING_BLOCK_ALERT = SOUND_ARG_LOAD(8, 0, 0x59, 0x00, 8)\n" +"SOUND_GENERAL2_BOWSER_EXPLODE = SOUND_ARG_LOAD(8, 0, 0x60, 0x00, 8)\n" +"SOUND_GENERAL2_BOWSER_KEY = SOUND_ARG_LOAD(8, 0, 0x61, 0x00, 8)\n" +"SOUND_GENERAL2_1UP_APPEAR = SOUND_ARG_LOAD(8, 0, 0x63, 0xD0, 8)\n" +"SOUND_GENERAL2_RIGHT_ANSWER = SOUND_ARG_LOAD(8, 0, 0x6A, 0xA0, 8)\n" +"SOUND_OBJ2_BOWSER_ROAR = SOUND_ARG_LOAD(9, 0, 0x04, 0x00, 8)\n" +"SOUND_OBJ2_PIRANHA_PLANT_BITE = SOUND_ARG_LOAD(9, 0, 0x10, 0x50, 8)\n" +"SOUND_OBJ2_PIRANHA_PLANT_DYING = SOUND_ARG_LOAD(9, 0, 0x11, 0x60, 8)\n" +"SOUND_OBJ2_BOWSER_PUZZLE_PIECE_MOVE = SOUND_ARG_LOAD(9, 0, 0x19, 0x20, 8)\n" +"SOUND_OBJ2_BULLY_ATTACKED = SOUND_ARG_LOAD(9, 0, 0x1C, 0x00, 8)\n" +"SOUND_OBJ2_KING_BOBOMB_DAMAGE = SOUND_ARG_LOAD(9, 1, 0x42, 0x40, 8)\n" +"SOUND_OBJ2_SCUTTLEBUG_WALK = SOUND_ARG_LOAD(9, 0, 0x43, 0x40, 8)\n" +"SOUND_OBJ2_SCUTTLEBUG_ALERT = SOUND_ARG_LOAD(9, 0, 0x44, 0x40, 8)\n" +"SOUND_OBJ2_BABY_PENGUIN_YELL = SOUND_ARG_LOAD(9, 0, 0x45, 0x00, 8)\n" +"SOUND_OBJ2_SWOOP = SOUND_ARG_LOAD(9, 0, 0x49, 0x00, 8)\n" +"SOUND_OBJ2_BIRD_CHIRP1 = SOUND_ARG_LOAD(9, 0, 0x52, 0x40, 0)\n" +"SOUND_OBJ2_LARGE_BULLY_ATTACKED = SOUND_ARG_LOAD(9, 0, 0x57, 0x00, 8)\n" +"SOUND_OBJ2_EYEROK_SOUND_SHORT = SOUND_ARG_LOAD(9, 3, 0x5A, 0x00, 8)\n" +"SOUND_OBJ2_WHOMP_SOUND_SHORT = SOUND_ARG_LOAD(9, 3, 0x5A, 0xC0, 8)\n" +"SOUND_OBJ2_EYEROK_SOUND_LONG = SOUND_ARG_LOAD(9, 2, 0x5B, 0x00, 8)\n" +"SOUND_OBJ2_BOWSER_TELEPORT = SOUND_ARG_LOAD(9, 0, 0x66, 0x80, 8)\n" +"SOUND_OBJ2_MONTY_MOLE_APPEAR = SOUND_ARG_LOAD(9, 0, 0x67, 0x80, 8)\n" +"SOUND_OBJ2_BOSS_DIALOG_GRUNT = SOUND_ARG_LOAD(9, 0, 0x69, 0x40, 8)\n" +"SOUND_OBJ2_MRI_SPINNING = SOUND_ARG_LOAD(9, 0, 0x6B, 0x00, 8)\n" +"MARIO_ANIM_SLOW_LEDGE_GRAB = 0\n" +"MARIO_ANIM_FALL_OVER_BACKWARDS = 1\n" +"MARIO_ANIM_BACKWARD_AIR_KB = 2\n" +"MARIO_ANIM_DYING_ON_BACK = 3\n" +"MARIO_ANIM_BACKFLIP = 4\n" +"MARIO_ANIM_CLIMB_UP_POLE = 5\n" +"MARIO_ANIM_GRAB_POLE_SHORT = 6\n" +"MARIO_ANIM_GRAB_POLE_SWING_PART1 = 7\n" +"MARIO_ANIM_GRAB_POLE_SWING_PART2 = 8\n" +"MARIO_ANIM_HANDSTAND_IDLE = 9\n" +"MARIO_ANIM_HANDSTAND_JUMP = 10\n" +"MARIO_ANIM_START_HANDSTAND = 11\n" +"MARIO_ANIM_RETURN_FROM_HANDSTAND = 12\n" +"MARIO_ANIM_IDLE_ON_POLE = 13\n" +"MARIO_ANIM_A_POSE = 14\n" +"MARIO_ANIM_SKID_ON_GROUND = 15\n" +"MARIO_ANIM_STOP_SKID = 16\n" +"MARIO_ANIM_CROUCH_FROM_FAST_LONGJUMP = 17\n" +"MARIO_ANIM_CROUCH_FROM_SLOW_LONGJUMP = 18\n" +"MARIO_ANIM_FAST_LONGJUMP = 19\n" +"MARIO_ANIM_SLOW_LONGJUMP = 20\n" +"MARIO_ANIM_AIRBORNE_ON_STOMACH = 21\n" +"MARIO_ANIM_WALK_WITH_LIGHT_OBJ = 22\n" +"MARIO_ANIM_RUN_WITH_LIGHT_OBJ = 23\n" +"MARIO_ANIM_SLOW_WALK_WITH_LIGHT_OBJ = 24\n" +"MARIO_ANIM_SHIVERING_WARMING_HAND = 25\n" +"MARIO_ANIM_SHIVERING_RETURN_TO_IDLE = 26\n" +"MARIO_ANIM_SHIVERING = 27\n" +"MARIO_ANIM_CLIMB_DOWN_LEDGE = 28\n" +"MARIO_ANIM_CREDITS_WAVING = 29\n" +"MARIO_ANIM_CREDITS_LOOK_UP = 30\n" +"MARIO_ANIM_CREDITS_RETURN_FROM_LOOK_UP = 31\n" +"MARIO_ANIM_CREDITS_RAISE_HAND = 32\n" +"MARIO_ANIM_CREDITS_LOWER_HAND = 33\n" +"MARIO_ANIM_CREDITS_TAKE_OFF_CAP = 34\n" +"MARIO_ANIM_CREDITS_START_WALK_LOOK_UP = 35\n" +"MARIO_ANIM_CREDITS_LOOK_BACK_THEN_RUN = 36\n" +"MARIO_ANIM_FINAL_BOWSER_RAISE_HAND_SPIN = 37\n" +"MARIO_ANIM_FINAL_BOWSER_WING_CAP_TAKE_OFF = 38\n" +"MARIO_ANIM_CREDITS_PEACE_SIGN = 39\n" +"MARIO_ANIM_STAND_UP_FROM_LAVA_BOOST = 40\n" +"MARIO_ANIM_FIRE_LAVA_BURN = 41\n" +"MARIO_ANIM_WING_CAP_FLY = 42\n" +"MARIO_ANIM_HANG_ON_OWL = 43\n" +"MARIO_ANIM_LAND_ON_STOMACH = 44\n" +"MARIO_ANIM_AIR_FORWARD_KB = 45\n" +"MARIO_ANIM_DYING_ON_STOMACH = 46\n" +"MARIO_ANIM_SUFFOCATING = 47\n" +"MARIO_ANIM_COUGHING = 48\n" +"MARIO_ANIM_THROW_CATCH_KEY = 49\n" +"MARIO_ANIM_DYING_FALL_OVER = 50\n" +"MARIO_ANIM_IDLE_ON_LEDGE = 51\n" +"MARIO_ANIM_FAST_LEDGE_GRAB = 52\n" +"MARIO_ANIM_HANG_ON_CEILING = 53\n" +"MARIO_ANIM_PUT_CAP_ON = 54\n" +"MARIO_ANIM_TAKE_CAP_OFF_THEN_ON = 55\n" +"MARIO_ANIM_QUICKLY_PUT_CAP_ON = 56\n" +"MARIO_ANIM_HEAD_STUCK_IN_GROUND = 57\n" +"MARIO_ANIM_GROUND_POUND_LANDING = 58\n" +"MARIO_ANIM_TRIPLE_JUMP_GROUND_POUND = 59\n" +"MARIO_ANIM_START_GROUND_POUND = 60\n" +"MARIO_ANIM_GROUND_POUND = 61\n" +"MARIO_ANIM_BOTTOM_STUCK_IN_GROUND = 62\n" +"MARIO_ANIM_IDLE_WITH_LIGHT_OBJ = 63\n" +"MARIO_ANIM_JUMP_LAND_WITH_LIGHT_OBJ = 64\n" +"MARIO_ANIM_JUMP_WITH_LIGHT_OBJ = 65\n" +"MARIO_ANIM_FALL_LAND_WITH_LIGHT_OBJ = 66\n" +"MARIO_ANIM_FALL_WITH_LIGHT_OBJ = 67\n" +"MARIO_ANIM_FALL_FROM_SLIDING_WITH_LIGHT_OBJ = 68\n" +"MARIO_ANIM_SLIDING_ON_BOTTOM_WITH_LIGHT_OBJ = 69\n" +"MARIO_ANIM_STAND_UP_FROM_SLIDING_WITH_LIGHT_OBJ = 70\n" +"MARIO_ANIM_RIDING_SHELL = 71\n" +"MARIO_ANIM_WALKING = 72\n" +"MARIO_ANIM_FORWARD_FLIP = 73\n" +"MARIO_ANIM_JUMP_RIDING_SHELL = 74\n" +"MARIO_ANIM_LAND_FROM_DOUBLE_JUMP = 75\n" +"MARIO_ANIM_DOUBLE_JUMP_FALL = 76\n" +"MARIO_ANIM_SINGLE_JUMP = 77\n" +"MARIO_ANIM_LAND_FROM_SINGLE_JUMP = 78\n" +"MARIO_ANIM_AIR_KICK = 79\n" +"MARIO_ANIM_DOUBLE_JUMP_RISE = 80\n" +"MARIO_ANIM_START_FORWARD_SPINNING = 81\n" +"MARIO_ANIM_THROW_LIGHT_OBJECT = 82\n" +"MARIO_ANIM_FALL_FROM_SLIDE_KICK = 83\n" +"MARIO_ANIM_BEND_KNESS_RIDING_SHELL = 84\n" +"MARIO_ANIM_LEGS_STUCK_IN_GROUND = 85\n" +"MARIO_ANIM_GENERAL_FALL = 86\n" +"MARIO_ANIM_GENERAL_LAND = 87\n" +"MARIO_ANIM_BEING_GRABBED = 88\n" +"MARIO_ANIM_GRAB_HEAVY_OBJECT = 89\n" +"MARIO_ANIM_SLOW_LAND_FROM_DIVE = 90\n" +"MARIO_ANIM_FLY_FROM_CANNON = 91\n" +"MARIO_ANIM_MOVE_ON_WIRE_NET_RIGHT = 92\n" +"MARIO_ANIM_MOVE_ON_WIRE_NET_LEFT = 93\n" +"MARIO_ANIM_MISSING_CAP = 94\n" +"MARIO_ANIM_PULL_DOOR_WALK_IN = 95\n" +"MARIO_ANIM_PUSH_DOOR_WALK_IN = 96\n" +"MARIO_ANIM_UNLOCK_DOOR = 97\n" +"MARIO_ANIM_START_REACH_POCKET = 98\n" +"MARIO_ANIM_REACH_POCKET = 99\n" +"MARIO_ANIM_STOP_REACH_POCKET = 100\n" +"MARIO_ANIM_GROUND_THROW = 101\n" +"MARIO_ANIM_GROUND_KICK = 102\n" +"MARIO_ANIM_FIRST_PUNCH = 103\n" +"MARIO_ANIM_SECOND_PUNCH = 104\n" +"MARIO_ANIM_FIRST_PUNCH_FAST = 105\n" +"MARIO_ANIM_SECOND_PUNCH_FAST = 106\n" +"MARIO_ANIM_PICK_UP_LIGHT_OBJ = 107\n" +"MARIO_ANIM_PUSHING = 108\n" +"MARIO_ANIM_START_RIDING_SHELL = 109\n" +"MARIO_ANIM_PLACE_LIGHT_OBJ = 110\n" +"MARIO_ANIM_FORWARD_SPINNING = 111\n" +"MARIO_ANIM_BACKWARD_SPINNING = 112\n" +"MARIO_ANIM_BREAKDANCE = 113\n" +"MARIO_ANIM_RUNNING = 114\n" +"MARIO_ANIM_RUNNING_UNUSED = 115\n" +"MARIO_ANIM_SOFT_BACK_KB = 116\n" +"MARIO_ANIM_SOFT_FRONT_KB = 117\n" +"MARIO_ANIM_DYING_IN_QUICKSAND = 118\n" +"MARIO_ANIM_IDLE_IN_QUICKSAND = 119\n" +"MARIO_ANIM_MOVE_IN_QUICKSAND = 120\n" +"MARIO_ANIM_ELECTROCUTION = 121\n" +"MARIO_ANIM_SHOCKED = 122\n" +"MARIO_ANIM_BACKWARD_KB = 123\n" +"MARIO_ANIM_FORWARD_KB = 124\n" +"MARIO_ANIM_IDLE_HEAVY_OBJ = 125\n" +"MARIO_ANIM_STAND_AGAINST_WALL = 126\n" +"MARIO_ANIM_SIDESTEP_LEFT = 127\n" +"MARIO_ANIM_SIDESTEP_RIGHT = 128\n" +"MARIO_ANIM_START_SLEEP_IDLE = 129\n" +"MARIO_ANIM_START_SLEEP_SCRATCH = 130\n" +"MARIO_ANIM_START_SLEEP_YAWN = 131\n" +"MARIO_ANIM_START_SLEEP_SITTING = 132\n" +"MARIO_ANIM_SLEEP_IDLE = 133\n" +"MARIO_ANIM_SLEEP_START_LYING = 134\n" +"MARIO_ANIM_SLEEP_LYING = 135\n" +"MARIO_ANIM_DIVE = 136\n" +"MARIO_ANIM_SLIDE_DIVE = 137\n" +"MARIO_ANIM_GROUND_BONK = 138\n" +"MARIO_ANIM_STOP_SLIDE_LIGHT_OBJ = 139\n" +"MARIO_ANIM_SLIDE_KICK = 140\n" +"MARIO_ANIM_CROUCH_FROM_SLIDE_KICK = 141\n" +"MARIO_ANIM_SLIDE_MOTIONLESS = 142\n" +"MARIO_ANIM_STOP_SLIDE = 143\n" +"MARIO_ANIM_FALL_FROM_SLIDE = 144\n" +"MARIO_ANIM_SLIDE = 145\n" +"MARIO_ANIM_TIPTOE = 146\n" +"MARIO_ANIM_TWIRL_LAND = 147\n" +"MARIO_ANIM_TWIRL = 148\n" +"MARIO_ANIM_START_TWIRL = 149\n" +"MARIO_ANIM_STOP_CROUCHING = 150\n" +"MARIO_ANIM_START_CROUCHING = 151\n" +"MARIO_ANIM_CROUCHING = 152\n" +"MARIO_ANIM_CRAWLING = 153\n" +"MARIO_ANIM_STOP_CRAWLING = 154\n" +"MARIO_ANIM_START_CRAWLING = 155\n" +"MARIO_ANIM_SUMMON_STAR = 156\n" +"MARIO_ANIM_RETURN_STAR_APPROACH_DOOR = 157\n" +"MARIO_ANIM_BACKWARDS_WATER_KB = 158\n" +"MARIO_ANIM_SWIM_WITH_OBJ_PART1 = 159\n" +"MARIO_ANIM_SWIM_WITH_OBJ_PART2 = 160\n" +"MARIO_ANIM_FLUTTERKICK_WITH_OBJ = 161\n" +"MARIO_ANIM_WATER_ACTION_END_WITH_OBJ = 162\n" +"MARIO_ANIM_STOP_GRAB_OBJ_WATER = 163\n" +"MARIO_ANIM_WATER_IDLE_WITH_OBJ = 164\n" +"MARIO_ANIM_DROWNING_PART1 = 165\n" +"MARIO_ANIM_DROWNING_PART2 = 166\n" +"MARIO_ANIM_WATER_DYING = 167\n" +"MARIO_ANIM_WATER_FORWARD_KB = 168\n" +"MARIO_ANIM_FALL_FROM_WATER = 169\n" +"MARIO_ANIM_SWIM_PART1 = 170\n" +"MARIO_ANIM_SWIM_PART2 = 171\n" +"MARIO_ANIM_FLUTTERKICK = 172\n" +"MARIO_ANIM_WATER_ACTION_END = 173\n" +"MARIO_ANIM_WATER_PICK_UP_OBJ = 174\n" +"MARIO_ANIM_WATER_GRAB_OBJ_PART2 = 175\n" +"MARIO_ANIM_WATER_GRAB_OBJ_PART1 = 176\n" +"MARIO_ANIM_WATER_THROW_OBJ = 177\n" +"MARIO_ANIM_WATER_IDLE = 178\n" +"MARIO_ANIM_WATER_STAR_DANCE = 179\n" +"MARIO_ANIM_RETURN_FROM_WATER_STAR_DANCE = 180\n" +"MARIO_ANIM_GRAB_BOWSER = 181\n" +"MARIO_ANIM_SWINGING_BOWSER = 182\n" +"MARIO_ANIM_RELEASE_BOWSER = 183\n" +"MARIO_ANIM_HOLDING_BOWSER = 184\n" +"MARIO_ANIM_HEAVY_THROW = 185\n" +"MARIO_ANIM_WALK_PANTING = 186\n" +"MARIO_ANIM_WALK_WITH_HEAVY_OBJ = 187\n" +"MARIO_ANIM_TURNING_PART1 = 188\n" +"MARIO_ANIM_TURNING_PART2 = 189\n" +"MARIO_ANIM_SLIDEFLIP_LAND = 190\n" +"MARIO_ANIM_SLIDEFLIP = 191\n" +"MARIO_ANIM_TRIPLE_JUMP_LAND = 192\n" +"MARIO_ANIM_TRIPLE_JUMP = 193\n" +"MARIO_ANIM_FIRST_PERSON = 194\n" +"MARIO_ANIM_IDLE_HEAD_LEFT = 195\n" +"MARIO_ANIM_IDLE_HEAD_RIGHT = 196\n" +"MARIO_ANIM_IDLE_HEAD_CENTER = 197\n" +"MARIO_ANIM_HANDSTAND_LEFT = 198\n" +"MARIO_ANIM_HANDSTAND_RIGHT = 199\n" +"MARIO_ANIM_WAKE_FROM_SLEEP = 200\n" +"MARIO_ANIM_WAKE_FROM_LYING = 201\n" +"MARIO_ANIM_START_TIPTOE = 202\n" +"MARIO_ANIM_SLIDEJUMP = 203\n" +"MARIO_ANIM_START_WALLKICK = 204\n" +"MARIO_ANIM_STAR_DANCE = 205\n" +"MARIO_ANIM_RETURN_FROM_STAR_DANCE = 206\n" +"MARIO_ANIM_FORWARD_SPINNING_FLIP = 207\n" +"MARIO_ANIM_TRIPLE_JUMP_FLY = 208\n" +"SHAKE_ATTACK = 1\n" +"SHAKE_GROUND_POUND = 2\n" +"SHAKE_SMALL_DAMAGE = 3\n" +"SHAKE_MED_DAMAGE = 4\n" +"SHAKE_LARGE_DAMAGE = 5\n" +"SHAKE_HIT_FROM_BELOW = 8\n" +"SHAKE_FALL_DAMAGE = 9\n" +"SHAKE_SHOCK = 10\n" +; \ No newline at end of file diff --git a/src/pc/lua/smlua_hooks.c b/src/pc/lua/smlua_hooks.c index fffe4074d..ba7a54551 100644 --- a/src/pc/lua/smlua_hooks.c +++ b/src/pc/lua/smlua_hooks.c @@ -10,6 +10,7 @@ struct LuaHookedEvent { static struct LuaHookedEvent sHookedEvents[HOOK_MAX] = { 0 }; int smlua_hook_event(lua_State* L) { + if (L == NULL) { return 0; } u16 hookType = lua_tointeger(L, -2); if (hookType >= HOOK_MAX) { LOG_LUA("LUA: Hook Type: %d exceeds max!", hookType); @@ -29,6 +30,7 @@ int smlua_hook_event(lua_State* L) { void smlua_call_event_hooks(enum LuaHookedEventType hookType) { lua_State* L = gLuaState; + if (L == NULL) { return; } struct LuaHookedEvent* hook = &sHookedEvents[hookType]; for (int i = 0; i < hook->count; i++) { // push the callback onto the stack @@ -44,6 +46,7 @@ void smlua_call_event_hooks(enum LuaHookedEventType hookType) { void smlua_call_event_hooks_mario_param(enum LuaHookedEventType hookType, struct MarioState* m) { lua_State* L = gLuaState; + if (L == NULL) { return; } struct LuaHookedEvent* hook = &sHookedEvents[hookType]; for (int i = 0; i < hook->count; i++) { // push the callback onto the stack @@ -78,6 +81,7 @@ static struct LuaHookedMarioAction sHookedMarioActions[MAX_HOOKED_ACTIONS] = { 0 static int sHookedMarioActionsCount = 0; int smlua_hook_mario_action(lua_State* L) { + if (L == NULL) { return 0; } if (sHookedMarioActionsCount >= MAX_HOOKED_ACTIONS) { LOG_LUA("LUA: Hooked mario actions exceeded maximum references!"); return 0; @@ -93,6 +97,7 @@ int smlua_hook_mario_action(lua_State* L) { bool smlua_call_action_hook(struct MarioState* m, s32* returnValue) { lua_State* L = gLuaState; + if (L == NULL) { return false; } for (int i = 0; i < sHookedMarioActionsCount; i++) { if (sHookedMarioActions[i].action == m->action) { // push the callback onto the stack diff --git a/src/pc/mod_list.c b/src/pc/mod_list.c new file mode 100644 index 000000000..342f6981b --- /dev/null +++ b/src/pc/mod_list.c @@ -0,0 +1,130 @@ +#include +#include +#include "mod_list.h" +#include "pc/fs/fs.h" +#include "pc/debuglog.h" + +#define MAX_SESSION_CHARS 7 + +struct ModListEntry* gModEntries = NULL; +u16 sModEntryCount = 0; +static char sTmpSession[MAX_SESSION_CHARS] = { 0 }; +static char sTmpPath[PATH_MAX] = { 0 }; + +static bool acceptable_file(char* string) { + string = strrchr(string, '.'); + return (string != NULL && !strcmp(string, ".lua")); +} + +void mod_list_alloc(u16 count) { + mod_list_clear(); + sModEntryCount = count; + gModEntries = (struct ModListEntry*)calloc(sModEntryCount, sizeof(struct ModListEntry)); +} + +void mod_list_add(u16 index, char* name, size_t size, bool tmpFile) { + if (!acceptable_file(name)) { return; } + struct ModListEntry* entry = &gModEntries[index]; + entry->name = name; + entry->size = size; + + if (tmpFile) { + snprintf(entry->path, PATH_MAX - 1, "%s/%s-%s", sTmpPath, sTmpSession, name); + } else { + snprintf(entry->path, PATH_MAX - 1, "%s/%s", MOD_PATH, name); + } + + entry->fp = fopen(entry->path, tmpFile ? "wb" : "rb"); + + if (!tmpFile) { + fseek(entry->fp, 0, SEEK_END); + entry->size = ftell(entry->fp); + fseek(entry->fp, 0, SEEK_SET); + } + + entry->complete = !tmpFile; +} + +void mod_list_load(void) { + struct dirent* dir; + DIR* d = opendir(MOD_PATH); + if (!d) { closedir(d); return; } + + u16 count = 0; + while ((dir = readdir(d)) != NULL) { + if (!acceptable_file(dir->d_name)) { continue; } + count++; + } + + mod_list_alloc(count); + + rewinddir(d); + u16 index = 0; + + LOG_INFO("Loading mods:"); + while ((dir = readdir(d)) != NULL) { + if (!acceptable_file(dir->d_name)) { continue; } + LOG_INFO(" %s", dir->d_name); + mod_list_add(index++, strdup(dir->d_name), 0, false); + } + + closedir(d); +} + +void mod_list_clear(void) { + for (int i = 0; i < sModEntryCount; i++) { + struct ModListEntry* entry = &gModEntries[i]; + if (entry->name != NULL) { + free(entry->name); + entry->name = NULL; + } + if (entry->fp != NULL) { + fclose(entry->fp); + entry->fp = NULL; + } + entry->size = 0; + } + if (gModEntries != NULL) { + free(gModEntries); + gModEntries = NULL; + } + sModEntryCount = 0; +} + +static void mod_list_delete_tmp(void) { + struct dirent* dir; + DIR* d = opendir(sTmpPath); + if (!d) { closedir(d); return; } + + static char path[PATH_MAX] = { 0 }; + while ((dir = readdir(d)) != NULL) { + if (!acceptable_file(dir->d_name)) { continue; } + snprintf(path, PATH_MAX - 1, "%s/%s", sTmpPath, dir->d_name); + if (!fs_sys_file_exists(path)) { continue; } + +#if defined(_WIN32) + // replace slashes + char* p = path; + while (*p) { + if (*p == '/') { *p = '\\'; } + p++; + } +#endif + if (unlink(path) == -1) { + LOG_ERROR("Failed to remove tmp file '%s'", path); + } + } + + closedir(d); +} + +void mod_list_init(void) { + snprintf(sTmpSession, MAX_SESSION_CHARS, "%06X", (u32)(rand() % 0xFFFFFF)); + snprintf(sTmpPath, PATH_MAX - 1, "%s", fs_get_write_path("tmp")); + if (!fs_sys_dir_exists(sTmpPath)) { fs_sys_mkdir(sTmpPath); } +} + +void mod_list_shutdown(void) { + mod_list_clear(); + mod_list_delete_tmp(); +} \ No newline at end of file diff --git a/src/pc/mod_list.h b/src/pc/mod_list.h new file mode 100644 index 000000000..85021ccb9 --- /dev/null +++ b/src/pc/mod_list.h @@ -0,0 +1,32 @@ +#ifndef MOD_LIST_H +#define MOD_LIST_H + +#include +#include "PR/ultratypes.h" +#include +#include + +#define MOD_PATH "./mods" + +struct ModListEntry { + char* name; + FILE* fp; + char path[PATH_MAX]; + size_t size; + u64 curOffset; + bool tmp; + bool complete; +}; +extern struct ModListEntry* gModEntries; +extern u16 sModEntryCount; + +void mod_list_alloc(u16 count); +void mod_list_add(u16 index, char* name, size_t size, bool tmpFile); + +void mod_list_load(void); +void mod_list_clear(void); + +void mod_list_init(void); +void mod_list_shutdown(void); + +#endif \ No newline at end of file diff --git a/src/pc/network/network.c b/src/pc/network/network.c index b384ceda7..b18561b1f 100644 --- a/src/pc/network/network.c +++ b/src/pc/network/network.c @@ -12,6 +12,8 @@ #include "pc/cheats.h" #include "pc/djui/djui.h" #include "pc/utils/misc.h" +#include "pc/lua/smlua.h" +#include "pc/mod_list.h" #include "pc/debuglog.h" // Mario 64 specific externs @@ -89,6 +91,9 @@ bool network_init(enum NetworkType inNetworkType) { gNetworkType = inNetworkType; if (gNetworkType == NT_SERVER) { + mod_list_load(); + smlua_init(); + network_player_connected(NPT_LOCAL, 0, configPlayerModel, configPlayerPalette, configPlayerName); extern u8* gOverrideEeprom; gOverrideEeprom = NULL; @@ -125,17 +130,25 @@ void network_on_loaded_area(void) { } } +bool network_allow_unknown_local_index(enum PacketType packetType) { + return (packetType == PACKET_JOIN_REQUEST) + || (packetType == PACKET_KICK) + || (packetType == PACKET_ACK) + || (packetType == PACKET_MOD_LIST_REQUEST) + || (packetType == PACKET_MOD_LIST) + || (packetType == PACKET_DOWNLOAD_REQUEST) + || (packetType == PACKET_DOWNLOAD); +} + void network_send_to(u8 localIndex, struct Packet* p) { // sanity checks if (gNetworkType == NT_NONE) { LOG_ERROR("network type error none!"); return; } if (p->error) { LOG_ERROR("packet error!"); return; } if (gNetworkSystem == NULL) { LOG_ERROR("no network system attached"); return; } - if (localIndex == 0) { - if (p->buffer[0] != PACKET_JOIN_REQUEST && p->buffer[0] != PACKET_KICK && p->buffer[0] != PACKET_ACK) { - LOG_ERROR("\n####################\nsending to myself, packetType: %d\n####################\n", p->packetType); - SOFT_ASSERT(false); - return; - } + if (localIndex == 0 && !network_allow_unknown_local_index(p->buffer[0])) { + LOG_ERROR("\n####################\nsending to myself, packetType: %d\n####################\n", p->packetType); + SOFT_ASSERT(false); + return; } if (gNetworkType == NT_SERVER) { diff --git a/src/pc/network/network.h b/src/pc/network/network.h index d669dce52..1edab1125 100644 --- a/src/pc/network/network.h +++ b/src/pc/network/network.h @@ -108,6 +108,7 @@ void network_set_system(enum NetworkSystemType nsType); bool network_init(enum NetworkType inNetworkType); void network_on_init_area(void); void network_on_loaded_area(void); +bool network_allow_unknown_local_index(enum PacketType packetType); void network_send_to(u8 localIndex, struct Packet* p); void network_send(struct Packet* p); void network_receive(u8 localIndex, u8* data, u16 dataLength); diff --git a/src/pc/network/packets/packet.c b/src/pc/network/packets/packet.c index b15edbe80..b06141f78 100644 --- a/src/pc/network/packets/packet.c +++ b/src/pc/network/packets/packet.c @@ -76,7 +76,12 @@ void packet_process(struct Packet* p) { case PACKET_LEVEL_AREA_INFORM: network_receive_level_area_inform(p); break; case PACKET_LEVEL_RESPAWN_INFO: network_receive_level_respawn_info(p); break; - case PACKET_PLAYER_SETTINGS: network_receive_player_settings(p); break; + case PACKET_PLAYER_SETTINGS: network_receive_player_settings(p); break; + + case PACKET_MOD_LIST_REQUEST: network_receive_mod_list_request(p); break; + case PACKET_MOD_LIST: network_receive_mod_list(p); break; + case PACKET_DOWNLOAD_REQUEST: network_receive_download_request(p); break; + case PACKET_DOWNLOAD: network_receive_download(p); break; // custom case PACKET_CUSTOM: network_receive_custom(p); break; @@ -91,7 +96,7 @@ void packet_receive(struct Packet* p) { network_send_ack(p); // refuse packets from unknown players other than join request - if (gNetworkType == NT_SERVER && p->localIndex == UNKNOWN_LOCAL_INDEX && packetType != PACKET_JOIN_REQUEST && packetType != PACKET_ACK) { + if (gNetworkType == NT_SERVER && p->localIndex == UNKNOWN_LOCAL_INDEX && !network_allow_unknown_local_index(packetType)) { if (packetType != PACKET_PLAYER) { LOG_INFO("closing connection for packetType: %d", packetType); network_send_kick(EKT_CLOSE_CONNECTION); diff --git a/src/pc/network/packets/packet.h b/src/pc/network/packets/packet.h index 2d6119366..26b0d9da0 100644 --- a/src/pc/network/packets/packet.h +++ b/src/pc/network/packets/packet.h @@ -54,6 +54,11 @@ enum PacketType { PACKET_PLAYER_SETTINGS, + PACKET_MOD_LIST_REQUEST, + PACKET_MOD_LIST, + PACKET_DOWNLOAD_REQUEST, + PACKET_DOWNLOAD, + /// PACKET_CUSTOM = 255, }; @@ -281,4 +286,17 @@ void network_receive_debug_sync(struct Packet* p); void network_send_player_settings(void); void network_receive_player_settings(struct Packet* p); +// packet_mod_list.c +void network_send_mod_list_request(void); +void network_receive_mod_list_request(struct Packet* p); +void network_send_mod_list(void); +void network_receive_mod_list(struct Packet* p); + +// packet_download.c +void network_send_download_request(u16 index, u64 offset); +void network_receive_download_request(struct Packet* p); +void network_send_download(u16 index, u64 offset); +void network_receive_download(struct Packet* p); + + #endif diff --git a/src/pc/network/packets/packet_download.c b/src/pc/network/packets/packet_download.c new file mode 100644 index 000000000..adcb7ff0e --- /dev/null +++ b/src/pc/network/packets/packet_download.c @@ -0,0 +1,145 @@ +#include +#include "../network.h" +#include "pc/mod_list.h" +#include "pc/debuglog.h" + +static void network_send_next_download_request(void) { + SOFT_ASSERT(gNetworkType == NT_CLIENT); + for (int i = 0; i < sModEntryCount; i++) { + struct ModListEntry* entry = &gModEntries[i]; + if (entry->complete) { continue; } + network_send_download_request(i, entry->curOffset); + return; + } + network_send_join_request(); +} + +void network_send_download_request(u16 index, u64 offset) { + SOFT_ASSERT(gNetworkType == NT_CLIENT); + + struct Packet p; + packet_init(&p, PACKET_DOWNLOAD_REQUEST, true, PLMT_NONE); + + packet_write(&p, &index, sizeof(u16)); + packet_write(&p, &offset, sizeof(u64)); + + network_send_to((gNetworkPlayerServer != NULL) ? gNetworkPlayerServer->localIndex : 0, &p); + //LOG_INFO("sending download request packet"); +} + +void network_receive_download_request(struct Packet* p) { + SOFT_ASSERT(gNetworkType == NT_SERVER); + + //LOG_INFO("received download request packet"); + + u16 index; + u64 offset; + packet_read(p, &index, sizeof(u16)); + packet_read(p, &offset, sizeof(u64)); + + network_send_download(index, offset); +} + +void network_send_download(u16 index, u64 offset) { + SOFT_ASSERT(gNetworkType == NT_SERVER); + + if (index >= sModEntryCount) { + LOG_ERROR("Requested download of invalid index %u:%llu", index, offset); + return; + } + + struct ModListEntry* entry = &gModEntries[index]; + if (offset >= entry->size) { + LOG_ERROR("Requested download of invalid offset %u:%llu", index, offset); + return; + } + + if (entry->fp == NULL) { + LOG_ERROR("Requested download of invalid file pointer %u:%llu", index, offset); + return; + } + + u16 chunkSize = 400; + if ((offset + chunkSize) > entry->size) { + chunkSize = entry->size - offset; + } + + u8 chunk[400] = { 0 }; + fseek(entry->fp, offset, SEEK_SET); + fread(chunk, chunkSize, 1, entry->fp); + + struct Packet p; + packet_init(&p, PACKET_DOWNLOAD, true, PLMT_NONE); + + packet_write(&p, &index, sizeof(u16)); + packet_write(&p, &offset, sizeof(u64)); + packet_write(&p, &chunkSize, sizeof(u16)); + packet_write(&p, chunk, chunkSize * sizeof(u8)); + + network_send_to(0, &p); + //LOG_INFO("sending download packet: %u:%llu", index, offset); +} + +void network_receive_download(struct Packet* p) { + SOFT_ASSERT(gNetworkType == NT_CLIENT); + + u16 index; + u64 offset; + u16 chunkSize; + u8 chunk[400] = { 0 }; + + packet_read(p, &index, sizeof(u16)); + packet_read(p, &offset, sizeof(u64)); + packet_read(p, &chunkSize, sizeof(u16)); + packet_read(p, chunk, chunkSize * sizeof(u8)); + + if (index >= sModEntryCount) { + LOG_ERROR("Received download of invalid index %u:%llu", index, offset); + return; + } + + struct ModListEntry* entry = &gModEntries[index]; + if (offset >= entry->size) { + LOG_ERROR("Received download of invalid offset %u:%llu", index, offset); + return; + } + + if (entry->fp == NULL) { + LOG_ERROR("Received download of invalid file pointer %u:%llu", index, offset); + return; + } + + if ((offset + chunkSize) > entry->size) { + LOG_ERROR("Received download of invalid chunk size %u:%llu:%u", index, offset, chunkSize); + return; + } + + if (entry->curOffset != offset) { + LOG_ERROR("Received download of unexpected offset %llu != %llu", entry->curOffset, offset); + return; + } + + entry->curOffset += chunkSize; + + //u64 told = ftell(entry->fp); + //if (offset == 0) { + fseek(entry->fp, offset, SEEK_SET); + //} + fwrite(chunk, sizeof(u8) * chunkSize, 1, entry->fp); + + /*u64 told2 = ftell(entry->fp); + + printf("#################################################\n"); + printf("%llu -> %llu -> %llu - %u\n", told, offset, told2, chunkSize); + printf("%s\n", chunk); + printf("#################################################\n");*/ + + if ((offset + chunkSize) == entry->size) { + LOG_INFO("Finished download of '%s'", entry->name); + fclose(entry->fp); + entry->fp = NULL; + entry->complete = true; + } + + network_send_next_download_request(); +} diff --git a/src/pc/network/packets/packet_join.c b/src/pc/network/packets/packet_join.c index deb434a4a..a84e58285 100644 --- a/src/pc/network/packets/packet_join.c +++ b/src/pc/network/packets/packet_join.c @@ -17,6 +17,7 @@ //#define DISABLE_MODULE_LOG 1 #include "pc/debuglog.h" #include "pc/utils/misc.h" +#include "pc/lua/smlua.h" extern u8* gOverrideEeprom; static u8 eeprom[512] = { 0 }; @@ -215,4 +216,6 @@ void network_receive_join(struct Packet* p) { fake_lvl_init_from_save_file(); extern s16 gChangeLevel; gChangeLevel = 16; + + smlua_init(); } diff --git a/src/pc/network/packets/packet_mod_list.c b/src/pc/network/packets/packet_mod_list.c new file mode 100644 index 000000000..d4892daf9 --- /dev/null +++ b/src/pc/network/packets/packet_mod_list.c @@ -0,0 +1,86 @@ +#include +#include "../network.h" +#include "pc/mod_list.h" +#include "pc/debuglog.h" + +void network_send_mod_list_request(void) { + SOFT_ASSERT(gNetworkType == NT_CLIENT); + + struct Packet p; + packet_init(&p, PACKET_MOD_LIST_REQUEST, true, PLMT_NONE); + + char version[MAX_VERSION_LENGTH] = { 0 }; + snprintf(version, MAX_VERSION_LENGTH, "%s", get_version()); + packet_write(&p, &version, sizeof(u8) * MAX_VERSION_LENGTH); + + network_send_to((gNetworkPlayerServer != NULL) ? gNetworkPlayerServer->localIndex : 0, &p); + LOG_INFO("sending mod list request"); +} + +void network_receive_mod_list_request(struct Packet* p) { + SOFT_ASSERT(gNetworkType == NT_SERVER); + LOG_INFO("received mod list request"); + + char version[MAX_VERSION_LENGTH] = { 0 }; + snprintf(version, MAX_VERSION_LENGTH, "%s", get_version()); + + char remoteVersion[MAX_VERSION_LENGTH] = { 0 }; + packet_read(p, &remoteVersion, sizeof(u8) * MAX_VERSION_LENGTH); + LOG_INFO("client has version: %s", remoteVersion); + + if (memcmp(version, remoteVersion, MAX_VERSION_LENGTH) != 0) { + LOG_INFO("client version mismatch: %s != %s", remoteVersion, version); + // TODO: send version mismatch packet + return; + } + + network_send_mod_list(); +} + +void network_send_mod_list(void) { + SOFT_ASSERT(gNetworkType == NT_SERVER); + + struct Packet p; + packet_init(&p, PACKET_MOD_LIST, true, PLMT_NONE); + + packet_write(&p, &sModEntryCount, sizeof(u16)); + LOG_INFO("sent mod list (%u):", sModEntryCount); + for (int i = 0; i < sModEntryCount; i++) { + struct ModListEntry* entry = &gModEntries[i]; + u16 nameLength = strlen(entry->name); + packet_write(&p, &nameLength, sizeof(u16)); + packet_write(&p, entry->name, sizeof(u8) * nameLength); + packet_write(&p, &entry->size, sizeof(u16)); + LOG_INFO(" '%s': %u", entry->name, (u16)entry->size); + } + network_send_to(0, &p); +} + +void network_receive_mod_list(struct Packet* p) { + SOFT_ASSERT(gNetworkType == NT_CLIENT); + + u16 modEntryCount = 0; + packet_read(p, &modEntryCount, sizeof(u16)); + mod_list_alloc(modEntryCount); + + LOG_INFO("received mod list (%u):", modEntryCount); + for (int i = 0; i < modEntryCount; i++) { + u16 nameLength = 0; + packet_read(p, &nameLength, sizeof(u16)); + + char* name = (char*)calloc(nameLength + 1, sizeof(u8)); + packet_read(p, name, nameLength * sizeof(u8)); + + u16 size = 0; + packet_read(p, &size, sizeof(u16)); + + mod_list_add(i, name, size, true); + LOG_INFO(" '%s': %u", name, size); + } + + if (modEntryCount <= 0) { + network_send_join_request(); + } else { + network_send_download_request(0, 0); + } +} diff --git a/src/pc/network/socket/socket.c b/src/pc/network/socket/socket.c index 885f4611c..16dfc4f35 100644 --- a/src/pc/network/socket/socket.c +++ b/src/pc/network/socket/socket.c @@ -94,7 +94,7 @@ static bool ns_socket_initialize(enum NetworkType networkType) { LOG_INFO("initialized"); if (networkType == NT_CLIENT) { - network_send_join_request(); + network_send_mod_list_request(); } // success diff --git a/src/pc/pc_main.c b/src/pc/pc_main.c index 6f0c3613a..9c6bd2d01 100644 --- a/src/pc/pc_main.c +++ b/src/pc/pc_main.c @@ -49,6 +49,8 @@ #include "pc/network/network_player.h" #include "pc/djui/djui.h" +#include "pc/mod_list.h" + OSMesg D_80339BEC; OSMesgQueue gSIEventMesgQueue; @@ -169,6 +171,7 @@ void game_deinit(void) { gfx_shutdown(); network_shutdown(true); smlua_shutdown(); + mod_list_shutdown(); inited = false; } @@ -301,10 +304,10 @@ void main_func(void) { } else { network_init(NT_NONE); } - smlua_init(); audio_init(); sound_init(); + mod_list_init(); network_player_init(); thread5_game_loop(NULL);