Always pick up the saveID by latest file time instead of the previously used one.

This fixes SRWAP & SRWMXP.
This commit is contained in:
aquanull 2013-05-19 21:11:54 +08:00
parent ae486f8e02
commit dc25e6d223
3 changed files with 34 additions and 14 deletions

View file

@ -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());

View file

@ -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.

View file

@ -223,6 +223,8 @@ public:
int GetSelectedSave();
void SetSelectedSave(int idx);
int GetLatestSave();
void DoState(PointerWrap &p);
private: