Merge tag '12.0-beta1' into jgrpp-beta

# Conflicts:
#	CMakeLists.txt
#	bin/ai/CMakeLists.txt
#	bin/game/CMakeLists.txt
#	src/build_vehicle_gui.cpp
#	src/console_cmds.cpp
#	src/core/overflowsafe_type.hpp
#	src/fios.cpp
#	src/lang/english.txt
#	src/lang/german.txt
#	src/lang/korean.txt
#	src/lang/polish.txt
#	src/network/core/game_info.cpp
#	src/network/core/game_info.h
#	src/network/core/tcp_game.cpp
#	src/network/core/tcp_game.h
#	src/network/network.cpp
#	src/network/network_client.cpp
#	src/network/network_client.h
#	src/network/network_coordinator.cpp
#	src/network/network_gui.cpp
#	src/network/network_server.cpp
#	src/network/network_server.h
#	src/newgrf_engine.cpp
#	src/openttd.cpp
#	src/rev.cpp.in
#	src/settings_type.h
#	src/train.h
#	src/train_cmd.cpp
This commit is contained in:
Jonathan G Rennison
2021-11-02 17:51:38 +00:00
146 changed files with 2391 additions and 2807 deletions

View File

@@ -22,6 +22,7 @@
#include <sys/stat.h>
#include <functional>
#include "3rdparty/optional/ottd_optional.h"
#include <charconv>
#ifndef _WIN32
# include <unistd.h>
@@ -745,3 +746,59 @@ void ScanScenarios()
{
_scanner.Scan(true);
}
/**
* Constructs FiosNumberedSaveName. Initial number is the most recent save, or -1 if not found.
* @param prefix The prefix to use to generate a filename.
*/
FiosNumberedSaveName::FiosNumberedSaveName(const std::string &prefix) : prefix(prefix), number(-1)
{
static std::optional<std::string> _autosave_path;
if (!_autosave_path) _autosave_path = FioFindDirectory(AUTOSAVE_DIR);
static std::string _prefix; ///< Static as the lambda needs access to it.
/* Callback for FiosFileScanner. */
static fios_getlist_callback_proc *proc = [](SaveLoadOperation fop, const std::string &file, const char *ext, char *title, const char *last) {
if (strcasecmp(ext, ".sav") == 0 && StrStartsWith(file, _prefix)) return FIOS_TYPE_FILE;
return FIOS_TYPE_INVALID;
};
/* Prefix to check in the callback. */
_prefix = *_autosave_path + this->prefix;
/* Get the save list. */
FileList list;
FiosFileScanner scanner(SLO_SAVE, proc, list);
scanner.Scan(".sav", _autosave_path->c_str(), false);
/* Find the number for the most recent save, if any. */
if (list.begin() != list.end()) {
SortingBits order = _savegame_sort_order;
_savegame_sort_order = SORT_BY_DATE | SORT_DESCENDING;
std::sort(list.begin(), list.end());
_savegame_sort_order = order;
std::string_view name = list.begin()->title;
std::from_chars(name.data() + this->prefix.size(), name.data() + name.size(), this->number);
}
}
/**
* Generate a savegame name and number according to _settings_client.gui.max_num_autosaves.
* @return A filename in format "<prefix><number>.sav".
*/
std::string FiosNumberedSaveName::Filename()
{
if (++this->number >= _settings_client.gui.max_num_autosaves) this->number = 0;
return stdstr_fmt("%s%u.sav", this->prefix.c_str(), this->number);
}
/**
* Generate an extension for a savegame name.
* @return An extension in format "-<prefix>.sav".
*/
std::string FiosNumberedSaveName::Extension()
{
return stdstr_fmt("-%s.sav", this->prefix.c_str());
}