diff --git a/src/common/menu/savegamemanager.cpp b/src/common/menu/savegamemanager.cpp index 1350930210c..a20de0f49fd 100644 --- a/src/common/menu/savegamemanager.cpp +++ b/src/common/menu/savegamemanager.cpp @@ -51,6 +51,7 @@ CVAR(String, save_dir, "", CVAR_ARCHIVE | CVAR_GLOBALCONFIG); FString SavegameFolder; +CVAR(Int, save_sort_order, 0, CVAR_ARCHIVE | CVAR_GLOBALCONFIG) //============================================================================= // @@ -136,7 +137,19 @@ int FSavegameManagerBase::InsertSaveNode(FSaveGameNode *node) //if (SaveGames[0] == &NewSaveNode) i++; // To not insert above the "new savegame" dummy entry. for (; i < SaveGames.Size(); i++) { - if (SaveGames[i]->bOldVersion || node->SaveTitle.CompareNoCase(SaveGames[i]->SaveTitle) <= 0) + bool sortcmp = false; + switch(save_sort_order) + { + case 1: + sortcmp = node->CreationTime.CompareNoCase(SaveGames[i]->CreationTime) > 0; + break; + default: + case 0: + sortcmp = node->SaveTitle.CompareNoCase(SaveGames[i]->SaveTitle) <= 0; + break; + } + + if (SaveGames[i]->bOldVersion || sortcmp) { break; } diff --git a/src/common/menu/savegamemanager.h b/src/common/menu/savegamemanager.h index 20b466b53d7..4dd2eb69d49 100644 --- a/src/common/menu/savegamemanager.h +++ b/src/common/menu/savegamemanager.h @@ -11,6 +11,7 @@ struct FSaveGameNode { FString SaveTitle; FString Filename; + FString CreationTime; bool bOldVersion = false; bool bMissingWads = false; bool bNoDelete = false; diff --git a/src/menu/loadsavemenu.cpp b/src/menu/loadsavemenu.cpp index d41f763b39d..b843892b8d1 100644 --- a/src/menu/loadsavemenu.cpp +++ b/src/menu/loadsavemenu.cpp @@ -50,6 +50,8 @@ // Save name length limit for old binary formats. #define OLDSAVESTRINGSIZE 24 +EXTERN_CVAR(Int, save_sort_order) + //============================================================================= // // M_ReadSaveStrings @@ -60,6 +62,14 @@ void FSavegameManager::ReadSaveStrings() { + // re-read list if forced to sort again + static int old_save_sort_order = 0; + if (old_save_sort_order != save_sort_order) + { + ClearSaveGames(); + old_save_sort_order = save_sort_order; + } + if (SaveGames.Size() == 0) { FString filter; @@ -91,6 +101,7 @@ void FSavegameManager::ReadSaveStrings() FString engine = arc.GetString("Engine"); FString iwad = arc.GetString("Game WAD"); FString title = arc.GetString("Title"); + FString creationtime = arc.GetString("Creation Time"); if (engine.Compare(GAMESIG) != 0 || savever > SAVEVER) @@ -120,6 +131,7 @@ void FSavegameManager::ReadSaveStrings() node->bOldVersion = oldVer; node->bMissingWads = missing; node->SaveTitle = title; + node->CreationTime = creationtime; InsertSaveNode(node); } }