More undo savestate fixes. Win32 - Undo/Redo savestate menu item added.
This commit is contained in:
parent
0a29e1bce3
commit
40926ab5f7
|
@ -68,7 +68,8 @@ void FCEUD_LoadStateFrom()
|
||||||
|
|
||||||
bool CheckBackupSaveStateExist()
|
bool CheckBackupSaveStateExist()
|
||||||
{
|
{
|
||||||
//This function simply checks to see if the backup savestate of the appropriate filename exists
|
//This function simply checks to see if the backup loadstate exists, the backup loadstate is a special savestate
|
||||||
|
//That is made before loading any state, so that the user never loses his data
|
||||||
string filename = GetBackupFileName(); //Get backup savestate filename
|
string filename = GetBackupFileName(); //Get backup savestate filename
|
||||||
|
|
||||||
//Check if this filename exists
|
//Check if this filename exists
|
||||||
|
|
|
@ -94,7 +94,10 @@ void ShowNetplayConsole(void); //mbg merge 7/17/06 YECH had to add
|
||||||
void MapInput(void);
|
void MapInput(void);
|
||||||
extern BOOL CALLBACK ReplayMetadataDialogProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam); //Metadata dialog
|
extern BOOL CALLBACK ReplayMetadataDialogProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam); //Metadata dialog
|
||||||
extern bool CheckFileExists(const char* filename); //Receives a filename (fullpath) and checks to see if that file exists
|
extern bool CheckFileExists(const char* filename); //Receives a filename (fullpath) and checks to see if that file exists
|
||||||
extern void SwapSaveState();
|
//From src/state.cpp
|
||||||
|
extern bool undoSS; //Decides if undo savestate is eligible
|
||||||
|
extern bool redoSS; //Decides if it should be called redo instead of undo
|
||||||
|
extern void SwapSaveState(); //Performs the undo/redo operation
|
||||||
|
|
||||||
//AutoFire-----------------------------------------------
|
//AutoFire-----------------------------------------------
|
||||||
void SetAutoFirePattern(int onframes, int offframes);
|
void SetAutoFirePattern(int onframes, int offframes);
|
||||||
|
@ -115,6 +118,10 @@ int MainWindow_wndx, MainWindow_wndy;
|
||||||
static uint32 mousex,mousey,mouseb;
|
static uint32 mousex,mousey,mouseb;
|
||||||
static int vchanged = 0;
|
static int vchanged = 0;
|
||||||
|
|
||||||
|
//Function Declarations
|
||||||
|
void ChangeMenuItemText(int menuitem, string text); //Alters a menu item name
|
||||||
|
void ChangeContextMenuItemText(int menuitem, string text, HMENU menu); //Alters a context menu item name
|
||||||
|
|
||||||
//Recent Menu Strings ------------------------------------
|
//Recent Menu Strings ------------------------------------
|
||||||
char *recent_files[] = { 0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 };
|
char *recent_files[] = { 0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 };
|
||||||
const unsigned int MENU_FIRST_RECENT_FILE = 600;
|
const unsigned int MENU_FIRST_RECENT_FILE = 600;
|
||||||
|
@ -412,7 +419,24 @@ void UpdateCheckedMenuItems()
|
||||||
void UpdateContextMenuItems(HMENU context, int whichContext)
|
void UpdateContextMenuItems(HMENU context, int whichContext)
|
||||||
{
|
{
|
||||||
bool exist;
|
bool exist;
|
||||||
|
string redoSavestate = "Redo savestate";
|
||||||
|
string undoSavestate = "Undo savestate";
|
||||||
|
|
||||||
|
//Undo Loadstate
|
||||||
|
exist = CheckBackupSaveStateExist();
|
||||||
|
EnableMenuItem(context,FCEUX_CONTEXT_UNDOLOADSTATE,MF_BYCOMMAND | exist ? MF_ENABLED : MF_GRAYED);
|
||||||
|
|
||||||
|
//Undo Savestate
|
||||||
|
if (undoSS || redoSS) //If undo or redo, enable Undo savestate, else keep it gray
|
||||||
|
EnableMenuItem(context,FCEUX_CONTEXT_UNDOSAVESTATE,MF_BYCOMMAND | MF_ENABLED);
|
||||||
|
else
|
||||||
|
EnableMenuItem(context,FCEUX_CONTEXT_UNDOSAVESTATE,MF_BYCOMMAND | MF_GRAYED);
|
||||||
|
if (redoSS)
|
||||||
|
ChangeContextMenuItemText(FCEUX_CONTEXT_UNDOSAVESTATE, redoSavestate, context);
|
||||||
|
else
|
||||||
|
ChangeContextMenuItemText(FCEUX_CONTEXT_UNDOSAVESTATE, undoSavestate, context);
|
||||||
|
|
||||||
|
//Case specific menu item handling
|
||||||
switch(whichContext)
|
switch(whichContext)
|
||||||
{
|
{
|
||||||
//0 = Game + Movie in read only
|
//0 = Game + Movie in read only
|
||||||
|
@ -420,16 +444,12 @@ void UpdateContextMenuItems(HMENU context, int whichContext)
|
||||||
break;
|
break;
|
||||||
//1 = Game + No Movie
|
//1 = Game + No Movie
|
||||||
case 1:
|
case 1:
|
||||||
exist = CheckBackupSaveStateExist();
|
|
||||||
EnableMenuItem(context,FCEUX_CONTEXT_UNDOLOADSTATE,MF_BYCOMMAND | exist ? MF_ENABLED : MF_GRAYED);
|
|
||||||
break;
|
break;
|
||||||
//2 = No Game
|
//2 = No Game
|
||||||
case 2:
|
case 2:
|
||||||
break;
|
break;
|
||||||
//3 = Game + Movie in read + write
|
//3 = Game + Movie in read + write
|
||||||
case 3:
|
case 3:
|
||||||
exist = CheckBackupSaveStateExist();
|
|
||||||
EnableMenuItem(context,FCEUX_CONTEXT_UNDOLOADSTATE,MF_BYCOMMAND | exist ? MF_ENABLED : MF_GRAYED);
|
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
|
@ -790,7 +810,7 @@ LRESULT FAR PASCAL AppWndProc(HWND hWnd,UINT msg,WPARAM wParam,LPARAM lParam)
|
||||||
hfceuxcontextsub = GetSubMenu(hfceuxcontext,2);
|
hfceuxcontextsub = GetSubMenu(hfceuxcontext,2);
|
||||||
whichContext = 2;
|
whichContext = 2;
|
||||||
}
|
}
|
||||||
UpdateContextMenuItems(hfceuxcontextsub, whichContext);
|
UpdateContextMenuItems(hfceuxcontextsub, whichContext);
|
||||||
TrackPopupMenu(hfceuxcontextsub,0,(MainWindow_wndx+mousex),(MainWindow_wndy+mousey),TPM_RIGHTBUTTON,hWnd,0);
|
TrackPopupMenu(hfceuxcontextsub,0,(MainWindow_wndx+mousex),(MainWindow_wndy+mousey),TPM_RIGHTBUTTON,hWnd,0);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -1830,6 +1850,17 @@ void FCEUD_LuaRunFrom(void)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void ChangeContextMenuItemText(int menuitem, string text, HMENU menu)
|
||||||
|
{
|
||||||
|
MENUITEMINFO moo;
|
||||||
|
moo.cbSize = sizeof(moo);
|
||||||
|
moo.fMask = MIIM_TYPE;
|
||||||
|
moo.cch = NULL;
|
||||||
|
GetMenuItemInfo(menu, menuitem, FALSE, &moo);
|
||||||
|
moo.dwTypeData = (LPSTR)text.c_str();
|
||||||
|
SetMenuItemInfo(menu, menuitem, FALSE, &moo);
|
||||||
|
}
|
||||||
|
|
||||||
void ChangeMenuItemText(int menuitem, string text)
|
void ChangeMenuItemText(int menuitem, string text)
|
||||||
{
|
{
|
||||||
MENUITEMINFO moo;
|
MENUITEMINFO moo;
|
||||||
|
|
|
@ -124,6 +124,10 @@ static void CloseGame(void)
|
||||||
|
|
||||||
delete GameInfo;
|
delete GameInfo;
|
||||||
GameInfo = 0;
|
GameInfo = 0;
|
||||||
|
|
||||||
|
lastSavestateMade[0] = 0;
|
||||||
|
undoSS = false;
|
||||||
|
redoSS = false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -60,7 +60,8 @@ static int StateShow;
|
||||||
bool FCEU_state_loading_old_format;
|
bool FCEU_state_loading_old_format;
|
||||||
|
|
||||||
char lastSavestateMade[2048]; //Stores the last savestate made (needed for UndoSavestate)
|
char lastSavestateMade[2048]; //Stores the last savestate made (needed for UndoSavestate)
|
||||||
bool redoSS = false; //This will be true if UndoSaveState is run, will turn false when a new savestate is made
|
bool undoSS = false; //This will be true if there is a backup state for lastSavestateMade
|
||||||
|
bool redoSS = false; //This will be true if UndoSaveState is run, will turn false when a new savestate is made
|
||||||
|
|
||||||
#define SFMDATA_SIZE (64)
|
#define SFMDATA_SIZE (64)
|
||||||
static SFORMAT SFMDATA[SFMDATA_SIZE];
|
static SFORMAT SFMDATA[SFMDATA_SIZE];
|
||||||
|
@ -435,10 +436,10 @@ void FCEUSS_Save(const char *fname)
|
||||||
{
|
{
|
||||||
CreateBackupSaveState(fname); //Make a backup of previous savestate before overwriting it
|
CreateBackupSaveState(fname); //Make a backup of previous savestate before overwriting it
|
||||||
strcpy(lastSavestateMade,fname); //Remember what the last savestate filename was (for undoing later)
|
strcpy(lastSavestateMade,fname); //Remember what the last savestate filename was (for undoing later)
|
||||||
redoSS = true; //Backup was created so redo is possible
|
undoSS = true; //Backup was created so redo is possible
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
redoSS = false; //No backup was needed, so lastSavestateMade does not contain a file that has a backup
|
undoSS = false; //so backup made so lastSavestateMade does have a backup file, so no undo
|
||||||
|
|
||||||
st =FCEUD_UTF8_fstream(fname, "wb");
|
st =FCEUD_UTF8_fstream(fname, "wb");
|
||||||
}
|
}
|
||||||
|
@ -452,10 +453,10 @@ void FCEUSS_Save(const char *fname)
|
||||||
{
|
{
|
||||||
CreateBackupSaveState(fn); //Make a backup of previous savestate before overwriting it
|
CreateBackupSaveState(fn); //Make a backup of previous savestate before overwriting it
|
||||||
strcpy(lastSavestateMade,fn); //Remember what the last savestate filename was (for undoing later)
|
strcpy(lastSavestateMade,fn); //Remember what the last savestate filename was (for undoing later)
|
||||||
redoSS = true; //Backup was created so redo is possible
|
undoSS = true; //Backup was created so redo is possible
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
redoSS = false; //No backup was needed, so lastSavestateMade does not contain a file that has a backup
|
undoSS = false; //so backup made so lastSavestateMade does have a backup file, so no undo
|
||||||
|
|
||||||
st = FCEUD_UTF8_fstream(fn,"wb");
|
st = FCEUD_UTF8_fstream(fn,"wb");
|
||||||
free(fn);
|
free(fn);
|
||||||
|
@ -889,33 +890,12 @@ string GenerateBackupSaveStateFn(const char *fname)
|
||||||
|
|
||||||
void CreateBackupSaveState(const char *fname)
|
void CreateBackupSaveState(const char *fname)
|
||||||
{
|
{
|
||||||
string filename = GenerateBackupSaveStateFn(fname);
|
string newFilename = GenerateBackupSaveStateFn(fname); //Get backup savestate filename
|
||||||
std::fstream* st = 0;
|
if (CheckFileExists(newFilename.c_str())) //See if backup already exists
|
||||||
st = FCEUD_UTF8_fstream(filename.c_str(),"wb");
|
remove(newFilename.c_str()) ; //If so, delete it
|
||||||
|
rename(fname,newFilename.c_str()); //Rename savestate to backup filename
|
||||||
if(st == NULL)
|
undoSS = true; //There is a backup savestate file to mast last loaded, so undo is possible
|
||||||
{
|
|
||||||
FCEU_DispMessage("State %d save error.",filename.c_str());
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if(FCEUMOV_Mode(MOVIEMODE_INACTIVE))
|
|
||||||
FCEUSS_SaveMS(st,-1);
|
|
||||||
else
|
|
||||||
FCEUSS_SaveMS(st,0);
|
|
||||||
|
|
||||||
delete st;
|
|
||||||
}
|
}
|
||||||
//---------------------------------------------------------------------------------------------------------------------------------------------------
|
|
||||||
//Logic - undo available until a new savestate is made,game is closed, or fcuex is closed
|
|
||||||
|
|
||||||
//What we need is a concept of if you are undoing or redoing as well
|
|
||||||
//Undo should know there is a bak file before making a decision. the main platform code should know this before calling it.
|
|
||||||
//Once it is undone, it should know this and call it a redo if called again on the same file. It should remember as long as it knows about undo.
|
|
||||||
//The undo redo is meaningless information for this function as it simply swaps.
|
|
||||||
//perhaps a combo of flag(s) and a function to handle flag situations is called for?
|
|
||||||
//This function would then simply swap the files, which means it is both undo and redo
|
|
||||||
//And extra function needs to be in charge of flags to keep up with which one is being done, but that is purely cosmetic
|
|
||||||
|
|
||||||
void SwapSaveState()
|
void SwapSaveState()
|
||||||
{
|
{
|
||||||
|
@ -946,7 +926,13 @@ void SwapSaveState()
|
||||||
rename(backup.c_str(),temp.c_str()); //rename backup file to temp file
|
rename(backup.c_str(),temp.c_str()); //rename backup file to temp file
|
||||||
rename(lastSavestateMade,backup.c_str()); //rename current as backup
|
rename(lastSavestateMade,backup.c_str()); //rename current as backup
|
||||||
rename(temp.c_str(),lastSavestateMade); //rename backup as current
|
rename(temp.c_str(),lastSavestateMade); //rename backup as current
|
||||||
|
|
||||||
|
undoSS = true; //Just in case, if this was run, then there is definately a last savestate and backup
|
||||||
|
if (redoSS) //This was a redo function, so if run again it will be an undo again
|
||||||
|
redoSS = false;
|
||||||
|
else //This was an undo function so next will be redo, so flag it
|
||||||
|
redoSS = true;
|
||||||
|
|
||||||
FCEUI_DispMessage("%s restored",backup.c_str());
|
FCEUI_DispMessage("%s restored",backup.c_str());
|
||||||
FCEUI_printf("%s restored\n",backup.c_str());
|
FCEUI_printf("%s restored\n",backup.c_str());
|
||||||
}
|
}
|
||||||
|
|
|
@ -62,6 +62,9 @@ void AddExState(void *v, uint32 s, int type, char *desc);
|
||||||
void FCEU_DrawSaveStates(uint8 *XBuf);
|
void FCEU_DrawSaveStates(uint8 *XBuf);
|
||||||
|
|
||||||
void CreateBackupSaveState(const char *fname); //backsup a savestate before overwriting it with a new one
|
void CreateBackupSaveState(const char *fname); //backsup a savestate before overwriting it with a new one
|
||||||
void BackupLoadState(); //Makes a backup savestate before any loadstate
|
void BackupLoadState(); //Makes a backup savestate before any loadstate
|
||||||
void LoadBackup(); //Loads the backupsavestate
|
void LoadBackup(); //Loads the backupsavestate
|
||||||
void SwapSaveState(); //Swaps a savestate with its backup state
|
void SwapSaveState(); //Swaps a savestate with its backup state
|
||||||
|
extern bool undoSS; //undo savestate flag
|
||||||
|
extern bool redoSS; //redo savestate flag
|
||||||
|
extern char lastSavestateMade[2048]; //Filename of last savestate used
|
Loading…
Reference in New Issue