Replaying .tas files in FCEUX
This commit is contained in:
parent
5d3994c969
commit
eabf9a046b
|
@ -748,7 +748,7 @@ int main(int argc,char *argv[])
|
|||
if(FCEU_isFileInArchive(MovieToLoad))
|
||||
replayReadOnlySetting = true;
|
||||
|
||||
FCEUI_LoadMovie(MovieToLoad, replayReadOnlySetting, false, replayStopFrameSetting!=0);
|
||||
FCEUI_LoadMovie(MovieToLoad, replayReadOnlySetting, replayStopFrameSetting != 0);
|
||||
FCEUX_LoadMovieExtras(MovieToLoad);
|
||||
free(MovieToLoad);
|
||||
MovieToLoad = NULL;
|
||||
|
|
|
@ -7,7 +7,7 @@
|
|||
#include "archive.h"
|
||||
#include "utils/xstring.h"
|
||||
|
||||
static const char* fm2ext[] = {"fm2",0};
|
||||
static const char* fm2ext[] = { "fm2", "tas", 0};
|
||||
|
||||
int MetaPosX,MetaPosY;
|
||||
|
||||
|
@ -502,18 +502,6 @@ BOOL CALLBACK ReplayDialogProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lP
|
|||
{
|
||||
case WM_INITDIALOG:
|
||||
{
|
||||
bool tasedit = lParam?true:false;
|
||||
|
||||
//some of the controls are illogical with tasedit
|
||||
//remove them, and rename the window
|
||||
if(tasedit)
|
||||
{
|
||||
SetWindowText(hwndDlg,"Load TasEdit Movie");
|
||||
ShowWindow(GetDlgItem(hwndDlg,IDC_CHECK_READONLY),SW_HIDE);
|
||||
ShowWindow(GetDlgItem(hwndDlg,IDC_CHECK_STOPMOVIE),SW_HIDE);
|
||||
ShowWindow(GetDlgItem(hwndDlg,IDC_EDIT_STOPFRAME),SW_HIDE);
|
||||
}
|
||||
|
||||
SendDlgItemMessage(hwndDlg, IDC_CHECK_READONLY, BM_SETCHECK, replayReadOnlySetting?BST_CHECKED:BST_UNCHECKED, 0);
|
||||
SendDlgItemMessage(hwndDlg, IDC_CHECK_STOPMOVIE,BM_SETCHECK, BST_UNCHECKED, 0);
|
||||
|
||||
|
@ -564,15 +552,16 @@ BOOL CALLBACK ReplayDialogProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lP
|
|||
|
||||
//TODO - a big copy/pasted block below. factor out extension extractor or use another one
|
||||
|
||||
// filter out everything that's not an extension we like *.fm2
|
||||
// filter out everything that's not an extension we like (*.fm2 and *.tas)
|
||||
// (because FindFirstFile is too dumb to do that)
|
||||
{
|
||||
std::string ext = getExtension(wfd.cFileName);
|
||||
if(ext != "fm2")
|
||||
if(ext != "zip")
|
||||
if(ext != "rar")
|
||||
if(ext != "7z")
|
||||
continue;
|
||||
if(ext != "tas")
|
||||
if(ext != "zip")
|
||||
if(ext != "rar")
|
||||
if(ext != "7z")
|
||||
continue;
|
||||
}
|
||||
|
||||
char filename [512];
|
||||
|
@ -582,18 +571,23 @@ BOOL CALLBACK ReplayDialogProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lP
|
|||
SetCurrentDirectory(BaseDirectory.c_str());
|
||||
|
||||
ArchiveScanRecord asr = FCEUD_ScanArchive(filename);
|
||||
if(!asr.isArchive()) {
|
||||
if(!asr.isArchive())
|
||||
{
|
||||
FCEUFILE* fp = FCEU_fopen(filename,0,"rb",0);
|
||||
if(fp) {
|
||||
if(fp)
|
||||
{
|
||||
fp->stream = fp->stream->memwrap();
|
||||
HandleScan(hwndDlg,fp ,items);
|
||||
HandleScan(hwndDlg, fp, items);
|
||||
delete fp;
|
||||
}
|
||||
} else {
|
||||
} else
|
||||
{
|
||||
asr.files.FilterByExtension(fm2ext);
|
||||
for(uint32 i=0;i<asr.files.size();i++) {
|
||||
for(uint32 i=0;i<asr.files.size();i++)
|
||||
{
|
||||
FCEUFILE* fp = FCEU_fopen(filename,0,"rb",0,asr.files[i].index);
|
||||
if(fp) {
|
||||
if(fp)
|
||||
{
|
||||
HandleScan(hwndDlg,fp, items);
|
||||
delete fp;
|
||||
}
|
||||
|
@ -671,7 +665,7 @@ BOOL CALLBACK ReplayDialogProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lP
|
|||
memset(&ofn, 0, sizeof(ofn));
|
||||
ofn.lStructSize = sizeof(ofn);
|
||||
ofn.hwndOwner = hwndDlg;
|
||||
ofn.lpstrFilter = "FCEUX Movie Files (*.fm2)\0*.fm2\0Archive Files (*.zip,*.rar,*.7z)\0*.zip;*.rar;*.7z\0All Files (*.*)\0*.*\0\0";
|
||||
ofn.lpstrFilter = "FCEUX Movie Files (*.fm2), TAS Editor Projects (*.tas)\0*.fm2;*.tas\0FCEUX Movie Files (*.fm2)\0*.fm2\0Archive Files (*.zip,*.rar,*.7z)\0*.zip;*.rar;*.7z\0All Files (*.*)\0*.*\0\0";
|
||||
ofn.lpstrFile = szFile;
|
||||
ofn.nMaxFile = sizeof(szFile);
|
||||
ofn.lpstrInitialDir = pn;
|
||||
|
@ -984,18 +978,18 @@ void FCEUD_MovieRecordTo()
|
|||
}
|
||||
|
||||
|
||||
void Replay_LoadMovie(bool tasedit)
|
||||
void Replay_LoadMovie()
|
||||
{
|
||||
if (suggestReadOnlyReplay)
|
||||
replayReadOnlySetting = true;
|
||||
else
|
||||
replayReadOnlySetting = FCEUI_GetMovieToggleReadOnly();
|
||||
|
||||
char* fn = (char*)DialogBoxParam(fceu_hInstance, "IDD_REPLAYINP", hAppWnd, ReplayDialogProc, (LPARAM)(tasedit?1:0));
|
||||
char* fn = (char*)DialogBoxParam(fceu_hInstance, "IDD_REPLAYINP", hAppWnd, ReplayDialogProc, 0);
|
||||
|
||||
if(fn)
|
||||
{
|
||||
FCEUI_LoadMovie(fn, replayReadOnlySetting, tasedit, replayStopFrameSetting);
|
||||
FCEUI_LoadMovie(fn, replayReadOnlySetting, replayStopFrameSetting);
|
||||
|
||||
free(fn);
|
||||
|
||||
|
@ -1010,5 +1004,5 @@ void Replay_LoadMovie(bool tasedit)
|
|||
/// Show movie replay dialog and replay the movie if necessary.
|
||||
void FCEUD_MovieReplayFrom()
|
||||
{
|
||||
if (GameInfo) Replay_LoadMovie(false);
|
||||
if (GameInfo) Replay_LoadMovie();
|
||||
}
|
||||
|
|
|
@ -1,2 +1,2 @@
|
|||
void Replay_LoadMovie(bool tasedit);
|
||||
void Replay_LoadMovie();
|
||||
void UpdateReplayCommentsSubs(const char * fname);
|
|
@ -256,8 +256,8 @@ BEGIN
|
|||
END
|
||||
POPUP "&View"
|
||||
BEGIN
|
||||
MENUITEM "Highlight &Lag Frames", ID_VIEW_SHOW_LAG_FRAMES
|
||||
MENUITEM "Show &Markers", ID_VIEW_SHOW_MARKERS
|
||||
MENUITEM "Show &Lag Frames", ID_VIEW_SHOW_LAG_FRAMES
|
||||
MENUITEM "Highlight &Markers", ID_VIEW_SHOW_MARKERS
|
||||
MENUITEM "Display Branch &Screenshots", ID_VIEW_SHOWBRANCHSCREENSHOTS
|
||||
MENUITEM "Enable Hot &Changes", ID_VIEW_ENABLEHOTCHANGES
|
||||
MENUITEM SEPARATOR
|
||||
|
@ -1967,41 +1967,6 @@ 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
|
||||
|
||||
|
|
|
@ -1,6 +1,5 @@
|
|||
#include <fstream>
|
||||
#include <sstream>
|
||||
|
||||
#include "taseditlib/taseditproj.h"
|
||||
#include "utils/xstring.h"
|
||||
#include "Win32InputBox.h"
|
||||
|
@ -793,7 +792,7 @@ void OpenProject()
|
|||
|
||||
if(GetOpenFileName(&ofn)) // If it is a valid filename
|
||||
{
|
||||
// If they haven't put ".tas" after it, stick it on ourselves
|
||||
// If they haven't put ".tas", stick it on ourselves
|
||||
if (!strstr(nameo, ".tas"))
|
||||
strcat(nameo, ".tas");
|
||||
LoadProject(nameo);
|
||||
|
@ -1038,6 +1037,7 @@ void Export()
|
|||
break;
|
||||
}
|
||||
}
|
||||
temp_md.loadFrameCount = -1;
|
||||
// dump to disk
|
||||
temp_md.dump(osRecordingMovie, false);
|
||||
delete osRecordingMovie;
|
||||
|
@ -1269,14 +1269,12 @@ BOOL CALLBACK WndprocTasEdit(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lPar
|
|||
turbo = TASEdit_turbo_seek;
|
||||
break;
|
||||
case ID_VIEW_SHOW_LAG_FRAMES:
|
||||
//switch "Highlight lag frames" flag
|
||||
TASEdit_show_lag_frames ^= 1;
|
||||
CheckMenuItem(hmenu, ID_VIEW_SHOW_LAG_FRAMES, TASEdit_show_lag_frames?MF_CHECKED : MF_UNCHECKED);
|
||||
tasedit_list.RedrawList();
|
||||
bookmarks.RedrawBookmarksList();
|
||||
break;
|
||||
case ID_VIEW_SHOW_MARKERS:
|
||||
//switch "Show Markers" flag
|
||||
TASEdit_show_markers ^= 1;
|
||||
CheckMenuItem(hmenu, ID_VIEW_SHOW_MARKERS, TASEdit_show_markers?MF_CHECKED : MF_UNCHECKED);
|
||||
tasedit_list.RedrawList(); // no need to redraw Bookmarks, as Markers are only shown in main list
|
||||
|
@ -1564,9 +1562,9 @@ BOOL CALLBACK WndprocTasEdit(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lPar
|
|||
return FALSE;
|
||||
}
|
||||
|
||||
void EnterTasEdit()
|
||||
bool EnterTasEdit()
|
||||
{
|
||||
if(!FCEU_IsValidUI(FCEUI_TASEDIT)) return;
|
||||
if(!FCEU_IsValidUI(FCEUI_TASEDIT)) return false;
|
||||
if(!hwndTasEdit) hwndTasEdit = CreateDialog(fceu_hInstance,"TASEDIT", hAppWnd, WndprocTasEdit);
|
||||
if(hwndTasEdit)
|
||||
{
|
||||
|
@ -1648,7 +1646,8 @@ void EnterTasEdit()
|
|||
SetFocus(history.hwndHistoryList); // set focus only once, to show selection cursor
|
||||
SetFocus(tasedit_list.hwndList);
|
||||
FCEU_DispMessage("TAS Editor engaged", 0);
|
||||
}
|
||||
return true;
|
||||
} else return false;
|
||||
}
|
||||
|
||||
bool ExitTasEdit()
|
||||
|
|
|
@ -20,7 +20,7 @@ enum ECONTEXTMENU
|
|||
CONTEXTMENU_SELECTED = 1,
|
||||
};
|
||||
|
||||
void EnterTasEdit();
|
||||
bool EnterTasEdit();
|
||||
void InitDialog();
|
||||
bool ExitTasEdit();
|
||||
void UpdateTasEdit();
|
||||
|
|
|
@ -430,52 +430,49 @@ LONG TASEDIT_LIST::CustomDraw(NMLVCUSTOMDRAW* msg)
|
|||
cell_x = msg->iSubItem;
|
||||
cell_y = msg->nmcd.dwItemSpec;
|
||||
|
||||
|
||||
|
||||
if(cell_x > COLUMN_ICONS)
|
||||
{
|
||||
// text color
|
||||
if(TASEdit_enable_hot_changes && cell_x >= COLUMN_JOYPAD1_A && cell_x <= COLUMN_JOYPAD4_R)
|
||||
{
|
||||
msg->clrText = hot_changes_colors[history.GetCurrentSnapshot().GetHotChangeInfo(cell_y, cell_x - COLUMN_JOYPAD1_A)];
|
||||
} else msg->clrText = NORMAL_TEXT_COLOR;
|
||||
else
|
||||
msg->clrText = NORMAL_TEXT_COLOR;
|
||||
// bg color and text font
|
||||
if(cell_x == COLUMN_FRAMENUM || cell_x == COLUMN_FRAMENUM2)
|
||||
{
|
||||
// font
|
||||
if(markers.GetMarker(cell_y))
|
||||
SelectObject(msg->nmcd.hdc, hMainListSelectFont);
|
||||
else
|
||||
SelectObject(msg->nmcd.hdc, hMainListFont);
|
||||
// bg
|
||||
// frame number
|
||||
if (cell_y == history.GetUndoHint())
|
||||
{
|
||||
// undo hint here
|
||||
if(TASEdit_show_markers && markers.GetMarker(cell_y))
|
||||
if (TASEdit_show_markers && markers.GetMarker(cell_y))
|
||||
{
|
||||
SelectObject(msg->nmcd.hdc, hMainListSelectFont);
|
||||
msg->clrTextBk = MARKED_UNDOHINT_FRAMENUM_COLOR;
|
||||
} else
|
||||
{
|
||||
SelectObject(msg->nmcd.hdc, hMainListFont);
|
||||
msg->clrTextBk = UNDOHINT_FRAMENUM_COLOR;
|
||||
}
|
||||
} else if (cell_y == currFrameCounter || cell_y == (playback.GetPauseFrame() - 1))
|
||||
{
|
||||
// current frame
|
||||
if(TASEdit_show_markers && markers.GetMarker(cell_y))
|
||||
if (TASEdit_show_markers && markers.GetMarker(cell_y))
|
||||
{
|
||||
// this frame is also marked
|
||||
SelectObject(msg->nmcd.hdc, hMainListSelectFont);
|
||||
msg->clrTextBk = CUR_MARKED_FRAMENUM_COLOR;
|
||||
} else
|
||||
{
|
||||
SelectObject(msg->nmcd.hdc, hMainListFont);
|
||||
msg->clrTextBk = CUR_FRAMENUM_COLOR;
|
||||
}
|
||||
} else if(TASEdit_show_markers && markers.GetMarker(cell_y))
|
||||
} else if (TASEdit_show_markers && markers.GetMarker(cell_y))
|
||||
{
|
||||
// marked frame
|
||||
SelectObject(msg->nmcd.hdc, hMainListSelectFont);
|
||||
msg->clrTextBk = MARKED_FRAMENUM_COLOR;
|
||||
} else
|
||||
{
|
||||
SelectObject(msg->nmcd.hdc, hMainListFont);
|
||||
if(cell_y < greenzone.greenZoneCount)
|
||||
{
|
||||
if (!greenzone.savestates[cell_y].empty())
|
||||
|
@ -499,7 +496,9 @@ LONG TASEDIT_LIST::CustomDraw(NMLVCUSTOMDRAW* msg)
|
|||
} else if((cell_x - COLUMN_JOYPAD1_A) / NUM_JOYPAD_BUTTONS == 0 || (cell_x - COLUMN_JOYPAD1_A) / NUM_JOYPAD_BUTTONS == 2)
|
||||
{
|
||||
// pad 1 or 3
|
||||
// font
|
||||
SelectObject(msg->nmcd.hdc, hMainListFont);
|
||||
// bg
|
||||
if (cell_y == history.GetUndoHint())
|
||||
{
|
||||
// undo hint here
|
||||
|
@ -530,7 +529,9 @@ LONG TASEDIT_LIST::CustomDraw(NMLVCUSTOMDRAW* msg)
|
|||
} else if((cell_x - COLUMN_JOYPAD1_A) / NUM_JOYPAD_BUTTONS == 1 || (cell_x - COLUMN_JOYPAD1_A) / NUM_JOYPAD_BUTTONS == 3)
|
||||
{
|
||||
// pad 2 or 4
|
||||
// font
|
||||
SelectObject(msg->nmcd.hdc, hMainListFont);
|
||||
// bg
|
||||
if (cell_y == history.GetUndoHint())
|
||||
{
|
||||
// undo hint here
|
||||
|
|
|
@ -56,6 +56,7 @@ bool TASEDIT_PROJECT::save()
|
|||
const char* filename = PFN.c_str();
|
||||
EMUFILE_FILE* ofs = FCEUD_UTF8_fstream(filename,"wb");
|
||||
|
||||
currMovieData.loadFrameCount = currMovieData.records.size();
|
||||
currMovieData.dump(ofs, true);
|
||||
markers.save(ofs);
|
||||
bookmarks.save(ofs);
|
||||
|
|
|
@ -1458,9 +1458,10 @@ LRESULT FAR PASCAL AppWndProc(HWND hWnd,UINT msg,WPARAM wParam,LPARAM lParam)
|
|||
delete outf;
|
||||
if (!GameInfo) //If no game is loaded, load the Open Game dialog
|
||||
LoadNewGamey(hWnd, 0);
|
||||
FCEUI_LoadMovie(outname.c_str(), 1, false, false);
|
||||
FCEUI_LoadMovie(outname.c_str(), 1, false);
|
||||
FCEUX_LoadMovieExtras(outname.c_str());
|
||||
} else {
|
||||
} else
|
||||
{
|
||||
std::string msg = "Failure converting " + fileDropped + "\r\n\r\n" + EFCM_CONVERTRESULT_message(result);
|
||||
MessageBox(hWnd,msg.c_str(),"Failure converting fcm", 0);
|
||||
}
|
||||
|
@ -1481,8 +1482,24 @@ LRESULT FAR PASCAL AppWndProc(HWND hWnd,UINT msg,WPARAM wParam,LPARAM lParam)
|
|||
{
|
||||
if (!GameInfo) //If no game is loaded, load the Open Game dialog
|
||||
LoadNewGamey(hWnd, 0);
|
||||
if (GameInfo && !(fileDropped.find(".fm2") == string::npos)) { //.fm2 is at the end of the filename so that must be the extension
|
||||
FCEUI_LoadMovie(ftmp, 1, false, false); //We are convinced it is a movie file, attempt to load it
|
||||
if (GameInfo && !(fileDropped.find(".fm2") == string::npos))
|
||||
{
|
||||
//.fm2 is at the end of the filename so that must be the extension
|
||||
FCEUI_LoadMovie(ftmp, 1, false); //We are convinced it is a movie file, attempt to load it
|
||||
FCEUX_LoadMovieExtras(ftmp);
|
||||
}
|
||||
}
|
||||
//-------------------------------------------------------
|
||||
//Check if TAS Editor file
|
||||
//-------------------------------------------------------
|
||||
else if (!(fileDropped.find(".tas") == string::npos) && (fileDropped.find(".tas") == fileDropped.length()-4)) //ROM is already loaded and .tas in filename
|
||||
{
|
||||
if (!GameInfo) //If no game is loaded, load the Open Game dialog
|
||||
LoadNewGamey(hWnd, 0);
|
||||
if (GameInfo && !(fileDropped.find(".tas") == string::npos))
|
||||
{
|
||||
//.tas is at the end of the filename so that must be the extension
|
||||
FCEUI_LoadMovie(ftmp, 1, false); //We are convinced it is a TAS Editor project file, attempt to load and replay it
|
||||
FCEUX_LoadMovieExtras(ftmp);
|
||||
}
|
||||
}
|
||||
|
@ -1570,7 +1587,7 @@ LRESULT FAR PASCAL AppWndProc(HWND hWnd,UINT msg,WPARAM wParam,LPARAM lParam)
|
|||
char*& fname = recent_movie[wParam - MOVIE_FIRST_RECENT_FILE];
|
||||
if(fname)
|
||||
{
|
||||
if (!FCEUI_LoadMovie(fname, 1, false, false))
|
||||
if (!FCEUI_LoadMovie(fname, 1, false))
|
||||
{
|
||||
int result = MessageBox(hWnd,"Remove from list?", "Could Not Open Recent File", MB_YESNO);
|
||||
if (result == IDYES)
|
||||
|
@ -1924,7 +1941,7 @@ LRESULT FAR PASCAL AppWndProc(HWND hWnd,UINT msg,WPARAM wParam,LPARAM lParam)
|
|||
// break;
|
||||
// Removing this tool since it is redundant to both
|
||||
case MENU_TASEDIT:
|
||||
extern void EnterTasEdit();
|
||||
extern bool EnterTasEdit();
|
||||
EnterTasEdit();
|
||||
break;
|
||||
case MENU_CONVERT_MOVIE:
|
||||
|
@ -2082,7 +2099,7 @@ LRESULT FAR PASCAL AppWndProc(HWND hWnd,UINT msg,WPARAM wParam,LPARAM lParam)
|
|||
case FCEUX_CONTEXT_LOADLASTMOVIE:
|
||||
if(recent_movie[0])
|
||||
{
|
||||
if (!FCEUI_LoadMovie(recent_movie[0], 1, false, false))
|
||||
if (!FCEUI_LoadMovie(recent_movie[0], 1, false))
|
||||
{
|
||||
int result = MessageBox(hWnd,"Remove from list?", "Could Not Open Recent File", MB_YESNO);
|
||||
if (result == IDYES)
|
||||
|
@ -2090,7 +2107,8 @@ LRESULT FAR PASCAL AppWndProc(HWND hWnd,UINT msg,WPARAM wParam,LPARAM lParam)
|
|||
RemoveRecentItem(0, recent_movie, MAX_NUMBER_OF_MOVIE_RECENT_FILES);
|
||||
UpdateMovieRMenu(recentmoviemenu, recent_movie, MENU_MOVIE_RECENT, MOVIE_FIRST_RECENT_FILE);
|
||||
}
|
||||
} else {
|
||||
} else
|
||||
{
|
||||
FCEUX_LoadMovieExtras(recent_movie[0]);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -939,7 +939,7 @@ void LagCounterToggle(void)
|
|||
static void LaunchTasEdit(void)
|
||||
{
|
||||
#ifdef WIN32
|
||||
extern void EnterTasEdit();
|
||||
extern bool EnterTasEdit();
|
||||
EnterTasEdit();
|
||||
#endif
|
||||
}
|
||||
|
|
|
@ -489,8 +489,8 @@ int MovieData::dump(EMUFILE *os, bool binary)
|
|||
if(savestate.size())
|
||||
os->fprintf("savestate %s\n" , BytesToString(&savestate[0],savestate.size()).c_str() );
|
||||
|
||||
if(FCEUMOV_Mode(MOVIEMODE_TASEDIT))
|
||||
os->fprintf("length %d\n" , this->records.size() );
|
||||
if (this->loadFrameCount >= 0)
|
||||
os->fprintf("length %d\n" , this->loadFrameCount);
|
||||
|
||||
if(binary)
|
||||
{
|
||||
|
@ -593,8 +593,8 @@ static void LoadFM2_binarychunk(MovieData& movieData, EMUFILE* fp, int size)
|
|||
//yuck... another custom text parser.
|
||||
bool LoadFM2(MovieData& movieData, EMUFILE* fp, int size, bool stopAfterHeader)
|
||||
{
|
||||
// Non-TASEditor projects consume until EOF
|
||||
std::string a("length"), b("-1");
|
||||
// Non-TAS projects consume until EOF
|
||||
movieData.installValue(a, b);
|
||||
|
||||
//first, look for an fcm signature
|
||||
|
@ -821,9 +821,9 @@ void MovieData::dumpSavestateTo(std::vector<uint8>* buf, int compressionLevel)
|
|||
}
|
||||
|
||||
//begin playing an existing movie
|
||||
bool FCEUI_LoadMovie(const char *fname, bool _read_only, bool tasedit, int _pauseframe)
|
||||
bool FCEUI_LoadMovie(const char *fname, bool _read_only, int _pauseframe)
|
||||
{
|
||||
if(!tasedit && !FCEU_IsValidUI(FCEUI_PLAYMOVIE))
|
||||
if(!FCEU_IsValidUI(FCEUI_PLAYMOVIE))
|
||||
return true; //adelikat: file did not fail to load, so let's return true here, just do nothing
|
||||
|
||||
assert(fname);
|
||||
|
@ -866,12 +866,12 @@ bool FCEUI_LoadMovie(const char *fname, bool _read_only, bool tasedit, int _paus
|
|||
//fully reload the game to reinitialize everything before playing any movie
|
||||
poweron(true);
|
||||
|
||||
//WE NEED TO LOAD A SAVESTATE
|
||||
if(currMovieData.savestate.size() != 0)
|
||||
if(currMovieData.savestate.size())
|
||||
{
|
||||
//WE NEED TO LOAD A SAVESTATE
|
||||
movieFromPoweron = false;
|
||||
bool success = MovieData::loadSavestateFrom(&currMovieData.savestate);
|
||||
if(!success) return true; //adelikat: I guess return true here? False is only for a bad movie filename, if it got this far the file was god?
|
||||
if(!success) return true; //adelikat: I guess return true here? False is only for a bad movie filename, if it got this far the file was good?
|
||||
} else {
|
||||
movieFromPoweron = true;
|
||||
}
|
||||
|
@ -887,24 +887,16 @@ bool FCEUI_LoadMovie(const char *fname, bool _read_only, bool tasedit, int _paus
|
|||
FCEUD_SetInput(currMovieData.fourscore, currMovieData.microphone, (ESI)currMovieData.ports[0], (ESI)currMovieData.ports[1], (ESIFC)currMovieData.ports[2]);
|
||||
|
||||
//stuff that should only happen when we're ready to positively commit to the replay
|
||||
if(tasedit)
|
||||
{
|
||||
currFrameCounter = 0;
|
||||
pauseframe = _pauseframe;
|
||||
}
|
||||
else
|
||||
{
|
||||
currFrameCounter = 0;
|
||||
pauseframe = _pauseframe;
|
||||
movie_readonly = _read_only;
|
||||
movieMode = MOVIEMODE_PLAY;
|
||||
currRerecordCount = currMovieData.rerecordCount;
|
||||
currFrameCounter = 0;
|
||||
pauseframe = _pauseframe;
|
||||
movie_readonly = _read_only;
|
||||
movieMode = MOVIEMODE_PLAY;
|
||||
currRerecordCount = currMovieData.rerecordCount;
|
||||
|
||||
if(movie_readonly)
|
||||
FCEU_DispMessage("Replay started Read-Only.",0);
|
||||
else
|
||||
FCEU_DispMessage("Replay started Read+Write.",0);
|
||||
}
|
||||
if(movie_readonly)
|
||||
FCEU_DispMessage("Replay started Read-Only.",0);
|
||||
else
|
||||
FCEU_DispMessage("Replay started Read+Write.",0);
|
||||
|
||||
#ifdef WIN32
|
||||
SetMainWindowText();
|
||||
|
@ -1068,7 +1060,8 @@ void FCEUMOV_AddInputState()
|
|||
if (fullSaveStateLoads && (currFrameCounter < (int)currMovieData.records.size()))
|
||||
currMovieData.truncateAt(currFrameCounter);
|
||||
|
||||
mr.dump(&currMovieData, osRecordingMovie,currMovieData.records.size());
|
||||
mr.dump(&currMovieData, osRecordingMovie,currMovieData.records.size()); // to disk
|
||||
|
||||
currMovieData.records.push_back(mr);
|
||||
}
|
||||
|
||||
|
@ -1188,11 +1181,31 @@ bool FCEUMOV_ReadState(EMUFILE* is, uint32 size)
|
|||
{
|
||||
load_successful = false;
|
||||
|
||||
//a little rule: cant load states in read+write mode with a movie from an archive.
|
||||
//so we are going to switch it to readonly mode in that case
|
||||
if(!movie_readonly && FCEU_isFileInArchive(curMovieFilename)) {
|
||||
FCEU_PrintError("Cannot loadstate in Read+Write with movie from archive. Movie is now Read-Only.");
|
||||
movie_readonly = true;
|
||||
if (!movie_readonly)
|
||||
{
|
||||
if (currMovieData.loadFrameCount >= 0)
|
||||
{
|
||||
#ifdef WIN32
|
||||
int result = MessageBox(hAppWnd, "This movie is a TAS Editor project file.\nIt can be modified in TAS Editor only.\n\nOpen it in TAS Editor now?", "Movie Replay", MB_YESNO);
|
||||
if (result == IDYES)
|
||||
{
|
||||
extern bool EnterTasEdit();
|
||||
extern bool LoadProject(char* fullname);
|
||||
char fullname[512];
|
||||
strcpy(fullname, curMovieFilename);
|
||||
if (EnterTasEdit())
|
||||
LoadProject(fullname);
|
||||
}
|
||||
#endif
|
||||
movie_readonly = true;
|
||||
}
|
||||
if (FCEU_isFileInArchive(curMovieFilename))
|
||||
{
|
||||
//a little rule: cant load states in read+write mode with a movie from an archive.
|
||||
//so we are going to switch it to readonly mode in that case
|
||||
FCEU_PrintError("Cannot loadstate in Read+Write with movie from archive. Movie is now Read-Only.");
|
||||
movie_readonly = true;
|
||||
}
|
||||
}
|
||||
|
||||
MovieData tempMovieData = MovieData();
|
||||
|
@ -1508,12 +1521,13 @@ void FCEUI_MoviePlayFromBeginning(void)
|
|||
}
|
||||
else
|
||||
{
|
||||
// movie starting from savestate - reload movie file
|
||||
string str = curMovieFilename;
|
||||
FCEUI_StopMovie();
|
||||
if (FCEUI_LoadMovie(str.c_str(),1, 0, 0))
|
||||
if (FCEUI_LoadMovie(str.c_str(), 1, 0))
|
||||
{
|
||||
movieMode = MOVIEMODE_PLAY;
|
||||
movie_readonly=true;
|
||||
movie_readonly = true;
|
||||
FCEU_DispMessage("Movie is now Read-Only. Playing from beginning.",0);
|
||||
}
|
||||
//currMovieData.loadSavestateFrom(&currMovieData.savestate); //TODO: make something like this work instead so it doesn't have to reload
|
||||
|
|
|
@ -183,6 +183,7 @@ public:
|
|||
|
||||
//was the frame data stored in binary?
|
||||
bool binaryFlag;
|
||||
// TAS Editor project files contain additional data after input
|
||||
int loadFrameCount;
|
||||
|
||||
//which ports are defined for the movie
|
||||
|
@ -257,7 +258,7 @@ extern bool fullSaveStateLoads;
|
|||
void FCEUI_MakeBackupMovie(bool dispMessage);
|
||||
void FCEUI_CreateMovieFile(std::string fn);
|
||||
void FCEUI_SaveMovie(const char *fname, EMOVIE_FLAG flags, std::wstring author);
|
||||
bool FCEUI_LoadMovie(const char *fname, bool read_only, bool tasedit, int _stopframe);
|
||||
bool FCEUI_LoadMovie(const char *fname, bool read_only, int _stopframe);
|
||||
void FCEUI_MoviePlayFromBeginning(void);
|
||||
void FCEUI_StopMovie(void);
|
||||
bool FCEUI_MovieGetInfo(FCEUFILE* fp, MOVIE_INFO& info, bool skipFrameCount = false);
|
||||
|
|
Loading…
Reference in New Issue