snes9xgx/source/freeze.cpp

165 lines
3.2 KiB
C++
Raw Normal View History

/****************************************************************************
2010-01-27 23:20:37 +01:00
* Snes9x Nintendo Wii/Gamecube Port
2008-08-14 00:44:59 +02:00
*
* softdev July 2006
* crunchy2 May 2007-July 2007
2008-11-12 08:50:39 +01:00
* Michniewski 2008
2018-12-27 00:10:12 +01:00
* Tantric 2008-2019
2008-08-14 00:44:59 +02:00
*
* freeze.cpp
***************************************************************************/
2009-02-07 04:01:10 +01:00
#include <malloc.h>
#include <gccore.h>
#include <stdio.h>
2009-03-11 18:28:37 +01:00
2010-03-22 00:43:54 +01:00
#include "snes9xgx.h"
2008-12-18 19:36:30 +01:00
#include "fileop.h"
2009-03-11 18:28:37 +01:00
#include "filebrowser.h"
#include "menu.h"
#include "video.h"
2010-03-22 00:43:54 +01:00
#include "utils/pngu.h"
#include "snes9x/snes9x.h"
#include "snes9x/port.h"
#include "snes9x/memmap.h"
#include "snes9x/snapshot.h"
#include "snes9x/language.h"
2010-01-27 23:08:56 +01:00
bool8 S9xOpenSnapshotFile(const char *filepath, bool8 readonly, STREAM *file)
2009-11-30 09:14:38 +01:00
{
2010-01-27 23:08:56 +01:00
return FALSE;
}
2010-01-27 23:08:56 +01:00
void S9xCloseSnapshotFile(STREAM s)
2009-11-30 09:14:38 +01:00
{
}
/****************************************************************************
* SaveSnapshot
***************************************************************************/
2010-01-27 23:08:56 +01:00
int
2009-11-25 07:35:14 +01:00
SaveSnapshot (char * filepath, bool silent)
{
2009-10-02 00:35:12 +02:00
int device;
2009-10-02 00:35:12 +02:00
if(!FindDevice(filepath, &device))
2008-11-12 08:50:39 +01:00
return 0;
// save screenshot
if(gameScreenPngSize > 0)
{
char screenpath[1024];
2011-03-20 18:17:51 +01:00
strcpy(screenpath, filepath);
screenpath[strlen(screenpath)-4] = 0;
sprintf(screenpath, "%s.png", screenpath);
SaveFile((char *)gameScreenPng, screenpath, gameScreenPngSize, silent);
}
2010-01-27 23:08:56 +01:00
STREAM fp = OPEN_STREAM(filepath, "wb");
if(!fp)
{
2009-11-25 07:35:14 +01:00
if(!silent)
2010-01-27 23:08:56 +01:00
ErrorPrompt("Save failed!");
return 0;
}
2010-01-27 23:08:56 +01:00
S9xFreezeToStream(fp);
CLOSE_STREAM(fp);
if(!silent)
InfoPrompt("Save successful");
return 1;
}
2009-03-11 18:28:37 +01:00
int
2009-11-25 07:35:14 +01:00
SaveSnapshotAuto (bool silent)
2009-03-11 18:28:37 +01:00
{
char filepath[1024];
2009-10-02 00:35:12 +02:00
if(!MakeFilePath(filepath, FILE_SNAPSHOT, Memory.ROMFilename, 0))
2009-03-20 09:26:10 +01:00
return false;
2009-11-25 07:35:14 +01:00
return SaveSnapshot(filepath, silent);
2009-03-11 18:28:37 +01:00
}
/****************************************************************************
2009-11-25 07:35:14 +01:00
* LoadSnapshot
***************************************************************************/
int
2009-11-25 07:35:14 +01:00
LoadSnapshot (char * filepath, bool silent)
{
2009-10-02 00:35:12 +02:00
int device;
if(!FindDevice(filepath, &device))
2009-03-11 18:28:37 +01:00
return 0;
2010-01-27 23:08:56 +01:00
STREAM fp = OPEN_STREAM(filepath, "rb");
2010-01-27 23:08:56 +01:00
if(!fp)
2008-11-12 08:50:39 +01:00
{
2010-01-27 23:08:56 +01:00
if(!silent)
ErrorPrompt("Unable to open state!");
2010-01-27 23:08:56 +01:00
return 0;
2009-11-25 07:35:14 +01:00
}
2010-01-27 23:08:56 +01:00
int result = S9xUnfreezeFromStream(fp);
CLOSE_STREAM(fp);
if (result == SUCCESS)
return 1;
switch (result)
2008-08-12 05:25:16 +02:00
{
2010-01-27 23:08:56 +01:00
case WRONG_FORMAT:
ErrorPrompt(SAVE_ERR_WRONG_FORMAT);
break;
case WRONG_VERSION:
ErrorPrompt(SAVE_ERR_WRONG_VERSION);
break;
case SNAPSHOT_INCONSISTENT:
ErrorPrompt(MOVIE_ERR_SNAPSHOT_INCONSISTENT);
break;
2008-08-12 05:25:16 +02:00
}
2010-01-27 23:08:56 +01:00
return 0;
}
2009-03-11 18:28:37 +01:00
int
2009-11-25 07:35:14 +01:00
LoadSnapshotAuto (bool silent)
2009-03-11 18:28:37 +01:00
{
char filepath[1024];
2009-10-02 00:35:12 +02:00
if(!MakeFilePath(filepath, FILE_SNAPSHOT, Memory.ROMFilename, 0))
2009-03-16 07:58:50 +01:00
return false;
2009-03-11 18:28:37 +01:00
2009-11-25 07:35:14 +01:00
return LoadSnapshot(filepath, silent);
2009-03-11 18:28:37 +01:00
}
/****************************************************************************
* SavePreview
***************************************************************************/
2016-12-09 01:51:57 +01:00
int SavePreviewImg (char * filepath, bool silent)
{
int device;
if(!FindDevice(filepath, &device))
return 0;
// save screenshot
if(gameScreenPngSize > 0)
{
char screenpath[1024];
strcpy(screenpath, filepath);
screenpath[strlen(screenpath)] = 0;
sprintf(screenpath, "%s.png", screenpath);
SaveFile((char *)gameScreenPng, screenpath, gameScreenPngSize, silent);
}
return 1;
}