Implement Nonlinear Joystick Settings

[Kp: fix whitespace; squash fixes into main]
Requested-by: Mako88 <https://github.com/dxx-rebirth/dxx-rebirth/pull/84>
This commit is contained in:
John Ackerman 2015-06-09 18:42:50 -05:00 committed by Kp
parent f6d6f221ad
commit fe71a94d53
5 changed files with 45 additions and 1 deletions

View file

@ -86,6 +86,7 @@ struct control_info {
#endif
extern control_info Controls;
extern void convert_raw_joy_axis(int kcm_index, int player_cfg_index, int i);
extern void kconfig_read_controls(const d_event &event, int automap_flag);
extern void kconfig(int n, const char *title);

View file

@ -80,6 +80,8 @@ struct player_config
array<int, 5> KeyboardSens;
array<int, 6> JoystickSens;
array<int, 6> JoystickDead;
array<int, 6> JoystickLinear;
array<int, 6> JoystickSpeed;
ubyte MouseFlightSim;
array<int, 6> MouseSens;
int MouseFSDead;

View file

@ -1453,6 +1453,18 @@ static void clamp_symmetric_value(fix& value, const fix& bound)
clamp_value(value, -bound, bound);
}
void convert_raw_joy_axis(int kcm_index, int player_cfg_index, int i)
{
if (i == kcm_joystick[kcm_index].value) {
if (abs(Controls.raw_joy_axis[i]) <= (128 * PlayerCfg.JoystickLinear[player_cfg_index]) / 16) {
Controls.joy_axis[i] = (Controls.raw_joy_axis[i]*(FrameTime * PlayerCfg.JoystickSpeed[player_cfg_index]) / 16)/128;
}
else {
Controls.joy_axis[i] = (Controls.raw_joy_axis[i]*FrameTime)/128;
}
}
}
void kconfig_read_controls(const d_event &event, int automap_flag)
{
int speed_factor = cheats.turbo?2:1;
@ -1554,7 +1566,6 @@ void kconfig_read_controls(const d_event &event, int automap_flag)
Controls.raw_joy_axis[axis] = ((Controls.raw_joy_axis[axis]+joy_null_value)*128)/(128-joy_null_value);
else
Controls.raw_joy_axis[axis] = 0;
Controls.joy_axis[axis] = (Controls.raw_joy_axis[axis]*FrameTime)/128;
break;
}
case EVENT_MOUSE_MOVED:
@ -1600,6 +1611,16 @@ void kconfig_read_controls(const d_event &event, int automap_flag)
}
break;
}
for (int i = 0; i < JOY_MAX_AXES; i++) {
convert_raw_joy_axis(15, 0, i); // Turn L/R
convert_raw_joy_axis(13, 1, i); // Pitch U/D
convert_raw_joy_axis(17, 2, i); // Slide L/R
convert_raw_joy_axis(19, 3, i); // Slide U/D
convert_raw_joy_axis(21, 4, i); // Bank
convert_raw_joy_axis(23, 5, i); // Throttle
}
//------------ Read pitch_time -----------
if ( !Controls.state.slide_on )

View file

@ -1079,6 +1079,12 @@ static void input_config_sensitivity()
DXX_##VERB##_TEXT("Joystick Sensitivity:", opt_label_js) \
DXX_INPUT_THROTTLE_SENSITIVITY(VERB,js,PlayerCfg.JoystickSens) \
DXX_##VERB##_TEXT("", opt_label_blank_js) \
DXX_##VERB##_TEXT("Joystick Linearity:", opt_label_jl) \
DXX_INPUT_THROTTLE_SENSITIVITY(VERB,jl,PlayerCfg.JoystickLinear) \
DXX_##VERB##_TEXT("", opt_label_blank_jl) \
DXX_##VERB##_TEXT("Joystick Linear Speed:", opt_label_jp) \
DXX_INPUT_THROTTLE_SENSITIVITY(VERB,jp,PlayerCfg.JoystickSpeed) \
DXX_##VERB##_TEXT("", opt_label_blank_jp) \
DXX_##VERB##_TEXT("Joystick Deadzone:", opt_label_jd) \
DXX_INPUT_THROTTLE_SENSITIVITY(VERB,jd,PlayerCfg.JoystickDead) \
DXX_##VERB##_TEXT("", opt_label_blank_jd) \
@ -1109,6 +1115,8 @@ static void input_config_sensitivity()
constexpr uint_fast32_t keysens = items.opt_label_kb + 1;
constexpr uint_fast32_t joysens = items.opt_label_js + 1;
constexpr uint_fast32_t joylin = items.opt_label_jl + 1;
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;
const auto &m = items.m;
@ -1117,6 +1125,8 @@ static void input_config_sensitivity()
{
if (i < 5)
PlayerCfg.KeyboardSens[i] = m[keysens+i].value;
PlayerCfg.JoystickLinear[i] = m[joylin+i].value;
PlayerCfg.JoystickSpeed[i] = m[joyspd+i].value;
PlayerCfg.JoystickSens[i] = m[joysens+i].value;
PlayerCfg.JoystickDead[i] = m[joydead+i].value;
PlayerCfg.MouseSens[i] = m[mousesens+i].value;

View file

@ -130,6 +130,10 @@ COPYRIGHT 1993-1999 PARALLAX SOFTWARE CORPORATION. ALL RIGHTS RESERVED.
#define KEYBOARD_HEADER_TEXT "[keyboard]"
#define SENSITIVITY_NAME_TEXT "sensitivity"
#define SENSITIVITY_VALUE_TEXT "%d"
#define LINEAR_NAME_TEXT "linearity"
#define LINEAR_VALUE_TEXT "%d"
#define SPEED_NAME_TEXT "speed"
#define SPEED_VALUE_TEXT "%d"
#define DEADZONE_NAME_TEXT "deadzone"
#define DEADZONE_VALUE_TEXT "%d"
#define JOYSTICK_HEADER_TEXT "[joystick]"
@ -215,6 +219,8 @@ int new_player_config()
PlayerCfg.KeyboardSens[0] = PlayerCfg.KeyboardSens[1] = PlayerCfg.KeyboardSens[2] = PlayerCfg.KeyboardSens[3] = PlayerCfg.KeyboardSens[4] = 16;
PlayerCfg.JoystickSens[0] = PlayerCfg.JoystickSens[1] = PlayerCfg.JoystickSens[2] = PlayerCfg.JoystickSens[3] = PlayerCfg.JoystickSens[4] = PlayerCfg.JoystickSens[5] = 8;
PlayerCfg.JoystickDead[0] = PlayerCfg.JoystickDead[1] = PlayerCfg.JoystickDead[2] = PlayerCfg.JoystickDead[3] = PlayerCfg.JoystickDead[4] = PlayerCfg.JoystickDead[5] = 0;
PlayerCfg.JoystickLinear[0] = PlayerCfg.JoystickLinear[1] = PlayerCfg.JoystickLinear[2] = PlayerCfg.JoystickLinear[3] = PlayerCfg.JoystickLinear[4] = PlayerCfg.JoystickLinear[5] = 0;
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.MouseFSDead = 0;
@ -359,6 +365,8 @@ static int read_player_dxx(const char *filename)
if (!value)
continue;
convert_pattern_array(SENSITIVITY_NAME_TEXT, PlayerCfg.JoystickSens, line, value) ||
convert_pattern_array(LINEAR_NAME_TEXT, PlayerCfg.JoystickLinear, line, value) ||
convert_pattern_array(SPEED_NAME_TEXT, PlayerCfg.JoystickSpeed, line, value) ||
convert_pattern_array(DEADZONE_NAME_TEXT, PlayerCfg.JoystickDead, line, value);
}
}
@ -699,6 +707,8 @@ static int write_player_dxx(const char *filename)
PHYSFSX_printf(fout,END_TEXT "\n");
PHYSFSX_printf(fout,JOYSTICK_HEADER_TEXT "\n");
print_pattern_array(fout, SENSITIVITY_NAME_TEXT, PlayerCfg.JoystickSens);
print_pattern_array(fout, LINEAR_NAME_TEXT, PlayerCfg.JoystickLinear);
print_pattern_array(fout, SPEED_NAME_TEXT, PlayerCfg.JoystickSpeed);
print_pattern_array(fout, DEADZONE_NAME_TEXT, PlayerCfg.JoystickDead);
PHYSFSX_printf(fout,END_TEXT "\n");
PHYSFSX_printf(fout,MOUSE_HEADER_TEXT "\n");