u32 HarryPotter5Input(unsigned short pad) { u32 J = StandardMovement(pad) | DecodeGamecube(pad); #ifdef HW_RVL WPADData * wp = WPAD_Data(pad); // Wand cursor, normally controlled by DPad, now controlled by Wiimote! int cx = 0; int cy = 0; static int oldcx = 0; static int oldcy = 0; u8 WandOut = CPUReadByte(0x200e0dd); if (WandOut && CursorValid) { cx = (CursorX * 268)/640; cy = (CursorY * 187)/480; if (cx<0x14) cx=0x14; else if (cx>0xf8) cx=0xf8; if (cy<0x13) cy=0x13; else if (cy>0xa8) cy=0xa8; CPUWriteByte(0x200e0fe, cx); CPUWriteByte(0x200e102, cy); } oldcx = cx; oldcy = cy; // 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 (actually objectives) 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; // spells if (wp->btns_h & WPAD_BUTTON_B) J |= VBA_BUTTON_B; // 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 #endif return J; }
u32 MKTEInput(unsigned short pad) { static u32 prevJ = 0, prevPrevJ = 0; OurHealth = CPUReadByte(0x3000760); // 731 or 760 u8 Side = CPUReadByte(0x3000777); u32 Forwards, Back; if (Side == 0) { OurX = 0; OpponentX = 1; Forwards = VBA_RIGHT; Back = VBA_LEFT; } else { OurX = 1; OpponentX = 0; Forwards = VBA_LEFT; Back = VBA_RIGHT; } u32 J = GetMKInput(pad, 10); if (HP || LP) J |= VBA_BUTTON_B; if (HK || LK) J |= VBA_BUTTON_A; if (BL) J |= VBA_BUTTON_R; if (CS) J |= VBA_BUTTON_L; if (Select) J |= VBA_BUTTON_SELECT; if (Start) J |= VBA_BUTTON_START; if (Throw) { if ((prevJ & Forwards && prevJ & VBA_BUTTON_A && prevJ & VBA_BUTTON_B) || ((prevPrevJ & Forwards) && !(prevJ & Forwards))) J |= Forwards | VBA_BUTTON_A | VBA_BUTTON_B; // R, R+1+2 = throw else if (prevJ & Forwards) { J &= ~Forwards; J &= ~VBA_BUTTON_A; J &= ~VBA_BUTTON_B; } else J |= Forwards; } if ((J & 48) == 48) J &= ~16; if ((J & 192) == 192) J &= ~128; prevPrevJ = prevJ; prevJ = J; 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 MKAInput(unsigned short pad) { bool InMenu= false; if (CPUReadHalfWord(0x2000008)==0xFFFC) InMenu=true; else InMenu = false; OurHealth = CPUReadByte(0x2000020); OpponentHealth = CPUReadByte(0x2000020+0x68); OurX = (s16)CPUReadHalfWord(0x2000008); OpponentX = (s16)CPUReadHalfWord(0x2000008+0x68); u8 OurChar = CPUReadByte(0x2000025); // also 202f6a8 //u8 OpponentChar = CPUReadByte(0x2000025+0x68); // Special characters static int MenuChar = 0; static int MenuSubchar = 0; static bool WasInMenu = false; static u8 OurOldChar = 255; static u8 OriginalColour = 0; static bool OldCostumeButton = false; bool CostumeButton = false; if (OriginalColour == 0) OriginalColour = CPUReadByte(0x2000004); // Manually changed characters, so reset MenuChar and SubChar if (InMenu && OurChar!=OurOldChar && OurChar!=0) { //DebugPrintf("%d %d %d", OurChar, OurOldChar, MenuChar); MenuChar = OurChar; MenuSubchar = 0; OriginalColour = CPUReadByte(0x2000004); systemGameRumble(4); MKARenameEveryoneProperlyExcept(255); } else if (InMenu && OurChar!=OurOldChar) { // Either changing character to Rain, or more likely starting combat // if changing to rain, they might actually end up changing to Cyborg Rain or Tremor MenuChar = OurChar; OriginalColour = CPUReadByte(0x2000004); } // Special Characters in-game if (!InMenu) { // in the game we just changed from 0 back to our real character // unless OurChar is Jax and Subchar is 3 or 4 in which case MenuChar should be 0 // So check for Tremor, also check for Shao Khan if (OurOldChar==0 && OurChar!=0) { if (OurChar==MKA_Jax && (MenuSubchar==3 || MenuSubchar==4)) MenuChar=0; else if (OurChar==MKA_ShaoKhan && (MenuSubchar==2 || MenuSubchar==3)) MenuChar=MKA_ShangTsung; else MenuChar=OurChar; } if (MenuSubchar!=0) { //u8 OldMaxFrame = CPUReadByte(0x2000048); MKANextSubchar(MenuChar, MenuSubchar-1, OriginalColour); if (OurOldChar==0 && OurChar!=0) MKARenameEveryoneProperlyExcept(OurChar); if (CPUReadByte(0x200001D)>=CPUReadByte(0x2000048)) gbaWriteByte(0x200001D,CPUReadByte(0x2000048)-1); //if (CPUReadByte(0x200001D)>=OldMaxFrame && OldMaxFrame>0) // gbaWriteByte(0x200001D,OldMaxFrame-1); if (MenuChar==MKA_Reptile && MenuSubchar==3) MKARandomNinja(); else if (MenuChar==MKA_Reptile && MenuSubchar==4) MKARandomCyborg(); else if (MenuChar==MKA_Jade && MenuSubchar==1) MKARandomFemale(); } else { if (OurOldChar==0 && OurChar!=0) MKARenameEveryoneProperlyExcept(OurChar); } OurOldChar=CPUReadByte(0x2000025); } WasInMenu = InMenu; //DebugPrintf("M=%d O=%d MC=%d,%d Old=%d",InMenu,OurChar,MenuChar,MenuSubchar,OurOldChar); // CONTROLS u32 J = GetMKInput(pad); if (LK || HK) J |= VBA_BUTTON_A; if (LP || HP) J |= VBA_BUTTON_B; if (BL) J |= VBA_BUTTON_R; if (CS) J |= VBA_BUTTON_L; if (Throw) { if (InMenu) J |= VBA_BUTTON_A; else J |= VBA_FORWARD | VBA_BUTTON_B; } if (Start) J |= VBA_BUTTON_START; if (Select) J |= VBA_BUTTON_SELECT; // Fix kick controls to what they should be! if (!InMenu && !(J & (VBA_UP | VBA_DOWN))) { if (B && LK && !HK) { // Make B+HK do roundhouse, while B+LK does sweep! J |= VBA_DOWN; } } else if (!InMenu && (J & VBA_DOWN)) { // Make D+HK do crouch HK, while D+LK does crouch LK if (HK && !LK && !B && !F && !LP && !HP) { J &= ~VBA_BACK; J |= VBA_FORWARD; } } // Fix punch controls to what they should be! if ((!InMenu) && (J & VBA_DOWN)) { // Make D+LP do crouch punch instead of uppercut if (LP && !F && !B && !LK && !HK && !HP) { J &= ~VBA_BACK; J |= VBA_FORWARD; } } CostumeButton = InMenu && (CS || (J & VBA_BUTTON_SELECT)); // Change Style/Select changes costume if (CostumeButton && !OldCostumeButton) { int OldSubChar = MenuSubchar; u8 OldMaxFrame = CPUReadByte(0x2000048); MenuSubchar = MKANextSubchar(MenuChar, MenuSubchar, OriginalColour); if (MenuSubchar!=OldSubChar) systemGameRumble(8); OurOldChar = CPUReadByte(0x2000025); // apply change instantly and safely by skipping to last frame of new animation gbaWriteByte(0x200001D,CPUReadByte(0x2000048)-1); if (CPUReadByte(0x200001D)>=OldMaxFrame && OldMaxFrame>0) gbaWriteByte(0x200001D,OldMaxFrame-1); } OurOldChar = CPUReadByte(0x2000025); OldCostumeButton = CostumeButton; return J; }