From b5eefd95f0523ec0065c20229b43330c644179cf Mon Sep 17 00:00:00 2001 From: Clownacy Date: Wed, 15 Apr 2020 02:16:13 +0100 Subject: [PATCH] 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. --- src/Backends/WiiU/Controller.cpp | 69 ++++---------------------------- src/Backends/WiiU/Misc.cpp | 27 +++++++++++-- 2 files changed, 31 insertions(+), 65 deletions(-) diff --git a/src/Backends/WiiU/Controller.cpp b/src/Backends/WiiU/Controller.cpp index 71f96d37..65359a8f 100644 --- a/src/Backends/WiiU/Controller.cpp +++ b/src/Backends/WiiU/Controller.cpp @@ -1,76 +1,21 @@ #include "../Controller.h" -#include - -#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]; + (void)buttons; + (void)button_count; + (void)axes; + (void)axis_count; - *buttons = button_buffer; - *axes = axis_buffer; - - *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; } diff --git a/src/Backends/WiiU/Misc.cpp b/src/Backends/WiiU/Misc.cpp index c8f50561..8921c04a 100644 --- a/src/Backends/WiiU/Misc.cpp +++ b/src/Backends/WiiU/Misc.cpp @@ -3,7 +3,7 @@ #include #include - +#include #include #include @@ -16,6 +16,8 @@ bool Backend_Init(void) if (!WHBMountSdCard()) return FALSE; + VPADInit(); + tick_delta = OSGetSystemInfo()->busClockSpeed / 4; return true; @@ -23,6 +25,8 @@ bool Backend_Init(void) void Backend_Deinit(void) { + VPADShutdown(); + WHBUnmountSdCard(); WHBProcShutdown(); @@ -72,9 +76,26 @@ bool Backend_SystemTask(bool active) 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)