2015-07-01 23:17:14 -04:00
# include "stdafx.h"
# include "SaveStateManager.h"
# include "MessageManager.h"
# include "Console.h"
# include "../Utilities/FolderUtilities.h"
2016-01-16 09:25:34 -05:00
# include "EmulationSettings.h"
2015-07-01 23:17:14 -04:00
2015-07-11 08:27:22 -04:00
string SaveStateManager : : GetStateFilepath ( int stateIndex )
2015-07-01 23:17:14 -04:00
{
2015-07-11 08:27:22 -04:00
string folder = FolderUtilities : : GetSaveStateFolder ( ) ;
string filename = FolderUtilities : : GetFilename ( Console : : GetROMPath ( ) , false ) + " _ " + std : : to_string ( stateIndex ) + " .mst " ;
2015-07-01 23:17:14 -04:00
return FolderUtilities : : CombinePath ( folder , filename ) ;
}
uint64_t SaveStateManager : : GetStateInfo ( int stateIndex )
{
2015-07-11 08:27:22 -04:00
string filepath = SaveStateManager : : GetStateFilepath ( stateIndex ) ;
2015-07-01 23:17:14 -04:00
ifstream file ( filepath , ios : : in | ios : : binary ) ;
if ( file ) {
file . close ( ) ;
return FolderUtilities : : GetFileModificationTime ( filepath ) ;
}
return 0 ;
}
void SaveStateManager : : SaveState ( int stateIndex )
{
2015-07-11 08:27:22 -04:00
string filepath = SaveStateManager : : GetStateFilepath ( stateIndex ) ;
2015-07-01 23:17:14 -04:00
ofstream file ( filepath , ios : : out | ios : : binary ) ;
if ( file ) {
Console : : Pause ( ) ;
2016-01-16 09:25:34 -05:00
uint32_t emuVersion = EmulationSettings : : GetMesenVersion ( ) ;
file . write ( " MST " , 3 ) ;
file . write ( ( char * ) & emuVersion , sizeof ( emuVersion ) ) ;
file . write ( ( char * ) & SaveStateManager : : FileFormatVersion , sizeof ( uint32_t ) ) ;
2015-07-01 23:17:14 -04:00
Console : : SaveState ( file ) ;
Console : : Resume ( ) ;
file . close ( ) ;
2016-02-07 20:07:19 -05:00
MessageManager : : DisplayMessage ( " Save States " , " State # " + std : : to_string ( stateIndex ) + " saved. " ) ;
2015-07-01 23:17:14 -04:00
}
}
bool SaveStateManager : : LoadState ( int stateIndex )
{
2015-07-11 08:27:22 -04:00
string filepath = SaveStateManager : : GetStateFilepath ( stateIndex ) ;
2015-07-01 23:17:14 -04:00
ifstream file ( filepath , ios : : in | ios : : binary ) ;
2016-01-16 09:25:34 -05:00
bool result = false ;
2015-07-01 23:17:14 -04:00
if ( file ) {
2016-01-16 09:25:34 -05:00
char header [ 3 ] ;
file . read ( header , 3 ) ;
if ( memcmp ( header , " MST " , 3 ) = = 0 ) {
uint32_t emuVersion , fileFormatVersion ;
2016-02-07 20:07:19 -05:00
2016-02-14 18:36:08 -05:00
file . read ( ( char * ) & emuVersion , sizeof ( emuVersion ) ) ;
2016-02-07 20:07:19 -05:00
if ( emuVersion > EmulationSettings : : GetMesenVersion ( ) ) {
2016-02-14 18:36:08 -05:00
MessageManager : : DisplayMessage ( " Save States " , " Cannot load save states created by a more recent version of Mesen. Please download the latest version. " ) ;
return false ;
2016-02-07 20:07:19 -05:00
}
2016-01-16 09:25:34 -05:00
file . read ( ( char * ) & fileFormatVersion , sizeof ( fileFormatVersion ) ) ;
2016-02-14 18:36:08 -05:00
if ( fileFormatVersion ! = SaveStateManager : : FileFormatVersion ) {
MessageManager : : DisplayMessage ( " Save States " , " State # " + std : : to_string ( stateIndex ) + " is incompatible with this version of Mesen. " ) ;
return false ;
2016-01-16 09:25:34 -05:00
}
2016-02-14 18:36:08 -05:00
Console : : Pause ( ) ;
2016-01-16 09:25:34 -05:00
Console : : LoadState ( file ) ;
Console : : Resume ( ) ;
2016-02-07 20:07:19 -05:00
MessageManager : : DisplayMessage ( " Save States " , " State # " + std : : to_string ( stateIndex ) + " loaded. " ) ;
2016-01-16 09:25:34 -05:00
result = true ;
2016-02-07 20:07:19 -05:00
} else {
MessageManager : : DisplayMessage ( " Save States " , " Invalid save state file. " ) ;
2016-01-16 09:25:34 -05:00
}
2015-07-01 23:17:14 -04:00
file . close ( ) ;
2016-01-16 09:25:34 -05:00
}
if ( ! result ) {
2016-02-07 20:07:19 -05:00
MessageManager : : DisplayMessage ( " Save States " , " Slot is empty. " ) ;
2015-07-01 23:17:14 -04:00
}
2016-01-16 09:25:34 -05:00
return result ;
2015-07-01 23:17:14 -04:00
}