From 230af569ed80772cf149020f1f8dfb88fe5059c8 Mon Sep 17 00:00:00 2001 From: iwubcode Date: Sat, 5 May 2018 23:08:37 -0500 Subject: [PATCH] Input - Make dynamic rules be definable per game. Configuration can now define how many frames constitute a high or a low swing/shake when the button is down. Also configurable is the number of frames to execute the swing/shake after the button is released. --- .../Core/Core/Config/WiimoteInputSettings.cpp | 9 +++++++ .../Core/Core/Config/WiimoteInputSettings.h | 10 +++++++ Source/Core/Core/HW/WiimoteEmu/WiimoteEmu.cpp | 26 +++++++++---------- Source/Core/Core/HW/WiimoteEmu/WiimoteEmu.h | 7 +++++ 4 files changed, 38 insertions(+), 14 deletions(-) diff --git a/Source/Core/Core/Config/WiimoteInputSettings.cpp b/Source/Core/Core/Config/WiimoteInputSettings.cpp index a60ed45e9f..ebe61bfc68 100644 --- a/Source/Core/Core/Config/WiimoteInputSettings.cpp +++ b/Source/Core/Core/Config/WiimoteInputSettings.cpp @@ -18,6 +18,15 @@ namespace Config const ConfigInfo WIIMOTE_INPUT_SHAKE_INTENSITY_MEDIUM{ { System::WiiPad, "Shake", "Medium" }, 3.0 }; const ConfigInfo WIIMOTE_INPUT_SHAKE_INTENSITY_SOFT{ { System::WiiPad, "Shake", "Soft" }, 2.0 }; + // Dynamic settings + const ConfigInfo WIIMOTE_INPUT_SWING_DYNAMIC_FRAMES_HELD_FAST{ { System::WiiPad, "Dynamic_Swing", "FramesHeldFast" }, 100 }; + const ConfigInfo WIIMOTE_INPUT_SWING_DYNAMIC_FRAMES_HELD_SLOW{ { System::WiiPad, "Dynamic_Swing", "FramesHeldSlow" }, 30 }; + const ConfigInfo WIIMOTE_INPUT_SWING_DYNAMIC_FRAMES_LENGTH{ { System::WiiPad, "Dynamic_Swing", "FrameCount" }, 30 }; + + const ConfigInfo WIIMOTE_INPUT_SHAKE_DYNAMIC_FRAMES_HELD_HARD{ { System::WiiPad, "Dynamic_Shake", "FramesHeldHard" }, 45 }; + const ConfigInfo WIIMOTE_INPUT_SHAKE_DYNAMIC_FRAMES_HELD_SOFT{ { System::WiiPad, "Dynamic_Shake", "FramesHeldSoft" }, 15 }; + const ConfigInfo WIIMOTE_INPUT_SHAKE_DYNAMIC_FRAMES_LENGTH{ { System::WiiPad, "Dynamic_Shake", "FrameCount" }, 30 }; + // NunchuckInput.Settings const ConfigInfo NUNCHUK_INPUT_SWING_INTENSITY_FAST{ { System::WiiPad, "Nunchuk_Swing", "Fast" }, 4.5 }; diff --git a/Source/Core/Core/Config/WiimoteInputSettings.h b/Source/Core/Core/Config/WiimoteInputSettings.h index 44ab85b37d..17cacffbc4 100644 --- a/Source/Core/Core/Config/WiimoteInputSettings.h +++ b/Source/Core/Core/Config/WiimoteInputSettings.h @@ -20,6 +20,16 @@ namespace Config extern const ConfigInfo WIIMOTE_INPUT_SHAKE_INTENSITY_MEDIUM; extern const ConfigInfo WIIMOTE_INPUT_SHAKE_INTENSITY_SOFT; + // Below settings are for dynamic input only (based on how long the user holds a button) + + extern const ConfigInfo WIIMOTE_INPUT_SWING_DYNAMIC_FRAMES_HELD_FAST; // How long button held constitutes a fast swing + extern const ConfigInfo WIIMOTE_INPUT_SWING_DYNAMIC_FRAMES_HELD_SLOW; // How long button held constitutes a slow swing + extern const ConfigInfo WIIMOTE_INPUT_SWING_DYNAMIC_FRAMES_LENGTH; // How long to execute the swing + + extern const ConfigInfo WIIMOTE_INPUT_SHAKE_DYNAMIC_FRAMES_HELD_HARD; // How long button held constitutes a hard shake + extern const ConfigInfo WIIMOTE_INPUT_SHAKE_DYNAMIC_FRAMES_HELD_SOFT; // How long button held constitutes a soft shake + extern const ConfigInfo WIIMOTE_INPUT_SHAKE_DYNAMIC_FRAMES_LENGTH; // How long to execute a shake + // NunchuckInput.Settings extern const ConfigInfo NUNCHUK_INPUT_SWING_INTENSITY_FAST; diff --git a/Source/Core/Core/HW/WiimoteEmu/WiimoteEmu.cpp b/Source/Core/Core/HW/WiimoteEmu/WiimoteEmu.cpp index b45942c2e6..14853484bb 100644 --- a/Source/Core/Core/HW/WiimoteEmu/WiimoteEmu.cpp +++ b/Source/Core/Core/HW/WiimoteEmu/WiimoteEmu.cpp @@ -135,10 +135,6 @@ void EmulateDynamicShake(AccelData* const accel, DynamicData& dynamic_data, Cont unsigned int shake = 0; buttons_group->GetState(&shake, btns); - static const int frames_high = 45; - static const int frames_low = 15; - static const int frames_to_execute = 31; // about 2 shake-loops - for (int i = 0; i != 3; ++i) { if ((shake & (1 << i)) && dynamic_data.executing_frames_left[i] == 0) @@ -153,11 +149,11 @@ void EmulateDynamicShake(AccelData* const accel, DynamicData& dynamic_data, Cont } else if (shake == 0 && dynamic_data.timing[i] > 0) { - if (dynamic_data.timing[i] > frames_high) + if (dynamic_data.timing[i] > config.frames_needed_for_high_intensity) { dynamic_data.intensity[i] = config.high_intensity; } - else if (dynamic_data.timing[i] < frames_low) + else if (dynamic_data.timing[i] < config.frames_needed_for_low_intensity) { dynamic_data.intensity[i] = config.low_intensity; } @@ -166,7 +162,7 @@ void EmulateDynamicShake(AccelData* const accel, DynamicData& dynamic_data, Cont dynamic_data.intensity[i] = config.med_intensity; } dynamic_data.timing[i] = 0; - dynamic_data.executing_frames_left[i] = frames_to_execute; + dynamic_data.executing_frames_left[i] = config.frames_to_execute; } else { @@ -256,10 +252,6 @@ void EmulateDynamicSwing(AccelData* const accel, DynamicData& dynamic_data, if (!sideways && upright) g_dir[axis_map[0]] *= -1; - static const int frames_high = 100; - static const int frames_low = 30; - static const int frames_to_execute = 30; - for (unsigned int i = 0; i < 3; ++i) { if (swing[i] > 0 && dynamic_data.executing_frames_left[i] == 0) @@ -273,11 +265,11 @@ void EmulateDynamicSwing(AccelData* const accel, DynamicData& dynamic_data, } else if (swing[i] == 0 && dynamic_data.timing[i] > 0) { - if (dynamic_data.timing[i] > frames_high) + if (dynamic_data.timing[i] > config.frames_needed_for_high_intensity) { dynamic_data.intensity[i] = config.high_intensity; } - else if (dynamic_data.timing[i] < frames_low) + else if (dynamic_data.timing[i] < config.frames_needed_for_low_intensity) { dynamic_data.intensity[i] = config.low_intensity; } @@ -286,7 +278,7 @@ void EmulateDynamicSwing(AccelData* const accel, DynamicData& dynamic_data, dynamic_data.intensity[i] = config.med_intensity; } dynamic_data.timing[i] = 0; - dynamic_data.executing_frames_left[i] = frames_to_execute; + dynamic_data.executing_frames_left[i] = config.frames_to_execute; } } } @@ -612,6 +604,9 @@ void Wiimote::GetAccelData(u8* const data, const ReportFeatures& rptf) swing_config.low_intensity = Config::Get(Config::WIIMOTE_INPUT_SWING_INTENSITY_SLOW); swing_config.med_intensity = Config::Get(Config::WIIMOTE_INPUT_SWING_INTENSITY_MEDIUM); swing_config.high_intensity = Config::Get(Config::WIIMOTE_INPUT_SWING_INTENSITY_FAST); + swing_config.frames_needed_for_high_intensity = Config::Get(Config::WIIMOTE_INPUT_SWING_DYNAMIC_FRAMES_HELD_FAST); + swing_config.frames_needed_for_low_intensity = Config::Get(Config::WIIMOTE_INPUT_SWING_DYNAMIC_FRAMES_HELD_SLOW); + swing_config.frames_to_execute = Config::Get(Config::WIIMOTE_INPUT_SWING_DYNAMIC_FRAMES_LENGTH); EmulateSwing(&m_accel, m_swing, Config::Get(Config::WIIMOTE_INPUT_SWING_INTENSITY_MEDIUM), is_sideways, is_upright); EmulateSwing(&m_accel, m_swing_slow, Config::Get(Config::WIIMOTE_INPUT_SWING_INTENSITY_SLOW), is_sideways, is_upright); @@ -623,6 +618,9 @@ void Wiimote::GetAccelData(u8* const data, const ReportFeatures& rptf) shake_config.low_intensity = Config::Get(Config::WIIMOTE_INPUT_SHAKE_INTENSITY_SOFT); shake_config.med_intensity = Config::Get(Config::WIIMOTE_INPUT_SHAKE_INTENSITY_MEDIUM); shake_config.high_intensity = Config::Get(Config::WIIMOTE_INPUT_SHAKE_INTENSITY_HARD); + shake_config.frames_needed_for_high_intensity = Config::Get(Config::WIIMOTE_INPUT_SHAKE_DYNAMIC_FRAMES_HELD_HARD); + shake_config.frames_needed_for_low_intensity = Config::Get(Config::WIIMOTE_INPUT_SHAKE_DYNAMIC_FRAMES_HELD_SOFT); + shake_config.frames_to_execute = Config::Get(Config::WIIMOTE_INPUT_SHAKE_DYNAMIC_FRAMES_LENGTH); EmulateShake(&m_accel, m_shake, Config::Get(Config::WIIMOTE_INPUT_SHAKE_INTENSITY_MEDIUM), m_shake_step.data()); EmulateShake(&m_accel, m_shake_soft, Config::Get(Config::WIIMOTE_INPUT_SHAKE_INTENSITY_SOFT), m_shake_soft_step.data()); diff --git a/Source/Core/Core/HW/WiimoteEmu/WiimoteEmu.h b/Source/Core/Core/HW/WiimoteEmu/WiimoteEmu.h index 6c22a9e2f8..8fbb761b13 100644 --- a/Source/Core/Core/HW/WiimoteEmu/WiimoteEmu.h +++ b/Source/Core/Core/HW/WiimoteEmu/WiimoteEmu.h @@ -140,8 +140,15 @@ struct DynamicData struct DynamicConfiguration { double low_intensity; + int frames_needed_for_low_intensity; + double med_intensity; + // Frames needed for med intensity can be calculated between high & low + double high_intensity; + int frames_needed_for_high_intensity; + + int frames_to_execute; // How many frames should we execute the action for? }; struct ADPCMState