diff --git a/actors/bobomb/model.inc.c b/actors/bobomb/model.inc.c index 31af0eefe..0b7f291e0 100644 --- a/actors/bobomb/model.inc.c +++ b/actors/bobomb/model.inc.c @@ -279,6 +279,9 @@ static const Vtx bobomb_seg8_vertex_08023190[] = { // 0x08023270 - 0x08023378 const Gfx bobomb_seg8_dl_08023270[] = { + gsDPPipeSync(), + gsDPSetCombineMode(G_CC_SHADE, G_CC_SHADE), + gsSPSetGeometryMode(G_LIGHTING), gsSPLight(&bobomb_seg8_lights_08022DE8.l, 1), gsSPLight(&bobomb_seg8_lights_08022DE8.a, 2), gsSPVertex(bobomb_seg8_vertex_08022E30, 16, 0), @@ -302,6 +305,9 @@ const Gfx bobomb_seg8_dl_08023270[] = { // 0x08023378 - 0x08023480 const Gfx bobomb_seg8_dl_08023378[] = { + gsDPPipeSync(), + gsDPSetCombineMode(G_CC_SHADE, G_CC_SHADE), + gsSPSetGeometryMode(G_LIGHTING), gsSPLight(&bobomb_seg8_lights_08022DE8.l, 1), gsSPLight(&bobomb_seg8_lights_08022DE8.a, 2), gsSPVertex(bobomb_seg8_vertex_08022F70, 16, 0), @@ -325,6 +331,9 @@ const Gfx bobomb_seg8_dl_08023378[] = { // 0x08023480 - 0x08023528 const Gfx bobomb_seg8_dl_08023480[] = { + gsDPPipeSync(), + gsDPSetCombineMode(G_CC_SHADE, G_CC_SHADE), + gsSPSetGeometryMode(G_LIGHTING), gsSPLight(&bobomb_seg8_lights_08022E00.l, 1), gsSPLight(&bobomb_seg8_lights_08022E00.a, 2), gsSPVertex(bobomb_seg8_vertex_080230B0, 14, 0), diff --git a/autogen/convert_constants.py b/autogen/convert_constants.py index 4ab580d9e..4325b0d95 100644 --- a/autogen/convert_constants.py +++ b/autogen/convert_constants.py @@ -37,7 +37,8 @@ in_files = [ "include/dialog_ids.h", "include/seq_ids.h", "include/surface_terrains.h", - "src/game/level_update.h" + "src/game/level_update.h", + "src/pc/network/version.h" ] exclude_constants = { diff --git a/autogen/convert_structs.py b/autogen/convert_structs.py index 397c150ca..5ebf618f3 100644 --- a/autogen/convert_structs.py +++ b/autogen/convert_structs.py @@ -72,7 +72,8 @@ override_field_mutable = { } override_field_invisible = { - "Mod": [ "files" ] + "Mod": [ "files" ], + "MarioState": [ "visibleToEnemies" ], } override_field_immutable = { diff --git a/autogen/lua_definitions/constants.lua b/autogen/lua_definitions/constants.lua index 6f0eff76e..5b72079c2 100644 --- a/autogen/lua_definitions/constants.lua +++ b/autogen/lua_definitions/constants.lua @@ -11400,3 +11400,12 @@ SPTASK_STATE_FINISHED = 3 --- @type SpTaskState SPTASK_STATE_FINISHED_DP = 4 + +--- @type integer +MAX_VERSION_LENGTH = 10 + +--- @type integer +MINOR_VERSION_NUMBER = 0 + +--- @type integer +VERSION_NUMBER = 31 diff --git a/autogen/lua_definitions/functions.lua b/autogen/lua_definitions/functions.lua index c492c18ff..78bdadc5c 100644 --- a/autogen/lua_definitions/functions.lua +++ b/autogen/lua_definitions/functions.lua @@ -6795,6 +6795,11 @@ function cur_obj_set_behavior(behavior) -- ... end +--- @return nil +function cur_obj_set_billboard_if_vanilla_cam() + -- ... +end + --- @param a0 Pointer_integer --- @return integer function cur_obj_set_direction_table(a0) @@ -8558,6 +8563,17 @@ function obj_set_vel(o, vx, vy, vz) -- ... end +--- @param x number +--- @param y number +--- @param z number +--- @param strength integer +--- @param area integer +--- @param index integer +--- @return nil +function set_whirlpools(x, y, z, strength, area, index) + -- ... +end + --- @param behaviorId BehaviorId --- @param modelId ModelExtendedId --- @param x number diff --git a/autogen/lua_definitions/manual.lua b/autogen/lua_definitions/manual.lua index 7f1480a82..357081cc8 100644 --- a/autogen/lua_definitions/manual.lua +++ b/autogen/lua_definitions/manual.lua @@ -214,3 +214,10 @@ end function djui_hud_render_texture_tile_interpolated(texInfo, prevX, prevY, prevScaleW, prevScaleH, x, y, scaleW, scaleH, tileX, tileY, tileW, tileH) -- ... end + +--- @param levelNum number +--- @param func fun(areaNum:number, bhv:table) +--- @return nil +function level_script_parse(levelNum, func) + -- ... +end diff --git a/autogen/lua_definitions/structs.lua b/autogen/lua_definitions/structs.lua index df94b4ef5..4e6d34bea 100644 --- a/autogen/lua_definitions/structs.lua +++ b/autogen/lua_definitions/structs.lua @@ -188,6 +188,7 @@ --- @field public RacingPenguinBigRadius number --- @field public RacingPenguinHeight number --- @field public RacingPenguinRadius number +--- @field public RespawnShellBoxes integer --- @field public ShowStarMilestones integer --- @field public ToadStar1Requirement integer --- @field public ToadStar2Requirement integer @@ -629,6 +630,7 @@ --- @class LevelValues --- @field public cellHeightLimit integer --- @field public coinsRequiredForCoinStar integer +--- @field public disableActs boolean --- @field public entryLevel LevelNum --- @field public exitCastleArea integer --- @field public exitCastleLevel LevelNum @@ -640,14 +642,18 @@ --- @field public floorLowerLimitShadow integer --- @field public metalCapDuration integer --- @field public metalCapDurationCotmc integer +--- @field public pauseExitAnywhere boolean +--- @field public metalCapSequence integer --- @field public pssSlideStarIndex integer --- @field public pssSlideStarTime integer --- @field public skipCreditsAt LevelNum --- @field public starPositions StarPositions --- @field public vanishCapDuration integer --- @field public vanishCapDurationVcutm integer +--- @field public vanishCapSequence integer --- @field public wingCapDuration integer --- @field public wingCapDurationTotwc integer +--- @field public wingCapSequence integer --- @class LinearTransitionPoint --- @field public dist number diff --git a/data/behavior_data.c b/data/behavior_data.c index 9cea0cab3..69939380c 100644 --- a/data/behavior_data.c +++ b/data/behavior_data.c @@ -3202,16 +3202,12 @@ const BehaviorScript bhvFloorTrapInCastle[] = { const BehaviorScript bhvTree[] = { BEGIN(OBJ_LIST_POLELIKE), ID(id_bhvTree), - #ifdef BETTERCAMERA - CYLBOARD(), - #else - BILLBOARD(), - #endif OR_INT(oFlags, OBJ_FLAG_UPDATE_GFX_POS_AND_ANGLE), SET_INT(oInteractType, INTERACT_POLE), SET_HITBOX(/*Radius*/ 80, /*Height*/ 500), SET_INT(oIntangibleTimer, 0), BEGIN_LOOP(), + CALL_NATIVE(cur_obj_set_billboard_if_vanilla_cam), CALL_NATIVE(bhv_pole_base_loop), END_LOOP(), }; diff --git a/data/dynos.c.h b/data/dynos.c.h index 47f811ad5..3d047e4fd 100644 --- a/data/dynos.c.h +++ b/data/dynos.c.h @@ -57,6 +57,10 @@ void dynos_add_level(s32 modIndex, const char *filePath, const char* levelName); const char* dynos_level_get_token(u32 index); Trajectory* dynos_level_get_trajectory(const char* name); void dynos_level_load_background(void *ptr); +u64 dynos_level_cmd_get(void *cmd, u64 offset); +void dynos_level_cmd_next(void *cmd, u64 cmdsize); +void dynos_level_parse_script(const void *script, s32 (*aPreprocessFunction)(u8, void *)); +void* dynos_level_get_script(s32 level); // -- behaviors -- // void dynos_add_behavior(s32 modIndex, const char *filePath, const char *behaviorName); diff --git a/data/dynos.cpp.h b/data/dynos.cpp.h index 0b55f3607..97072fdcc 100644 --- a/data/dynos.cpp.h +++ b/data/dynos.cpp.h @@ -822,6 +822,9 @@ const u8 *DynOS_Level_GetAreaName(s32 aLevel, s32 aArea, bool aDecaps); s16 *DynOS_Level_GetWarp(s32 aLevel, s32 aArea, u8 aWarpId); s16 *DynOS_Level_GetWarpEntry(s32 aLevel, s32 aArea); s16 *DynOS_Level_GetWarpDeath(s32 aLevel, s32 aArea); +u64 DynOS_Level_CmdGet(void *aCmd, u64 aOffset); +void *DynOS_Level_CmdNext(void *aCmd, u64 aCmdSize); +void DynOS_Level_ParseScript(const void *aScript, s32 (*aPreprocessFunction)(u8, void *)); // // Warps diff --git a/data/dynos_bin_gfx.cpp b/data/dynos_bin_gfx.cpp index a3e010f8d..45bb63846 100644 --- a/data/dynos_bin_gfx.cpp +++ b/data/dynos_bin_gfx.cpp @@ -744,6 +744,11 @@ static void ParseGfxSymbol(GfxData* aGfxData, DataNode* aNode, Gfx*& aHead, gfx_symbol_1(gsDPSetAlphaCompare, false); gfx_symbol_1(gsDPSetTextureFilter, false); gfx_symbol_2(gsSPCullDisplayList, false); + gfx_symbol_1(gsDPSetAlphaDither, false); + gfx_symbol_1(gsDPSetCombineKey, false); + gfx_symbol_1(gsDPSetTextureConvert, false); + gfx_symbol_1(gsDPSetCombineKey, false); + gfx_symbol_1(gsDPSetTextureConvert, false); gfx_symbol_2(gsSPCopyLightEXT, false); gfx_symbol_1(gsSPCopyLightsPlayerPart, false); diff --git a/data/dynos_c.cpp b/data/dynos_c.cpp index bfdb2ff5e..f054cb3e3 100644 --- a/data/dynos_c.cpp +++ b/data/dynos_c.cpp @@ -179,6 +179,22 @@ void dynos_level_load_background(void *ptr) { DynOS_Lvl_LoadBackground(ptr); } +u64 dynos_level_cmd_get(void *cmd, u64 offset) { + return DynOS_Level_CmdGet(cmd, offset); +} + +void dynos_level_cmd_next(void *cmd, u64 cmdsize) { + DynOS_Level_CmdNext(cmd, cmdsize); +} + +void dynos_level_parse_script(const void *script, s32 (*aPreprocessFunction)(u8, void *)) { + DynOS_Level_ParseScript(script, aPreprocessFunction); +} + +void* dynos_level_get_script(s32 level) { + return (void *) DynOS_Level_GetScript(level); +} + // -- Behaviors -- // void dynos_add_behavior(s32 modIndex, const char *filePath, const char *behaviorName) { diff --git a/data/dynos_level.cpp b/data/dynos_level.cpp index 7998d3f77..5da78229d 100644 --- a/data/dynos_level.cpp +++ b/data/dynos_level.cpp @@ -51,17 +51,17 @@ static void *sDynosLevelScriptsOriginal[LEVEL_COUNT] = { NULL }; static Array sDynosLevelWarps[LEVEL_COUNT] = { Array() }; static Array sDynosLevelList = Array(); // Ordered by Course Id, COURSE_NONE excluded -static u64 DynOS_Level_CmdGet(void *aCmd, u64 aOffset) { +u64 DynOS_Level_CmdGet(void *aCmd, u64 aOffset) { u64 _Offset = (((aOffset) & 3llu) | (((aOffset) & ~3llu) << (sizeof(void *) >> 3llu))); return *((u64 *) (u64(aCmd) + _Offset)); } -static void *DynOS_Level_CmdNext(void *aCmd, u64 aCmdSize) { +void *DynOS_Level_CmdNext(void *aCmd, u64 aCmdSize) { u64 _Offset = (((aCmdSize) & 3llu) | (((aCmdSize) & ~3llu) << (sizeof(void *) >> 3llu))); return (void *) (u64(aCmd) + _Offset); } -static void DynOS_Level_ParseScript(const void *aScript, s32 (*aPreprocessFunction)(u8, void *)); +void DynOS_Level_ParseScript(const void *aScript, s32 (*aPreprocessFunction)(u8, void *)); // // Init @@ -752,7 +752,7 @@ static LvlCmd *DynOS_Level_CmdJumpArea(Stack &aStack, LvlCmd *aCmd, s32 (*aPrepr return (LvlCmd *) DynOS_Level_CmdNext(aCmd, aCmd->mSize); } -static void DynOS_Level_ParseScript(const void *aScript, s32 (*aPreprocessFunction)(u8, void *)) { +void DynOS_Level_ParseScript(const void *aScript, s32 (*aPreprocessFunction)(u8, void *)) { Stack _Stack; _Stack.mBaseIndex = -1; _Stack.mTopIndex = 0; diff --git a/docs/lua/constants.md b/docs/lua/constants.md index f4e9892e0..a61e5e534 100644 --- a/docs/lua/constants.md +++ b/docs/lua/constants.md @@ -59,6 +59,7 @@ - [types.h](#typesh) - [enum AreaTimerType](#enum-AreaTimerType) - [enum SpTaskState](#enum-SpTaskState) +- [version.h](#versionh)
@@ -4021,3 +4022,12 @@
+## [version.h](#version.h) +- MAX_VERSION_LENGTH +- MINOR_VERSION_NUMBER +- VERSION_NUMBER + +[:arrow_up_small:](#) + +
+ diff --git a/docs/lua/functions-4.md b/docs/lua/functions-4.md index 6a0225d69..148ed34fd 100644 --- a/docs/lua/functions-4.md +++ b/docs/lua/functions-4.md @@ -3726,6 +3726,24 @@
+## [cur_obj_set_billboard_if_vanilla_cam](#cur_obj_set_billboard_if_vanilla_cam) + +### Lua Example +`cur_obj_set_billboard_if_vanilla_cam()` + +### Parameters +- None + +### Returns +- None + +### C Prototype +`void cur_obj_set_billboard_if_vanilla_cam(void);` + +[:arrow_up_small:](#) + +
+ ## [cur_obj_set_direction_table](#cur_obj_set_direction_table) ### Lua Example diff --git a/docs/lua/functions-5.md b/docs/lua/functions-5.md index fee0a0e5b..f18e56eac 100644 --- a/docs/lua/functions-5.md +++ b/docs/lua/functions-5.md @@ -614,6 +614,31 @@
+## [set_whirlpools](#set_whirlpools) + +### Lua Example +`set_whirlpools(x, y, z, strength, area, index)` + +### Parameters +| Field | Type | +| ----- | ---- | +| x | `number` | +| y | `number` | +| z | `number` | +| strength | `integer` | +| area | `integer` | +| index | `integer` | + +### Returns +- None + +### C Prototype +`void set_whirlpools(f32 x, f32 y, f32 z, s16 strength, s16 area, s32 index);` + +[:arrow_up_small:](#) + +
+ ## [spawn_non_sync_object](#spawn_non_sync_object) ### Lua Example diff --git a/docs/lua/functions.md b/docs/lua/functions.md index 0f2f5458c..c12df4ef6 100644 --- a/docs/lua/functions.md +++ b/docs/lua/functions.md @@ -1273,6 +1273,7 @@ - [cur_obj_scale](functions-4.md#cur_obj_scale) - [cur_obj_scale_over_time](functions-4.md#cur_obj_scale_over_time) - [cur_obj_set_behavior](functions-4.md#cur_obj_set_behavior) + - [cur_obj_set_billboard_if_vanilla_cam](functions-4.md#cur_obj_set_billboard_if_vanilla_cam) - [cur_obj_set_direction_table](functions-4.md#cur_obj_set_direction_table) - [cur_obj_set_face_angle_to_move_angle](functions-4.md#cur_obj_set_face_angle_to_move_angle) - [cur_obj_set_hitbox_and_die_if_attacked](functions-4.md#cur_obj_set_hitbox_and_die_if_attacked) @@ -1579,6 +1580,7 @@ - [obj_move_xyz](functions-5.md#obj_move_xyz) - [obj_set_model_extended](functions-5.md#obj_set_model_extended) - [obj_set_vel](functions-5.md#obj_set_vel) + - [set_whirlpools](functions-5.md#set_whirlpools) - [spawn_non_sync_object](functions-5.md#spawn_non_sync_object) - [spawn_sync_object](functions-5.md#spawn_sync_object) diff --git a/docs/lua/guides/object-lists.md b/docs/lua/guides/object-lists.md new file mode 100644 index 000000000..a17c500b5 --- /dev/null +++ b/docs/lua/guides/object-lists.md @@ -0,0 +1,522 @@ +# Every Behavior's Object List + +| Behavior | Object List | +| -------- | ----------- | +|`bhvStarDoor`|`OBJ_LIST_SURFACE`| +|`bhvMrI`|`OBJ_LIST_GENACTOR`| +|`bhvMrIBody`|`OBJ_LIST_DEFAULT`| +|`bhvMrIParticle`|`OBJ_LIST_LEVEL`| +|`bhvPurpleParticle`|`OBJ_LIST_UNIMPORTANT`| +|`bhvGiantPole`|`OBJ_LIST_POLELIKE`| +|`bhvPoleGrabbing`|`OBJ_LIST_POLELIKE`| +|`bhvThiHugeIslandTop`|`OBJ_LIST_SURFACE`| +|`bhvThiTinyIslandTop`|`OBJ_LIST_DEFAULT`| +|`bhvCapSwitchBase`|`OBJ_LIST_SURFACE`| +|`bhvCapSwitch`|`OBJ_LIST_SURFACE`| +|`bhvKingBobomb`|`OBJ_LIST_GENACTOR`| +|`bhvBobombAnchorMario`|`OBJ_LIST_GENACTOR`| +|`bhvBetaChestBottom`|`OBJ_LIST_DEFAULT`| +|`bhvBetaChestLid`|`OBJ_LIST_DEFAULT`| +|`bhvBubbleParticleSpawner`|`OBJ_LIST_DEFAULT`| +|`bhvBubbleMaybe`|`OBJ_LIST_UNIMPORTANT`| +|`bhvBubblePlayer`|`OBJ_LIST_DEFAULT`| +|`bhvSmallWaterWave`|`OBJ_LIST_UNIMPORTANT`| +|`bhvWaterAirBubble`|`OBJ_LIST_LEVEL`| +|`bhvSmallParticle`|`OBJ_LIST_UNIMPORTANT`| +|`bhvPlungeBubble`|`OBJ_LIST_DEFAULT`| +|`bhvSmallParticleSnow`|`OBJ_LIST_UNIMPORTANT`| +|`bhvSmallParticleBubbles`|`OBJ_LIST_UNIMPORTANT`| +|`bhvFishGroup`|`OBJ_LIST_DEFAULT`| +|`bhvCannon`|`OBJ_LIST_LEVEL`| +|`bhvCannonBarrel`|`OBJ_LIST_DEFAULT`| +|`bhvCannonBaseUnused`|`OBJ_LIST_DEFAULT`| +|`bhvChuckya`|`OBJ_LIST_GENACTOR`| +|`bhvChuckyaAnchorMario`|`OBJ_LIST_GENACTOR`| +|`bhvUnused05A8`|`OBJ_LIST_DEFAULT`| +|`bhvRotatingPlatform`|`OBJ_LIST_SURFACE`| +|`bhvTower`|`OBJ_LIST_SURFACE`| +|`bhvBulletBillCannon`|`OBJ_LIST_SURFACE`| +|`bhvWfBreakableWallRight`|`OBJ_LIST_SURFACE`| +|`bhvWfBreakableWallLeft`|`OBJ_LIST_SURFACE`| +|`bhvKickableBoard`|`OBJ_LIST_SURFACE`| +|`bhvTowerDoor`|`OBJ_LIST_SURFACE`| +|`bhvRotatingCounterClockwise`|`OBJ_LIST_DEFAULT`| +|`bhvWfRotatingWoodenPlatform`|`OBJ_LIST_SURFACE`| +|`bhvKoopaShellUnderwater`|`OBJ_LIST_GENACTOR`| +|`bhvExitPodiumWarp`|`OBJ_LIST_SURFACE`| +|`bhvFadingWarp`|`OBJ_LIST_LEVEL`| +|`bhvWarp`|`OBJ_LIST_LEVEL`| +|`bhvWarpPipe`|`OBJ_LIST_SURFACE`| +|`bhvWhitePuffExplosion`|`OBJ_LIST_UNIMPORTANT`| +|`bhvSpawnedStar`|`OBJ_LIST_LEVEL`| +|`bhvSpawnedStarNoLevelExit`|`OBJ_LIST_LEVEL`| +|`bhvMrIBlueCoin`|`OBJ_LIST_LEVEL`| +|`bhvCoinInsideBoo`|`OBJ_LIST_LEVEL`| +|`bhvCoinFormationSpawn`|`OBJ_LIST_LEVEL`| +|`bhvCoinFormation`|`OBJ_LIST_SPAWNER`| +|`bhvOneCoin`|`OBJ_LIST_LEVEL`| +|`bhvYellowCoin`|`OBJ_LIST_LEVEL`| +|`bhvTemporaryYellowCoin`|`OBJ_LIST_LEVEL`| +|`bhvThreeCoinsSpawn`|`OBJ_LIST_DEFAULT`| +|`bhvTenCoinsSpawn`|`OBJ_LIST_DEFAULT`| +|`bhvSingleCoinGetsSpawned`|`OBJ_LIST_LEVEL`| +|`bhvCoinSparkles`|`OBJ_LIST_DEFAULT`| +|`bhvGoldenCoinSparkles`|`OBJ_LIST_DEFAULT`| +|`bhvWallTinyStarParticle`|`OBJ_LIST_UNIMPORTANT`| +|`bhvVertStarParticleSpawner`|`OBJ_LIST_DEFAULT`| +|`bhvPoundTinyStarParticle`|`OBJ_LIST_UNIMPORTANT`| +|`bhvHorStarParticleSpawner`|`OBJ_LIST_DEFAULT`| +|`bhvPunchTinyTriangle`|`OBJ_LIST_UNIMPORTANT`| +|`bhvTriangleParticleSpawner`|`OBJ_LIST_DEFAULT`| +|`bhvDoorWarp`|`OBJ_LIST_SURFACE`| +|`bhvDoor`|`OBJ_LIST_SURFACE`| +|`bhvGrindel`|`OBJ_LIST_SURFACE`| +|`bhvThwomp2`|`OBJ_LIST_SURFACE`| +|`bhvThwomp`|`OBJ_LIST_SURFACE`| +|`bhvTumblingBridgePlatform`|`OBJ_LIST_SURFACE`| +|`bhvWfTumblingBridge`|`OBJ_LIST_SPAWNER`| +|`bhvBbhTumblingBridge`|`OBJ_LIST_SPAWNER`| +|`bhvLllTumblingBridge`|`OBJ_LIST_SPAWNER`| +|`bhvFlame`|`OBJ_LIST_LEVEL`| +|`bhvAnotherElavator`|`OBJ_LIST_SURFACE`| +|`bhvRrElevatorPlatform`|`OBJ_LIST_SURFACE`| +|`bhvHmcElevatorPlatform`|`OBJ_LIST_SURFACE`| +|`bhvWaterMist`|`OBJ_LIST_UNIMPORTANT`| +|`bhvBreathParticleSpawner`|`OBJ_LIST_DEFAULT`| +|`bhvBreakBoxTriangle`|`OBJ_LIST_UNIMPORTANT`| +|`bhvWaterMist2`|`OBJ_LIST_DEFAULT`| +|`bhvUnused0DFC`|`OBJ_LIST_DEFAULT`| +|`bhvMistCircParticleSpawner`|`OBJ_LIST_DEFAULT`| +|`bhvDirtParticleSpawner`|`OBJ_LIST_DEFAULT`| +|``|`OBJ_LIST_DEFAULT`| +|`bhvSnowParticleSpawner`|`OBJ_LIST_DEFAULT`| +|`bhvWind`|`OBJ_LIST_UNIMPORTANT`| +|`bhvEndToad`|`OBJ_LIST_DEFAULT`| +|`bhvEndPeach`|`OBJ_LIST_DEFAULT`| +|`bhvUnusedParticleSpawn`|`OBJ_LIST_GENACTOR`| +|`bhvUkiki`|`OBJ_LIST_GENACTOR`| +|`bhvUkikiCageChild`|`OBJ_LIST_GENACTOR`| +|`bhvUkikiCageStar`|`OBJ_LIST_DEFAULT`| +|`bhvUkikiCage`|`OBJ_LIST_SURFACE`| +|`bhvBitfsSinkingPlatforms`|`OBJ_LIST_SURFACE`| +|`bhvBitfsSinkingCagePlatform`|`OBJ_LIST_SURFACE`| +|`bhvDddMovingPole`|`OBJ_LIST_POLELIKE`| +|`bhvBitfsTiltingInvertedPyramid`|`OBJ_LIST_SURFACE`| +|`bhvSquishablePlatform`|`OBJ_LIST_SURFACE`| +|`bhvCutOutObject`|`OBJ_LIST_GENACTOR`| +|`bhvBetaMovingFlames`|`OBJ_LIST_LEVEL`| +|`bhvRrRotatingBridgePlatform`|`OBJ_LIST_SURFACE`| +|`bhvFlamethrower`|`OBJ_LIST_DEFAULT`| +|`bhvFlamethrowerFlame`|`OBJ_LIST_GENACTOR`| +|`bhvBouncingFireball`|`OBJ_LIST_DEFAULT`| +|`bhvBouncingFireballFlame`|`OBJ_LIST_GENACTOR`| +|`bhvBowserShockWave`|`OBJ_LIST_DEFAULT`| +|`bhvFireParticleSpawner`|`OBJ_LIST_DEFAULT`| +|`bhvBlackSmokeMario`|`OBJ_LIST_UNIMPORTANT`| +|`bhvBlackSmokeBowser`|`OBJ_LIST_UNIMPORTANT`| +|`bhvBlackSmokeUpward`|`OBJ_LIST_DEFAULT`| +|`bhvBetaFishSplashSpawner`|`OBJ_LIST_DEFAULT`| +|`bhvSpindrift`|`OBJ_LIST_GENACTOR`| +|`bhvTowerPlatformGroup`|`OBJ_LIST_SURFACE`| +|`bhvWfSlidingTowerPlatform`|`OBJ_LIST_SURFACE`| +|`bhvWfElevatorTowerPlatform`|`OBJ_LIST_SURFACE`| +|`bhvWfSolidTowerPlatform`|`OBJ_LIST_SURFACE`| +|`bhvLeafParticleSpawner`|`OBJ_LIST_DEFAULT`| +|`bhvTreeSnow`|`OBJ_LIST_UNIMPORTANT`| +|`bhvTreeLeaf`|`OBJ_LIST_UNIMPORTANT`| +|`bhvAnotherTiltingPlatform`|`OBJ_LIST_SURFACE`| +|`bhvSquarishPathParent`|`OBJ_LIST_SURFACE`| +|`bhvSquarishPathMoving`|`OBJ_LIST_SURFACE`| +|`bhvPiranhaPlantBubble`|`OBJ_LIST_UNIMPORTANT`| +|`bhvPiranhaPlantWakingBubbles`|`OBJ_LIST_UNIMPORTANT`| +|`bhvFloorSwitchAnimatesObject`|`OBJ_LIST_SURFACE`| +|`bhvFloorSwitchGrills`|`OBJ_LIST_SURFACE`| +|`bhvFloorSwitchHardcodedModel`|`OBJ_LIST_SURFACE`| +|`bhvFloorSwitchHiddenObjects`|`OBJ_LIST_SURFACE`| +|`bhvHiddenObject`|`OBJ_LIST_SURFACE`| +|`bhvBreakableBox`|`OBJ_LIST_SURFACE`| +|`bhvPushableMetalBox`|`OBJ_LIST_SURFACE`| +|`bhvHeaveHo`|`OBJ_LIST_GENACTOR`| +|`bhvHeaveHoThrowMario`|`OBJ_LIST_GENACTOR`| +|`bhvCcmTouchedStarSpawn`|`OBJ_LIST_LEVEL`| +|`bhvUnusedPoundablePlatform`|`OBJ_LIST_SURFACE`| +|`bhvBetaTrampolineTop`|`OBJ_LIST_SURFACE`| +|`bhvBetaTrampolineSpring`|`OBJ_LIST_DEFAULT`| +|`bhvJumpingBox`|`OBJ_LIST_GENACTOR`| +|`bhvBooCage`|`OBJ_LIST_GENACTOR`| +|`bhvStub`|`OBJ_LIST_DEFAULT`| +|`bhvIgloo`|`OBJ_LIST_LEVEL`| +|`bhvBowserKey`|`OBJ_LIST_LEVEL`| +|`bhvGrandStar`|`OBJ_LIST_LEVEL`| +|`bhvBetaBooKey`|`OBJ_LIST_LEVEL`| +|`bhvAlphaBooKey`|`OBJ_LIST_LEVEL`| +|`bhvBulletBill`|`OBJ_LIST_GENACTOR`| +|`bhvWhitePuffSmoke`|`OBJ_LIST_DEFAULT`| +|`bhvUnused1820`|`OBJ_LIST_DEFAULT`| +|`bhvBowserTailAnchor`|`OBJ_LIST_GENACTOR`| +|`bhvBowser`|`OBJ_LIST_GENACTOR`| +|`bhvBowserBodyAnchor`|`OBJ_LIST_GENACTOR`| +|`bhvBowserFlameSpawn`|`OBJ_LIST_DEFAULT`| +|`bhvTiltingBowserLavaPlatform`|`OBJ_LIST_SURFACE`| +|`bhvFallingBowserPlatform`|`OBJ_LIST_SURFACE`| +|`bhvBlueBowserFlame`|`OBJ_LIST_LEVEL`| +|`bhvFlameFloatingLanding`|`OBJ_LIST_LEVEL`| +|`bhvBlueFlamesGroup`|`OBJ_LIST_LEVEL`| +|`bhvFlameBouncing`|`OBJ_LIST_LEVEL`| +|`bhvFlameMovingForwardGrowing`|`OBJ_LIST_LEVEL`| +|`bhvFlameBowser`|`OBJ_LIST_LEVEL`| +|`bhvFlameLargeBurningOut`|`OBJ_LIST_LEVEL`| +|`bhvBlueFish`|`OBJ_LIST_DEFAULT`| +|`bhvTankFishGroup`|`OBJ_LIST_DEFAULT`| +|`bhvCheckerboardElevatorGroup`|`OBJ_LIST_SPAWNER`| +|`bhvCheckerboardPlatformSub`|`OBJ_LIST_SURFACE`| +|`bhvBowserKeyUnlockDoor`|`OBJ_LIST_DEFAULT`| +|`bhvBowserKeyCourseExit`|`OBJ_LIST_DEFAULT`| +|`bhvInvisibleObjectsUnderBridge`|`OBJ_LIST_DEFAULT`| +|`bhvWaterLevelPillar`|`OBJ_LIST_SURFACE`| +|`bhvDddWarp`|`OBJ_LIST_SURFACE`| +|`bhvMoatGrills`|`OBJ_LIST_SURFACE`| +|`bhvClockMinuteHand`|`OBJ_LIST_DEFAULT`| +|`bhvClockHourHand`|`OBJ_LIST_DEFAULT`| +|`bhvMacroUkiki`|`OBJ_LIST_GENACTOR`| +|`bhvStub1D0C`|`OBJ_LIST_DEFAULT`| +|`bhvLllRotatingHexagonalPlatform`|`OBJ_LIST_SURFACE`| +|`bhvLllSinkingRockBlock`|`OBJ_LIST_SURFACE`| +|`bhvStub1D70`|`OBJ_LIST_DEFAULT`| +|`bhvLllMovingOctagonalMeshPlatform`|`OBJ_LIST_SURFACE`| +|`bhvLllRotatingBlockWithFireBars`|`OBJ_LIST_SURFACE`| +|`bhvLllRotatingHexFlame`|`OBJ_LIST_LEVEL`| +|`bhvLllWoodPiece`|`OBJ_LIST_SURFACE`| +|`bhvLllFloatingWoodBridge`|`OBJ_LIST_DEFAULT`| +|`bhvVolcanoFlames`|`OBJ_LIST_UNIMPORTANT`| +|`bhvLllRotatingHexagonalRing`|`OBJ_LIST_SURFACE`| +|`bhvLllSinkingRectangularPlatform`|`OBJ_LIST_SURFACE`| +|`bhvLllSinkingSquarePlatforms`|`OBJ_LIST_SURFACE`| +|`bhvLllTiltingInvertedPyramid`|`OBJ_LIST_SURFACE`| +|`bhvUnused1F30`|`OBJ_LIST_DEFAULT`| +|`bhvKoopaShell`|`OBJ_LIST_LEVEL`| +|`bhvKoopaShellFlame`|`OBJ_LIST_UNIMPORTANT`| +|`bhvToxBox`|`OBJ_LIST_SURFACE`| +|`bhvPiranhaPlant`|`OBJ_LIST_GENACTOR`| +|`bhvLllHexagonalMesh`|`OBJ_LIST_SURFACE`| +|`bhvLllBowserPuzzlePiece`|`OBJ_LIST_SURFACE`| +|`bhvLllBowserPuzzle`|`OBJ_LIST_SPAWNER`| +|`bhvTuxiesMother`|`OBJ_LIST_GENACTOR`| +|`bhvPenguinBaby`|`OBJ_LIST_GENACTOR`| +|`bhvUnused20E0`|`OBJ_LIST_GENACTOR`| +|`bhvSmallPenguin`|`OBJ_LIST_GENACTOR`| +|`bhvManyBlueFishSpawner`|`OBJ_LIST_DEFAULT`| +|`bhvFewBlueFishSpawner`|`OBJ_LIST_DEFAULT`| +|`bhvFishSpawner`|`OBJ_LIST_DEFAULT`| +|`bhvFish`|`OBJ_LIST_DEFAULT`| +|`bhvWdwExpressElevator`|`OBJ_LIST_SURFACE`| +|`bhvWdwExpressElevatorPlatform`|`OBJ_LIST_SURFACE`| +|`bhvChirpChirp`|`OBJ_LIST_DEFAULT`| +|`bhvBub`|`OBJ_LIST_GENACTOR`| +|`bhvExclamationBox`|`OBJ_LIST_SURFACE`| +|`bhvRotatingExclamationMark`|`OBJ_LIST_DEFAULT`| +|`bhvSoundSpawner`|`OBJ_LIST_UNIMPORTANT`| +|`bhvRockSolid`|`OBJ_LIST_SURFACE`| +|`bhvBowserSubDoor`|`OBJ_LIST_SURFACE`| +|`bhvBowsersSub`|`OBJ_LIST_SURFACE`| +|`bhvSushiShark`|`OBJ_LIST_GENACTOR`| +|`bhvSushiSharkCollisionChild`|`OBJ_LIST_GENACTOR`| +|`bhvJrbSlidingBox`|`OBJ_LIST_SURFACE`| +|`bhvShipPart3`|`OBJ_LIST_DEFAULT`| +|`bhvInSunkenShip3`|`OBJ_LIST_SURFACE`| +|`bhvSunkenShipPart`|`OBJ_LIST_DEFAULT`| +|`bhvSunkenShipPart2`|`OBJ_LIST_DEFAULT`| +|`bhvInSunkenShip`|`OBJ_LIST_SURFACE`| +|`bhvInSunkenShip2`|`OBJ_LIST_SURFACE`| +|`bhvMistParticleSpawner`|`OBJ_LIST_DEFAULT`| +|`bhvWhitePuff1`|`OBJ_LIST_DEFAULT`| +|`bhvWhitePuff2`|`OBJ_LIST_UNIMPORTANT`| +|`bhvWhitePuffSmoke2`|`OBJ_LIST_UNIMPORTANT`| +|`bhvPurpleSwitchHiddenBoxes`|`OBJ_LIST_SURFACE`| +|`bhvBlueCoinSwitch`|`OBJ_LIST_SURFACE`| +|`bhvHiddenBlueCoin`|`OBJ_LIST_LEVEL`| +|`bhvOpenableCageDoor`|`OBJ_LIST_SURFACE`| +|`bhvOpenableGrill`|`OBJ_LIST_DEFAULT`| +|`bhvWaterLevelDiamond`|`OBJ_LIST_SURFACE`| +|`bhvInitializeChangingWaterLevel`|`OBJ_LIST_DEFAULT`| +|`bhvTweesterSandParticle`|`OBJ_LIST_UNIMPORTANT`| +|`bhvTweester`|`OBJ_LIST_POLELIKE`| +|`bhvMerryGoRoundBooManager`|`OBJ_LIST_DEFAULT`| +|`bhvAnimatedTexture`|`OBJ_LIST_GENACTOR`| +|`bhvBooInCastle`|`OBJ_LIST_DEFAULT`| +|`bhvBooWithCage`|`OBJ_LIST_GENACTOR`| +|`bhvBalconyBigBoo`|`OBJ_LIST_GENACTOR`| +|`bhvMerryGoRoundBigBoo`|`OBJ_LIST_GENACTOR`| +|`bhvGhostHuntBigBoo`|`OBJ_LIST_GENACTOR`| +|`bhvCourtyardBooTriplet`|`OBJ_LIST_DEFAULT`| +|`bhvBoo`|`OBJ_LIST_GENACTOR`| +|`bhvMerryGoRoundBoo`|`OBJ_LIST_GENACTOR`| +|`bhvGhostHuntBoo`|`OBJ_LIST_GENACTOR`| +|`bhvHiddenStaircaseStep`|`OBJ_LIST_SURFACE`| +|`bhvBooBossSpawnedBridge`|`OBJ_LIST_SURFACE`| +|`bhvBbhTiltingTrapPlatform`|`OBJ_LIST_SURFACE`| +|`bhvHauntedBookshelf`|`OBJ_LIST_SURFACE`| +|`bhvMeshElevator`|`OBJ_LIST_SURFACE`| +|`bhvMerryGoRound`|`OBJ_LIST_SURFACE`| +|`bhvPlaysMusicTrackWhenTouched`|`OBJ_LIST_DEFAULT`| +|`bhvBetaBowserAnchor`|`OBJ_LIST_DESTRUCTIVE`| +|`bhvStaticCheckeredPlatform`|`OBJ_LIST_SURFACE`| +|`bhvUnused2A10`|`OBJ_LIST_DEFAULT`| +|`bhvUnusedFakeStar`|`OBJ_LIST_DEFAULT`| +|`bhvStaticObject`|`OBJ_LIST_DEFAULT`| +|`bhvUnused2A54`|`OBJ_LIST_DEFAULT`| +|`bhvCastleFloorTrap`|`OBJ_LIST_DEFAULT`| +|`bhvFloorTrapInCastle`|`OBJ_LIST_SURFACE`| +|`bhvTree`|`OBJ_LIST_POLELIKE`| +|`bhvSparkle`|`OBJ_LIST_UNIMPORTANT`| +|`bhvSparkleSpawn`|`OBJ_LIST_UNIMPORTANT`| +|`bhvSparkleParticleSpawner`|`OBJ_LIST_DEFAULT`| +|``|`OBJ_LIST_UNIMPORTANT`| +|`bhvScuttlebug`|`OBJ_LIST_GENACTOR`| +|`bhvScuttlebugSpawn`|`OBJ_LIST_SPAWNER`| +|`bhvWhompKingBoss`|`OBJ_LIST_SURFACE`| +|`bhvSmallWhomp`|`OBJ_LIST_SURFACE`| +|`bhvWaterSplash`|`OBJ_LIST_DEFAULT`| +|`bhvWaterDroplet`|`OBJ_LIST_UNIMPORTANT`| +|`bhvWaterDropletSplash`|`OBJ_LIST_DEFAULT`| +|`bhvBubbleSplash`|`OBJ_LIST_DEFAULT`| +|`bhvIdleWaterWave`|`OBJ_LIST_DEFAULT`| +|`bhvObjectWaterSplash`|`OBJ_LIST_UNIMPORTANT`| +|`bhvShallowWaterWave`|`OBJ_LIST_DEFAULT`| +|`bhvShallowWaterSplash`|`OBJ_LIST_DEFAULT`| +|`bhvObjectWaveTrail`|`OBJ_LIST_UNIMPORTANT`| +|`bhvWaveTrail`|`OBJ_LIST_DEFAULT`| +|`bhvTinyStrongWindParticle`|`OBJ_LIST_UNIMPORTANT`| +|`bhvStrongWindParticle`|`OBJ_LIST_POLELIKE`| +|`bhvSLSnowmanWind`|`OBJ_LIST_DEFAULT`| +|`bhvSLWalkingPenguin`|`OBJ_LIST_SURFACE`| +|`bhvYellowBall`|`OBJ_LIST_DEFAULT`| +|`bhvMario`|`OBJ_LIST_PLAYER`| +|`bhvToadMessage`|`OBJ_LIST_GENACTOR`| +|`bhvUnlockDoorStar`|`OBJ_LIST_LEVEL`| +|`bhvRandomAnimatedTexture`|`OBJ_LIST_LEVEL`| +|`bhvYellowBackgroundInMenu`|`OBJ_LIST_LEVEL`| +|`bhvMenuButton`|`OBJ_LIST_LEVEL`| +|`bhvMenuButtonManager`|`OBJ_LIST_LEVEL`| +|`bhvActSelectorStarType`|`OBJ_LIST_DEFAULT`| +|`bhvActSelector`|`OBJ_LIST_DEFAULT`| +|`bhvMovingYellowCoin`|`OBJ_LIST_LEVEL`| +|`bhvMovingBlueCoin`|`OBJ_LIST_LEVEL`| +|`bhvBlueCoinSliding`|`OBJ_LIST_GENACTOR`| +|`bhvBlueCoinJumping`|`OBJ_LIST_GENACTOR`| +|`bhvSeaweed`|`OBJ_LIST_LEVEL`| +|`bhvSeaweedBundle`|`OBJ_LIST_LEVEL`| +|`bhvBobomb`|`OBJ_LIST_DESTRUCTIVE`| +|`bhvBobombFuseSmoke`|`OBJ_LIST_DEFAULT`| +|`bhvBobombBuddy`|`OBJ_LIST_GENACTOR`| +|`bhvBobombBuddyOpensCannon`|`OBJ_LIST_GENACTOR`| +|`bhvCannonClosed`|`OBJ_LIST_SURFACE`| +|`bhvWhirlpool`|`OBJ_LIST_POLELIKE`| +|`bhvJetStream`|`OBJ_LIST_DEFAULT`| +|`bhvMessagePanel`|`OBJ_LIST_SURFACE`| +|`bhvSignOnWall`|`OBJ_LIST_SURFACE`| +|`bhvHomingAmp`|`OBJ_LIST_GENACTOR`| +|`bhvCirclingAmp`|`OBJ_LIST_GENACTOR`| +|`bhvButterfly`|`OBJ_LIST_DEFAULT`| +|`bhvHoot`|`OBJ_LIST_POLELIKE`| +|`bhvBetaHoldableObject`|`OBJ_LIST_GENACTOR`| +|`bhvCarrySomething1`|`OBJ_LIST_DEFAULT`| +|`bhvCarrySomething2`|`OBJ_LIST_DEFAULT`| +|`bhvCarrySomething3`|`OBJ_LIST_DEFAULT`| +|`bhvCarrySomething4`|`OBJ_LIST_DEFAULT`| +|`bhvCarrySomething5`|`OBJ_LIST_DEFAULT`| +|`bhvCarrySomething6`|`OBJ_LIST_DEFAULT`| +|`bhvObjectBubble`|`OBJ_LIST_UNIMPORTANT`| +|`bhvObjectWaterWave`|`OBJ_LIST_UNIMPORTANT`| +|`bhvExplosion`|`OBJ_LIST_DESTRUCTIVE`| +|`bhvBobombBullyDeathSmoke`|`OBJ_LIST_UNIMPORTANT`| +|`bhvSmoke`|`OBJ_LIST_UNIMPORTANT`| +|`bhvBobombExplosionBubble`|`OBJ_LIST_DEFAULT`| +|`bhvRespawner`|`OBJ_LIST_DEFAULT`| +|`bhvSmallBully`|`OBJ_LIST_GENACTOR`| +|`bhvBigBully`|`OBJ_LIST_GENACTOR`| +|`bhvBigBullyWithMinions`|`OBJ_LIST_GENACTOR`| +|`bhvSmallChillBully`|`OBJ_LIST_GENACTOR`| +|`bhvBigChillBully`|`OBJ_LIST_GENACTOR`| +|`bhvJetStreamRingSpawner`|`OBJ_LIST_DEFAULT`| +|`bhvJetStreamWaterRing`|`OBJ_LIST_LEVEL`| +|`bhvMantaRayWaterRing`|`OBJ_LIST_LEVEL`| +|`bhvMantaRayRingManager`|`OBJ_LIST_DEFAULT`| +|`bhvBowserBomb`|`OBJ_LIST_GENACTOR`| +|`bhvBowserBombExplosion`|`OBJ_LIST_DEFAULT`| +|`bhvBowserBombSmoke`|`OBJ_LIST_DEFAULT`| +|`bhvCelebrationStar`|`OBJ_LIST_LEVEL`| +|`bhvCelebrationStarSparkle`|`OBJ_LIST_UNIMPORTANT`| +|`bhvStarKeyCollectionPuffSpawner`|`OBJ_LIST_DEFAULT`| +|`bhvLllDrawbridgeSpawner`|`OBJ_LIST_DEFAULT`| +|`bhvLllDrawbridge`|`OBJ_LIST_SURFACE`| +|`bhvSmallBomp`|`OBJ_LIST_SURFACE`| +|`bhvLargeBomp`|`OBJ_LIST_SURFACE`| +|`bhvWfSlidingPlatform`|`OBJ_LIST_SURFACE`| +|`bhvMoneybag`|`OBJ_LIST_GENACTOR`| +|`bhvMoneybagHidden`|`OBJ_LIST_LEVEL`| +|`bhvPitBowlingBall`|`OBJ_LIST_GENACTOR`| +|`bhvFreeBowlingBall`|`OBJ_LIST_GENACTOR`| +|`bhvBowlingBall`|`OBJ_LIST_GENACTOR`| +|`bhvTtmBowlingBallSpawner`|`OBJ_LIST_GENACTOR`| +|`bhvBobBowlingBallSpawner`|`OBJ_LIST_GENACTOR`| +|`bhvThiBowlingBallSpawner`|`OBJ_LIST_GENACTOR`| +|`bhvRrCruiserWing`|`OBJ_LIST_DEFAULT`| +|`bhvSpindel`|`OBJ_LIST_SURFACE`| +|`bhvSslMovingPyramidWall`|`OBJ_LIST_SURFACE`| +|`bhvPyramidElevator`|`OBJ_LIST_SURFACE`| +|`bhvPyramidElevatorTrajectoryMarkerBall`|`OBJ_LIST_DEFAULT`| +|`bhvPyramidTop`|`OBJ_LIST_SURFACE`| +|`bhvPyramidTopFragment`|`OBJ_LIST_DEFAULT`| +|`bhvPyramidPillarTouchDetector`|`OBJ_LIST_LEVEL`| +|`bhvWaterfallSoundLoop`|`OBJ_LIST_DEFAULT`| +|`bhvVolcanoSoundLoop`|`OBJ_LIST_DEFAULT`| +|`bhvCastleFlagWaving`|`OBJ_LIST_DEFAULT`| +|`bhvBirdsSoundLoop`|`OBJ_LIST_DEFAULT`| +|`bhvAmbientSounds`|`OBJ_LIST_DEFAULT`| +|`bhvSandSoundLoop`|`OBJ_LIST_DEFAULT`| +|`bhvHiddenAt120Stars`|`OBJ_LIST_SURFACE`| +|`bhvSnowmansBottom`|`OBJ_LIST_GENACTOR`| +|`bhvSnowmansHead`|`OBJ_LIST_DEFAULT`| +|`bhvSnowmansBodyCheckpoint`|`OBJ_LIST_DEFAULT`| +|`bhvBigSnowmanWhole`|`OBJ_LIST_GENACTOR`| +|`bhvBigBoulder`|`OBJ_LIST_GENACTOR`| +|`bhvBigBoulderGenerator`|`OBJ_LIST_DEFAULT`| +|`bhvWingCap`|`OBJ_LIST_LEVEL`| +|`bhvMetalCap`|`OBJ_LIST_LEVEL`| +|`bhvNormalCap`|`OBJ_LIST_LEVEL`| +|`bhvVanishCap`|`OBJ_LIST_LEVEL`| +|`bhvStar`|`OBJ_LIST_LEVEL`| +|`bhvStarSpawnCoordinates`|`OBJ_LIST_LEVEL`| +|`bhvHiddenRedCoinStar`|`OBJ_LIST_LEVEL`| +|`bhvRedCoin`|`OBJ_LIST_LEVEL`| +|`bhvBowserCourseRedCoinStar`|`OBJ_LIST_LEVEL`| +|`bhvHiddenStar`|`OBJ_LIST_LEVEL`| +|`bhvHiddenStarTrigger`|`OBJ_LIST_LEVEL`| +|`bhvTtmRollingLog`|`OBJ_LIST_SURFACE`| +|`bhvLllVolcanoFallingTrap`|`OBJ_LIST_SURFACE`| +|`bhvLllRollingLog`|`OBJ_LIST_SURFACE`| +|`bhv1upWalking`|`OBJ_LIST_LEVEL`| +|`bhv1upRunningAway`|`OBJ_LIST_LEVEL`| +|`bhv1upSliding`|`OBJ_LIST_LEVEL`| +|`bhv1Up`|`OBJ_LIST_LEVEL`| +|`bhv1upJumpOnApproach`|`OBJ_LIST_LEVEL`| +|`bhvHidden1up`|`OBJ_LIST_LEVEL`| +|`bhvHidden1upTrigger`|`OBJ_LIST_LEVEL`| +|`bhvHidden1upInPole`|`OBJ_LIST_LEVEL`| +|`bhvHidden1upInPoleTrigger`|`OBJ_LIST_LEVEL`| +|`bhvHidden1upInPoleSpawner`|`OBJ_LIST_LEVEL`| +|`bhvControllablePlatform`|`OBJ_LIST_SURFACE`| +|`bhvControllablePlatformSub`|`OBJ_LIST_SURFACE`| +|`bhvBreakableBoxSmall`|`OBJ_LIST_DESTRUCTIVE`| +|`bhvSlidingSnowMound`|`OBJ_LIST_SURFACE`| +|`bhvSnowMoundSpawn`|`OBJ_LIST_DEFAULT`| +|`bhvWdwSquareFloatingPlatform`|`OBJ_LIST_SURFACE`| +|`bhvWdwRectangularFloatingPlatform`|`OBJ_LIST_SURFACE`| +|`bhvJrbFloatingPlatform`|`OBJ_LIST_SURFACE`| +|`bhvArrowLift`|`OBJ_LIST_SURFACE`| +|`bhvOrangeNumber`|`OBJ_LIST_LEVEL`| +|`bhvMantaRay`|`OBJ_LIST_GENACTOR`| +|`bhvFallingPillar`|`OBJ_LIST_GENACTOR`| +|`bhvFallingPillarHitbox`|`OBJ_LIST_GENACTOR`| +|`bhvPillarBase`|`OBJ_LIST_SURFACE`| +|`bhvJrbFloatingBox`|`OBJ_LIST_SURFACE`| +|`bhvDecorativePendulum`|`OBJ_LIST_DEFAULT`| +|`bhvTreasureChestsShip`|`OBJ_LIST_DEFAULT`| +|`bhvTreasureChestsJrb`|`OBJ_LIST_DEFAULT`| +|`bhvTreasureChests`|`OBJ_LIST_DEFAULT`| +|`bhvTreasureChestBottom`|`OBJ_LIST_GENACTOR`| +|`bhvTreasureChestTop`|`OBJ_LIST_DEFAULT`| +|`bhvMips`|`OBJ_LIST_GENACTOR`| +|`bhvYoshi`|`OBJ_LIST_GENACTOR`| +|`bhvKoopa`|`OBJ_LIST_PUSHABLE`| +|`bhvKoopaRaceEndpoint`|`OBJ_LIST_DEFAULT`| +|`bhvKoopaFlag`|`OBJ_LIST_POLELIKE`| +|`bhvPokey`|`OBJ_LIST_GENACTOR`| +|`bhvPokeyBodyPart`|`OBJ_LIST_GENACTOR`| +|`bhvSwoop`|`OBJ_LIST_GENACTOR`| +|`bhvFlyGuy`|`OBJ_LIST_GENACTOR`| +|`bhvGoomba`|`OBJ_LIST_PUSHABLE`| +|`bhvGoombaTripletSpawner`|`OBJ_LIST_PUSHABLE`| +|`bhvChainChomp`|`OBJ_LIST_GENACTOR`| +|`bhvChainChompChainPart`|`OBJ_LIST_GENACTOR`| +|`bhvWoodenPost`|`OBJ_LIST_SURFACE`| +|`bhvChainChompGate`|`OBJ_LIST_SURFACE`| +|`bhvWigglerHead`|`OBJ_LIST_GENACTOR`| +|`bhvWigglerBody`|`OBJ_LIST_GENACTOR`| +|`bhvEnemyLakitu`|`OBJ_LIST_PUSHABLE`| +|`bhvCameraLakitu`|`OBJ_LIST_DEFAULT`| +|`bhvCloud`|`OBJ_LIST_DEFAULT`| +|`bhvCloudPart`|`OBJ_LIST_DEFAULT`| +|`bhvSpiny`|`OBJ_LIST_PUSHABLE`| +|`bhvMontyMole`|`OBJ_LIST_GENACTOR`| +|`bhvMontyMoleHole`|`OBJ_LIST_DEFAULT`| +|`bhvMontyMoleRock`|`OBJ_LIST_GENACTOR`| +|`bhvPlatformOnTrack`|`OBJ_LIST_SURFACE`| +|`bhvTrackBall`|`OBJ_LIST_SURFACE`| +|`bhvSeesawPlatform`|`OBJ_LIST_SURFACE`| +|`bhvFerrisWheelAxle`|`OBJ_LIST_SURFACE`| +|`bhvFerrisWheelPlatform`|`OBJ_LIST_SURFACE`| +|`bhvWaterBombSpawner`|`OBJ_LIST_GENACTOR`| +|`bhvWaterBomb`|`OBJ_LIST_GENACTOR`| +|`bhvWaterBombShadow`|`OBJ_LIST_GENACTOR`| +|`bhvTTCRotatingSolid`|`OBJ_LIST_SURFACE`| +|`bhvTTCPendulum`|`OBJ_LIST_SURFACE`| +|`bhvTTCTreadmill`|`OBJ_LIST_SURFACE`| +|`bhvTTCMovingBar`|`OBJ_LIST_SURFACE`| +|`bhvTTCCog`|`OBJ_LIST_SURFACE`| +|`bhvTTCPitBlock`|`OBJ_LIST_SURFACE`| +|`bhvTTCElevator`|`OBJ_LIST_SURFACE`| +|`bhvTTC2DRotator`|`OBJ_LIST_SURFACE`| +|`bhvTTCSpinner`|`OBJ_LIST_SURFACE`| +|`bhvMrBlizzard`|`OBJ_LIST_GENACTOR`| +|`bhvMrBlizzardSnowball`|`OBJ_LIST_GENACTOR`| +|`bhvSlidingPlatform2`|`OBJ_LIST_SURFACE`| +|`bhvOctagonalPlatformRotating`|`OBJ_LIST_SURFACE`| +|`bhvAnimatesOnFloorSwitchPress`|`OBJ_LIST_SURFACE`| +|`bhvActivatedBackAndForthPlatform`|`OBJ_LIST_SURFACE`| +|`bhvRecoveryHeart`|`OBJ_LIST_LEVEL`| +|`bhvWaterBombCannon`|`OBJ_LIST_DEFAULT`| +|`bhvCannonBarrelBubbles`|`OBJ_LIST_DEFAULT`| +|`bhvUnagi`|`OBJ_LIST_GENACTOR`| +|`bhvUnagiSubobject`|`OBJ_LIST_GENACTOR`| +|`bhvDorrie`|`OBJ_LIST_SURFACE`| +|`bhvHauntedChair`|`OBJ_LIST_GENACTOR`| +|`bhvMadPiano`|`OBJ_LIST_GENACTOR`| +|`bhvFlyingBookend`|`OBJ_LIST_GENACTOR`| +|`bhvBookendSpawn`|`OBJ_LIST_GENACTOR`| +|`bhvHauntedBookshelfManager`|`OBJ_LIST_GENACTOR`| +|`bhvBookSwitch`|`OBJ_LIST_GENACTOR`| +|`bhvFirePiranhaPlant`|`OBJ_LIST_GENACTOR`| +|`bhvSmallPiranhaFlame`|`OBJ_LIST_GENACTOR`| +|`bhvFireSpitter`|`OBJ_LIST_GENACTOR`| +|`bhvFlyguyFlame`|`OBJ_LIST_UNIMPORTANT`| +|`bhvSnufit`|`OBJ_LIST_GENACTOR`| +|`bhvSnufitBalls`|`OBJ_LIST_GENACTOR`| +|`bhvHorizontalGrindel`|`OBJ_LIST_SURFACE`| +|`bhvEyerokBoss`|`OBJ_LIST_GENACTOR`| +|`bhvEyerokHand`|`OBJ_LIST_SURFACE`| +|`bhvKlepto`|`OBJ_LIST_GENACTOR`| +|`bhvBird`|`OBJ_LIST_DEFAULT`| +|`bhvRacingPenguin`|`OBJ_LIST_GENACTOR`| +|`bhvPenguinRaceFinishLine`|`OBJ_LIST_DEFAULT`| +|`bhvPenguinRaceShortcutCheck`|`OBJ_LIST_DEFAULT`| +|`bhvCoffinSpawner`|`OBJ_LIST_SURFACE`| +|`bhvCoffin`|`OBJ_LIST_SURFACE`| +|`bhvClamShell`|`OBJ_LIST_GENACTOR`| +|`bhvSkeeter`|`OBJ_LIST_GENACTOR`| +|`bhvSkeeterWave`|`OBJ_LIST_UNIMPORTANT`| +|`bhvSwingPlatform`|`OBJ_LIST_SURFACE`| +|`bhvDonutPlatformSpawner`|`OBJ_LIST_SPAWNER`| +|`bhvDonutPlatform`|`OBJ_LIST_SURFACE`| +|`bhvDDDPole`|`OBJ_LIST_POLELIKE`| +|`bhvRedCoinStarMarker`|`OBJ_LIST_DEFAULT`| +|`bhvTripletButterfly`|`OBJ_LIST_GENACTOR`| +|`bhvBubba`|`OBJ_LIST_GENACTOR`| +|`bhvBeginningLakitu`|`OBJ_LIST_DEFAULT`| +|`bhvBeginningPeach`|`OBJ_LIST_DEFAULT`| +|`bhvEndBirds1`|`OBJ_LIST_DEFAULT`| +|`bhvEndBirds2`|`OBJ_LIST_DEFAULT`| +|`bhvIntroScene`|`OBJ_LIST_DEFAULT`| +|`RM_Scroll_Texture`|`OBJ_LIST_GENACTOR`| +|`editor_Scroll_Texture`|`OBJ_LIST_GENACTOR`| diff --git a/docs/lua/lua.md b/docs/lua/lua.md index f33ef566e..82ab0202a 100644 --- a/docs/lua/lua.md +++ b/docs/lua/lua.md @@ -29,9 +29,10 @@ Save file locations: - [Structs](structs.md) ### Guides +- [Setting up Visual Studio Code](guides/vs-code-setup.md) - [Hooks](guides/hooks.md) - [gMarioStates](guides/mario-state.md) -- [Setting up Visual Studio Code](guides/vs-code-setup.md) +- [Behavior Object Lists](guides/object-lists.md) ## Important notes on player indices diff --git a/docs/lua/structs.md b/docs/lua/structs.md index 5ccc57d9b..20677e631 100644 --- a/docs/lua/structs.md +++ b/docs/lua/structs.md @@ -310,6 +310,7 @@ | RacingPenguinBigRadius | `number` | | | RacingPenguinHeight | `number` | | | RacingPenguinRadius | `number` | | +| RespawnShellBoxes | `integer` | | | ShowStarMilestones | `integer` | | | ToadStar1Requirement | `integer` | | | ToadStar2Requirement | `integer` | | @@ -924,6 +925,7 @@ | ----- | ---- | ------ | | cellHeightLimit | `integer` | | | coinsRequiredForCoinStar | `integer` | | +| disableActs | `boolean` | | | entryLevel | [enum LevelNum](constants.md#enum-LevelNum) | | | exitCastleArea | `integer` | | | exitCastleLevel | [enum LevelNum](constants.md#enum-LevelNum) | | @@ -935,14 +937,18 @@ | floorLowerLimitShadow | `integer` | | | metalCapDuration | `integer` | | | metalCapDurationCotmc | `integer` | | +| pauseExitAnywhere | `boolean` | | +| metalCapSequence | `integer` | | | pssSlideStarIndex | `integer` | | | pssSlideStarTime | `integer` | | | skipCreditsAt | [enum LevelNum](constants.md#enum-LevelNum) | | | starPositions | [StarPositions](structs.md#StarPositions) | read-only | | vanishCapDuration | `integer` | | | vanishCapDurationVcutm | `integer` | | +| vanishCapSequence | `integer` | | | wingCapDuration | `integer` | | | wingCapDurationTotwc | `integer` | | +| wingCapSequence | `integer` | | [:arrow_up_small:](#) diff --git a/src/engine/level_script.c b/src/engine/level_script.c index 26680daea..7f0b764b8 100644 --- a/src/engine/level_script.c +++ b/src/engine/level_script.c @@ -28,6 +28,7 @@ #include "src/pc/lua/utils/smlua_model_utils.h" #include "src/pc/lua/smlua.h" #include "src/pc/djui/djui.h" +#include "game/hardcoded.h" #define CMD_GET(type, offset) (*(type *) (CMD_PROCESS_OFFSET(offset) + (u8 *) sCurrentCmd)) @@ -506,7 +507,7 @@ static void level_cmd_place_object(void) { u16 model; struct SpawnInfo *spawnInfo; - if (sCurrAreaIndex != -1 && ((CMD_GET(u8, 2) & val7) || CMD_GET(u8, 2) == 0x1F)) { + if (sCurrAreaIndex != -1 && (gLevelValues.disableActs || (CMD_GET(u8, 2) & val7) || CMD_GET(u8, 2) == 0x1F)) { model = CMD_GET(u8, 3); spawnInfo = alloc_only_pool_alloc(sLevelPool, sizeof(struct SpawnInfo)); diff --git a/src/game/behaviors/exclamation_box.inc.c b/src/game/behaviors/exclamation_box.inc.c index 6a9c632ed..8a1ea7896 100644 --- a/src/game/behaviors/exclamation_box.inc.c +++ b/src/game/behaviors/exclamation_box.inc.c @@ -170,7 +170,8 @@ void exclamation_box_act_4(void) { spawn_mist_particles_variable(0, 0, 46.0f); spawn_triangle_break_particles(20, 139, 0.3f, o->oAnimState); create_sound_spawner(SOUND_GENERAL_BREAK_BOX); - if (o->oBehParams2ndByte <= 3) { + u8 threshold = gBehaviorValues.RespawnShellBoxes ? 3 : 2; + if (o->oBehParams2ndByte <= threshold) { o->oAction = 5; cur_obj_hide(); } else { diff --git a/src/game/hardcoded.c b/src/game/hardcoded.c index d1d888cd6..99c266fc3 100644 --- a/src/game/hardcoded.c +++ b/src/game/hardcoded.c @@ -58,6 +58,9 @@ struct LevelValues gDefaultLevelValues = { .wingCapDurationTotwc = 1200, .metalCapDurationCotmc = 600, .vanishCapDurationVcutm = 600, + .wingCapSequence = SEQ_EVENT_POWERUP, + .metalCapSequence = SEQ_EVENT_METAL_CAP, + .vanishCapSequence = SEQ_EVENT_POWERUP, .starPositions = { .KoopaBobStarPos = { 3030.0f, 4500.0f, -4600.0f }, .KoopaThiStarPos = { 7100.0f, -1300.0f, -6000.0f }, @@ -94,6 +97,8 @@ struct LevelValues gDefaultLevelValues = { .floorLowerLimit = FLOOR_LOWER_LIMIT, .floorLowerLimitMisc = FLOOR_LOWER_LIMIT_MISC, .floorLowerLimitShadow = FLOOR_LOWER_LIMIT_SHADOW, + .pauseExitAnywhere = 1, + .disableActs = false, }; struct LevelValues gLevelValues = { 0 }; @@ -126,6 +131,7 @@ struct BehaviorValues gDefaultBehaviorValues = { .BowlingBallThiSmallSpeed = 10.0f, .GrateStarRequirement = 120, .ShowStarMilestones = TRUE, + .RespawnShellBoxes = TRUE, .starsNeededForDialog = { 1, 3, 8, 30, 50, 70 }, .dialogs = { .BobombBuddyBob1Dialog = DIALOG_004, diff --git a/src/game/hardcoded.h b/src/game/hardcoded.h index 204fad1c7..a3a6129d6 100644 --- a/src/game/hardcoded.h +++ b/src/game/hardcoded.h @@ -1,7 +1,8 @@ #ifndef HARDCODED_H #include "types.h" #include "level_table.h" -#include "dialog_ids.h" +#include "dialog_ids.h" +#include "seq_ids.h" //////////// // Levels // @@ -53,11 +54,16 @@ struct LevelValues { u16 wingCapDurationTotwc; u16 metalCapDurationCotmc; u16 vanishCapDurationVcutm; + u8 wingCapSequence; + u8 metalCapSequence; + u8 vanishCapSequence; struct StarPositions starPositions; s16 cellHeightLimit; s16 floorLowerLimit; s16 floorLowerLimitMisc; s16 floorLowerLimitShadow; + bool pauseExitAnywhere; + bool disableActs; }; extern struct LevelValues gLevelValues; @@ -220,6 +226,7 @@ struct BehaviorValues { f32 BowlingBallThiSmallSpeed; u16 GrateStarRequirement; u8 ShowStarMilestones; + u8 RespawnShellBoxes; struct StarsNeededForDialog starsNeededForDialog; struct BehaviorDialogs dialogs; struct BehaviorTrajectories trajectories; diff --git a/src/game/ingame_menu.c b/src/game/ingame_menu.c index df882b762..39ea54e90 100644 --- a/src/game/ingame_menu.c +++ b/src/game/ingame_menu.c @@ -33,6 +33,7 @@ #ifdef BETTERCAMERA #include "bettercamera.h" #endif +#include "hardcoded.h" u16 gDialogColorFadeTimer; s8 gLastDialogLineNum; @@ -2859,7 +2860,7 @@ s16 render_pause_courses_and_castle(void) { render_pause_red_coins(); /* Always allow exiting from course */ - if (TRUE || (gMarioStates[0].action & ACT_FLAG_PAUSE_EXIT)) { + if (gLevelValues.pauseExitAnywhere || (gMarioStates[0].action & ACT_FLAG_PAUSE_EXIT)) { render_pause_course_options(99, 93, &gDialogLineNum, 15); } diff --git a/src/game/interaction.c b/src/game/interaction.c index 8c1f2802c..a452541b0 100644 --- a/src/game/interaction.c +++ b/src/game/interaction.c @@ -1986,17 +1986,17 @@ u32 interact_cap(struct MarioState *m, UNUSED u32 interactType, struct Object *o switch (capFlag) { case MARIO_VANISH_CAP: capTime = gLevelValues.vanishCapDuration; - capMusic = SEQUENCE_ARGS(4, SEQ_EVENT_POWERUP); + capMusic = SEQUENCE_ARGS(4, gLevelValues.vanishCapSequence); break; case MARIO_METAL_CAP: capTime = gLevelValues.metalCapDuration; - capMusic = SEQUENCE_ARGS(4, SEQ_EVENT_METAL_CAP); + capMusic = SEQUENCE_ARGS(4, gLevelValues.metalCapSequence); break; case MARIO_WING_CAP: capTime = gLevelValues.wingCapDuration; - capMusic = SEQUENCE_ARGS(4, SEQ_EVENT_POWERUP); + capMusic = SEQUENCE_ARGS(4, gLevelValues.wingCapSequence); break; } diff --git a/src/game/level_update.c b/src/game/level_update.c index 5efdf477d..7c51cdd0f 100644 --- a/src/game/level_update.c +++ b/src/game/level_update.c @@ -1077,7 +1077,7 @@ void update_hud_values(void) { gHudDisplay.lives = gMarioState->numLives; gHudDisplay.keys = gMarioState->numKeys; - if (numHealthWedges > gHudDisplay.wedges) { + if (numHealthWedges > gHudDisplay.wedges && !gDjuiInMainMenu) { play_sound(SOUND_MENU_POWER_METER, gGlobalSoundSource); } gHudDisplay.wedges = numHealthWedges; @@ -1548,13 +1548,10 @@ s32 update_level(void) { changeLevel = play_mode_normal(); break; case PLAY_MODE_PAUSED: -#ifdef DEVELOPMENT - if (configDisableDevPause) { + if (!(configSingleplayerPause && network_player_connected_count() == 1)) { changeLevel = play_mode_normal(); } -#else - changeLevel = play_mode_normal(); -#endif + if (sCurrPlayMode == PLAY_MODE_PAUSED) { changeLevel = play_mode_paused(); } diff --git a/src/game/object_helpers.c b/src/game/object_helpers.c index 01070542b..3cc94e649 100644 --- a/src/game/object_helpers.c +++ b/src/game/object_helpers.c @@ -1840,6 +1840,16 @@ void obj_set_cylboard(struct Object *obj) { obj->header.gfx.node.flags |= GRAPH_RENDER_CYLBOARD; } +void cur_obj_set_billboard_if_vanilla_cam(void) { + if (configEnableCamera) { + o->header.gfx.node.flags &= ~GRAPH_RENDER_BILLBOARD; + o->header.gfx.node.flags |= GRAPH_RENDER_CYLBOARD; + } else { + o->header.gfx.node.flags &= ~GRAPH_RENDER_CYLBOARD; + o->header.gfx.node.flags |= GRAPH_RENDER_BILLBOARD; + } +} + void obj_set_hitbox_radius_and_height(struct Object *o, f32 radius, f32 height) { if (o == NULL) { return; } diff --git a/src/game/object_helpers.h b/src/game/object_helpers.h index e75266cc4..9e8ef5f3c 100644 --- a/src/game/object_helpers.h +++ b/src/game/object_helpers.h @@ -204,6 +204,8 @@ void cur_obj_shake_y(f32 amount); void cur_obj_start_cam_event(UNUSED struct Object *obj, s32 cameraEvent); void set_mario_interact_hoot_if_in_range(UNUSED s32 sp0, UNUSED s32 sp4, f32 sp8); void obj_set_billboard(struct Object *obj); +void obj_set_cylboard(struct Object *obj); +void cur_obj_set_billboard_if_vanilla_cam(void); void obj_set_hitbox_radius_and_height(struct Object *o, f32 radius, f32 height); void obj_set_hurtbox_radius_and_height(struct Object *o, f32 radius, f32 height); void cur_obj_set_hitbox_radius_and_height(f32 radius, f32 height); diff --git a/src/game/paintings.c b/src/game/paintings.c index 0c0b9d77b..c55dac837 100644 --- a/src/game/paintings.c +++ b/src/game/paintings.c @@ -872,6 +872,7 @@ void painting_update_floors(struct Painting *painting) { enterRight = 0; struct Surface* surface; find_floor(m->marioObj->oPosX, m->marioObj->oPosY, m->marioObj->oPosZ, &surface); + if (surface == NULL) { continue; } s16 floorType = surface->type; /* The area in front of every painting in the game (except HMC and CotMC, which *\ diff --git a/src/pc/configfile.c b/src/pc/configfile.c index d9695962e..d97197c59 100644 --- a/src/pc/configfile.c +++ b/src/pc/configfile.c @@ -142,9 +142,6 @@ bool configUncappedFramerate = true; unsigned int configFrameLimit = 60; unsigned int configDrawDistance = 5; bool configDisablePopups = 0; -#ifdef DEVELOPMENT -bool configDisableDevPause = 1; -#endif #ifdef LUA_PROFILER bool configLuaProfiler = 1; #endif @@ -152,6 +149,7 @@ bool configDisableDownloadedModels = 0; unsigned int configInterpolationMode = 1; unsigned int configGamepadNumber = 0; bool configBackgroundGamepad = 1; +bool configSingleplayerPause = 0; static const struct ConfigOption options[] = { {.name = "fullscreen", .type = CONFIG_TYPE_BOOL, .boolValue = &configWindow.fullscreen}, @@ -245,11 +243,9 @@ static const struct ConfigOption options[] = { {.name = "coop_custom_palette_skin", .type = CONFIG_TYPE_COLOR , .colorValue = &configCustomPalette.parts[SKIN]}, {.name = "coop_custom_palette_cap", .type = CONFIG_TYPE_COLOR , .colorValue = &configCustomPalette.parts[CAP]}, {.name = "coop_stay_in_level_after_star", .type = CONFIG_TYPE_UINT , .uintValue = &configStayInLevelAfterStar}, + {.name = "coop_singleplayer_pause", .type = CONFIG_TYPE_BOOL , .boolValue = &configSingleplayerPause}, {.name = "share_lives", .type = CONFIG_TYPE_BOOL , .boolValue = &configShareLives}, {.name = "disable_popups", .type = CONFIG_TYPE_BOOL , .boolValue = &configDisablePopups}, -#ifdef DEVELOPMENT - {.name = "disable_devpause", .type = CONFIG_TYPE_BOOL , .boolValue = &configDisableDevPause}, -#endif #ifdef LUA_PROFILER {.name = "lua_profiler", .type = CONFIG_TYPE_BOOL , .boolValue = &configLuaProfiler}, #endif diff --git a/src/pc/configfile.h b/src/pc/configfile.h index abc04bcdc..d98af5066 100644 --- a/src/pc/configfile.h +++ b/src/pc/configfile.h @@ -99,14 +99,12 @@ extern bool configUncappedFramerate; extern unsigned int configFrameLimit; extern unsigned int configDrawDistance; extern bool configDisablePopups; -#ifdef DEVELOPMENT -extern bool configDisableDevPause; -#endif #ifdef LUA_PROFILER extern bool configLuaProfiler; #endif extern bool configDisableDownloadedModels; extern unsigned int configInterpolationMode; +extern bool configSingleplayerPause; void configfile_load(const char *filename); void configfile_save(const char *filename); diff --git a/src/pc/djui/djui_panel_misc.c b/src/pc/djui/djui_panel_misc.c index 9540a6bcd..27105e52e 100644 --- a/src/pc/djui/djui_panel_misc.c +++ b/src/pc/djui/djui_panel_misc.c @@ -5,35 +5,30 @@ #ifdef DEVELOPMENT void djui_panel_options_debug_create(struct DjuiBase* caller) { - f32 bodyHeight = 32 * 4 + 64 * 1 + 16 * 1; + f32 bodyHeight = 32 * 3 + 64 * 1 + 16 * 1; struct DjuiBase* defaultBase = NULL; struct DjuiThreePanel* panel = djui_panel_menu_create(bodyHeight, "\\#ff0800\\D\\#1be700\\E\\#00b3ff\\B\\#ffef00\\U\\#ff0800\\G"); struct DjuiFlowLayout* body = (struct DjuiFlowLayout*)djui_three_panel_get_body(panel); { - struct DjuiCheckbox* checkbox1 = djui_checkbox_create(&body->base, "Disable Development Pause", &configDisableDevPause); + struct DjuiCheckbox* checkbox1 = djui_checkbox_create(&body->base, "Fixed Collisions", (bool*)&gLevelValues.fixCollisionBugs); djui_base_set_size_type(&checkbox1->base, DJUI_SVT_RELATIVE, DJUI_SVT_ABSOLUTE); djui_base_set_size(&checkbox1->base, 1.0f, 32); defaultBase = &checkbox1->base; - struct DjuiCheckbox* checkbox2 = djui_checkbox_create(&body->base, "Fixed Collisions", (bool*)&gLevelValues.fixCollisionBugs); +#ifdef LUA_PROFILER + struct DjuiCheckbox* checkbox2 = djui_checkbox_create(&body->base, "Lua Profiler", &configLuaProfiler); djui_base_set_size_type(&checkbox2->base, DJUI_SVT_RELATIVE, DJUI_SVT_ABSOLUTE); djui_base_set_size(&checkbox2->base, 1.0f, 32); defaultBase = &checkbox2->base; - -#ifdef LUA_PROFILER - struct DjuiCheckbox* checkbox3 = djui_checkbox_create(&body->base, "Lua Profiler", &configLuaProfiler); - djui_base_set_size_type(&checkbox3->base, DJUI_SVT_RELATIVE, DJUI_SVT_ABSOLUTE); - djui_base_set_size(&checkbox3->base, 1.0f, 32); - defaultBase = &checkbox3->base; #endif - struct DjuiButton* button2 = djui_button_create(&body->base, "Back"); - djui_base_set_size_type(&button2->base, DJUI_SVT_RELATIVE, DJUI_SVT_ABSOLUTE); - djui_base_set_size(&button2->base, 1.0f, 64); - djui_button_set_style(button2, 1); - djui_interactable_hook_click(&button2->base, djui_panel_menu_back); + struct DjuiButton* button1 = djui_button_create(&body->base, "Back"); + djui_base_set_size_type(&button1->base, DJUI_SVT_RELATIVE, DJUI_SVT_ABSOLUTE); + djui_base_set_size(&button1->base, 1.0f, 64); + djui_button_set_style(button1, 1); + djui_interactable_hook_click(&button1->base, djui_panel_menu_back); } djui_panel_add(caller, &panel->base, defaultBase); @@ -42,9 +37,9 @@ void djui_panel_options_debug_create(struct DjuiBase* caller) { void djui_panel_misc_create(struct DjuiBase* caller) { #ifdef DEVELOPMENT - f32 bodyHeight = 64 * 3 + 16 * 2; + f32 bodyHeight = 64 * 4 + 16 * 3; #else - f32 bodyHeight = 64 * 2 + 16 * 1; + f32 bodyHeight = 64 * 3 + 16 * 2; #endif struct DjuiBase* defaultBase = NULL; @@ -52,11 +47,15 @@ void djui_panel_misc_create(struct DjuiBase* caller) { struct DjuiFlowLayout* body = (struct DjuiFlowLayout*)djui_three_panel_get_body(panel); { + struct DjuiCheckbox* checkbox1 = djui_checkbox_create(&body->base, "Pause In Singleplayer", &configSingleplayerPause); + djui_base_set_size_type(&checkbox1->base, DJUI_SVT_RELATIVE, DJUI_SVT_ABSOLUTE); + djui_base_set_size(&checkbox1->base, 1.0f, 32); + defaultBase = &checkbox1->base; + struct DjuiButton* button1 = djui_button_create(&body->base, "Menu Options"); djui_base_set_size_type(&button1->base, DJUI_SVT_RELATIVE, DJUI_SVT_ABSOLUTE); djui_base_set_size(&button1->base, 1.0f, 64); djui_interactable_hook_click(&button1->base, djui_panel_main_menu_create); - defaultBase = &button1->base; #ifdef DEVELOPMENT struct DjuiButton* button2 = djui_button_create(&body->base, "Debug"); diff --git a/src/pc/lua/smlua_cobject_autogen.c b/src/pc/lua/smlua_cobject_autogen.c index 25c5ad4ba..13efee1fe 100644 --- a/src/pc/lua/smlua_cobject_autogen.c +++ b/src/pc/lua/smlua_cobject_autogen.c @@ -208,7 +208,7 @@ static struct LuaObjectField sBehaviorTrajectoriesFields[LUA_BEHAVIOR_TRAJECTORI { "UnagiTrajectory", LVT_TRAJECTORY_P, offsetof(struct BehaviorTrajectories, UnagiTrajectory), false, LOT_POINTER }, }; -#define LUA_BEHAVIOR_VALUES_FIELD_COUNT 26 +#define LUA_BEHAVIOR_VALUES_FIELD_COUNT 27 static struct LuaObjectField sBehaviorValuesFields[LUA_BEHAVIOR_VALUES_FIELD_COUNT] = { { "BowlingBallBob2Speed", LVT_F32, offsetof(struct BehaviorValues, BowlingBallBob2Speed), false, LOT_NONE }, { "BowlingBallBobSpeed", LVT_F32, offsetof(struct BehaviorValues, BowlingBallBobSpeed), false, LOT_NONE }, @@ -229,6 +229,7 @@ static struct LuaObjectField sBehaviorValuesFields[LUA_BEHAVIOR_VALUES_FIELD_COU { "RacingPenguinBigRadius", LVT_F32, offsetof(struct BehaviorValues, RacingPenguinBigRadius), false, LOT_NONE }, { "RacingPenguinHeight", LVT_F32, offsetof(struct BehaviorValues, RacingPenguinHeight), false, LOT_NONE }, { "RacingPenguinRadius", LVT_F32, offsetof(struct BehaviorValues, RacingPenguinRadius), false, LOT_NONE }, + { "RespawnShellBoxes", LVT_U8, offsetof(struct BehaviorValues, RespawnShellBoxes), false, LOT_NONE }, { "ShowStarMilestones", LVT_U8, offsetof(struct BehaviorValues, ShowStarMilestones), false, LOT_NONE }, { "ToadStar1Requirement", LVT_U16, offsetof(struct BehaviorValues, ToadStar1Requirement), false, LOT_NONE }, { "ToadStar2Requirement", LVT_U16, offsetof(struct BehaviorValues, ToadStar2Requirement), false, LOT_NONE }, @@ -726,10 +727,11 @@ static struct LuaObjectField sLakituStateFields[LUA_LAKITU_STATE_FIELD_COUNT] = { "yaw", LVT_S16, offsetof(struct LakituState, yaw), false, LOT_NONE }, }; -#define LUA_LEVEL_VALUES_FIELD_COUNT 21 +#define LUA_LEVEL_VALUES_FIELD_COUNT 26 static struct LuaObjectField sLevelValuesFields[LUA_LEVEL_VALUES_FIELD_COUNT] = { { "cellHeightLimit", LVT_S16, offsetof(struct LevelValues, cellHeightLimit), false, LOT_NONE }, { "coinsRequiredForCoinStar", LVT_S16, offsetof(struct LevelValues, coinsRequiredForCoinStar), false, LOT_NONE }, + { "disableActs", LVT_BOOL, offsetof(struct LevelValues, disableActs), false, LOT_NONE }, { "entryLevel", LVT_S32, offsetof(struct LevelValues, entryLevel), false, LOT_NONE }, { "exitCastleArea", LVT_S16, offsetof(struct LevelValues, exitCastleArea), false, LOT_NONE }, { "exitCastleLevel", LVT_S32, offsetof(struct LevelValues, exitCastleLevel), false, LOT_NONE }, @@ -741,14 +743,18 @@ static struct LuaObjectField sLevelValuesFields[LUA_LEVEL_VALUES_FIELD_COUNT] = { "floorLowerLimitShadow", LVT_S16, offsetof(struct LevelValues, floorLowerLimitShadow), false, LOT_NONE }, { "metalCapDuration", LVT_U16, offsetof(struct LevelValues, metalCapDuration), false, LOT_NONE }, { "metalCapDurationCotmc", LVT_U16, offsetof(struct LevelValues, metalCapDurationCotmc), false, LOT_NONE }, + { "pauseExitAnywhere", LVT_BOOL, offsetof(struct LevelValues, pauseExitAnywhere), false, LOT_NONE }, + { "metalCapSequence", LVT_U8, offsetof(struct LevelValues, metalCapSequence), false, LOT_NONE }, { "pssSlideStarIndex", LVT_U8, offsetof(struct LevelValues, pssSlideStarIndex), false, LOT_NONE }, { "pssSlideStarTime", LVT_U16, offsetof(struct LevelValues, pssSlideStarTime), false, LOT_NONE }, { "skipCreditsAt", LVT_S32, offsetof(struct LevelValues, skipCreditsAt), false, LOT_NONE }, { "starPositions", LVT_COBJECT, offsetof(struct LevelValues, starPositions), true, LOT_STARPOSITIONS }, { "vanishCapDuration", LVT_U16, offsetof(struct LevelValues, vanishCapDuration), false, LOT_NONE }, { "vanishCapDurationVcutm", LVT_U16, offsetof(struct LevelValues, vanishCapDurationVcutm), false, LOT_NONE }, + { "vanishCapSequence", LVT_U8, offsetof(struct LevelValues, vanishCapSequence), false, LOT_NONE }, { "wingCapDuration", LVT_U16, offsetof(struct LevelValues, wingCapDuration), false, LOT_NONE }, { "wingCapDurationTotwc", LVT_U16, offsetof(struct LevelValues, wingCapDurationTotwc), false, LOT_NONE }, + { "wingCapSequence", LVT_U8, offsetof(struct LevelValues, wingCapSequence), false, LOT_NONE }, }; #define LUA_LINEAR_TRANSITION_POINT_FIELD_COUNT 5 diff --git a/src/pc/lua/smlua_constants_autogen.c b/src/pc/lua/smlua_constants_autogen.c index ce761e17d..a2475c2ff 100644 --- a/src/pc/lua/smlua_constants_autogen.c +++ b/src/pc/lua/smlua_constants_autogen.c @@ -3976,4 +3976,7 @@ char gSmluaConstants[] = "" "COOP_OBJ_FLAG_NETWORK = (1 << 0)\n" "COOP_OBJ_FLAG_LUA = (1 << 1)\n" "COOP_OBJ_FLAG_NON_SYNC = (1 << 2)\n" +"VERSION_NUMBER = 31\n" +"MINOR_VERSION_NUMBER = 0\n" +"MAX_VERSION_LENGTH = 10\n" ; \ No newline at end of file diff --git a/src/pc/lua/smlua_functions.c b/src/pc/lua/smlua_functions.c index 23c60b378..9f595df58 100644 --- a/src/pc/lua/smlua_functions.c +++ b/src/pc/lua/smlua_functions.c @@ -10,6 +10,8 @@ #include "object_fields.h" #include "engine/math_util.h" #include "pc/djui/djui_hud_utils.h" +#include "include/level_misc_macros.h" +#include "include/macro_presets.h" bool smlua_functions_valid_param_count(lua_State* L, int expected) { int top = lua_gettop(L); @@ -459,6 +461,122 @@ int smlua_func_djui_hud_render_texture_tile_interpolated(lua_State* L) { return 1; } + //////////////////////////////// + // level script preprocessing // +//////////////////////////////// + +struct LuaLevelScriptParse { + int reference; + struct Mod* mod; +}; + +struct LuaLevelScriptParse sLevelScriptParse = { 0 }; + +s32 smlua_func_level_script_parse_callback(u8 type, void *cmd) { + if (type != 0x24 && type != 0x39 && type != 0x1F) { + return 0; + } + lua_State* L = gLuaState; + if (L == NULL) { return 0; } + struct LuaLevelScriptParse* preprocess = &sLevelScriptParse; + + lua_rawgeti(L, LUA_REGISTRYINDEX, preprocess->reference); + + if (type == 0x1F) { + u8 area = (u8) dynos_level_cmd_get(cmd, 2); + lua_pushinteger(L, area); + } else { + lua_pushnil(L); + } + + if (type == 0x24) { + const BehaviorScript *bhv = (const BehaviorScript *) dynos_level_cmd_get(cmd, 20); + u32 behaviorArg = (u32) dynos_level_cmd_get(cmd, 16); + + lua_newtable(L); + + lua_pushstring(L, "behavior"); + lua_pushinteger(L, get_id_from_behavior(bhv)); + lua_settable(L, -3); + + lua_pushstring(L, "behaviorArg"); + lua_pushinteger(L, behaviorArg); + lua_settable(L, -3); + } else { + lua_pushnil(L); + } + + if (type == 0x39) { + MacroObject *data = (MacroObject *) dynos_level_cmd_get(cmd, 4); + int i = 0; + s32 len = 0; + + lua_newtable(L); + int t = lua_gettop(gLuaState); + + lua_newtable(L); + int args = lua_gettop(gLuaState); + while (data[len++] != MACRO_OBJECT_END()) { + s32 presetId = (s32) ((data[len - 1] & 0x1FF) - 0x1F); + const BehaviorScript *bhv = (const BehaviorScript *) MacroObjectPresets[presetId].behavior; + s32 presetParams = MacroObjectPresets[presetId].param; + s32 objParams = (data[4] & 0xFF00) + (presetParams & 0x00FF); + u32 behaviorArg = ((objParams & 0x00FF) << 16) + (objParams & 0xFF00); + + lua_pushinteger(L, i); + lua_pushinteger(L, get_id_from_behavior(bhv)); + lua_settable(L, t); + + lua_pushinteger(L, i); + lua_pushinteger(L, behaviorArg); + lua_settable(L, args); + + i++; + len += 4; + } + } else { + lua_pushnil(L); + lua_pushnil(L); + } + + // call the callback + if (0 != smlua_call_hook(L, 4, 0, 0, preprocess->mod)) { + LOG_LUA("Failed to call the callback behaviors: %u", type); + return 0; + } +} + +void smlua_func_level_script_parse(lua_State* L) { + if (!smlua_functions_valid_param_count(L, 2)) { return; } + + lua_Integer levelNum = smlua_to_integer(L, 1); + if (!gSmLuaConvertSuccess) { + LOG_LUA_LINE("Invalid level script name"); + return; + } + + struct LuaLevelScriptParse* preprocess = &sLevelScriptParse; + preprocess->reference = LUA_NOREF; + + lua_pushvalue(L, 2); + int ref = luaL_ref(L, LUA_REGISTRYINDEX); + + if (ref == -1) { + LOG_LUA_LINE("Level Script Parse: %lld tried to parse using undefined function", levelNum); + return; + } + + preprocess->reference = ref; + preprocess->mod = gLuaActiveMod; + + void *script = dynos_level_get_script(levelNum); + if (script == NULL) { + LOG_LUA("Failed to find script: %lld", levelNum); + return; + } + dynos_level_parse_script(script, smlua_func_level_script_parse_callback); +} + ////////// // bind // ////////// @@ -482,4 +600,5 @@ void smlua_bind_functions(void) { smlua_bind_function(L, "djui_hud_render_texture_tile", smlua_func_djui_hud_render_texture_tile); smlua_bind_function(L, "djui_hud_render_texture_interpolated", smlua_func_djui_hud_render_texture_interpolated); smlua_bind_function(L, "djui_hud_render_texture_tile_interpolated", smlua_func_djui_hud_render_texture_tile_interpolated); + smlua_bind_function(L, "level_script_parse", smlua_func_level_script_parse); } diff --git a/src/pc/lua/smlua_functions_autogen.c b/src/pc/lua/smlua_functions_autogen.c index b18878875..fc30a97d9 100644 --- a/src/pc/lua/smlua_functions_autogen.c +++ b/src/pc/lua/smlua_functions_autogen.c @@ -22252,6 +22252,22 @@ int smlua_func_cur_obj_set_behavior(lua_State* L) { return 1; } +int smlua_func_cur_obj_set_billboard_if_vanilla_cam(UNUSED lua_State* L) { + if (L == NULL) { return 0; } + + int top = lua_gettop(L); + if (top != 0) { + LOG_LUA_LINE("Improper param count for '%s': Expected %u, Received %u", "cur_obj_set_billboard_if_vanilla_cam", 0, top); + return 0; + } + + + extern void cur_obj_set_billboard_if_vanilla_cam(void); + cur_obj_set_billboard_if_vanilla_cam(); + + return 1; +} + int smlua_func_cur_obj_set_direction_table(lua_State* L) { if (L == NULL) { return 0; } @@ -27783,6 +27799,33 @@ int smlua_func_obj_set_vel(lua_State* L) { return 1; } +int smlua_func_set_whirlpools(lua_State* L) { + if (L == NULL) { return 0; } + + int top = lua_gettop(L); + if (top != 6) { + LOG_LUA_LINE("Improper param count for '%s': Expected %u, Received %u", "set_whirlpools", 6, top); + return 0; + } + + f32 x = smlua_to_number(L, 1); + if (!gSmLuaConvertSuccess) { LOG_LUA("Failed to convert parameter %u for function '%s'", 1, "set_whirlpools"); return 0; } + f32 y = smlua_to_number(L, 2); + if (!gSmLuaConvertSuccess) { LOG_LUA("Failed to convert parameter %u for function '%s'", 2, "set_whirlpools"); return 0; } + f32 z = smlua_to_number(L, 3); + if (!gSmLuaConvertSuccess) { LOG_LUA("Failed to convert parameter %u for function '%s'", 3, "set_whirlpools"); return 0; } + s16 strength = smlua_to_integer(L, 4); + if (!gSmLuaConvertSuccess) { LOG_LUA("Failed to convert parameter %u for function '%s'", 4, "set_whirlpools"); return 0; } + s16 area = smlua_to_integer(L, 5); + if (!gSmLuaConvertSuccess) { LOG_LUA("Failed to convert parameter %u for function '%s'", 5, "set_whirlpools"); return 0; } + s32 index = smlua_to_integer(L, 6); + if (!gSmLuaConvertSuccess) { LOG_LUA("Failed to convert parameter %u for function '%s'", 6, "set_whirlpools"); return 0; } + + set_whirlpools(x, y, z, strength, area, index); + + return 1; +} + int smlua_func_spawn_non_sync_object(lua_State* L) { if (L == NULL) { return 0; } @@ -29874,6 +29917,7 @@ void smlua_bind_functions_autogen(void) { smlua_bind_function(L, "cur_obj_scale", smlua_func_cur_obj_scale); smlua_bind_function(L, "cur_obj_scale_over_time", smlua_func_cur_obj_scale_over_time); smlua_bind_function(L, "cur_obj_set_behavior", smlua_func_cur_obj_set_behavior); + smlua_bind_function(L, "cur_obj_set_billboard_if_vanilla_cam", smlua_func_cur_obj_set_billboard_if_vanilla_cam); smlua_bind_function(L, "cur_obj_set_direction_table", smlua_func_cur_obj_set_direction_table); smlua_bind_function(L, "cur_obj_set_face_angle_to_move_angle", smlua_func_cur_obj_set_face_angle_to_move_angle); smlua_bind_function(L, "cur_obj_set_hitbox_and_die_if_attacked", smlua_func_cur_obj_set_hitbox_and_die_if_attacked); @@ -30168,6 +30212,7 @@ void smlua_bind_functions_autogen(void) { smlua_bind_function(L, "obj_move_xyz", smlua_func_obj_move_xyz); smlua_bind_function(L, "obj_set_model_extended", smlua_func_obj_set_model_extended); smlua_bind_function(L, "obj_set_vel", smlua_func_obj_set_vel); + smlua_bind_function(L, "set_whirlpools", smlua_func_set_whirlpools); smlua_bind_function(L, "spawn_non_sync_object", smlua_func_spawn_non_sync_object); smlua_bind_function(L, "spawn_sync_object", smlua_func_spawn_sync_object); diff --git a/src/pc/lua/smlua_hooks.c b/src/pc/lua/smlua_hooks.c index 26a5bdf18..62dc571f2 100644 --- a/src/pc/lua/smlua_hooks.c +++ b/src/pc/lua/smlua_hooks.c @@ -90,11 +90,16 @@ int smlua_call_hook(lua_State* L, int nargs, int nresults, int errfunc, struct M gLuaActiveMod = activeMod; gLuaLastHookMod = activeMod; #if defined(LUA_PROFILER) - lua_profiler_start_counter(activeMod); + extern bool configLuaProfiler; + if (configLuaProfiler) { + lua_profiler_start_counter(activeMod); + } #endif int rc = smlua_pcall(L, nargs, nresults, errfunc); #if defined(LUA_PROFILER) - lua_profiler_stop_counter(activeMod); + if (configLuaProfiler) { + lua_profiler_stop_counter(activeMod); + } #endif gLuaActiveMod = prev; return rc; diff --git a/src/pc/lua/utils/smlua_obj_utils.c b/src/pc/lua/utils/smlua_obj_utils.c index 4f2a83e15..2dff1e9c6 100644 --- a/src/pc/lua/utils/smlua_obj_utils.c +++ b/src/pc/lua/utils/smlua_obj_utils.c @@ -383,3 +383,13 @@ void obj_move_xyz(struct Object *o, f32 dx, f32 dy, f32 dz) { o->oPosY += dy; o->oPosZ += dz; } + +void set_whirlpools(f32 x, f32 y, f32 z, s16 strength, s16 area, s32 index) { + static struct Whirlpool whirlpool; + + gAreas[area].whirlpools[index] = &whirlpool; + gAreas[area].whirlpools[index]->pos[0] = x; + gAreas[area].whirlpools[index]->pos[1] = y; + gAreas[area].whirlpools[index]->pos[2] = z; + gAreas[area].whirlpools[index]->strength = strength; +} diff --git a/src/pc/lua/utils/smlua_obj_utils.h b/src/pc/lua/utils/smlua_obj_utils.h index c4e73d460..6fc395cd9 100644 --- a/src/pc/lua/utils/smlua_obj_utils.h +++ b/src/pc/lua/utils/smlua_obj_utils.h @@ -53,5 +53,6 @@ bool obj_check_overlap_with_hitbox_params(struct Object *o, f32 x, f32 y, f32 z, void obj_set_vel(struct Object *o, f32 vx, f32 vy, f32 vz); void obj_move_xyz(struct Object *o, f32 dx, f32 dy, f32 dz); +void set_whirlpools(f32 x, f32 y, f32 z, s16 strength, s16 area, s32 index); #endif diff --git a/src/pc/network/version.c b/src/pc/network/version.c index dca26ad1a..ddf37c1e4 100644 --- a/src/pc/network/version.c +++ b/src/pc/network/version.c @@ -3,9 +3,9 @@ #include "types.h" static char sVersionString[MAX_VERSION_LENGTH] = { 0 }; -#define VERSION_TEXT "beta " +#define VERSION_TEXT "beta" char* get_version(void) { - snprintf(sVersionString, MAX_VERSION_LENGTH, "%s%d.%d", VERSION_TEXT, VERSION_NUMBER, MINOR_VERSION_NUMBER); + snprintf(sVersionString, MAX_VERSION_LENGTH, "%s %d.%d", VERSION_TEXT, VERSION_NUMBER, MINOR_VERSION_NUMBER); return sVersionString; } \ No newline at end of file