ips patches, 0.4 r162 rel?
[fceu.git] / fce.c
diff --git a/fce.c b/fce.c
index 51e6621..89a54a3 100644 (file)
--- a/fce.c
+++ b/fce.c
@@ -39,6 +39,7 @@
 #include       "fds.h"
 #include       "ines.h"
 #include       "unif.h"
+#include       "vsuni.h"
 #include        "cheat.h"
 
 #include       "state.h"
@@ -1108,7 +1109,7 @@ int NSFLoad(int fp);
 FCEUGI *FCEUI_LoadGame(char *name)
 {
        char name2[512];
-       int have_movie = 0;
+       int have_movie = 0, have_ips = 0;
         int fp;
 
         //Exit=1;
@@ -1128,24 +1129,39 @@ FCEUGI *FCEUI_LoadGame(char *name)
 
         {
         char *p = name2 + strlen(name2) - 4;
-        if (strcmp(p, ".fcm") == 0)
+        if (strcasecmp(p, ".fcm") == 0) printf("movie detected\n"), have_movie = 1;
+        if (strcasecmp(p, ".ips") == 0) printf("ips detected\n"), have_ips = 1;
+        if (have_movie || have_ips)
         {
          // movie detected
-         printf("movie detected\n");
          FCEU_fclose(fp);
          *p = 0;
          fp=FCEU_fopen(name2,"rb");
-         if (!fp && p - name2 > 2)  p[-2] = 0;
-         fp=FCEU_fopen(name2,"rb");
+         if (!fp && p - name2 > 2)
+         {
+          for (p--; p > name2 && *p != '.'; p--);
+           *p = 0;
+          fp=FCEU_fopen(name2,"rb");
+         }
          if (!fp) {
-          printf("no ROM for movie\n");
+          printf("no ROM for ips/movie\n");
           LoadGameLastError = 2;
           return 0;
          }
-         have_movie = 1;
         }
        }
 
+       // do IPS patch
+       if (have_ips)
+       {
+        FCEU_fclose(fp);
+        FILE *ips = fopen(name, "rb");
+        if (!ips) return 0;
+         fp=FCEU_fopen_forcemem(name2);
+        if (!fp) { fclose(ips); return 0; }
+        ApplyIPS(ips, fp); // closes ips
+       }
+
         GetFileBase(name2);
         if(iNESLoad(name2,fp))
          goto endlseq;
@@ -1519,12 +1535,15 @@ void PowerNES(void)
         PowerSound();
        PowerPPU();
        GameInterface(GI_POWER, 0);
-       timestampbase=0;
+        if(FCEUGameInfo.type==GIT_VSUNI)
+         FCEU_VSUniPower();
 #ifdef ASM_6502
        if (geniestage)
         GenieSetPages(0);
 #endif
+       timestampbase=0;
        X6502_Power();
+       FCEU_PowerCheats();
 }