Added Mouse Overrun Buffer option as proposed by kp

This commit is contained in:
zico 2015-09-24 16:31:10 +02:00
parent 609e6ca584
commit d3660207d2
5 changed files with 28 additions and 6 deletions

View file

@ -74,6 +74,7 @@ struct control_info {
};
ramp_controls_t<float> 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<fix, JOY_MAX_AXES> joy_axis, raw_joy_axis;
array<fix, 3> mouse_axis, raw_mouse_axis;

View file

@ -85,6 +85,7 @@ struct player_config
array<int, 6> JoystickSpeed;
ubyte MouseFlightSim;
array<int, 6> MouseSens;
array<int, 6> MouseOverrun;
int MouseFSDead;
int MouseFSIndicator;
array<cockpit_mode_t, 2> CockpitMode; // 0 saves the "real" cockpit, 1 also saves letterbox and rear. Used to properly switch between modes and restore the real one.

View file

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

View file

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

View file

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