ALL: Huge upstream synch + PerRom DelaySI & CountPerOp parameters
[mupen64plus-pandora.git] / source / mupen64plus-core / src / main / cheat.c
index 52551ce..7266762 100644 (file)
@@ -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);
+            }
         }
     }