Add Savestate Undo to the win32 ui, shift-f8 (up to 10 levels of undo for each slot!)

This commit is contained in:
dinkc64 2014-05-18 17:10:09 +00:00
parent 3b023cfcb4
commit da399db95d
5 changed files with 80 additions and 2 deletions

View File

@ -155,6 +155,7 @@ INT32 BurnStateLoadEmbed(FILE* fp, INT32 nOffset, INT32 bAll, INT32 (*pLoadGame)
INT32 BurnStateLoad(TCHAR* szName, INT32 bAll, INT32 (*pLoadGame)());
INT32 BurnStateSaveEmbed(FILE* fp, INT32 nOffset, INT32 bAll);
INT32 BurnStateSave(TCHAR* szName, INT32 bAll);
INT32 BurnStateUNDO(TCHAR* szName);
// statec.cpp
INT32 BurnStateCompress(UINT8** pDef, INT32* pnDefLen, INT32 bAll);

View File

@ -284,13 +284,46 @@ INT32 BurnStateSaveEmbed(FILE* fp, INT32 nOffset, INT32 bAll)
return nDefLen;
}
#define MAX_STATEBACKUPS 10
// SaveState Undo - restores the last savestate backup file. Windows-only at the moment.
INT32 BurnStateUNDO(TCHAR* szName)
{
#ifdef _WIN32
/*
Savestate Undo
derp.fs.backup0 -> derp.fs
derp.fs.backup1 -> derp.fs.backup0
derp.fs.backup2 -> derpfs.backup1
derp.fs.backup3 -> derpfs.backup2
*/
for (INT32 i = 0; i <= MAX_STATEBACKUPS; i++) {
TCHAR szBackupNameTo[1024] = _T("");
TCHAR szBackupNameFrom[1024] = _T("");
if (i == 0) {
_stprintf(szBackupNameTo, _T("%s.UNDO"), szName);// game.fs -> game.fs.UNDO
DeleteFileW(szBackupNameTo);
MoveFileW(szName, szBackupNameTo);
_stprintf(szBackupNameTo, _T("%s"), szName);// game.fs
} else {
_stprintf(szBackupNameTo, _T("%s.backup%d"), szName, i - 1); //game.fs.backup0
}
_stprintf(szBackupNameFrom, _T("%s.backup%d"), szName, i); //game.fs.backup1
//bprintf(0, _T("%s -> %s\n"), szBackupNameFrom, szBackupNameTo);
MoveFileW(szBackupNameFrom, szBackupNameTo);
}
#endif
return 0;
}
// State save
INT32 BurnStateSave(TCHAR* szName, INT32 bAll)
{
const char szHeader[] = "FB1 "; // File identifier
INT32 nLen = 0, nVer = 0;
INT32 nRet = 0;
TCHAR szBackupName[1024] = _T("");
if (bAll) { // Get amount of data
StateInfo(&nLen, &nVer, 1);
@ -299,13 +332,40 @@ INT32 BurnStateSave(TCHAR* szName, INT32 bAll)
}
if (nLen <= 0) { // No data, so exit without creating a savestate
return 0; // Don't return an error code
}
}
/*
Save State backups - used in conjunction with BurnStateUNDO();
derp.fs -> derp.fs.backup
derp.fs.backup -> derp.fs.backup1
derp.fs.backup1 -> derpfs.backup2
derp.fs.backup3 -> derpfs.backup4
*/
#ifdef _WIN32
for (INT32 i=MAX_STATEBACKUPS;i>=0;i--) {
TCHAR szBackupNameTo[1024] = _T("");
TCHAR szBackupNameFrom[1024] = _T("");
_stprintf(szBackupNameTo, _T("%s.backup%d"), szName, i + 1);
_stprintf(szBackupNameFrom, _T("%s.backup%d"), szName, i);
if (i == MAX_STATEBACKUPS) {
DeleteFileW(szBackupNameFrom); // make sure there is only MAX_STATEBACKUPS :)
} else {
MoveFileW(szBackupNameFrom, szBackupNameTo); //derp.fs.backup0 -> derp.fs.backup1
if (i == 0) {
MoveFileW(szName, szBackupNameFrom); //derp.fs -> derp.fs.backup0
}
}
}
/* - old method, only 1 savestate backup -
TCHAR szBackupName[1024] = _T("");
// backup last savestate just incase - dink
_stprintf(szBackupName, _T("%s.backup"), szName);
DeleteFileW(szBackupName);
MoveFileW(szName, szBackupName);
*/
#endif
FILE* fp = _tfopen(szName, _T("wb"));
if (fp == NULL) {
return 1;

View File

@ -373,6 +373,7 @@ int InpcCreate();
extern int bDrvSaveAll;
int StatedAuto(int bSave);
int StatedLoad(int nSlot);
void StatedUNDO(int nSlot);
int StatedSave(int nSlot);
// numdial.cpp

View File

@ -483,7 +483,15 @@ int RunMessageLoop()
}
break;
}
case VK_F8: {
if (bDrvOkay && (GetAsyncKeyState(VK_SHIFT) & 0x80000000)) {
TCHAR szString[256] = _T("state undo");
StatedUNDO(nSavestateSlot);
VidSNewShortMsg(szString);
}
break;
}
case VK_BACK: {
bShowFPS = !bShowFPS;
if (bShowFPS) {

View File

@ -45,6 +45,14 @@ static void CreateStateName(int nSlot)
_stprintf(szChoice, _T("./savestates/%s slot %02x.fs"), BurnDrvGetText(DRV_NAME), nSlot);
}
void StatedUNDO(int nSlot)
{
if (nSlot) {
CreateStateName(nSlot);
BurnStateUNDO(szChoice);
}
}
int StatedLoad(int nSlot)
{
TCHAR szFilter[1024];