Add setting for long-term autosaves
A second set of autosaves for whenever the main set wraps around to 0
This commit is contained in:
11
src/fios.cpp
11
src/fios.cpp
@@ -787,7 +787,16 @@ FiosNumberedSaveName::FiosNumberedSaveName(const std::string &prefix) : prefix(p
|
||||
*/
|
||||
std::string FiosNumberedSaveName::Filename()
|
||||
{
|
||||
if (++this->number >= _settings_client.gui.max_num_autosaves) this->number = 0;
|
||||
return this->FilenameUsingMaxSaves(_settings_client.gui.max_num_autosaves);
|
||||
}
|
||||
|
||||
/**
|
||||
* Generate a savegame name and number according to max_saves.
|
||||
* @return A filename in format "<prefix><number>.sav".
|
||||
*/
|
||||
std::string FiosNumberedSaveName::FilenameUsingMaxSaves(int max_saves)
|
||||
{
|
||||
if (++this->number >= max_saves) this->number = 0;
|
||||
return this->FilenameUsingNumber(this->number, "");
|
||||
}
|
||||
|
||||
|
@@ -75,6 +75,7 @@ const char *FindScenario(const ContentInfo *ci, bool md5sum);
|
||||
struct FiosNumberedSaveName {
|
||||
FiosNumberedSaveName(const std::string &prefix);
|
||||
std::string Filename();
|
||||
std::string FilenameUsingMaxSaves(int max_saves);
|
||||
std::string FilenameUsingNumber(int num, const char *suffix) const;
|
||||
std::string Extension();
|
||||
int GetLastNumber() const { return this->number; }
|
||||
|
@@ -2143,13 +2143,23 @@ FiosNumberedSaveName &GetAutoSaveFiosNumberedSaveName()
|
||||
return _autosave_ctr;
|
||||
}
|
||||
|
||||
FiosNumberedSaveName &GetLongTermAutoSaveFiosNumberedSaveName()
|
||||
{
|
||||
static FiosNumberedSaveName _autosave_lt_ctr("ltautosave");
|
||||
return _autosave_lt_ctr;
|
||||
}
|
||||
|
||||
/**
|
||||
* Create an autosave. The default name is "autosave#.sav". However with
|
||||
* the setting 'keep_all_autosave' the name defaults to company-name + date
|
||||
*/
|
||||
static void DoAutosave()
|
||||
{
|
||||
DoAutoOrNetsave(GetAutoSaveFiosNumberedSaveName(), true);
|
||||
FiosNumberedSaveName *lt_counter = nullptr;
|
||||
if (_settings_client.gui.max_num_autosaves > 0) {
|
||||
lt_counter = &GetLongTermAutoSaveFiosNumberedSaveName();
|
||||
}
|
||||
DoAutoOrNetsave(GetAutoSaveFiosNumberedSaveName(), true, lt_counter);
|
||||
}
|
||||
|
||||
/**
|
||||
|
@@ -178,6 +178,7 @@ struct GUISettings : public TimeSettings {
|
||||
bool autosave_on_network_disconnect; ///< save an autosave when you get disconnected from a network game with an error?
|
||||
uint8 date_format_in_default_names; ///< should the default savegame/screenshot name use long dates (31th Dec 2008), short dates (31-12-2008) or ISO dates (2008-12-31)
|
||||
byte max_num_autosaves; ///< controls how many autosavegames are made before the game starts to overwrite (names them 0 to max_num_autosaves - 1)
|
||||
byte max_num_lt_autosaves; ///< controls how many long-term autosavegames are made before the game starts to overwrite (names them 0 to max_num_lt_autosaves - 1)
|
||||
uint8 savegame_overwrite_confirm; ///< Mode for when to warn about overwriting an existing savegame
|
||||
bool population_in_label; ///< show the population of a town in its label?
|
||||
uint8 right_mouse_btn_emulation; ///< should we emulate right mouse clicking?
|
||||
|
@@ -3722,7 +3722,7 @@ SaveOrLoadResult SaveOrLoad(const std::string &filename, SaveLoadOperation fop,
|
||||
* @param counter A reference to the counter variable to be used for rotating the file name.
|
||||
* @param netsave Indicates if this is a regular autosave or a netsave.
|
||||
*/
|
||||
void DoAutoOrNetsave(FiosNumberedSaveName &counter, bool threaded)
|
||||
void DoAutoOrNetsave(FiosNumberedSaveName &counter, bool threaded, FiosNumberedSaveName *lt_counter)
|
||||
{
|
||||
char buf[MAX_PATH];
|
||||
|
||||
@@ -3731,6 +3731,12 @@ void DoAutoOrNetsave(FiosNumberedSaveName &counter, bool threaded)
|
||||
strecat(buf, counter.Extension().c_str(), lastof(buf));
|
||||
} else {
|
||||
strecpy(buf, counter.Filename().c_str(), lastof(buf));
|
||||
if (lt_counter != nullptr && counter.GetLastNumber() == 0) {
|
||||
std::string lt_path = lt_counter->FilenameUsingMaxSaves(_settings_client.gui.max_num_lt_autosaves);
|
||||
DEBUG(sl, 2, "Renaming autosave '%s' to long-term file '%s'", buf, lt_path.c_str());
|
||||
std::string dir = FioFindDirectory(AUTOSAVE_DIR);
|
||||
rename((dir + buf).c_str(), (dir + lt_path).c_str());
|
||||
}
|
||||
}
|
||||
|
||||
DEBUG(sl, 2, "Autosaving to '%s'", buf);
|
||||
|
@@ -68,7 +68,7 @@ void WaitTillSaved();
|
||||
void ProcessAsyncSaveFinish();
|
||||
void DoExitSave();
|
||||
|
||||
void DoAutoOrNetsave(FiosNumberedSaveName &counter, bool threaded);
|
||||
void DoAutoOrNetsave(FiosNumberedSaveName &counter, bool threaded, FiosNumberedSaveName *lt_counter = nullptr);
|
||||
|
||||
SaveOrLoadResult SaveWithFilter(struct SaveFilter *writer, bool threaded, SaveModeFlags flags);
|
||||
SaveOrLoadResult LoadWithFilter(struct LoadFilter *reader);
|
||||
|
@@ -5487,6 +5487,14 @@ def = 16
|
||||
min = 0
|
||||
max = 255
|
||||
|
||||
[SDTC_VAR]
|
||||
var = gui.max_num_lt_autosaves
|
||||
type = SLE_UINT8
|
||||
flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC
|
||||
def = 8
|
||||
min = 0
|
||||
max = 255
|
||||
|
||||
[SDTC_OMANY]
|
||||
var = gui.savegame_overwrite_confirm
|
||||
type = SLE_UINT8
|
||||
|
Reference in New Issue
Block a user