diff --git a/Makefile b/Makefile index 9d6784dd..c48906cb 100644 --- a/Makefile +++ b/Makefile @@ -235,6 +235,8 @@ else endif ifeq ($(TARGET_RPI),1) + $(info Compiling for Raspberry Pi) + DISCORD_SDK := 0 machine = $(shell sh -c 'uname -m 2>/dev/null || echo unknown') # Raspberry Pi B+, Zero, etc @@ -244,6 +246,7 @@ ifeq ($(TARGET_RPI),1) # Raspberry Pi 2 and 3 in ARM 32bit mode ifneq (,$(findstring armv7l,$(machine))) + $(info ARM 32bit mode) model = $(shell sh -c 'cat /sys/firmware/devicetree/base/model 2>/dev/null || echo unknown') ifneq (,$(findstring 3,$(model))) OPT_FLAGS := -march=armv8-a+crc -mtune=cortex-a53 -mfpu=neon-fp-armv8 -O3 @@ -255,6 +258,7 @@ ifeq ($(TARGET_RPI),1) # RPi3 or RPi4, in ARM64 (aarch64) mode. NEEDS TESTING 32BIT. # DO NOT pass -mfpu stuff here, thats for 32bit ARM only and will fail for 64bit ARM. ifneq (,$(findstring aarch64,$(machine))) + $(info ARM64 mode) model = $(shell sh -c 'cat /sys/firmware/devicetree/base/model 2>/dev/null || echo unknown') ifneq (,$(findstring 3,$(model))) OPT_FLAGS := -march=armv8-a+crc -mtune=cortex-a53 -O3 @@ -347,11 +351,6 @@ ifeq ($(HEADLESS),1) CONTROLLER_API := endif -ifeq ($(TARGET_RPI),1) - $(info Compiling for Raspberry Pi) - DISCORD_SDK := 0 -endif - # NON_MATCHING - whether to build a matching, identical copy of the ROM # 1 - enable some alternate, more portable code that does not produce a matching ROM # 0 - build a matching ROM @@ -626,7 +625,11 @@ else ifeq ($(OSX_BUILD),1) # This really shouldn't be required, but I got tired of trying to do it the "right way" BASS_LIBS := lib/bass/bass.dylib lib/bass/libbass.dylib lib/bass/bass_fx.dylib lib/bass/libbass_fx.dylib else ifeq ($(TARGET_RPI),1) - BASS_LIBS := lib/bass/arm/libbass.so lib/bass/arm/libbass_fx.so + ifneq (,$(findstring aarch64,$(machine))) + BASS_LIBS := lib/bass/arm/aarch64/libbass.so lib/bass/arm/aarch64/libbass_fx.so + else + BASS_LIBS := lib/bass/arm/libbass.so lib/bass/arm/libbass_fx.so + endif else BASS_LIBS := lib/bass/libbass.so lib/bass/libbass_fx.so endif @@ -922,7 +925,11 @@ ifeq ($(WINDOWS_BUILD),1) else ifeq ($(OSX_BUILD),1) LDFLAGS += -L./lib/lua/mac/ -l lua53 else ifeq ($(TARGET_RPI),1) - LDFLAGS += -Llib/lua/linux -l:liblua53-arm.a + ifneq (,$(findstring aarch64,$(machine))) + LDFLAGS += -Llib/lua/linux -l:liblua53-arm64.a + else + LDFLAGS += -Llib/lua/linux -l:liblua53-arm.a + endif else LDFLAGS += -Llib/lua/linux -l:liblua53.a endif diff --git a/autogen/lua_definitions/constants.lua b/autogen/lua_definitions/constants.lua index e8a18632..28f75097 100644 --- a/autogen/lua_definitions/constants.lua +++ b/autogen/lua_definitions/constants.lua @@ -7937,7 +7937,10 @@ HOOK_ON_PACKET_RECEIVE = 22 HOOK_USE_ACT_SELECT = 23 --- @type LuaHookedEventType -HOOK_MAX = 24 +HOOK_ON_CHANGE_CAMERA_ANGLE = 24 + +--- @type LuaHookedEventType +HOOK_MAX = 25 --- @class HudDisplayFlags diff --git a/autogen/lua_definitions/functions.lua b/autogen/lua_definitions/functions.lua index 7d6620b9..d4ab82b3 100644 --- a/autogen/lua_definitions/functions.lua +++ b/autogen/lua_definitions/functions.lua @@ -3023,6 +3023,11 @@ function camera_set_use_course_specific_settings(enable) -- ... end +--- @return nil +function center_rom_hack_camera() + -- ... +end + --- @param from Vec3f --- @param to Vec3f --- @param maxPitch integer @@ -7720,6 +7725,11 @@ function get_hand_foot_pos_z(m, index) -- ... end +--- @return integer +function get_last_star_or_key() + -- ... +end + --- @return integer function get_network_area_timer() -- ... @@ -7806,6 +7816,12 @@ function set_environment_region(index, value) -- ... end +--- @param value integer +--- @return nil +function set_last_star_or_key(value) + -- ... +end + --- @param far number --- @return nil function set_override_far(far) diff --git a/docs/lua/constants.md b/docs/lua/constants.md index 3f9747fd..0a899cf4 100644 --- a/docs/lua/constants.md +++ b/docs/lua/constants.md @@ -2803,7 +2803,8 @@ | HOOK_ON_DEATH | 21 | | HOOK_ON_PACKET_RECEIVE | 22 | | HOOK_USE_ACT_SELECT | 23 | -| HOOK_MAX | 24 | +| HOOK_ON_CHANGE_CAMERA_ANGLE | 24 | +| HOOK_MAX | 25 | [:arrow_up_small:](#) diff --git a/docs/lua/functions-3.md b/docs/lua/functions-3.md index 754b81eb..d24db7f9 100644 --- a/docs/lua/functions-3.md +++ b/docs/lua/functions-3.md @@ -378,6 +378,24 @@
+## [center_rom_hack_camera](#center_rom_hack_camera) + +### Lua Example +`center_rom_hack_camera()` + +### Parameters +- None + +### Returns +- None + +### C Prototype +`void center_rom_hack_camera(void);` + +[:arrow_up_small:](#) + +
+ ## [clamp_pitch](#clamp_pitch) ### Lua Example diff --git a/docs/lua/functions-4.md b/docs/lua/functions-4.md index 55f55991..9d7937aa 100644 --- a/docs/lua/functions-4.md +++ b/docs/lua/functions-4.md @@ -6908,6 +6908,24 @@
+## [get_last_star_or_key](#get_last_star_or_key) + +### Lua Example +`local integerValue = get_last_star_or_key()` + +### Parameters +- None + +### Returns +- `integer` + +### C Prototype +`s32 get_last_star_or_key(void);` + +[:arrow_up_small:](#) + +
+ ## [get_network_area_timer](#get_network_area_timer) ### Lua Example @@ -7171,6 +7189,26 @@
+## [set_last_star_or_key](#set_last_star_or_key) + +### Lua Example +`set_last_star_or_key(value)` + +### Parameters +| Field | Type | +| ----- | ---- | +| value | `integer` | + +### Returns +- None + +### C Prototype +`void set_last_star_or_key(u8 value);` + +[:arrow_up_small:](#) + +
+ ## [set_override_far](#set_override_far) ### Lua Example diff --git a/docs/lua/functions.md b/docs/lua/functions.md index 1a019598..ccb04dda 100644 --- a/docs/lua/functions.md +++ b/docs/lua/functions.md @@ -615,6 +615,7 @@ - [camera_approach_s16_symmetric_bool](functions-3.md#camera_approach_s16_symmetric_bool) - [camera_course_processing](functions-3.md#camera_course_processing) - [camera_set_use_course_specific_settings](functions-3.md#camera_set_use_course_specific_settings) + - [center_rom_hack_camera](functions-3.md#center_rom_hack_camera) - [clamp_pitch](functions-3.md#clamp_pitch) - [clamp_positions_and_find_yaw](functions-3.md#clamp_positions_and_find_yaw) - [collide_with_walls](functions-3.md#collide_with_walls) @@ -1438,6 +1439,7 @@ - [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) - [get_hand_foot_pos_z](functions-4.md#get_hand_foot_pos_z) + - [get_last_star_or_key](functions-4.md#get_last_star_or_key) - [get_network_area_timer](functions-4.md#get_network_area_timer) - [get_temp_s32_pointer](functions-4.md#get_temp_s32_pointer) - [hud_get_value](functions-4.md#hud_get_value) @@ -1451,6 +1453,7 @@ - [play_transition](functions-4.md#play_transition) - [save_file_set_using_backup_slot](functions-4.md#save_file_set_using_backup_slot) - [set_environment_region](functions-4.md#set_environment_region) + - [set_last_star_or_key](functions-4.md#set_last_star_or_key) - [set_override_far](functions-4.md#set_override_far) - [set_override_fov](functions-4.md#set_override_fov) - [set_override_near](functions-4.md#set_override_near) diff --git a/lib/bass/arm/aarch64/libbass.so b/lib/bass/arm/aarch64/libbass.so new file mode 100644 index 00000000..aaaac927 Binary files /dev/null and b/lib/bass/arm/aarch64/libbass.so differ diff --git a/lib/bass/arm/aarch64/libbass_fx.so b/lib/bass/arm/aarch64/libbass_fx.so new file mode 100644 index 00000000..45faa939 Binary files /dev/null and b/lib/bass/arm/aarch64/libbass_fx.so differ diff --git a/lib/lua/linux/liblua53-arm64.a b/lib/lua/linux/liblua53-arm64.a new file mode 100644 index 00000000..d2c15bf7 Binary files /dev/null and b/lib/lua/linux/liblua53-arm64.a differ diff --git a/mods/arena/camera.lua b/mods/arena/camera.lua index a6994f51..6e61bc6d 100644 --- a/mods/arena/camera.lua +++ b/mods/arena/camera.lua @@ -1,16 +1,10 @@ - camera_set_use_course_specific_settings(false) sOverrideCameraModes = { [CAMERA_MODE_RADIAL] = true, [CAMERA_MODE_OUTWARD_RADIAL] = true, - [CAMERA_MODE_BEHIND_MARIO] = true, [CAMERA_MODE_CLOSE] = true, - --[CAMERA_MODE_C_UP] = true, - [CAMERA_MODE_WATER_SURFACE] = true, [CAMERA_MODE_SLIDE_HOOT] = true, - --[CAMERA_MODE_INSIDE_CANNON] = true, - --[CAMERA_MODE_BOSS_FIGHT] = true, [CAMERA_MODE_PARALLEL_TRACKING] = true, [CAMERA_MODE_FIXED] = true, [CAMERA_MODE_8_DIRECTIONS] = true, @@ -18,8 +12,9 @@ sOverrideCameraModes = { [CAMERA_MODE_SPIRAL_STAIRS] = true, } +local m = gMarioStates[0] + function override_camera() - local m = gMarioStates[0] local np = gNetworkPlayers[0] if sOverrideCameraModes[m.area.camera.mode] == nil then @@ -34,8 +29,6 @@ function override_camera() end function on_set_camera_mode(c, mode, frames) - local m = gMarioStates[0] - if mode == CAMERA_MODE_ROM_HACK then return true end @@ -54,3 +47,8 @@ function on_set_camera_mode(c, mode, frames) end hook_event(HOOK_ON_SET_CAMERA_MODE, on_set_camera_mode) +hook_event(HOOK_UPDATE, function() + if (m.controller.buttonPressed & L_TRIG) ~= 0 then + center_rom_hack_camera() + end +end) diff --git a/mods/sm74/camera.lua b/mods/sm74/camera.lua index 919778d1..93edb42c 100644 --- a/mods/sm74/camera.lua +++ b/mods/sm74/camera.lua @@ -10,8 +10,9 @@ sOverrideCameraModes = { [CAMERA_MODE_SPIRAL_STAIRS] = true, } +local m = gMarioStates[0] + function override_camera() - local m = gMarioStates[0] local np = gNetworkPlayers[0] if sOverrideCameraModes[m.area.camera.mode] == nil then @@ -26,8 +27,6 @@ function override_camera() end function on_set_camera_mode(c, mode, frames) - local m = gMarioStates[0] - if mode == CAMERA_MODE_ROM_HACK then return true end @@ -46,3 +45,8 @@ function on_set_camera_mode(c, mode, frames) end hook_event(HOOK_ON_SET_CAMERA_MODE, on_set_camera_mode) +hook_event(HOOK_UPDATE, function() + if (m.controller.buttonPressed & L_TRIG) ~= 0 then + center_rom_hack_camera() + end +end) diff --git a/mods/star-road/camera.lua b/mods/star-road/camera.lua index 919778d1..93edb42c 100644 --- a/mods/star-road/camera.lua +++ b/mods/star-road/camera.lua @@ -10,8 +10,9 @@ sOverrideCameraModes = { [CAMERA_MODE_SPIRAL_STAIRS] = true, } +local m = gMarioStates[0] + function override_camera() - local m = gMarioStates[0] local np = gNetworkPlayers[0] if sOverrideCameraModes[m.area.camera.mode] == nil then @@ -26,8 +27,6 @@ function override_camera() end function on_set_camera_mode(c, mode, frames) - local m = gMarioStates[0] - if mode == CAMERA_MODE_ROM_HACK then return true end @@ -46,3 +45,8 @@ function on_set_camera_mode(c, mode, frames) end hook_event(HOOK_ON_SET_CAMERA_MODE, on_set_camera_mode) +hook_event(HOOK_UPDATE, function() + if (m.controller.buttonPressed & L_TRIG) ~= 0 then + center_rom_hack_camera() + end +end) diff --git a/src/game/behaviors/bowser_key.inc.c b/src/game/behaviors/bowser_key.inc.c index 65a9d262..2e195b71 100644 --- a/src/game/behaviors/bowser_key.inc.c +++ b/src/game/behaviors/bowser_key.inc.c @@ -45,6 +45,8 @@ void bhv_bowser_key_loop(void) { } else { obj_set_hitbox(o, &sBowserKeyHitbox); if (o->oInteractStatus & INT_STATUS_INTERACTED) { + extern u8 gLastCollectedStarOrKey; + gLastCollectedStarOrKey = 1; mark_obj_for_deletion(o); o->oInteractStatus = 0; } diff --git a/src/game/behaviors/scuttlebug.inc.c b/src/game/behaviors/scuttlebug.inc.c index 0e43807b..99c1548c 100644 --- a/src/game/behaviors/scuttlebug.inc.c +++ b/src/game/behaviors/scuttlebug.inc.c @@ -61,7 +61,7 @@ void bhv_scuttlebug_loop(void) { case 1: o->oForwardVel = 5.0f; if (cur_obj_lateral_dist_from_obj_to_home(player) > 1000.0f) { - //angleToPlayer = angleToPlayer; + angleToPlayer = cur_obj_angle_to_home(); } else { if (o->oScuttlebugUnkF8 == 0) { o->oScuttlebugUnkFC = 0; diff --git a/src/game/behaviors/sparkle_spawn_star.inc.c b/src/game/behaviors/sparkle_spawn_star.inc.c index 488cbccd..045fb40a 100644 --- a/src/game/behaviors/sparkle_spawn_star.inc.c +++ b/src/game/behaviors/sparkle_spawn_star.inc.c @@ -35,6 +35,8 @@ void bhv_spawned_star_init(void) { void set_sparkle_spawn_star_hitbox(void) { obj_set_hitbox(o, &sSparkleSpawnStarHitbox); if (o->oInteractStatus & INT_STATUS_INTERACTED) { + extern u8 gLastCollectedStarOrKey; + gLastCollectedStarOrKey = 0; mark_obj_for_deletion(o); o->oInteractStatus = 0; } diff --git a/src/game/behaviors/spawn_star.inc.c b/src/game/behaviors/spawn_star.inc.c index 203e29e0..76f3fab0 100644 --- a/src/game/behaviors/spawn_star.inc.c +++ b/src/game/behaviors/spawn_star.inc.c @@ -31,6 +31,8 @@ void bhv_collect_star_loop(void) { o->oFaceAngleYaw += 0x800; if (o->oInteractStatus & INT_STATUS_INTERACTED) { + extern u8 gLastCollectedStarOrKey; + gLastCollectedStarOrKey = 0; mark_obj_for_deletion(o); o->oInteractStatus = 0; } diff --git a/src/game/camera.c b/src/game/camera.c index 8171b44d..ccbcb3b0 100644 --- a/src/game/camera.c +++ b/src/game/camera.c @@ -3066,10 +3066,17 @@ void update_camera(struct Camera *c) { #endif ) { if ((sCurrPlayMode != PLAY_MODE_PAUSED) && gPlayer1Controller->buttonPressed & R_TRIG) { + bool returnValue = true; if (set_cam_angle(0) == CAM_ANGLE_LAKITU) { - set_cam_angle(CAM_ANGLE_MARIO); + smlua_call_event_hooks_change_camera_angle_params(HOOK_ON_CHANGE_CAMERA_ANGLE, CAM_ANGLE_MARIO, &returnValue); + if (returnValue) { + set_cam_angle(CAM_ANGLE_MARIO); + } } else { - set_cam_angle(CAM_ANGLE_LAKITU); + smlua_call_event_hooks_change_camera_angle_params(HOOK_ON_CHANGE_CAMERA_ANGLE, CAM_ANGLE_LAKITU, &returnValue); + if (returnValue) { + set_cam_angle(CAM_ANGLE_LAKITU); + } } } } @@ -11847,6 +11854,11 @@ void rom_hack_cam_walk(Vec3f pos, Vec3f dir, f32 dist) { static s16 sRomHackOffset = 0; +void center_rom_hack_camera(void) { + sRomHackYaw = DEGREES(180 + 90) - gMarioStates[0].intendedYaw; + sRomHackYaw = (sRomHackYaw / DEGREES(45)) * DEGREES(45); +} + /** * A mode that has 8 camera angles, 45 degrees apart, that is slightly smarter */ @@ -11892,12 +11904,6 @@ void mode_rom_hack_camera(struct Camera *c) { sRomHackZoom = 0; } - // center camera - if (gMarioStates[0].controller->buttonPressed & L_TRIG) { - sRomHackYaw = DEGREES(180 + 90) - gMarioStates[0].intendedYaw; - sRomHackYaw = (sRomHackYaw / DEGREES(45)) * DEGREES(45); - } - // clamp yaw sRomHackYaw = (sRomHackYaw / DEGREES(45)) * DEGREES(45); diff --git a/src/game/camera.h b/src/game/camera.h index c5472031..c7a02ed2 100644 --- a/src/game/camera.h +++ b/src/game/camera.h @@ -785,5 +785,6 @@ 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); +void center_rom_hack_camera(void); #endif // CAMERA_H diff --git a/src/game/ingame_menu.c b/src/game/ingame_menu.c index f805375d..df882b76 100644 --- a/src/game/ingame_menu.c +++ b/src/game/ingame_menu.c @@ -47,6 +47,7 @@ s16 gCutsceneMsgYOffset; extern u8 gLastCompletedCourseNum; extern u8 gLastCompletedStarNum; +u8 gLastCollectedStarOrKey = 0; enum DialogBoxState { DIALOG_STATE_OPENING, @@ -3111,7 +3112,7 @@ void render_course_complete_lvl_info_and_hud_str(void) { print_generic_string(63, 167, textCourse); print_generic_string(CRS_NUM_X3, 167, strCourseNum); gSPDisplayList(gDisplayListHead++, dl_ia_text_end); - } else if (gLastCompletedCourseNum == COURSE_BITDW || gLastCompletedCourseNum == COURSE_BITFS) { + } else if ((gLastCompletedCourseNum == COURSE_BITDW || gLastCompletedCourseNum == COURSE_BITFS) && gLastCollectedStarOrKey == 1) { name = segmented_to_virtual(courseNameTbl[gLastCompletedCourseNum - 1]); gSPDisplayList(gDisplayListHead++, dl_ia_text_begin); gDPSetEnvColor(gDisplayListHead++, 0, 0, 0, gDialogTextAlpha); diff --git a/src/game/mario_actions_cutscene.c b/src/game/mario_actions_cutscene.c index a6a04ec8..bdbc8a0e 100644 --- a/src/game/mario_actions_cutscene.c +++ b/src/game/mario_actions_cutscene.c @@ -57,6 +57,8 @@ static s8 D_8032CBE4 = 0; static s8 D_8032CBE8 = 0; static s8 D_8032CBEC[7] = { 2, 3, 2, 1, 2, 3, 2 }; +extern u8 gLastCollectedStarOrKey; + static BehaviorScript* localDialogNPCBehavior = NULL; /** @@ -1288,8 +1290,8 @@ s32 act_exit_land_save_dialog(struct MarioState *m) { if (!(m->flags & MARIO_CAP_ON_HEAD)) { m->actionState = 2; // star exit without cap } - if (gLastCompletedCourseNum == COURSE_BITDW - || gLastCompletedCourseNum == COURSE_BITFS) { + if ((gLastCompletedCourseNum == COURSE_BITDW || gLastCompletedCourseNum == COURSE_BITFS) + && gLastCollectedStarOrKey == 1) { m->actionState = 1; // key exit } } diff --git a/src/pc/lua/smlua_constants_autogen.c b/src/pc/lua/smlua_constants_autogen.c index 4b9f043d..b549fbaa 100644 --- a/src/pc/lua/smlua_constants_autogen.c +++ b/src/pc/lua/smlua_constants_autogen.c @@ -2822,7 +2822,8 @@ char gSmluaConstants[] = "" "HOOK_ON_DEATH = 21\n" "HOOK_ON_PACKET_RECEIVE = 22\n" "HOOK_USE_ACT_SELECT = 23\n" -"HOOK_MAX = 24\n" +"HOOK_ON_CHANGE_CAMERA_ANGLE = 24\n" +"HOOK_MAX = 25\n" "ACTION_HOOK_EVERY_FRAME = 0\n" "ACTION_HOOK_GRAVITY = 1\n" "ACTION_HOOK_MAX = 2\n" diff --git a/src/pc/lua/smlua_functions_autogen.c b/src/pc/lua/smlua_functions_autogen.c index 73b5a1a9..7583b8a3 100644 --- a/src/pc/lua/smlua_functions_autogen.c +++ b/src/pc/lua/smlua_functions_autogen.c @@ -5786,6 +5786,15 @@ int smlua_func_camera_set_use_course_specific_settings(lua_State* L) { return 1; } +int smlua_func_center_rom_hack_camera(UNUSED lua_State* L) { + if(!smlua_functions_valid_param_count(L, 0)) { return 0; } + + + center_rom_hack_camera(); + + return 1; +} + int smlua_func_clamp_pitch(lua_State* L) { if(!smlua_functions_valid_param_count(L, 4)) { return 0; } @@ -16991,6 +17000,15 @@ int smlua_func_get_hand_foot_pos_z(lua_State* L) { return 1; } +int smlua_func_get_last_star_or_key(UNUSED lua_State* L) { + if(!smlua_functions_valid_param_count(L, 0)) { return 0; } + + + lua_pushinteger(L, get_last_star_or_key()); + + return 1; +} + int smlua_func_get_network_area_timer(UNUSED lua_State* L) { if(!smlua_functions_valid_param_count(L, 0)) { return 0; } @@ -17150,6 +17168,17 @@ int smlua_func_set_environment_region(lua_State* L) { return 1; } +int smlua_func_set_last_star_or_key(lua_State* L) { + if(!smlua_functions_valid_param_count(L, 1)) { return 0; } + + u8 value = smlua_to_integer(L, 1); + if (!gSmLuaConvertSuccess) { LOG_LUA("Failed to convert parameter 1 for function 'set_last_star_or_key'"); return 0; } + + set_last_star_or_key(value); + + return 1; +} + int smlua_func_set_override_far(lua_State* L) { if(!smlua_functions_valid_param_count(L, 1)) { return 0; } @@ -18695,6 +18724,7 @@ void smlua_bind_functions_autogen(void) { smlua_bind_function(L, "camera_approach_s16_symmetric_bool", smlua_func_camera_approach_s16_symmetric_bool); smlua_bind_function(L, "camera_course_processing", smlua_func_camera_course_processing); smlua_bind_function(L, "camera_set_use_course_specific_settings", smlua_func_camera_set_use_course_specific_settings); + smlua_bind_function(L, "center_rom_hack_camera", smlua_func_center_rom_hack_camera); smlua_bind_function(L, "clamp_pitch", smlua_func_clamp_pitch); smlua_bind_function(L, "clamp_positions_and_find_yaw", smlua_func_clamp_positions_and_find_yaw); smlua_bind_function(L, "collide_with_walls", smlua_func_collide_with_walls); @@ -19515,6 +19545,7 @@ void smlua_bind_functions_autogen(void) { 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); smlua_bind_function(L, "get_hand_foot_pos_z", smlua_func_get_hand_foot_pos_z); + smlua_bind_function(L, "get_last_star_or_key", smlua_func_get_last_star_or_key); smlua_bind_function(L, "get_network_area_timer", smlua_func_get_network_area_timer); smlua_bind_function(L, "get_temp_s32_pointer", smlua_func_get_temp_s32_pointer); smlua_bind_function(L, "hud_get_value", smlua_func_hud_get_value); @@ -19528,6 +19559,7 @@ void smlua_bind_functions_autogen(void) { smlua_bind_function(L, "play_transition", smlua_func_play_transition); smlua_bind_function(L, "save_file_set_using_backup_slot", smlua_func_save_file_set_using_backup_slot); smlua_bind_function(L, "set_environment_region", smlua_func_set_environment_region); + smlua_bind_function(L, "set_last_star_or_key", smlua_func_set_last_star_or_key); smlua_bind_function(L, "set_override_far", smlua_func_set_override_far); smlua_bind_function(L, "set_override_fov", smlua_func_set_override_fov); smlua_bind_function(L, "set_override_near", smlua_func_set_override_near); diff --git a/src/pc/lua/smlua_hooks.c b/src/pc/lua/smlua_hooks.c index e20f69c8..e04aa5cc 100644 --- a/src/pc/lua/smlua_hooks.c +++ b/src/pc/lua/smlua_hooks.c @@ -477,6 +477,35 @@ void smlua_call_event_hooks_set_camera_mode_params(enum LuaHookedEventType hookT } } +void smlua_call_event_hooks_change_camera_angle_params(enum LuaHookedEventType hookType, s16 mode, bool* returnValue) { + lua_State* L = gLuaState; + if (L == NULL) { return; } + *returnValue = true; + + struct LuaHookedEvent* hook = &sHookedEvents[hookType]; + for (int i = 0; i < hook->count; i++) { + s32 prevTop = lua_gettop(L); + + // push the callback onto the stack + lua_rawgeti(L, LUA_REGISTRYINDEX, hook->reference[i]); + + // push params + lua_pushinteger(L, mode); + + // call the callback + if (0 != smlua_call_hook(L, 1, 1, 0, hook->mod[i])) { + LOG_LUA("Failed to call the callback: %u", hookType); + continue; + } + + // output the return value + if (lua_type(L, -1) == LUA_TBOOLEAN) { + *returnValue = smlua_to_boolean(L, -1); + } + lua_settop(L, prevTop); + } +} + void smlua_call_event_hooks_value_param(enum LuaHookedEventType hookType, int modIndex, int valueIndex) { lua_State* L = gLuaState; if (L == NULL) { return; } diff --git a/src/pc/lua/smlua_hooks.h b/src/pc/lua/smlua_hooks.h index 07e26c32..a006f6d3 100644 --- a/src/pc/lua/smlua_hooks.h +++ b/src/pc/lua/smlua_hooks.h @@ -35,6 +35,7 @@ enum LuaHookedEventType { HOOK_ON_DEATH, HOOK_ON_PACKET_RECEIVE, HOOK_USE_ACT_SELECT, + HOOK_ON_CHANGE_CAMERA_ANGLE, HOOK_MAX, }; @@ -63,6 +64,7 @@ static const char* LuaHookedEventTypeName[] = { "HOOK_ON_DEATH", "HOOK_ON_PACKET_RECEIVE", "HOOK_USE_ACT_SELECT", + "HOOK_ON_CHANGE_CAMERA_ANGLE", "HOOK_MAX" }; @@ -94,6 +96,7 @@ void smlua_call_event_hooks_interact_params_ret_bool(enum LuaHookedEventType hoo void smlua_call_event_hooks_object_param(enum LuaHookedEventType hookType, struct Object* obj); bool smlua_call_event_hooks_ret_int(enum LuaHookedEventType hookType, s32* returnValue); void smlua_call_event_hooks_set_camera_mode_params(enum LuaHookedEventType hookType, struct Camera *c, s16 mode, s16 frames, bool* returnValue); +void smlua_call_event_hooks_change_camera_angle_params(enum LuaHookedEventType hookType, s16 mode, bool* returnValue); void smlua_call_event_hooks_value_param(enum LuaHookedEventType hookType, int modIndex, int valueIndex); void smlua_call_event_hooks_use_act_select(enum LuaHookedEventType hookType, int value, bool* foundHook, bool* returnValue); diff --git a/src/pc/lua/utils/smlua_misc_utils.c b/src/pc/lua/utils/smlua_misc_utils.c index 1cd8ef40..eadb1f20 100644 --- a/src/pc/lua/utils/smlua_misc_utils.c +++ b/src/pc/lua/utils/smlua_misc_utils.c @@ -47,6 +47,15 @@ void hud_show(void) { gOverrideHideHud = 0; } +extern u8 gLastCollectedStarOrKey; +s32 get_last_star_or_key(void) { + return gLastCollectedStarOrKey; +} + +void set_last_star_or_key(u8 value) { + gLastCollectedStarOrKey = value; +} + s32 hud_get_value(enum HudDisplayValue type) { switch (type) { case HUD_DISPLAY_LIVES: return gHudDisplay.lives; diff --git a/src/pc/lua/utils/smlua_misc_utils.h b/src/pc/lua/utils/smlua_misc_utils.h index 7615f7f1..b2ecf196 100644 --- a/src/pc/lua/utils/smlua_misc_utils.h +++ b/src/pc/lua/utils/smlua_misc_utils.h @@ -65,6 +65,8 @@ bool is_game_paused(void); bool is_transition_playing(void); s16 get_dialog_id(void); +s32 get_last_star_or_key(void); +void set_last_star_or_key(u8 value); u32 allocate_mario_action(u32 actFlags); diff --git a/src/pc/network/network.c b/src/pc/network/network.c index 59debee2..0d9bb6a8 100644 --- a/src/pc/network/network.c +++ b/src/pc/network/network.c @@ -19,6 +19,7 @@ #include "pc/mods/mods.h" #include "pc/crash_handler.h" #include "pc/debuglog.h" +#include "game/camera.h" // fix warnings when including rendering_graph_node #undef near @@ -531,6 +532,7 @@ void network_shutdown(bool sendLeaving, bool exiting, bool popup) { extern s16 gChangeLevel; gChangeLevel = LEVEL_CASTLE_GROUNDS; network_player_init(); + camera_set_use_course_specific_settings(true); free_vtx_scroll_targets(); struct Controller* cnt = gMarioStates[0].controller;