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);