/**************************************************************************** * Snes9x 1.51 Nintendo Wii/Gamecube Port * * Tantric February 2009 * * gui_trigger.cpp * * GUI class definitions ***************************************************************************/ #include "gui.h" static int scrollDelay = 0; /** * Constructor for the GuiTrigger class. */ GuiTrigger::GuiTrigger() { chan = -1; memset(&wpad, 0, sizeof(WPADData)); memset(&pad, 0, sizeof(PADData)); } /** * Destructor for the GuiTrigger class. */ GuiTrigger::~GuiTrigger() { } /** * Sets a simple trigger. Requires: * - Element is selected * - Trigger button is pressed */ void GuiTrigger::SetSimpleTrigger(s32 ch, u32 wiibtns, u16 gcbtns) { type = TRIGGER_SIMPLE; chan = ch; wpad.btns_d = wiibtns; pad.btns_d = gcbtns; } /** * Sets a button trigger. Requires: * - Trigger button is pressed */ void GuiTrigger::SetButtonOnlyTrigger(s32 ch, u32 wiibtns, u16 gcbtns) { type = TRIGGER_BUTTON_ONLY; chan = ch; wpad.btns_d = wiibtns; pad.btns_d = gcbtns; } /** * Sets a button trigger. Requires: * - Trigger button is pressed * - Parent window is in focus */ void GuiTrigger::SetButtonOnlyInFocusTrigger(s32 ch, u32 wiibtns, u16 gcbtns) { type = TRIGGER_BUTTON_ONLY_IN_FOCUS; chan = ch; wpad.btns_d = wiibtns; pad.btns_d = gcbtns; } /**************************************************************************** * WPAD_Stick * * Get X/Y value from Wii Joystick (classic, nunchuk) input ***************************************************************************/ s8 GuiTrigger::WPAD_Stick(u8 right, int axis) { float mag = 0.0; float ang = 0.0; switch (wpad.exp.type) { case WPAD_EXP_NUNCHUK: case WPAD_EXP_GUITARHERO3: if (right == 0) { mag = wpad.exp.nunchuk.js.mag; ang = wpad.exp.nunchuk.js.ang; } break; case WPAD_EXP_CLASSIC: if (right == 0) { mag = wpad.exp.classic.ljs.mag; ang = wpad.exp.classic.ljs.ang; } else { mag = wpad.exp.classic.rjs.mag; ang = wpad.exp.classic.rjs.ang; } break; default: break; } /* calculate x/y value (angle need to be converted into radian) */ if (mag > 1.0) mag = 1.0; else if (mag < -1.0) mag = -1.0; double val; if(axis == 0) // x-axis val = mag * sin((PI * ang)/180.0f); else // y-axis val = mag * cos((PI * ang)/180.0f); return (s8)(val * 128.0f); } bool GuiTrigger::Left() { u32 wiibtn = GCSettings.WiimoteOrientation ? WPAD_BUTTON_UP : WPAD_BUTTON_LEFT; if((wpad.btns_d | wpad.btns_h) & (wiibtn | WPAD_CLASSIC_BUTTON_LEFT) || pad.btns_d & PAD_BUTTON_LEFT || pad.stickX < -PADCAL || WPAD_Stick(0,0) < -PADCAL) { if(wpad.btns_d & (wiibtn | WPAD_CLASSIC_BUTTON_LEFT) || pad.btns_d & PAD_BUTTON_LEFT) { scrollDelay = SCROLL_INITIAL_DELAY; // reset scroll delay. return true; } else if(scrollDelay == 0) { scrollDelay = SCROLL_LOOP_DELAY; return true; } else { scrollDelay--; } } return false; } bool GuiTrigger::Right() { u32 wiibtn = GCSettings.WiimoteOrientation ? WPAD_BUTTON_DOWN : WPAD_BUTTON_RIGHT; if((wpad.btns_d | wpad.btns_h) & (wiibtn | WPAD_CLASSIC_BUTTON_RIGHT) || pad.btns_d & PAD_BUTTON_RIGHT || pad.stickX > PADCAL || WPAD_Stick(0,0) > PADCAL) { if(wpad.btns_d & (wiibtn | WPAD_CLASSIC_BUTTON_RIGHT) || pad.btns_d & PAD_BUTTON_RIGHT) { scrollDelay = SCROLL_INITIAL_DELAY; // reset scroll delay. return true; } else if(scrollDelay == 0) { scrollDelay = SCROLL_LOOP_DELAY; return true; } else { scrollDelay--; } } return false; } bool GuiTrigger::Up() { u32 wiibtn = GCSettings.WiimoteOrientation ? WPAD_BUTTON_RIGHT : WPAD_BUTTON_UP; if((wpad.btns_d | wpad.btns_h) & (wiibtn | WPAD_CLASSIC_BUTTON_UP) || pad.btns_d & PAD_BUTTON_UP || pad.stickY > PADCAL || WPAD_Stick(0,1) > PADCAL) { if(wpad.btns_d & (wiibtn | WPAD_CLASSIC_BUTTON_UP) || pad.btns_d & PAD_BUTTON_UP) { scrollDelay = SCROLL_INITIAL_DELAY; // reset scroll delay. return true; } else if(scrollDelay == 0) { scrollDelay = SCROLL_LOOP_DELAY; return true; } else { scrollDelay--; } } return false; } bool GuiTrigger::Down() { u32 wiibtn = GCSettings.WiimoteOrientation ? WPAD_BUTTON_LEFT : WPAD_BUTTON_DOWN; if((wpad.btns_d | wpad.btns_h) & (wiibtn | WPAD_CLASSIC_BUTTON_DOWN) || (pad.btns_d | pad.btns_h) & PAD_BUTTON_DOWN || pad.stickY < -PADCAL || WPAD_Stick(0,1) < -PADCAL) { if(wpad.btns_d & (wiibtn | WPAD_CLASSIC_BUTTON_DOWN) || pad.btns_d & PAD_BUTTON_DOWN) { scrollDelay = SCROLL_INITIAL_DELAY; // reset scroll delay. return true; } else if(scrollDelay == 0) { scrollDelay = SCROLL_LOOP_DELAY; return true; } else { scrollDelay--; } } return false; }