diff --git a/OpenParrot/src/Functions/Games/Nesica/NesicaGeneric.cpp b/OpenParrot/src/Functions/Games/Nesica/NesicaGeneric.cpp index aff3432..e0c7cae 100644 --- a/OpenParrot/src/Functions/Games/Nesica/NesicaGeneric.cpp +++ b/OpenParrot/src/Functions/Games/Nesica/NesicaGeneric.cpp @@ -99,7 +99,7 @@ static InitFunction initFunction_DariusBurst([]() // Ignore cryptopipe check. // NOTE: This could be cause for the non-working TEST MODE. No time to analyze since dump was released and we want to give instant support. - injector::WriteMemory(imageBase + 0x2CC753, 0xEB, true); + //injector::WriteMemory(imageBase + 0x2CC753, 0xEB, true); // D: injector::WriteMemoryRaw(imageBase + 0x482F38, "\x2E\x5C\x44", 3, true); // D:\%s%04d%02d%02d_%02d%02d%02d_ @@ -119,9 +119,59 @@ static InitFunction initFunction_DariusBurst([]() // NOTE: Nezarn is pro injector::WriteMemoryRaw(imageBase + 0x4D4E34, "\x30\x2E\x30\x66\x20\x20\x20\x20", 8, true); // 0.0f injector::WriteMemoryRaw(imageBase + 0x4D4E4C, "\x2A\x20\x30\x2E\x30\x66\x20\x20\x20\x20\x20\x2D", 12, true); // * 0.0f - - +#if _M_IX86 + init_CryptoPipe(GameDetect::NesicaKey); +#endif }, GameID::DariusBurst); +static InitFunction initFunction_DariusBurst116([]() +{ + init_FastIoEmu(); + init_RegHooks(); + init_NesysEmu(true); + + uintptr_t imageBase = (uintptr_t)GetModuleHandleA(0); + + // Ignore cryptopipe check. + // NOTE: This could be cause for the non-working TEST MODE. No time to analyze since dump was released and we want to give instant support. + //injector::WriteMemory(imageBase + 0x302743, 0xEB, true); + + // D: + injector::WriteMemoryRaw(imageBase + 0x4EEF68, "\x2E\x5C\x44", 3, true); // D:\%s%04d%02d%02d_%02d%02d%02d_ + injector::WriteMemoryRaw(imageBase + 0x4EF0D0, "\x2E\x5C\x44", 3, true); // D:\%s/%s/* + injector::WriteMemoryRaw(imageBase + 0x4EF0DC, "\x2E\x5C\x44", 3, true); // D:\%s/%s + injector::WriteMemoryRaw(imageBase + 0x4EF0E8, "\x2E\x5C\x44", 3, true); // D:\%s/* + injector::WriteMemoryRaw(imageBase + 0x4EF0F0, "\x2E\x5C\x44", 3, true); // D:\%s + injector::WriteMemoryRaw(imageBase + 0x50E980, "\x2E\x5C\x44", 3, true); // D:\EDData + injector::WriteMemoryRaw(imageBase + 0x50EB58, "\x2E\x5C\x44", 3, true); // D:\EDData + injector::WriteMemoryRaw(imageBase + 0x5145E0, "\x2E\x5C\x44", 3, true); // D:\EDData + injector::WriteMemoryRaw(imageBase + 0x539190, "\x2E\x5C\x44", 3, true); // D:\EDData + injector::WriteMemoryRaw(imageBase + 0x539240, "\x2E\x5C\x44", 3, true); // Proclog + injector::WriteMemoryRaw(imageBase + 0x50DD84, "\x2E\x5C\x44", 3, true); // D:\EDData\event000.pxk + injector::WriteMemoryRaw(imageBase + 0x50DD9C, "\x2E\x5C\x44", 3, true); // D:\EDData\ev + injector::WriteMemoryRaw(imageBase + 0x50E8EC, "\x2E\x5C\x44", 3, true); // D:\EDData\ev + injector::WriteMemoryRaw(imageBase + 0x50E8FC, "\x2E\x5C\x44", 3, true); // D:\EDData\ev\event000.sxr + injector::WriteMemoryRaw(imageBase + 0x50EB64, "\x2E\x5C\x44", 3, true); // D:\EDData\ev\event000.sxr + injector::WriteMemoryRaw(imageBase + 0x50EBE8, "\x2E\x5C\x44", 3, true); // D:\EDData\ev + injector::WriteMemoryRaw(imageBase + 0x50EBF8, "\x2E\x5C\x44", 3, true); // D:\EDData\ev\event000.sxr + injector::WriteMemoryRaw(imageBase + 0x517464, "\x2E\x5C\x44", 3, true); // D:\EDData\news000.tx2 + injector::WriteMemoryRaw(imageBase + 0x51747C, "\x2E\x5C\x44", 3, true); // D:\EDData\news000.tx2 + injector::WriteMemoryRaw(imageBase + 0x517494, "\x2E\x5C\x44", 3, true); // D:\EDData\news000.tx2 + injector::WriteMemoryRaw(imageBase + 0x518524, "\x2E\x5C\x44", 3, true); // D:\EDData\ev + injector::WriteMemoryRaw(imageBase + 0x5660FC, "\x2E\x5C\x44", 3, true); // D:\EDData\ev + injector::WriteMemoryRaw(imageBase + 0x56610C, "\x2E\x5C\x44", 3, true); // D:\EDData\ev\event000.sxr + + // D:/ + injector::WriteMemoryRaw(imageBase + 0x539020, "\x2E\x5C\x44", 3, true); + + // Disable invertion of 2nd screen area + injector::WriteMemoryRaw(imageBase + 0x5399CC, "\x30\x2E\x30\x66\x20\x20\x20\x20", 8, true); // 0.0f + injector::WriteMemoryRaw(imageBase + 0x5399E4, "\x2A\x20\x30\x2E\x30\x66\x20\x20\x20\x20\x20\x2D", 12, true); // * 0.0f - +#if _M_IX86 + init_CryptoPipe(GameDetect::NesicaKey); +#endif +}, GameID::DariusBurst116); + static InitFunction initFunction_PB([]() { uintptr_t imageBase = (uintptr_t)GetModuleHandleA(0); @@ -216,16 +266,14 @@ static InitFunction initFunction_Theatrhythm([]() }, GameID::Theatrhythm); +#if _M_IX86 static InitFunction initFunction_KOFXIIIClimax([]() { -#if _M_IX86 init_CryptoPipe(GameDetect::NesicaKey); -#endif }, GameID::KOFXIIIClimax); static InitFunction initFunction_KOFXIII([]() { -#if _M_IX86 init_CryptoPipe(GameDetect::NesicaKey); -#endif -}, GameID::KOFXIII); \ No newline at end of file +}, GameID::KOFXIII); +#endif \ No newline at end of file diff --git a/OpenParrot/src/Functions/Nesica_Libs/CryptoPipe.cpp b/OpenParrot/src/Functions/Nesica_Libs/CryptoPipe.cpp index b479293..aaf1a79 100644 --- a/OpenParrot/src/Functions/Nesica_Libs/CryptoPipe.cpp +++ b/OpenParrot/src/Functions/Nesica_Libs/CryptoPipe.cpp @@ -12,6 +12,7 @@ const char *key_bbcp = "0702000000a400005253413200020000010001008f35cf7db98ccacf const char *key_kofxiiiclimax = "0702000000A400005253413200020000010001000D20722B0858DCFAE9783F33E67BED82A0C1A3FE17FBB733B056A2337ADA9DAAE028079B07EE25CBCC9C2B72AA6154CEEF898C8CA9F168684D9A3806D6F622D4FF5CFFDDA03325FD7322D1CBF9CD8E45773E116B353871EEF7E5DCAAE3DCE1F8F326C1922DE4B76F1DD075DB788D67B6719126FBB2497FA0CB855F56651334DA152F3AED5D8A53C92A83F08177535B44420FEB2617E932791DC9DB0A26250755FDC37B74BCFF5DDDFDB2E52AE59D7E52042A022D37A9D73339ECA29F0DF60C1F792BCB25A3BCC5ED53D6A0DA2D403246C12EA958C4F5DAE9FFA0D10B7C31ECC3E5DC9A2418104B3A7825FBC527177EE00056176A3176323DE62CC834D36095D26CC9841D331A72814FE0D04BCE0B3A666C6896E0571E77323D5B6797B20168B9"; const char *key_persona4ultimix = "0702000000a40000525341320002000001000100359073c4ef2b8e9556ffded09e5e1c4374169ba2a2077e9993c34e7fb3b499d9624f620018afaeeed697d7e72432b488e8e4a2a1b648ee24c9e878d9145a36d87f39dfcfd4aa3751c70039dfb4ce022a85a81d7440287538a41eb3b3d9a0f0fd4b481e274b71af8bdd36ac6f7a930cc67e41be6e65628a50f3779082555ff7d97fb45e4d6973beb316d220bc45e2f20fbd1fd9271cea65ac14b09136d99a31a179ce1933f5343fe930d858769fd7b861c7bf3ecc187792a9c200856822c1ab2138628cb7183dbce115589a4a0f213fd77b91758d13d762714666b97a428723895512e57c29ab3c68113120d7cb3269a605ac483601bd6b1bdac238759d564ea6da64a445fc502251fbeaa2621bd157040c60637371096a6b261d0fcb767f9f7c"; const char *key_usf4 = "0702000000a40000525341320002000001000100b77cb7dfef27ca5ed4895576c6a68518bab782e60dae9dffad94434fb9366125e46630352261afe960e8401a3c5ee1cfc15ec2b1849e02a3dcc30e47ea3100a5c7175f9207aab497a9c9c0bf19d30a9fbb294a761147607927163685624dced391d3ae2211c6c11350077070386a195a8641f0e7920ddbcb200f990f55c76dc73de119d62751e5cb6cfa3653481d3e711b666c9a6cc9c2a4e50f4e55ce2831a821d75448cda3a2d6f3b359012bff571842c34a844989a4af0a4a5081cb8dc0780173865658cd8b999f9baaa3febc9c95b1477cd6af5060af603e597b3547fd0021a422c3a2cd0028523b5bd12b23bd4a6d2924ca920870cba2f38477631589cc4251590fba955d114f2ce0d6228c4932c1f2d9b753cda2d646591c48e164820e"; +const char *key_darius = "0702000000A40000525341320002000001000100659798436F4181BA70679A7849BBA874F385D3DB0C0930309A0953EDDAD69BD9A84AF03E51079AB63ACB0995A91E622BAAD5F929ED76F2FAB0BCE84AA6632AD4C1E08B131E39996E5B725E9A26517C7DA340F6AE3A7D5143C73A796FC437C8EDA57B741EF0496986F69DA4B721F3C949DD067DD87FC75DB5612AB440BABC6BE40159A2679C1436FA6FF05B102ACD2D01C4EDAE5FE24887E26E821BE0DA0D6EAEC579D8FACE455DB749D9A7F663BF7872B9C372E07FF47E32F6C3F9D6E45D2054DC96AE1349F80485CB631D81510197C40B18494EC8B83CD2FD5D4C08CC8922C701C556D993469CEEBBBA7515E4626AF002FE59E0E13F20288730EF2763E71F793DF2790B58F0FF7E226AF3F57AB40CD98894173F16FC97099C05CBC86BF060AC"; DWORD dword_44DEC4; DWORD dword_44DEC0; @@ -78,6 +79,13 @@ DWORD LinkRC5Data(const char* file, void* buf, int gameId) key[i] = num; } break; + case 7: + for (int i = 0; i < 308; i++) + { + sscanf(&key_darius[i * 2], "%02x", &num); + key[i] = num; + } + break; default: for (int i = 0; i < 308; i++) { diff --git a/OpenParrot/src/Functions/Nesica_Libs/CryptoPipe.h b/OpenParrot/src/Functions/Nesica_Libs/CryptoPipe.h index f98b25f..3dbf912 100644 --- a/OpenParrot/src/Functions/Nesica_Libs/CryptoPipe.h +++ b/OpenParrot/src/Functions/Nesica_Libs/CryptoPipe.h @@ -9,7 +9,8 @@ enum class NesicaKey KOFXIIIClimax = 4, Persona4Ultimix = 5, USF4 = 6, - NoNet = 7, + DariusBurst = 7, + NoNet = 8, }; void init_CryptoPipe(NesicaKey id); \ No newline at end of file diff --git a/OpenParrot/src/Functions/Nesica_Libs/FastIoEmu.cpp b/OpenParrot/src/Functions/Nesica_Libs/FastIoEmu.cpp index a647b8c..4b4ea66 100644 --- a/OpenParrot/src/Functions/Nesica_Libs/FastIoEmu.cpp +++ b/OpenParrot/src/Functions/Nesica_Libs/FastIoEmu.cpp @@ -53,7 +53,7 @@ int __cdecl iDmacDrvRegisterRead(int DeviceId, DWORD CommandCode, LPVOID OutBuff result = 0x00FF00FF; break; case 0x4004: - if (GameDetect::currentGame == GameID::DariusBurst) + if (GameDetect::currentGame == GameID::DariusBurst || GameDetect::currentGame == GameID::DariusBurst116) { // I/O error without this switch result = 0x00FF00FF; @@ -67,7 +67,7 @@ int __cdecl iDmacDrvRegisterRead(int DeviceId, DWORD CommandCode, LPVOID OutBuff result = g_fastIOValues[0] + ((DWORD)g_fastIOValues[1] * 0x100) + ((DWORD)g_fastIOValues[2] * 0x10000) + ((DWORD)g_fastIOValues[3] * 0x1000000); break; case 0x4124: // Analogs 1 - if (GameDetect::currentGame == GameID::DariusBurst) + if (GameDetect::currentGame == GameID::DariusBurst || GameDetect::currentGame == GameID::DariusBurst116) { // Sound volume to maximum result = 0xFF; diff --git a/OpenParrot/src/Utility/GameDetect.cpp b/OpenParrot/src/Utility/GameDetect.cpp index 517437e..c603f56 100644 --- a/OpenParrot/src/Utility/GameDetect.cpp +++ b/OpenParrot/src/Utility/GameDetect.cpp @@ -424,6 +424,13 @@ void GameDetect::DetectCurrentGame() if (*(uint32_t*)(moduleBase + 0x2CC751) == 0x6B75C084) { currentGame = GameID::DariusBurst; + NesicaKey = NesicaKey::DariusBurst; + break; + } + if (*(uint32_t*)(moduleBase + 0x302741) == 0x7075C084) + { + currentGame = GameID::DariusBurst116; + NesicaKey = NesicaKey::DariusBurst; break; } } diff --git a/OpenParrot/src/Utility/GameID.h b/OpenParrot/src/Utility/GameID.h index 5fb5e79..514d993 100644 --- a/OpenParrot/src/Utility/GameID.h +++ b/OpenParrot/src/Utility/GameID.h @@ -49,6 +49,7 @@ enum class GameID Daytona3, MB4, DariusBurst, + DariusBurst116, GTIClub3, GRID, UltraStreetFighterIV,