Jump to content

4-player Mvsc/xmvssf/mshvsf *new Info!*


Vagabond

Recommended Posts

I used to have this hack of FBA called FBACombo. This added feature was never used in an official build but it looks tantalizing, and worthy of being in FBAx, as it sounds very, very interesting. Here's a snippet of the changed source from the compiled FBAC version:

 

------------------------- /burn/burn.cpp
...
// new
// FBA Combo - extra players input hack
bool bInputSwap = false;
unsigned char kDropped = 0xFF;
void (*BurnDrvInputSwap)() = NULL;
...
------------------------- /burn/burn.h
...
// burn.cpp
...
// new
// FBA Combo - extra players input hack
extern bool bInputSwap;
extern unsigned char kDropped; // who's dropped out while playing
extern void (*BurnDrvInputSwap)();
...
------------------------ /burn/capcom/cps.h
...
// dc_input.cpp
...
// new
// FBA Combo - extra players input hack
extern struct BurnInputInfo CpsFsi4p[0x33];
void CpsFsi4pSwap(unsigned char nInputSwap);
...
------------------------ /burn/capcom/dc_input.cpp
// new
// FBA Combo - extra players input hack
static unsigned char DummyInp[0x1B-0x03] = {0,};
...
// new
// FBA Combo - extra players input hack
struct BurnInputInfo CpsFsi4p[0x33] = {
{"P1 Coin"      , 0, CpsInp020+4, "p1 coin"},    // 0x00
{"P1 Start"      , 0, CpsInp020+0, "p1 start"},

{"P1 Up"        , 0, CpsInp001+3, "p1 up"},      // 0x02
{"P1 Down"      , 0, CpsInp001+2, "p1 down"},
{"P1 Left"      , 0, CpsInp001+1, "p1 left"},
{"P1 Right"      , 0, CpsInp001+0, "p1 right"},

{"P1 Low Punch"  , 0, CpsInp001+4, "p1 fire 4"},  // 0x06
{"P1 Mid Punch"  , 0, CpsInp001+5, "p1 fire 5"},
{"P1 High Punch", 0, CpsInp001+6, "p1 fire 6"},
{"P1 Low Kick"  , 0, CpsInp011+0, "p1 fire 1"},
{"P1 Mid Kick"  , 0, CpsInp011+1, "p1 fire 2"},
{"P1 High Kick"  , 0, CpsInp011+2, "p1 fire 3"},

{"P2 Coin"      , 0, DummyInp+0x00, "p2 coin"},  // 0x0C
{"P2 Start"      , 0, DummyInp+0x01, "p2 start"},

{"P2 Up"        , 0, DummyInp+0x02, "p2 up"},    // 0x0E
{"P2 Down"      , 0, DummyInp+0x03, "p2 down"},
{"P2 Left"      , 0, DummyInp+0x04, "p2 left"},
{"P2 Right"      , 0, DummyInp+0x05, "p2 right"},

{"P2 Low Punch"  , 0, DummyInp+0x06, "p2 fire 4"},// 0x12
{"P2 Mid Punch"  , 0, DummyInp+0x07, "p2 fire 5"},
{"P2 High Punch", 0, DummyInp+0x08, "p2 fire 6"},
{"P2 Low Kick"  , 0, DummyInp+0x09, "p2 fire 1"},
{"P2 Mid Kick"  , 0, DummyInp+0x0A, "p2 fire 2"},
{"P2 High Kick"  , 0, DummyInp+0x0B, "p2 fire 3"},

{"P3 Coin"      , 0, CpsInp020+5, "p3 coin"},    // 0x18
{"P3 Start"      , 0, CpsInp020+1, "p3 start"},

{"P3 Up"        , 0, CpsInp000+3, "p3 up"},      // 0x1A
{"P3 Down"      , 0, CpsInp000+2, "p3 down"},
{"P3 Left"      , 0, CpsInp000+1, "p3 left"},
{"P3 Right"      , 0, CpsInp000+0, "p3 right"},

{"P3 Low Punch"  , 0, CpsInp000+4, "p3 fire 4"},  // 0x1E
{"P3 Mid Punch"  , 0, CpsInp000+5, "p3 fire 5"},
{"P3 High Punch", 0, CpsInp000+6, "p3 fire 6"},
{"P3 Low Kick"  , 0, CpsInp011+4, "p3 fire 1"},
{"P3 Mid Kick"  , 0, CpsInp011+5, "p3 fire 2"},
{"P3 High Kick"  , 0, CpsInp020+6, "p3 fire 3"},

{"P4 Coin"      , 0, DummyInp+0x0C, "p4 coin"},  // 0x24
{"P4 Start"      , 0, DummyInp+0x0D, "p4 start"},

{"P4 Up"        , 0, DummyInp+0x0E, "p4 up"},    // 0x26
{"P4 Down"      , 0, DummyInp+0x0F, "p4 down"},
{"P4 Left"      , 0, DummyInp+0x10, "p4 left"},
{"P4 Right"      , 0, DummyInp+0x11, "p4 right"},

{"P4 Low Punch"  , 0, DummyInp+0x12, "p4 fire 4"},// 0x2A
{"P4 Mid Punch"  , 0, DummyInp+0x13, "p4 fire 5"},
{"P4 High Punch", 0, DummyInp+0x14, "p4 fire 6"},
{"P4 Low Kick"  , 0, DummyInp+0x15, "p4 fire 1"},
{"P4 Mid Kick"  , 0, DummyInp+0x16, "p4 fire 2"},
{"P4 High Kick"  , 0, DummyInp+0x17, "p4 fire 3"},

{"Reset"        , 0, &CpsReset  , "reset"},      // 0x30
{"Diagnostic"    , 0, CpsInp021+1, "diag"},
{"Service"      , 0, CpsInp021+2, "service"}     // 0x32
};
...
// new
// FBA Combo - extra players input hack
void CpsFsi4pSwap(unsigned char nInputSwap)
{
unsigned int nOffset1,nOffset2;

if (nInputSwap&0x02) {
 for (nOffset1=0x00, nOffset2=0x0C; nOffset1<0x0C; nOffset1++, nOffset2++) {
	 *(CpsFsi4p[nOffset1].pVal) = *(CpsFsi4p[nOffset2].pVal);
 }
}

if (nInputSwap&0x08) {
 for (nOffset1=0x18, nOffset2=0x24; nOffset1<0x24; nOffset1++, nOffset2++) {
	 *(CpsFsi4p[nOffset1].pVal) = *(CpsFsi4p[nOffset2].pVal);
 }
}
#ifdef _DEBUG
{
 static unsigned char nPrevVal = nInputSwap;
 if (nInputSwap != nPrevVal) {
	 printf ("input swapped - ");
	 if (nInputSwap == 0x00) {
   printf ("p1 controls p1 - p3 controls p2\n");
	 } else if (nInputSwap == 0x02) {
   printf ("p2 controls p1 - p3 controls p2\n");
	 } else if (nInputSwap == 0x08) {
   printf ("p1 controls p1 - p4 controls p2\n");
	 } else {
   printf ("p2 controls p1 - p4 controls p2\n");
	 }
	 nPrevVal = nInputSwap;
 }
}
#endif
}
...
------------------------ /burn/capcom/cps_rw.cpp
...
int CpsRwGetInp()
{
...
if (nMaxPlayers > 2) {
 if (Cps == 2) {
	 if (!bInputSwap) { // FBA Combo - extra players input hack (additional check for bInputSwap)
   StopOpposite(&Inp011);
	 }
	 if (nMaxPlayers == 4 && !bInputSwap) { // FBA Combo - extra players input hack (additional check for bInputSwap)
   StopOpposite(&Inp010);
	 }
 } else {
 ...
}
...
------------------------ /burner/run.cpp
...
static int GetInput(bool bCopy)
{
...
HotkeyInputMake(bCopy);

// new
// FBA Combo - extra players input hack
if (bInputSwap && !kNetGame && bCopy) {
 BurnDrvInputSwap();
}
...
}
...
static int RunFrame(int bDraw, int bPause)
{
...
 if (kNetGame) {
	 GetInput(true);	// Update inputs
	 if (KailleraGetInput()) { // Synchronize input with Kaillera
   return 0;
	 }
	 // new
	 // FBA Combo - extra players input hack
	 if (bInputSwap) {
   BurnDrvInputSwap();
	 }
	 ...
 }
...
}
...
------------------------ /burner/scrn.cpp
...
static int WINAPI gameCallback(char* game, int player, int numplayers)
{
...
kNetGame = 1;

// new
kDropped = 0xFF<<numplayers; // FBA Combo - extra players input hack
...
}
...
static void WINAPI kDropCallback(char *nick, int playernb)
{
...
VidSAddChatMsg(szTemp, 0xFFFFFF, NULL, 0);
// new
kDropped |= 1<<(playernb-1); // FBA Combo - extra players input hack
}
...
------------------------ /burner/fba_kaillera.cpp
...
int KailleraGetInput()
{
...
if (kailleraModifyPlayValues(nControls, k) == -1) {
 kNetGame = 0;
 // new
 kDropped = 0x00; // FBA Combo - extra players input hack
 return 1;
}
...
}
...
------------------------ /burn/capcom/dc_mshvsf.cpp
...
STDINPUTINFOSPEC(Drv, CpsFsi);
// new
STDINPUTINFOSPEC(Drv4p, CpsFsi4p); // FBA Combo - extra players input hack
...
static int DrvExit()
{
...
}
// new
// FBA Combo - extra players input hack
// kDropped = which players got dropped during netplay
static void Drv4pInputSwap()
{
static bool bInit = false;
unsigned char pDropped = kDropped;
unsigned char nInputSwap = 0x00; // default = don't swap

if (SekReadByte(0xFF2492) == 1) {
 bInit = true;
}
if (bInit) {
 if (!(pDropped&0x02) && SekReadByte(0xFF4983) > 0) {
	 nInputSwap |= 0x02; // p2 controls p1
 }
 if (!(pDropped&0x08) && SekReadByte(0xFF49A3) > 0) {
	 nInputSwap |= 0x08; // p4 controls p2
 }
 if (SekReadByte(0xFF2492) == 0) {
	 bInit = false;
	 nInputSwap = 0x00; // back to default
 }
} else {
 if (!(pDropped&0x02) && SekReadByte(0xFF3A61) == 1) {
	 nInputSwap |= 0x02; // p2 controls p1
 }
 if (!(pDropped&0x08) && SekReadByte(0xFF3E61) == 1) {
	 nInputSwap |= 0x08; // p4 controls p2
 }
}

if(pDropped&0x04 && !(pDropped&0x08)) {
 nInputSwap |= 0x08; // p4 controls p2
}

CpsFsi4pSwap(nInputSwap);
}
// new
// FBA Combo - extra players input hack
static int Drv4pInit()
{
bInputSwap = true;
kDropped = 0x00;
BurnDrvInputSwap = Drv4pInputSwap;
return DrvInit();
}
// new
// FBA Combo - extra players input hack
static int Drv4pExit()
{
bInputSwap = false;
kDropped = 0x00;
BurnDrvInputSwap = NULL;
return DrvExit();
}
...
struct BurnDriver BurnDrvCpsMshvsf=
{
...
}
// new
// FBA Combo - extra players input hack
static int MshvsfZipName(char **pszName,unsigned int i)
{
 if (i==0) { if (pszName!=NULL) *pszName="mshvsf.zip";  return 0; }
 return 1;
}
struct BurnDriver BurnDrvCpsMshvsf4p=
{
 {"mshvsf4p","Marvel Super Heroes Vs. Street Fighter (US 970827) 4 Player","","Capcom","CPS2","1997",NULL, NULL},
 1,4,HARDWARE_CAPCOM_CPS2,
 MshvsfZipName, MshvsfRomInfo, MshvsfRomName, Drv4pInputInfo, NULL,
 Drv4pInit,Drv4pExit,Cps2Frame,CpsRedraw,CpsAreaScan,
 &CpsRecalcPal,384,224,4,3
};
...
struct BurnDriver BurnDrvCpsMshvsfu1=
{
...
}
// new
// FBA Combo - extra players input hack
static int Mshvsfu1ZipName(char **pszName,unsigned int i)
{
 if (i==0) { if (pszName!=NULL) *pszName="mshvsfu1.zip";  return 0; }
 if (i==1) { if (pszName!=NULL) *pszName="mshvsf.zip";  return 0; }
 return 1;
}
struct BurnDriver BurnDrvCpsMshvsfu14p=
{
 {"mshvsfu14p","Marvel Super Heroes Vs. Street Fighter (US 970625) 4 Player","","Capcom","CPS2","1997","mshvsf4p",NULL},
 1,4,HARDWARE_CAPCOM_CPS2,
 Mshvsfu1ZipName, Mshvsfu1RomInfo, Mshvsfu1RomName, Drv4pInputInfo, NULL,
 Drv4pInit,Drv4pExit,Cps2Frame,CpsRedraw,CpsAreaScan,
 &CpsRecalcPal,384,224,4,3
};
...
struct BurnDriver BurnDrvCpsMshvsfj=
{
...
}
// new
// FBA Combo - extra players input hack
static int MshvsfjZipName(char **pszName,unsigned int i)
{
 if (i==0) { if (pszName!=NULL) *pszName="mshvsfj.zip";  return 0; }
 if (i==1) { if (pszName!=NULL) *pszName="mshvsf.zip";  return 0; }
 return 1;
}
struct BurnDriver BurnDrvCpsMshvsfj4p=
{
 {"mshvsfj4p","Marvel Super Heroes Vs. Street Fighter (Japan 970707) 4 Player","","Capcom","CPS2","1997","mshvsf4p",NULL},
 1,4,HARDWARE_CAPCOM_CPS2,
 MshvsfjZipName, MshvsfjRomInfo, MshvsfjRomName, Drv4pInputInfo, NULL,
 Drv4pInit,Drv4pExit,Cps2Frame,CpsRedraw,CpsAreaScan,
 &CpsRecalcPal,384,224,4,3
};
...
struct BurnDriver BurnDrvCpsMshvsfj1=
{
...
}
// new
// FBA Combo - extra players input hack
static int Mshvsfj1ZipName(char **pszName,unsigned int i)
{
 if (i==0) { if (pszName!=NULL) *pszName="mshvsfj1.zip";  return 0; }
 if (i==1) { if (pszName!=NULL) *pszName="mshvsf.zip";  return 0; }
 return 1;
}
struct BurnDriver BurnDrvCpsMshvsfj14p=
{
 {"mshvsfj14p","Marvel Super Heroes Vs. Street Fighter (Japan 970702) 4 Player","","Capcom","CPS2","1997","mshvsf4p",NULL},
 1,4,HARDWARE_CAPCOM_CPS2,
 Mshvsfj1ZipName, Mshvsfj1RomInfo, Mshvsfj1RomName, Drv4pInputInfo, NULL,
 Drv4pInit,Drv4pExit,Cps2Frame,CpsRedraw,CpsAreaScan,
 &CpsRecalcPal,384,224,4,3
};
...
struct BurnDriverX BurnDrvCpsMshvsfh=
{
...
}
// new
// FBA Combo - extra players input hack
static int MshvsfhZipName(char **pszName,unsigned int i)
{
 if (i==0) { if (pszName!=NULL) *pszName="mshvsfh.zip";  return 0; }
 if (i==1) { if (pszName!=NULL) *pszName="mshvsf.zip";  return 0; }
 return 1;
}
struct BurnDriverX BurnDrvCpsMshvsfh4p=
{
 {"mshvsfh4p","Marvel Super Heroes Vs. Street Fighter (Hispanic 970625) 4 Player","Encrypted","Capcom","CPS2","1997","mshvsf4p",NULL},
 0,4,HARDWARE_CAPCOM_CPS2,
 MshvsfhZipName, MshvsfhRomInfo, MshvsfhRomName, Drv4pInputInfo, NULL,
 Drv4pInit,Drv4pExit,Cps2Frame,CpsRedraw,CpsAreaScan,
 &CpsRecalcPal,384,224,4,3
};
...
struct BurnDriverX BurnDrvCpsMshvsfa=
{
...
}
// new
// FBA Combo - extra players input hack
static int MshvsfaZipName(char **pszName,unsigned int i)
{
 if (i==0) { if (pszName!=NULL) *pszName="mshvsfa.zip";  return 0; }
 if (i==1) { if (pszName!=NULL) *pszName="mshvsf.zip";  return 0; }
 return 1;
}
struct BurnDriverX BurnDrvCpsMshvsfa4p=
{
 {"mshvsfa4p","Marvel Super Heroes Vs. Street Fighter (Asia 970625) 4 Player","Encrypted","Capcom","CPS2","1997","mshvsf4p",NULL},
 0,4,HARDWARE_CAPCOM_CPS2,
 MshvsfaZipName, MshvsfaRomInfo, MshvsfaRomName, Drv4pInputInfo, NULL,
 Drv4pInit,Drv4pExit,Cps2Frame,CpsRedraw,CpsAreaScan,
 &CpsRecalcPal,384,224,4,3
};
...
struct BurnDriverX BurnDrvCpsMshvsfa1=
{
...
}
// new
// FBA Combo - extra players input hack
static int Mshvsfa1ZipName(char **pszName,unsigned int i)
{
 if (i==0) { if (pszName!=NULL) *pszName="mshvsfa1.zip";  return 0; }
 if (i==1) { if (pszName!=NULL) *pszName="mshvsf.zip";  return 0; }
 return 1;
}
struct BurnDriverX BurnDrvCpsMshvsfa14p=
{
 {"mshvsfa14p","Marvel Super Heroes Vs. Street Fighter (Asia 970620) 4 Player","Encrypted","Capcom","CPS2","1997","mshvsf4p",NULL},
 0,4,HARDWARE_CAPCOM_CPS2,
 Mshvsfa1ZipName, Mshvsfa1RomInfo, Mshvsfa1RomName, Drv4pInputInfo, NULL,
 Drv4pInit,Drv4pExit,Cps2Frame,CpsRedraw,CpsAreaScan,
 &CpsRecalcPal,384,224,4,3
};
...
------------------------ /burn/capcom/dc_mvsc.cpp
...
STDINPUTINFOSPEC(Drv, CpsFsi);
// new
STDINPUTINFOSPEC(Drv4p, CpsFsi4p); // FBA Combo - extra players input hack
...
static int DrvExit()
{
...
}
// new
// FBA Combo - extra players input hack
// kDropped = which players got dropped during netplay
static void Drv4pInputSwap()
{
static bool bInit = false;
unsigned char pDropped = kDropped;
unsigned char nInputSwap = 0x00; // default = don't swap

if (SekReadByte(0xFF5C2B) == 1) {
 bInit = true;
}
if (bInit) {
 if (!(pDropped&0x02) && SekReadByte(0xFF5E4C) > 0) {
	 nInputSwap |= 0x02; // p2 controls p1
 }
 if (!(pDropped&0x08) && SekReadByte(0xFF5DDC) > 0) {
	 nInputSwap |= 0x08; // p4 controls p2
 }
 if (SekReadByte(0xFF5C2B) == 0) {
	 bInit = false;
	 nInputSwap = 0x00; // back to default 
 }
} else {
 if (!(pDropped&0x02) && SekReadByte(0xFF3A81) == 0) {
	 nInputSwap |= 0x02; // p2 controls p1
 }
 if (!(pDropped&0x08) && SekReadByte(0xFF3E81) == 0) {
	 nInputSwap |= 0x08; // p4 controls p2
 }
}

if(pDropped&0x04 && !(pDropped&0x08)) {
 nInputSwap |= 0x08; // p4 controls p2
}

CpsFsi4pSwap(nInputSwap);
}
// new
// FBA Combo - extra players input hack
static int Drv4pInit()
{
bInputSwap = true;
kDropped = 0x00;
BurnDrvInputSwap = Drv4pInputSwap;
return DrvInit();
}
// new
// FBA Combo - extra players input hack
static int Drv4pExit()
{
bInputSwap = false;
kDropped = 0x00;
BurnDrvInputSwap = NULL;
return DrvExit();
}
...
struct BurnDriver BurnDrvCpsMvsc=
{
...
}
// new
// FBA Combo - extra players input hack
static int MvscZipName(char **pszName,unsigned int i)
{
 if (i==0) { if (pszName!=NULL) *pszName="mvsc.zip";  return 0; }
 return 1;
}
struct BurnDriver BurnDrvCpsMvsc4p=
{
 {"mvsc4p","Marvel Vs. Capcom: Clash of Super Heroes (US 980123) 4 Player","","Capcom","CPS2","1998",NULL,NULL},
 1,4,HARDWARE_CAPCOM_CPS2,
 MvscZipName, MvscRomInfo, MvscRomName, Drv4pInputInfo, NULL,
 Drv4pInit,Drv4pExit,Cps2Frame,CpsRedraw,CpsAreaScan,
 &CpsRecalcPal,384,224,4,3
};
...
struct BurnDriver BurnDrvCpsMvscj=
{
...
}
// new
// FBA Combo - extra players input hack
static int MvscjZipName(char **pszName,unsigned int i)
{
 if (i==0) { if (pszName!=NULL) *pszName="mvscj.zip";  return 0; }
 if (i==1) { if (pszName!=NULL) *pszName="mvsc.zip";  return 0; }
 return 1;
}
struct BurnDriver BurnDrvCpsMvscj4p=
{
 {"mvscj4p","Marvel Vs. Capcom: Clash of Super Heroes (Japan 980123) 4 Player","","Capcom","CPS2","1998","mvsc4p",NULL},
 1,4,HARDWARE_CAPCOM_CPS2,
 MvscjZipName, MvscjRomInfo, MvscjRomName, Drv4pInputInfo, NULL,
 Drv4pInit,Drv4pExit,Cps2Frame,CpsRedraw,CpsAreaScan,
 &CpsRecalcPal,384,224,4,3
};
...
struct BurnDriver BurnDrvCpsMvscjr1=
{
...
}
// new
// FBA Combo - extra players input hack
static int Mvscjr1ZipName(char **pszName,unsigned int i)
{
 if (i==0) { if (pszName!=NULL) *pszName="mvscjr1.zip";  return 0; }
 if (i==1) { if (pszName!=NULL) *pszName="mvsc.zip";  return 0; }
 return 1;
}
struct BurnDriver BurnDrvCpsMvscjr14p=
{
 {"mvscjr14p","Marvel Vs. Capcom: Clash of Super Heroes (Japan 980112) 4 Player","","Capcom","CPS2","1998","mvsc4p",NULL},
 1,4,HARDWARE_CAPCOM_CPS2,
 Mvscjr1ZipName, Mvscjr1RomInfo, Mvscjr1RomName, Drv4pInputInfo, NULL,
 Drv4pInit,Drv4pExit,Cps2Frame,CpsRedraw,CpsAreaScan,
 &CpsRecalcPal,384,224,4,3
};
...
struct BurnDriver BurnDrvCpsMvsca=
{
...
}
// new
// FBA Combo - extra players input hack
static int MvscaZipName(char **pszName,unsigned int i)
{
 if (i==0) { if (pszName!=NULL) *pszName="mvsca.zip";  return 0; }
 if (i==1) { if (pszName!=NULL) *pszName="mvsc.zip";  return 0; }
 return 1;
}
struct BurnDriver BurnDrvCpsMvsca4p=
{
 {"mvsca4p","Marvel Vs. Capcom: Clash of Super Heroes (Asia 980112) 4 Player","","Capcom","CPS2","1998","mvsc4p",NULL},
 1,4,HARDWARE_CAPCOM_CPS2,
 MvscaZipName, MvscaRomInfo, MvscaRomName, Drv4pInputInfo, NULL,
 Drv4pInit,Drv4pExit,Cps2Frame,CpsRedraw,CpsAreaScan,
 &CpsRecalcPal,384,224,4,3
};
...
struct BurnDriverX BurnDrvCpsMvsch=
{
...
}
// new
// FBA Combo - extra players input hack
static int MvschZipName(char **pszName,unsigned int i)
{
 if (i==0) { if (pszName!=NULL) *pszName="mvsch.zip";  return 0; }
 if (i==1) { if (pszName!=NULL) *pszName="mvsc.zip";  return 0; }
 return 1;
}
struct BurnDriverX BurnDrvCpsMvsch4p=
{
 {"mvsch4p","Marvel Vs. Capcom: Clash of Super Heroes (Hispanic 980123) 4 Player","Encrypted","Capcom","CPS2","1998","mvsc4p",NULL},
 0,4,HARDWARE_CAPCOM_CPS2,
 MvschZipName, MvschRomInfo, MvschRomName, Drv4pInputInfo, NULL,
 Drv4pInit,Drv4pExit,Cps2Frame,CpsRedraw,CpsAreaScan,
 &CpsRecalcPal,384,224,4,3
};
...
------------------------ /burn/capcom/dc_xmvsf.cpp
...
...
STDINPUTINFOSPEC(Drv, CpsFsi);
// new
STDINPUTINFOSPEC(Drv4p, CpsFsi4p); // FBA Combo - extra players input hack
...
static int DrvExit()
{
...
}
// new
// FBA Combo - extra players input hack
// kDropped = which players got dropped during netplay
static void Drv4pInputSwap()
{
static unsigned int cP1 = 0, cP2 = 0, cP3 = 0, cP4 = 0;
static bool bInit = false;
unsigned char pDropped = kDropped;
unsigned char nInputSwap = 0x00; // default = don't swap

if ((SekReadByte(0xFF4211) == 0 && SekReadByte(0xFF4213) == 0 && SekReadByte(0xFF4214) == 0) ||
	 (SekReadByte(0xFF4611) == 0 && SekReadByte(0xFF4613) == 0 && SekReadByte(0xFF4614) == 0)) {
 bInit = true;
}
if (bInit) {
 cP1 = SekReadByte(0xFF4053);
 cP2 = SekReadByte(0xFF4853);
 cP3 = SekReadByte(0xFF4453);
 cP4 = SekReadByte(0xFF4C53);
 if (!(pDropped&0x02) && SekReadByte(0xFF5183) > 0) {
	 nInputSwap |= 0x02; // p2 controls p1
 }
 if (!(pDropped&0x08) && SekReadByte(0xFF51A3) > 0) {
	 nInputSwap |= 0x08; // p4 controls p2
 }
 if (SekReadByte(0xFF4211) != 0 && SekReadByte(0xFF4611) != 0)	{
	 bInit = false;
	 nInputSwap = 0x00; // back to default 
 }
} else {
 if (!(pDropped&0x02) && SekReadByte(0xFF4053) == cP2) {
	 nInputSwap |= 0x02; // p2 controls p1
 }
 if (!(pDropped&0x08) && SekReadByte(0xFF4453) == cP4) {
	 nInputSwap |= 0x08; // p4 controls p2
 }
}

if(pDropped&0x04 && !(pDropped&0x08)) {
 nInputSwap |= 0x08; // p4 controls p2
}

CpsFsi4pSwap(nInputSwap);
}
// new
// FBA Combo - extra players input hack
static int Drv4pInit()
{
bInputSwap = true;
kDropped = 0x00;
BurnDrvInputSwap = Drv4pInputSwap;
return DrvInit();
}
// new
// FBA Combo - extra players input hack
static int Drv4pExit()
{
bInputSwap = false;
kDropped = 0x00;
BurnDrvInputSwap = NULL;
return DrvExit();
}
...
struct BurnDriver BurnDrvCpsXmvsf=
{
...
}
// new
// FBA Combo - extra players input hack
static int XmvsfZipName(char **pszName,unsigned int i)
{
 if (i==0) { if (pszName!=NULL) *pszName="xmvsf.zip";  return 0; }
 return 1;
}
struct BurnDriver BurnDrvCpsXmvsf4p=
{
 {"xmvsf4p","X-Men Vs. Street Fighter (Euro 960910) 4 Player","","Capcom","CPS2","1996",NULL,NULL},
 1,4,HARDWARE_CAPCOM_CPS2,
 XmvsfZipName, XmvsfRomInfo, XmvsfRomName, Drv4pInputInfo, NULL,
 Drv4pInit,Drv4pExit,Cps2Frame,CpsRedraw,CpsAreaScan,
 &CpsRecalcPal,384,224,4,3
};
...
struct BurnDriver BurnDrvCpsXmvsfu=
{
...
}
// new
// FBA Combo - extra players input hack
static int XmvsfuZipName(char **pszName,unsigned int i)
{
 if (i==0) { if (pszName!=NULL) *pszName="xmvsfu.zip";  return 0; }
 if (i==1) { if (pszName!=NULL) *pszName="xmvsf.zip";  return 0; }
 return 1;
}
struct BurnDriver BurnDrvCpsXmvsfu4p=
{
 {"xmvsfu4p","X-Men Vs. Street Fighter (US 961004) 4 Player","","Capcom","CPS2","1996","xmvsf4p",NULL},
 1,4,HARDWARE_CAPCOM_CPS2,
 XmvsfuZipName, XmvsfuRomInfo, XmvsfuRomName, Drv4pInputInfo, NULL,
 Drv4pInit,Drv4pExit,Cps2Frame,CpsRedraw,CpsAreaScan,
 &CpsRecalcPal,384,224,4,3
};
...
struct BurnDriverX BurnDrvCpsXmvsfj=
{
...
}
// new
// FBA Combo - extra players input hack
static int XmvsfjZipName(char **pszName,unsigned int i)
{
 if (i==0) { if (pszName!=NULL) *pszName="xmvsfj.zip";  return 0; }
 if (i==1) { if (pszName!=NULL) *pszName="xmvsf.zip";  return 0; }
 return 1;
}
struct BurnDriverX BurnDrvCpsXmvsfj4p=
{
 {"xmvsfj4p","X-Men Vs. Street Fighter (Japan 960910) 4 Player","Encrypted","Capcom","CPS2","1996","xmvsf4p",NULL},
 0,4,HARDWARE_CAPCOM_CPS2,
 XmvsfjZipName, XmvsfjRomInfo, XmvsfjRomName, Drv4pInputInfo, NULL,
 Drv4pInit,Drv4pExit,Cps2Frame,CpsRedraw,CpsAreaScan,
 &CpsRecalcPal,384,224,4,3
};
...
struct BurnDriverX BurnDrvCpsXmvsfa=
{
...
}
// new
// FBA Combo - extra players input hack
static int XmvsfaZipName(char **pszName,unsigned int i)
{
 if (i==0) { if (pszName!=NULL) *pszName="xmvsfa.zip";  return 0; }
 if (i==1) { if (pszName!=NULL) *pszName="xmvsf.zip";  return 0; }
 return 1;
}
struct BurnDriverX BurnDrvCpsXmvsfa4p=
{
 {"xmvsfa4p","X-Men Vs. Street Fighter (Asia 961023) 4 Player","Encrypted","Capcom","CPS2","1996","xmvsf4p",NULL},
 0,4,HARDWARE_CAPCOM_CPS2,
 XmvsfaZipName, XmvsfaRomInfo, XmvsfaRomName, Drv4pInputInfo, NULL,
 Drv4pInit,Drv4pExit,Cps2Frame,CpsRedraw,CpsAreaScan,
 &CpsRecalcPal,384,224,4,3
};
...
struct BurnDriverX BurnDrvCpsXmvsfh=
{
...
}
// new
// FBA Combo - extra players input hack
static int XmvsfhZipName(char **pszName,unsigned int i)
{
 if (i==0) { if (pszName!=NULL) *pszName="xmvsfh.zip";  return 0; }
 if (i==1) { if (pszName!=NULL) *pszName="xmvsf.zip";  return 0; }
 return 1;
}
struct BurnDriverX BurnDrvCpsXmvsfh4p=
{
 {"xmvsfh4p","X-Men Vs. Street Fighter (Hispanic 961004) 4 Player","Encrypted","Capcom","CPS2","1996","xmvsf4p",NULL},
 0,4,HARDWARE_CAPCOM_CPS2,
 XmvsfhZipName, XmvsfhRomInfo, XmvsfhRomName, Drv4pInputInfo, NULL,
 Drv4pInit,Drv4pExit,Cps2Frame,CpsRedraw,CpsAreaScan,
 &CpsRecalcPal,384,224,4,3
};
...

 

With this information, could a new version of FBAx or FBA-xxx be compiled that allowed 4 player MvC?

Edited by Vagabond
Link to comment
Share on other sites

I don't recall exactly that feature, for MvsC 1 on the Dreamcast, if you did the Hyper/super team effect, you could have 4 human players. I think it only works in that mode. I'll do some testin on my Nebual MvS and on my Xbox version of FBAXXX with Marvel vs Capcom. Well, I can only setup 2 players on my Nebula version for MvsC.

Edited by axledentaldj
Link to comment
Share on other sites

more info for that version:

[ 2 ] 4 player support for following games:

 

    - Marvel Super Heroes Vs. Street Fighter (all clones)

    - Marvel Vs. Capcom (all clones)

    - X-men Vs. Street Fighter (all clones)

 

    Notes:

 

  * You *could* join the 4 player versions of above games using

    the official build, but the game will desync immediately.

    All other games will play fine with the official build.

 

  * Normal mode recordings must be played on normal mode and

    4 player mode recordings must be played on 4 player mode.

    Failing to do so will cause desync while replaying the

    movie.  However, if you load the replay file before any

    game is loaded, it will load the correct mode.

 

  --- How the 4 player mode works ---

 

  If there are 4 players playing the game, P1 and P2 control left side

  characters, and P3 and P4 control right side characters.  Basically,

  it's (P1 and P2 vs. P3 and P4). On the selection screen, only P1 is

  allowed to select the first character, and then P2 selects the 2nd

  character.  Same goes for the right side players (P3 and then P4).

  The match will start off as P1 vs. P3 until they decide to switch

  with their teammate.  Players cannot control the character while it's

  not their turn, so they must wait for their turn.

 

 

  --- Rules for 4 player support ---

 

  * 4 player support for above games are available for both

    off-line and on-line mode.

 

  * Rules for off-line mode:

 

    - Requires two players to play against CPU.

    - Requires four players to play against each other.

   

  * Rules for on-line mode:

 

    - 1 player at start --->      p1 vs. CPU

    - 2 players at start --> p1 & p2 vs. CPU

    - 3 players at start --> p1 & p2 vs. p3

    - 4 players at start --> p1 & p2 vs. p3 & p4

 

  * Rules for on-line mode when someone gets dropped/disconnected:

 

    - p1 dropped ----------> no longer a netplay, Duh!

 

    - -------------+----------------------+--------------------

      Started with | Dropped/Disconnected | Rule

      -------------+----------------------+--------------------

      2 players    | p2                |      p1 vs. CPU

      3 players    | p2                |      p1 vs. p3

      3 players    | p3                | p1 & p2 vs. CPU

      3 players    | p2 & p3              |      p1 vs. CPU

      4 players    | p2                |      p1 vs. p3 & p4

      4 players    | p3                | p1 & p2 vs. p4

      4 players    | p4                | p1 & p2 vs. p3

      4 players    | p2 & p3              |      p1 vs. p4

      4 players    | p2 & p4              |      p1 vs. p3

      4 players    | p3 & p4              | p1 & p2 vs. CPU

      4 players    | p2 & p3 & p4      |      p1 vs. CPU

      -------------+----------------------+--------------------

 

  --- Bugs regarding to the 4 player mode ---

 

  * In Marvel Vs. Capcom 4 player mode, player 2 has the control

    in the beginning, not player 1.  Therefore, player 2 has to

    input coins and press start.  After the character selection

    screen appears, things will be normal.  However, if you wait

    until the intro ends (after attract mode is started), player 1

    has the control first (which is the way it should be).  The RAM

    monitoring for supporting 4 player mode is based on MAME32k.

    I wasn't able to test this on mame32k, so I don't know if same

    thing happens on MAME32k or not.

 

  * When you generate Romcenter/ClrMamePro dat files, you will

    notice that the 4 player version of above games are listed as

    seperate set of roms. Due to the Game driver structure, it was

    either making them listed as seperate roms, or making them use

    same file names for the game cfg file.  Since switching between

    the normal and 4 player mode could screw up input setting, I

    made it to use different file names, and therefore, listed as

    new set of roms in the dat file. The 4 player versions, however,

    use same roms as normal versions since these are not a rom hacks,

    but input hacks.  Therefore, their status will be same as your

    normal romset status.

Edited by Vagabond
Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...