1
0
Fork 1
mirror of https://github.com/TES3MP/openmw-tes3mp.git synced 2025-01-28 20:15:32 +00:00
openmw-tes3mp/apps/openmw/mwstate/quicksavemanager.cpp
Daniel Vukelich 97924d97c7 Add the option for multiple quicksave slots
With more than 1 quicksave slot, slots will be created each time you
quicksave until the maximum number (configured in settings) of
quicksaves has been reached.  After that, the oldest quicksave slot will
be replaced each time you quicksave.  Saves are numbered sequentially,
unless the maximum number of slots is 1, in which case it is not numbered.
2018-01-12 20:09:39 -05:00

73 lines
2.1 KiB
C++

#include "quicksavemanager.hpp"
#include <sstream>
MWState::QuickSaveManager::QuickSaveManager(std::string &saveName, int maxSaves){
this->saveName = saveName;
this->maxSaves = maxSaves;
this->oldestSlotVisited = NULL;
this->oldestSlotId = 0;
this->slotsVisited = 0;
}
void MWState::QuickSaveManager::visitSave(const Slot *saveSlot){
int slotId;
if(tryExtractSlotId(saveSlot->mProfile.mDescription, slotId)){
++slotsVisited;
if(isOldestSave(saveSlot)){
oldestSlotVisited = saveSlot;
oldestSlotId = slotId;
}
}
}
bool MWState::QuickSaveManager::isOldestSave(const Slot *compare){
if(oldestSlotVisited == NULL)
return true;
return (compare->mTimeStamp < oldestSlotVisited->mTimeStamp);
}
bool MWState::QuickSaveManager::tryExtractSlotId(const std::string &slotName, int &extractedId){
std::istringstream formattedExtractor = std::istringstream(slotName);
std::string nameToTest;
formattedExtractor >> nameToTest;
if(nameToTest == saveName){
//Only try to extract the id if maxSaves > 1
//With maxSaves == 1, we don't append the slotId to the name
if(formattedExtractor >> extractedId)
return (isSlotIdValid(extractedId));
else if(maxSaves == 1)
return formattedExtractor.eof();
}
return false;
}
bool MWState::QuickSaveManager::isSlotIdValid(int slotId){
return (slotId > 0 && slotId <= maxSaves);
}
bool MWState::QuickSaveManager::shouldCreateNewSlot(){
return (slotsVisited < maxSaves);
}
const MWState::Slot *MWState::QuickSaveManager::getNextQuickSaveSlot(){
if(shouldCreateNewSlot())
return NULL;
return oldestSlotVisited;
}
std::string MWState::QuickSaveManager::getNextQuickSaveName(){
std::ostringstream nameFormatter;
nameFormatter << saveName;
//Only print the number if there will be more than 1
if(maxSaves > 1)
nameFormatter << " " << calcNextSlotId();
return nameFormatter.str();
}
int MWState::QuickSaveManager::calcNextSlotId(){
if(shouldCreateNewSlot())
return (slotsVisited + 1);
return oldestSlotId;
}