bool FCEU_isFileInArchive(const char *path) { bool isarchive = false; FCEUFILE* fp = FCEU_fopen(path,0,"rb",0,0); if(fp) { isarchive = fp->isArchive(); delete fp; } return isarchive; }
//begin playing an existing movie bool FCEUI_LoadMovie(const char *fname, bool _read_only, int _pauseframe) { 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); //mbg 6/10/08 - we used to call StopMovie here, but that cleared curMovieFilename and gave us crashes... if(movieMode == MOVIEMODE_PLAY || movieMode == MOVIEMODE_FINISHED) StopPlayback(); else if(movieMode == MOVIEMODE_RECORD) StopRecording(); //-------------- currMovieData = MovieData(); strcpy(curMovieFilename, fname); FCEUFILE *fp = FCEU_fopen(fname,0,"rb",0); if (!fp) return false; if(fp->isArchive() && !_read_only) { FCEU_PrintError("Cannot open a movie in read+write from an archive."); return true; //adelikat: file did not fail to load, so return true (false is only for file not exist/unable to open errors } #if defined(WIN32) && !defined(DINGUX) //Fix relative path if necessary and then add to the recent movie menu extern std::string BaseDirectory; string name = fname; if (IsRelativePath(fname)) { name = ConvertRelativePath(name); } AddRecentMovieFile(name.c_str()); #endif LoadFM2(currMovieData, fp->stream, fp->size, false); LoadSubtitles(currMovieData); delete fp; freshMovie = true; //Movie has been loaded, so it must be unaltered if (bindSavestate) AutoSS = false; //If bind savestate to movie is true, then their isn't a valid auto-save to load, so flag it //fully reload the game to reinitialize everything before playing any movie poweron(true); 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 good? } else { movieFromPoweron = true; } //if there is no savestate, we won't have this crucial piece of information at the start of the movie. //so, we have to include it with the movie if(currMovieData.palFlag) FCEUI_SetVidSystem(1); else FCEUI_SetVidSystem(0); //force the input configuration stored in the movie to apply //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 currFrameCounter = 0; pauseframe = _pauseframe; movie_readonly = _read_only; movieMode = MOVIEMODE_PLAY; if(movie_readonly) FCEU_DispMessage("Replay started Read-Only.",0); else FCEU_DispMessage("Replay started Read+Write.",0); #if defined(WIN32) && !defined(DINGUX) SetMainWindowText(); #endif #ifdef CREATE_AVI if(LoggingEnabled) { FCEU_DispMessage("Video recording enabled.\n",0); LoggingEnabled = 2; } #endif return true; }