win32: savestate rewinding

This commit is contained in:
p989 2009-07-21 07:09:14 +00:00
parent 2228a8de13
commit 1559e84d0d
6 changed files with 91 additions and 0 deletions

View File

@ -964,3 +964,60 @@ bool savestate_load(const char *file_name)
return savestate_load(&f);
}
static std::vector<std::vector <char>> 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<char> 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();
}

View File

@ -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";

View File

@ -80,6 +80,8 @@ struct SCustomKeys
SCustomKey RecordWAV, RecordAVI;
SCustomKey Rewind;
SCustomKey ToggleFrameCounter;
SCustomKey ToggleFPS;
SCustomKey ToggleInput;

View File

@ -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);

View File

@ -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

Binary file not shown.