X-Git-Url: https://notaz.gp2x.de/cgi-bin/gitweb.cgi?p=mupen64plus-pandora.git;a=blobdiff_plain;f=source%2Fmupen64plus-core%2Fsrc%2Fmain%2Fcheat.c;h=7266762fda1d063c89f6b671ddcfeef9039c37e1;hp=52551ce0a0185b4c165402b3ba0f49563e0073f0;hb=2d26287291331f2b1793a8e76ede08c75654fb7c;hpb=01d8ca6fb06a8261602900cab63c61e5a1b143c9 diff --git a/source/mupen64plus-core/src/main/cheat.c b/source/mupen64plus-core/src/main/cheat.c index 52551ce..7266762 100644 --- a/source/mupen64plus-core/src/main/cheat.c +++ b/source/mupen64plus-core/src/main/cheat.c @@ -205,25 +205,87 @@ void cheat_apply_cheats(int entry) int execute_next; // If game is Zelda OOT, apply subscreen delay fix - if (strncmp((char *)ROM_HEADER.Name, "THE LEGEND OF ZELDA", 19) == 0 && entry == ENTRY_VI) { + if (entry == ENTRY_VI && strncmp((char *)ROM_HEADER.Name, "THE LEGEND OF ZELDA", 19) == 0) { + uint32_t subscreen_address = 0; + uint32_t credits_address[4]; + credits_address[0] = 0; if (sl(ROM_HEADER.CRC1) == 0xEC7011B7 && sl(ROM_HEADER.CRC2) == 0x7616D72B) { // Legend of Zelda, The - Ocarina of Time (U) + (J) (V1.0) - execute_cheat(0x801DA5CB, 0x0002, NULL); + subscreen_address = 0x801DA5CB; } else if (sl(ROM_HEADER.CRC1) == 0xD43DA81F && sl(ROM_HEADER.CRC2) == 0x021E1E19) { // Legend of Zelda, The - Ocarina of Time (U) + (J) (V1.1) - execute_cheat(0x801DA78B, 0x0002, NULL); + subscreen_address = 0x801DA78B; } else if (sl(ROM_HEADER.CRC1) == 0x693BA2AE && sl(ROM_HEADER.CRC2) == 0xB7F14E9F) { // Legend of Zelda, The - Ocarina of Time (U) + (J) (V1.2) - execute_cheat(0x801DAE8B, 0x0002, NULL); + subscreen_address = 0x801DAE8B; } else if (sl(ROM_HEADER.CRC1) == 0xB044B569 && sl(ROM_HEADER.CRC2) == 0x373C1985) { // Legend of Zelda, The - Ocarina of Time (E) (V1.0) - execute_cheat(0x801D860B, 0x0002, NULL); + subscreen_address = 0x801D860B; } else if (sl(ROM_HEADER.CRC1) == 0xB2055FBD && sl(ROM_HEADER.CRC2) == 0x0BAB4E0C) { // Legend of Zelda, The - Ocarina of Time (E) (V1.1) - execute_cheat(0x801D864B, 0x0002, NULL); + subscreen_address = 0x801D864B; + // GC Versions such as Master Quest also require the End Credits Fix. + } else if (sl(ROM_HEADER.CRC1) == 0x1D4136F3 && sl(ROM_HEADER.CRC2) == 0xAF63EEA9) { + // Legend of Zelda, The - Ocarina of Time - Master Quest (E) (GC Version) + subscreen_address = 0x801D8F4B; + credits_address[0] = 0xD109A8C4; + credits_address[1] = 0x8109A8C4; + credits_address[2] = 0xD109A8C6; + credits_address[3] = 0x8109A8C6; + } else if (sl(ROM_HEADER.CRC1) == 0x09465AC3 && sl(ROM_HEADER.CRC2) == 0xF8CB501B) { + // Legend of Zelda, The - Ocarina of Time (E) (GC Version) + subscreen_address = 0x801D8F8B; + credits_address[0] = 0xD109A8E4; + credits_address[1] = 0x8109A8E4; + credits_address[2] = 0xD109A8E6; + credits_address[3] = 0x8109A8E6; + } else if (sl(ROM_HEADER.CRC1) == 0xF3DD35BA && sl(ROM_HEADER.CRC2) == 0x4152E075) { + // Legend of Zelda, The - Ocarina of Time (U) (GC Version) + subscreen_address = 0x801DB78B; + credits_address[0] = 0xD109A814; + credits_address[1] = 0x8109A814; + credits_address[2] = 0xD109A816; + credits_address[3] = 0x8109A816; + } else if (sl(ROM_HEADER.CRC1) == 0xF034001A && sl(ROM_HEADER.CRC2) == 0xAE47ED06) { + // Legend of Zelda, The - Ocarina of Time - Master Quest (U) (GC Version) + subscreen_address = 0x801DB74B; + credits_address[0] = 0xD109A7F4; + credits_address[1] = 0x8109A7F4; + credits_address[2] = 0xD109A7F6; + credits_address[3] = 0x8109A7F6; + } else if (sl(ROM_HEADER.CRC1) == 0xF7F52DB8 && sl(ROM_HEADER.CRC2) == 0x2195E636) { + // Zelda no Densetsu - Toki no Ocarina - Zelda Collection Version (J) (GC Version) + subscreen_address = 0x801DB78B; + credits_address[0] = 0xD109A814; + credits_address[1] = 0x8109A814; + credits_address[2] = 0xD109A816; + credits_address[3] = 0x8109A816; + } else if (sl(ROM_HEADER.CRC1) == 0xF611F4BA && sl(ROM_HEADER.CRC2) == 0xC584135C) { + // Zelda no Densetsu - Toki no Ocarina GC (J) (GC Version) + subscreen_address = 0x801DB78B; + credits_address[0] = 0xD109A834; + credits_address[1] = 0x8109A834; + credits_address[2] = 0xD109A836; + credits_address[3] = 0x8109A836; + } else if (sl(ROM_HEADER.CRC1) == 0xF43B45BA && sl(ROM_HEADER.CRC2) == 0x2F0E9B6F) { + // Zelda no Densetsu - Toki no Ocarina GC Ura (J) (GC Version) + subscreen_address = 0x801DB78B; + credits_address[0] = 0xD109A814; + credits_address[1] = 0x8109A814; + credits_address[2] = 0xD109A816; + credits_address[3] = 0x8109A816; } else { - // Legend of Zelda, The - Ocarina of Time Master Quest - execute_cheat(0x801D8F4B, 0x0002, NULL); + // UNKNOWN VERSION + DebugMessage(M64MSG_WARNING, "Warning: Ocarina of Time version could not be determined. No fixes applied."); + } + if (subscreen_address) { + execute_cheat(subscreen_address, 0x0002, NULL); + if (credits_address[0]){ + if (execute_cheat(credits_address[0], 0x0320, NULL)); + execute_cheat(credits_address[1], 0x0000, NULL); + if (execute_cheat(credits_address[2], 0xF809, NULL)); + execute_cheat(credits_address[3], 0x0000, NULL); + } } }