Improve button combo detection

This commit is contained in:
Maschell 2023-01-26 16:20:13 +01:00
parent 028946cd50
commit 378654f668
3 changed files with 32 additions and 146 deletions

View File

@ -83,6 +83,7 @@ void RequestScreenshot() {
}
}
static uint32_t sWasHoldForXFrameGamePad;
DECL_FUNCTION(int32_t, VPADRead, VPADChan chan, VPADStatus *buffer, uint32_t buffer_size, VPADReadError *error) {
VPADReadError real_error;
int32_t result = real_VPADRead(chan, buffer, buffer_size, &real_error);
@ -94,12 +95,22 @@ DECL_FUNCTION(int32_t, VPADRead, VPADChan chan, VPADStatus *buffer, uint32_t buf
if (VPADGetButtonProcMode(chan) == 1) {
end = result;
}
bool found = false;
for (uint32_t i = 0; i < end; i++) {
if (((buffer[i].trigger & 0x000FFFFF) == gButtonCombo)) {
RequestScreenshot();
if ((((buffer[i].hold & 0x000FFFFF) & gButtonCombo) == gButtonCombo)) {
found = true;
break;
}
}
if (found) {
if (sWasHoldForXFrameGamePad == 0) {
RequestScreenshot();
}
sWasHoldForXFrameGamePad++;
} else {
sWasHoldForXFrameGamePad = 0;
}
}
}
@ -110,6 +121,7 @@ DECL_FUNCTION(int32_t, VPADRead, VPADChan chan, VPADStatus *buffer, uint32_t buf
}
static uint32_t sWPADLastButtonHold[4];
static uint32_t sWasHoldForXFrame[4];
DECL_FUNCTION(void, WPADRead, WPADChan chan, WPADStatusProController *data) {
real_WPADRead(chan, data);
@ -117,29 +129,34 @@ DECL_FUNCTION(void, WPADRead, WPADChan chan, WPADStatusProController *data) {
if (data[0].err == 0) {
if (data[0].extensionType != 0xFF) {
uint32_t curButtonHold = 0;
uint32_t buttonComboConverted = 0;
if (data[0].extensionType == WPAD_EXT_CORE || data[0].extensionType == WPAD_EXT_NUNCHUK) {
buttonComboConverted = remapVPADtoWiimote(gButtonCombo);
// button data is in the first 2 bytes for wiimotes
curButtonHold = ((uint16_t *) data)[0];
curButtonHold = remapWiiMoteButtons(((uint16_t *) data)[0]);
} else if (data[0].extensionType == WPAD_EXT_CLASSIC) {
buttonComboConverted = remapVPADtoClassic(gButtonCombo);
curButtonHold = (((uint32_t *) data)[10] & 0xFFFF);
curButtonHold = remapClassicButtons(((uint32_t *) data)[10] & 0xFFFF);
} else if (data[0].extensionType == WPAD_EXT_PRO_CONTROLLER) {
buttonComboConverted = remapVPADtoPro(gButtonCombo);
curButtonHold = data[0].buttons;
curButtonHold = remapProButtons(data[0].buttons);
}
uint32_t curButtonTrigger = (curButtonHold & (~(sWPADLastButtonHold[chan])));
bool forceScreenshot = false;
if (gReservedBitUsage && data[0].extensionType == WPAD_EXT_PRO_CONTROLLER) {
if (curButtonTrigger == WPAD_PRO_RESERVED) {
forceScreenshot = true;
bool takeScreenshot = false;
if (gReservedBitUsage && curButtonTrigger & VPAD_BUTTON_RESERVED_BIT) {
takeScreenshot = true;
}
if (!takeScreenshot) {
if ((gButtonCombo != 0 && (curButtonHold & gButtonCombo) == gButtonCombo)) {
if (sWasHoldForXFrame[chan] == 0) {
takeScreenshot = true;
}
sWasHoldForXFrame[chan]++;
} else {
sWasHoldForXFrame[chan] = 0;
}
}
if (forceScreenshot || (buttonComboConverted != 0 && curButtonTrigger == buttonComboConverted)) {
if (takeScreenshot) {
RequestScreenshot();
}

View File

@ -1,132 +1,5 @@
#include "input.h"
uint32_t remapVPADtoWiimote(uint32_t buttons) {
uint32_t conv_buttons = 0;
if (buttons & VPAD_BUTTON_A) {
conv_buttons |= WPAD_BUTTON_A;
}
if (buttons & VPAD_BUTTON_B) {
conv_buttons |= WPAD_BUTTON_B;
}
if (buttons & VPAD_BUTTON_UP) {
conv_buttons |= WPAD_BUTTON_UP;
}
if (buttons & VPAD_BUTTON_DOWN) {
conv_buttons |= WPAD_BUTTON_DOWN;
}
if (buttons & VPAD_BUTTON_LEFT) {
conv_buttons |= WPAD_BUTTON_LEFT;
}
if (buttons & VPAD_BUTTON_RIGHT) {
conv_buttons |= WPAD_BUTTON_RIGHT;
}
if (buttons & VPAD_BUTTON_PLUS) {
conv_buttons |= WPAD_BUTTON_PLUS;
}
if (buttons & VPAD_BUTTON_MINUS) {
conv_buttons |= WPAD_BUTTON_MINUS;
}
return conv_buttons;
}
uint32_t remapVPADtoClassic(uint32_t buttons) {
uint32_t conv_buttons = 0;
if (buttons & VPAD_BUTTON_A) {
conv_buttons |= WPAD_CLASSIC_BUTTON_A;
}
if (buttons & VPAD_BUTTON_B) {
conv_buttons |= WPAD_CLASSIC_BUTTON_B;
}
if (buttons & VPAD_BUTTON_X) {
conv_buttons |= WPAD_CLASSIC_BUTTON_X;
}
if (buttons & VPAD_BUTTON_Y) {
conv_buttons |= WPAD_CLASSIC_BUTTON_Y;
}
if (buttons & VPAD_BUTTON_L) {
conv_buttons |= WPAD_CLASSIC_BUTTON_L;
}
if (buttons & VPAD_BUTTON_R) {
conv_buttons |= WPAD_CLASSIC_BUTTON_R;
}
if (buttons & VPAD_BUTTON_ZL) {
conv_buttons |= WPAD_CLASSIC_BUTTON_ZL;
}
if (buttons & VPAD_BUTTON_ZR) {
conv_buttons |= WPAD_CLASSIC_BUTTON_ZR;
}
if (buttons & VPAD_BUTTON_UP) {
conv_buttons |= WPAD_CLASSIC_BUTTON_UP;
}
if (buttons & VPAD_BUTTON_DOWN) {
conv_buttons |= WPAD_CLASSIC_BUTTON_DOWN;
}
if (buttons & VPAD_BUTTON_LEFT) {
conv_buttons |= WPAD_CLASSIC_BUTTON_LEFT;
}
if (buttons & VPAD_BUTTON_RIGHT) {
conv_buttons |= WPAD_CLASSIC_BUTTON_RIGHT;
}
if (buttons & VPAD_BUTTON_PLUS) {
conv_buttons |= WPAD_CLASSIC_BUTTON_PLUS;
}
if (buttons & VPAD_BUTTON_MINUS) {
conv_buttons |= WPAD_CLASSIC_BUTTON_MINUS;
}
return conv_buttons;
}
uint32_t remapVPADtoPro(uint32_t buttons) {
uint32_t conv_buttons = 0;
if (buttons & VPAD_BUTTON_A) {
conv_buttons |= WPAD_PRO_BUTTON_A;
}
if (buttons & VPAD_BUTTON_B) {
conv_buttons |= WPAD_PRO_BUTTON_B;
}
if (buttons & VPAD_BUTTON_X) {
conv_buttons |= WPAD_PRO_BUTTON_X;
}
if (buttons & VPAD_BUTTON_Y) {
conv_buttons |= WPAD_PRO_BUTTON_Y;
}
if (buttons & VPAD_BUTTON_L) {
conv_buttons |= WPAD_PRO_TRIGGER_L;
}
if (buttons & VPAD_BUTTON_R) {
conv_buttons |= WPAD_PRO_TRIGGER_R;
}
if (buttons & VPAD_BUTTON_ZL) {
conv_buttons |= WPAD_PRO_TRIGGER_ZL;
}
if (buttons & VPAD_BUTTON_ZR) {
conv_buttons |= WPAD_PRO_TRIGGER_ZR;
}
if (buttons & VPAD_BUTTON_UP) {
conv_buttons |= WPAD_PRO_BUTTON_UP;
}
if (buttons & VPAD_BUTTON_DOWN) {
conv_buttons |= WPAD_PRO_BUTTON_DOWN;
}
if (buttons & VPAD_BUTTON_LEFT) {
conv_buttons |= WPAD_PRO_BUTTON_LEFT;
}
if (buttons & VPAD_BUTTON_RIGHT) {
conv_buttons |= WPAD_PRO_BUTTON_RIGHT;
}
if (buttons & VPAD_BUTTON_PLUS) {
conv_buttons |= WPAD_PRO_BUTTON_PLUS;
}
if (buttons & VPAD_BUTTON_MINUS) {
conv_buttons |= WPAD_PRO_BUTTON_MINUS;
}
if (buttons & VPAD_BUTTON_RESERVED_BIT) {
conv_buttons |= WPAD_PRO_RESERVED;
}
return conv_buttons;
}
uint32_t remapWiiMoteButtons(uint32_t buttons) {
uint32_t conv_buttons = 0;

View File

@ -6,10 +6,6 @@
#define VPAD_BUTTON_RESERVED_BIT 0x80000
uint32_t remapVPADtoWiimote(uint32_t buttons);
uint32_t remapVPADtoClassic(uint32_t buttons);
uint32_t remapVPADtoPro(uint32_t buttons);
uint32_t remapWiiMoteButtons(uint32_t buttons);
uint32_t remapClassicButtons(uint32_t buttons);
uint32_t remapProButtons(uint32_t buttons);