shithub: cstory

Download patch

ref: b5eefd95f0523ec0065c20229b43330c644179cf
parent: 470a51219e2880b1bb5ada77348550e8640e04e9
author: Clownacy <Clownacy@users.noreply.github.com>
date: Tue Apr 14 22:16:13 EDT 2020

Change Wii U input to keyboard emulation

The keyboard API allows me to bind multiple buttons to the direction
keys, unlike the controller API. I probably need to rethink the
controller API at some point.

--- a/src/Backends/WiiU/Controller.cpp
+++ b/src/Backends/WiiU/Controller.cpp
@@ -1,76 +1,21 @@
 #include "../Controller.h"
 
-#include <vpad/input.h>
-
-#define DEADZONE (10000.0f / 32767.0f)
-
 bool ControllerBackend_Init(void)
 {
-	VPADInit();
-
-	return true;
+	return false;
 }
 
 void ControllerBackend_Deinit(void)
 {
-	VPADShutdown();
+	
 }
 
 bool ControllerBackend_GetJoystickStatus(bool **buttons, unsigned int *button_count, short **axes, unsigned int *axis_count)
 {
-	static bool button_buffer[27];
-	static short axis_buffer[4];
-
-	*buttons = button_buffer;
-	*axes = axis_buffer;
+	(void)buttons;
+	(void)button_count;
+	(void)axes;
+	(void)axis_count;
 
-	*button_count = sizeof(button_buffer) / sizeof(button_buffer[0]);
-	*axis_count = sizeof(axis_buffer) / sizeof(axis_buffer[0]);
-
-	VPADStatus vpad_status;
-	if (VPADRead(VPAD_CHAN_0, &vpad_status, 1, NULL) == 1)
-	{
-		//////////////////////////
-		// Handle button inputs //
-		//////////////////////////
-
-		button_buffer[0] = vpad_status.hold & VPAD_BUTTON_Y;     // Shoot
-		button_buffer[1] = vpad_status.hold & VPAD_BUTTON_B;     // Jump
-		button_buffer[2] = vpad_status.hold & VPAD_BUTTON_X;     // Map
-		button_buffer[3] = vpad_status.hold & VPAD_BUTTON_L;     // Weapon left
-		button_buffer[4] = vpad_status.hold & VPAD_BUTTON_R;     // Weapon right
-		button_buffer[5] = vpad_status.hold & VPAD_BUTTON_A;     // Inventory
-		button_buffer[6] = vpad_status.hold & VPAD_BUTTON_ZL;    // Weapon left
-		button_buffer[7] = vpad_status.hold & VPAD_BUTTON_ZR;    // Weapon right
-		button_buffer[8] = vpad_status.hold & VPAD_BUTTON_LEFT;
-		button_buffer[9] = vpad_status.hold & VPAD_BUTTON_RIGHT;
-		button_buffer[10] = vpad_status.hold & VPAD_BUTTON_UP;
-		button_buffer[11] = vpad_status.hold & VPAD_BUTTON_DOWN;
-		button_buffer[12] = vpad_status.hold & VPAD_BUTTON_PLUS;
-		button_buffer[13] = vpad_status.hold & VPAD_BUTTON_MINUS;
-		button_buffer[14] = vpad_status.hold & VPAD_BUTTON_HOME;
-		button_buffer[15] = vpad_status.hold & VPAD_BUTTON_SYNC;
-		button_buffer[16] = vpad_status.hold & VPAD_BUTTON_STICK_R;
-		button_buffer[17] = vpad_status.hold & VPAD_BUTTON_STICK_L;
-		button_buffer[18] = vpad_status.hold & VPAD_BUTTON_TV;
-		button_buffer[19] = vpad_status.hold & VPAD_STICK_R_EMULATION_LEFT;
-		button_buffer[20] = vpad_status.hold & VPAD_STICK_R_EMULATION_RIGHT;
-		button_buffer[21] = vpad_status.hold & VPAD_STICK_R_EMULATION_UP;
-		button_buffer[22] = vpad_status.hold & VPAD_STICK_R_EMULATION_DOWN;
-		button_buffer[23] = vpad_status.hold & VPAD_STICK_L_EMULATION_LEFT;
-		button_buffer[24] = vpad_status.hold & VPAD_STICK_L_EMULATION_RIGHT;
-		button_buffer[25] = vpad_status.hold & VPAD_STICK_L_EMULATION_UP;
-		button_buffer[26] = vpad_status.hold & VPAD_STICK_L_EMULATION_DOWN;
-
-		////////////////////////
-		// Handle axis inputs //
-		////////////////////////
-
-		axis_buffer[0] = (short)(vpad_status.leftStick.x * 0x7FFF);
-		axis_buffer[1] = (short)(vpad_status.leftStick.y * -0x7FFF);
-		axis_buffer[2] = (short)(vpad_status.rightStick.x * 0x7FFF);
-		axis_buffer[3] = (short)(vpad_status.rightStick.y * -0x7FFF);
-	}
-
-	return true;
+	return false;
 }
--- a/src/Backends/WiiU/Misc.cpp
+++ b/src/Backends/WiiU/Misc.cpp
@@ -3,7 +3,7 @@
 #include <string.h>
 
 #include <coreinit/thread.h>
-
+#include <vpad/input.h>
 #include <whb/proc.h>
 #include <whb/sdcard.h>
 
@@ -16,6 +16,8 @@
 	if (!WHBMountSdCard())
 		return FALSE;
 
+	VPADInit();
+
 	tick_delta = OSGetSystemInfo()->busClockSpeed / 4;
 
 	return true;
@@ -23,6 +25,8 @@
 
 void Backend_Deinit(void)
 {
+	VPADShutdown();
+
 	WHBUnmountSdCard();
 
 	WHBProcShutdown();
@@ -72,9 +76,26 @@
 	return WHBProcIsRunning();
 }
 
-void Backend_GetKeyboardState(bool *keyboard_state)
+void Backend_GetKeyboardState(bool *out_keyboard_state)
 {
-	memset(keyboard_state, 0, sizeof(bool) * BACKEND_KEYBOARD_TOTAL);
+	static bool keyboard_state[BACKEND_KEYBOARD_TOTAL];
+
+	VPADStatus vpad_status;
+	if (VPADRead(VPAD_CHAN_0, &vpad_status, 1, NULL) == 1)
+	{
+		keyboard_state[BACKEND_KEYBOARD_UP] = vpad_status.hold & (VPAD_BUTTON_UP | VPAD_STICK_L_EMULATION_UP);
+		keyboard_state[BACKEND_KEYBOARD_DOWN] = vpad_status.hold & (VPAD_BUTTON_DOWN | VPAD_STICK_L_EMULATION_DOWN);
+		keyboard_state[BACKEND_KEYBOARD_LEFT] = vpad_status.hold & (VPAD_BUTTON_LEFT | VPAD_STICK_L_EMULATION_LEFT);
+		keyboard_state[BACKEND_KEYBOARD_RIGHT] = vpad_status.hold & (VPAD_BUTTON_RIGHT | VPAD_STICK_L_EMULATION_RIGHT);
+		keyboard_state[BACKEND_KEYBOARD_Z] = vpad_status.hold & VPAD_BUTTON_B;                       // Jump
+		keyboard_state[BACKEND_KEYBOARD_X] = vpad_status.hold & VPAD_BUTTON_Y;                       // Shoot
+		keyboard_state[BACKEND_KEYBOARD_Q] = vpad_status.hold & (VPAD_BUTTON_A | VPAD_BUTTON_PLUS);  // Inventory
+		keyboard_state[BACKEND_KEYBOARD_W] = vpad_status.hold & (VPAD_BUTTON_X | VPAD_BUTTON_MINUS); // Map
+		keyboard_state[BACKEND_KEYBOARD_A] = vpad_status.hold & (VPAD_BUTTON_L | VPAD_BUTTON_ZL | VPAD_STICK_R_EMULATION_LEFT);  // Weapon left
+		keyboard_state[BACKEND_KEYBOARD_S] = vpad_status.hold & (VPAD_BUTTON_R | VPAD_BUTTON_ZR | VPAD_STICK_R_EMULATION_RIGHT); // Weapon right
+	}
+
+	memcpy(out_keyboard_state, keyboard_state, sizeof(keyboard_state));
 }
 
 void Backend_ShowMessageBox(const char *title, const char *message)