From 9a7da827a2309fcd76bca060331f05d6c9369751 Mon Sep 17 00:00:00 2001 From: zeromus Date: Thu, 5 Jun 2008 06:49:11 +0000 Subject: [PATCH] break tasedit. but on the way to making it better! --- src/drawing.cpp | 5 +- src/driver.h | 18 +++- src/drivers/win/aviout.cpp | 6 +- src/drivers/win/input.cpp | 7 +- src/drivers/win/res.rc | 6 +- src/drivers/win/tasedit.cpp | 6 +- src/drivers/win/window.cpp | 23 ++--- src/fceu.cpp | 36 ++++++-- src/input.cpp | 4 +- src/movie.cpp | 165 ++++++++++++++++++++++-------------- src/movie.h | 22 ++++- src/state.cpp | 15 ++-- vc8/fceux.vcproj | 2 +- 13 files changed, 204 insertions(+), 111 deletions(-) diff --git a/src/drawing.cpp b/src/drawing.cpp index d68b4128..d8a89dbb 100644 --- a/src/drawing.cpp +++ b/src/drawing.cpp @@ -2,6 +2,7 @@ #include "fceu.h" #include "drawing.h" #include "video.h" +#include "movie.h" static uint8 Font6x5[594] = { @@ -307,12 +308,12 @@ void FCEU_DrawRecordingStatus(uint8* XBuf) if(FCEUD_ShowStatusIcon()) { bool hasPlayRecIcon = false; - if(FCEUI_IsMovieActive()>0) + if(FCEUMOV_Mode(MOVIEMODE_RECORD)) { drawstatus(XBuf,2,28,0); hasPlayRecIcon = true; } - else if(FCEUI_IsMovieActive()<0) + else if(FCEUMOV_Mode(MOVIEMODE_PLAY)) { drawstatus(XBuf,1,28,0); hasPlayRecIcon = true; diff --git a/src/driver.h b/src/driver.h index 49acd919..8b3c1df1 100644 --- a/src/driver.h +++ b/src/driver.h @@ -213,7 +213,7 @@ void FCEUI_SaveMovie(char *fname, uint8 flags); void FCEUI_LoadMovie(char *fname, bool read_only, int _stopframe); void FCEUI_MoviePlayFromBeginning(void); void FCEUI_StopMovie(void); -int FCEUI_IsMovieActive(void); +//int FCEUI_IsMovieActive(void); int FCEUI_MovieGetInfo(const char* fname, MOVIE_INFO* /* [in, out] */ info); char* FCEUI_MovieGetCurrentName(int addSlotNumber); void FCEUI_MovieToggleReadOnly(void); @@ -312,12 +312,12 @@ void FCEUD_OnCloseGame(void); void FCEUI_FrameAdvance(void); void FCEUI_FrameAdvanceEnd(void); -/* AVI Output */ +//AVI Output int FCEUI_AviBegin(const char* fname); void FCEUI_AviEnd(void); void FCEUI_AviVideoUpdate(const unsigned char* buffer); void FCEUI_AviSoundUpdate(void* soundData, int soundLen); -int FCEUI_AviIsRecording(void); +bool FCEUI_AviIsRecording(); void FCEUD_AviRecordTo(void); void FCEUD_AviStop(void); @@ -328,7 +328,7 @@ typedef int TestCommandState(int cmd); void FCEUI_HandleEmuCommands(TestCommandState* testfn); -/* Emulation speed */ +//Emulation speed enum EMUSPEED_SET { EMUSPEED_SLOWEST=0, @@ -365,6 +365,16 @@ void FCEUD_UpdatePPUView(int scanline, int drawall); ///I am dissatisfied with this method of getting an option from the driver to the core. but that is what we're using for now bool FCEUD_PauseAfterPlayback(); +enum EFCEUI +{ + FCEUI_STOPAVI, FCEUI_SAVESTATE, FCEUI_LOADSTATE, + FCEUI_STOPMOVIE, FCEUI_RECORDMOVIE, FCEUI_PLAYMOVIE +}; + +//checks whether an EFCEUI is valid right now +bool FCEU_IsValidUI(EFCEUI ui); + + #ifdef __cplusplus extern "C" #endif diff --git a/src/drivers/win/aviout.cpp b/src/drivers/win/aviout.cpp index 53344e88..f9fac315 100644 --- a/src/drivers/win/aviout.cpp +++ b/src/drivers/win/aviout.cpp @@ -408,10 +408,10 @@ void FCEUI_AviEnd() avi_destroy(&avi_file); } -int FCEUI_AviIsRecording() +bool FCEUI_AviIsRecording() { if(avi_file) - return 1; + return true; - return 0; + return false; } diff --git a/src/drivers/win/input.cpp b/src/drivers/win/input.cpp index 2eaa3989..5fd92991 100644 --- a/src/drivers/win/input.cpp +++ b/src/drivers/win/input.cpp @@ -30,7 +30,8 @@ #include "keyboard.h" #include "joystick.h" #include "gui.h" -#include "../../fceu.h" //mbg merge 7/17/06 added +#include "fceu.h" +#include "movie.h" #include "keyscan.h" @@ -213,13 +214,13 @@ int DTestButton(ButtConfig *bc) void UpdateGamepad() { - if(FCEUI_IsMovieActive()<0) + if(FCEUMOV_Mode(MOVIEMODE_PLAY)) return; uint32 JS=0; int x; int wg; - if(FCEUI_IsMovieActive()>0) + if(FCEUMOV_Mode(MOVIEMODE_RECORD)) AutoFire(); for(wg=0;wg<4;wg++) diff --git a/src/drivers/win/res.rc b/src/drivers/win/res.rc index 3cb0c451..036aa81f 100644 --- a/src/drivers/win/res.rc +++ b/src/drivers/win/res.rc @@ -7,7 +7,8 @@ // // Generated from the TEXTINCLUDE 2 resource. // -#include "afxres.h" +#include "afxres.h" + ///////////////////////////////////////////////////////////////////////////// #undef APSTUDIO_READONLY_SYMBOLS @@ -1600,7 +1601,8 @@ IDB_TE_ARROW BITMAP "res/te_arrow.bmp" // // Generated from the TEXTINCLUDE 3 resource. // - + + ///////////////////////////////////////////////////////////////////////////// #endif // not APSTUDIO_INVOKED diff --git a/src/drivers/win/tasedit.cpp b/src/drivers/win/tasedit.cpp index ca2834f8..a1b9e4ed 100644 --- a/src/drivers/win/tasedit.cpp +++ b/src/drivers/win/tasedit.cpp @@ -20,7 +20,7 @@ static TSelectionFrames selectionFrames; //hacky.. we need to think about how to convey information from the driver to the movie code. //add a new fceud_ function?? blehhh maybe -bool moviePleaseLogSavestates = false; +extern EMOVIEMODE movieMode; static void GetDispInfo(NMLVDISPINFO* nmlvDispInfo) { @@ -288,7 +288,7 @@ void KillTasEdit() { DestroyWindow(hwndTasEdit); hwndTasEdit = 0; - moviePleaseLogSavestates = false; + FCEUMOV_ExitTasEdit(); } static void Export() @@ -438,7 +438,7 @@ void DoTasEdit() if(hwndTasEdit) { - moviePleaseLogSavestates = true; + FCEUMOV_EnterTasEdit(); SetWindowPos(hwndTasEdit,HWND_TOP,0,0,0,0,SWP_NOSIZE|SWP_NOMOVE|SWP_NOOWNERZORDER); } } diff --git a/src/drivers/win/window.cpp b/src/drivers/win/window.cpp index ba19e5bd..fd15fabb 100644 --- a/src/drivers/win/window.cpp +++ b/src/drivers/win/window.cpp @@ -54,6 +54,7 @@ #include "directories.h" #include "gui.h" #include "help.h" +#include "movie.h" // Extern variables @@ -71,7 +72,6 @@ void RestartMovieOrReset(unsigned int pow); int KeyboardSetBackgroundAccess(int on); //mbg merge 7/17/06 YECH had to add void SetJoystickBackgroundAccess(int background); //mbg merge 7/17/06 YECH had to add void ShowNetplayConsole(void); //mbg merge 7/17/06 YECH had to add -int FCEUMOV_IsPlaying(void); //mbg merge 7/17/06 YECH had to add void DoPPUView();//mbg merge 7/19/06 yech had to add void MapInput(void); @@ -141,15 +141,10 @@ void updateGameDependentMenus(unsigned int enable) { const int menu_ids[]= { MENU_CLOSE_FILE, - MENU_SAVE_STATE, - MENU_LOAD_STATE, MENU_RESET, MENU_POWER, MENU_INSERT_COIN, MENU_SWITCH_DISK, - MENU_RECORD_MOVIE, - MENU_REPLAY_MOVIE, - MENU_STOP_MOVIE, MENU_RECORD_AVI, MENU_STOP_AVI, MENU_RECORD_WAV, @@ -545,7 +540,7 @@ void LoadNewGamey(HWND hParent, const char *initialdir) void GetMouseData(uint32 *md) { - if(FCEUI_IsMovieActive() < 0) + if(FCEUMOV_Mode() == MOVIEMODE_PLAY) { return; } @@ -1155,9 +1150,13 @@ LRESULT FAR PASCAL AppWndProc(HWND hWnd,UINT msg,WPARAM wParam,LPARAM lParam) } goto proco; case WM_ENTERMENULOOP: - EnableMenuItem(fceumenu,MENU_STOP_MOVIE,MF_BYCOMMAND | (FCEUI_IsMovieActive()?MF_ENABLED:MF_GRAYED)); - EnableMenuItem(fceumenu,MENU_STOP_AVI,MF_BYCOMMAND | (FCEUI_AviIsRecording()?MF_ENABLED:MF_GRAYED)); - EnableMenuItem(fceumenu,MENU_STOP_WAV,MF_BYCOMMAND | (loggingSound?MF_ENABLED:MF_GRAYED)); + EnableMenuItem(fceumenu,MENU_RECORD_MOVIE,MF_BYCOMMAND | (FCEU_IsValidUI(FCEUI_RECORDMOVIE)?MF_ENABLED:MF_GRAYED)); + EnableMenuItem(fceumenu,MENU_REPLAY_MOVIE,MF_BYCOMMAND | (FCEU_IsValidUI(FCEUI_PLAYMOVIE)?MF_ENABLED:MF_GRAYED)); + EnableMenuItem(fceumenu,MENU_STOP_MOVIE,MF_BYCOMMAND | (FCEU_IsValidUI(FCEUI_STOPMOVIE)?MF_ENABLED:MF_GRAYED)); + EnableMenuItem(fceumenu,MENU_SAVE_STATE,MF_BYCOMMAND | (FCEU_IsValidUI(FCEUI_SAVESTATE)?MF_ENABLED:MF_GRAYED)); + EnableMenuItem(fceumenu,MENU_LOAD_STATE,MF_BYCOMMAND | (FCEU_IsValidUI(FCEUI_LOADSTATE)?MF_ENABLED:MF_GRAYED)); + EnableMenuItem(fceumenu,MENU_STOP_AVI,MF_BYCOMMAND | (FCEUI_AviIsRecording()?MF_ENABLED:MF_GRAYED)); + EnableMenuItem(fceumenu,MENU_STOP_WAV,MF_BYCOMMAND | (loggingSound?MF_ENABLED:MF_GRAYED)); default: proco: return DefWindowProc(hWnd,msg,wParam,lParam); @@ -1421,7 +1420,9 @@ void FCEUD_AviRecordTo(void) OPENFILENAME ofn; char szChoice[MAX_PATH]; - if(FCEUMOV_IsPlaying()) + //if we are playing a movie, construct the filename from the current movie. + //else construct it from the filename. + if(FCEUMOV_Mode(MOVIEMODE_PLAY|MOVIEMODE_RECORD)) { extern char curMovieFilename[]; strcpy(szChoice, curMovieFilename); diff --git a/src/fceu.cpp b/src/fceu.cpp index d2b6430f..f81af645 100644 --- a/src/fceu.cpp +++ b/src/fceu.cpp @@ -474,7 +474,7 @@ void AutoFire(void) counter = (++counter) % (8*7*5*3); //If recording a movie, use the frame # for the autofire so the offset //doesn't get screwed up when loading. - if(FCEUMOV_IsPlaying() || FCEUMOV_IsRecording()) + if(FCEUMOV_Mode(MOVIEMODE_RECORD | MOVIEMODE_PLAY)) { rapidAlternator= AutoFirePattern[(AutoFireOffset + FCEUMOV_GetFrame())%AutoFirePatternLength]; } @@ -567,19 +567,18 @@ void FCEUI_CloseGame(void) CloseGame(); } -/** -* @param do_power_off Power off (1) or reset (0) -**/ +//resets or powers off the system, as specified +//OR, if a movie is playing or recording, possibly reloads the movie according to funny rules. void RestartMovieOrReset(unsigned int do_power_off) { extern bool movie_readonly; extern char curMovieFilename[512]; - if(FCEUMOV_IsPlaying() || FCEUMOV_IsRecording() && movie_readonly) + if(FCEUMOV_Mode(MOVIEMODE_PLAY) || FCEUMOV_Mode(MOVIEMODE_RECORD) && movie_readonly) { FCEUI_LoadMovie(curMovieFilename, movie_readonly, 0); - if(FCEUI_IsMovieActive()) + if(FCEUMOV_Mode(MOVIEMODE_PLAY|MOVIEMODE_RECORD)) { return; } @@ -789,7 +788,8 @@ void FCEUI_ClearEmulationFrameStepped() //mbg merge 7/18/06 added //ideally maybe we shouldnt be using this, but i need it for quick merging -void FCEUI_SetEmulationPaused(int val) { +void FCEUI_SetEmulationPaused(int val) +{ EmulationPaused = val; } @@ -859,3 +859,25 @@ int FCEU_TextScanlineOffsetFromBottom(int y) { return (FSettings.LastSLine-y)*256; } + +bool FCEU_IsValidUI(EFCEUI ui) +{ + switch(ui) + { + case FCEUI_RECORDMOVIE: + case FCEUI_PLAYMOVIE: + if(!GameInfo) return false; + if(FCEUMOV_Mode(MOVIEMODE_TASEDIT)) return false; + break; + case FCEUI_STOPMOVIE: + return FCEUMOV_Mode(MOVIEMODE_PLAY|MOVIEMODE_RECORD); + case FCEUI_STOPAVI: + return FCEUI_AviIsRecording(); + case FCEUI_SAVESTATE: + case FCEUI_LOADSTATE: + if(FCEUMOV_Mode(MOVIEMODE_TASEDIT)) return false; + if(!GameInfo) return false; + break; + } + return true; +} diff --git a/src/input.cpp b/src/input.cpp index 301f0a3f..8d76bbb0 100644 --- a/src/input.cpp +++ b/src/input.cpp @@ -249,7 +249,7 @@ void FCEU_UpdateBot() void FCEU_UpdateInput(void) { - if(!FCEUMOV_IsPlaying() && !BotMode) + if(!FCEUMOV_Mode(MOVIEMODE_PLAY) && !BotMode) { int x; @@ -475,7 +475,7 @@ void FCEU_QSimpleCommand(int cmd) else { FCEU_DoSimpleCommand(cmd); - if(FCEUMOV_IsRecording()) + if(FCEUMOV_Mode(MOVIEMODE_RECORD)) FCEUMOV_AddCommand(cmd); } } diff --git a/src/movie.cpp b/src/movie.cpp index 71ac4f2d..1f36a72c 100644 --- a/src/movie.cpp +++ b/src/movie.cpp @@ -29,7 +29,6 @@ using namespace std; extern char FileBase[]; extern int EmulationPaused; -extern bool moviePleaseLogSavestates; using namespace std; @@ -49,10 +48,7 @@ bool suppressMovieStop=false; //----movie engine main state -static enum EMOVIEMODE -{ - MOVIEMODE_INACTIVE, MOVIEMODE_RECORD, MOVIEMODE_PLAY -} movieMode = MOVIEMODE_INACTIVE; +EMOVIEMODE movieMode = MOVIEMODE_INACTIVE; //this should not be set unless we are in MOVIEMODE_RECORD! FILE* fpRecordingMovie = 0; @@ -80,7 +76,7 @@ void MovieData::clearRecordRange(int start, int len) void MovieData::TryDumpIncremental() { - if(moviePleaseLogSavestates) + if(movieMode == MOVIEMODE_TASEDIT) { //only log the savestate if we are appending to the green zone if(currFrameCounter == currMovieData.greenZoneCount) @@ -270,14 +266,19 @@ bool FCEUMOV_ShouldPause(void) } } -int FCEUMOV_IsPlaying(void) +EMOVIEMODE FCEUMOV_Mode() { - return movieMode == MOVIEMODE_PLAY; + return movieMode; } -int FCEUMOV_IsRecording(void) +bool FCEUMOV_Mode(EMOVIEMODE modemask) { - return movieMode == MOVIEMODE_RECORD; + return (movieMode&modemask)!=0; +} + +bool FCEUMOV_Mode(int modemask) +{ + return FCEUMOV_Mode((EMOVIEMODE)modemask); } //yuck... another custom text parser. @@ -400,9 +401,9 @@ void FCEUI_StopMovie() curMovieFilename[0] = 0; } - void ParseGIInput(FCEUGI *GI); //mbg merge 7/17/06 - had to add. gross. void InitOtherInput(void); //mbg merge 7/17/06 - had to add. gross. + static void ResetInputTypes() { #ifdef WIN32 @@ -420,6 +421,69 @@ static void ResetInputTypes() #endif } + +static void poweron(bool shouldDisableBatteryLoading) +{ + // make a for-movie-recording power-on clear the game's save data, too + extern char lastLoadedGameName [2048]; + extern int disableBatteryLoading, suppressAddPowerCommand; + suppressAddPowerCommand=1; + if(shouldDisableBatteryLoading) disableBatteryLoading=1; + suppressMovieStop=true; + { + //we need to save the pause state through this process + int oldPaused = EmulationPaused; + + // NOTE: this will NOT write an FCEUNPCMD_POWER into the movie file + FCEUGI* gi = FCEUI_LoadGame(lastLoadedGameName, 0); + //mbg 5/23/08 - wtf? why would this return null? + //if(!gi) PowerNES(); + assert(gi); + + EmulationPaused = oldPaused; + } + suppressMovieStop=false; + if(shouldDisableBatteryLoading) disableBatteryLoading=0; + suppressAddPowerCommand=0; +} + + + +void FCEUMOV_EnterTasEdit() +{ + //stop any current movie activity + FCEUI_StopMovie(); + + //clear the current movie + currFrameCounter = 0; + currMovieData = MovieData(); + currMovieData.guid.newGuid(); + currMovieData.palFlag = FCEUI_GetCurrentVidSystem(0,0)!=0; + currMovieData.poweronFlag = true; + currMovieData.romChecksum = GameInfo->MD5; + currMovieData.romFilename = FileBase; + + //reset the rom + poweron(false); + + //todo - think about this + ResetInputTypes(); + + //pause the emulator + FCEUI_SetEmulationPaused(1); + + //and enter tasedit mode + movieMode = MOVIEMODE_TASEDIT; + FCEU_DispMessage("Tasedit engaged"); +} + +void FCEUMOV_ExitTasEdit() +{ + movieMode = MOVIEMODE_INACTIVE; + FCEU_DispMessage("Tasedit disengaged"); + currMovieData = MovieData(); +} + bool MovieData::loadSavestateFrom(std::vector* buf) { //dump the savestate to disk @@ -443,6 +507,9 @@ void MovieData::dumpSavestateTo(std::vector* buf, int compressionLevel) //begin playing an existing movie void FCEUI_LoadMovie(char *fname, bool _read_only, int _pauseframe) { + if(!FCEU_IsValidUI(FCEUI_PLAYMOVIE)) + return; + assert(fname); FCEUI_StopMovie(); @@ -458,23 +525,7 @@ void FCEUI_LoadMovie(char *fname, bool _read_only, int _pauseframe) // fully reload the game to reinitialize everything before playing any movie // to try fixing nondeterministic playback of some games { - extern char lastLoadedGameName [2048]; - extern int disableBatteryLoading, suppressAddPowerCommand; - suppressAddPowerCommand=1; - suppressMovieStop=true; - { - //we need to save the pause state through this process - int oldPaused = EmulationPaused; - - FCEUGI * gi = FCEUI_LoadGame(lastLoadedGameName, 0); - //mbg 5/23/08 - wtf? why would this return null? - //if(!gi) PowerNES(); - assert(gi); - - EmulationPaused = oldPaused; - } - suppressMovieStop=false; - suppressAddPowerCommand=0; + poweron(false); } //todo - if reset flag is set, will the poweron flag be set? @@ -526,9 +577,13 @@ static void openRecordingMovie(const char* fname) strcpy(curMovieFilename, fname); } + //begin recording a new movie void FCEUI_SaveMovie(char *fname, uint8 flags) { + if(!FCEU_IsValidUI(FCEUI_RECORDMOVIE)) + return; + assert(fname); FCEUI_StopMovie(); @@ -548,27 +603,7 @@ void FCEUI_SaveMovie(char *fname, uint8 flags) if(currMovieData.poweronFlag) { - // make a for-movie-recording power-on clear the game's save data, too - extern char lastLoadedGameName [2048]; - extern int disableBatteryLoading, suppressAddPowerCommand; - suppressAddPowerCommand=1; - disableBatteryLoading=1; - suppressMovieStop=true; - { - //we need to save the pause state through this process - int oldPaused = EmulationPaused; - - // NOTE: this will NOT write an FCEUNPCMD_POWER into the movie file - FCEUGI* gi = FCEUI_LoadGame(lastLoadedGameName, 0); - //mbg 5/23/08 - wtf? why would this return null? - //if(!gi) PowerNES(); - assert(gi); - - EmulationPaused = oldPaused; - } - suppressMovieStop=false; - disableBatteryLoading=0; - suppressAddPowerCommand=0; + poweron(true); } else { @@ -598,6 +633,11 @@ void FCEUI_SaveMovie(char *fname, uint8 flags) //either dumps the current joystick state or loads one state from the movie void FCEUMOV_AddJoy(uint8 *js, int SkipFlush) { + //todo - for tasedit, either dump or load depending on whether input recording is enabled + //or something like that + //(input recording is just like standard read+write movie recording with input taken from gamepad) + //otherwise, it will come from the tasedit data. + if(movieMode == MOVIEMODE_PLAY) { //stop when we run out of frames @@ -796,24 +836,23 @@ void FCEUMOV_PreLoad(void) load_successful=0; } -int FCEUMOV_PostLoad(void) +bool FCEUMOV_PostLoad(void) { - if(!FCEUI_IsMovieActive()) - return 1; + if(movieMode == MOVIEMODE_INACTIVE || movieMode == MOVIEMODE_TASEDIT) + return true; else - //mbg tasedit hack!!!!!!!!! - return load_successful || moviePleaseLogSavestates; + return load_successful; } -int FCEUI_IsMovieActive(void) -{ - //this is a lame method. we should change all the fceu code that uses it to call the - //IsRecording or IsPlaying methods - //return > 0 for recording, < 0 for playback - if(FCEUMOV_IsRecording()) return 1; - else if(FCEUMOV_IsPlaying()) return -1; - else return 0; -} +//int FCEUI_IsMovieActive(void) +//{ +// //this is a lame method. we should change all the fceu code that uses it to call the +// //IsRecording or IsPlaying methods +// //return > 0 for recording, < 0 for playback +// if(FCEUMOV_IsRecording()) return 1; +// else if(FCEUMOV_IsPlaying()) return -1; +// else return 0; +//} void FCEUI_MovieToggleFrameDisplay(void) { diff --git a/src/movie.h b/src/movie.h index 5e813c63..09c82e0b 100644 --- a/src/movie.h +++ b/src/movie.h @@ -9,16 +9,30 @@ void FCEUMOV_AddJoy(uint8 *, int SkipFlush); void FCEUMOV_AddCommand(int cmd); void FCEU_DrawMovies(uint8 *); -int FCEUMOV_IsPlaying(void); -int FCEUMOV_IsRecording(void); + +enum EMOVIEMODE +{ + MOVIEMODE_INACTIVE = 1, + MOVIEMODE_RECORD = 2, + MOVIEMODE_PLAY = 4, + MOVIEMODE_TASEDIT = 8 +}; + +EMOVIEMODE FCEUMOV_Mode(); +bool FCEUMOV_Mode(EMOVIEMODE modemask); +bool FCEUMOV_Mode(int modemask); + bool FCEUMOV_ShouldPause(void); int FCEUMOV_GetFrame(void); int FCEUMOV_WriteState(FILE* st); int FCEUMOV_WriteState(std::ostream* os); bool FCEUMOV_ReadState(FILE* st, uint32 size); -void FCEUMOV_PreLoad(void); -int FCEUMOV_PostLoad(void); +void FCEUMOV_PreLoad(); +bool FCEUMOV_PostLoad(); + +void FCEUMOV_EnterTasEdit(); +void FCEUMOV_ExitTasEdit(); class MovieRecord diff --git a/src/state.cpp b/src/state.cpp index 830ce434..947ff7d6 100644 --- a/src/state.cpp +++ b/src/state.cpp @@ -305,7 +305,7 @@ static int ReadStateChunks(FILE *st, int32 totalsize) read_snd=1; break; case 6: - if(FCEUI_IsMovieActive()) + if(FCEUMOV_Mode(MOVIEMODE_PLAY|MOVIEMODE_RECORD)) { if(!ReadStateChunk(st,FCEUMOV_STATEINFO,size)) ret=0; } @@ -393,14 +393,13 @@ bool FCEUSS_SaveMS(std::ostream* outstream, int compressionLevel) totalsize+=WriteStateChunk(os,3,FCEUPPU_STATEINFO); totalsize+=WriteStateChunk(os,4,FCEUCTRL_STATEINFO); totalsize+=WriteStateChunk(os,5,FCEUSND_STATEINFO); - if(FCEUI_IsMovieActive()) + if(FCEUMOV_Mode(MOVIEMODE_PLAY|MOVIEMODE_RECORD)) { totalsize+=WriteStateChunk(os,6,FCEUMOV_STATEINFO); //MBG tasedit HACK HACK HACK! //do not save the movie state if we are in tasedit! that is a huge waste of time and space! - extern bool moviePleaseLogSavestates; - if(!moviePleaseLogSavestates) + if(!FCEUMOV_Mode(MOVIEMODE_TASEDIT)) { uint32 size = FCEUMOV_WriteState((std::ostream*)0); os->put(7); @@ -881,14 +880,18 @@ int FCEUI_SelectState(int w, int show) void FCEUI_SaveState(char *fname) { - StateShow=0; - FCEUSS_Save(fname); + if(!FCEU_IsValidUI(FCEUI_SAVESTATE)) return; + + StateShow=0; + FCEUSS_Save(fname); } int loadStateFailed = 0; // hack, this function should return a value instead void FCEUI_LoadState(char *fname) { + if(!FCEU_IsValidUI(FCEUI_LOADSTATE)) return; + StateShow = 0; loadStateFailed = 0; diff --git a/vc8/fceux.vcproj b/vc8/fceux.vcproj index f974a8db..d8128cf4 100644 --- a/vc8/fceux.vcproj +++ b/vc8/fceux.vcproj @@ -43,7 +43,7 @@