diff --git a/desmume/src/commandline.cpp b/desmume/src/commandline.cpp index d3979e3c6..1c5612ed3 100644 --- a/desmume/src/commandline.cpp +++ b/desmume/src/commandline.cpp @@ -559,7 +559,7 @@ void CommandLine::process_movieCommands() } else if(record_movie_file != "") { - FCEUI_SaveMovie(record_movie_file.c_str(), L"", 0, NULL, FCEUI_MovieGetRTCDefault()); + FCEUI_SaveMovie(record_movie_file.c_str(), L"", START_BLANK, NULL, FCEUI_MovieGetRTCDefault()); } } diff --git a/desmume/src/frontend/windows/replay.cpp b/desmume/src/frontend/windows/replay.cpp index 332068cc8..e9ea2cac5 100644 --- a/desmume/src/frontend/windows/replay.cpp +++ b/desmume/src/frontend/windows/replay.cpp @@ -243,8 +243,7 @@ INT_PTR CALLBACK ReplayDialogProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM return false; } - -int flag=0; +START_FROM startFrom; //Record movie dialog static INT_PTR CALLBACK RecordDialogProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) @@ -256,7 +255,11 @@ static INT_PTR CALLBACK RecordDialogProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, switch(uMsg) { case WM_INITDIALOG: { - CheckDlgButton(hwndDlg, IDC_START_FROM_SRAM, ((flag == 1) ? BST_CHECKED : BST_UNCHECKED)); + CheckDlgButton(hwndDlg, IDC_START_FROM_SRAM, startFrom == START_SRAM ? BST_CHECKED : BST_UNCHECKED); + CheckDlgButton(hwndDlg, IDC_START_FROM_POWER_ON, startFrom == START_SAVESTATE ? BST_UNCHECKED : BST_CHECKED); + EnableWindow(GetDlgItem(hwndDlg, IDC_START_FROM_SRAM), startFrom != START_SAVESTATE); + EnableWindow(GetDlgItem(hwndDlg, IDC_EDIT_SRAMFILENAME), startFrom == START_SRAM); + EnableWindow(GetDlgItem(hwndDlg, IDC_BUTTON_BROWSESRAM), startFrom == START_SRAM); SetFocus(GetDlgItem(hwndDlg, IDC_EDIT_FILENAME)); DateTime t = FCEUI_MovieGetRTCDefault(); @@ -313,7 +316,7 @@ static INT_PTR CALLBACK RecordDialogProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, t.tm_sec = systime.wSecond; DateTime rtcstart(t.tm_year,t.tm_mon,t.tm_mday,t.tm_hour,t.tm_min,t.tm_sec); - FCEUI_SaveMovie(fname.c_str(), author, flag, sramfname, rtcstart); + FCEUI_SaveMovie(fname.c_str(), author, startFrom, sramfname, rtcstart); EndDialog(hwndDlg, 0); } return true; @@ -402,17 +405,34 @@ static INT_PTR CALLBACK RecordDialogProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, break; } break; + + case IDC_START_FROM_SRAM: + { + bool checked = IsDlgButtonChecked(hwndDlg, IDC_START_FROM_SRAM); + startFrom = checked ? START_SRAM : START_BLANK; + EnableWindow(GetDlgItem(hwndDlg, IDC_EDIT_SRAMFILENAME), checked); + EnableWindow(GetDlgItem(hwndDlg, IDC_BUTTON_BROWSESRAM), checked); + + break; + } + + case IDC_START_FROM_POWER_ON: // TODO: test movies starting form savestate + { + bool powerOn = IsDlgButtonChecked(hwndDlg, IDC_START_FROM_POWER_ON); + startFrom = powerOn ? START_BLANK : START_SAVESTATE; + EnableWindow(GetDlgItem(hwndDlg, IDC_START_FROM_SRAM), powerOn); + if (!powerOn) + { + CheckDlgButton(hwndDlg, IDC_START_FROM_SRAM, false); + // CheckDlgButton does not send a WM_COMMAND message, so also disable SRAM stuff here + EnableWindow(GetDlgItem(hwndDlg, IDC_EDIT_SRAMFILENAME), false); + EnableWindow(GetDlgItem(hwndDlg, IDC_BUTTON_BROWSESRAM), false); + } + break; + } } } - HWND cur = GetDlgItem(hwndDlg, IDC_EDIT_SRAMFILENAME); - - IsDlgButtonChecked(hwndDlg, IDC_START_FROM_SRAM) ? flag=1 : flag=0; - IsDlgButtonChecked(hwndDlg, IDC_START_FROM_SRAM) ? EnableWindow(cur, TRUE) : EnableWindow(cur, FALSE); - - cur = GetDlgItem(hwndDlg, IDC_BUTTON_BROWSESRAM); - IsDlgButtonChecked(hwndDlg, IDC_START_FROM_SRAM) ? EnableWindow(cur, TRUE) : EnableWindow(cur, FALSE); - return false; } diff --git a/desmume/src/frontend/windows/replay.h b/desmume/src/frontend/windows/replay.h index 279d6a2e5..3f1b42ad0 100644 --- a/desmume/src/frontend/windows/replay.h +++ b/desmume/src/frontend/windows/replay.h @@ -18,6 +18,8 @@ #ifndef _WIN_REPLAY_H_ #define _WIN_REPLAY_H_ +enum START_FROM { START_BLANK, START_SRAM, START_SAVESTATE }; + void Replay_LoadMovie(); void MovieRecordTo(); diff --git a/desmume/src/frontend/windows/resource.h b/desmume/src/frontend/windows/resource.h index e7d0b1eec..593de50ef 100644 --- a/desmume/src/frontend/windows/resource.h +++ b/desmume/src/frontend/windows/resource.h @@ -273,6 +273,7 @@ #define IDC_BUTTON_BROWSESRAM 980 #define IDC_C_WATCH_UP 980 #define IDD_EDITWATCH 980 +#define IDC_START_FROM_POWER_ON 981 #define IDC_C_WATCH_DOWN 981 #define RAMMENU_FILE_AUTOLOAD 982 #define RAMMENU_FILE_SAVEWINDOW 983 diff --git a/desmume/src/frontend/windows/resources.rc b/desmume/src/frontend/windows/resources.rc index 69677ecc1..895440ed6 100644 --- a/desmume/src/frontend/windows/resources.rc +++ b/desmume/src/frontend/windows/resources.rc @@ -963,27 +963,28 @@ BEGIN PUSHBUTTON "Separator",IDC_C_WATCH_SEPARATE,225,136,36,14 END -IDD_RECORDMOVIE DIALOGEX 0, 0, 301, 124 +IDD_RECORDMOVIE DIALOGEX 0, 0, 301, 118 STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | WS_SYSMENU CAPTION "Record movie" FONT 8, "MS Shell Dlg", 400, 0, 0x1 BEGIN - DEFPUSHBUTTON "OK",IDOK,177,106,50,14 - PUSHBUTTON "Cancel",IDCANCEL,231,106,50,14 - GROUPBOX "",65501,11,9,269,64 - LTEXT "File:",IDC_STATIC,31,22,14,8 - EDITTEXT IDC_EDIT_FILENAME,49,20,189,12,ES_AUTOHSCROLL - PUSHBUTTON "...",IDC_BUTTON_BROWSEFILE,249,20,18,14 - LTEXT "Author:",IDC_STATIC,21,38,25,8 - EDITTEXT IDC_EDIT_AUTHOR,49,36,189,14,ES_AUTOHSCROLL - LTEXT "Date:",IDC_STATIC,28,56,18,8 - CONTROL "",IDC_DTP_DATE,"SysDateTimePick32",DTS_RIGHTALIGN | DTS_LONGDATEFORMAT | WS_TABSTOP,49,54,123,12 - CONTROL "",IDC_DTP_TIME,"SysDateTimePick32",DTS_RIGHTALIGN | DTS_UPDOWN | WS_TABSTOP | 0x8,176,54,62,12 - GROUPBOX "",IDC_STATIC,11,73,269,29 - LTEXT "SRAM:",IDC_STATIC,19,85,25,8 - EDITTEXT IDC_EDIT_SRAMFILENAME,48,83,189,12,ES_AUTOHSCROLL - PUSHBUTTON "...",IDC_BUTTON_BROWSESRAM,248,83,18,14 - CONTROL "Start from SRAM",IDC_START_FROM_SRAM,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,12,108,93,10 + DEFPUSHBUTTON "OK",IDOK,177,99,50,14 + PUSHBUTTON "Cancel",IDCANCEL,231,99,50,14 + GROUPBOX "",65501,11,2,269,64 + LTEXT "File:",IDC_STATIC,31,15,14,8 + EDITTEXT IDC_EDIT_FILENAME,49,13,189,12,ES_AUTOHSCROLL + PUSHBUTTON "...",IDC_BUTTON_BROWSEFILE,249,13,18,14 + LTEXT "Author:",IDC_STATIC,21,31,25,8 + EDITTEXT IDC_EDIT_AUTHOR,49,29,189,14,ES_AUTOHSCROLL + LTEXT "Date:",IDC_STATIC,28,49,18,8 + CONTROL "",IDC_DTP_DATE,"SysDateTimePick32",DTS_RIGHTALIGN | DTS_LONGDATEFORMAT | WS_TABSTOP,49,47,123,12 + CONTROL "",IDC_DTP_TIME,"SysDateTimePick32",DTS_RIGHTALIGN | DTS_UPDOWN | WS_TABSTOP | 0x8,176,47,62,12 + GROUPBOX "",IDC_STATIC,11,66,269,29 + LTEXT "SRAM:",IDC_STATIC,19,78,25,8 + EDITTEXT IDC_EDIT_SRAMFILENAME,48,76,189,12,ES_AUTOHSCROLL + PUSHBUTTON "...",IDC_BUTTON_BROWSESRAM,248,76,18,14 + CONTROL "Start from SRAM",IDC_START_FROM_SRAM,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,12,101,73,10 + CONTROL "Start from power on",IDC_START_FROM_POWER_ON,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,85,101,81,10 END IDD_REPLAY_METADATA DIALOGEX 0, 0, 325, 250 @@ -1904,7 +1905,7 @@ BEGIN IDD_RECORDMOVIE, DIALOG BEGIN - BOTTOMMARGIN, 113 + BOTTOMMARGIN, 107 END IDD_SOUNDSETTINGS, DIALOG @@ -2120,6 +2121,10 @@ BEGIN IDM_FILE_STOPAVI "Stop AVI" IDM_FILE_STOPWAV "Stop WAV" IDM_FILE_RECORDAVI "Record AVI" +END + +STRINGTABLE +BEGIN IDM_FILE_RECORDWAV "Record WAV" END @@ -2133,23 +2138,58 @@ BEGIN ID_LABEL_HK1 "Open ROM" ID_LABEL_HK2 "Reset" ID_LABEL_HK3 "Pause" - ID_LABEL_HK3b "CPU mode" - ID_LABEL_HK3c "Increase JIT block size" - ID_LABEL_HK3d "Decrease JIT block size" ID_LABEL_HK4 "Frame Advance" ID_LABEL_HK5 "Fast Forward" ID_LABEL_HK6 "Fast Forward Toggle" ID_LABEL_HK7 "Increase Speed" ID_LABEL_HK8 "Decrease Speed" - ID_LABEL_HK8b "Limit Framerate Toggle" ID_LABEL_HK9 "Microphone" ID_LABEL_HK10 "Auto-Hold" ID_LABEL_HK11 "Auto-Hold Clear" ID_LABEL_HK12 "Toggle Rasterizer" ID_LABEL_HK13 "Save Screenshot as" - ID_LABEL_HK13b "Quick Screenshot" ID_LABEL_HK14 "Record WAV" ID_LABEL_HK15 "Record AVI" +END + +STRINGTABLE +BEGIN + ID_LABEL_HK3b "CPU mode" + ID_LABEL_HK3c "Increase JIT block size" +END + +STRINGTABLE +BEGIN + ID_LABEL_HK3d "Decrease JIT block size" +END + +STRINGTABLE +BEGIN + ID_LABEL_HK8b "Limit Framerate Toggle" +END + +STRINGTABLE +BEGIN + ID_LABEL_HK48 "Turbo A" + ID_LABEL_HK49 "Turbo Y" + ID_LABEL_HK50 "Turbo X" + ID_LABEL_HK51 "Turbo R" + ID_LABEL_HK52 "Turbo L" + ID_LABEL_HK53 "Reload ROM" + ID_LABEL_HK13b "Quick Screenshot" + ID_LABEL_HK54 "Search Cheats" + ID_LABEL_HK55 "Increase Pressure" + ID_LABEL_HK56 "Decrease Pressure" + ID_LABEL_HK57 "Rotation 0" + ID_LABEL_HK58 "Rotation 90" + ID_LABEL_HK59 "Rotation 180" + ID_LABEL_HK60 "Rotation 270" + ID_LABEL_HK61 "Toggle Stylus Jitter" + ID_LABEL_HK62 "Toggle Cursor" +END + +STRINGTABLE +BEGIN ID_LABEL_HK16 "Toggle Frame Display" ID_LABEL_HK17 "Toggle FPS Display" ID_LABEL_HK18 "Toggle Input Display" @@ -2166,6 +2206,10 @@ BEGIN ID_LABEL_HK29 "Stylus Auto-Hold" ID_LABEL_HK30 "LCDs layout mode" ID_LABEL_HK31 "LCDs swap" +END + +STRINGTABLE +BEGIN ID_LABEL_HK32 "Increase Volume" ID_LABEL_HK33 "Decrease Volume" ID_LABEL_HK34 "Save to Slot " @@ -2182,21 +2226,10 @@ BEGIN ID_LABEL_HK45 "Turbo Select" ID_LABEL_HK46 "Turbo Start" ID_LABEL_HK47 "Turbo B" - ID_LABEL_HK48 "Turbo A" - ID_LABEL_HK49 "Turbo Y" - ID_LABEL_HK50 "Turbo X" - ID_LABEL_HK51 "Turbo R" - ID_LABEL_HK52 "Turbo L" - ID_LABEL_HK53 "Reload ROM" - ID_LABEL_HK54 "Search Cheats" - ID_LABEL_HK55 "Increase Pressure" - ID_LABEL_HK56 "Decrease Pressure" - ID_LABEL_HK57 "Rotation 0" - ID_LABEL_HK58 "Rotation 90" - ID_LABEL_HK59 "Rotation 180" - ID_LABEL_HK60 "Rotation 270" - ID_LABEL_HK61 "Toggle Stylus Jitter" - ID_LABEL_HK62 "Toggle Cursor" +END + +STRINGTABLE +BEGIN ID_LABEL_HK63 "List Cheats" ID_LABEL_HK64 "Toggle Cheats" ID_LABEL_HK65 "Toggle Main GPU" diff --git a/desmume/src/movie.cpp b/desmume/src/movie.cpp index 2bda75014..6f82939e5 100644 --- a/desmume/src/movie.cpp +++ b/desmume/src/movie.cpp @@ -39,6 +39,8 @@ #include "version.h" #include "path.h" #include "emufile.h" +#include "replay.h" +#include "saves.h" using namespace std; bool freshMovie = false; //True when a movie loads, false when movie is altered. Used to determine if a movie has been altered since opening @@ -639,9 +641,17 @@ const char* _CDECL_ FCEUI_LoadMovie(const char *fname, bool _read_only, bool tas oldSettings = new MovieData(true); LoadSettingsFromMovie(currMovieData); - firstReset = true; - NDS_Reset(); - firstReset = false; + if (currMovieData.savestate.size() == 0) + { + firstReset = true; + NDS_Reset(); + firstReset = false; + } + else + { + EMUFILE_MEMORY efs = EMUFILE_MEMORY(&currMovieData.savestate); + savestate_load(efs); + } ////WE NEED TO LOAD A SAVESTATE //if(currMovieData.savestate.size() != 0) @@ -729,7 +739,7 @@ bool MovieData::loadSramFrom(std::vector* buf) //begin recording a new movie //TODO - BUG - the record-from-another-savestate doesnt work. -void FCEUI_SaveMovie(const char *fname, std::wstring author, int flag, std::string sramfname, const DateTime &rtcstart) +void FCEUI_SaveMovie(const char *fname, std::wstring author, START_FROM startFrom, std::string sramfname, const DateTime &rtcstart) { //if(!FCEU_IsValidUI(FCEUI_RECORDMOVIE)) // return; @@ -758,15 +768,26 @@ void FCEUI_SaveMovie(const char *fname, std::wstring author, int flag, std::stri NDS_CreateDummyFirmware(&CommonSettings.fw_config); } - NDS_Reset(); - //todo ? - //poweron(true); - //else - // MovieData::dumpSavestateTo(&currMovieData.savestate,Z_BEST_COMPRESSION); + if (startFrom == START_SAVESTATE) + { + // ?? MovieData::dumpSavestateTo(&currMovieData.savestate,Z_BEST_COMPRESSION); + EMUFILE_MEMORY efs; + savestate_save(efs, Z_BEST_COMPRESSION); + currMovieData.savestate.resize(efs.size()); + efs.fseek(0, SEEK_SET); + efs.fread(currMovieData.savestate.begin()._Ptr, efs.size()); + } + else + { + NDS_Reset(); - if(flag == 1) - EMUFILE::readAllBytes(&currMovieData.sram, sramfname); + //todo ? + //poweron(true); + + if (startFrom == START_SRAM) + EMUFILE::readAllBytes(&currMovieData.sram, sramfname); + } //we are going to go ahead and dump the header. from now on we will only be appending frames currMovieData.dump(*osRecordingMovie, false); diff --git a/desmume/src/movie.h b/desmume/src/movie.h index 498a62916..532bc9c7d 100644 --- a/desmume/src/movie.h +++ b/desmume/src/movie.h @@ -28,6 +28,8 @@ #include "utils/guid.h" #include "utils/md5.h" +#include "replay.h" + struct UserInput; class EMUFILE; @@ -276,7 +278,7 @@ extern MovieData currMovieData; //adelikat: main needs this for frame counter d extern bool movie_reset_command; bool FCEUI_MovieGetInfo(EMUFILE &fp, MOVIE_INFO &info, bool skipFrameCount); -void FCEUI_SaveMovie(const char *fname, std::wstring author, int flag, std::string sramfname, const DateTime &rtcstart); +void FCEUI_SaveMovie(const char *fname, std::wstring author, START_FROM startFrom, std::string sramfname, const DateTime &rtcstart); const char* _CDECL_ FCEUI_LoadMovie(const char *fname, bool _read_only, bool tasedit, int _pauseframe); // returns NULL on success, errmsg on failure void UnloadMovieEmulationSettings(); bool AreMovieEmulationSettingsActive(); diff --git a/desmume/src/saves.cpp b/desmume/src/saves.cpp index b5d385819..480945da2 100644 --- a/desmume/src/saves.cpp +++ b/desmume/src/saves.cpp @@ -1043,12 +1043,9 @@ bool savestate_save (const char *file_name) { EMUFILE_MEMORY ms; size_t elems_written; -#ifdef HAVE_LIBZ - if (!savestate_save(ms, Z_DEFAULT_COMPRESSION)) -#else - if (!savestate_save(ms, 0)) -#endif + if (!savestate_save(ms)) return false; + FILE* file = fopen(file_name,"wb"); if(file) { diff --git a/desmume/src/saves.h b/desmume/src/saves.h index b3db4723e..e7059cf6d 100644 --- a/desmume/src/saves.h +++ b/desmume/src/saves.h @@ -21,6 +21,7 @@ #define _SRAM_H #include "types.h" +#include "zlib.h" #define NB_STATES 10 @@ -64,6 +65,6 @@ void savestate_slot(int num); void loadstate_slot(int num); bool savestate_load(class EMUFILE &is); -bool savestate_save(class EMUFILE &outstream, int compressionLevel); +bool savestate_save(class EMUFILE &outstream, int compressionLevel = Z_DEFAULT_COMPRESSION); #endif