diff --git a/autogen/convert_functions.py b/autogen/convert_functions.py index 5d4847405..cf98b7486 100644 --- a/autogen/convert_functions.py +++ b/autogen/convert_functions.py @@ -55,7 +55,7 @@ in_files = [ ] override_allowed_functions = { - "src/audio/external.h": [ " play_", "fade", "current_background" ], + "src/audio/external.h": [ " play_", "fade", "current_background", "stop_" ], "src/game/rumble_init.c": [ "queue_rumble_", "reset_rumble_timers" ], "src/pc/djui/djui_popup.h" : [ "create" ], "src/game/save_file.h": [ "save_file_get_", "save_file_set_flags", "save_file_clear_flags", "save_file_erase", "save_file_reload", "save_file_set_star_flags" ], diff --git a/autogen/lua_definitions/functions.lua b/autogen/lua_definitions/functions.lua index 5f264a9ad..71002c917 100644 --- a/autogen/lua_definitions/functions.lua +++ b/autogen/lua_definitions/functions.lua @@ -3257,6 +3257,12 @@ function resolve_geometry_collisions(pos, lastGood) -- ... end +--- @param enable integer +--- @return nil +function rom_hack_cam_set_collisions(enable) + -- ... +end + --- @param c Camera --- @param cPos Vec3f --- @param avoidYaw Pointer_integer @@ -3809,6 +3815,30 @@ function seq_player_unlower_volume(player, fadeDuration) -- ... end +--- @param seqId integer +--- @return nil +function stop_background_music(seqId) + -- ... +end + +--- @param soundBits integer +--- @param pos Vec3f +--- @return nil +function stop_sound(soundBits, pos) + -- ... +end + +--- @param pos Vec3f +--- @return nil +function stop_sounds_from_source(pos) + -- ... +end + +--- @return nil +function stop_sounds_in_continuous_banks() + -- ... +end + --- @param m MarioState --- @return integer function does_mario_have_normal_cap_on_head(m) @@ -7634,6 +7664,11 @@ function get_current_save_file_num() -- ... end +--- @return integer +function get_dialog_id() + -- ... +end + --- @param index integer --- @return number function get_environment_region(index) diff --git a/docs/lua/functions-3.md b/docs/lua/functions-3.md index 29b418cb8..8c1d1861a 100644 --- a/docs/lua/functions-3.md +++ b/docs/lua/functions-3.md @@ -1084,6 +1084,26 @@
+## [rom_hack_cam_set_collisions](#rom_hack_cam_set_collisions) + +### Lua Example +`rom_hack_cam_set_collisions(enable)` + +### Parameters +| Field | Type | +| ----- | ---- | +| enable | `integer` | + +### Returns +- None + +### C Prototype +`void rom_hack_cam_set_collisions(u8 enable);` + +[:arrow_up_small:](#) + +
+ ## [rotate_camera_around_walls](#rotate_camera_around_walls) ### Lua Example @@ -2768,6 +2788,85 @@
+## [stop_background_music](#stop_background_music) + +### Lua Example +`stop_background_music(seqId)` + +### Parameters +| Field | Type | +| ----- | ---- | +| seqId | `integer` | + +### Returns +- None + +### C Prototype +`void stop_background_music(u16 seqId);` + +[:arrow_up_small:](#) + +
+ +## [stop_sound](#stop_sound) + +### Lua Example +`stop_sound(soundBits, pos)` + +### Parameters +| Field | Type | +| ----- | ---- | +| soundBits | `integer` | +| pos | [Vec3f](structs.md#Vec3f) | + +### Returns +- None + +### C Prototype +`void stop_sound(u32 soundBits, f32 *pos);` + +[:arrow_up_small:](#) + +
+ +## [stop_sounds_from_source](#stop_sounds_from_source) + +### Lua Example +`stop_sounds_from_source(pos)` + +### Parameters +| Field | Type | +| ----- | ---- | +| pos | [Vec3f](structs.md#Vec3f) | + +### Returns +- None + +### C Prototype +`void stop_sounds_from_source(f32 *pos);` + +[:arrow_up_small:](#) + +
+ +## [stop_sounds_in_continuous_banks](#stop_sounds_in_continuous_banks) + +### Lua Example +`stop_sounds_in_continuous_banks()` + +### Parameters +- None + +### Returns +- None + +### C Prototype +`void stop_sounds_in_continuous_banks(void);` + +[:arrow_up_small:](#) + +
+ --- # functions from interaction.h diff --git a/docs/lua/functions-4.md b/docs/lua/functions-4.md index db18a1cf7..3f3912212 100644 --- a/docs/lua/functions-4.md +++ b/docs/lua/functions-4.md @@ -6766,6 +6766,24 @@
+## [get_dialog_id](#get_dialog_id) + +### Lua Example +`local integerValue = get_dialog_id()` + +### Parameters +- None + +### Returns +- `integer` + +### C Prototype +`s16 get_dialog_id(void);` + +[:arrow_up_small:](#) + +
+ ## [get_environment_region](#get_environment_region) ### Lua Example diff --git a/docs/lua/functions.md b/docs/lua/functions.md index 8b9b1ebb7..522e45575 100644 --- a/docs/lua/functions.md +++ b/docs/lua/functions.md @@ -648,6 +648,7 @@ - [random_vec3s](functions-3.md#random_vec3s) - [reset_camera](functions-3.md#reset_camera) - [resolve_geometry_collisions](functions-3.md#resolve_geometry_collisions) + - [rom_hack_cam_set_collisions](functions-3.md#rom_hack_cam_set_collisions) - [rotate_camera_around_walls](functions-3.md#rotate_camera_around_walls) - [rotate_in_xz](functions-3.md#rotate_in_xz) - [rotate_in_yz](functions-3.md#rotate_in_yz) @@ -748,6 +749,10 @@ - [seq_player_fade_out](functions-3.md#seq_player_fade_out) - [seq_player_lower_volume](functions-3.md#seq_player_lower_volume) - [seq_player_unlower_volume](functions-3.md#seq_player_unlower_volume) + - [stop_background_music](functions-3.md#stop_background_music) + - [stop_sound](functions-3.md#stop_sound) + - [stop_sounds_from_source](functions-3.md#stop_sounds_from_source) + - [stop_sounds_in_continuous_banks](functions-3.md#stop_sounds_in_continuous_banks)
@@ -1424,6 +1429,7 @@ - [camera_unfreeze](functions-4.md#camera_unfreeze) - [deref_s32_pointer](functions-4.md#deref_s32_pointer) - [get_current_save_file_num](functions-4.md#get_current_save_file_num) + - [get_dialog_id](functions-4.md#get_dialog_id) - [get_environment_region](functions-4.md#get_environment_region) - [get_hand_foot_pos_x](functions-4.md#get_hand_foot_pos_x) - [get_hand_foot_pos_y](functions-4.md#get_hand_foot_pos_y) diff --git a/src/game/camera.c b/src/game/camera.c index 52a5f715a..0cd32df7b 100644 --- a/src/game/camera.c +++ b/src/game/camera.c @@ -11749,10 +11749,19 @@ static u8 sRomHackZoom = 1; static s8 sRomHackIsUpdate = 0; static f32 sRomHackWaterFocus = 0; static f32 sRomHackWaterPitchOffset = 0; +u8 gRomHackCamSetCollisions = TRUE; + +void rom_hack_cam_set_collisions(u8 enable) { + gRomHackCamSetCollisions = enable; +} static u8 rom_hack_cam_can_see_mario(Vec3f desiredPos) { // do collision checking struct Surface *surf = NULL; + if (!gRomHackCamSetCollisions) { + return true; + } + f32 floorHeight = find_floor(desiredPos[0], desiredPos[1], desiredPos[2], &surf); if (surf == NULL || floorHeight <= -11000) { return false; diff --git a/src/game/camera.h b/src/game/camera.h index 9177920b7..c54720318 100644 --- a/src/game/camera.h +++ b/src/game/camera.h @@ -784,5 +784,6 @@ Gfx *geo_camera_fov(s32 callContext, struct GraphNode *g, UNUSED void *context); s32 set_camera_mode_fixed(struct Camera* c, s16 x, s16 y, s16 z); void camera_set_use_course_specific_settings(u8 enable); +void rom_hack_cam_set_collisions(u8 enable); #endif // CAMERA_H diff --git a/src/game/level_update.c b/src/game/level_update.c index 056319adc..498f08560 100644 --- a/src/game/level_update.c +++ b/src/game/level_update.c @@ -525,6 +525,10 @@ void init_mario_after_warp(void) { network_player_update_course_level(gNetworkPlayerLocal, gCurrCourseNum, gCurrActStarNum, gCurrLevelNum, gCurrAreaIndex); } + if (gMarioState->health <= 0x110) { + gMarioState->health = 0x880; + } + smlua_call_event_hooks(HOOK_ON_WARP); } @@ -845,7 +849,8 @@ s16 level_trigger_warp(struct MarioState *m, s32 warpOp) { break; case WARP_OP_DEATH: - if (m->numLives <= 0) { + m->numLives--; + if (m->numLives <= -1) { sDelayedWarpOp = WARP_OP_GAME_OVER; } sDelayedWarpTimer = 48; @@ -863,7 +868,8 @@ s16 level_trigger_warp(struct MarioState *m, s32 warpOp) { case WARP_OP_WARP_FLOOR: sSourceWarpNodeId = WARP_NODE_WARP_FLOOR; if (area_get_warp_node(sSourceWarpNodeId) == NULL) { - if (m->numLives <= 0) { + m->numLives--; + if (m->numLives <= -1) { sDelayedWarpOp = WARP_OP_GAME_OVER; } else { sSourceWarpNodeId = WARP_NODE_DEATH; diff --git a/src/game/mario_actions_automatic.c b/src/game/mario_actions_automatic.c index 9b0466ee6..f3c2d542c 100644 --- a/src/game/mario_actions_automatic.c +++ b/src/game/mario_actions_automatic.c @@ -1023,7 +1023,7 @@ s32 act_bubbled(struct MarioState* m) { // make invisible on -1 lives if (m->playerIndex == 0) { - if (m->numLives == -1) { + if (m->numLives <= -1) { m->marioObj->header.gfx.node.flags |= GRAPH_RENDER_INVISIBLE; level_trigger_warp(m, WARP_OP_DEATH); return set_mario_action(m, ACT_SOFT_BONK, 0); diff --git a/src/game/mario_actions_cutscene.c b/src/game/mario_actions_cutscene.c index 874fc2186..24640edcd 100644 --- a/src/game/mario_actions_cutscene.c +++ b/src/game/mario_actions_cutscene.c @@ -1360,7 +1360,6 @@ s32 act_death_exit(struct MarioState *m) { play_character_sound(m, CHAR_SOUND_OOOF2); #endif queue_rumble_data_mario(m, 5, 80); - m->numLives--; // restore 7.75 units of health m->healCounter = 31; } @@ -1376,7 +1375,6 @@ s32 act_unused_death_exit(struct MarioState *m) { #else play_character_sound(m, CHAR_SOUND_OOOF2); #endif - m->numLives--; // restore 7.75 units of health m->healCounter = 31; } @@ -1393,7 +1391,6 @@ s32 act_falling_death_exit(struct MarioState *m) { play_character_sound(m, CHAR_SOUND_OOOF2); #endif queue_rumble_data_mario(m, 5, 80); - m->numLives--; // restore 7.75 units of health m->healCounter = 31; } @@ -1438,7 +1435,6 @@ s32 act_special_death_exit(struct MarioState *m) { if (launch_mario_until_land(m, ACT_HARD_BACKWARD_GROUND_KB, MARIO_ANIM_BACKWARD_AIR_KB, -24.0f)) { queue_rumble_data_mario(m, 5, 80); - m->numLives--; m->healCounter = 31; } // show Mario diff --git a/src/game/object_helpers.c b/src/game/object_helpers.c index 2f86903a6..94bf3d770 100644 --- a/src/game/object_helpers.c +++ b/src/game/object_helpers.c @@ -1341,7 +1341,9 @@ void obj_mark_for_deletion(struct Object *obj) { // setting it to 0 could potentially enable unexpected behavior. After an // object is marked for deletion, it still updates on that frame (I think), // so this is worth looking into. - obj->activeFlags = ACTIVE_FLAG_DEACTIVATED; + if (obj != NULL) { + obj->activeFlags = ACTIVE_FLAG_DEACTIVATED; + } } void cur_obj_disable(void) { diff --git a/src/pc/lua/smlua_functions_autogen.c b/src/pc/lua/smlua_functions_autogen.c index e98743531..b88d07edc 100644 --- a/src/pc/lua/smlua_functions_autogen.c +++ b/src/pc/lua/smlua_functions_autogen.c @@ -6450,6 +6450,17 @@ int smlua_func_resolve_geometry_collisions(lua_State* L) { return 1; } +int smlua_func_rom_hack_cam_set_collisions(lua_State* L) { + if(!smlua_functions_valid_param_count(L, 1)) { return 0; } + + u8 enable = smlua_to_integer(L, 1); + if (!gSmLuaConvertSuccess) { LOG_LUA("Failed to convert parameter 1 for function 'rom_hack_cam_set_collisions'"); return 0; } + + rom_hack_cam_set_collisions(enable); + + return 1; +} + int smlua_func_rotate_camera_around_walls(lua_State* L) { if(!smlua_functions_valid_param_count(L, 4)) { return 0; } @@ -7678,6 +7689,66 @@ int smlua_func_seq_player_unlower_volume(lua_State* L) { return 1; } +int smlua_func_stop_background_music(lua_State* L) { + if(!smlua_functions_valid_param_count(L, 1)) { return 0; } + + u16 seqId = smlua_to_integer(L, 1); + if (!gSmLuaConvertSuccess) { LOG_LUA("Failed to convert parameter 1 for function 'stop_background_music'"); return 0; } + + stop_background_music(seqId); + + return 1; +} + +int smlua_func_stop_sound(lua_State* L) { + if(!smlua_functions_valid_param_count(L, 2)) { return 0; } + + u32 soundBits = smlua_to_integer(L, 1); + if (!gSmLuaConvertSuccess) { LOG_LUA("Failed to convert parameter 1 for function 'stop_sound'"); return 0; } + + f32* pos = smlua_get_vec3f_from_buffer(); + pos[0] = smlua_get_number_field(2, "x"); + pos[1] = smlua_get_number_field(2, "y"); + pos[2] = smlua_get_number_field(2, "z"); + if (!gSmLuaConvertSuccess) { LOG_LUA("Failed to convert parameter 2 for function 'stop_sound'"); return 0; } + + stop_sound(soundBits, pos); + + smlua_push_number_field(2, "x", pos[0]); + smlua_push_number_field(2, "y", pos[1]); + smlua_push_number_field(2, "z", pos[2]); + + return 1; +} + +int smlua_func_stop_sounds_from_source(lua_State* L) { + if(!smlua_functions_valid_param_count(L, 1)) { return 0; } + + + f32* pos = smlua_get_vec3f_from_buffer(); + pos[0] = smlua_get_number_field(1, "x"); + pos[1] = smlua_get_number_field(1, "y"); + pos[2] = smlua_get_number_field(1, "z"); + if (!gSmLuaConvertSuccess) { LOG_LUA("Failed to convert parameter 1 for function 'stop_sounds_from_source'"); return 0; } + + stop_sounds_from_source(pos); + + smlua_push_number_field(1, "x", pos[0]); + smlua_push_number_field(1, "y", pos[1]); + smlua_push_number_field(1, "z", pos[2]); + + return 1; +} + +int smlua_func_stop_sounds_in_continuous_banks(UNUSED lua_State* L) { + if(!smlua_functions_valid_param_count(L, 0)) { return 0; } + + + stop_sounds_in_continuous_banks(); + + return 1; +} + /////////////////// // interaction.h // /////////////////// @@ -16817,6 +16888,15 @@ int smlua_func_get_current_save_file_num(UNUSED lua_State* L) { return 1; } +int smlua_func_get_dialog_id(UNUSED lua_State* L) { + if(!smlua_functions_valid_param_count(L, 0)) { return 0; } + + + lua_pushinteger(L, get_dialog_id()); + + return 1; +} + int smlua_func_get_environment_region(lua_State* L) { if(!smlua_functions_valid_param_count(L, 1)) { return 0; } @@ -18598,6 +18678,7 @@ void smlua_bind_functions_autogen(void) { smlua_bind_function(L, "random_vec3s", smlua_func_random_vec3s); smlua_bind_function(L, "reset_camera", smlua_func_reset_camera); smlua_bind_function(L, "resolve_geometry_collisions", smlua_func_resolve_geometry_collisions); + smlua_bind_function(L, "rom_hack_cam_set_collisions", smlua_func_rom_hack_cam_set_collisions); smlua_bind_function(L, "rotate_camera_around_walls", smlua_func_rotate_camera_around_walls); smlua_bind_function(L, "rotate_in_xz", smlua_func_rotate_in_xz); smlua_bind_function(L, "rotate_in_yz", smlua_func_rotate_in_yz); @@ -18688,6 +18769,10 @@ void smlua_bind_functions_autogen(void) { smlua_bind_function(L, "seq_player_fade_out", smlua_func_seq_player_fade_out); smlua_bind_function(L, "seq_player_lower_volume", smlua_func_seq_player_lower_volume); smlua_bind_function(L, "seq_player_unlower_volume", smlua_func_seq_player_unlower_volume); + smlua_bind_function(L, "stop_background_music", smlua_func_stop_background_music); + smlua_bind_function(L, "stop_sound", smlua_func_stop_sound); + smlua_bind_function(L, "stop_sounds_from_source", smlua_func_stop_sounds_from_source); + smlua_bind_function(L, "stop_sounds_in_continuous_banks", smlua_func_stop_sounds_in_continuous_banks); // interaction.h smlua_bind_function(L, "does_mario_have_normal_cap_on_head", smlua_func_does_mario_have_normal_cap_on_head); @@ -19368,6 +19453,7 @@ void smlua_bind_functions_autogen(void) { smlua_bind_function(L, "camera_unfreeze", smlua_func_camera_unfreeze); smlua_bind_function(L, "deref_s32_pointer", smlua_func_deref_s32_pointer); smlua_bind_function(L, "get_current_save_file_num", smlua_func_get_current_save_file_num); + smlua_bind_function(L, "get_dialog_id", smlua_func_get_dialog_id); smlua_bind_function(L, "get_environment_region", smlua_func_get_environment_region); smlua_bind_function(L, "get_hand_foot_pos_x", smlua_func_get_hand_foot_pos_x); smlua_bind_function(L, "get_hand_foot_pos_y", smlua_func_get_hand_foot_pos_y); diff --git a/src/pc/lua/utils/smlua_misc_utils.h b/src/pc/lua/utils/smlua_misc_utils.h index 3ed03f755..4d9408a16 100644 --- a/src/pc/lua/utils/smlua_misc_utils.h +++ b/src/pc/lua/utils/smlua_misc_utils.h @@ -63,6 +63,8 @@ void camera_config_set_deceleration(u32 value); bool is_game_paused(void); +s16 get_dialog_id(void); + u32 allocate_mario_action(u32 actFlags); f32 get_hand_foot_pos_x(struct MarioState* m, u8 index);