* Tasedit: Import input from FM2/TAS files
* Tasedit: Export to FM2 dialog
This commit is contained in:
parent
06c4fff479
commit
c0d73203db
|
@ -88,6 +88,7 @@ extern int TASEdit_greenzone_capacity;
|
||||||
extern int TasEdit_undo_levels;
|
extern int TasEdit_undo_levels;
|
||||||
extern int TASEdit_autosave_period;
|
extern int TASEdit_autosave_period;
|
||||||
extern bool TASEdit_jump_to_undo;
|
extern bool TASEdit_jump_to_undo;
|
||||||
|
extern int TASEdit_last_export_type;
|
||||||
|
|
||||||
//window positions and sizes:
|
//window positions and sizes:
|
||||||
extern int ChtPosX,ChtPosY;
|
extern int ChtPosX,ChtPosY;
|
||||||
|
@ -325,6 +326,7 @@ static CFGSTRUCT fceuconfig[] = {
|
||||||
AC(TasEdit_undo_levels),
|
AC(TasEdit_undo_levels),
|
||||||
AC(TASEdit_autosave_period),
|
AC(TASEdit_autosave_period),
|
||||||
AC(TASEdit_jump_to_undo),
|
AC(TASEdit_jump_to_undo),
|
||||||
|
AC(TASEdit_last_export_type),
|
||||||
AC(lagCounterDisplay),
|
AC(lagCounterDisplay),
|
||||||
AC(oldInputDisplay),
|
AC(oldInputDisplay),
|
||||||
AC(movieSubtitles),
|
AC(movieSubtitles),
|
||||||
|
|
|
@ -225,7 +225,7 @@ BEGIN
|
||||||
MENUITEM "Save &Compact", ID_FILE_SAVECOMPACT, INACTIVE
|
MENUITEM "Save &Compact", ID_FILE_SAVECOMPACT, INACTIVE
|
||||||
MENUITEM "&Recent", ID_TASEDIT_FILE_RECENT
|
MENUITEM "&Recent", ID_TASEDIT_FILE_RECENT
|
||||||
MENUITEM SEPARATOR
|
MENUITEM SEPARATOR
|
||||||
MENUITEM "&Import FM2", ID_FILE_IMPORTFM2, INACTIVE
|
MENUITEM "&Import", ID_FILE_IMPORTFM2
|
||||||
MENUITEM "&Export to FM2", ID_FILE_EXPORTFM2
|
MENUITEM "&Export to FM2", ID_FILE_EXPORTFM2
|
||||||
MENUITEM SEPARATOR
|
MENUITEM SEPARATOR
|
||||||
MENUITEM "&Close\tAlt+F4", ID_TASEDIT_FILE_CLOSE
|
MENUITEM "&Close\tAlt+F4", ID_TASEDIT_FILE_CLOSE
|
||||||
|
@ -1414,6 +1414,18 @@ BEGIN
|
||||||
LTEXT "Clipboard: 0 rows, 16 columns",IDC_TEXT_CLIPBOARD,316,134,114,10
|
LTEXT "Clipboard: 0 rows, 16 columns",IDC_TEXT_CLIPBOARD,316,134,114,10
|
||||||
END
|
END
|
||||||
|
|
||||||
|
IDD_TASEDIT_EXPORT DIALOGEX 0, 0, 122, 73
|
||||||
|
STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | WS_SYSMENU
|
||||||
|
CAPTION "Export to FM2"
|
||||||
|
FONT 8, "MS Shell Dlg", 400, 0, 0x1
|
||||||
|
BEGIN
|
||||||
|
DEFPUSHBUTTON "Export",IDOK,7,52,50,14
|
||||||
|
PUSHBUTTON "Cancel",IDCANCEL,65,52,50,14
|
||||||
|
CONTROL " 1 player",IDC_RADIO_1PLAYER,"Button",BS_AUTORADIOBUTTON,36,8,49,10
|
||||||
|
CONTROL " 2 players",IDC_RADIO_2PLAYERS,"Button",BS_AUTORADIOBUTTON,36,21,49,10
|
||||||
|
CONTROL " Fourscore",IDC_RADIO_FOURSCORE,"Button",BS_AUTORADIOBUTTON,37,35,47,10
|
||||||
|
END
|
||||||
|
|
||||||
ASSEMBLER DIALOGEX 0, 0, 202, 135
|
ASSEMBLER DIALOGEX 0, 0, 202, 135
|
||||||
STYLE DS_SETFONT | DS_MODALFRAME | DS_3DLOOK | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | WS_SYSMENU
|
STYLE DS_SETFONT | DS_MODALFRAME | DS_3DLOOK | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | WS_SYSMENU
|
||||||
CAPTION "Inline Assembler"
|
CAPTION "Inline Assembler"
|
||||||
|
@ -1854,6 +1866,10 @@ BEGIN
|
||||||
BOTTOMMARGIN, 121
|
BOTTOMMARGIN, 121
|
||||||
END
|
END
|
||||||
|
|
||||||
|
"GGCONV", DIALOG
|
||||||
|
BEGIN
|
||||||
|
END
|
||||||
|
|
||||||
"MONITOR", DIALOG
|
"MONITOR", DIALOG
|
||||||
BEGIN
|
BEGIN
|
||||||
LEFTMARGIN, 7
|
LEFTMARGIN, 7
|
||||||
|
@ -1905,6 +1921,10 @@ BEGIN
|
||||||
BOTTOMMARGIN, 213
|
BOTTOMMARGIN, 213
|
||||||
END
|
END
|
||||||
|
|
||||||
|
"PPUVIEW", DIALOG
|
||||||
|
BEGIN
|
||||||
|
END
|
||||||
|
|
||||||
"ARCHIVECHOOSERDIALOG", DIALOG
|
"ARCHIVECHOOSERDIALOG", DIALOG
|
||||||
BEGIN
|
BEGIN
|
||||||
LEFTMARGIN, 7
|
LEFTMARGIN, 7
|
||||||
|
@ -1936,6 +1956,10 @@ BEGIN
|
||||||
TOPMARGIN, 8
|
TOPMARGIN, 8
|
||||||
BOTTOMMARGIN, 268
|
BOTTOMMARGIN, 268
|
||||||
END
|
END
|
||||||
|
|
||||||
|
IDD_PROMPT, DIALOG
|
||||||
|
BEGIN
|
||||||
|
END
|
||||||
END
|
END
|
||||||
#endif // APSTUDIO_INVOKED
|
#endif // APSTUDIO_INVOKED
|
||||||
|
|
||||||
|
@ -1943,6 +1967,41 @@ END
|
||||||
/////////////////////////////////////////////////////////////////////////////
|
/////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
|
||||||
|
/////////////////////////////////////////////////////////////////////////////
|
||||||
|
// Ðóññêèé (Ðîññèÿ) resources
|
||||||
|
|
||||||
|
#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_RUS)
|
||||||
|
LANGUAGE LANG_RUSSIAN, SUBLANG_DEFAULT
|
||||||
|
#pragma code_page(1251)
|
||||||
|
|
||||||
|
/////////////////////////////////////////////////////////////////////////////
|
||||||
|
//
|
||||||
|
// Dialog
|
||||||
|
//
|
||||||
|
|
||||||
|
|
||||||
|
/////////////////////////////////////////////////////////////////////////////
|
||||||
|
//
|
||||||
|
// DESIGNINFO
|
||||||
|
//
|
||||||
|
|
||||||
|
#ifdef APSTUDIO_INVOKED
|
||||||
|
GUIDELINES DESIGNINFO
|
||||||
|
BEGIN
|
||||||
|
IDD_TASEDIT_EXPORT, DIALOG
|
||||||
|
BEGIN
|
||||||
|
LEFTMARGIN, 7
|
||||||
|
RIGHTMARGIN, 115
|
||||||
|
TOPMARGIN, 7
|
||||||
|
BOTTOMMARGIN, 66
|
||||||
|
END
|
||||||
|
END
|
||||||
|
#endif // APSTUDIO_INVOKED
|
||||||
|
|
||||||
|
#endif // Ðóññêèé (Ðîññèÿ) resources
|
||||||
|
/////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
|
||||||
/////////////////////////////////////////////////////////////////////////////
|
/////////////////////////////////////////////////////////////////////////////
|
||||||
// Àíãëèéñêèé (ÑØÀ) resources
|
// Àíãëèéñêèé (ÑØÀ) resources
|
||||||
|
|
||||||
|
|
|
@ -180,6 +180,8 @@
|
||||||
#define IDB_BITMAP18 181
|
#define IDB_BITMAP18 181
|
||||||
#define IDB_BITMAP19 182
|
#define IDB_BITMAP19 182
|
||||||
#define IDB_BRANCH_SPRITESHEET 184
|
#define IDB_BRANCH_SPRITESHEET 184
|
||||||
|
#define IDD_DIALOG4 185
|
||||||
|
#define IDD_TASEDIT_EXPORT 185
|
||||||
#define MENU_RESET 200
|
#define MENU_RESET 200
|
||||||
#define BUTTON_ROMS 200
|
#define BUTTON_ROMS 200
|
||||||
#define TXT_PAD1 200
|
#define TXT_PAD1 200
|
||||||
|
@ -535,6 +537,9 @@
|
||||||
#define CHECK_TURBO_SEEK 1266
|
#define CHECK_TURBO_SEEK 1266
|
||||||
#define IDC_TEXT_SELECTION 1267
|
#define IDC_TEXT_SELECTION 1267
|
||||||
#define IDC_TEXT_CLIPBOARD 1268
|
#define IDC_TEXT_CLIPBOARD 1268
|
||||||
|
#define IDC_RADIO_1PLAYER 1269
|
||||||
|
#define IDC_RADIO_2PLAYERS 1270
|
||||||
|
#define IDC_RADIO_FOURSCORE 1271
|
||||||
#define MENU_NETWORK 40040
|
#define MENU_NETWORK 40040
|
||||||
#define MENU_PALETTE 40041
|
#define MENU_PALETTE 40041
|
||||||
#define MENU_SOUND 40042
|
#define MENU_SOUND 40042
|
||||||
|
@ -924,9 +929,9 @@
|
||||||
//
|
//
|
||||||
#ifdef APSTUDIO_INVOKED
|
#ifdef APSTUDIO_INVOKED
|
||||||
#ifndef APSTUDIO_READONLY_SYMBOLS
|
#ifndef APSTUDIO_READONLY_SYMBOLS
|
||||||
#define _APS_NEXT_RESOURCE_VALUE 185
|
#define _APS_NEXT_RESOURCE_VALUE 186
|
||||||
#define _APS_NEXT_COMMAND_VALUE 40501
|
#define _APS_NEXT_COMMAND_VALUE 40501
|
||||||
#define _APS_NEXT_CONTROL_VALUE 1269
|
#define _APS_NEXT_CONTROL_VALUE 1270
|
||||||
#define _APS_NEXT_SYMED_VALUE 101
|
#define _APS_NEXT_SYMED_VALUE 101
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -61,6 +61,7 @@ int TASEdit_autosave_period = AUTOSAVE_PERIOD_DEFAULT;
|
||||||
extern bool muteTurbo;
|
extern bool muteTurbo;
|
||||||
bool TASEdit_enable_hot_changes = true;
|
bool TASEdit_enable_hot_changes = true;
|
||||||
bool TASEdit_jump_to_undo = true;
|
bool TASEdit_jump_to_undo = true;
|
||||||
|
int TASEdit_last_export_type = EXPORT_TYPE_1P;
|
||||||
|
|
||||||
// resources
|
// resources
|
||||||
string tasedithelp = "{16CDE0C4-02B0-4A60-A88D-076319909A4D}"; //Name of TASEdit Help page
|
string tasedithelp = "{16CDE0C4-02B0-4A60-A88D-076319909A4D}"; //Name of TASEdit Help page
|
||||||
|
@ -766,7 +767,7 @@ void OpenProject()
|
||||||
{
|
{
|
||||||
if (!AskSaveProject()) return;
|
if (!AskSaveProject()) return;
|
||||||
|
|
||||||
const char TPfilter[]="TASEdit Project (*.tas)\0*.tas\0\0";
|
const char TPfilter[]="TASEdit Project (*.tas)\0*.tas\0\0";
|
||||||
|
|
||||||
OPENFILENAME ofn;
|
OPENFILENAME ofn;
|
||||||
memset(&ofn,0,sizeof(ofn));
|
memset(&ofn,0,sizeof(ofn));
|
||||||
|
@ -780,10 +781,10 @@ void OpenProject()
|
||||||
strcpy(nameo, mass_replace(GetRomName(),"|",".").c_str()); //convert | to . for archive filenames
|
strcpy(nameo, mass_replace(GetRomName(),"|",".").c_str()); //convert | to . for archive filenames
|
||||||
|
|
||||||
ofn.lpstrFile=nameo;
|
ofn.lpstrFile=nameo;
|
||||||
ofn.nMaxFile=256;
|
ofn.nMaxFile = 2048;
|
||||||
ofn.Flags=OFN_EXPLORER|OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT|OFN_FILEMUSTEXIST;
|
ofn.Flags=OFN_EXPLORER|OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT|OFN_FILEMUSTEXIST;
|
||||||
string initdir = FCEU_GetPath(FCEUMKF_MOVIE);
|
string initdir = FCEU_GetPath(FCEUMKF_MOVIE);
|
||||||
ofn.lpstrInitialDir=initdir.c_str();
|
ofn.lpstrInitialDir = initdir.c_str();
|
||||||
|
|
||||||
if(GetOpenFileName(&ofn)) //If it is a valid filename
|
if(GetOpenFileName(&ofn)) //If it is a valid filename
|
||||||
{
|
{
|
||||||
|
@ -815,24 +816,23 @@ void OpenProject()
|
||||||
// Saves current project
|
// Saves current project
|
||||||
bool SaveProjectAs()
|
bool SaveProjectAs()
|
||||||
{
|
{
|
||||||
const char TPfilter[]="TASEdit Project (*.tas)\0*.tas\0All Files (*.*)\0*.*\0\0"; //Filetype filter
|
const char filter[]="TASEdit Project (*.tas)\0*.tas\0All Files (*.*)\0*.*\0\0";
|
||||||
|
|
||||||
OPENFILENAME ofn;
|
OPENFILENAME ofn;
|
||||||
memset(&ofn,0,sizeof(ofn));
|
memset(&ofn, 0, sizeof(ofn));
|
||||||
ofn.lStructSize=sizeof(ofn);
|
ofn.lStructSize = sizeof(ofn);
|
||||||
ofn.hwndOwner = hwndTasEdit;
|
ofn.hwndOwner = hwndTasEdit;
|
||||||
ofn.hInstance=fceu_hInstance;
|
ofn.hInstance = fceu_hInstance;
|
||||||
ofn.lpstrTitle="Save TASEdit Project As...";
|
ofn.lpstrTitle = "Save TASEdit Project As...";
|
||||||
ofn.lpstrFilter=TPfilter;
|
ofn.lpstrFilter = filter;
|
||||||
|
|
||||||
char nameo[2048];
|
char nameo[2048];
|
||||||
strcpy(nameo, mass_replace(GetRomName(),"|",".").c_str()); //convert | to . for archive filenames
|
strcpy(nameo, mass_replace(GetRomName(),"|",".").c_str()); //convert | to . for archive filenames
|
||||||
ofn.lpstrFile = nameo;
|
ofn.lpstrFile = nameo;
|
||||||
ofn.lpstrDefExt="tas";
|
ofn.lpstrDefExt = "tas";
|
||||||
ofn.nMaxFile=256;
|
ofn.nMaxFile = 2048;
|
||||||
ofn.Flags=OFN_EXPLORER|OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT;
|
ofn.Flags = OFN_EXPLORER|OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT;
|
||||||
string initdir = FCEU_GetPath(FCEUMKF_MOVIE); //Initial directory
|
string initdir = FCEU_GetPath(FCEUMKF_MOVIE); //Initial directory
|
||||||
ofn.lpstrInitialDir=initdir.c_str();
|
ofn.lpstrInitialDir = initdir.c_str();
|
||||||
|
|
||||||
if(GetSaveFileName(&ofn)) //If it is a valid filename
|
if(GetSaveFileName(&ofn)) //If it is a valid filename
|
||||||
{
|
{
|
||||||
|
@ -877,36 +877,142 @@ bool AskSaveProject()
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
extern bool LoadFM2(MovieData& movieData, EMUFILE* fp, int size, bool stopAfterHeader);
|
||||||
void Import()
|
void Import()
|
||||||
{
|
{
|
||||||
|
const char filter[] = "FCEUX Movie Files, TASEdit Projects\0*.fm2;*.tas\0All Files (*.*)\0*.*\0\0";
|
||||||
|
OPENFILENAME ofn;
|
||||||
|
memset(&ofn, 0, sizeof(ofn));
|
||||||
|
ofn.lStructSize = sizeof(ofn);
|
||||||
|
ofn.hwndOwner = hwndTasEdit;
|
||||||
|
ofn.hInstance = fceu_hInstance;
|
||||||
|
ofn.lpstrTitle = "Import";
|
||||||
|
ofn.lpstrFilter = filter;
|
||||||
|
char nameo[2048] = {0};
|
||||||
|
ofn.lpstrFile = nameo;
|
||||||
|
ofn.nMaxFile = 2048;
|
||||||
|
ofn.Flags = OFN_EXPLORER|OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT|OFN_FILEMUSTEXIST;
|
||||||
|
string initdir = FCEU_GetPath(FCEUMKF_MOVIE);
|
||||||
|
ofn.lpstrInitialDir = initdir.c_str();
|
||||||
|
|
||||||
|
if(GetOpenFileName(&ofn))
|
||||||
|
{
|
||||||
|
EMUFILE_FILE ifs(nameo, "rb");
|
||||||
|
// Load input to temporary moviedata
|
||||||
|
MovieData md;
|
||||||
|
if (LoadFM2(md, &ifs, ifs.size(), false))
|
||||||
|
{
|
||||||
|
// loaded successfully, now register changes
|
||||||
|
char drv[512], dir[512], name[1024], ext[512];
|
||||||
|
splitpath(nameo, drv, dir, name, ext);
|
||||||
|
strcat(name, ext);
|
||||||
|
history.RegisterImport(md, name);
|
||||||
|
} else
|
||||||
|
{
|
||||||
|
FCEUD_PrintError("Error loading movie data!");
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
BOOL CALLBACK ExportProc(HWND hwndDlg, UINT message, WPARAM wParam, LPARAM lParam)
|
||||||
|
{
|
||||||
|
switch (message)
|
||||||
|
{
|
||||||
|
case WM_INITDIALOG:
|
||||||
|
SetWindowPos(hwndDlg, 0, TasEdit_wndx + 100, TasEdit_wndy + 200, 0, 0, SWP_NOSIZE | SWP_NOZORDER | SWP_NOOWNERZORDER);
|
||||||
|
switch (TASEdit_last_export_type)
|
||||||
|
{
|
||||||
|
case EXPORT_TYPE_1P:
|
||||||
|
{
|
||||||
|
Button_SetCheck(GetDlgItem(hwndDlg, IDC_RADIO_1PLAYER), BST_CHECKED);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case EXPORT_TYPE_2P:
|
||||||
|
{
|
||||||
|
Button_SetCheck(GetDlgItem(hwndDlg, IDC_RADIO_2PLAYERS), BST_CHECKED);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case EXPORT_TYPE_FOURSCORE:
|
||||||
|
{
|
||||||
|
Button_SetCheck(GetDlgItem(hwndDlg, IDC_RADIO_FOURSCORE), BST_CHECKED);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return TRUE;
|
||||||
|
case WM_COMMAND:
|
||||||
|
switch (LOWORD(wParam))
|
||||||
|
{
|
||||||
|
case IDC_RADIO_1PLAYER:
|
||||||
|
TASEdit_last_export_type = EXPORT_TYPE_1P;
|
||||||
|
break;
|
||||||
|
case IDC_RADIO_2PLAYERS:
|
||||||
|
TASEdit_last_export_type = EXPORT_TYPE_2P;
|
||||||
|
break;
|
||||||
|
case IDC_RADIO_FOURSCORE:
|
||||||
|
TASEdit_last_export_type = EXPORT_TYPE_FOURSCORE;
|
||||||
|
break;
|
||||||
|
case IDOK:
|
||||||
|
EndDialog(hwndDlg, 1);
|
||||||
|
return TRUE;
|
||||||
|
case IDCANCEL:
|
||||||
|
EndDialog(hwndDlg, 0);
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
void Export()
|
void Export()
|
||||||
{
|
{
|
||||||
//TODO: redesign this
|
if (DialogBox(fceu_hInstance, MAKEINTRESOURCE(IDD_TASEDIT_EXPORT), hwndTasEdit, ExportProc) > 0)
|
||||||
//Dump project header info into file, then comments & subtitles, then input log
|
|
||||||
//This will require special prunctions, ::DumpHeader ::DumpComments etc
|
|
||||||
const char filter[]="FCEUX Movie File (*.fm2)\0*.fm2\0All Files (*.*)\0*.*\0\0";
|
|
||||||
char fname[2048] = {0};
|
|
||||||
OPENFILENAME ofn;
|
|
||||||
memset(&ofn,0,sizeof(ofn));
|
|
||||||
ofn.lStructSize=sizeof(ofn);
|
|
||||||
ofn.hwndOwner = hwndTasEdit;
|
|
||||||
ofn.hInstance=fceu_hInstance;
|
|
||||||
ofn.lpstrTitle="Export TAS as...";
|
|
||||||
ofn.lpstrFilter=filter;
|
|
||||||
ofn.lpstrFile=fname;
|
|
||||||
ofn.lpstrDefExt="fm2";
|
|
||||||
ofn.nMaxFile=256;
|
|
||||||
std::string initdir = FCEU_GetPath(FCEUMKF_MOVIE);
|
|
||||||
ofn.lpstrInitialDir=initdir.c_str();
|
|
||||||
if(GetSaveFileName(&ofn))
|
|
||||||
{
|
{
|
||||||
EMUFILE* osRecordingMovie = FCEUD_UTF8_fstream(fname, "wb");
|
const char filter[] = "FCEUX Movie File (*.fm2)\0*.fm2\0All Files (*.*)\0*.*\0\0";
|
||||||
currMovieData.dump(osRecordingMovie,false);
|
char fname[2048] = {0};
|
||||||
delete osRecordingMovie;
|
OPENFILENAME ofn;
|
||||||
osRecordingMovie = 0;
|
memset(&ofn, 0, sizeof(ofn));
|
||||||
|
ofn.lStructSize = sizeof(ofn);
|
||||||
|
ofn.hwndOwner = hwndTasEdit;
|
||||||
|
ofn.hInstance = fceu_hInstance;
|
||||||
|
ofn.lpstrTitle = "Export to FM2";
|
||||||
|
ofn.lpstrFilter = filter;
|
||||||
|
ofn.lpstrFile = fname;
|
||||||
|
ofn.lpstrDefExt = "fm2";
|
||||||
|
ofn.nMaxFile = 2048;
|
||||||
|
ofn.Flags = OFN_EXPLORER|OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT;
|
||||||
|
std::string initdir = FCEU_GetPath(FCEUMKF_MOVIE);
|
||||||
|
ofn.lpstrInitialDir = initdir.c_str();
|
||||||
|
if(GetSaveFileName(&ofn))
|
||||||
|
{
|
||||||
|
EMUFILE* osRecordingMovie = FCEUD_UTF8_fstream(fname, "wb");
|
||||||
|
// create copy of current movie data
|
||||||
|
MovieData temp_md = currMovieData;
|
||||||
|
// modify the copy according to selected type of export
|
||||||
|
switch (TASEdit_last_export_type)
|
||||||
|
{
|
||||||
|
case EXPORT_TYPE_1P:
|
||||||
|
{
|
||||||
|
temp_md.fourscore = false;
|
||||||
|
temp_md.ports[0] = SI_GAMEPAD;
|
||||||
|
temp_md.ports[1] = SI_NONE;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case EXPORT_TYPE_2P:
|
||||||
|
{
|
||||||
|
temp_md.fourscore = false;
|
||||||
|
temp_md.ports[0] = SI_GAMEPAD;
|
||||||
|
temp_md.ports[1] = SI_GAMEPAD;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case EXPORT_TYPE_FOURSCORE:
|
||||||
|
{
|
||||||
|
temp_md.fourscore = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
temp_md.dump(osRecordingMovie, false);
|
||||||
|
delete osRecordingMovie;
|
||||||
|
osRecordingMovie = 0;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -926,10 +1032,10 @@ BOOL CALLBACK WndprocTasEdit(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lPar
|
||||||
if (!IsIconic(hwndDlg))
|
if (!IsIconic(hwndDlg))
|
||||||
{
|
{
|
||||||
RECT wrect;
|
RECT wrect;
|
||||||
GetWindowRect(hwndDlg,&wrect);
|
GetWindowRect(hwndDlg, &wrect);
|
||||||
TasEdit_wndx = wrect.left;
|
TasEdit_wndx = wrect.left;
|
||||||
TasEdit_wndy = wrect.top;
|
TasEdit_wndy = wrect.top;
|
||||||
WindowBoundsCheckNoResize(TasEdit_wndx,TasEdit_wndy,wrect.right);
|
WindowBoundsCheckNoResize(TasEdit_wndx, TasEdit_wndy, wrect.right);
|
||||||
// also move screenshot display if it's open
|
// also move screenshot display if it's open
|
||||||
screenshot_display.ParentWindowMoved();
|
screenshot_display.ParentWindowMoved();
|
||||||
}
|
}
|
||||||
|
@ -1422,8 +1528,7 @@ BOOL CALLBACK WndprocTasEdit(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lPar
|
||||||
void EnterTasEdit()
|
void EnterTasEdit()
|
||||||
{
|
{
|
||||||
if(!FCEU_IsValidUI(FCEUI_TASEDIT)) return;
|
if(!FCEU_IsValidUI(FCEUI_TASEDIT)) return;
|
||||||
// window stuff
|
if(!hwndTasEdit) hwndTasEdit = CreateDialog(fceu_hInstance,"TASEDIT", hAppWnd, WndprocTasEdit);
|
||||||
if(!hwndTasEdit) hwndTasEdit = CreateDialog(fceu_hInstance,"TASEDIT",hAppWnd,WndprocTasEdit);
|
|
||||||
if(hwndTasEdit)
|
if(hwndTasEdit)
|
||||||
{
|
{
|
||||||
// save "eoptions"
|
// save "eoptions"
|
||||||
|
|
|
@ -10,6 +10,10 @@
|
||||||
#define AUTOSAVE_PERIOD_MAX 60 // 1 hour
|
#define AUTOSAVE_PERIOD_MAX 60 // 1 hour
|
||||||
#define AUTOSAVE_PERIOD_DEFAULT 10 // in minutes
|
#define AUTOSAVE_PERIOD_DEFAULT 10 // in minutes
|
||||||
|
|
||||||
|
#define EXPORT_TYPE_1P 0
|
||||||
|
#define EXPORT_TYPE_2P 1
|
||||||
|
#define EXPORT_TYPE_FOURSCORE 2
|
||||||
|
|
||||||
enum ECONTEXTMENU
|
enum ECONTEXTMENU
|
||||||
{
|
{
|
||||||
CONTEXTMENU_STRAY = 0,
|
CONTEXTMENU_STRAY = 0,
|
||||||
|
|
|
@ -9,11 +9,6 @@
|
||||||
#define SCREENSHOT_HEIGHT 240
|
#define SCREENSHOT_HEIGHT 240
|
||||||
#define SCREENSHOT_SIZE SCREENSHOT_WIDTH * SCREENSHOT_HEIGHT
|
#define SCREENSHOT_SIZE SCREENSHOT_WIDTH * SCREENSHOT_HEIGHT
|
||||||
|
|
||||||
#define PARENT_RELATION_SAME 0 // Yellow-blue: this child has absolutely the same input as its parent, although maybe different jump_frame. Input sizes must be equal too.
|
|
||||||
#define PARENT_RELATION_DIRECT 1 // Green-blue: the child has the same input at least until parent's jump_frame. Child's jump_frame can be higher or lower than parent's jump_frame (doesn't matter), but if child's input is shorter than parent's input, it is considered different if parent has non-null input after child's input ends.
|
|
||||||
#define PARENT_RELATION_ORPHAN 2 // Red-blue: child has different input before parent's jump_frame, so their inheritance may be illogical.
|
|
||||||
#define PARENT_RELATION_ATTACHED 3 // Blue: normal parent was lost due to different input before its jump_frame, so new parent was found. Essentially this is the same as PARENT_RELATION_DIRECT, but this also adds small notification that parent was inherited by autofinding system rather that by normal chain of user-made events (this notification may be useful for something).
|
|
||||||
|
|
||||||
class BOOKMARK
|
class BOOKMARK
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
|
@ -34,7 +29,6 @@ public:
|
||||||
std::vector<uint8> savestate;
|
std::vector<uint8> savestate;
|
||||||
std::vector<uint8> saved_screenshot;
|
std::vector<uint8> saved_screenshot;
|
||||||
int parent_branch;
|
int parent_branch;
|
||||||
int parent_relation;
|
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
||||||
|
|
|
@ -434,7 +434,6 @@ void BOOKMARKS::unleash(int slot)
|
||||||
if (first_change >= 0)
|
if (first_change >= 0)
|
||||||
{
|
{
|
||||||
// restore entire movie
|
// restore entire movie
|
||||||
currMovieData.records.resize(bookmarks_array[slot].snapshot.size);
|
|
||||||
bookmarks_array[slot].snapshot.toMovie(currMovieData, first_change);
|
bookmarks_array[slot].snapshot.toMovie(currMovieData, first_change);
|
||||||
tasedit_list.update();
|
tasedit_list.update();
|
||||||
history.RegisterBranching(MODTYPE_BRANCH_0 + slot, first_change, slot);
|
history.RegisterBranching(MODTYPE_BRANCH_0 + slot, first_change, slot);
|
||||||
|
|
|
@ -70,7 +70,7 @@ void INPUT_HISTORY::init(int new_size)
|
||||||
hwndHistoryList_oldWndProc = (WNDPROC)SetWindowLong(hwndHistoryList, GWL_WNDPROC, (LONG)HistoryListWndProc);
|
hwndHistoryList_oldWndProc = (WNDPROC)SetWindowLong(hwndHistoryList, GWL_WNDPROC, (LONG)HistoryListWndProc);
|
||||||
LVCOLUMN lvc;
|
LVCOLUMN lvc;
|
||||||
lvc.mask = LVCF_WIDTH | LVCF_FMT;
|
lvc.mask = LVCF_WIDTH | LVCF_FMT;
|
||||||
lvc.cx = 200;
|
lvc.cx = 500;
|
||||||
lvc.fmt = LVCFMT_LEFT;
|
lvc.fmt = LVCFMT_LEFT;
|
||||||
ListView_InsertColumn(hwndHistoryList, 0, &lvc);
|
ListView_InsertColumn(hwndHistoryList, 0, &lvc);
|
||||||
// init vars
|
// init vars
|
||||||
|
@ -158,7 +158,6 @@ int INPUT_HISTORY::jump(int new_pos)
|
||||||
int first_change = input_snapshots[real_pos].findFirstChange(currMovieData);
|
int first_change = input_snapshots[real_pos].findFirstChange(currMovieData);
|
||||||
if (first_change >= 0)
|
if (first_change >= 0)
|
||||||
{
|
{
|
||||||
currMovieData.records.resize(input_snapshots[real_pos].size);
|
|
||||||
input_snapshots[real_pos].toMovie(currMovieData, first_change);
|
input_snapshots[real_pos].toMovie(currMovieData, first_change);
|
||||||
bookmarks.ChangesMadeSinceBranch();
|
bookmarks.ChangesMadeSinceBranch();
|
||||||
// list will be redrawn by greenzone invalidation
|
// list will be redrawn by greenzone invalidation
|
||||||
|
@ -259,7 +258,7 @@ int INPUT_HISTORY::RegisterChanges(int mod_type, int start, int end)
|
||||||
return -1;
|
return -1;
|
||||||
} else
|
} else
|
||||||
{
|
{
|
||||||
// all other types of modification:
|
// other types of modification:
|
||||||
// check if there are input differences from latest snapshot
|
// check if there are input differences from latest snapshot
|
||||||
int real_pos = (history_start_pos + history_cursor_pos) % history_size;
|
int real_pos = (history_start_pos + history_cursor_pos) % history_size;
|
||||||
int first_changes = inp.findFirstChange(input_snapshots[real_pos], start, end);
|
int first_changes = inp.findFirstChange(input_snapshots[real_pos], start, end);
|
||||||
|
@ -276,7 +275,6 @@ int INPUT_HISTORY::RegisterChanges(int mod_type, int start, int end)
|
||||||
case MODTYPE_TRUNCATE:
|
case MODTYPE_TRUNCATE:
|
||||||
case MODTYPE_CLEAR:
|
case MODTYPE_CLEAR:
|
||||||
case MODTYPE_CUT:
|
case MODTYPE_CUT:
|
||||||
case MODTYPE_IMPORT:
|
|
||||||
{
|
{
|
||||||
inp.jump_frame = first_changes;
|
inp.jump_frame = first_changes;
|
||||||
break;
|
break;
|
||||||
|
@ -332,10 +330,6 @@ int INPUT_HISTORY::RegisterChanges(int mod_type, int start, int end)
|
||||||
inp.copyHotChanges(&input_snapshots[real_pos]);
|
inp.copyHotChanges(&input_snapshots[real_pos]);
|
||||||
// do not add new hotchanges and do not fade old hotchanges, because there was nothing added
|
// do not add new hotchanges and do not fade old hotchanges, because there was nothing added
|
||||||
break;
|
break;
|
||||||
case MODTYPE_IMPORT:
|
|
||||||
// do not inherit old hotchanges, because imported input (most likely) doesn't have direct connection with recent edits, so old hotchanges are irrelevant and should not be copied
|
|
||||||
inp.fillHotChanges(input_snapshots[real_pos], first_changes, end);
|
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
AddInputSnapshotToHistory(inp);
|
AddInputSnapshotToHistory(inp);
|
||||||
|
@ -445,6 +439,40 @@ void INPUT_HISTORY::RegisterRecording(int frame_of_change)
|
||||||
}
|
}
|
||||||
bookmarks.ChangesMadeSinceBranch();
|
bookmarks.ChangesMadeSinceBranch();
|
||||||
}
|
}
|
||||||
|
void INPUT_HISTORY::RegisterImport(MovieData& md, char* filename)
|
||||||
|
{
|
||||||
|
// create new input snapshot
|
||||||
|
INPUT_SNAPSHOT inp;
|
||||||
|
inp.init(md, TASEdit_enable_hot_changes, (currMovieData.fourscore)?FOURSCORE:NORMAL_2JOYPADS);
|
||||||
|
// check if there are input differences from latest snapshot
|
||||||
|
int real_pos = (history_start_pos + history_cursor_pos) % history_size;
|
||||||
|
int first_changes = inp.findFirstChange(input_snapshots[real_pos]);
|
||||||
|
if (first_changes >= 0)
|
||||||
|
{
|
||||||
|
// differences found
|
||||||
|
inp.mod_type = MODTYPE_IMPORT;
|
||||||
|
inp.jump_frame = first_changes;
|
||||||
|
// fill description:
|
||||||
|
strcat(inp.description, modCaptions[inp.mod_type]);
|
||||||
|
// add filename to description
|
||||||
|
strcat(inp.description, " ");
|
||||||
|
strncat(inp.description, filename, SNAPSHOT_DESC_MAX_LENGTH - strlen(inp.description) - 1);
|
||||||
|
if (TASEdit_enable_hot_changes)
|
||||||
|
{
|
||||||
|
// do not inherit old hotchanges, because imported input (most likely) doesn't have direct connection with recent edits, so old hotchanges are irrelevant and should not be copied
|
||||||
|
inp.fillHotChanges(input_snapshots[real_pos], first_changes);
|
||||||
|
}
|
||||||
|
AddInputSnapshotToHistory(inp);
|
||||||
|
inp.toMovie(currMovieData);
|
||||||
|
tasedit_list.update();
|
||||||
|
bookmarks.ChangesMadeSinceBranch();
|
||||||
|
project.SetProjectChanged();
|
||||||
|
greenzone.InvalidateAndCheck(first_changes);
|
||||||
|
} else
|
||||||
|
{
|
||||||
|
MessageBox(hwndTasEdit, "Imported movie has the same input.\nNo changes were made.", "TAS Editor", MB_OK);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void INPUT_HISTORY::save(EMUFILE *os)
|
void INPUT_HISTORY::save(EMUFILE *os)
|
||||||
{
|
{
|
||||||
|
|
|
@ -65,6 +65,7 @@ public:
|
||||||
int RegisterChanges(int mod_type, int start = 0, int end =-1);
|
int RegisterChanges(int mod_type, int start = 0, int end =-1);
|
||||||
void RegisterBranching(int mod_type, int first_change, int slot);
|
void RegisterBranching(int mod_type, int first_change, int slot);
|
||||||
void RegisterRecording(int frame_of_change);
|
void RegisterRecording(int frame_of_change);
|
||||||
|
void RegisterImport(MovieData& md, char* filename);
|
||||||
|
|
||||||
INPUT_SNAPSHOT& GetCurrentSnapshot();
|
INPUT_SNAPSHOT& GetCurrentSnapshot();
|
||||||
INPUT_SNAPSHOT& GetNextToCurrentSnapshot();
|
INPUT_SNAPSHOT& GetNextToCurrentSnapshot();
|
||||||
|
|
|
@ -14,17 +14,20 @@ INPUT_SNAPSHOT::INPUT_SNAPSHOT()
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
void INPUT_SNAPSHOT::init(MovieData& md, bool hotchanges)
|
void INPUT_SNAPSHOT::init(MovieData& md, bool hotchanges, int force_input_type)
|
||||||
{
|
{
|
||||||
has_hot_changes = hotchanges;
|
has_hot_changes = hotchanges;
|
||||||
already_compressed = false;
|
if (force_input_type < 0)
|
||||||
|
input_type = (md.fourscore)?FOURSCORE:NORMAL_2JOYPADS;
|
||||||
|
else
|
||||||
|
input_type = force_input_type;
|
||||||
// retrieve input data from movie data
|
// retrieve input data from movie data
|
||||||
size = md.getNumRecords();
|
size = md.getNumRecords();
|
||||||
input_type = (md.fourscore)?1:0;
|
|
||||||
joysticks.resize(bytes_per_frame[input_type] * size); // it's much faster to have this format than have [frame][joy] or other structures
|
joysticks.resize(bytes_per_frame[input_type] * size); // it's much faster to have this format than have [frame][joy] or other structures
|
||||||
commands.resize(size);
|
commands.resize(size);
|
||||||
if (has_hot_changes)
|
if (has_hot_changes)
|
||||||
hot_changes.resize(bytes_per_frame[input_type] * size * HOTCHANGE_BYTES_PER_JOY);
|
hot_changes.resize(bytes_per_frame[input_type] * size * HOTCHANGE_BYTES_PER_JOY);
|
||||||
|
|
||||||
// fill input vector
|
// fill input vector
|
||||||
int pos = 0;
|
int pos = 0;
|
||||||
switch(input_type)
|
switch(input_type)
|
||||||
|
@ -52,9 +55,14 @@ void INPUT_SNAPSHOT::init(MovieData& md, bool hotchanges)
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// make a copy of markers.markers_array
|
// make a copy of markers.markers_array
|
||||||
markers.MakeCopy(markers_array);
|
markers.MakeCopy(markers_array);
|
||||||
|
if ((int)markers_array.size() < size)
|
||||||
|
markers_array.resize(size);
|
||||||
|
|
||||||
coherent = true;
|
coherent = true;
|
||||||
|
already_compressed = false;
|
||||||
// save time to description
|
// save time to description
|
||||||
time_t raw_time;
|
time_t raw_time;
|
||||||
time(&raw_time);
|
time(&raw_time);
|
||||||
|
@ -71,6 +79,7 @@ void INPUT_SNAPSHOT::toMovie(MovieData& md, int start, int end)
|
||||||
{
|
{
|
||||||
if (end < 0) end = size-1;
|
if (end < 0) end = size-1;
|
||||||
// write input data to movie data
|
// write input data to movie data
|
||||||
|
md.records.resize(size);
|
||||||
switch(input_type)
|
switch(input_type)
|
||||||
{
|
{
|
||||||
case FOURSCORE:
|
case FOURSCORE:
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
//Specification file for Input Snapshot class
|
//Specification file for Input Snapshot class
|
||||||
|
|
||||||
#define HOTCHANGE_BYTES_PER_JOY 4
|
#define HOTCHANGE_BYTES_PER_JOY 4
|
||||||
#define SNAPSHOT_DESC_MAX_LENGTH 50
|
#define SNAPSHOT_DESC_MAX_LENGTH 100
|
||||||
|
|
||||||
#define NUM_SUPPORTED_INPUT_TYPES 2
|
#define NUM_SUPPORTED_INPUT_TYPES 2
|
||||||
#define NORMAL_2JOYPADS 0
|
#define NORMAL_2JOYPADS 0
|
||||||
|
@ -11,7 +11,7 @@ class INPUT_SNAPSHOT
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
INPUT_SNAPSHOT();
|
INPUT_SNAPSHOT();
|
||||||
void init(MovieData& md, bool hotchanges);
|
void init(MovieData& md, bool hotchanges, int force_input_type = -1);
|
||||||
|
|
||||||
void toMovie(MovieData& md, int start = 0, int end = -1);
|
void toMovie(MovieData& md, int start = 0, int end = -1);
|
||||||
void toMarkers();
|
void toMarkers();
|
||||||
|
|
|
@ -72,7 +72,6 @@ void MARKERS::MakeCopy(std::vector<uint8> &destination_array)
|
||||||
destination_array = markers_array;
|
destination_array = markers_array;
|
||||||
// copy notes
|
// copy notes
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
void MARKERS::RestoreFromCopy(std::vector<uint8> &source_array, int until_frame)
|
void MARKERS::RestoreFromCopy(std::vector<uint8> &source_array, int until_frame)
|
||||||
{
|
{
|
||||||
|
@ -82,7 +81,7 @@ void MARKERS::RestoreFromCopy(std::vector<uint8> &source_array, int until_frame)
|
||||||
if ((int)markers_array.size() <= until_frame) markers_array.resize(until_frame+1);
|
if ((int)markers_array.size() <= until_frame) markers_array.resize(until_frame+1);
|
||||||
for (int i = until_frame; i >= 0; i--)
|
for (int i = until_frame; i >= 0; i--)
|
||||||
markers_array[i] = source_array[i];
|
markers_array[i] = source_array[i];
|
||||||
// restore notes
|
// restore some notes
|
||||||
|
|
||||||
} else
|
} else
|
||||||
{
|
{
|
||||||
|
|
|
@ -62,7 +62,7 @@ void SCREENSHOT_DISPLAY::init()
|
||||||
}
|
}
|
||||||
HDC win_hdc = GetWindowDC(tasedit_list.hwndList);
|
HDC win_hdc = GetWindowDC(tasedit_list.hwndList);
|
||||||
scr_bmp = CreateDIBSection(win_hdc, scr_bmi, DIB_RGB_COLORS, (void**)&scr_ptr, 0, 0);
|
scr_bmp = CreateDIBSection(win_hdc, scr_bmi, DIB_RGB_COLORS, (void**)&scr_ptr, 0, 0);
|
||||||
// calculate coordinates (relative to IDC_BOOKMARKS_BOX top-left corner)
|
// calculate coordinates (relative to IDC_BOOKMARKS_BOX)
|
||||||
RECT temp_rect, parent_rect;
|
RECT temp_rect, parent_rect;
|
||||||
GetWindowRect(hwndTasEdit, &parent_rect);
|
GetWindowRect(hwndTasEdit, &parent_rect);
|
||||||
GetWindowRect(GetDlgItem(hwndTasEdit, IDC_BOOKMARKS_BOX), &temp_rect);
|
GetWindowRect(GetDlgItem(hwndTasEdit, IDC_BOOKMARKS_BOX), &temp_rect);
|
||||||
|
|
|
@ -70,8 +70,6 @@ bool TASEDIT_PROJECT::saveProject()
|
||||||
}
|
}
|
||||||
|
|
||||||
extern bool LoadFM2(MovieData& movieData, EMUFILE* fp, int size, bool stopAfterHeader);
|
extern bool LoadFM2(MovieData& movieData, EMUFILE* fp, int size, bool stopAfterHeader);
|
||||||
|
|
||||||
|
|
||||||
bool TASEDIT_PROJECT::LoadProject(std::string PFN)
|
bool TASEDIT_PROJECT::LoadProject(std::string PFN)
|
||||||
{
|
{
|
||||||
const char* filename = PFN.c_str();
|
const char* filename = PFN.c_str();
|
||||||
|
@ -81,8 +79,14 @@ bool TASEDIT_PROJECT::LoadProject(std::string PFN)
|
||||||
FCEU_printf("\nLoading TASEdit project %s\n", filename);
|
FCEU_printf("\nLoading TASEdit project %s\n", filename);
|
||||||
|
|
||||||
bool error;
|
bool error;
|
||||||
LoadFM2(currMovieData, &ifs, ifs.size(), false);
|
if (LoadFM2(currMovieData, &ifs, ifs.size(), false))
|
||||||
LoadSubtitles(currMovieData);
|
{
|
||||||
|
LoadSubtitles(currMovieData);
|
||||||
|
} else
|
||||||
|
{
|
||||||
|
FCEU_printf("Error loading movie data\n");
|
||||||
|
error = true;
|
||||||
|
}
|
||||||
// try to load markers
|
// try to load markers
|
||||||
error = markers.load(&ifs);
|
error = markers.load(&ifs);
|
||||||
if (error)
|
if (error)
|
||||||
|
|
|
@ -776,7 +776,7 @@ struct EMUCMDTABLE FCEUI_CommandTable[]=
|
||||||
{ EMUCMD_TOOL_RAMSEARCHGTE, EMUCMDTYPE_TOOL, RamSearchOpGTE, 0, 0, "Ram Search - Greater Than or Equal", 0},
|
{ EMUCMD_TOOL_RAMSEARCHGTE, EMUCMDTYPE_TOOL, RamSearchOpGTE, 0, 0, "Ram Search - Greater Than or Equal", 0},
|
||||||
{ EMUCMD_TOOL_RAMSEARCHEQ, EMUCMDTYPE_TOOL, RamSearchOpEQ, 0, 0, "Ram Search - Equal", 0},
|
{ EMUCMD_TOOL_RAMSEARCHEQ, EMUCMDTYPE_TOOL, RamSearchOpEQ, 0, 0, "Ram Search - Equal", 0},
|
||||||
{ EMUCMD_TOOL_RAMSEARCHNE, EMUCMDTYPE_TOOL, RamSearchOpNE, 0, 0, "Ram Search - Not Equal", 0},
|
{ EMUCMD_TOOL_RAMSEARCHNE, EMUCMDTYPE_TOOL, RamSearchOpNE, 0, 0, "Ram Search - Not Equal", 0},
|
||||||
{ EMUCMD_TASEDIT_REWIND, EMUCMDTYPE_TOOL, TaseditRewindOn, TaseditRewindOff, 0, "Rewind Frame (TASEditor-only)", EMUCMDFLAG_TASEDIT},
|
{ EMUCMD_TASEDIT_REWIND, EMUCMDTYPE_MISC, TaseditRewindOn, TaseditRewindOff, 0, "Rewind Frame (TASEditor-only)", EMUCMDFLAG_TASEDIT},
|
||||||
{ EMUCMD_RERECORD_DISPLAY_TOGGLE, EMUCMDTYPE_MISC, FCEUI_MovieToggleRerecordDisplay, 0, 0, "Toggle Rerecord Display", EMUCMDFLAG_TASEDIT },
|
{ EMUCMD_RERECORD_DISPLAY_TOGGLE, EMUCMDTYPE_MISC, FCEUI_MovieToggleRerecordDisplay, 0, 0, "Toggle Rerecord Display", EMUCMDFLAG_TASEDIT },
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -349,11 +349,6 @@ void MovieRecord::dumpBinary(MovieData* md, EMUFILE* os, int index)
|
||||||
|
|
||||||
void MovieRecord::dump(MovieData* md, EMUFILE* os, int index)
|
void MovieRecord::dump(MovieData* md, EMUFILE* os, int index)
|
||||||
{
|
{
|
||||||
if (false/*currMovieData.binaryFlag*/)
|
|
||||||
{
|
|
||||||
dumpBinary(md, os, index);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
//dump the misc commands
|
//dump the misc commands
|
||||||
//*os << '|' << setw(1) << (int)commands;
|
//*os << '|' << setw(1) << (int)commands;
|
||||||
os->fputc('|');
|
os->fputc('|');
|
||||||
|
@ -491,7 +486,7 @@ int MovieData::dump(EMUFILE *os, bool binary)
|
||||||
if(binary)
|
if(binary)
|
||||||
os->fprintf("binary 1\n" );
|
os->fprintf("binary 1\n" );
|
||||||
|
|
||||||
if(savestate.size() != 0)
|
if(savestate.size())
|
||||||
os->fprintf("savestate %s\n" , BytesToString(&savestate[0],savestate.size()).c_str() );
|
os->fprintf("savestate %s\n" , BytesToString(&savestate[0],savestate.size()).c_str() );
|
||||||
|
|
||||||
if(FCEUMOV_Mode(MOVIEMODE_TASEDIT))
|
if(FCEUMOV_Mode(MOVIEMODE_TASEDIT))
|
||||||
|
@ -502,11 +497,12 @@ int MovieData::dump(EMUFILE *os, bool binary)
|
||||||
//put one | to start the binary dump
|
//put one | to start the binary dump
|
||||||
os->fputc('|');
|
os->fputc('|');
|
||||||
for(int i=0;i<(int)records.size();i++)
|
for(int i=0;i<(int)records.size();i++)
|
||||||
records[i].dumpBinary(this,os,i);
|
records[i].dumpBinary(this, os, i);
|
||||||
}
|
} else
|
||||||
else
|
{
|
||||||
for(int i=0;i<(int)records.size();i++)
|
for(int i=0;i<(int)records.size();i++)
|
||||||
records[i].dump(this,os,i);
|
records[i].dump(this, os, i);
|
||||||
|
}
|
||||||
|
|
||||||
int end = os->ftell();
|
int end = os->ftell();
|
||||||
return end-start;
|
return end-start;
|
||||||
|
@ -994,7 +990,7 @@ void FCEUMOV_AddInputState()
|
||||||
MovieRecord* mr = &currMovieData.records[currFrameCounter];
|
MovieRecord* mr = &currMovieData.records[currFrameCounter];
|
||||||
if(movie_readonly || turbo || playback.pause_frame > currFrameCounter)
|
if(movie_readonly || turbo || playback.pause_frame > currFrameCounter)
|
||||||
{
|
{
|
||||||
// do not record buttons
|
// replay buttons
|
||||||
if(mr->command_reset())
|
if(mr->command_reset())
|
||||||
ResetNES();
|
ResetNES();
|
||||||
if(mr->command_fds_insert())
|
if(mr->command_fds_insert())
|
||||||
|
@ -1360,7 +1356,7 @@ bool FCEUMOV_ReadState(EMUFILE* is, uint32 size)
|
||||||
if (currFrameCounter > (int)tempMovieData.records.size())
|
if (currFrameCounter > (int)tempMovieData.records.size())
|
||||||
{
|
{
|
||||||
//This is a post movie savestate, handle it differently
|
//This is a post movie savestate, handle it differently
|
||||||
//Recplae movie contents but then switch to movie finished mode
|
//Replace movie contents but then switch to movie finished mode
|
||||||
currMovieData = tempMovieData;
|
currMovieData = tempMovieData;
|
||||||
openRecordingMovie(curMovieFilename);
|
openRecordingMovie(curMovieFilename);
|
||||||
currMovieData.dump(osRecordingMovie, false/*currMovieData.binaryFlag*/);
|
currMovieData.dump(osRecordingMovie, false/*currMovieData.binaryFlag*/);
|
||||||
|
|
Loading…
Reference in New Issue