smb3 and addams family hacks
[fceu.git] / fce.c
diff --git a/fce.c b/fce.c
index 35d7209..5ad965d 100644 (file)
--- a/fce.c
+++ b/fce.c
@@ -562,7 +562,6 @@ void BGRender(uint8 *target)
 }
 
 #ifdef FRAMESKIP
-int FSkip_setting=-1; // auto
 int FSkip=0;
 void FCEUI_FrameSkip(int x)
 {
@@ -978,9 +977,9 @@ static void DoHBlank(void)
  {
   X6502_Run(6);
   Fixit2();
-  X6502_Run(4);
+  X6502_Run(4+3);      // original value was 4, but adding 3 fixes glitch in smb3 (and breaks something?)
   GameHBIRQHook();
-  X6502_Run(85-16-10);
+  X6502_Run(85-10-16-3);
  }
  else
  {
@@ -1081,6 +1080,7 @@ void ResetGameLoaded(void)
 }
 
 char lastLoadedGameName [2048];
+int LoadGameLastError = 0;
 int UNIFLoad(const char *name, int fp);
 int iNESLoad(const char *name, int fp);
 int FDSLoad(const char *name, int fp);
@@ -1092,7 +1092,8 @@ FCEUGI *FCEUI_LoadGame(char *name)
        int have_movie = 0;
         int fp;
 
-        Exit=1;
+        //Exit=1;
+       LoadGameLastError = 0;
         ResetGameLoaded();
 
        strncpy(name2, name, sizeof(name2));
@@ -1102,6 +1103,7 @@ FCEUGI *FCEUI_LoadGame(char *name)
        if(!fp)
         {
         FCEU_PrintError("Error opening \"%s\"!",name);
+        LoadGameLastError = 1;
         return 0;
        }
 
@@ -1114,16 +1116,17 @@ FCEUGI *FCEUI_LoadGame(char *name)
          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) {
           printf("no ROM for movie\n");
+          LoadGameLastError = 2;
           return 0;
          }
          have_movie = 1;
         }
        }
 
-       strcpy(lastLoadedGameName, name2);
-
         GetFileBase(name2);
         if(iNESLoad(name2,fp))
          goto endlseq;
@@ -1136,6 +1139,8 @@ FCEUGI *FCEUI_LoadGame(char *name)
 
         FCEU_PrintError("An error occurred while loading the file.");
         FCEU_fclose(fp);
+       // format handlers may set LoadGameLastError themselves.
+       if (LoadGameLastError == 0) LoadGameLastError = 3;
         return 0;
 
         endlseq:
@@ -1163,6 +1168,9 @@ FCEUGI *FCEUI_LoadGame(char *name)
 
        if (have_movie)
                FCEUI_LoadMovie(name, 1);
+
+       strcpy(lastLoadedGameName, name2);
+
         return(&FCEUGameInfo);
 }
 
@@ -1213,14 +1221,17 @@ static INLINE void Thingo(void)
 
    if(MMC5Hack && (ScreenON || SpriteON)) MMC5_hb(scanline);
 
-   // check: Battletoads & Double Dragon
+   // check: Battletoads & Double Dragon, Addams Family
+   // sky glitches in SMB1 if done wrong
    if(tosprite>=256)
    {
     X6502_Run(256);
    }
    else
    {
-     // sky glitches in SMB1 if done wrong
+     // a dirty hack for Addams Family and inaccurate sprite hit emulation
+     if(tosprite<8) tosprite-=tosprite*3>>2;
+
      X6502_Run(tosprite);
      PPU[2]|=0x40;
      X6502_Run(256-tosprite);
@@ -1356,7 +1367,7 @@ update:
 
   if(Exit)
   {
-   CloseGame();
+   //CloseGame();
    break;
   }