Vagabond Posted April 18, 2004 Share Posted April 18, 2004 (edited) 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 April 19, 2004 by Vagabond Link to comment Share on other sites More sharing options...
axledentaldj Posted April 18, 2004 Share Posted April 18, 2004 (edited) 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 April 18, 2004 by axledentaldj Link to comment Share on other sites More sharing options...
Vagabond Posted April 19, 2004 Author Share Posted April 19, 2004 (edited) 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 April 19, 2004 by Vagabond Link to comment Share on other sites More sharing options...
Recommended Posts
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 accountSign in
Already have an account? Sign in here.
Sign In Now