prototype: control of camera and Mirror shield with Mouse

This commit is contained in:
LT-Schmiddy 2025-05-29 18:05:53 -04:00
parent 54997438de
commit 4ec02642af
4 changed files with 56 additions and 11 deletions

View file

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

View file

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

View file

@ -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)) {

View file

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