diff -aHudr 2/Cheats.cpp 1/Cheats.cpp --- 2/Cheats.cpp 2006-06-22 00:56:28.000000000 +0300 +++ 1/Cheats.cpp 2006-06-22 00:55:53.000000000 +0300 @@ -231,6 +231,20 @@ int cheatsCheckKeys(u32 keys, u32 extended) { +#if 1 /* SONIC */ + extern int SonicCamHack; + if(SonicCamHack) + { + // better sonic cam + signed short offX = CPUReadHalfWord(0x03005B96); + signed short offY = CPUReadHalfWord(0x03005B98); + signed short camX = CPUReadHalfWord(0x030059D0); + signed short camY = CPUReadHalfWord(0x030059D2); + CPUWriteHalfWord(0x030059D0, camX+offX-128); + CPUWriteHalfWord(0x030059D2, camY+offY-80); + } +#endif + int ticks = 0; for(int i = 0; i < cheatsNumber; i++) { if(!cheatsList[i].enabled) { diff -aHudr 2/GBA.cpp 1/GBA.cpp --- 2/GBA.cpp 2006-06-22 00:56:35.000000000 +0300 +++ 1/GBA.cpp 2006-06-22 00:55:58.000000000 +0300 @@ -3829,7 +3829,9 @@ u32 ext = (joy >> 10); int cheatTicks = 0; +#if 0 /* SONIC */ if(cheatsEnabled) +#endif cheatsCheckKeys(P1^0x3FF, ext); cpuDmaTicksToUpdate += cheatTicks; speedup = (ext & 1) ? true : false; diff -aHudr 2/movie.cpp 1/movie.cpp --- 2/movie.cpp 2006-06-22 00:56:56.000000000 +0300 +++ 1/movie.cpp 2006-06-22 00:55:48.000000000 +0300 @@ -923,6 +923,9 @@ } +int MovieScreenDisplayEnabled = 1; +int SonicCamHack = 0; + void VBAMovieUpdate (int controllerNum) { if(skipUpdate) @@ -934,6 +937,48 @@ { case MOVIE_STATE_PLAY: { +#if 1 /* SONIC */ + /* + * action, frame--> state number + * + * nccccC + * nccccC + * + * n=normal emulation, c=cheat, C=rendered cheat + * + */ + + + static int state = -5; + char SaveBuf[400000 * 3]; + switch(state++) + { + case 6: + theEmulator.emuReadMemState(SaveBuf, sizeof SaveBuf); + state=1; + case 0: + { + MovieScreenDisplayEnabled = 0; + SonicCamHack = 0; + cheatsCheckKeys(0,0); + break; + } + case 1: + { + theEmulator.emuWriteMemState(SaveBuf, sizeof SaveBuf); + MovieScreenDisplayEnabled = 0; + SonicCamHack = 1; + cheatsCheckKeys(0,0); + break; + } + case 2: case 3: case 4: break; + case 5: + { + MovieScreenDisplayEnabled = 1; + break; + } + } +#endif if((Movie.header.controllerFlags & MOVIE_CONTROLLER(controllerNum)) == 0) break; // not a controller we're recognizing diff -aHudr 2/sdl/SDL.cpp 1/sdl/SDL.cpp --- 2/sdl/SDL.cpp 2006-06-22 00:57:09.000000000 +0300 +++ 1/sdl/SDL.cpp 2006-06-22 00:56:04.000000000 +0300 @@ -2668,6 +2668,9 @@ return; } + extern int MovieScreenDisplayEnabled; + if(!MovieScreenDisplayEnabled) return; + SDL_LockSurface(surface); for(int slot = 0 ; slot < 8 ; slot++) @@ -2997,6 +3000,9 @@ void systemWriteDataToSoundBuffer() { + extern int MovieScreenDisplayEnabled; + if(!MovieScreenDisplayEnabled) return; + if(LoggingEnabled==2) { AudioLog((char*)soundFinalWave, soundBufferLen);