diff --git a/desmume/src/saves.cpp b/desmume/src/saves.cpp index 851110d40..dac31a6d2 100644 --- a/desmume/src/saves.cpp +++ b/desmume/src/saves.cpp @@ -964,3 +964,60 @@ bool savestate_load(const char *file_name) return savestate_load(&f); } + +static std::vector> rewindbuffer; + +int rewindstates = 16; +int rewindinterval = 4; + +void rewindsave () { + + if(currFrameCounter % rewindinterval) + return; + + printf("rewindsave"); printf("%d%s", currFrameCounter, "\n"); + + memorystream ms; + + if(!savestate_save(&ms, 0)) + return; + + ms.flush(); + + std::vector v(ms.buf(), ms.buf() + ms.size()); + + //clip the header + v.erase(v.begin(),v.begin()+32); + + rewindbuffer.push_back(v); + + if(rewindbuffer.size() > rewindstates) rewindbuffer.erase(rewindbuffer.begin()); +} + +void dorewind() +{ + + if(currFrameCounter % rewindinterval) + return; + + printf("rewind\n"); + + nds.debugConsole = FALSE; + + int size = rewindbuffer.size(); + + if(size < 1) { + printf("rewind buffer empty\n"); + return; + } + + printf("%d", size); + + memorystream mstemp(&rewindbuffer.at(size-1)); + + ReadStateChunks(&mstemp,(s32)mstemp.size()); + loadstate(); + + rewindbuffer.pop_back(); + +} \ No newline at end of file diff --git a/desmume/src/windows/hotkey.cpp b/desmume/src/windows/hotkey.cpp index 971bd5e1d..f198a834b 100644 --- a/desmume/src/windows/hotkey.cpp +++ b/desmume/src/windows/hotkey.cpp @@ -222,6 +222,12 @@ void HK_PlayMovie(int) } } +bool rewinding = false; + +void HK_RewindKeyDown(int) {rewinding = true;} + +void HK_RewindKeyUp(int){rewinding = false;} + void HK_RecordMovie(int) { if (romloaded) @@ -568,6 +574,13 @@ void InitCustomKeys (SCustomKeys *keys) keys->TurboStart.page = HOTKEY_PAGE_TURBO; keys->TurboStart.key = NULL; + keys->Rewind.handleKeyDown = HK_RewindKeyDown; + keys->Rewind.handleKeyUp = HK_RewindKeyUp; + keys->Rewind.code = "Rewind"; + keys->Rewind.name = L"Rewind"; + keys->Rewind.page = HOTKEY_PAGE_MOVIE; + keys->Rewind.key = NULL; + keys->NextSaveSlot.handleKeyDown = HK_NextSaveSlot; keys->NextSaveSlot.code = "NextSaveSlot"; keys->NextSaveSlot.name = L"Next Save Slot"; diff --git a/desmume/src/windows/hotkey.h b/desmume/src/windows/hotkey.h index 1b4a836fc..490c91bc6 100644 --- a/desmume/src/windows/hotkey.h +++ b/desmume/src/windows/hotkey.h @@ -80,6 +80,8 @@ struct SCustomKeys SCustomKey RecordWAV, RecordAVI; + SCustomKey Rewind; + SCustomKey ToggleFrameCounter; SCustomKey ToggleFPS; SCustomKey ToggleInput; diff --git a/desmume/src/windows/main.cpp b/desmume/src/windows/main.cpp index a2586f7f7..2ed92cf58 100644 --- a/desmume/src/windows/main.cpp +++ b/desmume/src/windows/main.cpp @@ -262,6 +262,7 @@ int autoframeskipenab=0; int frameskiprate=0; int emu_paused = 0; bool frameAdvance = false; +bool staterewindingenabled = false; bool HudEditorMode = false; bool UseMicSample = false; @@ -969,6 +970,18 @@ DWORD WINAPI run() } DRV_AviVideoUpdate((u16*)GPU_screen); + extern void rewindsave(); + extern bool rewinding; + extern void dorewind(); + + if (staterewindingenabled) { + + if(rewinding) + dorewind(); + else + rewindsave(); + } + CallRegisteredLuaFunctions(LUACALL_AFTEREMULATION); static int fps3d = 0; @@ -2570,6 +2583,8 @@ LRESULT CALLBACK WindowProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM MainWindow->checkMenu(IDM_RENDER_SCANLINE, MF_BYCOMMAND | video.currentfilter == video.SCANLINE ? MF_CHECKED:MF_UNCHECKED); MainWindow->checkMenu(IDM_RENDER_BILINEAR, MF_BYCOMMAND | video.currentfilter == video.BILINEAR ? MF_CHECKED:MF_UNCHECKED); + MainWindow->checkMenu(IDC_STATEREWINDING, MF_BYCOMMAND | staterewindingenabled == 1 ? MF_CHECKED:MF_UNCHECKED); + //Language selection MainWindow->checkMenu(IDC_BACKGROUNDPAUSE, MF_BYCOMMAND | ((lostFocusPause)?MF_CHECKED:MF_UNCHECKED)); @@ -2896,6 +2911,9 @@ LRESULT CALLBACK WindowProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM else WavRecordTo(); break; + case IDC_STATEREWINDING: + if(staterewindingenabled) staterewindingenabled = false; + else staterewindingenabled = true; case IDM_RENDER_NORMAL: video.setfilter(video.NONE); FilterUpdate(hwnd); diff --git a/desmume/src/windows/resource.h b/desmume/src/windows/resource.h index c07db3a3f..c08994851 100644 --- a/desmume/src/windows/resource.h +++ b/desmume/src/windows/resource.h @@ -137,6 +137,7 @@ #define IDC_LUAPATHEDIT 364 #define IDC_BROWSELUA 365 #define IDD_PATHSETTINGS 366 +#define IDC_STATEREWINDING 367 #define IDC_DES_BOX 402 #define IDC_R0 403 #define IDC_R1 404 diff --git a/desmume/src/windows/resources.rc b/desmume/src/windows/resources.rc index 33e8afc4b..579d1e946 100644 Binary files a/desmume/src/windows/resources.rc and b/desmume/src/windows/resources.rc differ