smb3 and addams family hacks
[fceu.git] / fce.c
diff --git a/fce.c b/fce.c
index d83c5f5..5ad965d 100644 (file)
--- a/fce.c
+++ b/fce.c
@@ -977,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
  {
@@ -1080,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,6 +1093,7 @@ FCEUGI *FCEUI_LoadGame(char *name)
         int fp;
 
         //Exit=1;
+       LoadGameLastError = 0;
         ResetGameLoaded();
 
        strncpy(name2, name, sizeof(name2));
@@ -1101,6 +1103,7 @@ FCEUGI *FCEUI_LoadGame(char *name)
        if(!fp)
         {
         FCEU_PrintError("Error opening \"%s\"!",name);
+        LoadGameLastError = 1;
         return 0;
        }
 
@@ -1117,14 +1120,13 @@ FCEUGI *FCEUI_LoadGame(char *name)
          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;
@@ -1137,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:
@@ -1164,6 +1168,9 @@ FCEUGI *FCEUI_LoadGame(char *name)
 
        if (have_movie)
                FCEUI_LoadMovie(name, 1);
+
+       strcpy(lastLoadedGameName, name2);
+
         return(&FCEUGameInfo);
 }
 
@@ -1214,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);