From fe71a94d53d7709e90b9fbf4dfe17b5efd37e872 Mon Sep 17 00:00:00 2001 From: John Ackerman Date: Tue, 9 Jun 2015 18:42:50 -0500 Subject: [PATCH] Implement Nonlinear Joystick Settings [Kp: fix whitespace; squash fixes into main] Requested-by: Mako88 --- common/main/kconfig.h | 1 + common/main/playsave.h | 2 ++ similar/main/kconfig.cpp | 23 ++++++++++++++++++++++- similar/main/menu.cpp | 10 ++++++++++ similar/main/playsave.cpp | 10 ++++++++++ 5 files changed, 45 insertions(+), 1 deletion(-) diff --git a/common/main/kconfig.h b/common/main/kconfig.h index 6685fd200..dcaaf5c43 100644 --- a/common/main/kconfig.h +++ b/common/main/kconfig.h @@ -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); diff --git a/common/main/playsave.h b/common/main/playsave.h index 30b55991d..b85baed0a 100644 --- a/common/main/playsave.h +++ b/common/main/playsave.h @@ -80,6 +80,8 @@ struct player_config array KeyboardSens; array JoystickSens; array JoystickDead; + array JoystickLinear; + array JoystickSpeed; ubyte MouseFlightSim; array MouseSens; int MouseFSDead; diff --git a/similar/main/kconfig.cpp b/similar/main/kconfig.cpp index d7337c63c..3a639aba3 100644 --- a/similar/main/kconfig.cpp +++ b/similar/main/kconfig.cpp @@ -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 ) diff --git a/similar/main/menu.cpp b/similar/main/menu.cpp index 6c12c24ed..50048d03f 100644 --- a/similar/main/menu.cpp +++ b/similar/main/menu.cpp @@ -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; diff --git a/similar/main/playsave.cpp b/similar/main/playsave.cpp index ce8ea36b4..b9e422bc1 100644 --- a/similar/main/playsave.cpp +++ b/similar/main/playsave.cpp @@ -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");