From dc25e6d2239b4a40dff0bcbd6580ba8c09e0236f Mon Sep 17 00:00:00 2001 From: aquanull Date: Sun, 19 May 2013 21:11:54 +0800 Subject: [PATCH] Always pick up the saveID by latest file time instead of the previously used one. This fixes SRWAP & SRWMXP. --- Core/Dialog/PSPSaveDialog.cpp | 12 ++++++------ Core/Dialog/SavedataParam.cpp | 34 ++++++++++++++++++++++++++-------- Core/Dialog/SavedataParam.h | 2 ++ 3 files changed, 34 insertions(+), 14 deletions(-) diff --git a/Core/Dialog/PSPSaveDialog.cpp b/Core/Dialog/PSPSaveDialog.cpp index f3f708eb81..0d3d174ffb 100755 --- a/Core/Dialog/PSPSaveDialog.cpp +++ b/Core/Dialog/PSPSaveDialog.cpp @@ -54,9 +54,9 @@ int PSPSaveDialog::Init(int paramAddr) INFO_LOG(HLE,"sceUtilitySavedataInitStart(%08x)", paramAddr); INFO_LOG(HLE,"Mode: %i", param.GetPspParam()->mode); - currentSelectedSave = 0; yesnoChoice = 1; - switch(param.GetPspParam()->mode) + currentSelectedSave = param.GetLatestSave(); + switch (param.GetPspParam()->mode) { case SCE_UTILITY_SAVEDATA_TYPE_LOAD: DEBUG_LOG(HLE, "Loading. Title: %s Save: %s File: %s", param.GetGameName(param.GetPspParam()).c_str(), param.GetSaveName(param.GetPspParam()).c_str(), param.GetFileName(param.GetPspParam()).c_str()); @@ -64,12 +64,12 @@ int PSPSaveDialog::Init(int paramAddr) display = DS_LOAD_CONFIRM; else display = DS_LOAD_NODATA; - currentSelectedSave = param.GetSelectedSave(); break; case SCE_UTILITY_SAVEDATA_TYPE_AUTOLOAD: DEBUG_LOG(HLE, "Loading. Title: %s Save: %s File: %s", param.GetGameName(param.GetPspParam()).c_str(), param.GetSaveName(param.GetPspParam()).c_str(), param.GetFileName(param.GetPspParam()).c_str()); display = DS_NONE; - currentSelectedSave = param.GetSelectedSave(); + // Is this necessary? + // currentSelectedSave = param.GetSelectedSave(); break; case SCE_UTILITY_SAVEDATA_TYPE_LISTLOAD: DEBUG_LOG(HLE, "Loading. Title: %s Save: %s File: %s", param.GetGameName(param.GetPspParam()).c_str(), param.GetGameName(param.GetPspParam()).c_str(), param.GetFileName(param.GetPspParam()).c_str()); @@ -87,12 +87,12 @@ int PSPSaveDialog::Init(int paramAddr) } else display = DS_SAVE_CONFIRM; - currentSelectedSave = param.GetSelectedSave(); break; case SCE_UTILITY_SAVEDATA_TYPE_AUTOSAVE: DEBUG_LOG(HLE, "Saving. Title: %s Save: %s File: %s", param.GetGameName(param.GetPspParam()).c_str(), param.GetGameName(param.GetPspParam()).c_str(), param.GetFileName(param.GetPspParam()).c_str()); display = DS_NONE; - currentSelectedSave = param.GetSelectedSave(); + // Is this necessary? + // currentSelectedSave = param.GetSelectedSave(); break; case SCE_UTILITY_SAVEDATA_TYPE_LISTSAVE: DEBUG_LOG(HLE, "Saving. Title: %s Save: %s File: %s", param.GetGameName(param.GetPspParam()).c_str(), param.GetGameName(param.GetPspParam()).c_str(), param.GetFileName(param.GetPspParam()).c_str()); diff --git a/Core/Dialog/SavedataParam.cpp b/Core/Dialog/SavedataParam.cpp index 3609ccf497..1c648b8e3e 100644 --- a/Core/Dialog/SavedataParam.cpp +++ b/Core/Dialog/SavedataParam.cpp @@ -985,22 +985,23 @@ int SavedataParam::SetPspParam(SceUtilitySavedataParam *param) listEmptyFile = false; } - char (*saveNameListData)[20]; + typedef char (*SaveNameListData_t)[20]; + SaveNameListData_t saveNameListData; bool hasMultipleFileName = false; if (param->saveNameList != 0) { Clear(); - saveNameListData = (char(*)[20])Memory::GetPointer(param->saveNameList); + saveNameListData = (SaveNameListData_t)Memory::GetPointer(param->saveNameList); // Get number of fileName in array saveDataListCount = 0; - while(saveNameListData[saveDataListCount][0] != 0) + while (saveNameListData[saveDataListCount][0] != 0) { saveDataListCount++; } - if(saveDataListCount > 0) + if (saveDataListCount > 0) { hasMultipleFileName = true; saveDataList = new SaveFileInfo[saveDataListCount]; @@ -1011,7 +1012,7 @@ int SavedataParam::SetPspParam(SceUtilitySavedataParam *param) { DEBUG_LOG(HLE,"Name : %s",saveNameListData[i]); - std::string fileDataPath = savePath+GetGameName(param)+saveNameListData[i]+"/"+param->fileName; + std::string fileDataPath = savePath+GetGameName(param) + saveNameListData[i] + "/" + param->fileName; PSPFileInfo info = pspFileSystem.GetFileInfo(fileDataPath); if (info.exists) { @@ -1033,7 +1034,7 @@ int SavedataParam::SetPspParam(SceUtilitySavedataParam *param) saveNameListDataCount = realCount; } } - if(!hasMultipleFileName) // Load info on only save + if (!hasMultipleFileName) // Load info on only save { saveNameListData = 0; @@ -1044,7 +1045,7 @@ int SavedataParam::SetPspParam(SceUtilitySavedataParam *param) // get and stock file info for each file DEBUG_LOG(HLE,"Name : %s",GetSaveName(param).c_str()); - std::string fileDataPath = savePath+GetGameName(param)+GetSaveName(param)+"/"+param->fileName; + std::string fileDataPath = savePath + GetGameName(param) + GetSaveName(param) + "/" + param->fileName; PSPFileInfo info = pspFileSystem.GetFileInfo(fileDataPath); if (info.exists) { @@ -1187,7 +1188,8 @@ std::string SavedataParam::GetFilename(int idx) int SavedataParam::GetSelectedSave() { - return selectedSave; + // The slot # of the same save on LOAD/SAVE lists can dismatch so this isn't right anyhow + return selectedSave < saveNameListDataCount ? selectedSave : 0; } void SavedataParam::SetSelectedSave(int idx) @@ -1195,6 +1197,22 @@ void SavedataParam::SetSelectedSave(int idx) selectedSave = idx; } +int SavedataParam::GetLatestSave() +{ + int idx = 0; + time_t lastTime = 0; + for (int i = 0; i < saveDataListCount; ++i) + { + time_t thisTime = mktime(&saveDataList[i].modif_time); + if (lastTime < thisTime) + { + idx = i; + lastTime = thisTime; + } + } + return idx; +} + void SavedataParam::DoState(PointerWrap &p) { // pspParam is handled in PSPSaveDialog. diff --git a/Core/Dialog/SavedataParam.h b/Core/Dialog/SavedataParam.h index a993a0cd1f..e4ce11eaf8 100644 --- a/Core/Dialog/SavedataParam.h +++ b/Core/Dialog/SavedataParam.h @@ -223,6 +223,8 @@ public: int GetSelectedSave(); void SetSelectedSave(int idx); + int GetLatestSave(); + void DoState(PointerWrap &p); private: