From d3660207d2b11d3b05bfec2d13219bbfe27662bb Mon Sep 17 00:00:00 2001 From: zico Date: Thu, 24 Sep 2015 16:31:10 +0200 Subject: [PATCH] Added Mouse Overrun Buffer option as proposed by kp --- common/main/kconfig.h | 1 + common/main/playsave.h | 1 + similar/main/kconfig.cpp | 22 ++++++++++++++++------ similar/main/menu.cpp | 5 +++++ similar/main/playsave.cpp | 5 +++++ 5 files changed, 28 insertions(+), 6 deletions(-) diff --git a/common/main/kconfig.h b/common/main/kconfig.h index 1fd3febad..0882da4ec 100644 --- a/common/main/kconfig.h +++ b/common/main/kconfig.h @@ -74,6 +74,7 @@ struct control_info { }; ramp_controls_t down_time; // to scale movement depending on how long the key is pressed fix pitch_time, vertical_thrust_time, heading_time, sideways_thrust_time, bank_time, forward_thrust_time; + fix excess_pitch_time, excess_vertical_thrust_time, excess_heading_time, excess_sideways_thrust_time, excess_bank_time, excess_forward_thrust_time; state_controls_t state; // to scale movement for keys only we need them to be separate from joystick/mouse buttons array joy_axis, raw_joy_axis; array mouse_axis, raw_mouse_axis; diff --git a/common/main/playsave.h b/common/main/playsave.h index 985058d67..3fd57c476 100644 --- a/common/main/playsave.h +++ b/common/main/playsave.h @@ -85,6 +85,7 @@ struct player_config array JoystickSpeed; ubyte MouseFlightSim; array MouseSens; + array MouseOverrun; int MouseFSDead; int MouseFSIndicator; array CockpitMode; // 0 saves the "real" cockpit, 1 also saves letterbox and rear. Used to properly switch between modes and restore the real one. diff --git a/similar/main/kconfig.cpp b/similar/main/kconfig.cpp index 9ad77ad0a..2b3cc584e 100644 --- a/similar/main/kconfig.cpp +++ b/similar/main/kconfig.cpp @@ -1494,6 +1494,16 @@ static inline void adjust_button_time(fix &o, uint8_t add, uint8_t sub, fix v) o -= v; } +static void clamp_kconfig_control_with_overrun(fix &value, const fix &bound, fix &excess, const fix &ebound) +{ + /* Assume no integer overflow here */ + value += excess; + const auto ivalue = value; + clamp_symmetric_value(value, bound); + excess = ivalue - value; + clamp_symmetric_value(excess, ebound); +} + void kconfig_read_controls(const d_event &event, int automap_flag) { static fix64 mouse_delta_time = 0; @@ -1782,12 +1792,12 @@ void kconfig_read_controls(const d_event &event, int automap_flag) } //----------- Clamp values between -FrameTime and FrameTime - clamp_symmetric_value(Controls.pitch_time, frametime/2); - clamp_symmetric_value(Controls.heading_time, frametime); - clamp_symmetric_value(Controls.vertical_thrust_time, frametime); - clamp_symmetric_value(Controls.sideways_thrust_time, frametime); - clamp_symmetric_value(Controls.bank_time, frametime); - clamp_symmetric_value(Controls.forward_thrust_time, frametime); + clamp_kconfig_control_with_overrun(Controls.pitch_time, FrameTime/2, Controls.excess_pitch_time, FrameTime * PlayerCfg.MouseOverrun[1] * 2); + clamp_kconfig_control_with_overrun(Controls.heading_time, FrameTime, Controls.excess_heading_time, FrameTime * PlayerCfg.MouseOverrun[0] * 2); + clamp_kconfig_control_with_overrun(Controls.vertical_thrust_time, FrameTime, Controls.excess_vertical_thrust_time, FrameTime * PlayerCfg.MouseOverrun[3] * 2); + clamp_kconfig_control_with_overrun(Controls.sideways_thrust_time, FrameTime, Controls.excess_sideways_thrust_time, FrameTime * PlayerCfg.MouseOverrun[2] * 2); + clamp_kconfig_control_with_overrun(Controls.bank_time, FrameTime, Controls.excess_bank_time, FrameTime * PlayerCfg.MouseOverrun[4] * 2); + clamp_kconfig_control_with_overrun(Controls.forward_thrust_time, FrameTime, Controls.excess_forward_thrust_time, FrameTime * PlayerCfg.MouseOverrun[5] * 2); } void reset_cruise(void) diff --git a/similar/main/menu.cpp b/similar/main/menu.cpp index 21beb03e6..92d6bc354 100644 --- a/similar/main/menu.cpp +++ b/similar/main/menu.cpp @@ -1091,6 +1091,9 @@ static void input_config_sensitivity() DXX_##VERB##_TEXT("Mouse Sensitivity:", opt_label_ms) \ DXX_INPUT_THROTTLE_SENSITIVITY(VERB,ms,PlayerCfg.MouseSens) \ DXX_##VERB##_TEXT("", opt_label_blank_ms) \ + DXX_##VERB##_TEXT("Mouse Overrun Buffer:", opt_label_mo) \ + DXX_INPUT_THROTTLE_SENSITIVITY(VERB,mo,PlayerCfg.MouseOverrun) \ + DXX_##VERB##_TEXT("", opt_label_blank_mo) \ DXX_##VERB##_TEXT("Mouse FlightSim Deadzone:", opt_label_mfsd) \ DXX_##VERB##_SLIDER("X/Y", opt_mfsd_deadzone, PlayerCfg.MouseFSDead, 0, 16) \ @@ -1119,6 +1122,7 @@ static void input_config_sensitivity() constexpr uint_fast32_t joyspd = items.opt_label_jp + 1; constexpr uint_fast32_t joydead = items.opt_label_jd + 1; constexpr uint_fast32_t mousesens = items.opt_label_ms + 1; + constexpr uint_fast32_t mouseoverrun = items.opt_label_mo + 1; const auto &m = items.m; for (unsigned i = 0; i <= 5; i++) @@ -1130,6 +1134,7 @@ static void input_config_sensitivity() PlayerCfg.JoystickSens[i] = m[joysens+i].value; PlayerCfg.JoystickDead[i] = m[joydead+i].value; PlayerCfg.MouseSens[i] = m[mousesens+i].value; + PlayerCfg.MouseOverrun[i] = m[mouseoverrun+i].value; } constexpr uint_fast32_t mousefsdead = items.opt_mfsd_deadzone; PlayerCfg.MouseFSDead = m[mousefsdead].value; diff --git a/similar/main/playsave.cpp b/similar/main/playsave.cpp index b7293e694..527eb982a 100644 --- a/similar/main/playsave.cpp +++ b/similar/main/playsave.cpp @@ -143,6 +143,7 @@ COPYRIGHT 1993-1999 PARALLAX SOFTWARE CORPORATION. ALL RIGHTS RESERVED. #define MOUSE_FSDEAD_VALUE_TEXT "%d" #define MOUSE_FSINDICATOR_NAME_TEXT "fsindi" #define MOUSE_FSINDICATOR_VALUE_TEXT "%d" +#define MOUSE_OVERRUN_NAME_TEXT "overrun" #define WEAPON_KEYv2_HEADER_TEXT "[weapon keys v2]" #define WEAPON_KEYv2_VALUE_TEXT "0x%x,0x%x,0x%x" #define COCKPIT_HEADER_TEXT "[cockpit]" @@ -222,6 +223,7 @@ int new_player_config() PlayerCfg.JoystickSpeed[0] = PlayerCfg.JoystickSpeed[1] = PlayerCfg.JoystickSpeed[2] = PlayerCfg.JoystickSpeed[3] = PlayerCfg.JoystickSpeed[4] = PlayerCfg.JoystickSpeed[5] = 16; PlayerCfg.MouseFlightSim = 0; PlayerCfg.MouseSens[0] = PlayerCfg.MouseSens[1] = PlayerCfg.MouseSens[2] = PlayerCfg.MouseSens[3] = PlayerCfg.MouseSens[4] = PlayerCfg.MouseSens[5] = 8; + PlayerCfg.MouseOverrun[0] = PlayerCfg.MouseOverrun[1] = PlayerCfg.MouseOverrun[2] = PlayerCfg.MouseOverrun[3] = PlayerCfg.MouseOverrun[4] = PlayerCfg.MouseOverrun[5] = 0; PlayerCfg.MouseFSDead = 0; PlayerCfg.MouseFSIndicator = 1; PlayerCfg.CockpitMode[0] = PlayerCfg.CockpitMode[1] = CM_FULL_COCKPIT; @@ -380,6 +382,8 @@ static int read_player_dxx(const char *filename) PlayerCfg.MouseFlightSim = atoi(value); else if (convert_pattern_array(SENSITIVITY_NAME_TEXT, PlayerCfg.MouseSens, line, value)) ; + else if (convert_pattern_array(MOUSE_OVERRUN_NAME_TEXT, PlayerCfg.MouseOverrun, line, value)) + ; else if(!strcmp(line,MOUSE_FSDEAD_NAME_TEXT)) PlayerCfg.MouseFSDead = atoi(value); else if(!strcmp(line,MOUSE_FSINDICATOR_NAME_TEXT)) @@ -713,6 +717,7 @@ static int write_player_dxx(const char *filename) PHYSFSX_printf(fout,MOUSE_HEADER_TEXT "\n"); PHYSFSX_printf(fout,MOUSE_FLIGHTSIM_NAME_TEXT "=" MOUSE_FLIGHTSIM_VALUE_TEXT "\n",PlayerCfg.MouseFlightSim); print_pattern_array(fout, SENSITIVITY_NAME_TEXT, PlayerCfg.MouseSens); + print_pattern_array(fout, MOUSE_OVERRUN_NAME_TEXT, PlayerCfg.MouseOverrun); PHYSFSX_printf(fout,MOUSE_FSDEAD_NAME_TEXT "=" MOUSE_FSDEAD_VALUE_TEXT "\n",PlayerCfg.MouseFSDead); PHYSFSX_printf(fout,MOUSE_FSINDICATOR_NAME_TEXT "=" MOUSE_FSINDICATOR_VALUE_TEXT "\n",PlayerCfg.MouseFSIndicator); PHYSFSX_printf(fout,END_TEXT "\n");