diff --git a/desmume/src/movie.cpp b/desmume/src/movie.cpp index e340d1f87..b5cc5f1e3 100644 --- a/desmume/src/movie.cpp +++ b/desmume/src/movie.cpp @@ -486,7 +486,47 @@ void FCEUI_StopMovie() freshMovie = false; } +static void LoadSettingsFromMovie(MovieData movieData) +{ + if (currMovieData.useExtBios != -1) + CommonSettings.UseExtBIOS = currMovieData.useExtBios; + if (currMovieData.useExtFirmware != -1) + CommonSettings.UseExtFirmware = currMovieData.useExtFirmware; + if (!CommonSettings.UseExtFirmware) + { + if (currMovieData.firmNickname != "") + { + CommonSettings.fw_config.nickname_len = currMovieData.firmNickname.length() > MAX_FW_NICKNAME_LENGTH ? MAX_FW_NICKNAME_LENGTH : currMovieData.firmNickname.length(); + for (int i = 0; i < CommonSettings.fw_config.nickname_len; i++) + CommonSettings.fw_config.nickname[i] = currMovieData.firmNickname[i]; + } + if (currMovieData.firmMessage != "") + { + CommonSettings.fw_config.message_len = currMovieData.firmMessage.length() > MAX_FW_MESSAGE_LENGTH ? MAX_FW_MESSAGE_LENGTH : currMovieData.firmMessage.length(); + for (int i = 0; i < CommonSettings.fw_config.message_len; i++) + CommonSettings.fw_config.message[i] = currMovieData.firmMessage[i]; + } + if (currMovieData.firmFavColour != -1) + CommonSettings.fw_config.fav_colour = currMovieData.firmFavColour; + if (currMovieData.firmBirthMonth != -1) + CommonSettings.fw_config.birth_month = currMovieData.firmBirthMonth; + if (currMovieData.firmBirthDay != -1) + CommonSettings.fw_config.birth_day = currMovieData.firmBirthDay; + if (currMovieData.firmLanguage != -1) + CommonSettings.fw_config.language = currMovieData.firmLanguage; + + // reset firmware (some games can write to it) + NDS_CreateDummyFirmware(&CommonSettings.fw_config); + } + if (currMovieData.advancedTiming != -1) + CommonSettings.advanced_timing = currMovieData.advancedTiming; + if (currMovieData.jitBlockSize != -1) + { + CommonSettings.use_jit = currMovieData.jitBlockSize != 0; + CommonSettings.jit_max_block_size = currMovieData.jitBlockSize; + } +} //begin playing an existing movie const char* _CDECL_ FCEUI_LoadMovie(const char *fname, bool _read_only, bool tasedit, int _pauseframe) { @@ -547,11 +587,8 @@ const char* _CDECL_ FCEUI_LoadMovie(const char *fname, bool _read_only, bool tas //fully reload the game to reinitialize everything before playing any movie //poweron(true); - // reset firmware (some games can write to it) - if (!CommonSettings.UseExtFirmware) - { - NDS_CreateDummyFirmware(&CommonSettings.fw_config); - } + // set emulation/firmware settings + LoadSettingsFromMovie(currMovieData); NDS_Reset(); diff --git a/desmume/src/movie.h b/desmume/src/movie.h index eae959ea7..08acc376b 100644 --- a/desmume/src/movie.h +++ b/desmume/src/movie.h @@ -155,6 +155,19 @@ public: //was the frame data stored in binary? bool binaryFlag; + int useExtBios = -1; + int useExtFirmware = -1; + + std::string firmNickname = ""; + std::string firmMessage = ""; + int firmFavColour = -1; + int firmBirthMonth = -1; + int firmBirthDay = -1; + int firmLanguage = -1; + + int advancedTiming = -1; + int jitBlockSize = -1; + int getNumRecords() { return records.size(); } class TDictionary : public std::map @@ -206,7 +219,17 @@ private: void installGuid(std::string& val) { guid = Desmume_Guid::fromString(val); } void installRtcStartNew(std::string& val) { DateTime::TryParse(val.c_str(), rtcStart); } void installBinary(std::string& val) { binaryFlag = atoi(val.c_str()) != 0; } - + void installUseExtBios(std::string& val) { useExtBios = atoi(val.c_str()) != 0; } + void installUseExtFirmware(std::string& val) { useExtFirmware = atoi(val.c_str()) != 0; } + void installFirmNickname(std::string& val) { firmNickname = val; } + void installFirmMessage(std::string& val) { firmMessage = val; } + void installFirmFavColour(std::string& val) { firmFavColour = atoi(val.c_str()); } + void installFirmBirthMonth(std::string& val) { firmBirthMonth = atoi(val.c_str()); } + void installFirmBirthDay(std::string& val) { firmBirthDay = atoi(val.c_str()); } + void installFirmLanguage(std::string& val) { firmLanguage = atoi(val.c_str()); } + void installAdvancedTiming(std::string& val) { advancedTiming = atoi(val.c_str()) != 0; } + void installJitBlockSize(std::string& val) { jitBlockSize = atoi(val.c_str()); } + void installRomChecksum(std::string& val); void installRtcStart(std::string& val); void installComment(std::string& val); @@ -226,6 +249,16 @@ private: {"rtcStartNew", &MovieData::installRtcStartNew}, {"comment", &MovieData::installComment}, {"binary", &MovieData::installBinary}, + {"useExtBios", &MovieData::installUseExtBios}, + {"useExtFirmware", &MovieData::installUseExtBios}, + {"firmNickname", &MovieData::installFirmNickname}, + {"firmMessage", &MovieData::installFirmMessage}, + {"firmFavColour", &MovieData::installFirmFavColour}, + {"firmBirthMonth", &MovieData::installFirmBirthMonth}, + {"firmBirthDay", &MovieData::installFirmBirthDay}, + {"firmLanguage", &MovieData::installFirmLanguage}, + {"advancedTiming", &MovieData::installAdvancedTiming}, + {"jitBlockSize", &MovieData::installJitBlockSize}, {"savestate", &MovieData::installSavestate}, {"sram", &MovieData::installSram} };