u32 OnePieceInput(unsigned short pad) { // Only Nunchuk and Gamecube controls available // Wiimote and Classic controls depend on user configuration u32 J = StandardMovement(pad) | DecodeWiimote(pad) | DecodeClassic(pad); static u32 LastDir = VBA_RIGHT; bool JumpButton=0, AttackButton=0, ViewButton=0, CharacterButton=0, PauseButton=0, DashButton=0, GrabButton=0, SpeedButton=0, AttackUpButton = 0; #ifdef HW_RVL WPADData * wp = WPAD_Data(pad); // Nunchuk controls are based on One Piece: Unlimited Adventure for the Wii if (wp->exp.type == WPAD_EXP_NUNCHUK) { J |= StandardDPad(pad); JumpButton = wp->btns_h & WPAD_BUTTON_B; AttackButton = wp->btns_h & WPAD_BUTTON_A; CharacterButton = wp->btns_h & WPAD_BUTTON_MINUS; PauseButton = wp->btns_h & WPAD_BUTTON_PLUS; DashButton = wp->btns_h & WPAD_NUNCHUK_BUTTON_C; GrabButton = wp->btns_h & WPAD_NUNCHUK_BUTTON_Z; ViewButton = wp->btns_h & WPAD_BUTTON_1; // doesn't do anything? SpeedButton = wp->btns_h & WPAD_BUTTON_2; } #endif // Gamecube controls are based on One Piece Grand Adventure { u32 gc = PAD_ButtonsHeld(pad); signed char gc_px = PAD_SubStickX(pad); if (gc_px > 70) J |= VBA_SPEED; JumpButton = JumpButton || gc & PAD_BUTTON_Y; AttackButton = AttackButton || gc & PAD_BUTTON_A; GrabButton = GrabButton || gc & PAD_BUTTON_B; AttackUpButton = AttackUpButton || gc & PAD_BUTTON_X; DashButton = DashButton || gc & PAD_TRIGGER_L; PauseButton = PauseButton || gc & PAD_BUTTON_START; CharacterButton = CharacterButton || gc & PAD_TRIGGER_R; // supposed to be block } if (JumpButton) J |= VBA_BUTTON_A; if (AttackButton) J |= VBA_BUTTON_B; if (AttackUpButton) J |= VBA_UP | VBA_BUTTON_B; if (CharacterButton) J |= VBA_BUTTON_L; if (DashButton) J |= LastDir; if (PauseButton) J |= VBA_BUTTON_START; if (GrabButton) J |= VBA_BUTTON_R; if (SpeedButton) J |= VBA_SPEED; if (ViewButton) J |= VBA_BUTTON_SELECT; // doesn't do anything? if (J & VBA_RIGHT) LastDir = VBA_RIGHT; else if (J & VBA_LEFT) LastDir = VBA_LEFT; return J; }
u32 Boktai2Input(unsigned short pad) { u32 J = StandardMovement(pad) | StandardDPad(pad) | DecodeGamecube(pad) | DecodeClassic(pad); #ifdef HW_RVL WPADData * wp = WPAD_Data(pad); static bool GunRaised = false; // Action if (wp->btns_h & WPAD_BUTTON_A) J |= VBA_BUTTON_A; // Hold gun or hand up to the light to recharge if ((-wp->orient.pitch)> 45) { GunRaised = true; } else if ((-wp->orient.pitch) < 40) { GunRaised = false; } if (GunRaised) J |= VBA_BUTTON_A; // Fire Gun Del Sol if (wp->btns_h & WPAD_BUTTON_B) J |= VBA_BUTTON_B; // Swing sword or hammer or stab spear if (fabs(wp->gforce.x)> 1.8) J |= VBA_BUTTON_B; // Look around or change subscreen if (wp->btns_h & WPAD_BUTTON_2) J |= VBA_BUTTON_R; // Start if (wp->btns_h & WPAD_BUTTON_PLUS) J |= VBA_BUTTON_START; // Select if (wp->btns_h & WPAD_BUTTON_MINUS) J |= VBA_BUTTON_SELECT; if (wp->exp.type == WPAD_EXP_NUNCHUK) { // Look around if (wp->btns_h & WPAD_NUNCHUK_BUTTON_C) J |= VBA_BUTTON_R; // Change element or change subscreen if (wp->btns_h & WPAD_NUNCHUK_BUTTON_Z) J |= VBA_BUTTON_L; if (wp->btns_h & WPAD_BUTTON_1) J |= VBA_SPEED; } else { // Change element or change subscreen if (wp->btns_h & WPAD_BUTTON_1) J |= VBA_BUTTON_L; } #endif return J; }
static int _GetKeys(int Control, BUTTONS * Keys, controller_config_t* config, int (*available)(int), unsigned int (*getButtons)(WPADData*)) { if(wpadNeedScan){ WPAD_ScanPads(); wpadNeedScan = 0; } WPADData* wpad = WPAD_Data(Control); BUTTONS* c = Keys; memset(c, 0, sizeof(BUTTONS)); //Reset buttons & sticks c->btns.All = 0xFFFF; c->leftStickX = c->leftStickY = c->rightStickX = c->rightStickY = 128; // Only use a connected nunchuck controller if(!available(Control)) return 0; unsigned int b = getButtons(wpad); inline int isHeld(button_tp button){ return (b & button->mask) == button->mask ? 0 : 1; } c->btns.SQUARE_BUTTON = isHeld(config->SQU); c->btns.CROSS_BUTTON = isHeld(config->CRO); c->btns.CIRCLE_BUTTON = isHeld(config->CIR); c->btns.TRIANGLE_BUTTON = isHeld(config->TRI); c->btns.R1_BUTTON = isHeld(config->R1); c->btns.L1_BUTTON = isHeld(config->L1); c->btns.R2_BUTTON = isHeld(config->R2); c->btns.L2_BUTTON = isHeld(config->L2); c->btns.L_DPAD = isHeld(config->DL); c->btns.R_DPAD = isHeld(config->DR); c->btns.U_DPAD = isHeld(config->DU); c->btns.D_DPAD = isHeld(config->DD); c->btns.START_BUTTON = isHeld(config->START); c->btns.R3_BUTTON = isHeld(config->R3); c->btns.L3_BUTTON = isHeld(config->L3); c->btns.SELECT_BUTTON = isHeld(config->SELECT); //adjust values by 128 cause PSX sticks range 0-255 with a 128 center pos s8 stickX = 0; s8 stickY = 0; if(config->analogL->mask == NUNCHUK_AS_ANALOG){ stickX = getStickValue(&wpad->exp.nunchuk.js, STICK_X, 127); stickY = getStickValue(&wpad->exp.nunchuk.js, STICK_Y, 127); } else if(config->analogL->mask == IR_AS_ANALOG){ if(wpad->ir.smooth_valid){ stickX = ((short)(wpad->ir.sx - 512)) >> 2; stickY = -(signed char)((wpad->ir.sy - 384) / 3); } else {
u32 DecodeWiimote(unsigned short pad) { u32 J = 0; #ifdef HW_RVL WPADData * wp = WPAD_Data(pad); for (int i = 0; i < MAXJP; i++) { if ( (wp->exp.type == WPAD_EXP_NONE) && (wp->btns_h & btnmap[CTRLR_WIIMOTE][i]) ) J |= vbapadmap[i]; } #endif return J; }
u32 DecodeNunchuk(unsigned short pad) { u32 J = 0; #ifdef HW_RVL WPADData * wp = WPAD_Data(pad); for (int i = 0; i < MAXJP; i++) { if ( (wp->exp.type == WPAD_EXP_NUNCHUK) && (wp->btns_h & btnmap[CTRLR_NUNCHUK][i]) ) J |= vbapadmap[i]; } #endif return J; }
u32 DecodeClassic(unsigned short pad) { u32 J = 0; #ifdef HW_RVL WPADData * wp = WPAD_Data(pad); for (int i = 0; i < MAXJP; i++) { if ( (wp->exp.type == WPAD_EXP_CLASSIC) && (wp->btns_h & btnmap[CTRLR_CLASSIC][i]) ) J |= vbapadmap[i]; } #endif return J; }
u32 HarryPotter4Input(unsigned short pad) { u32 J = StandardMovement(pad) | DecodeGamecube(pad); #ifdef HW_RVL WPADData * wp = WPAD_Data(pad); // DPad works in the map if (wp->btns_h & WPAD_BUTTON_RIGHT) J |= VBA_BUTTON_R; if (wp->btns_h & WPAD_BUTTON_LEFT) J |= VBA_BUTTON_L; if (wp->btns_h & WPAD_BUTTON_UP) J |= VBA_UP; if (wp->btns_h & WPAD_BUTTON_DOWN) J |= VBA_DOWN; // Pause if (wp->btns_h & WPAD_BUTTON_PLUS) J |= VBA_BUTTON_START; // Map doesn't exist. Select Needed for starting game. if (wp->btns_h & WPAD_BUTTON_MINUS) J |= VBA_BUTTON_SELECT; // talk or interact or jinx if (wp->btns_h & WPAD_BUTTON_A) J |= VBA_BUTTON_A; if (fabs(wp->gforce.x)> 1.5) J |= VBA_BUTTON_A; // Charms if (wp->btns_h & WPAD_BUTTON_B) J |= VBA_BUTTON_B; // L and R if (wp->btns_h & WPAD_BUTTON_1) J |= VBA_BUTTON_L; if (wp->btns_h & WPAD_BUTTON_2) J |= VBA_BUTTON_R; // Run (uses emulator speed button) if ((wp->exp.type == WPAD_EXP_NUNCHUK) && (wp->btns_h & WPAD_NUNCHUK_BUTTON_Z)) J |= VBA_SPEED; // CAKTODO spell gestures // swing sideways for Flipendo // point at ceiling for Lumos #endif return J; }
u32 HarryPotter2Input(unsigned short pad) { u32 J = StandardMovement(pad) | DecodeGamecube(pad); #ifdef HW_RVL WPADData * wp = WPAD_Data(pad); // DPad works in the map if (wp->btns_h & WPAD_BUTTON_RIGHT) J |= VBA_BUTTON_R; if (wp->btns_h & WPAD_BUTTON_LEFT) J |= VBA_BUTTON_L; if (wp->btns_h & WPAD_BUTTON_UP) J |= VBA_UP; if (wp->btns_h & WPAD_BUTTON_DOWN) J |= VBA_DOWN; // Pause if (wp->btns_h & WPAD_BUTTON_PLUS) J |= VBA_BUTTON_START; // Map if (wp->btns_h & WPAD_BUTTON_MINUS) J |= VBA_BUTTON_SELECT; // talk or interact or sneak if (wp->btns_h & WPAD_BUTTON_A) J |= VBA_BUTTON_B; // spells if (wp->btns_h & WPAD_BUTTON_B) J |= VBA_BUTTON_A; if (fabs(wp->gforce.x)> 1.5) J |= VBA_BUTTON_A; if (wp->btns_h & WPAD_BUTTON_1) J |= VBA_BUTTON_L; if (wp->btns_h & WPAD_BUTTON_2) J |= VBA_BUTTON_L; // Sneak instead of run if ((wp->exp.type == WPAD_EXP_NUNCHUK) && (wp->btns_h & WPAD_NUNCHUK_BUTTON_Z)) J |= VBA_BUTTON_B; // Jump with C button if ((wp->exp.type == WPAD_EXP_NUNCHUK) && (wp->btns_h & WPAD_NUNCHUK_BUTTON_C)) J |= VBA_BUTTON_R; // CAKTODO spell gestures #endif return J; }
// WarioWare Twisted u32 TwistedInput(unsigned short pad) { // Change this to true if you want to see the screen tilt. TiltScreen = false; u32 J = StandardMovement(pad) | DecodeGamecube(pad); #ifdef HW_RVL WPADData * wp = WPAD_Data(pad); if (wp->exp.type == WPAD_EXP_NUNCHUK) { TiltSideways = false; J |= StandardDPad(pad); // Pause if (wp->btns_h & WPAD_BUTTON_PLUS) J |= VBA_BUTTON_START; // Select and L do nothing! if (wp->btns_h & WPAD_BUTTON_MINUS) J |= VBA_BUTTON_SELECT; if (wp->btns_h & WPAD_BUTTON_1) J |= VBA_BUTTON_L | VBA_SPEED; if (wp->btns_h & WPAD_BUTTON_2) J |= VBA_BUTTON_L | VBA_SPEED; // A Button if (wp->btns_h & WPAD_BUTTON_A) J |= VBA_BUTTON_A; // B Button if (wp->btns_h & WPAD_BUTTON_B) J |= VBA_BUTTON_B; // Grab an icon and prevent menu from spinning if (wp->btns_h & WPAD_NUNCHUK_BUTTON_Z) J |= VBA_BUTTON_R; // Calibrate if (wp->btns_h & WPAD_NUNCHUK_BUTTON_C) { CalibrateWario = true; } else CalibrateWario = false; } else if (wp->exp.type == WPAD_EXP_CLASSIC) { TiltSideways = false; J |= StandardDPad(pad) | StandardClassic(pad); } else { TiltSideways = true; J |= StandardSideways(pad); if (wp->btns_h & WPAD_BUTTON_B) { CalibrateWario = true; } else CalibrateWario = false; } #endif return J; }
u32 CastlevaniaLegendsInput(unsigned short pad) { // Only Nunchuk and Classic controls available // Wiimote and Gamecube controls depend on user configuration u32 J = StandardMovement(pad) | DecodeGamecube(pad) | DecodeWiimote(pad) | DecodeClassic(pad); bool JumpButton=0, AttackButton=0, ShootButton=0, GuardButton=0, PauseButton=0, SelectButton=0, SpeedButton=0, HyperButton=0; #ifdef HW_RVL WPADData * wp = WPAD_Data(pad); // Nunchuk controls are based on Castlevania Wii if (wp->exp.type == WPAD_EXP_NUNCHUK) { ShootButton = wp->btns_h & WPAD_BUTTON_A; AttackButton = (fabs(wp->gforce.x)> 1.5) || (fabs(wp->gforce.y)> 1.5) || wp->btns_h & WPAD_BUTTON_B; JumpButton = wp->btns_h & WPAD_NUNCHUK_BUTTON_C; GuardButton = wp->btns_h & WPAD_NUNCHUK_BUTTON_Z; PauseButton = wp->btns_h & WPAD_BUTTON_PLUS; SelectButton = wp->btns_h & WPAD_BUTTON_MINUS; SpeedButton = (wp->btns_h & WPAD_BUTTON_A) && (wp->btns_h & WPAD_BUTTON_B); HyperButton = wp->btns_h & WPAD_BUTTON_DOWN; // Classic controls are based on ...? } else if (wp->exp.type == WPAD_EXP_CLASSIC) { ShootButton = wp->btns_h & WPAD_CLASSIC_BUTTON_Y; AttackButton = wp->btns_h & WPAD_CLASSIC_BUTTON_B; JumpButton = wp->btns_h & (WPAD_CLASSIC_BUTTON_FULL_R | WPAD_CLASSIC_BUTTON_ZR); GuardButton = wp->btns_h & (WPAD_CLASSIC_BUTTON_FULL_L | WPAD_CLASSIC_BUTTON_ZL); PauseButton = wp->btns_h & WPAD_CLASSIC_BUTTON_PLUS; SelectButton = wp->btns_h & WPAD_CLASSIC_BUTTON_MINUS; SpeedButton = wp->btns_h & WPAD_CLASSIC_BUTTON_A; HyperButton = wp->btns_h & WPAD_CLASSIC_BUTTON_X; } #endif if (JumpButton) J |= VBA_BUTTON_A; if (AttackButton) { J &= ~VBA_UP; J |= VBA_BUTTON_B; } if (HyperButton) J |= VBA_BUTTON_A | VBA_BUTTON_B; if (ShootButton) J |= VBA_UP | VBA_BUTTON_B; if (PauseButton) J |= VBA_BUTTON_START; if (SelectButton) J |= VBA_BUTTON_SELECT; if (SpeedButton) J |= VBA_SPEED; if (GuardButton) { J &= ~VBA_UP; J |= VBA_DOWN; } return J; }
s8 WPAD_Stick(u8 chan, u8 right, int axis) { float mag = 0.0; float ang = 0.0; WPADData *data = WPAD_Data(chan); switch (data->exp.type) { case WPAD_EXP_NUNCHUK: case WPAD_EXP_GUITARHERO3: if (right == 0) { mag = data->exp.nunchuk.js.mag; ang = data->exp.nunchuk.js.ang; } break; case WPAD_EXP_CLASSIC: if (right == 0) { mag = data->exp.classic.ljs.mag; ang = data->exp.classic.ljs.ang; } else { mag = data->exp.classic.rjs.mag; ang = data->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); }
static int _GetKeys(int Control, BUTTONS * Keys, controller_config_t* config, int (*available)(int), unsigned int (*getButtons)(WPADData*)) { WPADData* wpad = WPAD_Data(Control); BUTTONS* c = Keys; memset(c, 0, sizeof(BUTTONS)); // Only use a connected nunchuck controller if(!available(Control)) return 0; WPAD_ReadPending(Control, NULL); unsigned int b = getButtons(wpad); inline int isHeld(button_tp button){ return (b & button->mask) == button->mask; } c->R_DPAD = isHeld(config->DR); c->L_DPAD = isHeld(config->DL); c->D_DPAD = isHeld(config->DD); c->U_DPAD = isHeld(config->DU); c->START_BUTTON = isHeld(config->START); c->B_BUTTON = isHeld(config->B); c->A_BUTTON = isHeld(config->A); c->Z_TRIG = isHeld(config->Z); c->R_TRIG = isHeld(config->R); c->L_TRIG = isHeld(config->L); c->R_CBUTTON = isHeld(config->CR); c->L_CBUTTON = isHeld(config->CL); c->D_CBUTTON = isHeld(config->CD); c->U_CBUTTON = isHeld(config->CU); if(config->analog->mask == NUNCHUK_AS_ANALOG){ c->X_AXIS = getStickValue(&wpad->exp.nunchuk.js, STICK_X, 128); c->Y_AXIS = getStickValue(&wpad->exp.nunchuk.js, STICK_Y, 128); } else if(config->analog->mask == IR_AS_ANALOG){ if(wpad->ir.smooth_valid){ c->X_AXIS = ((short)(wpad->ir.sx - 512)) >> 2; c->Y_AXIS = -(signed char)((wpad->ir.sy - 384) / 3); } else {
u16 readWPAD(void){ if(wpadNeedScan){ WPAD_ScanPads(); wpadNeedScan = 0; } WPADData* wpad = WPAD_Data(0); u16 b = 0; if(wpad->err == WPAD_ERR_NONE && wpad->exp.type == WPAD_EXP_CLASSIC){ u16 w = wpad->exp.classic.btns; b |= (w & CLASSIC_CTRL_BUTTON_UP) ? PAD_BUTTON_UP : 0; b |= (w & CLASSIC_CTRL_BUTTON_DOWN) ? PAD_BUTTON_DOWN : 0; b |= (w & CLASSIC_CTRL_BUTTON_LEFT) ? PAD_BUTTON_LEFT : 0; b |= (w & CLASSIC_CTRL_BUTTON_RIGHT) ? PAD_BUTTON_RIGHT : 0; b |= (w & CLASSIC_CTRL_BUTTON_A) ? PAD_BUTTON_A : 0; b |= (w & CLASSIC_CTRL_BUTTON_B) ? PAD_BUTTON_B : 0; } return b; }
u32 KirbyTntInput(unsigned short pad) { TiltScreen = false; u32 J = StandardMovement(pad) | DecodeGamecube(pad); #ifdef HW_RVL WPADData * wp = WPAD_Data(pad); if (wp->exp.type == WPAD_EXP_NUNCHUK) { TiltSideways = false; J |= StandardDPad(pad); // Pause if (wp->btns_h & WPAD_BUTTON_PLUS) J |= VBA_BUTTON_START; // Select and L do nothing! if (wp->btns_h & WPAD_BUTTON_MINUS) J |= VBA_BUTTON_SELECT; if (wp->btns_h & WPAD_BUTTON_1) J |= VBA_BUTTON_B; if (wp->btns_h & WPAD_BUTTON_2) J |= VBA_BUTTON_A; // A Button if (wp->btns_h & WPAD_BUTTON_A) J |= VBA_BUTTON_A; // B Button if (wp->btns_h & WPAD_BUTTON_B) J |= VBA_BUTTON_B; // Speed if (wp->btns_h & WPAD_NUNCHUK_BUTTON_C) J |= VBA_SPEED; } else if (wp->exp.type == WPAD_EXP_CLASSIC) { TiltSideways = false; J |= StandardDPad(pad) | DecodeClassic(pad); if (wp->btns_h & WPAD_BUTTON_A) J |= VBA_BUTTON_A; } else { TiltSideways = true; J |= StandardSideways(pad); if (wp->btns_h & WPAD_BUTTON_A) J |= VBA_BUTTON_A; if (wp->btns_h & WPAD_BUTTON_B) J |= VBA_SPEED; } #endif return J; }
void REV_preProcess() { WPAD_ScanPads(); PAD_ScanPads(); keyboardProcess(); //Update time updateTime(); HTCAMERA * htc = mainRoot->fstHTC; for(u8 i = 0; i < 4; i++) { wmData[i] = WPAD_Data(i); } update2D(); while(htc)//Update Head-Tracking cameras's point of view { htc->updateEye(); htc = htc->nextHTC; } }
u32 HarryPotter1GBCInput(unsigned short pad) { u32 J = StandardMovement(pad) | StandardDPad(pad) | DecodeGamecube(pad); //u8 ScreenMode = gbReadMemory(0xFFCF); //u8 CursorItem = gbReadMemory(0xFFD5); #ifdef HW_RVL WPADData * wp = WPAD_Data(pad); // Pause Menu if (wp->btns_h & WPAD_BUTTON_PLUS) J |= VBA_BUTTON_START; // Map (well, it tells you where you are) if (wp->btns_h & WPAD_BUTTON_MINUS) J |= VBA_BUTTON_SELECT; // talk or interact if (wp->btns_h & WPAD_BUTTON_A) J |= VBA_BUTTON_A; // cancel if (wp->btns_h & WPAD_BUTTON_B) J |= VBA_BUTTON_B; // spells if (fabs(wp->gforce.x)> 1.5) J |= VBA_BUTTON_A; if (wp->btns_h & WPAD_BUTTON_1) J |= VBA_BUTTON_L; if (wp->btns_h & WPAD_BUTTON_1) J |= VBA_BUTTON_R; // Run (uses emulator speed button) if ((wp->exp.type == WPAD_EXP_NUNCHUK) && (wp->btns_h & WPAD_NUNCHUK_BUTTON_Z)) J |= VBA_SPEED; // Camera, just tells you what room you are in. CAKTODO make press and release trigger it if ((wp->exp.type == WPAD_EXP_NUNCHUK) && (wp->btns_h & WPAD_NUNCHUK_BUTTON_C)) J |= VBA_BUTTON_SELECT; #endif // CAKTODO spell gestures return J; }
/**************************************************************************** * SetupPads * * Sets up userInput triggers for use ***************************************************************************/ void SetupPads() { PAD_Init(); #ifdef HW_RVL // read wiimote accelerometer and IR data WPAD_SetDataFormat(WPAD_CHAN_ALL,WPAD_FMT_BTNS_ACC_IR); WPAD_SetVRes(WPAD_CHAN_ALL, screenwidth, screenheight); #endif for(int i=0; i < 4; i++) { userInput[i].chan = i; #ifdef HW_RVL userInput[i].wpad = WPAD_Data(i); #endif } }
u32 MohInfiltratorInput(unsigned short pad) { u32 J = StandardMovement(pad) | DecodeGamecube(pad); #ifdef HW_RVL WPADData * wp = WPAD_Data(pad); if (wp->exp.type == WPAD_EXP_NONE) J |= DecodeWiimote(pad); else if (wp->exp.type == WPAD_EXP_CLASSIC) { J |= DecodeClassic(pad); } else if (wp->exp.type == WPAD_EXP_NUNCHUK) { // Pause, objectives, menu if (wp->btns_h & WPAD_BUTTON_PLUS) J |= VBA_BUTTON_START; // Action button, use if (wp->btns_h & WPAD_BUTTON_MINUS) J |= VBA_BUTTON_L; // Use sights/scope, not needed in this game if (wp->btns_h & WPAD_BUTTON_A) J |= VBA_BUTTON_A | VBA_BUTTON_L; // Shoot if (wp->btns_h & WPAD_BUTTON_B) J |= VBA_BUTTON_A; // Reload if (fabs(wp->gforce.y)> 1.6 || wp->btns_h & WPAD_BUTTON_UP || wp->btns_h & WPAD_BUTTON_2) J |= VBA_BUTTON_L; // Strafe if (wp->btns_h & WPAD_NUNCHUK_BUTTON_C) J |= VBA_BUTTON_R; // Change weapon if (wp->btns_h & WPAD_BUTTON_LEFT || wp->btns_h & WPAD_BUTTON_RIGHT) J |= VBA_BUTTON_B; // Speed if (wp->btns_h & WPAD_BUTTON_1) J |= VBA_SPEED; } else J |= DecodeWiimote(pad); #endif return J; }
void refreshInput() { unsigned long btns = 0; unsigned short gcbtns; WPADData *wpad; PAD_Init(); PAD_ScanPads(); gcbtns = PAD_ButtonsDown(0) | PAD_ButtonsHeld(0); WPAD_ScanPads(); wpad = WPAD_Data(0); if(wpad->exp.type == WPAD_EXP_CLASSIC) { // Left thumb stick if(wpad->exp.classic.ljs.mag >= 0.3) { if (wpad->exp.classic.ljs.ang >= 310 || wpad->exp.classic.ljs.ang <= 50) btns |= DIR_UP; if (wpad->exp.classic.ljs.ang >= 130 && wpad->exp.classic.ljs.ang <= 230) btns |= DIR_DOWN; if (wpad->exp.classic.ljs.ang >= 220 && wpad->exp.classic.ljs.ang <= 320) btns |= DIR_LEFT; if (wpad->exp.classic.ljs.ang >= 40 && wpad->exp.classic.ljs.ang <= 140) btns |= DIR_RIGHT; } // D-pad if(wpad->btns_h & WPAD_CLASSIC_BUTTON_UP) btns |= DIR_UP; if(wpad->btns_h & WPAD_CLASSIC_BUTTON_DOWN) btns |= DIR_DOWN; if(wpad->btns_h & WPAD_CLASSIC_BUTTON_LEFT) btns |= DIR_LEFT; if(wpad->btns_h & WPAD_CLASSIC_BUTTON_RIGHT) btns |= DIR_RIGHT; } else if(wpad->exp.type == WPAD_EXP_NUNCHUK) // Wiimote + Nunchuk { if(wpad->exp.nunchuk.js.pos.y >= 0xB0) btns |= DIR_UP; if(wpad->exp.nunchuk.js.pos.y <= 0x40) btns |= DIR_DOWN; if(wpad->exp.nunchuk.js.pos.x <= 0x40) btns |= DIR_LEFT; if(wpad->exp.nunchuk.js.pos.x >= 0xB0) btns |= DIR_RIGHT; if(wpad->btns_h & WPAD_BUTTON_UP) btns |= DIR_UP; if(wpad->btns_h & WPAD_BUTTON_DOWN) btns |= DIR_DOWN; if(wpad->btns_h & WPAD_BUTTON_LEFT) btns |= DIR_LEFT; if(wpad->btns_h & WPAD_BUTTON_RIGHT) btns |= DIR_RIGHT; } else // Wiimote held sideways { if(wpad->btns_h & WPAD_BUTTON_UP) btns |= DIR_LEFT; if(wpad->btns_h & WPAD_BUTTON_DOWN) btns |= DIR_RIGHT; if(wpad->btns_h & WPAD_BUTTON_LEFT) btns |= DIR_DOWN; if(wpad->btns_h & WPAD_BUTTON_RIGHT) btns |= DIR_UP; } // GameCube analog stick and D-pad if(PAD_StickY(0) > 18) btns |= DIR_UP; if(PAD_StickY(0) < -18) btns |= DIR_DOWN; if(PAD_StickX(0) < -18) btns |= DIR_LEFT; if(PAD_StickX(0) > 18) btns |= DIR_RIGHT; if(gcbtns & PAD_BUTTON_UP) btns |= DIR_UP; if(gcbtns & PAD_BUTTON_DOWN) btns |= DIR_DOWN; if(gcbtns & PAD_BUTTON_LEFT) btns |= DIR_LEFT; if(gcbtns & PAD_BUTTON_RIGHT) btns |= DIR_RIGHT; // Controller buttons if(wpad->btns_h & WPAD_BUTTON_1) btns |= WIIMOTE_1; if(wpad->btns_h & WPAD_BUTTON_2) btns |= WIIMOTE_2; if(wpad->btns_h & WPAD_BUTTON_A) btns |= WIIMOTE_A; if(wpad->btns_h & WPAD_BUTTON_B) btns |= WIIMOTE_B; if(wpad->btns_h & WPAD_BUTTON_MINUS) btns |= WIIMOTE_MINUS; if(wpad->btns_h & WPAD_BUTTON_PLUS) btns |= WIIMOTE_PLUS; if(wpad->btns_h & WPAD_BUTTON_HOME) btns |= WIIMOTE_HOME; if(wpad->btns_h & WPAD_NUNCHUK_BUTTON_Z) btns |= NUNCHUK_Z; if(wpad->btns_h & WPAD_NUNCHUK_BUTTON_C) btns |= NUNCHUK_C; if(wpad->btns_h & WPAD_CLASSIC_BUTTON_A) btns |= CC_A; if(wpad->btns_h & WPAD_CLASSIC_BUTTON_B) btns |= CC_B; if(wpad->btns_h & WPAD_CLASSIC_BUTTON_Y) btns |= CC_Y; if(wpad->btns_h & WPAD_CLASSIC_BUTTON_X) btns |= CC_X; if(wpad->btns_h & WPAD_CLASSIC_BUTTON_MINUS) btns |= CC_MINUS; if(wpad->btns_h & WPAD_CLASSIC_BUTTON_PLUS) btns |= CC_PLUS; if(wpad->btns_h & WPAD_CLASSIC_BUTTON_HOME) btns |= CC_HOME; if(wpad->btns_h & WPAD_CLASSIC_BUTTON_FULL_R) btns |= CC_R; if(wpad->btns_h & WPAD_CLASSIC_BUTTON_FULL_L) btns |= CC_L; if(wpad->btns_h & WPAD_CLASSIC_BUTTON_ZL) btns |= CC_ZL; if(wpad->btns_h & WPAD_CLASSIC_BUTTON_ZR) btns |= CC_ZR; if(gcbtns & PAD_BUTTON_X) btns |= GC_X; if(gcbtns & PAD_BUTTON_Y) btns |= GC_Y; if(gcbtns & PAD_BUTTON_A) btns |= GC_A; if(gcbtns & PAD_BUTTON_B) btns |= GC_B; if(gcbtns & PAD_TRIGGER_R) btns |= GC_R; if(gcbtns & PAD_TRIGGER_L) btns |= GC_L; if(gcbtns & PAD_TRIGGER_Z) btns |= GC_Z; if(gcbtns & PAD_BUTTON_START) btns |= GC_START; // update buttons pressed (not held) buttonsPressed = btns & ~buttonsHeld; buttonsHeld = btns; }
int C_Responder(event_t* ev) { static int shiftdown; char ch; boolean didsound = false; WPADData *data = WPAD_Data(0); //Classic Controls if(data->exp.type == WPAD_EXP_CLASSIC) { if(data->btns_d & WPAD_CLASSIC_BUTTON_UP) { pgup_down = 1; pgdn_down = 0; return consoleactive; } else if(data->btns_d & WPAD_CLASSIC_BUTTON_DOWN) { pgup_down = 0; pgdn_down = 1; return consoleactive; } else if(data->btns_d & WPAD_CLASSIC_BUTTON_LEFT || data->btns_d & WPAD_CLASSIC_BUTTON_B || data->btns_d & WPAD_CLASSIC_BUTTON_MINUS || data->btns_d & WPAD_CLASSIC_BUTTON_HOME || data->btns_d & WPAD_CLASSIC_BUTTON_PLUS || data->btns_d & WPAD_CLASSIC_BUTTON_A || data->btns_d & WPAD_CLASSIC_BUTTON_RIGHT || data->btns_d & WPAD_CLASSIC_BUTTON_X || data->btns_d & WPAD_CLASSIC_BUTTON_FULL_L || data->btns_d & WPAD_CLASSIC_BUTTON_Y || data->btns_d & WPAD_CLASSIC_BUTTON_FULL_R || data->btns_d & WPAD_CLASSIC_BUTTON_ZL || data->btns_d & WPAD_CLASSIC_BUTTON_ZR) return consoleactive; if(data->btns_u) { pgdn_down = 0; pgup_down = 0; } } // only interested in keypresses if(!data->btns_d) return false; // Check for special keypresses and // detect activation of console etc. if(consoleactive && console_enabled) { if(current_target > 0 && !didsound) { didsound = true; S_StartSound(NULL, sfx_dorcls); } // set console current_target = current_target == c_height ? 0 : c_height; return consoleactive; } if(!consoleactive) return false; // not til its stopped moving if(current_target < current_height) return false; // Normal Text Input: // probably just a normal character // (shifted)? ch = shiftdown ? shiftxform[ev->data1] : ev->data1; // only care about valid characters // dont allow too many characters on one command line // sf 19/6 V_IsPrint if(V_IsPrint(ch) && strlen(inputtext) < INPUTLENGTH - 3) { sprintf(inputtext, "%s%c", inputtext, ch); // reset scrolling C_UpdateInputPoint(); return true; } // dont care about this event return false; }
int main(int argc, char* argv[]) { u8 *tex_ptrone=GRRLIB_LoadTexture(handpointerred_png); u8 *tex_ptrtwo=GRRLIB_LoadTexture(handpointergreen_png); u8 *tex_back=GRRLIB_LoadJPG(bigmenuback_jpg, bigmenuback_jpg_size); u8 *tex_fore=GRRLIB_LoadTexture(credits_png); fatInitDefault(); GRRLIB_InitVideo(); WPAD_Init(); SYS_SetResetCallback(WiiResetPressed); SYS_SetPowerCallback(WiiPowerPressed); WPAD_SetPowerButtonCallback(WiimotePowerPressed); rmode = VIDEO_GetPreferredMode(NULL); AESND_Init(NULL); MODPlay_Init(&mod_track); Init_Voice(); AESND_Pause(0); // the sound loop is running now // set the MOD song if (MODPlay_SetMOD (&mod_track, dojo_dan_oriental_mod) < 0 ) { MODPlay_Unload (&mod_track); } else { // set the music volume to the minimum so we don't hear the music before saved volume is known MODPlay_SetVolume( &mod_track, 0,0); MODPlay_Start (&mod_track);// Play the MOD } WPAD_SetDataFormat(WPAD_CHAN_ALL, WPAD_FMT_BTNS_ACC_IR); WPAD_SetVRes(WPAD_CHAN_ALL, rmode->fbWidth, rmode->xfbHeight); initMain(); MODPlay_SetVolume( &mod_track, opt_music, opt_music); while( HWButton == 0) { WPAD_ScanPads(); u32 wpad_one_down = WPAD_ButtonsDown(0); u32 wpad_two_down = WPAD_ButtonsDown(1); u32 type; WPADData *wd_one, *wd_two; WPAD_ReadPending(WPAD_CHAN_ALL, countevs); WPAD_Probe(WPAD_CHAN_ALL, &type); wd_one = WPAD_Data(0); wd_two = WPAD_Data(1); switch(main_mode) { case STARTUP : GRRLIB_FillScreen(0xFF000000); GRRLIB_DrawImg(0, 0, 640, 480, tex_back, 0, 1, 1, alpha>255?255:alpha); GRRLIB_DrawImg(68,308, 256, 80, tex_fore, 0, 1, 1, alpha>255?255:alpha); if(alpha++>394 || wpad_one_down > 0) { main_mode=MENU; if(tex_back) free(tex_back); if(tex_fore) free(tex_fore); initMenu(); } break; case MENU : GRRLIB_FillScreen(0xFF000000); int menuopt = menuWiimote(wd_one,wpad_one_down); if(menuopt==EXIT) { if(tex_ptrone) free(tex_ptrone); if(tex_ptrtwo) free(tex_ptrtwo); } if(menuopt>NOTHING) { processMenuOption(menuopt); if(main_mode==GAME) { MODPlay_Unload (&mod_track); if(opt_tileset==SPOOKY) MODPlay_SetMOD (&mod_track, graveyard_mod); else if(opt_tileset==EGYPTIAN) MODPlay_SetMOD (&mod_track, egypt_crap_mod); else if(opt_tileset==SIMPLE) MODPlay_SetMOD (&mod_track, childhood_mod); else if(opt_tileset==SPACE) MODPlay_SetMOD (&mod_track, nebulos_mod); else MODPlay_SetMOD (&mod_track, sushi_mod); MODPlay_SetVolume( &mod_track, opt_music, opt_music); MODPlay_Start (&mod_track); } else drawMenu(wd_one); } else drawMenu(wd_one); break; case GAME : if(gameWiimote(wd_one,wpad_one_down,wd_two,wpad_two_down)) { // we are exiting the game back to the menu main_mode=MENU; MODPlay_Unload (&mod_track); MODPlay_SetMOD (&mod_track, dojo_dan_oriental_mod); MODPlay_SetVolume( &mod_track, opt_music, opt_music); MODPlay_Start (&mod_track); killGame(); initMenu(); } else { drawGame(); } break; } // alternate which pointer is on top every frame to not give the advantage to player one in two player mode static int ticktock=0; ticktock++; if(wd_two->ir.valid && ticktock%2==0) { if(main_mode==GAME && whatGameMode()==ONE_PLAYER_GAME) { // don't display second pointer in one player mode } else GRRLIB_DrawColImg(wd_two->ir.x - 9,wd_two->ir.y - 7,68,80,tex_ptrtwo,0,1,1,0xEEFFFFFF); } if(wd_one->ir.valid) { GRRLIB_DrawColImg(wd_one->ir.x - 9,wd_one->ir.y - 7,68,80,tex_ptrone,0,1,1,0xEEFFFFFF); } if(wd_two->ir.valid && ticktock%2!=0) { if(main_mode==GAME && whatGameMode()==ONE_PLAYER_GAME) { // don't display second pointer in one player mode } else GRRLIB_DrawColImg(wd_two->ir.x - 9,wd_two->ir.y - 7,68,80,tex_ptrtwo,0,1,1,0xEEFFFFFF); } if(wd_one->btns_h & WPAD_BUTTON_1) { GRRLIB_ScrShot("MahjonggWii_Screen_%y%m%d_%H%M%S.png",time(NULL)); } GRRLIB_Render(); } // we are exiting, free the mallocs switch( main_mode) { case GAME: killGame(); } if(tex_ptrone) free(tex_ptrone); if(tex_ptrtwo) free(tex_ptrtwo); killMenuLanguages(); MODPlay_Unload (&mod_track); Free_Voice(); WPAD_Shutdown(); GRRLIB_Stop(); saveConfig(FILE_CFG); SYS_ResetSystem(HWButton, 0, 0); return 0; }
static int _GetKeys(int Control, BUTTONS * Keys, controller_config_t* config) { if(wpadNeedScan){ WPAD_ScanPads(); wpadNeedScan = 0; } WPADData* wpad = WPAD_Data(Control); BUTTONS* c = Keys; memset(c, 0, sizeof(BUTTONS)); //Reset buttons & sticks c->btns.All = 0xFFFF; c->leftStickX = c->leftStickY = c->rightStickX = c->rightStickY = 128; // Only use a connected classic controller if(!available(Control)) return 0; unsigned int b = getButtons(&wpad->exp.classic); inline int isHeld(button_tp button){ return (b & button->mask) == button->mask ? 0 : 1; } c->btns.SQUARE_BUTTON = isHeld(config->SQU); c->btns.CROSS_BUTTON = isHeld(config->CRO); c->btns.CIRCLE_BUTTON = isHeld(config->CIR); c->btns.TRIANGLE_BUTTON = isHeld(config->TRI); c->btns.R1_BUTTON = isHeld(config->R1); c->btns.L1_BUTTON = isHeld(config->L1); c->btns.R2_BUTTON = isHeld(config->R2); c->btns.L2_BUTTON = isHeld(config->L2); c->btns.L_DPAD = isHeld(config->DL); c->btns.R_DPAD = isHeld(config->DR); c->btns.U_DPAD = isHeld(config->DU); c->btns.D_DPAD = isHeld(config->DD); c->btns.START_BUTTON = isHeld(config->START); c->btns.R3_BUTTON = isHeld(config->R3); c->btns.L3_BUTTON = isHeld(config->L3); c->btns.SELECT_BUTTON = isHeld(config->SELECT); //adjust values by 128 cause PSX sticks range 0-255 with a 128 center pos s8 stickX = 0; s8 stickY = 0; if(config->analogL->mask == L_STICK_AS_ANALOG){ stickX = getStickValue(&wpad->exp.classic.ljs, STICK_X, 127); stickY = getStickValue(&wpad->exp.classic.ljs, STICK_Y, 127); } else if(config->analogL->mask == R_STICK_AS_ANALOG){ stickX = getStickValue(&wpad->exp.classic.rjs, STICK_X, 127); stickY = getStickValue(&wpad->exp.classic.rjs, STICK_Y, 127); } c->leftStickX = (u8)(stickX+127) & 0xFF; if(config->invertedYL) c->leftStickY = (u8)(stickY+127) & 0xFF; else c->leftStickY = (u8)(-stickY+127) & 0xFF; if(config->analogR->mask == L_STICK_AS_ANALOG){ stickX = getStickValue(&wpad->exp.classic.ljs, STICK_X, 127); stickY = getStickValue(&wpad->exp.classic.ljs, STICK_Y, 127); } else if(config->analogR->mask == R_STICK_AS_ANALOG){ stickX = getStickValue(&wpad->exp.classic.rjs, STICK_X, 127); stickY = getStickValue(&wpad->exp.classic.rjs, STICK_Y, 127); } c->rightStickX = (u8)(stickX+127) & 0xFF; if(config->invertedYR) c->rightStickY = (u8)(stickY+127) & 0xFF; else c->rightStickY = (u8)(-stickY+127) & 0xFF; // Return 1 if whether the exit button(s) are pressed return isHeld(config->exit) ? 0 : 1; }
static void gx_joypad_poll(void) { unsigned i, j, port; uint8_t gcpad = 0; uint64_t state_p1; uint64_t check_menu_toggle; pad_state[0] = 0; pad_state[1] = 0; pad_state[2] = 0; pad_state[3] = 0; gcpad = PAD_ScanPads(); #ifdef HW_RVL if (g_quit) { runloop_ctl(RUNLOOP_CTL_SET_SHUTDOWN, NULL); return; } WPAD_ReadPending(WPAD_CHAN_ALL, NULL); #endif for (port = 0; port < MAX_PADS; port++) { uint32_t down = 0, ptype = WPAD_EXP_NOCONTROLLER; uint64_t *state_cur = &pad_state[port]; if (gcpad & (1 << port)) { int16_t ls_x, ls_y, rs_x, rs_y; uint64_t menu_combo = 0; down = PAD_ButtonsHeld(port); *state_cur |= (down & PAD_BUTTON_A) ? (UINT64_C(1) << GX_GC_A) : 0; *state_cur |= (down & PAD_BUTTON_B) ? (UINT64_C(1) << GX_GC_B) : 0; *state_cur |= (down & PAD_BUTTON_X) ? (UINT64_C(1) << GX_GC_X) : 0; *state_cur |= (down & PAD_BUTTON_Y) ? (UINT64_C(1) << GX_GC_Y) : 0; *state_cur |= (down & PAD_BUTTON_UP) ? (UINT64_C(1) << GX_GC_UP) : 0; *state_cur |= (down & PAD_BUTTON_DOWN) ? (UINT64_C(1) << GX_GC_DOWN) : 0; *state_cur |= (down & PAD_BUTTON_LEFT) ? (UINT64_C(1) << GX_GC_LEFT) : 0; *state_cur |= (down & PAD_BUTTON_RIGHT) ? (UINT64_C(1) << GX_GC_RIGHT) : 0; *state_cur |= (down & PAD_BUTTON_START) ? (UINT64_C(1) << GX_GC_START) : 0; *state_cur |= (down & PAD_TRIGGER_Z) ? (UINT64_C(1) << GX_GC_Z_TRIGGER) : 0; *state_cur |= ((down & PAD_TRIGGER_L) || PAD_TriggerL(port) > 127) ? (UINT64_C(1) << GX_GC_L_TRIGGER) : 0; *state_cur |= ((down & PAD_TRIGGER_R) || PAD_TriggerR(port) > 127) ? (UINT64_C(1) << GX_GC_R_TRIGGER) : 0; ls_x = (int16_t)PAD_StickX(port) * 256; ls_y = (int16_t)PAD_StickY(port) * -256; rs_x = (int16_t)PAD_SubStickX(port) * 256; rs_y = (int16_t)PAD_SubStickY(port) * -256; analog_state[port][RETRO_DEVICE_INDEX_ANALOG_LEFT][RETRO_DEVICE_ID_ANALOG_X] = ls_x; analog_state[port][RETRO_DEVICE_INDEX_ANALOG_LEFT][RETRO_DEVICE_ID_ANALOG_Y] = ls_y; analog_state[port][RETRO_DEVICE_INDEX_ANALOG_RIGHT][RETRO_DEVICE_ID_ANALOG_X] = rs_x; analog_state[port][RETRO_DEVICE_INDEX_ANALOG_RIGHT][RETRO_DEVICE_ID_ANALOG_Y] = rs_y; menu_combo = (UINT64_C(1) << GX_GC_START) | (UINT64_C(1) << GX_GC_Z_TRIGGER) | (UINT64_C(1) << GX_GC_L_TRIGGER) | (UINT64_C(1) << GX_GC_R_TRIGGER); if ((*state_cur & menu_combo) == menu_combo) *state_cur |= (UINT64_C(1) << GX_GC_HOME); ptype = WPAD_EXP_GAMECUBE; } #ifdef HW_RVL else if (WPADProbe(port, &ptype) == WPAD_ERR_NONE) { WPADData *wpaddata = (WPADData*)WPAD_Data(port); down = wpaddata->btns_h; *state_cur |= (down & WPAD_BUTTON_A) ? (UINT64_C(1) << GX_WIIMOTE_A) : 0; *state_cur |= (down & WPAD_BUTTON_B) ? (UINT64_C(1) << GX_WIIMOTE_B) : 0; *state_cur |= (down & WPAD_BUTTON_1) ? (UINT64_C(1) << GX_WIIMOTE_1) : 0; *state_cur |= (down & WPAD_BUTTON_2) ? (UINT64_C(1) << GX_WIIMOTE_2) : 0; *state_cur |= (down & WPAD_BUTTON_PLUS) ? (UINT64_C(1) << GX_WIIMOTE_PLUS) : 0; *state_cur |= (down & WPAD_BUTTON_MINUS) ? (UINT64_C(1) << GX_WIIMOTE_MINUS) : 0; *state_cur |= (down & WPAD_BUTTON_HOME) ? (UINT64_C(1) << GX_WIIMOTE_HOME) : 0; if (ptype != WPAD_EXP_NUNCHUK) { /* Rotated d-pad on Wiimote. */ *state_cur |= (down & WPAD_BUTTON_UP) ? (UINT64_C(1) << GX_WIIMOTE_LEFT) : 0; *state_cur |= (down & WPAD_BUTTON_DOWN) ? (UINT64_C(1) << GX_WIIMOTE_RIGHT) : 0; *state_cur |= (down & WPAD_BUTTON_LEFT) ? (UINT64_C(1) << GX_WIIMOTE_DOWN) : 0; *state_cur |= (down & WPAD_BUTTON_RIGHT) ? (UINT64_C(1) << GX_WIIMOTE_UP) : 0; } if (ptype == WPAD_EXP_CLASSIC) { *state_cur |= (down & WPAD_CLASSIC_BUTTON_A) ? (UINT64_C(1) << GX_CLASSIC_A) : 0; *state_cur |= (down & WPAD_CLASSIC_BUTTON_B) ? (UINT64_C(1) << GX_CLASSIC_B) : 0; *state_cur |= (down & WPAD_CLASSIC_BUTTON_X) ? (UINT64_C(1) << GX_CLASSIC_X) : 0; *state_cur |= (down & WPAD_CLASSIC_BUTTON_Y) ? (UINT64_C(1) << GX_CLASSIC_Y) : 0; *state_cur |= (down & WPAD_CLASSIC_BUTTON_UP) ? (UINT64_C(1) << GX_CLASSIC_UP) : 0; *state_cur |= (down & WPAD_CLASSIC_BUTTON_DOWN) ? (UINT64_C(1) << GX_CLASSIC_DOWN) : 0; *state_cur |= (down & WPAD_CLASSIC_BUTTON_LEFT) ? (UINT64_C(1) << GX_CLASSIC_LEFT) : 0; *state_cur |= (down & WPAD_CLASSIC_BUTTON_RIGHT) ? (UINT64_C(1) << GX_CLASSIC_RIGHT) : 0; *state_cur |= (down & WPAD_CLASSIC_BUTTON_PLUS) ? (UINT64_C(1) << GX_CLASSIC_PLUS) : 0; *state_cur |= (down & WPAD_CLASSIC_BUTTON_MINUS) ? (UINT64_C(1) << GX_CLASSIC_MINUS) : 0; *state_cur |= (down & WPAD_CLASSIC_BUTTON_HOME) ? (UINT64_C(1) << GX_CLASSIC_HOME) : 0; *state_cur |= (down & WPAD_CLASSIC_BUTTON_FULL_L) ? (UINT64_C(1) << GX_CLASSIC_L_TRIGGER) : 0; *state_cur |= (down & WPAD_CLASSIC_BUTTON_FULL_R) ? (UINT64_C(1) << GX_CLASSIC_R_TRIGGER) : 0; *state_cur |= (down & WPAD_CLASSIC_BUTTON_ZL) ? (UINT64_C(1) << GX_CLASSIC_ZL_TRIGGER) : 0; *state_cur |= (down & WPAD_CLASSIC_BUTTON_ZR) ? (UINT64_C(1) << GX_CLASSIC_ZR_TRIGGER) : 0; analog_state[port][RETRO_DEVICE_INDEX_ANALOG_LEFT][RETRO_DEVICE_ID_ANALOG_X] = WPAD_StickX(wpaddata, 0); analog_state[port][RETRO_DEVICE_INDEX_ANALOG_LEFT][RETRO_DEVICE_ID_ANALOG_Y] = WPAD_StickY(wpaddata, 0); analog_state[port][RETRO_DEVICE_INDEX_ANALOG_RIGHT][RETRO_DEVICE_ID_ANALOG_X] = WPAD_StickX(wpaddata, 1); analog_state[port][RETRO_DEVICE_INDEX_ANALOG_RIGHT][RETRO_DEVICE_ID_ANALOG_Y] = WPAD_StickY(wpaddata, 1); } else if (ptype == WPAD_EXP_NUNCHUK) { /* Wiimote is held upright with nunchuk, * do not change d-pad orientation. */ *state_cur |= (down & WPAD_BUTTON_UP) ? (UINT64_C(1) << GX_WIIMOTE_UP) : 0; *state_cur |= (down & WPAD_BUTTON_DOWN) ? (UINT64_C(1) << GX_WIIMOTE_DOWN) : 0; *state_cur |= (down & WPAD_BUTTON_LEFT) ? (UINT64_C(1) << GX_WIIMOTE_LEFT) : 0; *state_cur |= (down & WPAD_BUTTON_RIGHT) ? (UINT64_C(1) << GX_WIIMOTE_RIGHT) : 0; *state_cur |= (down & WPAD_NUNCHUK_BUTTON_Z) ? (UINT64_C(1) << GX_NUNCHUK_Z) : 0; *state_cur |= (down & WPAD_NUNCHUK_BUTTON_C) ? (UINT64_C(1) << GX_NUNCHUK_C) : 0; analog_state[port][RETRO_DEVICE_INDEX_ANALOG_LEFT][RETRO_DEVICE_ID_ANALOG_X] = WPAD_StickX(wpaddata, 0); analog_state[port][RETRO_DEVICE_INDEX_ANALOG_LEFT][RETRO_DEVICE_ID_ANALOG_Y] = WPAD_StickY(wpaddata, 0); } } #endif if (ptype != pad_type[port]) handle_hotplug(port, ptype); for (i = 0; i < 2; i++) for (j = 0; j < 2; j++) if (analog_state[port][i][j] == -0x8000) analog_state[port][i][j] = -0x7fff; } state_p1 = pad_state[0]; BIT64_CLEAR(lifecycle_state, RARCH_MENU_TOGGLE); if (g_menu) { state_p1 |= (UINT64_C(1) << GX_GC_HOME); g_menu = false; } check_menu_toggle = UINT64_C(1) << GX_GC_HOME; #ifdef HW_RVL check_menu_toggle |= (UINT64_C(1) << GX_WIIMOTE_HOME) | (UINT64_C(1) << GX_CLASSIC_HOME); #endif if (check_menu_toggle & state_p1) BIT64_SET(lifecycle_state, RARCH_MENU_TOGGLE); }
u32 UniversalGravitationInput(unsigned short pad) { TiltScreen = true; u32 J = StandardMovement(pad) | DecodeGamecube(pad); #ifdef HW_RVL WPADData * wp = WPAD_Data(pad); if (wp->exp.type == WPAD_EXP_NUNCHUK) { J |= StandardDPad(pad); TiltSideways = false; // Pause if (wp->btns_h & WPAD_BUTTON_PLUS) J |= VBA_BUTTON_START; // Select, L & R do nothing! if (wp->btns_h & WPAD_BUTTON_MINUS) J |= VBA_BUTTON_SELECT; if (wp->btns_h & WPAD_BUTTON_1) J |= VBA_BUTTON_L | VBA_SPEED; if (wp->btns_h & WPAD_BUTTON_2) J |= VBA_BUTTON_R | VBA_SPEED; // Jump if (wp->btns_h & WPAD_BUTTON_A) J |= VBA_BUTTON_A; // tongue if (wp->btns_h & WPAD_BUTTON_B) J |= VBA_BUTTON_B; // Crouch, butt stomp if (wp->btns_h & WPAD_NUNCHUK_BUTTON_Z) { J |= VBA_DOWN; // Crouch J &= ~VBA_UP; } // Camera if (wp->btns_h & WPAD_NUNCHUK_BUTTON_C) { J |= VBA_UP; } } else if (wp->exp.type == WPAD_EXP_CLASSIC) { TiltSideways = false; J |= StandardDPad(pad); // A bit stupid playing with the classic controller, but nevermind. if (wp->btns_h & WPAD_CLASSIC_BUTTON_PLUS) J |= VBA_BUTTON_START; if (wp->btns_h & WPAD_CLASSIC_BUTTON_MINUS) J |= VBA_BUTTON_SELECT; if (wp->btns_h & WPAD_CLASSIC_BUTTON_X) J |= VBA_BUTTON_B; if (wp->btns_h & WPAD_CLASSIC_BUTTON_Y) J |= VBA_BUTTON_R; if (wp->btns_h & WPAD_CLASSIC_BUTTON_B || wp->btns_h & WPAD_CLASSIC_BUTTON_A) J |= VBA_BUTTON_A; if (wp->btns_h & WPAD_CLASSIC_BUTTON_FULL_L || wp->btns_h & WPAD_CLASSIC_BUTTON_ZL) J |= VBA_DOWN; if (wp->btns_h & WPAD_CLASSIC_BUTTON_FULL_R) J |= VBA_UP; if (WPAD_CLASSIC_BUTTON_ZR) J |= VBA_SPEED; } else { J |= StandardSideways(pad); TiltSideways = true; } #endif return J; }
u32 YoshiIslandInput(unsigned short pad) { u32 J = StandardMovement(pad) | DecodeWiimote(pad) | DecodeGamecube(pad); #ifdef HW_RVL WPADData * wp = WPAD_Data(pad); if (wp->exp.type == WPAD_EXP_NUNCHUK) { J |= StandardDPad(pad); // Pause if (wp->btns_h & WPAD_BUTTON_PLUS) J |= VBA_BUTTON_START; // Select if (wp->btns_h & WPAD_BUTTON_MINUS) J |= VBA_BUTTON_SELECT; // Jump if (wp->btns_h & WPAD_BUTTON_A) J |= VBA_BUTTON_A; // Run, pick up if (wp->btns_h & WPAD_BUTTON_B) J |= VBA_BUTTON_B; // throw if (wp->btns_h & WPAD_BUTTON_1 || wp->btns_h & WPAD_BUTTON_2) J |= VBA_BUTTON_R; // Crouch, lay egg if (wp->btns_h & WPAD_NUNCHUK_BUTTON_Z) { J |= VBA_DOWN; // Crouch J &= ~VBA_UP; } // Camera if (wp->btns_h & WPAD_NUNCHUK_BUTTON_C) J |= VBA_BUTTON_L; } else if (wp->exp.type == WPAD_EXP_CLASSIC) { J |= StandardDPad(pad); if (wp->btns_h & WPAD_CLASSIC_BUTTON_PLUS) J |= VBA_BUTTON_START; if (wp->btns_h & WPAD_CLASSIC_BUTTON_MINUS) J |= VBA_BUTTON_SELECT; if (wp->btns_h & WPAD_CLASSIC_BUTTON_X) J |= VBA_BUTTON_B; if (wp->btns_h & WPAD_CLASSIC_BUTTON_Y) J |= VBA_BUTTON_R; if (wp->btns_h & WPAD_CLASSIC_BUTTON_B) J |= VBA_BUTTON_A; if (wp->btns_h & WPAD_CLASSIC_BUTTON_A || wp->btns_h & WPAD_CLASSIC_BUTTON_FULL_R) J |= VBA_BUTTON_R; if (wp->btns_h & WPAD_CLASSIC_BUTTON_FULL_L) J |= VBA_BUTTON_L; if (wp->btns_h & WPAD_CLASSIC_BUTTON_ZL || wp->btns_h & WPAD_CLASSIC_BUTTON_ZR) { J |= VBA_DOWN; // Crouch J &= ~VBA_UP; } } #endif // Gamecube controller { u32 gc = PAD_ButtonsHeld(pad); if (gc & PAD_BUTTON_A) J |= VBA_BUTTON_A; if (gc & PAD_BUTTON_B) J |= VBA_BUTTON_B; if (gc & PAD_BUTTON_X) J |= VBA_BUTTON_R; if (gc & PAD_BUTTON_Y) J |= VBA_BUTTON_SELECT; if (gc & PAD_TRIGGER_R) J |= VBA_BUTTON_R; if (gc & PAD_TRIGGER_L) J |= VBA_BUTTON_L; if (gc & PAD_BUTTON_START) J |= VBA_BUTTON_START; if (gc & PAD_TRIGGER_Z) { J |= VBA_DOWN; J &= ~VBA_UP; } } return J; }
u32 Mario3Input(unsigned short pad) { u32 J = StandardMovement(pad) | DecodeGamecube(pad); #ifdef HW_RVL WPADData * wp = WPAD_Data(pad); bool run = false; run = (wp->exp.type==WPAD_EXP_NUNCHUK && wp->exp.nunchuk.js.mag> 0.83) || (wp->exp.type==WPAD_EXP_CLASSIC && wp->exp.classic.ljs.mag> 0.83); run = run && ((J & VBA_LEFT) || (J & VBA_RIGHT)); if (wp->exp.type == WPAD_EXP_NONE) J |= DecodeWiimote(pad); else if (wp->exp.type == WPAD_EXP_CLASSIC) { // DPad movement J |= StandardDPad(pad); // Pause if (wp->btns_h & WPAD_CLASSIC_BUTTON_PLUS) J |= VBA_BUTTON_START; // Select if (wp->btns_h & WPAD_CLASSIC_BUTTON_MINUS) J |= VBA_BUTTON_L; // Replay menu if (wp->btns_h & WPAD_CLASSIC_BUTTON_FULL_R) J |= VBA_BUTTON_SELECT; // Jump if (wp->btns_h & WPAD_CLASSIC_BUTTON_B) J |= VBA_BUTTON_A; // Run, pick up, throw, fire if (wp->btns_h & WPAD_CLASSIC_BUTTON_X || wp->btns_h & WPAD_CLASSIC_BUTTON_Y || run) J |= VBA_BUTTON_B; // Spin attack (racoon costume, fire flower) if (wp->btns_h & WPAD_CLASSIC_BUTTON_A) J |= VBA_BUTTON_B; // Crouch if (wp->btns_h & WPAD_CLASSIC_BUTTON_ZL || wp->btns_h & WPAD_CLASSIC_BUTTON_FULL_L) { J |= VBA_DOWN; J &= ~VBA_UP; } // Speed if (wp->btns_h & WPAD_CLASSIC_BUTTON_ZR) J |= VBA_SPEED; } else if (wp->exp.type == WPAD_EXP_NUNCHUK) { J |= StandardDPad(pad); // Pause if (wp->btns_h & WPAD_BUTTON_PLUS) J |= VBA_BUTTON_START; // Select if (wp->btns_h & WPAD_BUTTON_MINUS) J |= VBA_BUTTON_L; // Replay Menu if (wp->btns_h & WPAD_BUTTON_1) J |= VBA_BUTTON_SELECT; // Jump if (wp->btns_h & WPAD_BUTTON_A) J |= VBA_BUTTON_A; // Run, pick up, throw, fire if (wp->btns_h & WPAD_BUTTON_B || run) J |= VBA_BUTTON_B; // Spin attack (racoon, fire flower) if (fabs(wp->gforce.x)> 1.4) J |= VBA_BUTTON_B; // Crouch if (wp->btns_h & WPAD_NUNCHUK_BUTTON_Z) { J |= VBA_DOWN; J &= ~VBA_UP; } // Speed if (wp->btns_h & WPAD_BUTTON_2) J |= VBA_SPEED; } #endif return J; }
u32 MarioWorldInput(unsigned short pad) { u32 J = StandardMovement(pad) | DecodeGamecube(pad); u8 CarryState = CPUReadByte(0x3003F06); // 01 = carrying, 00 = not carrying u8 InYoshisMouth = CPUReadByte(0x3003F53); // FF = nothing, 00 = no level, else thing u8 FallState = CPUReadByte(0x3003FA1); // 0B = jump, 24 = fall u8 RidingYoshi = CPUReadByte(0x3004302); // 00 = not riding, 01 = riding static bool NeedStomp = false; bool dontrun = false; bool run = false; static bool dontletgo = false; dontrun = (InYoshisMouth != 0 && InYoshisMouth != 0xFF && RidingYoshi); bool BButton = false; #ifdef HW_RVL WPADData * wp = WPAD_Data(pad); run = (wp->exp.type==WPAD_EXP_NUNCHUK && wp->exp.nunchuk.js.mag> 0.83) || (wp->exp.type==WPAD_EXP_CLASSIC && wp->exp.classic.ljs.mag> 0.83); BButton = (wp->exp.type == WPAD_EXP_CLASSIC && (wp->btns_h & WPAD_CLASSIC_BUTTON_X || wp->btns_h & WPAD_CLASSIC_BUTTON_Y)) || wp->btns_h & WPAD_BUTTON_B; #endif u32 gc = PAD_ButtonsHeld(pad); BButton = BButton || gc & PAD_BUTTON_B; if (run && CarryState && !BButton) dontletgo = true; if (!CarryState) dontletgo = false; #ifdef HW_RVL if (wp->exp.type == WPAD_EXP_NUNCHUK) { J |= StandardDPad(pad); // Pause if (wp->btns_h & WPAD_BUTTON_PLUS) J |= VBA_BUTTON_START; // Select if (wp->btns_h & WPAD_BUTTON_MINUS) J |= VBA_BUTTON_SELECT; // Jump if (wp->btns_h & WPAD_BUTTON_A) J |= VBA_BUTTON_A; // Run, pick up if ((run && !dontrun) || wp->btns_h & WPAD_BUTTON_B || dontletgo) J |= VBA_BUTTON_B; if (wp->btns_h & WPAD_BUTTON_B && dontletgo) { J = J & ~VBA_BUTTON_B; dontletgo = false; } // Spin attack if (fabs(wp->gforce.x)> 1.5) J |= VBA_BUTTON_R; // Butt stomp if (FallState!=0 && (wp->exp.type == WPAD_EXP_NUNCHUK) && (wp->btns_h & WPAD_NUNCHUK_BUTTON_Z) && (!RidingYoshi)) NeedStomp = true; if (FallState!=0 && (wp->exp.type == WPAD_EXP_CLASSIC) && (wp->btns_h & WPAD_CLASSIC_BUTTON_ZL || wp->btns_h & WPAD_CLASSIC_BUTTON_ZR) && (!RidingYoshi)) NeedStomp = true; // Crouch if (wp->btns_h & WPAD_NUNCHUK_BUTTON_Z) { J |= VBA_DOWN; // Crouch J &= ~VBA_UP; } // Camera if (wp->btns_h & WPAD_NUNCHUK_BUTTON_C) { if (J & VBA_DOWN || J & VBA_UP) J |= VBA_BUTTON_L; else if (J & VBA_RIGHT || J & VBA_LEFT) { J |= VBA_BUTTON_L; J &= ~VBA_RIGHT; J &= ~VBA_LEFT; } } } else if (wp->exp.type == WPAD_EXP_CLASSIC) { J |= StandardDPad(pad); // Pause if (wp->btns_h & WPAD_BUTTON_PLUS) J |= VBA_BUTTON_START; // Select if (wp->btns_h & WPAD_BUTTON_MINUS) J |= VBA_BUTTON_SELECT; if (wp->btns_h & WPAD_CLASSIC_BUTTON_PLUS) J |= VBA_BUTTON_START; if (wp->btns_h & WPAD_CLASSIC_BUTTON_MINUS) J |= VBA_BUTTON_SELECT; if (wp->btns_h & WPAD_CLASSIC_BUTTON_X || wp->btns_h & WPAD_CLASSIC_BUTTON_Y) J |= VBA_BUTTON_B; if (wp->btns_h & WPAD_CLASSIC_BUTTON_B) J |= VBA_BUTTON_A; if (wp->btns_h & WPAD_CLASSIC_BUTTON_A || wp->btns_h & WPAD_CLASSIC_BUTTON_FULL_R) J |= VBA_BUTTON_R; if (wp->btns_h & WPAD_CLASSIC_BUTTON_FULL_L) J |= VBA_BUTTON_L; if (wp->btns_h & WPAD_CLASSIC_BUTTON_ZL || wp->btns_h & WPAD_CLASSIC_BUTTON_ZR) { J |= VBA_DOWN; // Crouch J &= ~VBA_UP; } } BButton = (wp->exp.type == WPAD_EXP_CLASSIC && (wp->btns_h & WPAD_CLASSIC_BUTTON_X || wp->btns_h & WPAD_CLASSIC_BUTTON_Y)) || wp->btns_h & WPAD_BUTTON_B; #endif // Gamecube controller if (gc & PAD_BUTTON_A) J |= VBA_BUTTON_A; if (gc & PAD_BUTTON_B) J |= VBA_BUTTON_B; if (gc & PAD_BUTTON_X) J |= VBA_BUTTON_R; if (gc & PAD_BUTTON_Y) J |= VBA_BUTTON_SELECT; if (gc & PAD_TRIGGER_R) J |= VBA_BUTTON_R; if (gc & PAD_TRIGGER_L) J |= VBA_BUTTON_L; if (gc & PAD_BUTTON_START) J |= VBA_BUTTON_START; if (gc & PAD_TRIGGER_Z) { J |= VBA_DOWN; J &= ~VBA_UP; } // if we try to use Yoshi's tongue while running, release run for one frame if (run && BButton && !dontrun && !dontletgo) J &= ~VBA_BUTTON_B; if (NeedStomp && FallState == 0 && !RidingYoshi) { J |= VBA_BUTTON_R; // spin attack only works when on ground NeedStomp = false; } return J; }
u32 MarioLand2Input(unsigned short pad) { u32 J = StandardMovement(pad) | DecodeGamecube(pad); #ifdef HW_RVL WPADData * wp = WPAD_Data(pad); bool run = false; run = (wp->exp.type==WPAD_EXP_NUNCHUK && wp->exp.nunchuk.js.mag> 0.83) || (wp->exp.type==WPAD_EXP_CLASSIC && wp->exp.classic.ljs.mag> 0.83); run = run && ((J & VBA_LEFT) || (J & VBA_RIGHT)); if (wp->exp.type == WPAD_EXP_NONE) J |= StandardSideways(pad); else if (wp->exp.type == WPAD_EXP_CLASSIC) { J |= StandardDPad(pad); // Pause if (wp->btns_h & WPAD_CLASSIC_BUTTON_PLUS) J |= VBA_BUTTON_START; // Select if (wp->btns_h & WPAD_CLASSIC_BUTTON_MINUS) J |= VBA_BUTTON_SELECT; // Jump if (wp->btns_h & WPAD_CLASSIC_BUTTON_B) J |= VBA_BUTTON_A; // Run, pick up, throw, fire if (wp->btns_h & WPAD_CLASSIC_BUTTON_X || wp->btns_h & WPAD_CLASSIC_BUTTON_Y || run) J |= VBA_BUTTON_B; // Spin attack if (wp->btns_h & WPAD_CLASSIC_BUTTON_A) J |= VBA_DOWN | VBA_BUTTON_A; // Camera if (wp->btns_h & WPAD_CLASSIC_BUTTON_FULL_L) J |= VBA_DOWN | VBA_BUTTON_B; if (wp->btns_h & WPAD_CLASSIC_BUTTON_FULL_R) J |= VBA_UP | VBA_BUTTON_B; // Crouch if (wp->btns_h & WPAD_CLASSIC_BUTTON_ZL && (!(wp->btns_h & WPAD_CLASSIC_BUTTON_A))) { J |= VBA_DOWN; // if the run button is held down, crouching also looks down // which we don't want when using the Z button J &= ~VBA_BUTTON_B; J &= ~VBA_UP; } // Speed if (wp->btns_h & WPAD_CLASSIC_BUTTON_ZR) J |= VBA_SPEED; } else if (wp->exp.type == WPAD_EXP_NUNCHUK) { // Pause if (wp->btns_h & WPAD_BUTTON_PLUS) J |= VBA_BUTTON_START; // Select if (wp->btns_h & WPAD_BUTTON_MINUS) J |= VBA_BUTTON_SELECT; // Jump if (wp->btns_h & WPAD_BUTTON_A) J |= VBA_BUTTON_A; // Run, pick up, throw, fire if (wp->btns_h & WPAD_BUTTON_B || run) J |= VBA_BUTTON_B; // Spin attack if (fabs(wp->gforce.x)> 1.4) J |= VBA_DOWN | VBA_BUTTON_A; // Camera if (wp->btns_h & WPAD_NUNCHUK_BUTTON_C) J |= VBA_BUTTON_B; if (wp->btns_h & WPAD_BUTTON_UP) J |= VBA_BUTTON_B | VBA_UP; if (wp->btns_h & WPAD_BUTTON_DOWN) J |= VBA_BUTTON_B | VBA_DOWN; if (wp->btns_h & WPAD_BUTTON_LEFT) J |= VBA_BUTTON_B | VBA_LEFT; if (wp->btns_h & WPAD_BUTTON_RIGHT) J |= VBA_BUTTON_B | VBA_RIGHT; // Crouch if (wp->btns_h & WPAD_NUNCHUK_BUTTON_Z && (!(wp->btns_h & WPAD_BUTTON_A))) { J |= VBA_DOWN; // if the run button is held down, crouching also looks down // which we don't want when using the Z button J &= ~VBA_BUTTON_B; J &= ~VBA_UP; } // Speed if (wp->btns_h & WPAD_BUTTON_1 || wp->btns_h & WPAD_BUTTON_2) J |= VBA_SPEED; } else J |= DecodeWiimote(pad); #endif return J; }
u32 MarioKartInput(unsigned short pad) { u32 J = StandardMovement(pad); static u32 frame = 0; #ifdef HW_RVL WPADData * wp = WPAD_Data(pad); u8 Health = 0; static u8 OldHealth = 0; float fraction; // Rumble when they lose health! if (Health < OldHealth) systemGameRumble(20); OldHealth = Health; // Start/Select if (wp->btns_h & WPAD_BUTTON_PLUS) J |= VBA_BUTTON_START; if (wp->btns_h & WPAD_BUTTON_MINUS) J |= VBA_BUTTON_SELECT; if (wp->exp.type == WPAD_EXP_NONE) { // Use item if (wp->btns_h & WPAD_BUTTON_RIGHT) { J |= VBA_BUTTON_L | VBA_UP; J &= ~VBA_DOWN; } else if (wp->btns_h & WPAD_BUTTON_LEFT) { J |= VBA_BUTTON_L | VBA_DOWN; J &= ~VBA_UP; } else if (wp->btns_h & WPAD_BUTTON_UP || wp->btns_h & WPAD_BUTTON_DOWN) J |= VBA_BUTTON_L; // Accelerate if (wp->btns_h & WPAD_BUTTON_2) J |= VBA_BUTTON_A; // Brake if (wp->btns_h & WPAD_BUTTON_1) J |= VBA_BUTTON_B; // Jump/Power slide if (wp->btns_h & WPAD_BUTTON_A) J |= VBA_BUTTON_R; if (wp->btns_h & WPAD_BUTTON_B) J |= VBA_BUTTON_R; if (wp->orient.pitch> 12) { fraction = (wp->orient.pitch - 12)/60.0f; if ((frame % 60)/60.0f < fraction) J |= VBA_LEFT; } else if (wp->orient.pitch <- 12) { fraction = -(wp->orient.pitch + 10)/60.0f; if ((frame % 60)/60.0f < fraction) J |= VBA_RIGHT; } } else if (wp->exp.type == WPAD_EXP_NUNCHUK) { // Use item if (wp->btns_h & WPAD_NUNCHUK_BUTTON_Z) J |= VBA_BUTTON_L; // Accelerate if (wp->btns_h & WPAD_BUTTON_A) J |= VBA_BUTTON_A; // Brake if (wp->btns_h & WPAD_BUTTON_B) J |= VBA_BUTTON_B; // Jump if (fabs(wp->gforce.y)> 1.5 ) J |= VBA_BUTTON_R; if (wp->btns_h & WPAD_BUTTON_UP || wp->btns_h & WPAD_BUTTON_LEFT || wp->btns_h & WPAD_BUTTON_RIGHT || wp->btns_h & WPAD_BUTTON_DOWN) J |= VBA_BUTTON_R; } else if (wp->exp.type == WPAD_EXP_CLASSIC) { // Use item if (wp->btns_h & WPAD_CLASSIC_BUTTON_FULL_L) J |= VBA_BUTTON_L; // Accelerate if (wp->btns_h & WPAD_CLASSIC_BUTTON_A) J |= VBA_BUTTON_A; // Brake if (wp->btns_h & WPAD_BUTTON_B) J |= VBA_BUTTON_B; // Jump if (wp->btns_h & WPAD_CLASSIC_BUTTON_FULL_R) J |= VBA_BUTTON_R; if (wp->btns_h & WPAD_CLASSIC_BUTTON_UP || wp->btns_h & WPAD_CLASSIC_BUTTON_LEFT || wp->btns_h & WPAD_CLASSIC_BUTTON_RIGHT || wp->btns_h & WPAD_CLASSIC_BUTTON_DOWN) J |= VBA_BUTTON_R; // Start/Select if (wp->btns_h & WPAD_CLASSIC_BUTTON_PLUS) J |= VBA_BUTTON_START; if (wp->btns_h & WPAD_CLASSIC_BUTTON_MINUS) J |= VBA_BUTTON_SELECT; } #endif u32 gc = PAD_ButtonsHeld(pad); if (gc & PAD_BUTTON_START) J |= VBA_BUTTON_START; if (gc & PAD_BUTTON_X || gc & PAD_BUTTON_Y) J |= VBA_BUTTON_SELECT; if (gc & PAD_BUTTON_A) J |= VBA_BUTTON_A; if (gc & PAD_BUTTON_B) J |= VBA_BUTTON_B; if (gc & PAD_TRIGGER_L) J |= VBA_BUTTON_L; if (gc & PAD_TRIGGER_R) J |= VBA_BUTTON_R; if (gc & PAD_BUTTON_UP || gc & PAD_BUTTON_DOWN || gc & PAD_BUTTON_LEFT || gc & PAD_BUTTON_RIGHT) J |= VBA_BUTTON_R; frame++; return J; }
u32 Mario1DXInput(unsigned short pad) { u32 J = StandardMovement(pad) | DecodeGamecube(pad); #ifdef HW_RVL WPADData * wp = WPAD_Data(pad); bool run = false; run = (wp->exp.type==WPAD_EXP_NUNCHUK && wp->exp.nunchuk.js.mag> 0.83) || (wp->exp.type==WPAD_EXP_CLASSIC && wp->exp.classic.ljs.mag> 0.83); run = run && ((J & VBA_LEFT) || (J & VBA_RIGHT)); if (wp->exp.type==WPAD_EXP_NUNCHUK) { // Pause if (wp->btns_h & WPAD_BUTTON_PLUS) J |= VBA_BUTTON_START; // Select if (wp->btns_h & WPAD_BUTTON_MINUS) J |= VBA_BUTTON_SELECT; // Jump if (wp->btns_h & WPAD_BUTTON_A) J |= VBA_BUTTON_A; // Run, pick up if (wp->btns_h & WPAD_BUTTON_B || run) J |= VBA_BUTTON_B; // Starspin shoots when using fireflower if (fabs(wp->gforce.x)> 1.5) J |= VBA_BUTTON_B; // Camera (must come before Crouch) if (!(wp->btns_h & WPAD_NUNCHUK_BUTTON_C)) J &= ~(VBA_DOWN | VBA_UP); if (wp->btns_h & WPAD_BUTTON_UP) J |= VBA_UP; if (wp->btns_h & WPAD_BUTTON_DOWN) J |= VBA_DOWN; // Crouch (must come after Camera) if (wp->btns_h & WPAD_NUNCHUK_BUTTON_Z) J |= VBA_DOWN; // Speed if (wp->btns_h & WPAD_BUTTON_1 || wp->btns_h & WPAD_BUTTON_2) J |= VBA_SPEED; } else if (wp->exp.type == WPAD_EXP_CLASSIC) { // Pause if (wp->btns_h & WPAD_CLASSIC_BUTTON_PLUS) J |= VBA_BUTTON_START; // Select if (wp->btns_h & WPAD_CLASSIC_BUTTON_MINUS) J |= VBA_BUTTON_SELECT; // Jump if (wp->btns_h & WPAD_CLASSIC_BUTTON_B) J |= VBA_BUTTON_A; // Run, pick up, throw, fire if (wp->btns_h & WPAD_CLASSIC_BUTTON_X || wp->btns_h & WPAD_CLASSIC_BUTTON_Y || run) J |= VBA_BUTTON_B; // Spin attack if (wp->btns_h & WPAD_CLASSIC_BUTTON_A) J |= VBA_BUTTON_B; // Camera J &= ~(VBA_DOWN | VBA_UP); if (wp->btns_h & WPAD_CLASSIC_BUTTON_FULL_L) J |= VBA_DOWN; if (wp->btns_h & WPAD_CLASSIC_BUTTON_FULL_R) J |= VBA_UP; // Crouch if (wp->btns_h & WPAD_CLASSIC_BUTTON_ZL) { J |= VBA_DOWN; J &= ~VBA_UP; } // DPad movement/camera if (wp->btns_h & WPAD_CLASSIC_BUTTON_UP) J |= VBA_UP; if (wp->btns_h & WPAD_CLASSIC_BUTTON_DOWN) J |= VBA_DOWN; if (wp->btns_h & WPAD_CLASSIC_BUTTON_LEFT) J |= VBA_LEFT; if (wp->btns_h & WPAD_CLASSIC_BUTTON_RIGHT) J |= VBA_RIGHT; // Speed if (wp->btns_h & WPAD_CLASSIC_BUTTON_ZR) J |= VBA_SPEED; } else J |= StandardSideways(pad); #endif return J; }