From 50c86b3c2ac55c474208681494ec458d24850ae7 Mon Sep 17 00:00:00 2001
From: german77 <juangerman-13@hotmail.com>
Date: Sat, 14 Jan 2023 11:53:43 -0600
Subject: [PATCH] core: hid: Fix stick minimum range

---
 src/core/hid/emulated_controller.cpp | 12 ++++++++++--
 1 file changed, 10 insertions(+), 2 deletions(-)

diff --git a/src/core/hid/emulated_controller.cpp b/src/core/hid/emulated_controller.cpp
index 7a01f3f4c..a959c9db9 100644
--- a/src/core/hid/emulated_controller.cpp
+++ b/src/core/hid/emulated_controller.cpp
@@ -10,6 +10,7 @@
 
 namespace Core::HID {
 constexpr s32 HID_JOYSTICK_MAX = 0x7fff;
+constexpr s32 HID_JOYSTICK_MIN = 0x7ffe;
 constexpr s32 HID_TRIGGER_MAX = 0x7fff;
 // Use a common UUID for TAS and Virtual Gamepad
 constexpr Common::UUID TAS_UUID =
@@ -798,9 +799,16 @@ void EmulatedController::SetStick(const Common::Input::CallbackStatus& callback,
         return;
     }
 
+    const auto FloatToShort = [](float a) {
+        if (a > 0) {
+            return static_cast<s32>(a * HID_JOYSTICK_MAX);
+        }
+        return static_cast<s32>(a * HID_JOYSTICK_MIN);
+    };
+
     const AnalogStickState stick{
-        .x = static_cast<s32>(controller.stick_values[index].x.value * HID_JOYSTICK_MAX),
-        .y = static_cast<s32>(controller.stick_values[index].y.value * HID_JOYSTICK_MAX),
+        .x = FloatToShort(controller.stick_values[index].x.value),
+        .y = FloatToShort(controller.stick_values[index].y.value),
     };
 
     switch (index) {