change extensions to fm2 (but we still claim we'll load fcm; even though it is not supported now)
added dialog accelerator framework support new improved savestate-with-movie-running naming convention
This commit is contained in:
parent
ac025d7d65
commit
d998a3c015
|
@ -280,10 +280,12 @@ int BlockingCheck()
|
||||||
{
|
{
|
||||||
if( GetMessage( &msg, 0, 0, 0)>0 )
|
if( GetMessage( &msg, 0, 0, 0)>0 )
|
||||||
{
|
{
|
||||||
|
//other accelerator capable dialogs could be added here
|
||||||
extern HWND hwndMemWatch;
|
extern HWND hwndMemWatch;
|
||||||
int accelerated = 0;
|
int accelerated = 0;
|
||||||
/*if(hwndMemWatch)
|
if(IsChild(hwndMemWatch,msg.hwnd))
|
||||||
accelerated = TranslateAccelerator(hwndMemWatch,fceu_hAccel,&msg);*/
|
accelerated = TranslateAccelerator(hwndMemWatch,fceu_hAccel,&msg);
|
||||||
|
|
||||||
if(!accelerated)
|
if(!accelerated)
|
||||||
{
|
{
|
||||||
TranslateMessage(&msg);
|
TranslateMessage(&msg);
|
||||||
|
@ -567,7 +569,7 @@ int main(int argc,char *argv[])
|
||||||
ApplyDefaultCommandMapping();
|
ApplyDefaultCommandMapping();
|
||||||
|
|
||||||
fceu_hInstance = GetModuleHandle(0);
|
fceu_hInstance = GetModuleHandle(0);
|
||||||
LoadAccelerators(fceu_hInstance,"IDR_ACCELERATOR1");
|
fceu_hAccel = LoadAccelerators(fceu_hInstance,MAKEINTRESOURCE(IDR_ACCELERATOR1));
|
||||||
|
|
||||||
// Get the base directory
|
// Get the base directory
|
||||||
GetBaseDirectory();
|
GetBaseDirectory();
|
||||||
|
|
|
@ -771,9 +771,6 @@ static BOOL CALLBACK MemWatchCallB(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARA
|
||||||
//Menu Items
|
//Menu Items
|
||||||
switch(LOWORD(wParam))
|
switch(LOWORD(wParam))
|
||||||
{
|
{
|
||||||
case ID_ACCELERATOR_CTRL_O:
|
|
||||||
MessageBox(hwndDlg,"Someone hit ctrl+o","test",0);
|
|
||||||
break;
|
|
||||||
case 600: //First item in recent menu
|
case 600: //First item in recent menu
|
||||||
OpenMemwatchRecentFile(0);
|
OpenMemwatchRecentFile(0);
|
||||||
break;
|
break;
|
||||||
|
@ -793,7 +790,7 @@ static BOOL CALLBACK MemWatchCallB(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARA
|
||||||
case MEMW_FILE_CLOSE:
|
case MEMW_FILE_CLOSE:
|
||||||
CloseMemoryWatch();
|
CloseMemoryWatch();
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case MEMW_FILE_OPEN:
|
case MEMW_FILE_OPEN:
|
||||||
LoadMemWatch();
|
LoadMemWatch();
|
||||||
break;
|
break;
|
||||||
|
|
|
@ -149,46 +149,52 @@ void UpdateReplayDialog(HWND hwndDlg)
|
||||||
SendDlgItemMessage(hwndDlg,IDC_CHECK_READONLY,BM_SETCHECK,info.read_only ? BST_CHECKED : (ReplayDialogReadOnlyStatus ? BST_CHECKED : BST_UNCHECKED), 0);
|
SendDlgItemMessage(hwndDlg,IDC_CHECK_READONLY,BM_SETCHECK,info.read_only ? BST_CHECKED : (ReplayDialogReadOnlyStatus ? BST_CHECKED : BST_UNCHECKED), 0);
|
||||||
|
|
||||||
SetWindowText(GetDlgItem(hwndDlg,IDC_LABEL_RECORDEDFROM),info.poweron ? "Power-On" : (info.reset?"Soft-Reset":"Savestate"));
|
SetWindowText(GetDlgItem(hwndDlg,IDC_LABEL_RECORDEDFROM),info.poweron ? "Power-On" : (info.reset?"Soft-Reset":"Savestate"));
|
||||||
if(info.movie_version > 1)
|
|
||||||
{
|
//-----------
|
||||||
|
//mbg 5/26/08 - getting rid of old movie formats
|
||||||
|
|
||||||
|
//if(info.movie_version > 1)
|
||||||
|
//{
|
||||||
char emuStr[128];
|
char emuStr[128];
|
||||||
SetWindowText(GetDlgItem(hwndDlg,IDC_LABEL_ROMUSED),info.name_of_rom_used.c_str());
|
SetWindowText(GetDlgItem(hwndDlg,IDC_LABEL_ROMUSED),info.name_of_rom_used.c_str());
|
||||||
SetWindowText(GetDlgItem(hwndDlg,IDC_LABEL_ROMCHECKSUM),md5_asciistr(info.md5_of_rom_used));
|
SetWindowText(GetDlgItem(hwndDlg,IDC_LABEL_ROMCHECKSUM),md5_asciistr(info.md5_of_rom_used));
|
||||||
if(info.emu_version_used > 64)
|
|
||||||
|
//if(info.emu_version_used > 64)
|
||||||
sprintf(emuStr, "FCEU %d.%02d.%02d%s", info.emu_version_used/10000, (info.emu_version_used/100)%100, (info.emu_version_used)%100, info.emu_version_used < 9813 ? " (blip)" : "");
|
sprintf(emuStr, "FCEU %d.%02d.%02d%s", info.emu_version_used/10000, (info.emu_version_used/100)%100, (info.emu_version_used)%100, info.emu_version_used < 9813 ? " (blip)" : "");
|
||||||
else
|
//else
|
||||||
{
|
//{
|
||||||
if(info.emu_version_used == 1)
|
// if(info.emu_version_used == 1)
|
||||||
strcpy(emuStr, "Famtasia");
|
// strcpy(emuStr, "Famtasia");
|
||||||
else if(info.emu_version_used == 2)
|
// else if(info.emu_version_used == 2)
|
||||||
strcpy(emuStr, "Nintendulator");
|
// strcpy(emuStr, "Nintendulator");
|
||||||
else if(info.emu_version_used == 3)
|
// else if(info.emu_version_used == 3)
|
||||||
strcpy(emuStr, "VirtuaNES");
|
// strcpy(emuStr, "VirtuaNES");
|
||||||
else
|
// else
|
||||||
{
|
// {
|
||||||
strcpy(emuStr, "(unknown)");
|
// strcpy(emuStr, "(unknown)");
|
||||||
char* dot = strrchr(fn,'.');
|
// char* dot = strrchr(fn,'.');
|
||||||
if(dot)
|
// if(dot)
|
||||||
{
|
// {
|
||||||
if(!stricmp(dot,".fmv"))
|
// if(!stricmp(dot,".fmv"))
|
||||||
strcpy(emuStr, "Famtasia? (unknown version)");
|
// strcpy(emuStr, "Famtasia? (unknown version)");
|
||||||
else if(!stricmp(dot,".nmv"))
|
// else if(!stricmp(dot,".nmv"))
|
||||||
strcpy(emuStr, "Nintendulator? (unknown version)");
|
// strcpy(emuStr, "Nintendulator? (unknown version)");
|
||||||
else if(!stricmp(dot,".vmv"))
|
// else if(!stricmp(dot,".vmv"))
|
||||||
strcpy(emuStr, "VirtuaNES? (unknown version)");
|
// strcpy(emuStr, "VirtuaNES? (unknown version)");
|
||||||
else if(!stricmp(dot,".fcm"))
|
// else if(!stricmp(dot,".fcm"))
|
||||||
strcpy(emuStr, "FCEU? (unknown version)");
|
// strcpy(emuStr, "FCEU? (unknown version)");
|
||||||
}
|
// }
|
||||||
}
|
// }
|
||||||
}
|
//}
|
||||||
SetWindowText(GetDlgItem(hwndDlg,IDC_LABEL_EMULATORUSED),emuStr);
|
SetWindowText(GetDlgItem(hwndDlg,IDC_LABEL_EMULATORUSED),emuStr);
|
||||||
}
|
//}
|
||||||
else
|
//else
|
||||||
{
|
//{
|
||||||
SetWindowText(GetDlgItem(hwndDlg,IDC_LABEL_ROMUSED),"unknown");
|
// SetWindowText(GetDlgItem(hwndDlg,IDC_LABEL_ROMUSED),"unknown");
|
||||||
SetWindowText(GetDlgItem(hwndDlg,IDC_LABEL_ROMCHECKSUM),"unknown");
|
// SetWindowText(GetDlgItem(hwndDlg,IDC_LABEL_ROMCHECKSUM),"unknown");
|
||||||
SetWindowText(GetDlgItem(hwndDlg,IDC_LABEL_EMULATORUSED),"FCEU 0.98.10 (blip)");
|
// SetWindowText(GetDlgItem(hwndDlg,IDC_LABEL_EMULATORUSED),"FCEU 0.98.10 (blip)");
|
||||||
}
|
//}
|
||||||
|
//--------------------
|
||||||
|
|
||||||
SetWindowText(GetDlgItem(hwndDlg,IDC_LABEL_CURRCHECKSUM),md5_asciistr(GameInfo->MD5));
|
SetWindowText(GetDlgItem(hwndDlg,IDC_LABEL_CURRCHECKSUM),md5_asciistr(GameInfo->MD5));
|
||||||
EnableWindow(GetDlgItem(hwndDlg,1),TRUE); // enable OK
|
EnableWindow(GetDlgItem(hwndDlg,1),TRUE); // enable OK
|
||||||
|
@ -314,7 +320,7 @@ BOOL CALLBACK ReplayDialogProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lP
|
||||||
if (wfd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
|
if (wfd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
// filter out everything that's not *.fcm, *.fmv, *.vmv, or *.nmv
|
// filter out everything that's not *.fcm, *.fm2
|
||||||
// (because FindFirstFile is too dumb to do that)
|
// (because FindFirstFile is too dumb to do that)
|
||||||
{
|
{
|
||||||
char* dot=strrchr(wfd.cFileName,'.');
|
char* dot=strrchr(wfd.cFileName,'.');
|
||||||
|
@ -325,7 +331,7 @@ BOOL CALLBACK ReplayDialogProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lP
|
||||||
int k, extlen=strlen(ext);
|
int k, extlen=strlen(ext);
|
||||||
for(k=0;k<extlen;k++)
|
for(k=0;k<extlen;k++)
|
||||||
ext[k]=tolower(ext[k]);
|
ext[k]=tolower(ext[k]);
|
||||||
if(strcmp(ext,"fcm") && strcmp(ext,"fmv") && strcmp(ext,"vmv") && strcmp(ext,"nmv"))
|
if(strcmp(ext,"fcm") && strcmp(ext,"fm2"))
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -339,25 +345,25 @@ BOOL CALLBACK ReplayDialogProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lP
|
||||||
sprintf(filename, "%s%s", globBase, wfd.cFileName);
|
sprintf(filename, "%s%s", globBase, wfd.cFileName);
|
||||||
|
|
||||||
char* dot = strrchr(filename, '.');
|
char* dot = strrchr(filename, '.');
|
||||||
int fcm = (dot && tolower(dot[1]) == 'f' && tolower(dot[2]) == 'c' && tolower(dot[3]) == 'm');
|
|
||||||
|
|
||||||
if(fcm && !FCEUI_MovieGetInfo(filename, &info))
|
if(!FCEUI_MovieGetInfo(filename, &info))
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
|
//------------
|
||||||
|
//attempt to match the movie with the rom
|
||||||
|
//first, try matching md5
|
||||||
|
//then try matching base name
|
||||||
char md51 [256];
|
char md51 [256];
|
||||||
char md52 [256];
|
char md52 [256];
|
||||||
if(fcm) strcpy(md51, md5_asciistr(GameInfo->MD5));
|
strcpy(md51, md5_asciistr(GameInfo->MD5));
|
||||||
if(fcm) strcpy(md52, md5_asciistr(info.md5_of_rom_used));
|
strcpy(md52, md5_asciistr(info.md5_of_rom_used));
|
||||||
if(!fcm || strcmp(md51, md52))
|
if(strcmp(md51, md52))
|
||||||
{
|
{
|
||||||
if(fcm)
|
unsigned int k, count1=0, count2=0; //mbg merge 7/17/06 changed to uint
|
||||||
{
|
for(k=0;k<strlen(md51);k++) count1 += md51[k]-'0';
|
||||||
unsigned int k, count1=0, count2=0; //mbg merge 7/17/06 changed to uint
|
for(k=0;k<strlen(md52);k++) count2 += md52[k]-'0';
|
||||||
for(k=0;k<strlen(md51);k++) count1 += md51[k]-'0';
|
if(count1 && count2)
|
||||||
for(k=0;k<strlen(md52);k++) count2 += md52[k]-'0';
|
continue;
|
||||||
if(count1 && count2)
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
char* tlen1=strstr(wfd.cFileName, " (");
|
char* tlen1=strstr(wfd.cFileName, " (");
|
||||||
char* tlen2=strstr(FileBase, " (");
|
char* tlen2=strstr(FileBase, " (");
|
||||||
|
@ -373,6 +379,8 @@ BOOL CALLBACK ReplayDialogProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lP
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
//-------------
|
||||||
|
//if we get here, then we had a match
|
||||||
|
|
||||||
char relative[MAX_PATH];
|
char relative[MAX_PATH];
|
||||||
AbsoluteToRelative(relative, filename, BaseDirectory);
|
AbsoluteToRelative(relative, filename, BaseDirectory);
|
||||||
|
@ -445,12 +453,12 @@ BOOL CALLBACK ReplayDialogProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lP
|
||||||
memset(&ofn, 0, sizeof(ofn));
|
memset(&ofn, 0, sizeof(ofn));
|
||||||
ofn.lStructSize = sizeof(ofn);
|
ofn.lStructSize = sizeof(ofn);
|
||||||
ofn.hwndOwner = hwndDlg;
|
ofn.hwndOwner = hwndDlg;
|
||||||
ofn.lpstrFilter = "Supported Movie Files (*.fcm|*.fmv|*.nmv|*.vmv)\0*.fcm;*.fmv;*.nmv;*.vmv\0FCEU Movie Files (*.fcm)\0*.fcm\0Famtasia Movie Files (*.fmv)\0*.fmv\0Nintendulator Movie Files (*.nmv)\0*.nmv\0VirtuaNES Movie Files (*.vmv)\0*.vmv\0All files(*.*)\0*.*\0\0";
|
ofn.lpstrFilter = "Supported Movie Files (*.fcm|*.fm2)\0*.fcm;*.fm2\0FCEUX Movie Files (*.fm2)\0*.fm2\0FCEU Movie Files (*.fcm)\0*.fcm\0All files(*.*)\0*.*\0\0";
|
||||||
ofn.lpstrFile = szFile;
|
ofn.lpstrFile = szFile;
|
||||||
ofn.nMaxFile = sizeof(szFile);
|
ofn.nMaxFile = sizeof(szFile);
|
||||||
ofn.lpstrInitialDir = pn;
|
ofn.lpstrInitialDir = pn;
|
||||||
ofn.Flags = OFN_NOCHANGEDIR | OFN_HIDEREADONLY;
|
ofn.Flags = OFN_NOCHANGEDIR | OFN_HIDEREADONLY;
|
||||||
ofn.lpstrDefExt = "fcm";
|
ofn.lpstrDefExt = "fm2";
|
||||||
ofn.lpstrTitle = "Replay Movie from File";
|
ofn.lpstrTitle = "Replay Movie from File";
|
||||||
|
|
||||||
if(GetOpenFileName(&ofn))
|
if(GetOpenFileName(&ofn))
|
||||||
|
@ -612,7 +620,7 @@ static BOOL CALLBACK RecordDialogProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LP
|
||||||
free(p->szFilename);
|
free(p->szFilename);
|
||||||
p->szFilename = 0;
|
p->szFilename = 0;
|
||||||
|
|
||||||
/* Populate the "record from..." dialog */
|
// Populate the "record from..." dialog
|
||||||
{
|
{
|
||||||
char* findGlob=FCEU_MakeFName(FCEUMKF_STATEGLOB, 0, 0);
|
char* findGlob=FCEU_MakeFName(FCEUMKF_STATEGLOB, 0, 0);
|
||||||
WIN32_FIND_DATA wfd;
|
WIN32_FIND_DATA wfd;
|
||||||
|
@ -633,7 +641,7 @@ static BOOL CALLBACK RecordDialogProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LP
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
if (strlen(wfd.cFileName) < 4 ||
|
if (strlen(wfd.cFileName) < 4 ||
|
||||||
!strcmp(wfd.cFileName + (strlen(wfd.cFileName) - 4), ".fcm"))
|
!strcmp(wfd.cFileName + (strlen(wfd.cFileName) - 4), ".fm2"))
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
SendDlgItemMessage(hwndDlg, IDC_COMBO_RECORDFROM, CB_INSERTSTRING, i++, (LPARAM)wfd.cFileName);
|
SendDlgItemMessage(hwndDlg, IDC_COMBO_RECORDFROM, CB_INSERTSTRING, i++, (LPARAM)wfd.cFileName);
|
||||||
|
@ -674,7 +682,7 @@ static BOOL CALLBACK RecordDialogProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LP
|
||||||
memset(&ofn, 0, sizeof(ofn));
|
memset(&ofn, 0, sizeof(ofn));
|
||||||
ofn.lStructSize = sizeof(ofn);
|
ofn.lStructSize = sizeof(ofn);
|
||||||
ofn.hwndOwner = hwndDlg;
|
ofn.hwndOwner = hwndDlg;
|
||||||
ofn.lpstrFilter = "FCE Ultra Save State(*.fc?)\0*.fc?\0\0";
|
ofn.lpstrFilter = "FCEU Save State(*.fc?)\0*.fc?\0\0";
|
||||||
ofn.lpstrFile = szChoice;
|
ofn.lpstrFile = szChoice;
|
||||||
ofn.lpstrDefExt = "fcs";
|
ofn.lpstrDefExt = "fcs";
|
||||||
ofn.nMaxFile = MAX_PATH;
|
ofn.nMaxFile = MAX_PATH;
|
||||||
|
@ -721,9 +729,9 @@ static BOOL CALLBACK RecordDialogProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LP
|
||||||
memset(&ofn, 0, sizeof(ofn));
|
memset(&ofn, 0, sizeof(ofn));
|
||||||
ofn.lStructSize = sizeof(ofn);
|
ofn.lStructSize = sizeof(ofn);
|
||||||
ofn.hwndOwner = hwndDlg;
|
ofn.hwndOwner = hwndDlg;
|
||||||
ofn.lpstrFilter = "FCE Ultra Movie File(*.fcm)\0*.fcm\0All files(*.*)\0*.*\0\0";
|
ofn.lpstrFilter = "FCEUX Movie File (*.fm2)\0*.fm2\0FCEU Movie File(*.fcm)\0*.fcm\0All files(*.*)\0*.*\0\0";
|
||||||
ofn.lpstrFile = szChoice;
|
ofn.lpstrFile = szChoice;
|
||||||
ofn.lpstrDefExt = "fcm";
|
ofn.lpstrDefExt = "fm2";
|
||||||
ofn.nMaxFile = MAX_PATH;
|
ofn.nMaxFile = MAX_PATH;
|
||||||
ofn.Flags = OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT;
|
ofn.Flags = OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT;
|
||||||
if(GetSaveFileName(&ofn))
|
if(GetSaveFileName(&ofn))
|
||||||
|
|
Binary file not shown.
|
@ -338,7 +338,7 @@
|
||||||
#ifdef APSTUDIO_INVOKED
|
#ifdef APSTUDIO_INVOKED
|
||||||
#ifndef APSTUDIO_READONLY_SYMBOLS
|
#ifndef APSTUDIO_READONLY_SYMBOLS
|
||||||
#define _APS_NEXT_RESOURCE_VALUE 109
|
#define _APS_NEXT_RESOURCE_VALUE 109
|
||||||
#define _APS_NEXT_COMMAND_VALUE 40121
|
#define _APS_NEXT_COMMAND_VALUE 40123
|
||||||
#define _APS_NEXT_CONTROL_VALUE 1130
|
#define _APS_NEXT_CONTROL_VALUE 1130
|
||||||
#define _APS_NEXT_SYMED_VALUE 101
|
#define _APS_NEXT_SYMED_VALUE 101
|
||||||
#endif
|
#endif
|
||||||
|
|
62
src/file.cpp
62
src/file.cpp
|
@ -19,6 +19,7 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
|
#include <limits.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <stdarg.h>
|
#include <stdarg.h>
|
||||||
|
@ -39,6 +40,7 @@
|
||||||
#include "state.h"
|
#include "state.h"
|
||||||
#include "movie.h"
|
#include "movie.h"
|
||||||
#include "driver.h"
|
#include "driver.h"
|
||||||
|
#include "utils/xstring.h"
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
uint8 *data;
|
uint8 *data;
|
||||||
|
@ -715,46 +717,41 @@ char *FCEU_MakeFName(int type, int id1, char *cd1)
|
||||||
{
|
{
|
||||||
case FCEUMKF_NPTEMP: asprintf(&ret,"%s"PSS"m590plqd94fo.tmp",BaseDirectory);break;
|
case FCEUMKF_NPTEMP: asprintf(&ret,"%s"PSS"m590plqd94fo.tmp",BaseDirectory);break;
|
||||||
case FCEUMKF_MOVIE:
|
case FCEUMKF_MOVIE:
|
||||||
if(id1>=0)
|
if(odirs[FCEUIOD_MOVIES])
|
||||||
{
|
asprintf(&ret,"%s"PSS"%s.fm2",odirs[FCEUIOD_MOVIES],FileBase);
|
||||||
if(odirs[FCEUIOD_MOVIES])
|
|
||||||
asprintf(&ret,"%s"PSS"%s.%d.fcm",odirs[FCEUIOD_MOVIES],FileBase,id1);
|
|
||||||
else
|
|
||||||
asprintf(&ret,"%s"PSS"movies"PSS"%s.%d.fcm",BaseDirectory,FileBase,id1);
|
|
||||||
if(stat(ret,&tmpstat)==-1)
|
|
||||||
{
|
|
||||||
if(odirs[FCEUIOD_MOVIES])
|
|
||||||
asprintf(&ret,"%s"PSS"%s.%d.fcm",odirs[FCEUIOD_MOVIES],FileBase,id1);
|
|
||||||
else
|
|
||||||
asprintf(&ret,"%s"PSS"movies"PSS"%s.%d.fcm",BaseDirectory,FileBase,id1);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
else
|
||||||
{
|
asprintf(&ret,"%s"PSS"movies"PSS"%s.fm2",BaseDirectory,FileBase);
|
||||||
if(odirs[FCEUIOD_MOVIES])
|
|
||||||
asprintf(&ret,"%s"PSS"%s.fcm",odirs[FCEUIOD_MOVIES],FileBase);
|
|
||||||
else
|
|
||||||
asprintf(&ret,"%s"PSS"movies"PSS"%s.fcm",BaseDirectory,FileBase);
|
|
||||||
}
|
|
||||||
break;
|
break;
|
||||||
case FCEUMKF_STATE:
|
case FCEUMKF_STATE:
|
||||||
if(odirs[FCEUIOD_STATES])
|
|
||||||
{
|
|
||||||
asprintf(&ret,"%s"PSS"%s.fc%d",odirs[FCEUIOD_STATES],FileBase,id1);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
asprintf(&ret,"%s"PSS"fcs"PSS"%s.fc%d",BaseDirectory,FileBase,id1);
|
|
||||||
}
|
|
||||||
if(stat(ret,&tmpstat)==-1)
|
|
||||||
{
|
{
|
||||||
|
std::string movieFilenamePart;
|
||||||
|
extern char curMovieFilename[512];
|
||||||
|
if(*curMovieFilename)
|
||||||
|
{
|
||||||
|
char drv[PATH_MAX], dir[PATH_MAX], name[PATH_MAX], ext[PATH_MAX];
|
||||||
|
splitpath(curMovieFilename,drv,dir,name,ext);
|
||||||
|
movieFilenamePart = std::string(".") + name;
|
||||||
|
}
|
||||||
|
const char* mfn = movieFilenamePart.c_str();
|
||||||
|
|
||||||
if(odirs[FCEUIOD_STATES])
|
if(odirs[FCEUIOD_STATES])
|
||||||
{
|
{
|
||||||
asprintf(&ret,"%s"PSS"%s.fc%d",odirs[FCEUIOD_STATES],FileBase,id1);
|
asprintf(&ret,"%s"PSS"%s%s.fc%d",odirs[FCEUIOD_STATES],FileBase,mfn,id1);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
asprintf(&ret,"%s"PSS"fcs"PSS"%s.fc%d",BaseDirectory,FileBase,id1);
|
asprintf(&ret,"%s"PSS"fcs"PSS"%s%s.fc%d",BaseDirectory,FileBase,mfn,id1);
|
||||||
|
}
|
||||||
|
if(stat(ret,&tmpstat)==-1)
|
||||||
|
{
|
||||||
|
if(odirs[FCEUIOD_STATES])
|
||||||
|
{
|
||||||
|
asprintf(&ret,"%s"PSS"%s%s.fc%d",odirs[FCEUIOD_STATES],FileBase,mfn,id1);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
asprintf(&ret,"%s"PSS"fcs"PSS"%s%s.fc%d",BaseDirectory,FileBase,mfn,id1);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
@ -830,11 +827,10 @@ char *FCEU_MakeFName(int type, int id1, char *cd1)
|
||||||
break;
|
break;
|
||||||
case FCEUMKF_PALETTE:asprintf(&ret,"%s"PSS"%s.pal",BaseDirectory,FileBase);break;
|
case FCEUMKF_PALETTE:asprintf(&ret,"%s"PSS"%s.pal",BaseDirectory,FileBase);break;
|
||||||
case FCEUMKF_MOVIEGLOB:
|
case FCEUMKF_MOVIEGLOB:
|
||||||
|
//these globs use ??? because we can load multiple formats
|
||||||
if(odirs[FCEUIOD_MOVIES])
|
if(odirs[FCEUIOD_MOVIES])
|
||||||
// asprintf(&ret,"%s"PSS"%s*.fcm",odirs[FCEUIOD_MOVIES],FileBase);
|
|
||||||
asprintf(&ret,"%s"PSS"*.???",odirs[FCEUIOD_MOVIES]);
|
asprintf(&ret,"%s"PSS"*.???",odirs[FCEUIOD_MOVIES]);
|
||||||
else
|
else
|
||||||
// asprintf(&ret,"%s"PSS"fcs"PSS"%s*.fcm",BaseDirectory,FileBase);
|
|
||||||
asprintf(&ret,"%s"PSS"movies"PSS"*.???",BaseDirectory);
|
asprintf(&ret,"%s"PSS"movies"PSS"*.???",BaseDirectory);
|
||||||
break;
|
break;
|
||||||
case FCEUMKF_MOVIEGLOB2:asprintf(&ret,"%s"PSS"*.???",BaseDirectory);break;
|
case FCEUMKF_MOVIEGLOB2:asprintf(&ret,"%s"PSS"*.???",BaseDirectory);break;
|
||||||
|
|
|
@ -65,7 +65,7 @@ SFORMAT FCEUMOV_STATEINFO[]={
|
||||||
{ 0 }
|
{ 0 }
|
||||||
};
|
};
|
||||||
|
|
||||||
char curMovieFilename[512];
|
char curMovieFilename[512] = {0};
|
||||||
|
|
||||||
class MovieRecord
|
class MovieRecord
|
||||||
{
|
{
|
||||||
|
@ -382,6 +382,8 @@ void FCEUI_StopMovie()
|
||||||
StopPlayback();
|
StopPlayback();
|
||||||
else if(movieMode == MOVIEMODE_RECORD)
|
else if(movieMode == MOVIEMODE_RECORD)
|
||||||
StopRecording();
|
StopRecording();
|
||||||
|
|
||||||
|
curMovieFilename[0] = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -460,7 +462,8 @@ void FCEUI_LoadMovie(char *fname, bool _read_only, int _pauseframe)
|
||||||
|
|
||||||
//TODO - handle reset flag
|
//TODO - handle reset flag
|
||||||
|
|
||||||
//...why do we have to do this. isnt it setup by the rom?
|
//if there is no savestate, we won't have this crucial piece of information at the start of the movie.
|
||||||
|
//so, we have to include it with the movie
|
||||||
if(currMovieData.palFlag)
|
if(currMovieData.palFlag)
|
||||||
FCEUI_SetVidSystem(1);
|
FCEUI_SetVidSystem(1);
|
||||||
else
|
else
|
||||||
|
|
|
@ -60,6 +60,7 @@ typedef signed int int32;
|
||||||
#define R_OK 2
|
#define R_OK 2
|
||||||
#define X_OK 1
|
#define X_OK 1
|
||||||
#define F_OK 0
|
#define F_OK 0
|
||||||
|
#define PATH_MAX 260
|
||||||
#else
|
#else
|
||||||
|
|
||||||
//mingw32 doesnt prototype this for some reason
|
//mingw32 doesnt prototype this for some reason
|
||||||
|
|
|
@ -309,3 +309,58 @@ std::vector<std::string> tokenize_str(const std::string & str,
|
||||||
|
|
||||||
return tokens;
|
return tokens;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//this code was taken from WINE (LGPL)
|
||||||
|
//http://google.com/codesearch?hl=en&q=+lang:c+splitpath+show:CPvw9Z-euls:_RSotQzmLeU:KGzljMEYFbY&sa=N&cd=9&ct=rc&cs_p=http://gentoo.osuosl.org/distfiles/Wine-20050524.tar.gz&cs_f=wine-20050524/programs/winefile/splitpath.c
|
||||||
|
void splitpath(const char* path, char* drv, char* dir, char* name, char* ext)
|
||||||
|
{
|
||||||
|
const char* end; /* end of processed string */
|
||||||
|
const char* p; /* search pointer */
|
||||||
|
const char* s; /* copy pointer */
|
||||||
|
|
||||||
|
/* extract drive name */
|
||||||
|
if (path[0] && path[1]==':') {
|
||||||
|
if (drv) {
|
||||||
|
*drv++ = *path++;
|
||||||
|
*drv++ = *path++;
|
||||||
|
*drv = '\0';
|
||||||
|
}
|
||||||
|
} else if (drv)
|
||||||
|
*drv = '\0';
|
||||||
|
|
||||||
|
/* search for end of string or stream separator */
|
||||||
|
for(end=path; *end && *end!=':'; )
|
||||||
|
end++;
|
||||||
|
|
||||||
|
/* search for begin of file extension */
|
||||||
|
for(p=end; p>path && *--p!='\\' && *p!='/'; )
|
||||||
|
if (*p == '.') {
|
||||||
|
end = p;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (ext)
|
||||||
|
for(s=end; (*ext=*s++); )
|
||||||
|
ext++;
|
||||||
|
|
||||||
|
/* search for end of directory name */
|
||||||
|
for(p=end; p>path; )
|
||||||
|
if (*--p=='\\' || *p=='/') {
|
||||||
|
p++;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (name) {
|
||||||
|
for(s=p; s<end; )
|
||||||
|
*name++ = *s++;
|
||||||
|
|
||||||
|
*name = '\0';
|
||||||
|
}
|
||||||
|
|
||||||
|
if (dir) {
|
||||||
|
for(s=path; s<p; )
|
||||||
|
*dir++ = *s++;
|
||||||
|
|
||||||
|
*dir = '\0';
|
||||||
|
}
|
||||||
|
}
|
|
@ -42,4 +42,5 @@ int HexStringToBytesLength(std::string& str);
|
||||||
std::string BytesToString(void* data, int len);
|
std::string BytesToString(void* data, int len);
|
||||||
bool StringToBytes(std::string& str, void* data, int len);
|
bool StringToBytes(std::string& str, void* data, int len);
|
||||||
|
|
||||||
std::vector<std::string> tokenize_str(const std::string & str,const std::string & delims);
|
std::vector<std::string> tokenize_str(const std::string & str,const std::string & delims);
|
||||||
|
void splitpath(const char* path, char* drv, char* dir, char* name, char* ext);
|
Loading…
Reference in New Issue