Merge branch 'master' into jgrpp-beta
# Conflicts: # .github/workflows/commit-checker.yml # src/company_cmd.cpp # src/console_cmds.cpp # src/crashlog.cpp # src/lang/english.txt # src/lang/german.txt # src/lang/indonesian.txt # src/lang/japanese.txt # src/lang/korean.txt # src/lang/swedish.txt # src/linkgraph/linkgraphjob.cpp # src/linkgraph/mcf.cpp # src/network/core/tcp.cpp # src/network/core/tcp.h # src/network/core/tcp_game.h # src/network/core/udp.h # src/network/network.cpp # src/network/network_admin.cpp # src/network/network_admin.h # src/network/network_chat_gui.cpp # src/network/network_client.cpp # src/network/network_client.h # src/network/network_func.h # src/network/network_internal.h # src/network/network_server.cpp # src/network/network_server.h # src/newgrf.cpp # src/newgrf_station.cpp # src/order_gui.cpp # src/rail_cmd.cpp # src/saveload/saveload.cpp # src/settings.cpp # src/settings_gui.cpp # src/settings_internal.h # src/settings_type.h # src/station_cmd.cpp # src/stdafx.h # src/table/currency_settings.ini # src/table/misc_settings.ini # src/table/settings.h.preamble # src/table/settings.ini # src/terraform_cmd.cpp # src/timetable_gui.cpp # src/train_cmd.cpp # src/tree_cmd.cpp # src/water_cmd.cpp
This commit is contained in:
@@ -189,7 +189,7 @@ static void UpdateExclusiveRights()
|
||||
* Build an array town_blocked[ town_id ][ company_id ]
|
||||
* that stores if at least one station in that town is blocked for a company
|
||||
* 2.) Go through that array, if you find a town that is not blocked for
|
||||
* one company, but for all others, then give him exclusivity.
|
||||
* one company, but for all others, then give it exclusivity.
|
||||
*/
|
||||
}
|
||||
|
||||
|
||||
@@ -20,14 +20,14 @@
|
||||
|
||||
#include "../safeguards.h"
|
||||
|
||||
static char _ai_saveload_name[64];
|
||||
static int _ai_saveload_version;
|
||||
static char _ai_saveload_settings[1024];
|
||||
static bool _ai_saveload_is_random;
|
||||
static std::string _ai_saveload_name;
|
||||
static int _ai_saveload_version;
|
||||
static std::string _ai_saveload_settings;
|
||||
static bool _ai_saveload_is_random;
|
||||
|
||||
static const SaveLoad _ai_company[] = {
|
||||
SLEG_STR(_ai_saveload_name, SLE_STRB),
|
||||
SLEG_STR(_ai_saveload_settings, SLE_STRB),
|
||||
SLEG_SSTR(_ai_saveload_name, SLE_STR),
|
||||
SLEG_SSTR(_ai_saveload_settings, SLE_STR),
|
||||
SLEG_CONDVAR(_ai_saveload_version, SLE_UINT32, SLV_108, SL_MAX_VERSION),
|
||||
SLEG_CONDVAR(_ai_saveload_is_random, SLE_BOOL, SLV_136, SL_MAX_VERSION),
|
||||
SLE_END()
|
||||
@@ -39,20 +39,19 @@ static void SaveReal_AIPL(int *index_ptr)
|
||||
AIConfig *config = AIConfig::GetConfig(index);
|
||||
|
||||
if (config->HasScript()) {
|
||||
strecpy(_ai_saveload_name, config->GetName(), lastof(_ai_saveload_name));
|
||||
_ai_saveload_name = config->GetName();
|
||||
_ai_saveload_version = config->GetVersion();
|
||||
} else {
|
||||
/* No AI is configured for this so store an empty string as name. */
|
||||
_ai_saveload_name[0] = '\0';
|
||||
_ai_saveload_name.clear();
|
||||
_ai_saveload_version = -1;
|
||||
}
|
||||
|
||||
_ai_saveload_is_random = config->IsRandom();
|
||||
_ai_saveload_settings[0] = '\0';
|
||||
config->SettingsToString(_ai_saveload_settings, lastof(_ai_saveload_settings));
|
||||
_ai_saveload_settings = config->SettingsToString();
|
||||
|
||||
SlObject(nullptr, _ai_company);
|
||||
/* If the AI was active, store his data too */
|
||||
/* If the AI was active, store its data too */
|
||||
if (Company::IsValidAiID(index)) AI::Save(index);
|
||||
}
|
||||
|
||||
@@ -77,25 +76,25 @@ static void Load_AIPL()
|
||||
}
|
||||
|
||||
AIConfig *config = AIConfig::GetConfig(index, AIConfig::SSS_FORCE_GAME);
|
||||
if (StrEmpty(_ai_saveload_name)) {
|
||||
if (_ai_saveload_name.empty()) {
|
||||
/* A random AI. */
|
||||
config->Change(nullptr, -1, false, true);
|
||||
} else {
|
||||
config->Change(_ai_saveload_name, _ai_saveload_version, false, _ai_saveload_is_random);
|
||||
config->Change(_ai_saveload_name.c_str(), _ai_saveload_version, false, _ai_saveload_is_random);
|
||||
if (!config->HasScript()) {
|
||||
/* No version of the AI available that can load the data. Try to load the
|
||||
* latest version of the AI instead. */
|
||||
config->Change(_ai_saveload_name, -1, false, _ai_saveload_is_random);
|
||||
config->Change(_ai_saveload_name.c_str(), -1, false, _ai_saveload_is_random);
|
||||
if (!config->HasScript()) {
|
||||
if (strcmp(_ai_saveload_name, "%_dummy") != 0) {
|
||||
DEBUG(script, 0, "The savegame has an AI by the name '%s', version %d which is no longer available.", _ai_saveload_name, _ai_saveload_version);
|
||||
if (_ai_saveload_name.compare("%_dummy") != 0) {
|
||||
DEBUG(script, 0, "The savegame has an AI by the name '%s', version %d which is no longer available.", _ai_saveload_name.c_str(), _ai_saveload_version);
|
||||
DEBUG(script, 0, "A random other AI will be loaded in its place.");
|
||||
} else {
|
||||
DEBUG(script, 0, "The savegame had no AIs available at the time of saving.");
|
||||
DEBUG(script, 0, "A random available AI will be loaded now.");
|
||||
}
|
||||
} else {
|
||||
DEBUG(script, 0, "The savegame has an AI by the name '%s', version %d which is no longer available.", _ai_saveload_name, _ai_saveload_version);
|
||||
DEBUG(script, 0, "The savegame has an AI by the name '%s', version %d which is no longer available.", _ai_saveload_name.c_str(), _ai_saveload_version);
|
||||
DEBUG(script, 0, "The latest version of that AI has been loaded instead, but it'll not get the savegame data as it's incompatible.");
|
||||
}
|
||||
/* Make sure the AI doesn't get the saveload data, as it was not the
|
||||
|
||||
@@ -20,14 +20,14 @@
|
||||
|
||||
#include "../safeguards.h"
|
||||
|
||||
static char _game_saveload_name[64];
|
||||
static int _game_saveload_version;
|
||||
static char _game_saveload_settings[1024];
|
||||
static bool _game_saveload_is_random;
|
||||
static std::string _game_saveload_name;
|
||||
static int _game_saveload_version;
|
||||
static std::string _game_saveload_settings;
|
||||
static bool _game_saveload_is_random;
|
||||
|
||||
static const SaveLoad _game_script[] = {
|
||||
SLEG_STR(_game_saveload_name, SLE_STRB),
|
||||
SLEG_STR(_game_saveload_settings, SLE_STRB),
|
||||
SLEG_SSTR(_game_saveload_name, SLE_STR),
|
||||
SLEG_SSTR(_game_saveload_settings, SLE_STR),
|
||||
SLEG_VAR(_game_saveload_version, SLE_UINT32),
|
||||
SLEG_VAR(_game_saveload_is_random, SLE_BOOL),
|
||||
SLE_END()
|
||||
@@ -38,17 +38,16 @@ static void SaveReal_GSDT(int *index_ptr)
|
||||
GameConfig *config = GameConfig::GetConfig();
|
||||
|
||||
if (config->HasScript()) {
|
||||
strecpy(_game_saveload_name, config->GetName(), lastof(_game_saveload_name));
|
||||
_game_saveload_name = config->GetName();
|
||||
_game_saveload_version = config->GetVersion();
|
||||
} else {
|
||||
/* No GameScript is configured for this so store an empty string as name. */
|
||||
_game_saveload_name[0] = '\0';
|
||||
_game_saveload_name.clear();
|
||||
_game_saveload_version = -1;
|
||||
}
|
||||
|
||||
_game_saveload_is_random = config->IsRandom();
|
||||
_game_saveload_settings[0] = '\0';
|
||||
config->SettingsToString(_game_saveload_settings, lastof(_game_saveload_settings));
|
||||
_game_saveload_settings = config->SettingsToString();
|
||||
|
||||
SlObject(nullptr, _game_script);
|
||||
Game::Save();
|
||||
@@ -71,23 +70,22 @@ static void Load_GSDT()
|
||||
}
|
||||
|
||||
GameConfig *config = GameConfig::GetConfig(GameConfig::SSS_FORCE_GAME);
|
||||
if (StrEmpty(_game_saveload_name)) {
|
||||
} else {
|
||||
config->Change(_game_saveload_name, _game_saveload_version, false, _game_saveload_is_random);
|
||||
if (!_game_saveload_name.empty()) {
|
||||
config->Change(_game_saveload_name.c_str(), _game_saveload_version, false, _game_saveload_is_random);
|
||||
if (!config->HasScript()) {
|
||||
/* No version of the GameScript available that can load the data. Try to load the
|
||||
* latest version of the GameScript instead. */
|
||||
config->Change(_game_saveload_name, -1, false, _game_saveload_is_random);
|
||||
config->Change(_game_saveload_name.c_str(), -1, false, _game_saveload_is_random);
|
||||
if (!config->HasScript()) {
|
||||
if (strcmp(_game_saveload_name, "%_dummy") != 0) {
|
||||
DEBUG(script, 0, "The savegame has an GameScript by the name '%s', version %d which is no longer available.", _game_saveload_name, _game_saveload_version);
|
||||
if (_game_saveload_name.compare("%_dummy") != 0) {
|
||||
DEBUG(script, 0, "The savegame has an GameScript by the name '%s', version %d which is no longer available.", _game_saveload_name.c_str(), _game_saveload_version);
|
||||
DEBUG(script, 0, "This game will continue to run without GameScript.");
|
||||
} else {
|
||||
DEBUG(script, 0, "The savegame had no GameScript available at the time of saving.");
|
||||
DEBUG(script, 0, "This game will continue to run without GameScript.");
|
||||
}
|
||||
} else {
|
||||
DEBUG(script, 0, "The savegame has an GameScript by the name '%s', version %d which is no longer available.", _game_saveload_name, _game_saveload_version);
|
||||
DEBUG(script, 0, "The savegame has an GameScript by the name '%s', version %d which is no longer available.", _game_saveload_name.c_str(), _game_saveload_version);
|
||||
DEBUG(script, 0, "The latest version of that GameScript has been loaded instead, but it'll not get the savegame data as it's incompatible.");
|
||||
}
|
||||
/* Make sure the GameScript doesn't get the saveload data, as it was not the
|
||||
|
||||
@@ -154,7 +154,7 @@ static void FilterDescs()
|
||||
*/
|
||||
void Save_LinkGraph(LinkGraph &lg)
|
||||
{
|
||||
uint size = lg.Size();
|
||||
uint16 size = lg.Size();
|
||||
for (NodeID from = 0; from < size; ++from) {
|
||||
Node *node = &lg.nodes[from];
|
||||
SlObjectSaveFiltered(node, _filtered_node_desc.data());
|
||||
|
||||
@@ -80,11 +80,11 @@ const SaveLoadVersion SAVEGAME_VERSION_EXT = (SaveLoadVersion)(0x8000); ///< Sav
|
||||
SavegameType _savegame_type; ///< type of savegame we are loading
|
||||
FileToSaveLoad _file_to_saveload; ///< File to save or load in the openttd loop.
|
||||
|
||||
uint32 _ttdp_version; ///< version of TTDP savegame (if applicable)
|
||||
SaveLoadVersion _sl_version; ///< the major savegame version identifier
|
||||
byte _sl_minor_version; ///< the minor savegame version, DO NOT USE!
|
||||
char _savegame_format[8]; ///< how to compress savegames
|
||||
bool _do_autosave; ///< are we doing an autosave at the moment?
|
||||
uint32 _ttdp_version; ///< version of TTDP savegame (if applicable)
|
||||
SaveLoadVersion _sl_version; ///< the major savegame version identifier
|
||||
byte _sl_minor_version; ///< the minor savegame version, DO NOT USE!
|
||||
std::string _savegame_format; ///< how to compress savegames
|
||||
bool _do_autosave; ///< are we doing an autosave at the moment?
|
||||
|
||||
extern bool _sl_is_ext_version;
|
||||
extern bool _sl_maybe_springpp;
|
||||
@@ -689,7 +689,6 @@ static inline uint SlCalcConvMemLen(VarType conv)
|
||||
|
||||
switch (length << 4) {
|
||||
case SLE_VAR_STRB:
|
||||
case SLE_VAR_STRBQ:
|
||||
case SLE_VAR_STR:
|
||||
case SLE_VAR_STRQ:
|
||||
return SlReadArrayLength();
|
||||
@@ -1036,7 +1035,6 @@ static inline size_t SlCalcStringLen(const void *ptr, size_t length, VarType con
|
||||
len = SIZE_MAX;
|
||||
break;
|
||||
case SLE_VAR_STRB:
|
||||
case SLE_VAR_STRBQ:
|
||||
str = (const char *)ptr;
|
||||
len = length;
|
||||
break;
|
||||
@@ -1060,7 +1058,6 @@ static void SlString(void *ptr, size_t length, VarType conv)
|
||||
switch (GetVarMemType(conv)) {
|
||||
default: NOT_REACHED();
|
||||
case SLE_VAR_STRB:
|
||||
case SLE_VAR_STRBQ:
|
||||
len = SlCalcNetStringLen((char *)ptr, length);
|
||||
break;
|
||||
case SLE_VAR_STR:
|
||||
@@ -1081,7 +1078,6 @@ static void SlString(void *ptr, size_t length, VarType conv)
|
||||
switch (GetVarMemType(conv)) {
|
||||
default: NOT_REACHED();
|
||||
case SLE_VAR_STRB:
|
||||
case SLE_VAR_STRBQ:
|
||||
if (len >= length) {
|
||||
DEBUG(sl, 1, "String length in savegame is bigger than buffer, truncating");
|
||||
SlCopyBytes(ptr, length);
|
||||
@@ -2947,36 +2943,33 @@ static const SaveLoadFormat _saveload_formats[] = {
|
||||
/**
|
||||
* Return the savegameformat of the game. Whether it was created with ZLIB compression
|
||||
* uncompressed, or another type
|
||||
* @param s Name of the savegame format. If nullptr it picks the first available one
|
||||
* @param full_name Name of the savegame format. If empty it picks the first available one
|
||||
* @param compression_level Output for telling what compression level we want.
|
||||
* @return Pointer to SaveLoadFormat struct giving all characteristics of this type of savegame
|
||||
*/
|
||||
static const SaveLoadFormat *GetSavegameFormat(char *s, byte *compression_level, SaveModeFlags flags)
|
||||
static const SaveLoadFormat *GetSavegameFormat(const std::string &full_name, byte *compression_level, SaveModeFlags flags)
|
||||
{
|
||||
const SaveLoadFormat *def = lastof(_saveload_formats);
|
||||
|
||||
/* find default savegame format, the highest one with which files can be written */
|
||||
while (!def->init_write || ((def->flags & SLF_REQUIRES_ZSTD) && !(flags & SMF_ZSTD_OK))) def--;
|
||||
|
||||
if (!StrEmpty(s)) {
|
||||
if (!full_name.empty()) {
|
||||
/* Get the ":..." of the compression level out of the way */
|
||||
char *complevel = strrchr(s, ':');
|
||||
if (complevel != nullptr) *complevel = '\0';
|
||||
size_t separator = full_name.find(':');
|
||||
bool has_comp_level = separator != std::string::npos;
|
||||
const std::string name(full_name, 0, has_comp_level ? separator : full_name.size());
|
||||
|
||||
for (const SaveLoadFormat *slf = &_saveload_formats[0]; slf != endof(_saveload_formats); slf++) {
|
||||
if (slf->init_write != nullptr && strcmp(s, slf->name) == 0) {
|
||||
if (slf->init_write != nullptr && name.compare(slf->name) == 0) {
|
||||
*compression_level = slf->default_compression;
|
||||
if (complevel != nullptr) {
|
||||
/* There is a compression level in the string.
|
||||
* First restore the : we removed to do proper name matching,
|
||||
* then move the the begin of the actual version. */
|
||||
*complevel = ':';
|
||||
complevel++;
|
||||
if (has_comp_level) {
|
||||
const std::string complevel(full_name, separator + 1);
|
||||
|
||||
/* Get the version and determine whether all went fine. */
|
||||
char *end;
|
||||
long level = strtol(complevel, &end, 10);
|
||||
if (end == complevel || level != Clamp(level, slf->min_compression, slf->max_compression)) {
|
||||
/* Get the level and determine whether all went fine. */
|
||||
size_t processed;
|
||||
long level = std::stol(complevel, &processed, 10);
|
||||
if (processed == 0 || level != Clamp(level, slf->min_compression, slf->max_compression)) {
|
||||
SetDParamStr(0, complevel);
|
||||
ShowErrorMessage(STR_CONFIG_ERROR, STR_CONFIG_ERROR_INVALID_SAVEGAME_COMPRESSION_LEVEL, WL_CRITICAL);
|
||||
} else {
|
||||
@@ -2987,12 +2980,9 @@ static const SaveLoadFormat *GetSavegameFormat(char *s, byte *compression_level,
|
||||
}
|
||||
}
|
||||
|
||||
SetDParamStr(0, s);
|
||||
SetDParamStr(0, name);
|
||||
SetDParamStr(1, def->name);
|
||||
ShowErrorMessage(STR_CONFIG_ERROR, STR_CONFIG_ERROR_INVALID_SAVEGAME_COMPRESSION_ALGORITHM, WL_CRITICAL);
|
||||
|
||||
/* Restore the string by adding the : back */
|
||||
if (complevel != nullptr) *complevel = ':';
|
||||
}
|
||||
*compression_level = def->default_compression;
|
||||
return def;
|
||||
@@ -3351,7 +3341,7 @@ static SaveOrLoadResult DoLoad(LoadFilter *reader, bool load_check)
|
||||
fmt = _saveload_formats;
|
||||
for (;;) {
|
||||
if (fmt == endof(_saveload_formats)) {
|
||||
/* Who removed LZO support? Bad bad boy! */
|
||||
/* Who removed LZO support? */
|
||||
NOT_REACHED();
|
||||
}
|
||||
if (fmt->tag == TO_BE32X('OTTD')) break;
|
||||
|
||||
@@ -495,7 +495,6 @@ enum VarTypes {
|
||||
SLE_VAR_U64 = 8 << 4,
|
||||
SLE_VAR_NULL = 9 << 4, ///< useful to write zeros in savegame.
|
||||
SLE_VAR_STRB = 10 << 4, ///< string (with pre-allocated buffer)
|
||||
SLE_VAR_STRBQ = 11 << 4, ///< string enclosed in quotes (with pre-allocated buffer)
|
||||
SLE_VAR_STR = 12 << 4, ///< string pointer
|
||||
SLE_VAR_STRQ = 13 << 4, ///< string pointer enclosed in quotes
|
||||
SLE_VAR_NAME = 14 << 4, ///< old custom name to be converted to a std::string
|
||||
@@ -520,7 +519,6 @@ enum VarTypes {
|
||||
SLE_CHAR = SLE_FILE_I8 | SLE_VAR_CHAR,
|
||||
SLE_STRINGID = SLE_FILE_STRINGID | SLE_VAR_U32,
|
||||
SLE_STRINGBUF = SLE_FILE_STRING | SLE_VAR_STRB,
|
||||
SLE_STRINGBQUOTE = SLE_FILE_STRING | SLE_VAR_STRBQ,
|
||||
SLE_STRING = SLE_FILE_STRING | SLE_VAR_STR,
|
||||
SLE_STRINGQUOTE = SLE_FILE_STRING | SLE_VAR_STRQ,
|
||||
SLE_NAME = SLE_FILE_STRINGID | SLE_VAR_NAME,
|
||||
@@ -531,7 +529,6 @@ enum VarTypes {
|
||||
SLE_UINT = SLE_UINT32,
|
||||
SLE_INT = SLE_INT32,
|
||||
SLE_STRB = SLE_STRINGBUF,
|
||||
SLE_STRBQ = SLE_STRINGBQUOTE,
|
||||
SLE_STR = SLE_STRING,
|
||||
SLE_STRQ = SLE_STRINGQUOTE,
|
||||
|
||||
@@ -1133,7 +1130,7 @@ bool SaveloadCrashWithMissingNewGRFs();
|
||||
void SlResetVENC();
|
||||
void SlProcessVENC();
|
||||
|
||||
extern char _savegame_format[8];
|
||||
extern std::string _savegame_format;
|
||||
extern bool _do_autosave;
|
||||
|
||||
#endif /* SAVELOAD_H */
|
||||
|
||||
Reference in New Issue
Block a user