diff --git a/patches/camera_patches.c b/patches/camera_patches.c index 938b2b8..092a2e9 100644 --- a/patches/camera_patches.c +++ b/patches/camera_patches.c @@ -28,6 +28,8 @@ float analog_camera_y_sensitivity = 500.0f; static const float analog_cam_threshold = 0.1f; +float mouse_camera_sensitivity = 0.1f; + RECOMP_EXPORT void recomp_set_camera_fixes(bool new_val) { camera_fixes = new_val; } @@ -66,8 +68,12 @@ void update_analog_cam(Camera* c) { } // Enable analog cam if the right stick is held. - float input_x, input_y; - recomp_get_camera_inputs(&input_x, &input_y); + float analog_x, analog_y; + + recomp_get_camera_inputs(&analog_x, &analog_y); + + float input_x = analog_x + (mouse_input_handler.crouch_shielding ? 0.0f : mouse_input_handler.delta_x * MOUSE_CAMERA_SCALE_X); + float input_y = analog_y + (mouse_input_handler.crouch_shielding ? 0.0f : mouse_input_handler.delta_y * MOUSE_CAMERA_SCALE_Y); if (fabsf(input_x) >= analog_cam_threshold || fabsf(input_y) >= analog_cam_threshold) { analog_cam_active = true; diff --git a/patches/input.c b/patches/input.c index ce6eccd..727242d 100644 --- a/patches/input.c +++ b/patches/input.c @@ -1,4 +1,5 @@ #include "patches.h" +#include "play_patches.h" #include "input.h" #include "z64snap.h" // Decomp rename, TODO update decomp and remove this @@ -6,6 +7,8 @@ #include "z64voice.h" #include "audiothread_cmd.h" +MouseInputHandler mouse_input_handler; + RECOMP_DECLARE_EVENT(recomp_before_first_person_aiming_update_event(PlayState* play, Player* this, bool in_free_look, RecompAimingOverideMode* recomp_aiming_override_mode)); RECOMP_DECLARE_EVENT(recomp_after_first_person_aiming_update_event(PlayState* play, Player* this, bool in_free_look)); RECOMP_DECLARE_EVENT(recomp_set_extra_item_slot_statuses(PlayState* play, s32 enabled)); @@ -102,12 +105,9 @@ RECOMP_PATCH s32 func_80847190(PlayState* play, Player* this, s32 arg2) { filtered_gyro_x = filtered_gyro_x * gyro_filter_factor + total_gyro_x * (1.0f - gyro_filter_factor); filtered_gyro_y = filtered_gyro_y * gyro_filter_factor + total_gyro_y * (1.0f - gyro_filter_factor); - - float delta_mouse_x, delta_mouse_y; - recomp_get_mouse_deltas(&delta_mouse_x, &delta_mouse_y); - total_mouse_x += delta_mouse_x; - total_mouse_y += delta_mouse_y; + total_mouse_x += mouse_input_handler.delta_x; + total_mouse_y += mouse_input_handler.delta_y; // The gyro X-axis (tilt) corresponds to the camera X-axis (tilt). // The gyro Y-axis (left/right rotation) corresponds to the camera Y-axis (left/right rotation). @@ -1473,10 +1473,13 @@ RECOMP_PATCH void Player_Action_18(Player* this, PlayState* play) { func_8082F164(this, BTN_R | BTN_B); } } - if (this->av2.actionVar2 != 0) { - f32 yStick = sPlayerControlInput->rel.stick_y * 180; - f32 xStick = sPlayerControlInput->rel.stick_x * -120; + f32 yStick = sPlayerControlInput->rel.stick_y * 180 + mouse_input_handler.shield_pos_y; + f32 xStick = sPlayerControlInput->rel.stick_x * -120 + mouse_input_handler.shield_pos_x; + // Needed so analog input and mouse input don't double up. + xStick = CLAMP(xStick, -MOUSE_SHIELD_CLAMP_X, MOUSE_SHIELD_CLAMP_X); + yStick = CLAMP(yStick, -MOUSE_SHIELD_CLAMP_Y, MOUSE_SHIELD_CLAMP_Y); + s16 temp_a0 = this->actor.shape.rot.y - Camera_GetInputDirYaw(GET_ACTIVE_CAM(play)); s16 var_a1; s16 temp_ft5; @@ -1493,7 +1496,7 @@ RECOMP_PATCH void Player_Action_18(Player* this, PlayState* play) { if (inverted_x) { xStick = -xStick; } - + recomp_printf("Shielding X=%f, Y=%f\n", xStick, yStick); var_a1 = (yStick * Math_CosS(temp_a0)) + (Math_SinS(temp_a0) * xStick); temp_ft5 = (xStick * Math_CosS(temp_a0)) - (Math_SinS(temp_a0) * yStick); diff --git a/patches/play_patches.c b/patches/play_patches.c index 1b6307a..e401ae1 100644 --- a/patches/play_patches.c +++ b/patches/play_patches.c @@ -34,6 +34,21 @@ RECOMP_DECLARE_EVENT(recomp_after_play_update(PlayState* play)); void controls_play_update(PlayState* play) { gSaveContext.options.zTargetSetting = recomp_get_targeting_mode(); + + Player* player = GET_PLAYER(play); + recomp_get_mouse_deltas(&mouse_input_handler.delta_x, &mouse_input_handler.delta_y); + mouse_input_handler.crouch_shielding = player->stateFlags1 & PLAYER_STATE1_400000; + + if (mouse_input_handler.crouch_shielding) { + mouse_input_handler.shield_pos_x -= mouse_input_handler.delta_x * 10.0f; + mouse_input_handler.shield_pos_y -= mouse_input_handler.delta_y * 10.0f; + mouse_input_handler.shield_pos_x = CLAMP(mouse_input_handler.shield_pos_x, -MOUSE_SHIELD_CLAMP_X, MOUSE_SHIELD_CLAMP_X); + mouse_input_handler.shield_pos_y = CLAMP(mouse_input_handler.shield_pos_y, -MOUSE_SHIELD_CLAMP_Y, MOUSE_SHIELD_CLAMP_Y); + } + else { + mouse_input_handler.shield_pos_x = 0.0f; + mouse_input_handler.shield_pos_y = 0.0f; + } } // @recomp Patched to add hooks for various added functionality. @@ -174,6 +189,11 @@ RECOMP_PATCH void Play_Init(GameState* thisx) { // @recomp_event recomp_on_play_init(PlayState* this): A new PlayState is being initialized. recomp_on_play_init(this); + mouse_input_handler.crouch_shielding = false; + mouse_input_handler.delta_x = 0.0f; + mouse_input_handler.delta_y = 0.0f; + mouse_input_handler.shield_pos_x = 0.0f; + mouse_input_handler.shield_pos_y = 0.0f; if ((gSaveContext.respawnFlag == -4) || (gSaveContext.respawnFlag == -0x63)) { if (CHECK_EVENTINF(EVENTINF_TRIGGER_DAYTELOP)) { diff --git a/patches/play_patches.h b/patches/play_patches.h index 19e7db2..83540ff 100644 --- a/patches/play_patches.h +++ b/patches/play_patches.h @@ -3,6 +3,22 @@ #include "patches.h" +#define MOUSE_SHIELD_CLAMP_X 7200.0f +#define MOUSE_SHIELD_CLAMP_Y 10800.0f +#define MOUSE_CAMERA_SCALE_X 0.04f +#define MOUSE_CAMERA_SCALE_Y 0.04f + +typedef struct { + float delta_x; + float delta_y; + + bool crouch_shielding; + float shield_pos_x; + float shield_pos_y; +} MouseInputHandler; + +extern MouseInputHandler mouse_input_handler; + void debug_play_update(PlayState* play); void camera_pre_play_update(PlayState* play); void camera_post_play_update(PlayState* play);