Teenage Mutant Ninja Turtles (more games) and Mortal Kombat (lots of added characters, distinguishes between low and high attacks, standard moves now have normal controls).

This commit is contained in:
Carl.Kenner 2009-04-25 12:09:13 +00:00
parent e8f54e3d56
commit b02f07b457
6 changed files with 1730 additions and 167 deletions

View File

@ -30,14 +30,14 @@
#include "gba/bios.h" #include "gba/bios.h"
#include "gba/GBAinline.h" #include "gba/GBAinline.h"
/*char DebugStr[50] = ""; char DebugStr[50] = "";
void DebugPrintf(const char *format, ...) { void DebugPrintf(const char *format, ...) {
va_list args; va_list args;
va_start( args, format ); va_start( args, format );
vsprintf( DebugStr, format, args ); vsprintf( DebugStr, format, args );
va_end( args ); va_end( args );
}*/ }
u32 LegoStarWars1Input(unsigned short pad) { u32 LegoStarWars1Input(unsigned short pad) {
u32 J = StandardMovement(pad) | DecodeGamecube(pad) | DPadWASD(pad); u32 J = StandardMovement(pad) | DecodeGamecube(pad) | DPadWASD(pad);
@ -153,7 +153,7 @@ u32 LegoStarWars2Input(unsigned short pad) {
} }
u32 TMNTInput(unsigned short pad) { u32 TMNTInput(unsigned short pad) {
u32 J = StandardMovement(pad) | StandardDPad(pad) | DecodeClassic(pad) | DecodeKeyboard(pad) | DecodeGamecube(pad); u32 J = StandardMovement(pad) | StandardDPad(pad) | DecodeKeyboard(pad);
static u32 LastDir = VBA_RIGHT; static u32 LastDir = VBA_RIGHT;
static bool wait = false; static bool wait = false;
static int holdcount = 0; static int holdcount = 0;
@ -261,6 +261,346 @@ u32 TMNTInput(unsigned short pad) {
return J; return J;
} }
u32 TMNT1Input(unsigned short pad) {
u32 J = StandardMovement(pad) | StandardDPad(pad) | DecodeKeyboard(pad);
static u32 LastDir = VBA_RIGHT;
static bool wait = false;
static int holdcount = 0;
bool Jump=0, Attack=0, SpinKick=0, Roll=0, Pause=0, Select=0;
#ifdef HW_RVL
WPADData * wp = WPAD_Data(pad);
if (wp->exp.type == WPAD_EXP_NUNCHUK) {
Jump = (wp->btns_h & WPAD_BUTTON_A);
Attack = (fabs(wp->gforce.x)> 1.5);
SpinKick = (fabs(wp->exp.nunchuk.gforce.x)> 0.5);
Roll = (wp->btns_h & WPAD_NUNCHUK_BUTTON_Z || wp->btns_h & WPAD_NUNCHUK_BUTTON_C);
Pause = (wp->btns_h & WPAD_BUTTON_PLUS);
Select = (wp->btns_h & WPAD_BUTTON_MINUS);
// Swap Turtles or super turtle summon
if (wp->btns_h & WPAD_BUTTON_B) {
// N/A
}
} else if (wp->exp.type == WPAD_EXP_CLASSIC) {
J |= StandardDPad(pad);
Jump = (wp->btns_h & WPAD_CLASSIC_BUTTON_B);
Attack = (wp->btns_h & WPAD_CLASSIC_BUTTON_A);
SpinKick = (wp->btns_h & WPAD_CLASSIC_BUTTON_X);
Pause = (wp->btns_h & WPAD_CLASSIC_BUTTON_PLUS);
Select = (wp->btns_h & WPAD_CLASSIC_BUTTON_MINUS);
Roll = (wp->btns_h & (WPAD_CLASSIC_BUTTON_FULL_L | WPAD_CLASSIC_BUTTON_FULL_R | WPAD_CLASSIC_BUTTON_ZL | WPAD_CLASSIC_BUTTON_ZR));
// Swap Turtles or super turtle summon
if (wp->btns_h & WPAD_CLASSIC_BUTTON_Y) {
// N/A
}
} else {
Jump = (wp->btns_h & WPAD_BUTTON_A);
Attack = (fabs(wp->gforce.x)> 1.5);
Pause = (wp->btns_h & WPAD_BUTTON_PLUS);
Select = (wp->btns_h & WPAD_BUTTON_MINUS);
// Swap Turtles or super turtle summon
if (wp->btns_h & WPAD_BUTTON_B) {
//N/A
}
SpinKick = (wp->btns_h & WPAD_BUTTON_1);
Roll = (wp->btns_h & WPAD_BUTTON_2);
}
#endif
u32 gc = PAD_ButtonsHeld(pad);
u32 released = PAD_ButtonsUp(pad);
// DPad moves
if (gc & PAD_BUTTON_UP)
J |= VBA_UP;
if (gc & PAD_BUTTON_DOWN)
J |= VBA_DOWN;
if (gc & PAD_BUTTON_LEFT)
J |= VBA_LEFT;
if (gc & PAD_BUTTON_RIGHT)
J |= VBA_RIGHT;
// Jump
if (gc & PAD_BUTTON_A) J |= VBA_BUTTON_A;
// Swap turtles, hold for super family move
if (gc & PAD_BUTTON_B) {
// N/A
}
// Attack
if (gc & PAD_BUTTON_X) Attack = true;
// Spin kick
if (gc & PAD_BUTTON_Y) SpinKick = true;
// Pause
if (gc & PAD_BUTTON_START) Pause = true;
// Select
if (gc & PAD_TRIGGER_Z) Select = true;
// Roll
if (gc & PAD_TRIGGER_L || gc & PAD_TRIGGER_R) Roll = true;
if (Jump) J |= VBA_BUTTON_A;
if (Attack || SpinKick) J |= VBA_BUTTON_B;
if (Pause) J |= VBA_BUTTON_START;
if (Select) J |= VBA_BUTTON_SELECT;
if (J & VBA_RIGHT) LastDir = VBA_RIGHT;
else if (J & VBA_LEFT) LastDir = VBA_LEFT;
return J;
}
u32 TMNT2Input(unsigned short pad) {
u32 J = StandardMovement(pad) | StandardDPad(pad) | DecodeKeyboard(pad);
static u32 LastDir = VBA_RIGHT;
static bool wait = false;
static int holdcount = 0;
bool Jump=0, Attack=0, SpinKick=0, Roll=0, Pause=0, Select=0;
#ifdef HW_RVL
WPADData * wp = WPAD_Data(pad);
if (wp->exp.type == WPAD_EXP_NUNCHUK) {
Jump = (wp->btns_h & WPAD_BUTTON_A);
Attack = (fabs(wp->gforce.x)> 1.5);
SpinKick = (fabs(wp->exp.nunchuk.gforce.x)> 0.5);
Roll = (wp->btns_h & WPAD_NUNCHUK_BUTTON_Z || wp->btns_h & WPAD_NUNCHUK_BUTTON_C);
Pause = (wp->btns_h & WPAD_BUTTON_PLUS);
Select = (wp->btns_h & WPAD_BUTTON_MINUS);
// Swap Turtles or super turtle summon
if (wp->btns_h & WPAD_BUTTON_B) {
// N/A
}
} else if (wp->exp.type == WPAD_EXP_CLASSIC) {
J |= StandardDPad(pad);
Jump = (wp->btns_h & WPAD_CLASSIC_BUTTON_B);
Attack = (wp->btns_h & WPAD_CLASSIC_BUTTON_A);
SpinKick = (wp->btns_h & WPAD_CLASSIC_BUTTON_X);
Pause = (wp->btns_h & WPAD_CLASSIC_BUTTON_PLUS);
Select = (wp->btns_h & WPAD_CLASSIC_BUTTON_MINUS);
Roll = (wp->btns_h & (WPAD_CLASSIC_BUTTON_FULL_L | WPAD_CLASSIC_BUTTON_FULL_R | WPAD_CLASSIC_BUTTON_ZL | WPAD_CLASSIC_BUTTON_ZR));
// Swap Turtles or super turtle summon
if (wp->btns_h & WPAD_CLASSIC_BUTTON_Y) {
// N/A
}
} else {
Jump = (wp->btns_h & WPAD_BUTTON_A);
Attack = (fabs(wp->gforce.x)> 1.5);
Pause = (wp->btns_h & WPAD_BUTTON_PLUS);
Select = (wp->btns_h & WPAD_BUTTON_MINUS);
// Swap Turtles or super turtle summon
if (wp->btns_h & WPAD_BUTTON_B) {
//N/A
}
SpinKick = (wp->btns_h & WPAD_BUTTON_1);
Roll = (wp->btns_h & WPAD_BUTTON_2);
}
#endif
u32 gc = PAD_ButtonsHeld(pad);
u32 released = PAD_ButtonsUp(pad);
// DPad moves
if (gc & PAD_BUTTON_UP)
J |= VBA_UP;
if (gc & PAD_BUTTON_DOWN)
J |= VBA_DOWN;
if (gc & PAD_BUTTON_LEFT)
J |= VBA_LEFT;
if (gc & PAD_BUTTON_RIGHT)
J |= VBA_RIGHT;
// Jump
if (gc & PAD_BUTTON_A) J |= VBA_BUTTON_A;
// Swap turtles, hold for super family move
if (gc & PAD_BUTTON_B) {
// N/A
}
// Attack
if (gc & PAD_BUTTON_X) Attack = true;
// Spin kick
if (gc & PAD_BUTTON_Y) SpinKick = true;
// Pause
if (gc & PAD_BUTTON_START) Pause = true;
// Select
if (gc & PAD_TRIGGER_Z) Select = true;
// Roll
if (gc & PAD_TRIGGER_L || gc & PAD_TRIGGER_R) Roll = true;
if (Jump) J |= VBA_BUTTON_A;
if (Attack) J |= VBA_BUTTON_B;
if (SpinKick || Roll) J |= VBA_BUTTON_B | VBA_BUTTON_A;
if (Pause) J |= VBA_BUTTON_START;
if (Select) J |= VBA_BUTTON_SELECT;
if (J & VBA_RIGHT) LastDir = VBA_RIGHT;
else if (J & VBA_LEFT) LastDir = VBA_LEFT;
return J;
}
u32 TMNT3Input(unsigned short pad) {
u32 J = StandardMovement(pad) | StandardDPad(pad) | DecodeKeyboard(pad);
static u32 LastDir = VBA_RIGHT;
static bool wait = false;
static int holdcount = 0;
bool Jump=0, Attack=0, SpinKick=0, Roll=0, Pause=0, Select=0;
#ifdef HW_RVL
WPADData * wp = WPAD_Data(pad);
if (wp->exp.type == WPAD_EXP_NUNCHUK) {
Jump = (wp->btns_h & WPAD_BUTTON_A);
Attack = (fabs(wp->gforce.x)> 1.5);
SpinKick = (fabs(wp->exp.nunchuk.gforce.x)> 0.5);
Roll = (wp->btns_h & WPAD_NUNCHUK_BUTTON_Z || wp->btns_h & WPAD_NUNCHUK_BUTTON_C);
Pause = (wp->btns_h & WPAD_BUTTON_PLUS);
Select = (wp->btns_h & WPAD_BUTTON_MINUS);
// Swap Turtles or super turtle summon
if (wp->btns_h & WPAD_BUTTON_B) {
J |= VBA_BUTTON_START;
}
} else if (wp->exp.type == WPAD_EXP_CLASSIC) {
J |= StandardDPad(pad);
Jump = (wp->btns_h & WPAD_CLASSIC_BUTTON_B);
Attack = (wp->btns_h & WPAD_CLASSIC_BUTTON_A);
SpinKick = (wp->btns_h & WPAD_CLASSIC_BUTTON_X);
Pause = (wp->btns_h & WPAD_CLASSIC_BUTTON_PLUS);
Select = (wp->btns_h & WPAD_CLASSIC_BUTTON_MINUS);
Roll = (wp->btns_h & (WPAD_CLASSIC_BUTTON_FULL_L | WPAD_CLASSIC_BUTTON_FULL_R | WPAD_CLASSIC_BUTTON_ZL | WPAD_CLASSIC_BUTTON_ZR));
// Swap Turtles or super turtle summon
if (wp->btns_h & WPAD_CLASSIC_BUTTON_Y) {
J |= VBA_BUTTON_START;
}
} else {
Jump = (wp->btns_h & WPAD_BUTTON_A);
Attack = (fabs(wp->gforce.x)> 1.5);
Pause = (wp->btns_h & WPAD_BUTTON_PLUS);
Select = (wp->btns_h & WPAD_BUTTON_MINUS);
// Swap Turtles or super turtle summon
if (wp->btns_h & WPAD_BUTTON_B) {
J |= VBA_BUTTON_START;
}
SpinKick = (wp->btns_h & WPAD_BUTTON_1);
Roll = (wp->btns_h & WPAD_BUTTON_2);
}
#endif
u32 gc = PAD_ButtonsHeld(pad);
u32 released = PAD_ButtonsUp(pad);
// DPad moves
if (gc & PAD_BUTTON_UP)
J |= VBA_UP;
if (gc & PAD_BUTTON_DOWN)
J |= VBA_DOWN;
if (gc & PAD_BUTTON_LEFT)
J |= VBA_LEFT;
if (gc & PAD_BUTTON_RIGHT)
J |= VBA_RIGHT;
// Jump
if (gc & PAD_BUTTON_A) J |= VBA_BUTTON_A;
// Swap turtles
if (gc & PAD_BUTTON_B) {
J |= VBA_BUTTON_START;
}
// Attack
if (gc & PAD_BUTTON_X) Attack = true;
// Spin kick
if (gc & PAD_BUTTON_Y) SpinKick = true;
// Pause
if (gc & PAD_BUTTON_START) Pause = true;
// Select
if (gc & PAD_TRIGGER_Z) Select = true;
// Roll
if (gc & PAD_TRIGGER_L || gc & PAD_TRIGGER_R) Roll = true;
if (Jump || Roll) J |= VBA_BUTTON_A;
if (Attack || SpinKick) J |= VBA_BUTTON_B;
if (Pause) J |= VBA_BUTTON_SELECT;
if (Select) J |= VBA_BUTTON_START;
if (J & VBA_RIGHT) LastDir = VBA_RIGHT;
else if (J & VBA_LEFT) LastDir = VBA_LEFT;
return J;
}
u32 TMNTGBAInput(unsigned short pad) {
u32 J = StandardMovement(pad) | StandardDPad(pad) | DecodeKeyboard(pad);
static u32 LastDir = VBA_RIGHT;
static bool wait = false;
static int holdcount = 0;
bool Jump=0, Attack=0, SpinKick=0, SpecialMove=0, Pause=0, Select=0;
#ifdef HW_RVL
WPADData * wp = WPAD_Data(pad);
if (wp->exp.type == WPAD_EXP_NUNCHUK) {
Jump = (wp->btns_h & WPAD_BUTTON_A);
Attack = (fabs(wp->gforce.x)> 1.5) || (wp->btns_h & WPAD_BUTTON_B);
SpinKick = (fabs(wp->exp.nunchuk.gforce.x)> 0.5);
SpecialMove = (wp->btns_h & WPAD_NUNCHUK_BUTTON_Z);
Pause = (wp->btns_h & WPAD_BUTTON_PLUS);
Select = (wp->btns_h & WPAD_BUTTON_MINUS);
// Swap Turtles or super turtle summon
if (wp->btns_h & WPAD_BUTTON_B) {
//J |= VBA_BUTTON_START;
}
} else if (wp->exp.type == WPAD_EXP_CLASSIC) {
Jump = (wp->btns_h & WPAD_CLASSIC_BUTTON_B);
Attack = (wp->btns_h & WPAD_CLASSIC_BUTTON_A);
SpinKick = (wp->btns_h & WPAD_CLASSIC_BUTTON_X);
Pause = (wp->btns_h & WPAD_CLASSIC_BUTTON_PLUS);
Select = (wp->btns_h & WPAD_CLASSIC_BUTTON_MINUS);
SpecialMove = (wp->btns_h & (WPAD_CLASSIC_BUTTON_FULL_L | WPAD_CLASSIC_BUTTON_FULL_R | WPAD_CLASSIC_BUTTON_ZL | WPAD_CLASSIC_BUTTON_ZR));
// Swap Turtles or super turtle summon
if (wp->btns_h & WPAD_CLASSIC_BUTTON_Y) {
//J |= VBA_BUTTON_START;
}
} else {
Jump = (wp->btns_h & WPAD_BUTTON_A);
Attack = (fabs(wp->gforce.x)> 1.5) || (wp->btns_h & WPAD_BUTTON_B);
Pause = (wp->btns_h & WPAD_BUTTON_PLUS);
Select = (wp->btns_h & WPAD_BUTTON_MINUS);
// Swap Turtles or super turtle summon
if (wp->btns_h & WPAD_BUTTON_B) {
//J |= VBA_BUTTON_START;
}
SpinKick = (wp->btns_h & WPAD_BUTTON_1);
SpecialMove = (wp->btns_h & WPAD_BUTTON_2);
}
#endif
u32 gc = PAD_ButtonsHeld(pad);
u32 released = PAD_ButtonsUp(pad);
// DPad moves
if (gc & PAD_BUTTON_UP)
J |= VBA_UP;
if (gc & PAD_BUTTON_DOWN)
J |= VBA_DOWN;
if (gc & PAD_BUTTON_LEFT)
J |= VBA_LEFT;
if (gc & PAD_BUTTON_RIGHT)
J |= VBA_RIGHT;
// Jump
if (gc & PAD_BUTTON_A) J |= VBA_BUTTON_A;
// Swap turtles
if (gc & PAD_BUTTON_B) {
//J |= VBA_BUTTON_B;
}
// Attack
if (gc & PAD_BUTTON_X) Attack = true;
// Spin kick
if (gc & PAD_BUTTON_Y) SpinKick = true;
// Pause
if (gc & PAD_BUTTON_START) Pause = true;
// Select
if (gc & PAD_TRIGGER_Z) Select = true;
// SpecialMove
if (gc & PAD_TRIGGER_L || gc & PAD_TRIGGER_R) SpecialMove = true;
if (Jump) J |= VBA_BUTTON_A;
if (Attack) J |= VBA_BUTTON_B;
if (SpinKick) J |= VBA_BUTTON_R;
if (Pause) J |= VBA_BUTTON_START;
if (Select) J |= VBA_BUTTON_SELECT;
if (SpecialMove) {
J |= VBA_BUTTON_R | VBA_BUTTON_A; // CAKTODO
}
if (J & VBA_RIGHT) LastDir = VBA_RIGHT;
else if (J & VBA_LEFT) LastDir = VBA_LEFT;
return J;
}
u32 HarryPotter1GBCInput(unsigned short pad) { u32 HarryPotter1GBCInput(unsigned short pad) {
u32 J = StandardMovement(pad) | StandardDPad(pad) | DPadWASD(pad) | DPadArrowKeys(pad) u32 J = StandardMovement(pad) | StandardDPad(pad) | DPadWASD(pad) | DPadArrowKeys(pad)
| DecodeGamecube(pad); | DecodeGamecube(pad);

View File

@ -49,6 +49,10 @@
#define HARRYPOTTER5 gid('B','J','X') #define HARRYPOTTER5 gid('B','J','X')
#define QUIDDITCH gid('B','H','P') #define QUIDDITCH gid('B','H','P')
#define TMNT1 0xFF000B
#define TMNT2 0xFF000C
#define TMNT3 0xFF000D
#define TMNTGBA gid('B','N','T')
#define TMNT gid('B','E','X') #define TMNT gid('B','E','X')
#define RESIDENTEVIL gid('B','I','O') #define RESIDENTEVIL gid('B','I','O')
@ -84,6 +88,8 @@
#define ONEPIECE gid('B','O','N') #define ONEPIECE gid('B','O','N')
#define MARBLEMADNESS 0xFF000A
u8 gbReadMemory(register u16 address); u8 gbReadMemory(register u16 address);
void gbWriteMemory(register u16 address, register u8 value); void gbWriteMemory(register u16 address, register u8 value);
@ -112,6 +118,9 @@ u32 LegoStarWars1Input(unsigned short pad);
u32 LegoStarWars2Input(unsigned short pad); u32 LegoStarWars2Input(unsigned short pad);
u32 MarioKartInput(unsigned short pad); u32 MarioKartInput(unsigned short pad);
u32 MK1Input(unsigned short pad); u32 MK1Input(unsigned short pad);
u32 MK12Input(unsigned short pad);
u32 MK2Input(unsigned short pad);
u32 MK3Input(unsigned short pad);
u32 MK4Input(unsigned short pad); u32 MK4Input(unsigned short pad);
u32 MKAInput(unsigned short pad); u32 MKAInput(unsigned short pad);
u32 MKTEInput(unsigned short pad); u32 MKTEInput(unsigned short pad);
@ -127,6 +136,10 @@ u32 Metroid1Input(unsigned short pad);
u32 Metroid2Input(unsigned short pad); u32 Metroid2Input(unsigned short pad);
u32 MetroidFusionInput(unsigned short pad); u32 MetroidFusionInput(unsigned short pad);
u32 TMNTInput(unsigned short pad); u32 TMNTInput(unsigned short pad);
u32 TMNT1Input(unsigned short pad);
u32 TMNT2Input(unsigned short pad);
u32 TMNT3Input(unsigned short pad);
u32 TMNTGBAInput(unsigned short pad);
u32 HarryPotter1Input(unsigned short pad); u32 HarryPotter1Input(unsigned short pad);
u32 HarryPotter1GBCInput(unsigned short pad); u32 HarryPotter1GBCInput(unsigned short pad);
u32 HarryPotter2Input(unsigned short pad); u32 HarryPotter2Input(unsigned short pad);

View File

@ -751,6 +751,14 @@ static u32 DecodeJoy(unsigned short pad)
return MetroidFusionInput(pad); return MetroidFusionInput(pad);
// TMNT // TMNT
case TMNT1:
return TMNT1Input(pad);
case TMNT2:
return TMNT2Input(pad);
case TMNT3:
return TMNT3Input(pad);
case TMNTGBA:
return TMNTGBAInput(pad);
case TMNT: case TMNT:
return TMNTInput(pad); return TMNTInput(pad);
@ -810,8 +818,12 @@ static u32 DecodeJoy(unsigned short pad)
// Mortal Kombat // Mortal Kombat
case MK1: case MK1:
return MK1Input(pad); return MK1Input(pad);
case MK12:
return MK12Input(pad);
case MK2: case MK2:
return MK2Input(pad);
case MK3: case MK3:
return MK3Input(pad);
case MK4: case MK4:
return MK4Input(pad); return MK4Input(pad);
case MKA: case MKA:

File diff suppressed because it is too large Load Diff

View File

@ -972,6 +972,8 @@ static int MenuGameSelection()
return menu; return menu;
} }
extern char DebugStr[50];
/**************************************************************************** /****************************************************************************
* MenuGame * MenuGame
* *
@ -982,6 +984,7 @@ static int MenuGame()
int menu = MENU_NONE; int menu = MENU_NONE;
GuiText titleTxt(ROMFilename, 24, (GXColor){255, 255, 255, 255}); GuiText titleTxt(ROMFilename, 24, (GXColor){255, 255, 255, 255});
if (DebugStr[0]) titleTxt.SetText(DebugStr);
titleTxt.SetAlignment(ALIGN_LEFT, ALIGN_TOP); titleTxt.SetAlignment(ALIGN_LEFT, ALIGN_TOP);
titleTxt.SetPosition(50,50); titleTxt.SetPosition(50,50);

View File

@ -768,6 +768,14 @@ static void gbApplyPerImagePreferences()
RomIdCode = MARIOLAND2; RomIdCode = MARIOLAND2;
else if (strcmp(title, "METROID2") == 0) else if (strcmp(title, "METROID2") == 0)
RomIdCode = METROID2; RomIdCode = METROID2;
else if (strcmp(title, "MARBLE MADNESS") == 0)
RomIdCode = MARBLEMADNESS;
else if (strcmp(title, "TMNT FOOT CLAN") == 0)
RomIdCode = TMNT1;
else if (strcmp(title, "TMNT BACK FROM") == 0 || strcmp(title, "TMNT 2") == 0)
RomIdCode = TMNT2;
else if (strcmp(title, "TMNT3") == 0)
RomIdCode = TMNT3;
} }
} }