savestate undo 2.0rc1: error message if undo fails (nothing to be undone) & fixed/oops: dont undo the last savestate

This commit is contained in:
dinkc64 2014-08-08 05:44:28 +00:00
parent a1f2f7634f
commit aaf17df733
4 changed files with 35 additions and 16 deletions

View File

@ -284,6 +284,15 @@ INT32 BurnStateSaveEmbed(FILE* fp, INT32 nOffset, INT32 bAll)
return nDefLen;
}
#ifdef _WIN32
int FileExists(const TCHAR *fileName)
{
DWORD dwAttrib = GetFileAttributes(fileName);
return (dwAttrib != INVALID_FILE_ATTRIBUTES &&
!(dwAttrib & FILE_ATTRIBUTE_DIRECTORY));
}
#endif
#define MAX_STATEBACKUPS 10
// SaveState Undo - restores the last savestate backup file. Windows-only at the moment.
INT32 BurnStateUNDO(TCHAR* szName)
@ -296,26 +305,33 @@ INT32 BurnStateUNDO(TCHAR* szName)
derp.fs.backup2 -> derpfs.backup1
derp.fs.backup3 -> derpfs.backup2
*/
INT32 cantundo = 0;
for (INT32 i = 0; i <= MAX_STATEBACKUPS; i++) {
TCHAR szBackupNameTo[1024] = _T("");
TCHAR szBackupNameFrom[1024] = _T("");
TCHAR szBackupNamePrev[1024] = _T("");
if (i == 0) {
_stprintf(szBackupNameTo, _T("%s.UNDO"), szName);// game.fs -> game.fs.UNDO
DeleteFileW(szBackupNameTo);
MoveFileW(szName, szBackupNameTo);
_stprintf(szBackupNamePrev, _T("%s.backup0"), szName);
if (FileExists(szName) && FileExists(szBackupNamePrev)) {
DeleteFileW(szBackupNameTo);
MoveFileW(szName, szBackupNameTo);
} else {
cantundo = 1;
}
_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);
//bprintf(0, _T("%d: %s -> %s\n"), i, szBackupNameFrom, szBackupNameTo);
MoveFileW(szBackupNameFrom, szBackupNameTo);
}
#endif
return 0;
return cantundo;
}
// State save

View File

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

View File

@ -1080,16 +1080,18 @@ static void OnCommand(HWND /*hDlg*/, int id, HWND /*hwndCtl*/, UINT codeNotify)
PausedRedraw();
break;
}
case MENU_STATE_UNDO: {
case MENU_STATE_UNDO:
if (bDrvOkay) {
TCHAR szString[256] = _T("state undo");
StatedUNDO(nSavestateSlot);
VidSNewShortMsg(szString);
PausedRedraw();
TCHAR szStringFailed[256] = _T("state: nothing to undo");
if (!StatedUNDO(nSavestateSlot)) {
VidSNewShortMsg(szString);
} else {
VidSNewShortMsg(szStringFailed);
}
break;
PausedRedraw();
}
break;
case MENU_STATE_LOAD_SLOT:
if (bDrvOkay && !kNetGame) {
if (StatedLoad(nSavestateSlot) == 0) {

View File

@ -45,12 +45,13 @@ static void CreateStateName(int nSlot)
_stprintf(szChoice, _T("./savestates/%s slot %02x.fs"), BurnDrvGetText(DRV_NAME), nSlot);
}
void StatedUNDO(int nSlot)
int StatedUNDO(int nSlot)
{
if (nSlot) {
CreateStateName(nSlot);
BurnStateUNDO(szChoice);
}
if (nSlot) {
CreateStateName(nSlot);
return BurnStateUNDO(szChoice);
}
return 1;
}
int StatedLoad(int nSlot)