shithub: cstory

Download patch

ref: e874b7535722a72456a20d2182b28f65f79a4f60
parent: 0cf1a781b715fe35978724b7a16352823ab02624
author: Clownacy <[email protected]>
date: Sat Apr 4 14:55:44 EDT 2020

Comment GLFW3 code, restore some vanilla behaviour

--- a/src/Backends/GLFW3/Controller.cpp
+++ b/src/Backends/GLFW3/Controller.cpp
@@ -11,6 +11,8 @@
 
 static BOOL joystick_connected;
 static int connected_joystick_id;
+static int joystick_neutral_x;
+static int joystick_neutral_y;
 
 static void JoystickCallback(int joystick_id, int event)
 {
@@ -21,13 +23,23 @@
 
 			if (!joystick_connected)
 			{
+				int total_axis;
+				const float *axis = glfwGetJoystickAxes(connected_joystick_id, &total_axis);
+
+				if (total_axis >= 2)
+				{
 #if GLFW_VERSION_MAJOR > 3 || (GLFW_VERSION_MAJOR == 3 && GLFW_VERSION_MINOR >= 3)
-				if (glfwJoystickIsGamepad(joystick_id) == GLFW_TRUE)	// Avoid selecting things like laptop touchpads
+					if (glfwJoystickIsGamepad(joystick_id) == GLFW_TRUE)	// Avoid selecting things like laptop touchpads
 #endif
-				{
-					printf("Joystick #%d selected\n", joystick_id);
-					joystick_connected = TRUE;
-					connected_joystick_id = joystick_id;
+					{
+						printf("Joystick #%d selected\n", joystick_id);
+						joystick_connected = TRUE;
+						connected_joystick_id = joystick_id;
+
+						// Reset default stick positions (this is performed in ResetJoystickStatus in vanilla Cave Story
+						joystick_neutral_x = axis[0];
+						joystick_neutral_y = axis[1];
+					}
 				}
 			}
 
@@ -51,10 +63,12 @@
 
 BOOL ControllerBackend_Init(void)
 {
+	// Connect joysticks that are already plugged-in
 	for (int i = GLFW_JOYSTICK_1; i < GLFW_JOYSTICK_LAST; ++i)
 		if (glfwJoystickPresent(i) == GLFW_TRUE)
 			JoystickCallback(i, GLFW_CONNECTED);
 
+	// Set-up the callback for future (dis)connections
 	glfwSetJoystickCallback(JoystickCallback);
 
 	return TRUE;
@@ -65,14 +79,16 @@
 	if (!joystick_connected)
 		return FALSE;
 
+	// Read axis
 	int total_axis;
 	const float *axis = glfwGetJoystickAxes(connected_joystick_id, &total_axis);
 
-	status->bLeft = axis[0] < -DEADZONE;
-	status->bRight = axis[0] > DEADZONE;
-	status->bUp = axis[1] < -DEADZONE;
-	status->bDown = axis[1] > DEADZONE;
+	status->bLeft = axis[0] < joystick_neutral_x - DEADZONE;
+	status->bRight = axis[0] > joystick_neutral_x + DEADZONE;
+	status->bUp = axis[1] < joystick_neutral_y - DEADZONE;
+	status->bDown = axis[1] > joystick_neutral_y + DEADZONE;
 
+	// Read buttons
 	int total_buttons;
 	const unsigned char *buttons = glfwGetJoystickButtons(connected_joystick_id, &total_buttons);
 
@@ -92,6 +108,8 @@
 {
 	if (!joystick_connected)
 		return FALSE;
+
+	// The code that would normally run here has been moved to JoystickCallback, to better-support hotplugging
 
 	return TRUE;
 }