From 8921fe0d09b7b941fcfe4a869e378919bd2192ab Mon Sep 17 00:00:00 2001 From: rog Date: Fri, 26 Oct 2012 12:06:32 -0400 Subject: [PATCH] move wii saves to a backup if playing a movie that starts with no save --- .../Src/IPC_HLE/WII_IPC_HLE_Device_es.cpp | 41 ++++++++++++++++++- Source/Core/Core/Src/Movie.cpp | 25 ++++++----- 2 files changed, 54 insertions(+), 12 deletions(-) diff --git a/Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_es.cpp b/Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_es.cpp index 246a1bd888..ee0d1b0a22 100644 --- a/Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_es.cpp +++ b/Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_es.cpp @@ -59,6 +59,9 @@ #include "IPC_HLE/WII_IPC_HLE_Device_usb.h" #include "../Movie.h" +#ifdef _WIN32 +#include +#endif std::string CWII_IPC_HLE_Device_es::m_ContentFile; @@ -892,16 +895,50 @@ u32 CWII_IPC_HLE_Device_es::ES_DIVerify(u8* _pTMD, u32 _sz) File::CreateFullPath(tmdPath); File::CreateFullPath(Common::GetTitleDataPath(tmdTitleID)); - + Movie::g_titleID = tmdTitleID; + std::string savePath = Common::GetTitleDataPath(tmdTitleID); if (Movie::IsRecordingInput()) { // TODO: Check for the actual save data - if (File::Exists((Common::GetTitleDataPath(tmdTitleID) + "banner.bin").c_str())) + if (File::Exists((savePath + "banner.bin").c_str())) Movie::g_bClearSave = false; else Movie::g_bClearSave = true; } + if (Movie::IsPlayingInput() && Movie::IsConfigSaved() && Movie::IsStartingFromClearSave()) + { + if (File::Exists((savePath + "banner.bin").c_str())) + { + if (File::Exists((savePath + "../backup/").c_str())) + { + // Dolphin must have crashed while playing back a movie previously, so we'll keep the backup, and just delete the current save + File::DeleteDirRecursively(savePath.c_str()); + } + else + { + #ifdef _WIN32 + MoveFile(savePath.c_str(), (savePath + "../backup/").c_str()); + #else + File::CopyDir(savePath.c_str(),(savePath + "../backup/").c_str()); + File::DeleteDirRecursively(savePath.c_str()); + #endif + } + } + } + else if (File::Exists((savePath + "../backup/").c_str())) + { + // Dolphin must have crashed while playing back a movie previously. Since we're not playing a movie now, we'll delete the save, and use the backup + if (File::Exists((savePath + "banner.bin").c_str())) + File::DeleteDirRecursively(savePath); + #ifdef _WIN32 + MoveFile((savePath + "../backup/").c_str(), savePath.c_str()); + #else + File::CopyDir((savePath + "../backup/").c_str(), savePath.c_str()); + File::DeleteDirRecursively((savePath + "../backup/").c_str()); + #endif + } + if(!File::Exists(tmdPath)) { File::IOFile _pTMDFile(tmdPath, "wb"); diff --git a/Source/Core/Core/Src/Movie.cpp b/Source/Core/Core/Src/Movie.cpp index 10909e358b..d6e9780ba3 100644 --- a/Source/Core/Core/Src/Movie.cpp +++ b/Source/Core/Core/Src/Movie.cpp @@ -103,10 +103,7 @@ void FrameUpdate() } if (IsPlayingInput() && IsConfigSaved()) { - if (IsConfigSaved()) - { - SetGraphicsConfig(); - } + SetGraphicsConfig(); } if (g_bFrameStep) @@ -390,8 +387,7 @@ bool BeginRecordingInput(int controllers) State::SaveAs(tmpStateFilename.c_str()); g_bRecordingFromSaveState = true; - // This is only done here if starting from save state because otherwise we won't have the titleid. - // If not starting from save state, it's set in WII_IPC_HLE_Device_es.cpp. There's probably a way to get this in Movie::Init, but i can't find one. + // This is only done here if starting from save state because otherwise we won't have the titleid. Otherwise it's set in WII_IPC_HLE_Device_es.cpp. // TODO: find a way to GetTitleDataPath() from Movie::Init() if (File::Exists((Common::GetTitleDataPath(g_titleID) + "banner.bin").c_str())) Movie::g_bClearSave = false; @@ -400,7 +396,6 @@ bool BeginRecordingInput(int controllers) } g_playMode = MODE_RECORDING; GetSettings(); - bSaveConfig = true; delete [] tmpInput; tmpInput = new u8[MAX_DTM_LENGTH]; @@ -636,8 +631,8 @@ void ReadHeader() } else { - bSaveConfig = false; GetSettings(); + bSaveConfig = false; } @@ -893,8 +888,7 @@ void PlayController(SPADStatus *PadStatus, int controllerID) return; } - // dtm files don't save the mic button or error bit. not sure if they're actually - // used, but better safe than sorry + // dtm files don't save the mic button or error bit. not sure if they're actually used, but better safe than sorry signed char e = PadStatus->err; memset(PadStatus, 0, sizeof(SPADStatus)); PadStatus->err = e; @@ -1028,6 +1022,17 @@ bool PlayWiimote(int wiimote, u8 *data, const WiimoteEmu::ReportFeatures& rptf, void EndPlayInput(bool cont) { + if (IsPlayingInput() && IsConfigSaved() && IsStartingFromClearSave() && Core::g_CoreStartupParameter.bWii) + { + std::string savePath = Common::GetTitleDataPath(g_titleID); + File::DeleteDirRecursively(savePath.c_str()); + #ifdef _WIN32 + MoveFile((savePath + "../backup/").c_str(), savePath.c_str()); + #else + File::CopyDir((savePath + "../backup/").c_str(), savePath.c_str()); + File::DeleteDirRecursively((savePath + "../backup/").c_str()); + #endif + } if (cont) { g_playMode = MODE_RECORDING;