Wii/GameCube: Add untested Wii Classic controller support, try adding a deadzone for GameCube controller, try fixing camera movement from GameCube controller being too slow

This commit is contained in:
UnknownShadow200 2023-07-30 17:33:09 +10:00
parent 9ca9977999
commit 89c31c70af

View File

@ -78,6 +78,7 @@ void Window_Close(void) {
/* TODO implement */ /* TODO implement */
} }
/*########################################################################################################################* /*########################################################################################################################*
*---------------------------------------------GameCube controller processing----------------------------------------------* *---------------------------------------------GameCube controller processing----------------------------------------------*
*#########################################################################################################################*/ *#########################################################################################################################*/
@ -94,13 +95,18 @@ static void ProcessPAD_Launcher(PADStatus* pad) {
Input_SetNonRepeatable(IPT_UP, mods & PAD_BUTTON_UP); Input_SetNonRepeatable(IPT_UP, mods & PAD_BUTTON_UP);
Input_SetNonRepeatable(IPT_DOWN, mods & PAD_BUTTON_DOWN); Input_SetNonRepeatable(IPT_DOWN, mods & PAD_BUTTON_DOWN);
} }
static void ProcessPAD_Game(PADStatus* pad) { static void ProcessPAD_Game(PADStatus* pad) {
int mods = pad->button; int mods = pad->button;
int dx = pad->substickX; int dx = pad->substickX;
int dy = pad->substickY; int dy = pad->substickY;
if (Input_RawMode && (Math_AbsI(dx) > 1 || Math_AbsI(dy) > 1)) { if (Input_RawMode) {
Event_RaiseRawMove(&PointerEvents.RawMoved, dx / 32.0f, dy / 32.0f); // May not be exactly 0 on actual hardware
if (Math_AbsI(dx) <= 4) dx = 0;
if (Math_AbsI(dy) <= 4) dy = 0;
Event_RaiseRawMove(&PointerEvents.RawMoved, dx / 8.0f, dy / 8.0f);
} }
Input_SetNonRepeatable(KeyBinds[KEYBIND_PLACE_BLOCK], mods & PAD_TRIGGER_L); Input_SetNonRepeatable(KeyBinds[KEYBIND_PLACE_BLOCK], mods & PAD_TRIGGER_L);
@ -137,6 +143,7 @@ static void ProcessPADInput(void) {
} }
} }
/*########################################################################################################################* /*########################################################################################################################*
*----------------------------------------------------Input processing-----------------------------------------------------* *----------------------------------------------------Input processing-----------------------------------------------------*
*#########################################################################################################################*/ *#########################################################################################################################*/
@ -144,6 +151,7 @@ static void ProcessPADInput(void) {
static int dragCursorX; static int dragCursorX;
static int dragCursorY; static int dragCursorY;
static cc_bool dragOn; static cc_bool dragOn;
static void ProcessWPAD_Launcher(int mods) { static void ProcessWPAD_Launcher(int mods) {
Input_SetNonRepeatable(IPT_ENTER, mods & WPAD_BUTTON_A); Input_SetNonRepeatable(IPT_ENTER, mods & WPAD_BUTTON_A);
Input_SetNonRepeatable(IPT_ESCAPE, mods & WPAD_BUTTON_B); Input_SetNonRepeatable(IPT_ESCAPE, mods & WPAD_BUTTON_B);
@ -153,32 +161,31 @@ static void ProcessWPAD_Launcher(int mods) {
Input_SetNonRepeatable(IPT_UP, mods & WPAD_BUTTON_UP); Input_SetNonRepeatable(IPT_UP, mods & WPAD_BUTTON_UP);
Input_SetNonRepeatable(IPT_DOWN, mods & WPAD_BUTTON_DOWN); Input_SetNonRepeatable(IPT_DOWN, mods & WPAD_BUTTON_DOWN);
} }
static void ProcessKeyboardInput(void) {
keyboard_event ke;
int res = KEYBOARD_GetEvent(&ke);
if (res && ke.type == KEYBOARD_PRESSED) static void ProcessWPAD_Game(int mods) {
{ Input_SetNonRepeatable(KeyBinds[KEYBIND_PLACE_BLOCK], mods & WPAD_BUTTON_1);
//Platform_Log2("KEYCODE: %i (%i)", &ke.keycode, &ke.type); Input_SetNonRepeatable(KeyBinds[KEYBIND_DELETE_BLOCK], mods & WPAD_BUTTON_2);
if (ke.symbol) Event_RaiseInt(&InputEvents.Press, ke.symbol);
} Input_SetNonRepeatable(KeyBinds[KEYBIND_JUMP], mods & WPAD_BUTTON_A);
Input_SetNonRepeatable(KeyBinds[KEYBIND_INVENTORY], mods & WPAD_BUTTON_PLUS);
// TODO: WPAD_BUTTON_B
Input_SetNonRepeatable(IPT_ENTER, mods & WPAD_BUTTON_HOME);
Input_SetNonRepeatable(IPT_ESCAPE, mods & WPAD_BUTTON_MINUS);
Input_SetNonRepeatable(KeyBinds[KEYBIND_LEFT], mods & WPAD_BUTTON_LEFT);
Input_SetNonRepeatable(IPT_LEFT, mods & WPAD_BUTTON_LEFT);
Input_SetNonRepeatable(KeyBinds[KEYBIND_RIGHT], mods & WPAD_BUTTON_RIGHT);
Input_SetNonRepeatable(IPT_RIGHT, mods & WPAD_BUTTON_RIGHT);
Input_SetNonRepeatable(KeyBinds[KEYBIND_FORWARD], mods & WPAD_BUTTON_UP);
Input_SetNonRepeatable(IPT_UP, mods & WPAD_BUTTON_UP);
Input_SetNonRepeatable(KeyBinds[KEYBIND_BACK], mods & WPAD_BUTTON_DOWN);
Input_SetNonRepeatable(IPT_DOWN, mods & WPAD_BUTTON_DOWN);
} }
void Window_ProcessEvents(double delta) { static void ProcessNunchuck_Game(int mods, double delta) {
/* TODO implement */ WPADData* wd = WPAD_Data(0);
int x, y;
Cursor_GetRawPos(&x, &y);
WPAD_ScanPads();
u32 mods = WPAD_ButtonsDown(0) | WPAD_ButtonsHeld(0);
u32 res;
WPAD_Probe(0, &res);
if (launcherMode) {
ProcessWPAD_Launcher(mods);
} else if (res == WPAD_EXP_NUNCHUK) {
WPADData *wd = WPAD_Data(0);
joystick_t analog = wd->exp.nunchuk.js; joystick_t analog = wd->exp.nunchuk.js;
Input_SetNonRepeatable(KeyBinds[KEYBIND_PLACE_BLOCK], mods & WPAD_NUNCHUK_BUTTON_C); Input_SetNonRepeatable(KeyBinds[KEYBIND_PLACE_BLOCK], mods & WPAD_NUNCHUK_BUTTON_C);
@ -193,7 +200,6 @@ void Window_ProcessEvents(double delta) {
Input_SetNonRepeatable(KeyBinds[KEYBIND_FLY], mods & WPAD_BUTTON_LEFT); Input_SetNonRepeatable(KeyBinds[KEYBIND_FLY], mods & WPAD_BUTTON_LEFT);
if (mods & WPAD_BUTTON_RIGHT) { if (mods & WPAD_BUTTON_RIGHT) {
Mouse_ScrollWheel(1.0*delta); Mouse_ScrollWheel(1.0*delta);
} }
@ -216,41 +222,103 @@ void Window_ProcessEvents(double delta) {
Input_SetNonRepeatable(IPT_UP, nunchuckUp); Input_SetNonRepeatable(IPT_UP, nunchuckUp);
Input_SetNonRepeatable(KeyBinds[KEYBIND_BACK], nunchuckDown); Input_SetNonRepeatable(KeyBinds[KEYBIND_BACK], nunchuckDown);
Input_SetNonRepeatable(IPT_DOWN, nunchuckDown); Input_SetNonRepeatable(IPT_DOWN, nunchuckDown);
} else { }
// you can't open up chat without the nunchuck like this static void ProcessClassic_Joystick(struct joystick_t* js) {
// TODO: need to account for min/max??
int dx = js->pos.x - js->center.x;
int dy = js->pos.y - js->center.y;
Input_SetNonRepeatable(KeyBinds[KEYBIND_PLACE_BLOCK], mods & WPAD_BUTTON_1); if (Math_AbsI(dx) <= 4) dx = 0;
Input_SetNonRepeatable(KeyBinds[KEYBIND_DELETE_BLOCK], mods & WPAD_BUTTON_2); if (Math_AbsI(dy) <= 4) dy = 0;
Input_SetNonRepeatable(KeyBinds[KEYBIND_JUMP], mods & WPAD_BUTTON_A); Event_RaiseRawMove(&PointerEvents.RawMoved, dx / 8.0f, dy / 8.0f);
Input_SetNonRepeatable(KeyBinds[KEYBIND_INVENTORY], mods & WPAD_BUTTON_PLUS); }
Input_SetNonRepeatable(IPT_ENTER, mods & WPAD_BUTTON_HOME); static void ProcessClassic_Game(void) {
Input_SetNonRepeatable(IPT_ESCAPE, mods & WPAD_BUTTON_MINUS); WPADData* wd = WPAD_Data(0);
classic_ctrl_t ctrls = wd->exp.classic;
int mods = ctrls.btns | ctrls.btns_held;
Input_SetNonRepeatable(KeyBinds[KEYBIND_LEFT], mods & WPAD_BUTTON_LEFT); Input_SetNonRepeatable(KeyBinds[KEYBIND_PLACE_BLOCK], mods & CLASSIC_CTRL_BUTTON_X);
Input_SetNonRepeatable(IPT_LEFT, mods & WPAD_BUTTON_LEFT); Input_SetNonRepeatable(KeyBinds[KEYBIND_DELETE_BLOCK], mods & CLASSIC_CTRL_BUTTON_Y);
Input_SetNonRepeatable(KeyBinds[KEYBIND_RIGHT], mods & WPAD_BUTTON_RIGHT);
Input_SetNonRepeatable(IPT_RIGHT, mods & WPAD_BUTTON_RIGHT);
Input_SetNonRepeatable(KeyBinds[KEYBIND_FORWARD], mods & WPAD_BUTTON_UP); Input_SetNonRepeatable(KeyBinds[KEYBIND_JUMP], mods & CLASSIC_CTRL_BUTTON_A);
Input_SetNonRepeatable(IPT_UP, mods & WPAD_BUTTON_UP); Input_SetNonRepeatable(KeyBinds[KEYBIND_INVENTORY], mods & CLASSIC_CTRL_BUTTON_PLUS);
Input_SetNonRepeatable(KeyBinds[KEYBIND_BACK], mods & WPAD_BUTTON_DOWN); // TODO: CLASSIC_CTRL_BUTTON_B
Input_SetNonRepeatable(IPT_DOWN, mods & WPAD_BUTTON_DOWN);
Input_SetNonRepeatable(IPT_ENTER, mods & CLASSIC_CTRL_BUTTON_HOME);
Input_SetNonRepeatable(IPT_ESCAPE, mods & CLASSIC_CTRL_BUTTON_MINUS);
Input_SetNonRepeatable(KeyBinds[KEYBIND_LEFT], mods & CLASSIC_CTRL_BUTTON_LEFT);
Input_SetNonRepeatable(IPT_LEFT, mods & CLASSIC_CTRL_BUTTON_LEFT);
Input_SetNonRepeatable(KeyBinds[KEYBIND_RIGHT], mods & CLASSIC_CTRL_BUTTON_RIGHT);
Input_SetNonRepeatable(IPT_RIGHT, mods & CLASSIC_CTRL_BUTTON_RIGHT);
Input_SetNonRepeatable(KeyBinds[KEYBIND_FORWARD], mods & CLASSIC_CTRL_BUTTON_UP);
Input_SetNonRepeatable(IPT_UP, mods & CLASSIC_CTRL_BUTTON_UP);
Input_SetNonRepeatable(KeyBinds[KEYBIND_BACK], mods & CLASSIC_CTRL_BUTTON_DOWN);
Input_SetNonRepeatable(IPT_DOWN, mods & CLASSIC_CTRL_BUTTON_DOWN);
if (Input_RawMode) {
ProcessClassic_Joystick(&ctrls.ljs);
ProcessClassic_Joystick(&ctrls.rjs);
} }
}
static void GetIRPos(int res, int* x, int* y) {
if (res == WPAD_ERR_NONE) {
WPADData* wd = WPAD_Data(0);
*x = wd->ir.x;
*y = wd->ir.y;
} else {
*x = 0;
*y = 0;
}
}
static void ProcessKeyboardInput(void) {
keyboard_event ke;
int res = KEYBOARD_GetEvent(&ke);
if (res && ke.type == KEYBOARD_PRESSED)
{
//Platform_Log2("KEYCODE: %i (%i)", &ke.keycode, &ke.type);
if (ke.symbol) Event_RaiseInt(&InputEvents.Press, ke.symbol);
}
}
void Window_ProcessEvents(double delta) {
/* TODO implement */
WPAD_ScanPads();
u32 mods = WPAD_ButtonsDown(0) | WPAD_ButtonsHeld(0);
u32 type;
int res = WPAD_Probe(0, &type);
if (launcherMode) {
ProcessWPAD_Launcher(mods);
} else if (type == WPAD_EXP_NUNCHUK) {
ProcessNunchuck_Game(mods, delta);
} else if (type == WPAD_EXP_CLASSIC) {
ProcessClassic_Game();
} else {
ProcessWPAD_Game(mods);
}
int x, y;
GetIRPos(res, &x, &y);
if (mods & WPAD_BUTTON_B) { if (mods & WPAD_BUTTON_B) {
if (dragOn == false) { if (dragOn == false) {
dragCursorX = x; dragCursorX = x;
dragCursorY = y; dragCursorY = y;
} }
dragOn = true; dragOn = true;
} else { } else {
dragOn = false; dragOn = false;
} }
Pointer_SetPosition(0, x, y); Pointer_SetPosition(0, x, y);
ProcessPADInput(); ProcessPADInput();
ProcessKeyboardInput(); ProcessKeyboardInput();
} }
@ -258,16 +326,9 @@ void Window_ProcessEvents(double delta) {
static void Cursor_GetRawPos(int* x, int* y) { static void Cursor_GetRawPos(int* x, int* y) {
u32 type; u32 type;
WPAD_ScanPads(); WPAD_ScanPads();
int res = WPAD_Probe(0, &type); int res = WPAD_Probe(0, &type);
GetIRPos(res, x, y);
if (res == WPAD_ERR_NONE) {
WPADData *wd = WPAD_Data(0);
*x = wd->ir.x;
*y = wd->ir.y;
} else {
*x = 0; *y = 0;
}
} }
#else #else
void Window_ProcessEvents(double delta) { void Window_ProcessEvents(double delta) {
@ -314,6 +375,7 @@ void Window_DisableRawMouse(void) {
Input_RawMode = false; Input_RawMode = false;
} }
/*########################################################################################################################* /*########################################################################################################################*
*------------------------------------------------------Framebuffer--------------------------------------------------------* *------------------------------------------------------Framebuffer--------------------------------------------------------*
*#########################################################################################################################*/ *#########################################################################################################################*/
@ -367,6 +429,7 @@ void Window_FreeFramebuffer(struct Bitmap* bmp) {
Mem_Free(bmp->scan0); Mem_Free(bmp->scan0);
} }
/*########################################################################################################################* /*########################################################################################################################*
*-------------------------------------------------------Misc/Other--------------------------------------------------------* *-------------------------------------------------------Misc/Other--------------------------------------------------------*
*#########################################################################################################################*/ *#########################################################################################################################*/
@ -382,6 +445,7 @@ int Window_IsObscured(void) { return 0; }
void Window_Show(void) { } void Window_Show(void) { }
void Window_SetSize(int width, int height) { } void Window_SetSize(int width, int height) { }
void Window_OpenKeyboard(struct OpenKeyboardArgs* args) { /* TODO implement */ } void Window_OpenKeyboard(struct OpenKeyboardArgs* args) { /* TODO implement */ }
void Window_SetKeyboardText(const cc_string* text) { } void Window_SetKeyboardText(const cc_string* text) { }
void Window_CloseKeyboard(void) { /* TODO implement */ } void Window_CloseKeyboard(void) { /* TODO implement */ }