From 414e12d26be88043000aa7fe540edc974244dcc8 Mon Sep 17 00:00:00 2001 From: Patric Stout Date: Fri, 4 Jun 2021 09:28:38 +0200 Subject: [PATCH 01/27] Codechange: move SLF_NOT_IN_SAVE into settings It is a settings-only flag, so don't pollute SaveLoad code with it. --- src/saveload/saveload.cpp | 5 +---- src/settings.cpp | 6 ++++++ 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/src/saveload/saveload.cpp b/src/saveload/saveload.cpp index 3c95e61e2d..427a19aa95 100644 --- a/src/saveload/saveload.cpp +++ b/src/saveload/saveload.cpp @@ -1408,10 +1408,7 @@ static void SlDeque(void *deque, VarType conv) /** Are we going to save this object or not? */ static inline bool SlIsObjectValidInSavegame(const SaveLoad &sld) { - if (_sl_version < sld.version_from || _sl_version >= sld.version_to) return false; - if (sld.conv & SLF_NOT_IN_SAVE) return false; - - return true; + return (_sl_version >= sld.version_from && _sl_version < sld.version_to); } /** diff --git a/src/settings.cpp b/src/settings.cpp index 60ae20d82e..93caff15dd 100644 --- a/src/settings.cpp +++ b/src/settings.cpp @@ -2023,6 +2023,8 @@ void IConsoleListSettings(const char *prefilter) static void LoadSettings(const SettingTable &settings, void *object) { for (auto &osd : settings) { + if (osd->save.conv & SLF_NOT_IN_SAVE) continue; + void *ptr = GetVariableAddress(object, osd->save); if (!SlObjectMember(ptr, osd->save)) continue; @@ -2045,11 +2047,15 @@ static void SaveSettings(const SettingTable &settings, void *object) * SlCalcLength() because we have a different format. So do this manually */ size_t length = 0; for (auto &sd : settings) { + if (sd->save.conv & SLF_NOT_IN_SAVE) continue; + length += SlCalcObjMemberLength(object, sd->save); } SlSetLength(length); for (auto &sd : settings) { + if (sd->save.conv & SLF_NOT_IN_SAVE) continue; + void *ptr = GetVariableAddress(object, sd->save); SlObjectMember(ptr, sd->save); } From 264991dfa506c0bdebb2e2c936f79a2412dad442 Mon Sep 17 00:00:00 2001 From: Patric Stout Date: Fri, 4 Jun 2021 09:31:28 +0200 Subject: [PATCH 02/27] Codechange: move SLF_NO_NETWORK_SYNC into settings It is a settings-only flag, so don't pollute SaveLoad code with it. --- src/saveload/saveload.cpp | 18 +----------------- src/saveload/saveload.h | 1 + src/settings.cpp | 10 ++++++++-- 3 files changed, 10 insertions(+), 19 deletions(-) diff --git a/src/saveload/saveload.cpp b/src/saveload/saveload.cpp index 427a19aa95..35a6437e18 100644 --- a/src/saveload/saveload.cpp +++ b/src/saveload/saveload.cpp @@ -584,7 +584,7 @@ static inline uint SlGetArrayLength(size_t length) * @param conv VarType type of variable that is used for calculating the size * @return Return the size of this type in bytes */ -static inline uint SlCalcConvMemLen(VarType conv) +uint SlCalcConvMemLen(VarType conv) { static const byte conv_mem_size[] = {1, 1, 1, 2, 2, 4, 4, 8, 8, 0}; byte length = GB(conv, 4, 4); @@ -1411,21 +1411,6 @@ static inline bool SlIsObjectValidInSavegame(const SaveLoad &sld) return (_sl_version >= sld.version_from && _sl_version < sld.version_to); } -/** - * Are we going to load this variable when loading a savegame or not? - * @note If the variable is skipped it is skipped in the savegame - * bytestream itself as well, so there is no need to skip it somewhere else - */ -static inline bool SlSkipVariableOnLoad(const SaveLoad &sld) -{ - if ((sld.conv & SLF_NO_NETWORK_SYNC) && _sl.action != SLA_SAVE && _networking && !_network_server) { - SlSkipBytes(SlCalcConvMemLen(sld.conv) * sld.length); - return true; - } - - return false; -} - /** * Calculate the size of an object. * @param object to be measured. @@ -1538,7 +1523,6 @@ bool SlObjectMember(void *ptr, const SaveLoad &sld) case SL_STDSTR: /* CONDITIONAL saveload types depend on the savegame version */ if (!SlIsObjectValidInSavegame(sld)) return false; - if (SlSkipVariableOnLoad(sld)) return false; switch (sld.cmd) { case SL_VAR: SlSaveLoadConv(ptr, conv); break; diff --git a/src/saveload/saveload.h b/src/saveload/saveload.h index ce597affc4..c178c47313 100644 --- a/src/saveload/saveload.h +++ b/src/saveload/saveload.h @@ -896,6 +896,7 @@ void WriteValue(void *ptr, VarType conv, int64 val); void SlSetArrayIndex(uint index); int SlIterateArray(); +uint SlCalcConvMemLen(VarType conv); void SlAutolength(AutolengthProc *proc, void *arg); size_t SlGetFieldLength(); void SlSetLength(size_t length); diff --git a/src/settings.cpp b/src/settings.cpp index 93caff15dd..c2594277d6 100644 --- a/src/settings.cpp +++ b/src/settings.cpp @@ -2025,9 +2025,15 @@ static void LoadSettings(const SettingTable &settings, void *object) for (auto &osd : settings) { if (osd->save.conv & SLF_NOT_IN_SAVE) continue; - void *ptr = GetVariableAddress(object, osd->save); + SaveLoad sl = osd->save; + if ((osd->save.conv & SLF_NO_NETWORK_SYNC) && _networking && !_network_server) { + /* We don't want to read this setting, so we do need to skip over it. */ + sl = SLE_NULL(static_cast(SlCalcConvMemLen(osd->save.conv) * osd->save.length)); + } + + void *ptr = GetVariableAddress(object, sl); + if (!SlObjectMember(ptr, sl)) continue; - if (!SlObjectMember(ptr, osd->save)) continue; if (osd->IsIntSetting()) { const IntSettingDesc *int_setting = osd->AsIntSetting(); int_setting->MakeValueValidAndWrite(object, int_setting->Read(object)); From 648ee88a02fef70172a108ed7bc511e27984d2c4 Mon Sep 17 00:00:00 2001 From: Patric Stout Date: Thu, 3 Jun 2021 20:55:03 +0200 Subject: [PATCH 03/27] Codechange: merge guiflags and flags in settings .ini files It was rather confusing which one was for what, especially as some SaveLoad flags were settings-only. Clean up this mess a bit by having only Setting flags. --- src/saveload/saveload.h | 11 +- src/script/api/script_gamesettings.cpp | 2 +- src/settings.cpp | 18 +- src/settings_internal.h | 25 +- src/table/settings.h.preamble | 68 +-- src/table/settings/company_settings.ini | 19 +- src/table/settings/currency_settings.ini | 7 +- src/table/settings/gameopt_settings.ini | 29 +- src/table/settings/misc_settings.ini | 15 +- src/table/settings/settings.ini | 584 ++++++++++------------- src/table/settings/win32_settings.ini | 7 +- src/table/settings/window_settings.ini | 7 +- 12 files changed, 352 insertions(+), 440 deletions(-) diff --git a/src/saveload/saveload.h b/src/saveload/saveload.h index c178c47313..94138eb747 100644 --- a/src/saveload/saveload.h +++ b/src/saveload/saveload.h @@ -485,11 +485,8 @@ enum VarTypes { /* 8 bits allocated for a maximum of 8 flags * Flags directing saving/loading of a variable */ - SLF_NOT_IN_SAVE = 1 << 8, ///< do not save with savegame, basically client-based - SLF_NOT_IN_CONFIG = 1 << 9, ///< do not save to config file - SLF_NO_NETWORK_SYNC = 1 << 10, ///< do not synchronize over network (but it is saved if SLF_NOT_IN_SAVE is not set) - SLF_ALLOW_CONTROL = 1 << 11, ///< allow control codes in the strings - SLF_ALLOW_NEWLINE = 1 << 12, ///< allow new lines in the strings + SLF_ALLOW_CONTROL = 1 << 8, ///< Allow control codes in the strings. + SLF_ALLOW_NEWLINE = 1 << 9, ///< Allow new lines in the strings. }; typedef uint32 VarType; @@ -673,7 +670,7 @@ using SaveLoadTable = span; * @param from First savegame version that has the empty space. * @param to Last savegame version that has the empty space. */ -#define SLE_CONDNULL(length, from, to) {SL_ARR, SLE_FILE_U8 | SLE_VAR_NULL | SLF_NOT_IN_CONFIG, length, from, to, 0, nullptr, 0} +#define SLE_CONDNULL(length, from, to) {SL_ARR, SLE_FILE_U8 | SLE_VAR_NULL, length, from, to, 0, nullptr, 0} /** Translate values ingame to different values in the savegame and vv. */ #define SLE_WRITEBYTE(base, variable) SLE_GENERAL(SL_WRITEBYTE, base, variable, 0, 0, SL_MIN_VERSION, SL_MAX_VERSION, 0) @@ -797,7 +794,7 @@ using SaveLoadTable = span; * @param from First savegame version that has the empty space. * @param to Last savegame version that has the empty space. */ -#define SLEG_CONDNULL(length, from, to) {SL_ARR, SLE_FILE_U8 | SLE_VAR_NULL | SLF_NOT_IN_CONFIG, length, from, to, 0, nullptr, 0} +#define SLEG_CONDNULL(length, from, to) {SL_ARR, SLE_FILE_U8 | SLE_VAR_NULL, length, from, to, 0, nullptr, 0} /** * Checks whether the savegame is below \a major.\a minor. diff --git a/src/script/api/script_gamesettings.cpp b/src/script/api/script_gamesettings.cpp index b1699d94f6..458545226f 100644 --- a/src/script/api/script_gamesettings.cpp +++ b/src/script/api/script_gamesettings.cpp @@ -35,7 +35,7 @@ const SettingDesc *sd = GetSettingFromName(setting); - if ((sd->save.conv & SLF_NO_NETWORK_SYNC) != 0) return false; + if ((sd->flags & SF_NO_NETWORK_SYNC) != 0) return false; return ScriptObject::DoCommand(0, 0, value, CMD_CHANGE_SETTING, sd->name); } diff --git a/src/settings.cpp b/src/settings.cpp index c2594277d6..c3afd55089 100644 --- a/src/settings.cpp +++ b/src/settings.cpp @@ -591,7 +591,7 @@ static void IniSaveSettings(IniFile *ini, const SettingTable &settings_table, co /* If the setting is not saved to the configuration * file, just continue with the next setting */ if (!SlIsObjectCurrentlyValid(sd->save.version_from, sd->save.version_to)) continue; - if (sd->save.conv & SLF_NOT_IN_CONFIG) continue; + if (sd->flags & SF_NOT_IN_CONFIG) continue; /* XXX - wtf is this?? (group override?) */ std::string s{ sd->name }; @@ -741,7 +741,7 @@ void IniSaveWindowSettings(IniFile *ini, const char *grpname, void *desc) */ bool SettingDesc::IsEditable(bool do_command) const { - if (!do_command && !(this->save.conv & SLF_NO_NETWORK_SYNC) && _networking && !_network_server && !(this->flags & SF_PER_COMPANY)) return false; + if (!do_command && !(this->flags & SF_NO_NETWORK_SYNC) && _networking && !_network_server && !(this->flags & SF_PER_COMPANY)) return false; if ((this->flags & SF_NETWORK_ONLY) && !_networking && _game_mode != GM_MENU) return false; if ((this->flags & SF_NO_NETWORK) && _networking) return false; if ((this->flags & SF_NEWGAME_ONLY) && @@ -758,7 +758,7 @@ bool SettingDesc::IsEditable(bool do_command) const SettingType SettingDesc::GetType() const { if (this->flags & SF_PER_COMPANY) return ST_COMPANY; - return (this->save.conv & SLF_NOT_IN_SAVE) ? ST_CLIENT : ST_GAME; + return (this->flags & SF_NOT_IN_SAVE) ? ST_CLIENT : ST_GAME; } /** @@ -1844,7 +1844,7 @@ bool SetSettingValue(const IntSettingDesc *sd, int32 value, bool force_newgame) * (if any) to change. Also *hack*hack* we update the _newgame version * of settings because changing a company-based setting in a game also * changes its defaults. At least that is the convention we have chosen */ - if (setting->save.conv & SLF_NO_NETWORK_SYNC) { + if (setting->flags & SF_NO_NETWORK_SYNC) { if (_game_mode != GM_MENU) { setting->ChangeValue(&_settings_newgame, value); } @@ -1899,7 +1899,7 @@ void SyncCompanySettings() */ bool SetSettingValue(const StringSettingDesc *sd, std::string value, bool force_newgame) { - assert(sd->save.conv & SLF_NO_NETWORK_SYNC); + assert(sd->flags & SF_NO_NETWORK_SYNC); if (GetVarMemType(sd->save.conv) == SLE_VAR_STRQ && value.compare("(null)") == 0) { value.clear(); @@ -2023,10 +2023,10 @@ void IConsoleListSettings(const char *prefilter) static void LoadSettings(const SettingTable &settings, void *object) { for (auto &osd : settings) { - if (osd->save.conv & SLF_NOT_IN_SAVE) continue; + if (osd->flags & SF_NOT_IN_SAVE) continue; SaveLoad sl = osd->save; - if ((osd->save.conv & SLF_NO_NETWORK_SYNC) && _networking && !_network_server) { + if ((osd->flags & SF_NO_NETWORK_SYNC) && _networking && !_network_server) { /* We don't want to read this setting, so we do need to skip over it. */ sl = SLE_NULL(static_cast(SlCalcConvMemLen(osd->save.conv) * osd->save.length)); } @@ -2053,14 +2053,14 @@ static void SaveSettings(const SettingTable &settings, void *object) * SlCalcLength() because we have a different format. So do this manually */ size_t length = 0; for (auto &sd : settings) { - if (sd->save.conv & SLF_NOT_IN_SAVE) continue; + if (sd->flags & SF_NOT_IN_SAVE) continue; length += SlCalcObjMemberLength(object, sd->save); } SlSetLength(length); for (auto &sd : settings) { - if (sd->save.conv & SLF_NOT_IN_SAVE) continue; + if (sd->flags & SF_NOT_IN_SAVE) continue; void *ptr = GetVariableAddress(object, sd->save); SlObjectMember(ptr, sd->save); diff --git a/src/settings_internal.h b/src/settings_internal.h index 351c66ea3c..a625f576c2 100644 --- a/src/settings_internal.h +++ b/src/settings_internal.h @@ -14,16 +14,19 @@ enum SettingFlag : uint16 { SF_NONE = 0, - SF_GUI_0_IS_SPECIAL = 1 << 0, ///< A value of zero is possible and has a custom string (the one after "strval"). - SF_GUI_NEGATIVE_IS_SPECIAL = 1 << 1, ///< A negative value has another string (the one after "strval"). - SF_GUI_DROPDOWN = 1 << 2, ///< The value represents a limited number of string-options (internally integer) presented as dropdown. - SF_GUI_CURRENCY = 1 << 3, ///< The number represents money, so when reading value multiply by exchange rate. - SF_NETWORK_ONLY = 1 << 4, ///< This setting only applies to network games. - SF_NO_NETWORK = 1 << 5, ///< This setting does not apply to network games; it may not be changed during the game. - SF_NEWGAME_ONLY = 1 << 6, ///< This setting cannot be changed in a game. - SF_SCENEDIT_TOO = 1 << 7, ///< This setting can be changed in the scenario editor (only makes sense when SF_NEWGAME_ONLY is set). - SF_SCENEDIT_ONLY = 1 << 8, ///< This setting can only be changed in the scenario editor. - SF_PER_COMPANY = 1 << 9, ///< This setting can be different for each company (saved in company struct). + SF_GUI_0_IS_SPECIAL = 1 << 0, ///< A value of zero is possible and has a custom string (the one after "strval"). + SF_GUI_NEGATIVE_IS_SPECIAL = 1 << 1, ///< A negative value has another string (the one after "strval"). + SF_GUI_DROPDOWN = 1 << 2, ///< The value represents a limited number of string-options (internally integer) presented as dropdown. + SF_GUI_CURRENCY = 1 << 3, ///< The number represents money, so when reading value multiply by exchange rate. + SF_NETWORK_ONLY = 1 << 4, ///< This setting only applies to network games. + SF_NO_NETWORK = 1 << 5, ///< This setting does not apply to network games; it may not be changed during the game. + SF_NEWGAME_ONLY = 1 << 6, ///< This setting cannot be changed in a game. + SF_SCENEDIT_TOO = 1 << 7, ///< This setting can be changed in the scenario editor (only makes sense when SF_NEWGAME_ONLY is set). + SF_SCENEDIT_ONLY = 1 << 8, ///< This setting can only be changed in the scenario editor. + SF_PER_COMPANY = 1 << 9, ///< This setting can be different for each company (saved in company struct). + SF_NOT_IN_SAVE = 1 << 10, ///< Do not save with savegame, basically client-based. + SF_NOT_IN_CONFIG = 1 << 11, ///< Do not save to config file. + SF_NO_NETWORK_SYNC = 1 << 12, ///< Do not synchronize over network (but it is saved if SF_NOT_IN_SAVE is not set). }; DECLARE_ENUM_AS_BIT_SET(SettingFlag) @@ -288,7 +291,7 @@ struct ListSettingDesc : SettingDesc { /** Placeholder for settings that have been removed, but might still linger in the savegame. */ struct NullSettingDesc : SettingDesc { NullSettingDesc(SaveLoad save) : - SettingDesc(save, "", SF_NONE, false) {} + SettingDesc(save, "", SF_NOT_IN_CONFIG, false) {} virtual ~NullSettingDesc() {} void FormatValue(char *buf, const char *last, const void *object) const override { NOT_REACHED(); } diff --git a/src/table/settings.h.preamble b/src/table/settings.h.preamble index 3c8e6cb721..c9b47626c4 100644 --- a/src/table/settings.h.preamble +++ b/src/table/settings.h.preamble @@ -58,62 +58,62 @@ static size_t ConvertLandscape(const char *value); /* Macros for various objects to go in the configuration file. * This section is for global variables */ -#define SDTG_VAR(name, type, flags, guiflags, var, def, min, max, interval, str, strhelp, strval, pre_check, post_callback, from, to, cat, extra, startup)\ - NSD(Int, SLEG_GENERAL(SL_VAR, var, type | flags, 1, from, to, extra), name, guiflags, startup, def, min, max, interval, str, strhelp, strval, cat, pre_check, post_callback) +#define SDTG_VAR(name, type, flags, var, def, min, max, interval, str, strhelp, strval, pre_check, post_callback, from, to, cat, extra, startup)\ + NSD(Int, SLEG_GENERAL(SL_VAR, var, type, 1, from, to, extra), name, flags, startup, def, min, max, interval, str, strhelp, strval, cat, pre_check, post_callback) -#define SDTG_BOOL(name, flags, guiflags, var, def, str, strhelp, strval, pre_check, post_callback, from, to, cat, extra, startup)\ - NSD(Bool, SLEG_GENERAL(SL_VAR, var, SLE_BOOL | flags, 1, from, to, extra), name, guiflags, startup, def, str, strhelp, strval, cat, pre_check, post_callback) +#define SDTG_BOOL(name, flags, var, def, str, strhelp, strval, pre_check, post_callback, from, to, cat, extra, startup)\ + NSD(Bool, SLEG_GENERAL(SL_VAR, var, SLE_BOOL, 1, from, to, extra), name, flags, startup, def, str, strhelp, strval, cat, pre_check, post_callback) -#define SDTG_LIST(name, type, flags, guiflags, var, def, length, from, to, cat, extra, startup)\ - NSD(List, SLEG_GENERAL(SL_ARR, var, type | flags, length, from, to, extra), name, guiflags, startup, def) +#define SDTG_LIST(name, type, flags, var, def, length, from, to, cat, extra, startup)\ + NSD(List, SLEG_GENERAL(SL_ARR, var, type, length, from, to, extra), name, flags, startup, def) -#define SDTG_SSTR(name, type, flags, guiflags, var, def, max_length, pre_check, post_callback, from, to, cat, extra, startup)\ - NSD(String, SLEG_GENERAL(SL_STDSTR, var, type | flags, sizeof(var), from, to, extra), name, guiflags, startup, def, max_length, pre_check, post_callback) +#define SDTG_SSTR(name, type, flags, var, def, max_length, pre_check, post_callback, from, to, cat, extra, startup)\ + NSD(String, SLEG_GENERAL(SL_STDSTR, var, type, sizeof(var), from, to, extra), name, flags, startup, def, max_length, pre_check, post_callback) -#define SDTG_OMANY(name, type, flags, guiflags, var, def, max, full, str, strhelp, strval, pre_check, post_callback, from, to, cat, extra, startup)\ - NSD(OneOfMany, SLEG_GENERAL(SL_VAR, var, type | flags, 1, from, to, extra), name, guiflags, startup, def, max, str, strhelp, strval, cat, pre_check, post_callback, full, nullptr) +#define SDTG_OMANY(name, type, flags, var, def, max, full, str, strhelp, strval, pre_check, post_callback, from, to, cat, extra, startup)\ + NSD(OneOfMany, SLEG_GENERAL(SL_VAR, var, type, 1, from, to, extra), name, flags, startup, def, max, str, strhelp, strval, cat, pre_check, post_callback, full, nullptr) -#define SDTG_MMANY(name, type, flags, guiflags, var, def, full, str, strhelp, strval, pre_check, post_callback, from, to, cat, extra, startup)\ - NSD(ManyOfMany, SLEG_GENERAL(SL_VAR, var, type | flags, 1, from, to, extra), name, guiflags, startup, def, str, strhelp, strval, cat, pre_check, post_callback, full, nullptr) +#define SDTG_MMANY(name, type, flags, var, def, full, str, strhelp, strval, pre_check, post_callback, from, to, cat, extra, startup)\ + NSD(ManyOfMany, SLEG_GENERAL(SL_VAR, var, type, 1, from, to, extra), name, flags, startup, def, str, strhelp, strval, cat, pre_check, post_callback, full, nullptr) #define SDTG_NULL(length, from, to)\ NSD(Null, SLEG_NULL(length, from, to)) /* Macros for various objects to go in the configuration file. * This section is for structures where their various members are saved */ -#define SDT_VAR(base, var, type, flags, guiflags, def, min, max, interval, str, strhelp, strval, pre_check, post_callback, from, to, cat, extra, startup)\ - NSD(Int, SLE_GENERAL(SL_VAR, base, var, type | flags, 1, from, to, extra), #var, guiflags, startup, def, min, max, interval, str, strhelp, strval, cat, pre_check, post_callback) +#define SDT_VAR(base, var, type, flags, def, min, max, interval, str, strhelp, strval, pre_check, post_callback, from, to, cat, extra, startup)\ + NSD(Int, SLE_GENERAL(SL_VAR, base, var, type, 1, from, to, extra), #var, flags, startup, def, min, max, interval, str, strhelp, strval, cat, pre_check, post_callback) -#define SDT_BOOL(base, var, flags, guiflags, def, str, strhelp, strval, pre_check, post_callback, from, to, cat, extra, startup)\ - NSD(Bool, SLE_GENERAL(SL_VAR, base, var, SLE_BOOL | flags, 1, from, to, extra), #var, guiflags, startup, def, str, strhelp, strval, cat, pre_check, post_callback) +#define SDT_BOOL(base, var, flags, def, str, strhelp, strval, pre_check, post_callback, from, to, cat, extra, startup)\ + NSD(Bool, SLE_GENERAL(SL_VAR, base, var, SLE_BOOL, 1, from, to, extra), #var, flags, startup, def, str, strhelp, strval, cat, pre_check, post_callback) -#define SDT_LIST(base, var, type, flags, guiflags, def, from, to, cat, extra, startup)\ - NSD(List, SLE_GENERAL(SL_ARR, base, var, type | flags, lengthof(((base*)8)->var), from, to, extra), #var, guiflags, startup, def) +#define SDT_LIST(base, var, type, flags, def, from, to, cat, extra, startup)\ + NSD(List, SLE_GENERAL(SL_ARR, base, var, type, lengthof(((base*)8)->var), from, to, extra), #var, flags, startup, def) -#define SDT_SSTR(base, var, type, flags, guiflags, def, pre_check, post_callback, from, to, cat, extra, startup)\ - NSD(String, SLE_GENERAL(SL_STDSTR, base, var, type | flags, sizeof(((base*)8)->var), from, to, extra), #var, guiflags, startup, def, 0, pre_check, post_callback) +#define SDT_SSTR(base, var, type, flags, def, pre_check, post_callback, from, to, cat, extra, startup)\ + NSD(String, SLE_GENERAL(SL_STDSTR, base, var, type, sizeof(((base*)8)->var), from, to, extra), #var, flags, startup, def, 0, pre_check, post_callback) -#define SDT_OMANY(base, var, type, flags, guiflags, def, max, full, str, strhelp, strval, pre_check, post_callback, from, to, load, cat, extra, startup)\ - NSD(OneOfMany, SLE_GENERAL(SL_VAR, base, var, type | flags, 1, from, to, extra), #var, guiflags, startup, def, max, str, strhelp, strval, cat, pre_check, post_callback, full, load) +#define SDT_OMANY(base, var, type, flags, def, max, full, str, strhelp, strval, pre_check, post_callback, from, to, load, cat, extra, startup)\ + NSD(OneOfMany, SLE_GENERAL(SL_VAR, base, var, type, 1, from, to, extra), #var, flags, startup, def, max, str, strhelp, strval, cat, pre_check, post_callback, full, load) -#define SDT_MMANY(base, var, type, flags, guiflags, def, full, str, pre_check, post_callback, strhelp, strval, from, to, cat, extra, startup)\ - NSD(ManyOfMany, SLE_GENERAL(SL_VAR, base, var, type | flags, 1, from, to, extra), #var, guiflags, startup, def, str, strhelp, strval, cat, pre_check, post_callback, full, nullptr) +#define SDT_MMANY(base, var, type, flags, def, full, str, pre_check, post_callback, strhelp, strval, from, to, cat, extra, startup)\ + NSD(ManyOfMany, SLE_GENERAL(SL_VAR, base, var, type, 1, from, to, extra), #var, flags, startup, def, str, strhelp, strval, cat, pre_check, post_callback, full, nullptr) #define SDT_NULL(length, from, to)\ NSD(Null, SLE_CONDNULL(length, from, to)) -#define SDTC_VAR(var, type, flags, guiflags, def, min, max, interval, str, strhelp, strval, pre_check, post_callback, from, to, cat, extra, startup)\ - SDTG_VAR(#var, type, flags, guiflags, _settings_client.var, def, min, max, interval, str, strhelp, strval, pre_check, post_callback, from, to, cat, extra, startup) +#define SDTC_VAR(var, type, flags, def, min, max, interval, str, strhelp, strval, pre_check, post_callback, from, to, cat, extra, startup)\ + SDTG_VAR(#var, type, flags, _settings_client.var, def, min, max, interval, str, strhelp, strval, pre_check, post_callback, from, to, cat, extra, startup) -#define SDTC_BOOL(var, flags, guiflags, def, str, strhelp, strval, pre_check, post_callback, from, to, cat, extra, startup)\ - SDTG_BOOL(#var, flags, guiflags, _settings_client.var, def, str, strhelp, strval, pre_check, post_callback, from, to, cat, extra, startup) +#define SDTC_BOOL(var, flags, def, str, strhelp, strval, pre_check, post_callback, from, to, cat, extra, startup)\ + SDTG_BOOL(#var, flags, _settings_client.var, def, str, strhelp, strval, pre_check, post_callback, from, to, cat, extra, startup) -#define SDTC_LIST(var, type, flags, guiflags, def, from, to, cat, extra, startup)\ - SDTG_LIST(#var, type, flags, guiflags, _settings_client.var, def, lengthof(_settings_client.var), from, to, cat, extra, startup) +#define SDTC_LIST(var, type, flags, def, from, to, cat, extra, startup)\ + SDTG_LIST(#var, type, flags, _settings_client.var, def, lengthof(_settings_client.var), from, to, cat, extra, startup) -#define SDTC_SSTR(var, type, flags, guiflags, def, max_length, pre_check, post_callback, from, to, cat, extra, startup)\ - SDTG_SSTR(#var, type, flags, guiflags, _settings_client.var, def, max_length, pre_check, post_callback, from, to, cat, extra, startup)\ +#define SDTC_SSTR(var, type, flags, def, max_length, pre_check, post_callback, from, to, cat, extra, startup)\ + SDTG_SSTR(#var, type, flags, _settings_client.var, def, max_length, pre_check, post_callback, from, to, cat, extra, startup)\ -#define SDTC_OMANY(var, type, flags, guiflags, def, max, full, str, strhelp, strval, pre_check, post_callback, from, to, cat, extra, startup)\ - SDTG_OMANY(#var, type, flags, guiflags, _settings_client.var, def, max, full, str, strhelp, strval, pre_check, post_callback, from, to, cat, extra, startup) +#define SDTC_OMANY(var, type, flags, def, max, full, str, strhelp, strval, pre_check, post_callback, from, to, cat, extra, startup)\ + SDTG_OMANY(#var, type, flags, _settings_client.var, def, max, full, str, strhelp, strval, pre_check, post_callback, from, to, cat, extra, startup) diff --git a/src/table/settings/company_settings.ini b/src/table/settings/company_settings.ini index 6b6a17c967..469e1aceae 100644 --- a/src/table/settings/company_settings.ini +++ b/src/table/settings/company_settings.ini @@ -16,15 +16,14 @@ static const SettingTable _company_settings{ [post-amble] }; [templates] -SDT_BOOL = SDT_BOOL(CompanySettings, $var, $flags, $guiflags, $def, $str, $strhelp, $strval, $pre_cb, $post_cb, $from, $to, $cat, $extra, $startup), -SDT_VAR = SDT_VAR(CompanySettings, $var, $type, $flags, $guiflags, $def, $min, $max, $interval, $str, $strhelp, $strval, $pre_cb, $post_cb, $from, $to, $cat, $extra, $startup), +SDT_BOOL = SDT_BOOL(CompanySettings, $var, $flags, $def, $str, $strhelp, $strval, $pre_cb, $post_cb, $from, $to, $cat, $extra, $startup), +SDT_VAR = SDT_VAR(CompanySettings, $var, $type, $flags, $def, $min, $max, $interval, $str, $strhelp, $strval, $pre_cb, $post_cb, $from, $to, $cat, $extra, $startup), [validation] SDT_VAR = static_assert($max <= MAX_$type, "Maximum value for CompanySettings.$var exceeds storage size"); [defaults] -flags = 0 -guiflags = SF_PER_COMPANY +flags = SF_PER_COMPANY interval = 0 str = STR_NULL strhelp = STR_CONFIG_SETTING_NO_EXPLANATION_AVAILABLE_HELPTEXT @@ -50,7 +49,7 @@ cat = SC_BASIC [SDT_VAR] var = engine_renew_months type = SLE_INT16 -guiflags = SF_PER_COMPANY | SF_GUI_NEGATIVE_IS_SPECIAL +flags = SF_PER_COMPANY | SF_GUI_NEGATIVE_IS_SPECIAL def = 6 min = -12 max = 12 @@ -61,7 +60,7 @@ strval = STR_CONFIG_SETTING_AUTORENEW_MONTHS_VALUE_BEFORE [SDT_VAR] var = engine_renew_money type = SLE_UINT -guiflags = SF_PER_COMPANY | SF_GUI_CURRENCY +flags = SF_PER_COMPANY | SF_GUI_CURRENCY def = 100000 min = 0 max = 2000000 @@ -83,7 +82,7 @@ post_cb = UpdateServiceInterval [SDT_VAR] var = vehicle.servint_trains type = SLE_UINT16 -guiflags = SF_PER_COMPANY | SF_GUI_0_IS_SPECIAL +flags = SF_PER_COMPANY | SF_GUI_0_IS_SPECIAL def = 150 min = 5 max = 800 @@ -96,7 +95,7 @@ post_cb = [](auto new_value) { UpdateServiceInterval(VEH_TRAIN, new_value); } [SDT_VAR] var = vehicle.servint_roadveh type = SLE_UINT16 -guiflags = SF_PER_COMPANY | SF_GUI_0_IS_SPECIAL +flags = SF_PER_COMPANY | SF_GUI_0_IS_SPECIAL def = 150 min = 5 max = 800 @@ -109,7 +108,7 @@ post_cb = [](auto new_value) { UpdateServiceInterval(VEH_ROAD, new_value); } [SDT_VAR] var = vehicle.servint_ships type = SLE_UINT16 -guiflags = SF_PER_COMPANY | SF_GUI_0_IS_SPECIAL +flags = SF_PER_COMPANY | SF_GUI_0_IS_SPECIAL def = 360 min = 5 max = 800 @@ -122,7 +121,7 @@ post_cb = [](auto new_value) { UpdateServiceInterval(VEH_SHIP, new_value); } [SDT_VAR] var = vehicle.servint_aircraft type = SLE_UINT16 -guiflags = SF_PER_COMPANY | SF_GUI_0_IS_SPECIAL +flags = SF_PER_COMPANY | SF_GUI_0_IS_SPECIAL def = 100 min = 5 max = 800 diff --git a/src/table/settings/currency_settings.ini b/src/table/settings/currency_settings.ini index 8e359d5c02..c8ba3d76cd 100644 --- a/src/table/settings/currency_settings.ini +++ b/src/table/settings/currency_settings.ini @@ -11,15 +11,14 @@ static const SettingTable _currency_settings{ [post-amble] }; [templates] -SDT_VAR = SDT_VAR (CurrencySpec, $var, $type, $flags, $guiflags, $def, $min, $max, $interval, $str, $strhelp, $strval, $pre_cb, $post_cb, $from, $to, $cat, $extra, $startup), -SDT_SSTR = SDT_SSTR(CurrencySpec, $var, $type, $flags, $guiflags, $def, $pre_cb, $post_cb, $from, $to, $cat, $extra, $startup), +SDT_VAR = SDT_VAR (CurrencySpec, $var, $type, $flags, $def, $min, $max, $interval, $str, $strhelp, $strval, $pre_cb, $post_cb, $from, $to, $cat, $extra, $startup), +SDT_SSTR = SDT_SSTR(CurrencySpec, $var, $type, $flags, $def, $pre_cb, $post_cb, $from, $to, $cat, $extra, $startup), [validation] SDT_VAR = static_assert($max <= MAX_$type, "Maximum value for CurrencySpec.$var exceeds storage size"); [defaults] -flags = SLF_NOT_IN_SAVE | SLF_NO_NETWORK_SYNC -guiflags = SF_NONE +flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC interval = 0 str = STR_NULL strhelp = STR_CONFIG_SETTING_NO_EXPLANATION_AVAILABLE_HELPTEXT diff --git a/src/table/settings/gameopt_settings.ini b/src/table/settings/gameopt_settings.ini index 195bae365f..addcbeb027 100644 --- a/src/table/settings/gameopt_settings.ini +++ b/src/table/settings/gameopt_settings.ini @@ -46,13 +46,13 @@ static const SettingTable _gameopt_settings{ [post-amble] }; [templates] -SDTG_LIST = SDTG_LIST($name, $type, $flags, $guiflags, $var, $def, $length, $from, $to, $cat, $extra, $startup), -SDTG_VAR = SDTG_VAR($name, $type, $flags, $guiflags, $var, $def, $min, $max, $interval, $str, $strhelp, $strval, $pre_cb, $post_cb, $from, $to, $cat, $extra, $startup), +SDTG_LIST = SDTG_LIST($name, $type, $flags, $var, $def, $length, $from, $to, $cat, $extra, $startup), +SDTG_VAR = SDTG_VAR($name, $type, $flags, $var, $def, $min, $max, $interval, $str, $strhelp, $strval, $pre_cb, $post_cb, $from, $to, $cat, $extra, $startup), SDT_NULL = SDT_NULL( $length, $from, $to), -SDTC_OMANY = SDTC_OMANY( $var, $type, $flags, $guiflags, $def, $max, $full, $str, $strhelp, $strval, $pre_cb, $post_cb, $from, $to, $cat, $extra, $startup), -SDTG_OMANY = SDTG_OMANY($name, $type, $flags, $guiflags, $var, $def, $max, $full, $str, $strhelp, $strval, $pre_cb, $post_cb, $from, $to, $cat, $extra, $startup), -SDT_OMANY = SDT_OMANY(GameSettings, $var, $type, $flags, $guiflags, $def, $max, $full, $str, $strhelp, $strval, $pre_cb, $post_cb, $from, $to, $load, $cat, $extra, $startup), -SDT_VAR = SDT_VAR(GameSettings, $var, $type, $flags, $guiflags, $def, $min, $max, $interval, $str, $strhelp, $strval, $pre_cb, $post_cb, $from, $to, $cat, $extra, $startup), +SDTC_OMANY = SDTC_OMANY( $var, $type, $flags, $def, $max, $full, $str, $strhelp, $strval, $pre_cb, $post_cb, $from, $to, $cat, $extra, $startup), +SDTG_OMANY = SDTG_OMANY($name, $type, $flags, $var, $def, $max, $full, $str, $strhelp, $strval, $pre_cb, $post_cb, $from, $to, $cat, $extra, $startup), +SDT_OMANY = SDT_OMANY(GameSettings, $var, $type, $flags, $def, $max, $full, $str, $strhelp, $strval, $pre_cb, $post_cb, $from, $to, $load, $cat, $extra, $startup), +SDT_VAR = SDT_VAR(GameSettings, $var, $type, $flags, $def, $min, $max, $interval, $str, $strhelp, $strval, $pre_cb, $post_cb, $from, $to, $cat, $extra, $startup), [validation] SDTG_VAR = static_assert($max <= MAX_$type, "Maximum value for $var exceeds storage size"); @@ -62,8 +62,7 @@ SDT_OMANY = static_assert($max <= MAX_$type, "Maximum value for GameSettings.$va SDT_VAR = static_assert($max <= MAX_$type, "Maximum value for GameSettings.$var exceeds storage size"); [defaults] -flags = 0 -guiflags = SF_NONE +flags = SF_NONE interval = 0 str = STR_NULL strhelp = STR_CONFIG_SETTING_NO_EXPLANATION_AVAILABLE_HELPTEXT @@ -84,7 +83,7 @@ name = ""diff_custom"" sdt_cmd = SDT_INTLIST sle_cmd = SL_ARR type = SLE_FILE_I16 | SLE_VAR_U16 -flags = SLF_NOT_IN_CONFIG +flags = SF_NOT_IN_CONFIG var = _old_diff_custom length = 17 def = nullptr @@ -95,19 +94,18 @@ name = ""diff_custom"" sdt_cmd = SDT_INTLIST sle_cmd = SL_ARR type = SLE_UINT16 -flags = SLF_NOT_IN_CONFIG +flags = SF_NOT_IN_CONFIG var = _old_diff_custom length = 18 def = nullptr full = nullptr from = SLV_4 -## [SDTG_VAR] name = ""diff_level"" var = _old_diff_level type = SLE_UINT8 -flags = SLF_NOT_IN_CONFIG +flags = SF_NOT_IN_CONFIG def = SP_CUSTOM min = SP_EASY max = SP_CUSTOM @@ -116,7 +114,7 @@ cat = SC_BASIC [SDT_OMANY] var = locale.currency type = SLE_UINT8 -flags = SLF_NO_NETWORK_SYNC +flags = SF_NO_NETWORK_SYNC def = 0 max = CURRENCY_END - 1 full = _locale_currencies @@ -126,7 +124,7 @@ cat = SC_BASIC name = ""units"" var = _old_units type = SLE_UINT8 -flags = SLF_NOT_IN_CONFIG +flags = SF_NOT_IN_CONFIG def = 1 max = 2 full = _locale_units @@ -172,8 +170,7 @@ to = SLV_23 [SDTC_OMANY] var = gui.autosave type = SLE_UINT8 -from = SLV_23 -flags = SLF_NOT_IN_SAVE | SLF_NO_NETWORK_SYNC +flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC def = 1 max = 4 full = _autosave_interval diff --git a/src/table/settings/misc_settings.ini b/src/table/settings/misc_settings.ini index 45da1db52b..453c6e8162 100644 --- a/src/table/settings/misc_settings.ini +++ b/src/table/settings/misc_settings.ini @@ -24,20 +24,19 @@ static const SettingTable _misc_settings{ [post-amble] }; [templates] -SDTG_LIST = SDTG_LIST($name, $type, $flags, $guiflags, $var, $def, $length, $from, $to, $cat, $extra, $startup), -SDTG_MMANY = SDTG_MMANY($name, $type, $flags, $guiflags, $var, $def, $full, $str, $strhelp, $strval, $pre_cb, $post_cb, $from, $to, $cat, $extra, $startup), -SDTG_OMANY = SDTG_OMANY($name, $type, $flags, $guiflags, $var, $def, $max, $full, $str, $strhelp, $strval, $pre_cb, $post_cb, $from, $to, $cat, $extra, $startup), -SDTG_SSTR = SDTG_SSTR($name, $type, $flags, $guiflags, $var, $def, 0, $pre_cb, $post_cb, $from, $to, $cat, $extra, $startup), -SDTG_BOOL = SDTG_BOOL($name, $flags, $guiflags, $var, $def, $str, $strhelp, $strval, $pre_cb, $post_cb, $from, $to, $cat, $extra, $startup), -SDTG_VAR = SDTG_VAR($name, $type, $flags, $guiflags, $var, $def, $min, $max, $interval, $str, $strhelp, $strval, $pre_cb, $post_cb, $from, $to, $cat, $extra, $startup), +SDTG_LIST = SDTG_LIST($name, $type, $flags, $var, $def, $length, $from, $to, $cat, $extra, $startup), +SDTG_MMANY = SDTG_MMANY($name, $type, $flags, $var, $def, $full, $str, $strhelp, $strval, $pre_cb, $post_cb, $from, $to, $cat, $extra, $startup), +SDTG_OMANY = SDTG_OMANY($name, $type, $flags, $var, $def, $max, $full, $str, $strhelp, $strval, $pre_cb, $post_cb, $from, $to, $cat, $extra, $startup), +SDTG_SSTR = SDTG_SSTR($name, $type, $flags, $var, $def, 0, $pre_cb, $post_cb, $from, $to, $cat, $extra, $startup), +SDTG_BOOL = SDTG_BOOL($name, $flags, $var, $def, $str, $strhelp, $strval, $pre_cb, $post_cb, $from, $to, $cat, $extra, $startup), +SDTG_VAR = SDTG_VAR($name, $type, $flags, $var, $def, $min, $max, $interval, $str, $strhelp, $strval, $pre_cb, $post_cb, $from, $to, $cat, $extra, $startup), [validation] SDTG_VAR = static_assert($max <= MAX_$type, "Maximum value for $var exceeds storage size"); SDTG_OMANY = static_assert($max <= MAX_$type, "Maximum value for $var exceeds storage size"); [defaults] -flags = SLF_NOT_IN_SAVE | SLF_NO_NETWORK_SYNC -guiflags = SF_NONE +flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC interval = 0 str = STR_NULL strhelp = STR_CONFIG_SETTING_NO_EXPLANATION_AVAILABLE_HELPTEXT diff --git a/src/table/settings/settings.ini b/src/table/settings/settings.ini index be4d7ea941..f9f1cb87b7 100644 --- a/src/table/settings/settings.ini +++ b/src/table/settings/settings.ini @@ -53,18 +53,18 @@ const SettingTable _settings{ [post-amble] }; [templates] -SDTG_BOOL = SDTG_BOOL($name, $flags, $guiflags, $var, $def, $str, $strhelp, $strval, $pre_cb, $post_cb, $from, $to, $cat, $extra, $startup), -SDTG_VAR = SDTG_VAR($name, $type, $flags, $guiflags, $var, $def, $min, $max, $interval, $str, $strhelp, $strval, $pre_cb, $post_cb, $from, $to, $cat, $extra, $startup), -SDTG_OMANY = SDTG_OMANY($name, $type, $flags, $guiflags, $var, $def, $max, $full, $str, $strhelp, $strval, $pre_cb, $post_cb, $from, $to, $cat, $extra, $startup), -SDTC_BOOL = SDTC_BOOL( $var, $flags, $guiflags, $def, $str, $strhelp, $strval, $pre_cb, $post_cb, $from, $to, $cat, $extra, $startup), -SDTC_LIST = SDTC_LIST( $var, $type, $flags, $guiflags, $def, $from, $to, $cat, $extra, $startup), -SDTC_OMANY = SDTC_OMANY( $var, $type, $flags, $guiflags, $def, $max, $full, $str, $strhelp, $strval, $pre_cb, $post_cb, $from, $to, $cat, $extra, $startup), -SDTC_SSTR = SDTC_SSTR( $var, $type, $flags, $guiflags, $def, $length, $pre_cb, $post_cb, $from, $to, $cat, $extra, $startup), -SDTC_VAR = SDTC_VAR( $var, $type, $flags, $guiflags, $def, $min, $max, $interval, $str, $strhelp, $strval, $pre_cb, $post_cb, $from, $to, $cat, $extra, $startup), -SDT_BOOL = SDT_BOOL(GameSettings, $var, $flags, $guiflags, $def, $str, $strhelp, $strval, $pre_cb, $post_cb, $from, $to, $cat, $extra, $startup), -SDT_OMANY = SDT_OMANY(GameSettings, $var, $type, $flags, $guiflags, $def, $max, $full, $str, $strhelp, $strval, $pre_cb, $post_cb, $from, $to, $load, $cat, $extra, $startup), -SDT_SSTR = SDT_SSTR(GameSettings, $var, $type, $flags, $guiflags, $def, $pre_cb, $post_cb, $from, $to, $cat, $extra, $startup), -SDT_VAR = SDT_VAR(GameSettings, $var, $type, $flags, $guiflags, $def, $min, $max, $interval, $str, $strhelp, $strval, $pre_cb, $post_cb, $from, $to, $cat, $extra, $startup), +SDTG_BOOL = SDTG_BOOL($name, $flags, $var, $def, $str, $strhelp, $strval, $pre_cb, $post_cb, $from, $to, $cat, $extra, $startup), +SDTG_VAR = SDTG_VAR($name, $type, $flags, $var, $def, $min, $max, $interval, $str, $strhelp, $strval, $pre_cb, $post_cb, $from, $to, $cat, $extra, $startup), +SDTG_OMANY = SDTG_OMANY($name, $type, $flags, $var, $def, $max, $full, $str, $strhelp, $strval, $pre_cb, $post_cb, $from, $to, $cat, $extra, $startup), +SDTC_BOOL = SDTC_BOOL( $var, $flags, $def, $str, $strhelp, $strval, $pre_cb, $post_cb, $from, $to, $cat, $extra, $startup), +SDTC_LIST = SDTC_LIST( $var, $type, $flags, $def, $from, $to, $cat, $extra, $startup), +SDTC_OMANY = SDTC_OMANY( $var, $type, $flags, $def, $max, $full, $str, $strhelp, $strval, $pre_cb, $post_cb, $from, $to, $cat, $extra, $startup), +SDTC_SSTR = SDTC_SSTR( $var, $type, $flags, $def, $length, $pre_cb, $post_cb, $from, $to, $cat, $extra, $startup), +SDTC_VAR = SDTC_VAR( $var, $type, $flags, $def, $min, $max, $interval, $str, $strhelp, $strval, $pre_cb, $post_cb, $from, $to, $cat, $extra, $startup), +SDT_BOOL = SDT_BOOL(GameSettings, $var, $flags, $def, $str, $strhelp, $strval, $pre_cb, $post_cb, $from, $to, $cat, $extra, $startup), +SDT_OMANY = SDT_OMANY(GameSettings, $var, $type, $flags, $def, $max, $full, $str, $strhelp, $strval, $pre_cb, $post_cb, $from, $to, $load, $cat, $extra, $startup), +SDT_SSTR = SDT_SSTR(GameSettings, $var, $type, $flags, $def, $pre_cb, $post_cb, $from, $to, $cat, $extra, $startup), +SDT_VAR = SDT_VAR(GameSettings, $var, $type, $flags, $def, $min, $max, $interval, $str, $strhelp, $strval, $pre_cb, $post_cb, $from, $to, $cat, $extra, $startup), SDT_NULL = SDT_NULL( $length, $from, $to), [validation] @@ -76,8 +76,7 @@ SDT_OMANY = static_assert($max <= MAX_$type, "Maximum value for GameSettings.$va SDT_VAR = static_assert($max <= MAX_$type, "Maximum value for GameSettings.$var exceeds storage size"); [defaults] -flags = 0 -guiflags = SF_NONE +flags = SF_NONE interval = 0 str = STR_NULL strhelp = STR_CONFIG_SETTING_NO_EXPLANATION_AVAILABLE_HELPTEXT @@ -119,7 +118,7 @@ max = 3 var = difficulty.number_towns type = SLE_UINT8 from = SLV_97 -guiflags = SF_NEWGAME_ONLY +flags = SF_NEWGAME_ONLY def = 2 min = 0 max = 4 @@ -131,7 +130,7 @@ cat = SC_BASIC var = difficulty.industry_density type = SLE_UINT8 from = SLV_97 -guiflags = SF_GUI_DROPDOWN +flags = SF_GUI_DROPDOWN def = ID_END - 1 min = 0 max = ID_END - 1 @@ -145,7 +144,7 @@ cat = SC_BASIC var = difficulty.max_loan type = SLE_UINT32 from = SLV_97 -guiflags = SF_NEWGAME_ONLY | SF_SCENEDIT_TOO | SF_GUI_CURRENCY +flags = SF_NEWGAME_ONLY | SF_SCENEDIT_TOO | SF_GUI_CURRENCY def = 300000 min = 0 max = 2000000000 @@ -159,7 +158,7 @@ cat = SC_BASIC var = difficulty.initial_interest type = SLE_UINT8 from = SLV_97 -guiflags = SF_NEWGAME_ONLY | SF_SCENEDIT_TOO +flags = SF_NEWGAME_ONLY | SF_SCENEDIT_TOO def = 2 min = 2 max = 4 @@ -172,7 +171,7 @@ strval = STR_CONFIG_SETTING_PERCENTAGE var = difficulty.vehicle_costs type = SLE_UINT8 from = SLV_97 -guiflags = SF_NEWGAME_ONLY | SF_SCENEDIT_TOO | SF_GUI_DROPDOWN +flags = SF_NEWGAME_ONLY | SF_SCENEDIT_TOO | SF_GUI_DROPDOWN def = 0 min = 0 max = 2 @@ -186,7 +185,7 @@ cat = SC_BASIC var = difficulty.competitor_speed type = SLE_UINT8 from = SLV_97 -guiflags = SF_GUI_DROPDOWN +flags = SF_GUI_DROPDOWN def = 2 min = 0 max = 4 @@ -209,7 +208,7 @@ max = 2 var = difficulty.vehicle_breakdowns type = SLE_UINT8 from = SLV_97 -guiflags = SF_GUI_DROPDOWN +flags = SF_GUI_DROPDOWN def = 1 min = 0 max = 2 @@ -223,7 +222,7 @@ cat = SC_BASIC var = difficulty.subsidy_multiplier type = SLE_UINT8 from = SLV_97 -guiflags = SF_GUI_DROPDOWN +flags = SF_GUI_DROPDOWN def = 2 min = 0 max = 3 @@ -236,7 +235,7 @@ strval = STR_SUBSIDY_X1_5 var = difficulty.construction_cost type = SLE_UINT8 from = SLV_97 -guiflags = SF_NEWGAME_ONLY | SF_SCENEDIT_TOO | SF_GUI_DROPDOWN +flags = SF_NEWGAME_ONLY | SF_SCENEDIT_TOO | SF_GUI_DROPDOWN def = 0 min = 0 max = 2 @@ -250,7 +249,7 @@ cat = SC_BASIC var = difficulty.terrain_type type = SLE_UINT8 from = SLV_97 -guiflags = SF_GUI_DROPDOWN | SF_NEWGAME_ONLY +flags = SF_GUI_DROPDOWN | SF_NEWGAME_ONLY def = 1 min = 0 max = 5 @@ -264,7 +263,7 @@ cat = SC_BASIC var = difficulty.quantity_sea_lakes type = SLE_UINT8 from = SLV_97 -guiflags = SF_NEWGAME_ONLY +flags = SF_NEWGAME_ONLY def = 0 min = 0 max = 4 @@ -298,7 +297,7 @@ cat = SC_BASIC var = difficulty.town_council_tolerance type = SLE_UINT8 from = SLV_97 -guiflags = SF_GUI_DROPDOWN +flags = SF_GUI_DROPDOWN def = 0 min = 0 max = 2 @@ -312,7 +311,7 @@ post_cb = DifficultyNoiseChange name = ""diff_level"" var = _old_diff_level type = SLE_UINT8 -flags = SLF_NOT_IN_CONFIG +flags = SF_NOT_IN_CONFIG from = SLV_97 to = SLV_178 def = 3 @@ -326,7 +325,7 @@ cat = SC_BASIC var = game_creation.town_name type = SLE_UINT8 from = SLV_97 -guiflags = SF_NO_NETWORK +flags = SF_NO_NETWORK def = 0 max = 255 full = _town_names @@ -336,7 +335,7 @@ cat = SC_BASIC var = game_creation.landscape type = SLE_UINT8 from = SLV_97 -guiflags = SF_GUI_DROPDOWN | SF_NEWGAME_ONLY +flags = SF_GUI_DROPDOWN | SF_NEWGAME_ONLY def = 0 max = 3 full = _climates @@ -356,7 +355,7 @@ to = SLV_164 var = vehicle.road_side type = SLE_UINT8 from = SLV_97 -guiflags = SF_GUI_DROPDOWN | SF_NO_NETWORK +flags = SF_GUI_DROPDOWN | SF_NO_NETWORK def = 1 max = 1 full = _roadsides @@ -372,7 +371,7 @@ cat = SC_BASIC var = construction.map_height_limit type = SLE_UINT8 from = SLV_194 -guiflags = SF_NEWGAME_ONLY | SF_SCENEDIT_TOO | SF_GUI_0_IS_SPECIAL +flags = SF_NEWGAME_ONLY | SF_SCENEDIT_TOO | SF_GUI_0_IS_SPECIAL def = 0 min = MIN_MAP_HEIGHT_LIMIT max = MAX_MAP_HEIGHT_LIMIT @@ -388,7 +387,7 @@ cat = SC_ADVANCED var = game_creation.heightmap_height type = SLE_UINT8 from = SLV_MAPGEN_SETTINGS_REVAMP -guiflags = SF_NEWGAME_ONLY +flags = SF_NEWGAME_ONLY def = MAP_HEIGHT_LIMIT_AUTO_MINIMUM min = MIN_HEIGHTMAP_HEIGHT max = MAX_MAP_HEIGHT_LIMIT @@ -396,7 +395,7 @@ interval = 1 [SDT_BOOL] var = construction.build_on_slopes -guiflags = SF_NO_NETWORK +flags = SF_NO_NETWORK def = true cat = SC_EXPERT @@ -404,7 +403,7 @@ cat = SC_EXPERT var = construction.command_pause_level type = SLE_UINT8 from = SLV_154 -guiflags = SF_GUI_DROPDOWN | SF_NO_NETWORK +flags = SF_GUI_DROPDOWN | SF_NO_NETWORK def = 1 min = 0 max = 3 @@ -491,7 +490,7 @@ strhelp = STR_CONFIG_SETTING_EXTRADYNAMITE_HELPTEXT var = construction.max_bridge_length type = SLE_UINT16 from = SLV_159 -guiflags = SF_NO_NETWORK +flags = SF_NO_NETWORK def = 64 min = 1 max = MAX_MAP_SIZE @@ -504,7 +503,7 @@ strval = STR_CONFIG_SETTING_TILE_LENGTH var = construction.max_bridge_height type = SLE_UINT8 from = SLV_194 -guiflags = SF_NO_NETWORK +flags = SF_NO_NETWORK def = 12 min = 1 max = MAX_TILE_HEIGHT @@ -518,7 +517,7 @@ cat = SC_EXPERT var = construction.max_tunnel_length type = SLE_UINT16 from = SLV_159 -guiflags = SF_NO_NETWORK +flags = SF_NO_NETWORK def = 64 min = 1 max = MAX_MAP_SIZE @@ -535,7 +534,7 @@ to = SLV_159 [SDT_VAR] var = construction.train_signal_side type = SLE_UINT8 -guiflags = SF_GUI_DROPDOWN | SF_NO_NETWORK +flags = SF_GUI_DROPDOWN | SF_NO_NETWORK def = 1 min = 0 max = 2 @@ -547,7 +546,7 @@ cat = SC_BASIC [SDT_BOOL] var = station.never_expire_airports -guiflags = SF_NO_NETWORK +flags = SF_NO_NETWORK def = false str = STR_CONFIG_SETTING_NEVER_EXPIRE_AIRPORTS strhelp = STR_CONFIG_SETTING_NEVER_EXPIRE_AIRPORTS_HELPTEXT @@ -556,7 +555,7 @@ strhelp = STR_CONFIG_SETTING_NEVER_EXPIRE_AIRPORTS_HELPTEXT var = economy.town_layout type = SLE_UINT8 from = SLV_59 -guiflags = SF_GUI_DROPDOWN +flags = SF_GUI_DROPDOWN def = TL_ORIGINAL min = TL_BEGIN max = NUM_TLS - 1 @@ -569,7 +568,7 @@ post_cb = TownFoundingChanged [SDT_BOOL] var = economy.allow_town_roads from = SLV_113 -guiflags = SF_NO_NETWORK +flags = SF_NO_NETWORK def = true str = STR_CONFIG_SETTING_ALLOW_TOWN_ROADS strhelp = STR_CONFIG_SETTING_ALLOW_TOWN_ROADS_HELPTEXT @@ -578,7 +577,7 @@ strhelp = STR_CONFIG_SETTING_ALLOW_TOWN_ROADS_HELPTEXT var = economy.found_town type = SLE_UINT8 from = SLV_128 -guiflags = SF_GUI_DROPDOWN +flags = SF_GUI_DROPDOWN def = TF_FORBIDDEN min = TF_BEGIN max = TF_END - 1 @@ -592,7 +591,7 @@ cat = SC_BASIC [SDT_BOOL] var = economy.allow_town_level_crossings from = SLV_143 -guiflags = SF_NO_NETWORK +flags = SF_NO_NETWORK def = true str = STR_CONFIG_SETTING_ALLOW_TOWN_LEVEL_CROSSINGS strhelp = STR_CONFIG_SETTING_ALLOW_TOWN_LEVEL_CROSSINGS_HELPTEXT @@ -601,7 +600,7 @@ strhelp = STR_CONFIG_SETTING_ALLOW_TOWN_LEVEL_CROSSINGS_HELPTEXT var = economy.town_cargogen_mode type = SLE_UINT8 from = SLV_TOWN_CARGOGEN -guiflags = SF_GUI_DROPDOWN +flags = SF_GUI_DROPDOWN def = TCGM_BITCOUNT min = TCGM_BEGIN max = TCGM_END - 1 @@ -644,7 +643,7 @@ extra = offsetof(LinkGraphSettings, recalc_time) var = linkgraph.distribution_pax type = SLE_UINT8 from = SLV_183 -guiflags = SF_GUI_DROPDOWN +flags = SF_GUI_DROPDOWN def = DT_MANUAL min = DT_MIN max = DT_MAX @@ -659,7 +658,7 @@ extra = offsetof(LinkGraphSettings, distribution_pax) var = linkgraph.distribution_mail type = SLE_UINT8 from = SLV_183 -guiflags = SF_GUI_DROPDOWN +flags = SF_GUI_DROPDOWN def = DT_MANUAL min = DT_MIN max = DT_MAX @@ -674,7 +673,7 @@ extra = offsetof(LinkGraphSettings, distribution_mail) var = linkgraph.distribution_armoured type = SLE_UINT8 from = SLV_183 -guiflags = SF_GUI_DROPDOWN +flags = SF_GUI_DROPDOWN def = DT_MANUAL min = DT_MIN max = DT_MAX @@ -689,7 +688,7 @@ extra = offsetof(LinkGraphSettings, distribution_armoured) var = linkgraph.distribution_default type = SLE_UINT8 from = SLV_183 -guiflags = SF_GUI_DROPDOWN +flags = SF_GUI_DROPDOWN def = DT_MANUAL min = DT_BEGIN max = DT_MAX_NONSYMMETRIC @@ -761,7 +760,7 @@ extra = offsetof(LinkGraphSettings, short_path_saturation) [SDT_VAR] var = vehicle.train_acceleration_model type = SLE_UINT8 -guiflags = SF_GUI_DROPDOWN +flags = SF_GUI_DROPDOWN def = 1 min = 0 max = 1 @@ -775,7 +774,7 @@ post_cb = TrainAccelerationModelChanged var = vehicle.roadveh_acceleration_model type = SLE_UINT8 from = SLV_139 -guiflags = SF_GUI_DROPDOWN +flags = SF_GUI_DROPDOWN def = 1 min = 0 max = 1 @@ -843,7 +842,7 @@ to = SLV_159 var = vehicle.smoke_amount type = SLE_UINT8 from = SLV_145 -guiflags = SF_GUI_DROPDOWN +flags = SF_GUI_DROPDOWN def = 1 min = 0 max = 2 @@ -895,7 +894,7 @@ cat = SC_EXPERT var = pf.pathfinder_for_trains type = SLE_UINT8 from = SLV_87 -guiflags = SF_GUI_DROPDOWN +flags = SF_GUI_DROPDOWN def = 2 min = 1 max = 2 @@ -909,7 +908,7 @@ cat = SC_EXPERT var = pf.pathfinder_for_roadvehs type = SLE_UINT8 from = SLV_87 -guiflags = SF_GUI_DROPDOWN +flags = SF_GUI_DROPDOWN def = 2 min = 1 max = 2 @@ -923,7 +922,7 @@ cat = SC_EXPERT var = pf.pathfinder_for_ships type = SLE_UINT8 from = SLV_87 -guiflags = SF_GUI_DROPDOWN +flags = SF_GUI_DROPDOWN def = 2 min = 1 max = 2 @@ -936,7 +935,7 @@ cat = SC_EXPERT [SDT_BOOL] var = vehicle.never_expire_vehicles -guiflags = SF_NO_NETWORK +flags = SF_NO_NETWORK def = false str = STR_CONFIG_SETTING_NEVER_EXPIRE_VEHICLES strhelp = STR_CONFIG_SETTING_NEVER_EXPIRE_VEHICLES_HELPTEXT @@ -991,7 +990,7 @@ cat = SC_BASIC [SDTG_BOOL] name = nullptr -guiflags = SF_NO_NETWORK +flags = SF_NO_NETWORK var = _old_vds.servint_ispercent def = false to = SLV_120 @@ -999,7 +998,7 @@ to = SLV_120 [SDTG_VAR] name = nullptr type = SLE_UINT16 -guiflags = SF_GUI_0_IS_SPECIAL +flags = SF_GUI_0_IS_SPECIAL var = _old_vds.servint_trains def = 150 min = 5 @@ -1009,7 +1008,7 @@ to = SLV_120 [SDTG_VAR] name = nullptr type = SLE_UINT16 -guiflags = SF_GUI_0_IS_SPECIAL +flags = SF_GUI_0_IS_SPECIAL var = _old_vds.servint_roadveh def = 150 min = 5 @@ -1019,7 +1018,7 @@ to = SLV_120 [SDTG_VAR] name = nullptr type = SLE_UINT16 -guiflags = SF_GUI_0_IS_SPECIAL +flags = SF_GUI_0_IS_SPECIAL var = _old_vds.servint_ships def = 360 min = 5 @@ -1029,7 +1028,7 @@ to = SLV_120 [SDTG_VAR] name = nullptr type = SLE_UINT16 -guiflags = SF_GUI_0_IS_SPECIAL +flags = SF_GUI_0_IS_SPECIAL var = _old_vds.servint_aircraft def = 150 min = 5 @@ -1044,7 +1043,7 @@ strhelp = STR_CONFIG_SETTING_NOSERVICE_HELPTEXT [SDT_BOOL] var = vehicle.wagon_speed_limits -guiflags = SF_NO_NETWORK +flags = SF_NO_NETWORK def = true str = STR_CONFIG_SETTING_WAGONSPEEDLIMITS strhelp = STR_CONFIG_SETTING_WAGONSPEEDLIMITS_HELPTEXT @@ -1053,7 +1052,7 @@ post_cb = UpdateConsists [SDT_BOOL] var = vehicle.disable_elrails from = SLV_38 -guiflags = SF_NO_NETWORK +flags = SF_NO_NETWORK def = false str = STR_CONFIG_SETTING_DISABLE_ELRAILS strhelp = STR_CONFIG_SETTING_DISABLE_ELRAILS_HELPTEXT @@ -1064,7 +1063,7 @@ cat = SC_EXPERT var = vehicle.freight_trains type = SLE_UINT8 from = SLV_39 -guiflags = SF_NO_NETWORK +flags = SF_NO_NETWORK def = 1 min = 1 max = 255 @@ -1084,7 +1083,7 @@ to = SLV_159 var = vehicle.plane_speed type = SLE_UINT8 from = SLV_90 -guiflags = SF_NO_NETWORK +flags = SF_NO_NETWORK def = 4 min = 1 max = 4 @@ -1095,7 +1094,7 @@ strval = STR_CONFIG_SETTING_PLANE_SPEED_VALUE [SDT_BOOL] var = vehicle.dynamic_engines from = SLV_95 -guiflags = SF_NO_NETWORK +flags = SF_NO_NETWORK def = true pre_cb = CheckDynamicEngines cat = SC_EXPERT @@ -1104,7 +1103,7 @@ cat = SC_EXPERT var = vehicle.plane_crashes type = SLE_UINT8 from = SLV_138 -guiflags = SF_GUI_DROPDOWN +flags = SF_GUI_DROPDOWN def = 2 min = 0 max = 2 @@ -1127,7 +1126,7 @@ def = true [SDT_BOOL] var = order.improved_load -guiflags = SF_NO_NETWORK +flags = SF_NO_NETWORK def = true cat = SC_EXPERT @@ -1185,7 +1184,7 @@ post_cb = StationCatchmentChanged [SDT_BOOL] var = order.gradual_loading from = SLV_40 -guiflags = SF_NO_NETWORK +flags = SF_NO_NETWORK def = true cat = SC_EXPERT @@ -1214,7 +1213,7 @@ cat = SC_EXPERT [SDT_BOOL] var = economy.station_noise_level from = SLV_96 -guiflags = SF_NO_NETWORK +flags = SF_NO_NETWORK def = false str = STR_CONFIG_SETTING_NOISE_LEVEL strhelp = STR_CONFIG_SETTING_NOISE_LEVEL_HELPTEXT @@ -1231,7 +1230,7 @@ post_cb = [](auto) { CloseWindowById(WC_SELECT_STATION, 0); } ## [SDT_BOOL] var = economy.inflation -guiflags = SF_NO_NETWORK +flags = SF_NO_NETWORK def = false str = STR_CONFIG_SETTING_INFLATION strhelp = STR_CONFIG_SETTING_INFLATION_HELPTEXT @@ -1240,7 +1239,7 @@ cat = SC_BASIC [SDT_VAR] var = construction.raw_industry_construction type = SLE_UINT8 -guiflags = SF_GUI_DROPDOWN +flags = SF_GUI_DROPDOWN def = 0 min = 0 max = 2 @@ -1318,7 +1317,7 @@ cat = SC_BASIC [SDT_VAR] var = game_creation.snow_line_height type = SLE_UINT8 -guiflags = SF_SCENEDIT_ONLY +flags = SF_SCENEDIT_ONLY def = DEF_SNOWLINE_HEIGHT min = MIN_SNOWLINE_HEIGHT max = MAX_SNOWLINE_HEIGHT @@ -1332,7 +1331,7 @@ cat = SC_BASIC var = game_creation.snow_coverage type = SLE_UINT8 from = SLV_MAPGEN_SETTINGS_REVAMP -guiflags = SF_NEWGAME_ONLY +flags = SF_NEWGAME_ONLY def = DEF_SNOW_COVERAGE min = 0 max = 100 @@ -1346,7 +1345,7 @@ cat = SC_BASIC var = game_creation.desert_coverage type = SLE_UINT8 from = SLV_MAPGEN_SETTINGS_REVAMP -guiflags = SF_NEWGAME_ONLY +flags = SF_NEWGAME_ONLY def = DEF_DESERT_COVERAGE min = 0 max = 100 @@ -1379,7 +1378,7 @@ to = SLV_105 var = game_creation.ending_year type = SLE_INT32 from = SLV_ENDING_YEAR -guiflags = SF_GUI_0_IS_SPECIAL +flags = SF_GUI_0_IS_SPECIAL def = DEF_END_YEAR min = MIN_YEAR max = MAX_YEAR - 1 @@ -1392,7 +1391,7 @@ cat = SC_ADVANCED [SDT_VAR] var = economy.type type = SLE_UINT8 -guiflags = SF_GUI_DROPDOWN +flags = SF_GUI_DROPDOWN def = ET_SMOOTH min = ET_BEGIN max = ET_END - 1 @@ -1438,7 +1437,7 @@ cat = SC_EXPERT var = economy.town_growth_rate type = SLE_UINT8 from = SLV_54 -guiflags = SF_GUI_DROPDOWN +flags = SF_GUI_DROPDOWN def = 2 min = 0 max = 4 @@ -1450,7 +1449,7 @@ strval = STR_CONFIG_SETTING_TOWN_GROWTH_NONE var = economy.larger_towns type = SLE_UINT8 from = SLV_54 -guiflags = SF_GUI_0_IS_SPECIAL +flags = SF_GUI_0_IS_SPECIAL def = 4 min = 0 max = 255 @@ -1486,7 +1485,7 @@ to = SLV_107 var = script.settings_profile type = SLE_UINT8 from = SLV_178 -guiflags = SF_GUI_DROPDOWN +flags = SF_GUI_DROPDOWN def = SP_EASY min = SP_EASY max = SP_HARD @@ -1531,7 +1530,7 @@ strhelp = STR_CONFIG_SETTING_AI_BUILDS_SHIPS_HELPTEXT var = script.script_max_opcode_till_suspend type = SLE_UINT32 from = SLV_107 -guiflags = SF_NEWGAME_ONLY +flags = SF_NEWGAME_ONLY def = 10000 min = 500 max = 250000 @@ -1545,7 +1544,7 @@ cat = SC_EXPERT var = script.script_max_memory_megabytes type = SLE_UINT32 from = SLV_SCRIPT_MEMLIMIT -guiflags = SF_NEWGAME_ONLY +flags = SF_NEWGAME_ONLY def = 1024 min = 8 max = 8192 @@ -2119,7 +2118,7 @@ cat = SC_EXPERT var = game_creation.land_generator type = SLE_UINT8 from = SLV_30 -guiflags = SF_GUI_DROPDOWN | SF_NEWGAME_ONLY +flags = SF_GUI_DROPDOWN | SF_NEWGAME_ONLY def = 1 min = 0 max = 1 @@ -2142,7 +2141,7 @@ strhelp = STR_CONFIG_SETTING_OIL_REF_EDGE_DISTANCE_HELPTEXT var = game_creation.tgen_smoothness type = SLE_UINT8 from = SLV_30 -guiflags = SF_GUI_DROPDOWN | SF_NEWGAME_ONLY +flags = SF_GUI_DROPDOWN | SF_NEWGAME_ONLY def = 1 min = TGEN_SMOOTHNESS_BEGIN max = TGEN_SMOOTHNESS_END - 1 @@ -2155,7 +2154,7 @@ cat = SC_BASIC var = game_creation.variety type = SLE_UINT8 from = SLV_197 -guiflags = SF_GUI_DROPDOWN | SF_NEWGAME_ONLY +flags = SF_GUI_DROPDOWN | SF_NEWGAME_ONLY def = 0 min = 0 max = 5 @@ -2176,7 +2175,7 @@ cat = SC_EXPERT var = game_creation.tree_placer type = SLE_UINT8 from = SLV_30 -guiflags = SF_GUI_DROPDOWN | SF_NEWGAME_ONLY | SF_SCENEDIT_TOO +flags = SF_GUI_DROPDOWN | SF_NEWGAME_ONLY | SF_SCENEDIT_TOO def = 2 min = 0 max = 2 @@ -2188,8 +2187,7 @@ cat = SC_BASIC [SDT_VAR] var = game_creation.heightmap_rotation type = SLE_UINT8 -flags = SLF_NOT_IN_SAVE | SLF_NO_NETWORK_SYNC -guiflags = SF_GUI_DROPDOWN +flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC | SF_GUI_DROPDOWN def = 0 min = 0 max = 1 @@ -2200,7 +2198,7 @@ cat = SC_BASIC [SDT_VAR] var = game_creation.se_flat_world_height type = SLE_UINT8 -flags = SLF_NOT_IN_SAVE | SLF_NO_NETWORK_SYNC +flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC def = 1 min = 0 max = 15 @@ -2212,7 +2210,7 @@ cat = SC_BASIC [SDT_VAR] var = game_creation.map_x type = SLE_UINT8 -flags = SLF_NOT_IN_SAVE | SLF_NO_NETWORK_SYNC +flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC def = 8 min = MIN_MAP_SIZE_BITS max = MAX_MAP_SIZE_BITS @@ -2221,7 +2219,7 @@ cat = SC_BASIC [SDT_VAR] var = game_creation.map_y type = SLE_UINT8 -flags = SLF_NOT_IN_SAVE | SLF_NO_NETWORK_SYNC +flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC def = 8 min = MIN_MAP_SIZE_BITS max = MAX_MAP_SIZE_BITS @@ -2256,7 +2254,7 @@ cat = SC_BASIC var = construction.extra_tree_placement type = SLE_UINT8 from = SLV_132 -guiflags = SF_GUI_DROPDOWN +flags = SF_GUI_DROPDOWN def = 2 min = 0 max = 3 @@ -2269,7 +2267,7 @@ cat = SC_BASIC var = game_creation.custom_terrain_type type = SLE_UINT8 from = SLV_MAPGEN_SETTINGS_REVAMP -guiflags = SF_NEWGAME_ONLY +flags = SF_NEWGAME_ONLY def = MAP_HEIGHT_LIMIT_AUTO_MINIMUM min = MIN_CUSTOM_TERRAIN_TYPE max = MAX_MAP_HEIGHT_LIMIT @@ -2306,7 +2304,7 @@ cat = SC_EXPERT var = game_creation.amount_of_rivers type = SLE_UINT8 from = SLV_163 -guiflags = SF_GUI_DROPDOWN | SF_NEWGAME_ONLY +flags = SF_GUI_DROPDOWN | SF_NEWGAME_ONLY def = 2 min = 0 max = 3 @@ -2320,7 +2318,7 @@ strval = STR_RIVERS_NONE var = locale.currency type = SLE_UINT8 from = SLV_97 -flags = SLF_NO_NETWORK_SYNC +flags = SF_NO_NETWORK_SYNC def = 0 max = CURRENCY_END - 1 full = _locale_currencies @@ -2333,7 +2331,7 @@ var = _old_units type = SLE_UINT8 from = SLV_97 to = SLV_184 -flags = SLF_NOT_IN_CONFIG +flags = SF_NOT_IN_CONFIG def = 1 max = 2 full = _locale_units @@ -2344,8 +2342,7 @@ cat = SC_BASIC var = locale.units_velocity type = SLE_UINT8 from = SLV_184 -flags = SLF_NO_NETWORK_SYNC -guiflags = SF_GUI_DROPDOWN +flags = SF_NO_NETWORK_SYNC | SF_GUI_DROPDOWN def = 1 max = 3 full = _locale_units @@ -2359,8 +2356,7 @@ strval = STR_CONFIG_SETTING_LOCALISATION_UNITS_VELOCITY_IMPERIAL var = locale.units_power type = SLE_UINT8 from = SLV_184 -flags = SLF_NO_NETWORK_SYNC -guiflags = SF_GUI_DROPDOWN +flags = SF_NO_NETWORK_SYNC | SF_GUI_DROPDOWN def = 1 max = 2 full = _locale_units @@ -2374,8 +2370,7 @@ strval = STR_CONFIG_SETTING_LOCALISATION_UNITS_POWER_IMPERIAL var = locale.units_weight type = SLE_UINT8 from = SLV_184 -flags = SLF_NO_NETWORK_SYNC -guiflags = SF_GUI_DROPDOWN +flags = SF_NO_NETWORK_SYNC | SF_GUI_DROPDOWN def = 1 max = 2 full = _locale_units @@ -2389,8 +2384,7 @@ strval = STR_CONFIG_SETTING_LOCALISATION_UNITS_WEIGHT_IMPERIAL var = locale.units_volume type = SLE_UINT8 from = SLV_184 -flags = SLF_NO_NETWORK_SYNC -guiflags = SF_GUI_DROPDOWN +flags = SF_NO_NETWORK_SYNC | SF_GUI_DROPDOWN def = 1 max = 2 full = _locale_units @@ -2404,8 +2398,7 @@ strval = STR_CONFIG_SETTING_LOCALISATION_UNITS_VOLUME_IMPERIAL var = locale.units_force type = SLE_UINT8 from = SLV_184 -flags = SLF_NO_NETWORK_SYNC -guiflags = SF_GUI_DROPDOWN +flags = SF_NO_NETWORK_SYNC | SF_GUI_DROPDOWN def = 2 max = 2 full = _locale_units @@ -2419,8 +2412,7 @@ strval = STR_CONFIG_SETTING_LOCALISATION_UNITS_FORCE_IMPERIAL var = locale.units_height type = SLE_UINT8 from = SLV_184 -flags = SLF_NO_NETWORK_SYNC -guiflags = SF_GUI_DROPDOWN +flags = SF_NO_NETWORK_SYNC | SF_GUI_DROPDOWN def = 1 max = 2 full = _locale_units @@ -2434,7 +2426,7 @@ strval = STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT_IMPERIAL var = locale.digit_group_separator type = SLE_STRQ from = SLV_118 -flags = SLF_NO_NETWORK_SYNC +flags = SF_NO_NETWORK_SYNC def = nullptr post_cb = [](auto) { MarkWholeScreenDirty(); } cat = SC_BASIC @@ -2443,7 +2435,7 @@ cat = SC_BASIC var = locale.digit_group_separator_currency type = SLE_STRQ from = SLV_118 -flags = SLF_NO_NETWORK_SYNC +flags = SF_NO_NETWORK_SYNC def = nullptr post_cb = [](auto) { MarkWholeScreenDirty(); } cat = SC_BASIC @@ -2452,7 +2444,7 @@ cat = SC_BASIC var = locale.digit_decimal_separator type = SLE_STRQ from = SLV_126 -flags = SLF_NO_NETWORK_SYNC +flags = SF_NO_NETWORK_SYNC def = nullptr post_cb = [](auto) { MarkWholeScreenDirty(); } cat = SC_BASIC @@ -2464,8 +2456,7 @@ cat = SC_BASIC [SDTC_OMANY] var = gui.autosave type = SLE_UINT8 -flags = SLF_NOT_IN_SAVE | SLF_NO_NETWORK_SYNC -guiflags = SF_GUI_DROPDOWN +flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC | SF_GUI_DROPDOWN def = 1 max = 4 full = _autosave_interval @@ -2476,15 +2467,14 @@ cat = SC_BASIC [SDTC_BOOL] var = gui.threaded_saves -flags = SLF_NOT_IN_SAVE | SLF_NO_NETWORK_SYNC +flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC def = true cat = SC_EXPERT [SDTC_OMANY] var = gui.date_format_in_default_names type = SLE_UINT8 -flags = SLF_NOT_IN_SAVE | SLF_NO_NETWORK_SYNC -guiflags = SF_GUI_DROPDOWN +flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC | SF_GUI_DROPDOWN def = 2 max = 2 full = _savegame_date @@ -2494,7 +2484,7 @@ strval = STR_CONFIG_SETTING_DATE_FORMAT_IN_SAVE_NAMES_LONG [SDTC_BOOL] var = gui.show_finances -flags = SLF_NOT_IN_SAVE | SLF_NO_NETWORK_SYNC +flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC def = true str = STR_CONFIG_SETTING_SHOWFINANCES strhelp = STR_CONFIG_SETTING_SHOWFINANCES_HELPTEXT @@ -2503,8 +2493,7 @@ cat = SC_BASIC [SDTC_VAR] var = gui.auto_scrolling type = SLE_UINT8 -flags = SLF_NOT_IN_SAVE | SLF_NO_NETWORK_SYNC -guiflags = SF_GUI_DROPDOWN +flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC | SF_GUI_DROPDOWN def = 0 min = 0 max = 3 @@ -2516,8 +2505,7 @@ cat = SC_BASIC [SDTC_VAR] var = gui.scroll_mode type = SLE_UINT8 -flags = SLF_NOT_IN_SAVE | SLF_NO_NETWORK_SYNC -guiflags = SF_GUI_DROPDOWN +flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC | SF_GUI_DROPDOWN def = 0 min = 0 max = 3 @@ -2528,14 +2516,14 @@ cat = SC_BASIC [SDTC_BOOL] var = gui.smooth_scroll -flags = SLF_NOT_IN_SAVE | SLF_NO_NETWORK_SYNC +flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC def = false str = STR_CONFIG_SETTING_SMOOTH_SCROLLING strhelp = STR_CONFIG_SETTING_SMOOTH_SCROLLING_HELPTEXT [SDTC_BOOL] var = gui.right_mouse_wnd_close -flags = SLF_NOT_IN_SAVE | SLF_NO_NETWORK_SYNC +flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC def = false str = STR_CONFIG_SETTING_RIGHT_MOUSE_WND_CLOSE strhelp = STR_CONFIG_SETTING_RIGHT_MOUSE_WND_CLOSE_HELPTEXT @@ -2546,8 +2534,7 @@ cat = SC_BASIC ifdef = __APPLE__ var = gui.right_mouse_btn_emulation type = SLE_UINT8 -flags = SLF_NOT_IN_SAVE | SLF_NO_NETWORK_SYNC -guiflags = SF_GUI_DROPDOWN +flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC | SF_GUI_DROPDOWN def = 0 min = 0 max = 2 @@ -2558,7 +2545,7 @@ cat = SC_BASIC [SDTC_BOOL] var = gui.measure_tooltip -flags = SLF_NOT_IN_SAVE | SLF_NO_NETWORK_SYNC +flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC def = true str = STR_CONFIG_SETTING_MEASURE_TOOLTIP strhelp = STR_CONFIG_SETTING_MEASURE_TOOLTIP_HELPTEXT @@ -2567,7 +2554,7 @@ cat = SC_BASIC [SDTC_VAR] var = gui.errmsg_duration type = SLE_UINT8 -flags = SLF_NOT_IN_SAVE | SLF_NO_NETWORK_SYNC +flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC def = 5 min = 0 max = 20 @@ -2578,8 +2565,7 @@ strval = STR_CONFIG_SETTING_ERRMSG_DURATION_VALUE [SDTC_VAR] var = gui.hover_delay_ms type = SLE_UINT16 -flags = SLF_NOT_IN_SAVE | SLF_NO_NETWORK_SYNC -guiflags = SF_GUI_0_IS_SPECIAL +flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC | SF_GUI_0_IS_SPECIAL def = 250 min = 50 max = 6000 @@ -2591,11 +2577,11 @@ strval = STR_CONFIG_SETTING_HOVER_DELAY_VALUE [SDTC_OMANY] var = gui.osk_activation type = SLE_UINT8 -flags = SLF_NOT_IN_SAVE | SLF_NO_NETWORK_SYNC +flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC str = STR_CONFIG_SETTING_OSK_ACTIVATION strhelp = STR_CONFIG_SETTING_OSK_ACTIVATION_HELPTEXT strval = STR_CONFIG_SETTING_OSK_ACTIVATION_DISABLED -guiflags = SF_GUI_DROPDOWN +flags = SF_GUI_DROPDOWN full = _osk_activation def = 1 min = 0 @@ -2605,8 +2591,7 @@ cat = SC_BASIC [SDTC_VAR] var = gui.toolbar_pos type = SLE_UINT8 -flags = SLF_NOT_IN_SAVE | SLF_NO_NETWORK_SYNC -guiflags = SF_GUI_DROPDOWN +flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC | SF_GUI_DROPDOWN def = 1 min = 0 max = 2 @@ -2619,8 +2604,7 @@ cat = SC_BASIC [SDTC_VAR] var = gui.statusbar_pos type = SLE_UINT8 -flags = SLF_NOT_IN_SAVE | SLF_NO_NETWORK_SYNC -guiflags = SF_GUI_DROPDOWN +flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC | SF_GUI_DROPDOWN def = 1 min = 0 max = 2 @@ -2633,8 +2617,7 @@ cat = SC_BASIC [SDTC_VAR] var = gui.window_snap_radius type = SLE_UINT8 -flags = SLF_NOT_IN_SAVE | SLF_NO_NETWORK_SYNC -guiflags = SF_GUI_0_IS_SPECIAL +flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC | SF_GUI_0_IS_SPECIAL def = 10 min = 1 max = 32 @@ -2646,8 +2629,7 @@ cat = SC_EXPERT [SDTC_VAR] var = gui.window_soft_limit type = SLE_UINT8 -flags = SLF_NOT_IN_SAVE | SLF_NO_NETWORK_SYNC -guiflags = SF_GUI_0_IS_SPECIAL +flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC | SF_GUI_0_IS_SPECIAL def = 20 min = 5 max = 255 @@ -2660,8 +2642,7 @@ cat = SC_EXPERT [SDTC_VAR] var = gui.zoom_min type = SLE_UINT8 -flags = SLF_NOT_IN_SAVE | SLF_NO_NETWORK_SYNC -guiflags = SF_GUI_DROPDOWN +flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC | SF_GUI_DROPDOWN def = ZOOM_LVL_MIN min = ZOOM_LVL_MIN max = ZOOM_LVL_OUT_4X @@ -2674,8 +2655,7 @@ startup = true [SDTC_VAR] var = gui.zoom_max type = SLE_UINT8 -flags = SLF_NOT_IN_SAVE | SLF_NO_NETWORK_SYNC -guiflags = SF_GUI_DROPDOWN +flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC | SF_GUI_DROPDOWN def = ZOOM_LVL_MAX min = ZOOM_LVL_OUT_8X max = ZOOM_LVL_MAX @@ -2688,8 +2668,7 @@ startup = true [SDTC_VAR] var = gui.sprite_zoom_min type = SLE_UINT8 -flags = SLF_NOT_IN_SAVE | SLF_NO_NETWORK_SYNC -guiflags = SF_GUI_DROPDOWN +flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC | SF_GUI_DROPDOWN def = ZOOM_LVL_MIN min = ZOOM_LVL_MIN max = ZOOM_LVL_OUT_4X @@ -2700,7 +2679,7 @@ post_cb = SpriteZoomMinChanged [SDTC_BOOL] var = gui.population_in_label -flags = SLF_NOT_IN_SAVE | SLF_NO_NETWORK_SYNC +flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC def = true str = STR_CONFIG_SETTING_POPULATION_IN_LABEL strhelp = STR_CONFIG_SETTING_POPULATION_IN_LABEL_HELPTEXT @@ -2708,7 +2687,7 @@ post_cb = [](auto) { UpdateAllTownVirtCoords(); } [SDTC_BOOL] var = gui.link_terraform_toolbar -flags = SLF_NOT_IN_SAVE | SLF_NO_NETWORK_SYNC +flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC def = false str = STR_CONFIG_SETTING_LINK_TERRAFORM_TOOLBAR strhelp = STR_CONFIG_SETTING_LINK_TERRAFORM_TOOLBAR_HELPTEXT @@ -2716,8 +2695,7 @@ strhelp = STR_CONFIG_SETTING_LINK_TERRAFORM_TOOLBAR_HELPTEXT [SDTC_VAR] var = gui.smallmap_land_colour type = SLE_UINT8 -flags = SLF_NOT_IN_SAVE | SLF_NO_NETWORK_SYNC -guiflags = SF_GUI_DROPDOWN +flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC | SF_GUI_DROPDOWN def = 0 min = 0 max = 2 @@ -2729,8 +2707,7 @@ post_cb = RedrawSmallmap [SDTC_VAR] var = gui.liveries type = SLE_UINT8 -flags = SLF_NOT_IN_SAVE | SLF_NO_NETWORK_SYNC -guiflags = SF_GUI_DROPDOWN +flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC | SF_GUI_DROPDOWN def = 2 min = 0 max = 2 @@ -2742,8 +2719,7 @@ post_cb = InvalidateCompanyLiveryWindow [SDTC_VAR] var = gui.starting_colour type = SLE_UINT8 -flags = SLF_NOT_IN_SAVE | SLF_NO_NETWORK_SYNC -guiflags = SF_GUI_DROPDOWN +flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC | SF_GUI_DROPDOWN def = COLOUR_END min = 0 max = COLOUR_END @@ -2753,7 +2729,7 @@ strval = STR_COLOUR_DARK_BLUE [SDTC_BOOL] var = gui.auto_remove_signals -flags = SLF_NOT_IN_SAVE | SLF_NO_NETWORK_SYNC +flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC def = false str = STR_CONFIG_SETTING_AUTO_REMOVE_SIGNALS strhelp = STR_CONFIG_SETTING_AUTO_REMOVE_SIGNALS_HELPTEXT @@ -2761,7 +2737,7 @@ cat = SC_ADVANCED [SDTC_BOOL] var = gui.prefer_teamchat -flags = SLF_NOT_IN_SAVE | SLF_NO_NETWORK_SYNC +flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC def = false str = STR_CONFIG_SETTING_PREFER_TEAMCHAT strhelp = STR_CONFIG_SETTING_PREFER_TEAMCHAT_HELPTEXT @@ -2770,8 +2746,7 @@ cat = SC_BASIC [SDTC_VAR] var = gui.scrollwheel_scrolling type = SLE_UINT8 -flags = SLF_NOT_IN_SAVE | SLF_NO_NETWORK_SYNC -guiflags = SF_GUI_DROPDOWN +flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC | SF_GUI_DROPDOWN def = 0 min = 0 max = 2 @@ -2783,7 +2758,7 @@ cat = SC_BASIC [SDTC_VAR] var = gui.scrollwheel_multiplier type = SLE_UINT8 -flags = SLF_NOT_IN_SAVE | SLF_NO_NETWORK_SYNC +flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC def = 5 min = 1 max = 15 @@ -2795,7 +2770,7 @@ cat = SC_BASIC [SDTC_BOOL] var = gui.pause_on_newgame -flags = SLF_NOT_IN_SAVE | SLF_NO_NETWORK_SYNC +flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC def = false str = STR_CONFIG_SETTING_PAUSE_ON_NEW_GAME strhelp = STR_CONFIG_SETTING_PAUSE_ON_NEW_GAME_HELPTEXT @@ -2804,8 +2779,7 @@ cat = SC_BASIC [SDTC_VAR] var = gui.advanced_vehicle_list type = SLE_UINT8 -flags = SLF_NOT_IN_SAVE | SLF_NO_NETWORK_SYNC -guiflags = SF_GUI_DROPDOWN +flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC | SF_GUI_DROPDOWN def = 1 min = 0 max = 2 @@ -2815,7 +2789,7 @@ strval = STR_CONFIG_SETTING_COMPANIES_OFF [SDTC_BOOL] var = gui.timetable_in_ticks -flags = SLF_NOT_IN_SAVE | SLF_NO_NETWORK_SYNC +flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC def = false str = STR_CONFIG_SETTING_TIMETABLE_IN_TICKS strhelp = STR_CONFIG_SETTING_TIMETABLE_IN_TICKS_HELPTEXT @@ -2824,7 +2798,7 @@ cat = SC_EXPERT [SDTC_BOOL] var = gui.timetable_arrival_departure -flags = SLF_NOT_IN_SAVE | SLF_NO_NETWORK_SYNC +flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC def = true str = STR_CONFIG_SETTING_TIMETABLE_SHOW_ARRIVAL_DEPARTURE strhelp = STR_CONFIG_SETTING_TIMETABLE_SHOW_ARRIVAL_DEPARTURE_HELPTEXT @@ -2832,7 +2806,7 @@ post_cb = [](auto) { InvalidateWindowClassesData(WC_VEHICLE_TIMETABLE, VIWD_MOD [SDTC_BOOL] var = gui.quick_goto -flags = SLF_NOT_IN_SAVE | SLF_NO_NETWORK_SYNC +flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC def = true str = STR_CONFIG_SETTING_QUICKGOTO strhelp = STR_CONFIG_SETTING_QUICKGOTO_HELPTEXT @@ -2841,8 +2815,7 @@ cat = SC_BASIC [SDTC_VAR] var = gui.loading_indicators type = SLE_UINT8 -flags = SLF_NOT_IN_SAVE | SLF_NO_NETWORK_SYNC -guiflags = SF_GUI_DROPDOWN +flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC | SF_GUI_DROPDOWN def = 1 min = 0 max = 2 @@ -2855,8 +2828,7 @@ cat = SC_BASIC [SDTC_VAR] var = gui.default_rail_type type = SLE_UINT8 -flags = SLF_NOT_IN_SAVE | SLF_NO_NETWORK_SYNC -guiflags = SF_GUI_DROPDOWN +flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC | SF_GUI_DROPDOWN def = 0 min = 0 max = 2 @@ -2867,7 +2839,7 @@ cat = SC_BASIC [SDTC_BOOL] var = gui.enable_signal_gui -flags = SLF_NOT_IN_SAVE | SLF_NO_NETWORK_SYNC +flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC def = true str = STR_CONFIG_SETTING_ENABLE_SIGNAL_GUI strhelp = STR_CONFIG_SETTING_ENABLE_SIGNAL_GUI_HELPTEXT @@ -2877,7 +2849,7 @@ cat = SC_EXPERT [SDTC_VAR] var = gui.coloured_news_year type = SLE_INT32 -flags = SLF_NOT_IN_SAVE | SLF_NO_NETWORK_SYNC +flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC def = 2000 min = MIN_YEAR max = MAX_YEAR @@ -2890,7 +2862,7 @@ cat = SC_EXPERT [SDTC_VAR] var = gui.drag_signals_density type = SLE_UINT8 -flags = SLF_NOT_IN_SAVE | SLF_NO_NETWORK_SYNC +flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC def = 4 min = 1 max = 20 @@ -2902,7 +2874,7 @@ cat = SC_BASIC [SDTC_BOOL] var = gui.drag_signals_fixed_distance -flags = SLF_NOT_IN_SAVE | SLF_NO_NETWORK_SYNC +flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC def = false str = STR_CONFIG_SETTING_DRAG_SIGNALS_FIXED_DISTANCE strhelp = STR_CONFIG_SETTING_DRAG_SIGNALS_FIXED_DISTANCE_HELPTEXT @@ -2911,7 +2883,7 @@ cat = SC_EXPERT [SDTC_VAR] var = gui.semaphore_build_before type = SLE_INT32 -flags = SLF_NOT_IN_SAVE | SLF_NO_NETWORK_SYNC +flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC def = 1950 min = MIN_YEAR max = MAX_YEAR @@ -2923,7 +2895,7 @@ post_cb = ResetSignalVariant [SDTC_BOOL] var = gui.vehicle_income_warn -flags = SLF_NOT_IN_SAVE | SLF_NO_NETWORK_SYNC +flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC def = true str = STR_CONFIG_SETTING_WARN_INCOME_LESS strhelp = STR_CONFIG_SETTING_WARN_INCOME_LESS_HELPTEXT @@ -2932,8 +2904,7 @@ cat = SC_BASIC [SDTC_VAR] var = gui.order_review_system type = SLE_UINT8 -flags = SLF_NOT_IN_SAVE | SLF_NO_NETWORK_SYNC -guiflags = SF_GUI_DROPDOWN +flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC | SF_GUI_DROPDOWN def = 2 min = 0 max = 2 @@ -2944,14 +2915,14 @@ cat = SC_BASIC [SDTC_BOOL] var = gui.lost_vehicle_warn -flags = SLF_NOT_IN_SAVE | SLF_NO_NETWORK_SYNC +flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC def = true str = STR_CONFIG_SETTING_WARN_LOST_VEHICLE strhelp = STR_CONFIG_SETTING_WARN_LOST_VEHICLE_HELPTEXT [SDTC_BOOL] var = gui.new_nonstop -flags = SLF_NOT_IN_SAVE | SLF_NO_NETWORK_SYNC +flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC def = true str = STR_CONFIG_SETTING_NONSTOP_BY_DEFAULT strhelp = STR_CONFIG_SETTING_NONSTOP_BY_DEFAULT_HELPTEXT @@ -2960,8 +2931,7 @@ cat = SC_BASIC [SDTC_VAR] var = gui.stop_location type = SLE_UINT8 -flags = SLF_NOT_IN_SAVE | SLF_NO_NETWORK_SYNC -guiflags = SF_GUI_DROPDOWN +flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC | SF_GUI_DROPDOWN def = 2 min = 0 max = 2 @@ -2973,45 +2943,45 @@ cat = SC_BASIC [SDTC_BOOL] var = gui.keep_all_autosave -flags = SLF_NOT_IN_SAVE | SLF_NO_NETWORK_SYNC +flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC def = false [SDTC_BOOL] var = gui.autosave_on_exit -flags = SLF_NOT_IN_SAVE | SLF_NO_NETWORK_SYNC +flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC def = false cat = SC_BASIC [SDTC_BOOL] var = gui.autosave_on_network_disconnect -flags = SLF_NOT_IN_SAVE | SLF_NO_NETWORK_SYNC +flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC def = true cat = SC_EXPERT [SDTC_VAR] var = gui.max_num_autosaves type = SLE_UINT8 -flags = SLF_NOT_IN_SAVE | SLF_NO_NETWORK_SYNC +flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC def = 16 min = 0 max = 255 [SDTC_BOOL] var = gui.auto_euro -flags = SLF_NOT_IN_SAVE | SLF_NO_NETWORK_SYNC +flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC def = true [SDTC_VAR] var = gui.news_message_timeout type = SLE_UINT8 -flags = SLF_NOT_IN_SAVE | SLF_NO_NETWORK_SYNC +flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC def = 2 min = 1 max = 255 [SDTC_BOOL] var = gui.show_track_reservation -flags = SLF_NOT_IN_SAVE | SLF_NO_NETWORK_SYNC +flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC def = true str = STR_CONFIG_SETTING_SHOW_TRACK_RESERVATION strhelp = STR_CONFIG_SETTING_SHOW_TRACK_RESERVATION_HELPTEXT @@ -3021,8 +2991,7 @@ cat = SC_BASIC [SDTC_VAR] var = gui.default_signal_type type = SLE_UINT8 -flags = SLF_NOT_IN_SAVE | SLF_NO_NETWORK_SYNC -guiflags = SF_GUI_DROPDOWN +flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC | SF_GUI_DROPDOWN def = 1 min = 0 max = 2 @@ -3035,8 +3004,7 @@ cat = SC_BASIC [SDTC_VAR] var = gui.cycle_signal_types type = SLE_UINT8 -flags = SLF_NOT_IN_SAVE | SLF_NO_NETWORK_SYNC -guiflags = SF_GUI_DROPDOWN +flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC | SF_GUI_DROPDOWN def = 2 min = 0 max = 2 @@ -3048,7 +3016,7 @@ strval = STR_CONFIG_SETTING_CYCLE_SIGNAL_NORMAL [SDTC_VAR] var = gui.station_numtracks type = SLE_UINT8 -flags = SLF_NOT_IN_SAVE | SLF_NO_NETWORK_SYNC +flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC def = 1 min = 1 max = 7 @@ -3056,7 +3024,7 @@ max = 7 [SDTC_VAR] var = gui.station_platlength type = SLE_UINT8 -flags = SLF_NOT_IN_SAVE | SLF_NO_NETWORK_SYNC +flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC def = 5 min = 1 max = 7 @@ -3064,19 +3032,19 @@ cat = SC_BASIC [SDTC_BOOL] var = gui.station_dragdrop -flags = SLF_NOT_IN_SAVE | SLF_NO_NETWORK_SYNC +flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC def = true cat = SC_BASIC [SDTC_BOOL] var = gui.station_show_coverage -flags = SLF_NOT_IN_SAVE | SLF_NO_NETWORK_SYNC +flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC def = false cat = SC_BASIC [SDTC_BOOL] var = gui.persistent_buildingtools -flags = SLF_NOT_IN_SAVE | SLF_NO_NETWORK_SYNC +flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC def = true str = STR_CONFIG_SETTING_PERSISTENT_BUILDINGTOOLS strhelp = STR_CONFIG_SETTING_PERSISTENT_BUILDINGTOOLS_HELPTEXT @@ -3084,7 +3052,7 @@ cat = SC_BASIC [SDTC_BOOL] var = gui.expenses_layout -flags = SLF_NOT_IN_SAVE | SLF_NO_NETWORK_SYNC +flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC def = true str = STR_CONFIG_SETTING_EXPENSES_LAYOUT strhelp = STR_CONFIG_SETTING_EXPENSES_LAYOUT_HELPTEXT @@ -3093,7 +3061,7 @@ post_cb = [](auto) { MarkWholeScreenDirty(); } [SDTC_VAR] var = gui.station_gui_group_order type = SLE_UINT8 -flags = SLF_NOT_IN_SAVE | SLF_NO_NETWORK_SYNC +flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC def = 0 min = 0 max = 5 @@ -3102,7 +3070,7 @@ interval = 1 [SDTC_VAR] var = gui.station_gui_sort_by type = SLE_UINT8 -flags = SLF_NOT_IN_SAVE | SLF_NO_NETWORK_SYNC +flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC def = 0 min = 0 max = 3 @@ -3111,7 +3079,7 @@ interval = 1 [SDTC_VAR] var = gui.station_gui_sort_order type = SLE_UINT8 -flags = SLF_NOT_IN_SAVE | SLF_NO_NETWORK_SYNC +flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC def = 0 min = 0 max = 1 @@ -3120,7 +3088,7 @@ interval = 1 [SDTC_VAR] var = gui.missing_strings_threshold type = SLE_UINT8 -flags = SLF_NOT_IN_SAVE | SLF_NO_NETWORK_SYNC +flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC def = 25 min = 1 max = UINT8_MAX @@ -3129,7 +3097,7 @@ cat = SC_EXPERT [SDTC_VAR] var = gui.graph_line_thickness type = SLE_UINT8 -flags = SLF_NOT_IN_SAVE | SLF_NO_NETWORK_SYNC +flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC def = 3 min = 1 max = 5 @@ -3140,7 +3108,7 @@ post_cb = [](auto) { MarkWholeScreenDirty(); } [SDTC_BOOL] var = gui.show_newgrf_name -flags = SLF_NOT_IN_SAVE | SLF_NO_NETWORK_SYNC +flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC def = false str = STR_CONFIG_SETTING_SHOW_NEWGRF_NAME strhelp = STR_CONFIG_SETTING_SHOW_NEWGRF_NAME_HELPTEXT @@ -3151,19 +3119,19 @@ cat = SC_ADVANCED [SDTC_BOOL] ifdef = DEDICATED var = gui.show_date_in_logs -flags = SLF_NOT_IN_SAVE | SLF_NO_NETWORK_SYNC +flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC def = true [SDTC_BOOL] ifndef = DEDICATED var = gui.show_date_in_logs -flags = SLF_NOT_IN_SAVE | SLF_NO_NETWORK_SYNC +flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC def = false [SDTC_VAR] var = gui.settings_restriction_mode type = SLE_UINT8 -flags = SLF_NOT_IN_SAVE | SLF_NO_NETWORK_SYNC +flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC def = 0 min = 0 max = 2 @@ -3171,7 +3139,7 @@ max = 2 [SDTC_VAR] var = gui.developer type = SLE_UINT8 -flags = SLF_NOT_IN_SAVE | SLF_NO_NETWORK_SYNC +flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC def = 1 min = 0 max = 2 @@ -3179,35 +3147,34 @@ cat = SC_EXPERT [SDTC_BOOL] var = gui.newgrf_developer_tools -flags = SLF_NOT_IN_SAVE | SLF_NO_NETWORK_SYNC +flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC def = false post_cb = InvalidateNewGRFChangeWindows cat = SC_EXPERT [SDTC_BOOL] var = gui.ai_developer_tools -flags = SLF_NOT_IN_SAVE | SLF_NO_NETWORK_SYNC +flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC def = false post_cb = [](auto) { InvalidateWindowClassesData(WC_AI_SETTINGS); } cat = SC_EXPERT [SDTC_BOOL] var = gui.scenario_developer -flags = SLF_NOT_IN_SAVE | SLF_NO_NETWORK_SYNC +flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC def = false post_cb = InvalidateNewGRFChangeWindows [SDTC_BOOL] var = gui.newgrf_show_old_versions -flags = SLF_NOT_IN_SAVE | SLF_NO_NETWORK_SYNC +flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC def = false cat = SC_EXPERT [SDTC_VAR] var = gui.newgrf_default_palette type = SLE_UINT8 -flags = SLF_NOT_IN_SAVE | SLF_NO_NETWORK_SYNC -guiflags = SF_GUI_DROPDOWN +flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC | SF_GUI_DROPDOWN def = 1 min = 0 max = 1 @@ -3217,7 +3184,7 @@ cat = SC_EXPERT [SDTC_VAR] var = gui.console_backlog_timeout type = SLE_UINT16 -flags = SLF_NOT_IN_SAVE | SLF_NO_NETWORK_SYNC +flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC def = 100 min = 10 max = 65500 @@ -3225,7 +3192,7 @@ max = 65500 [SDTC_VAR] var = gui.console_backlog_length type = SLE_UINT16 -flags = SLF_NOT_IN_SAVE | SLF_NO_NETWORK_SYNC +flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC def = 100 min = 10 max = 65500 @@ -3233,7 +3200,7 @@ max = 65500 [SDTC_VAR] var = gui.refresh_rate type = SLE_UINT16 -flags = SLF_NOT_IN_SAVE | SLF_NO_NETWORK_SYNC +flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC def = 60 min = 10 max = 1000 @@ -3243,8 +3210,7 @@ startup = true [SDTC_VAR] var = gui.fast_forward_speed_limit type = SLE_UINT16 -flags = SLF_NOT_IN_SAVE | SLF_NO_NETWORK_SYNC -guiflags = SF_GUI_0_IS_SPECIAL | SF_NO_NETWORK +flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC | SF_GUI_0_IS_SPECIAL | SF_NO_NETWORK def = 2500 min = 0 max = 50000 @@ -3256,56 +3222,56 @@ cat = SC_BASIC [SDTC_BOOL] var = sound.news_ticker -flags = SLF_NOT_IN_SAVE | SLF_NO_NETWORK_SYNC +flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC def = true str = STR_CONFIG_SETTING_SOUND_TICKER strhelp = STR_CONFIG_SETTING_SOUND_TICKER_HELPTEXT [SDTC_BOOL] var = sound.news_full -flags = SLF_NOT_IN_SAVE | SLF_NO_NETWORK_SYNC +flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC def = true str = STR_CONFIG_SETTING_SOUND_NEWS strhelp = STR_CONFIG_SETTING_SOUND_NEWS_HELPTEXT [SDTC_BOOL] var = sound.new_year -flags = SLF_NOT_IN_SAVE | SLF_NO_NETWORK_SYNC +flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC def = true str = STR_CONFIG_SETTING_SOUND_NEW_YEAR strhelp = STR_CONFIG_SETTING_SOUND_NEW_YEAR_HELPTEXT [SDTC_BOOL] var = sound.confirm -flags = SLF_NOT_IN_SAVE | SLF_NO_NETWORK_SYNC +flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC def = true str = STR_CONFIG_SETTING_SOUND_CONFIRM strhelp = STR_CONFIG_SETTING_SOUND_CONFIRM_HELPTEXT [SDTC_BOOL] var = sound.click_beep -flags = SLF_NOT_IN_SAVE | SLF_NO_NETWORK_SYNC +flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC def = true str = STR_CONFIG_SETTING_SOUND_CLICK strhelp = STR_CONFIG_SETTING_SOUND_CLICK_HELPTEXT [SDTC_BOOL] var = sound.disaster -flags = SLF_NOT_IN_SAVE | SLF_NO_NETWORK_SYNC +flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC def = true str = STR_CONFIG_SETTING_SOUND_DISASTER strhelp = STR_CONFIG_SETTING_SOUND_DISASTER_HELPTEXT [SDTC_BOOL] var = sound.vehicle -flags = SLF_NOT_IN_SAVE | SLF_NO_NETWORK_SYNC +flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC def = true str = STR_CONFIG_SETTING_SOUND_VEHICLE strhelp = STR_CONFIG_SETTING_SOUND_VEHICLE_HELPTEXT [SDTC_BOOL] var = sound.ambient -flags = SLF_NOT_IN_SAVE | SLF_NO_NETWORK_SYNC +flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC def = true str = STR_CONFIG_SETTING_SOUND_AMBIENT strhelp = STR_CONFIG_SETTING_SOUND_AMBIENT_HELPTEXT @@ -3313,7 +3279,7 @@ strhelp = STR_CONFIG_SETTING_SOUND_AMBIENT_HELPTEXT [SDTC_VAR] var = music.playlist type = SLE_UINT8 -flags = SLF_NOT_IN_SAVE | SLF_NO_NETWORK_SYNC +flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC def = 0 min = 0 max = 5 @@ -3323,7 +3289,7 @@ cat = SC_BASIC [SDTC_VAR] var = music.music_vol type = SLE_UINT8 -flags = SLF_NOT_IN_SAVE | SLF_NO_NETWORK_SYNC +flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC def = 50 min = 0 max = 127 @@ -3333,7 +3299,7 @@ cat = SC_BASIC [SDTC_VAR] var = music.effect_vol type = SLE_UINT8 -flags = SLF_NOT_IN_SAVE | SLF_NO_NETWORK_SYNC +flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC def = 100 min = 0 max = 127 @@ -3343,34 +3309,33 @@ cat = SC_BASIC [SDTC_LIST] var = music.custom_1 type = SLE_UINT8 -flags = SLF_NOT_IN_SAVE | SLF_NO_NETWORK_SYNC +flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC def = nullptr cat = SC_BASIC [SDTC_LIST] var = music.custom_2 type = SLE_UINT8 -flags = SLF_NOT_IN_SAVE | SLF_NO_NETWORK_SYNC +flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC def = nullptr cat = SC_BASIC [SDTC_BOOL] var = music.playing -flags = SLF_NOT_IN_SAVE | SLF_NO_NETWORK_SYNC +flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC def = true cat = SC_BASIC [SDTC_BOOL] var = music.shuffle -flags = SLF_NOT_IN_SAVE | SLF_NO_NETWORK_SYNC +flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC def = false cat = SC_BASIC [SDTC_OMANY] var = news_display.arrival_player type = SLE_UINT8 -flags = SLF_NOT_IN_SAVE | SLF_NO_NETWORK_SYNC -guiflags = SF_GUI_DROPDOWN +flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC | SF_GUI_DROPDOWN def = 2 max = 2 full = _news_display @@ -3381,8 +3346,7 @@ strval = STR_CONFIG_SETTING_NEWS_MESSAGES_OFF [SDTC_OMANY] var = news_display.arrival_other type = SLE_UINT8 -flags = SLF_NOT_IN_SAVE | SLF_NO_NETWORK_SYNC -guiflags = SF_GUI_DROPDOWN +flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC | SF_GUI_DROPDOWN def = 1 max = 2 full = _news_display @@ -3393,8 +3357,7 @@ strval = STR_CONFIG_SETTING_NEWS_MESSAGES_OFF [SDTC_OMANY] var = news_display.accident type = SLE_UINT8 -flags = SLF_NOT_IN_SAVE | SLF_NO_NETWORK_SYNC -guiflags = SF_GUI_DROPDOWN +flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC | SF_GUI_DROPDOWN def = 2 max = 2 full = _news_display @@ -3405,8 +3368,7 @@ strval = STR_CONFIG_SETTING_NEWS_MESSAGES_OFF [SDTC_OMANY] var = news_display.company_info type = SLE_UINT8 -flags = SLF_NOT_IN_SAVE | SLF_NO_NETWORK_SYNC -guiflags = SF_GUI_DROPDOWN +flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC | SF_GUI_DROPDOWN def = 2 max = 2 full = _news_display @@ -3417,8 +3379,7 @@ strval = STR_CONFIG_SETTING_NEWS_MESSAGES_OFF [SDTC_OMANY] var = news_display.open type = SLE_UINT8 -flags = SLF_NOT_IN_SAVE | SLF_NO_NETWORK_SYNC -guiflags = SF_GUI_DROPDOWN +flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC | SF_GUI_DROPDOWN def = 1 max = 2 full = _news_display @@ -3429,8 +3390,7 @@ strval = STR_CONFIG_SETTING_NEWS_MESSAGES_OFF [SDTC_OMANY] var = news_display.close type = SLE_UINT8 -flags = SLF_NOT_IN_SAVE | SLF_NO_NETWORK_SYNC -guiflags = SF_GUI_DROPDOWN +flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC | SF_GUI_DROPDOWN def = 1 max = 2 full = _news_display @@ -3441,8 +3401,7 @@ strval = STR_CONFIG_SETTING_NEWS_MESSAGES_OFF [SDTC_OMANY] var = news_display.economy type = SLE_UINT8 -flags = SLF_NOT_IN_SAVE | SLF_NO_NETWORK_SYNC -guiflags = SF_GUI_DROPDOWN +flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC | SF_GUI_DROPDOWN def = 2 max = 2 full = _news_display @@ -3453,8 +3412,7 @@ strval = STR_CONFIG_SETTING_NEWS_MESSAGES_OFF [SDTC_OMANY] var = news_display.production_player type = SLE_UINT8 -flags = SLF_NOT_IN_SAVE | SLF_NO_NETWORK_SYNC -guiflags = SF_GUI_DROPDOWN +flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC | SF_GUI_DROPDOWN def = 1 max = 2 full = _news_display @@ -3465,8 +3423,7 @@ strval = STR_CONFIG_SETTING_NEWS_MESSAGES_OFF [SDTC_OMANY] var = news_display.production_other type = SLE_UINT8 -flags = SLF_NOT_IN_SAVE | SLF_NO_NETWORK_SYNC -guiflags = SF_GUI_DROPDOWN +flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC | SF_GUI_DROPDOWN def = 0 max = 2 full = _news_display @@ -3477,8 +3434,7 @@ strval = STR_CONFIG_SETTING_NEWS_MESSAGES_OFF [SDTC_OMANY] var = news_display.production_nobody type = SLE_UINT8 -flags = SLF_NOT_IN_SAVE | SLF_NO_NETWORK_SYNC -guiflags = SF_GUI_DROPDOWN +flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC | SF_GUI_DROPDOWN def = 0 max = 2 full = _news_display @@ -3489,8 +3445,7 @@ strval = STR_CONFIG_SETTING_NEWS_MESSAGES_OFF [SDTC_OMANY] var = news_display.advice type = SLE_UINT8 -flags = SLF_NOT_IN_SAVE | SLF_NO_NETWORK_SYNC -guiflags = SF_GUI_DROPDOWN +flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC | SF_GUI_DROPDOWN def = 2 max = 2 full = _news_display @@ -3501,8 +3456,7 @@ strval = STR_CONFIG_SETTING_NEWS_MESSAGES_OFF [SDTC_OMANY] var = news_display.new_vehicles type = SLE_UINT8 -flags = SLF_NOT_IN_SAVE | SLF_NO_NETWORK_SYNC -guiflags = SF_GUI_DROPDOWN +flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC | SF_GUI_DROPDOWN def = 2 max = 2 full = _news_display @@ -3513,8 +3467,7 @@ strval = STR_CONFIG_SETTING_NEWS_MESSAGES_OFF [SDTC_OMANY] var = news_display.acceptance type = SLE_UINT8 -flags = SLF_NOT_IN_SAVE | SLF_NO_NETWORK_SYNC -guiflags = SF_GUI_DROPDOWN +flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC | SF_GUI_DROPDOWN def = 2 max = 2 full = _news_display @@ -3525,8 +3478,7 @@ strval = STR_CONFIG_SETTING_NEWS_MESSAGES_OFF [SDTC_OMANY] var = news_display.subsidies type = SLE_UINT8 -flags = SLF_NOT_IN_SAVE | SLF_NO_NETWORK_SYNC -guiflags = SF_GUI_DROPDOWN +flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC | SF_GUI_DROPDOWN def = 1 max = 2 full = _news_display @@ -3537,8 +3489,7 @@ strval = STR_CONFIG_SETTING_NEWS_MESSAGES_OFF [SDTC_OMANY] var = news_display.general type = SLE_UINT8 -flags = SLF_NOT_IN_SAVE | SLF_NO_NETWORK_SYNC -guiflags = SF_GUI_DROPDOWN +flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC | SF_GUI_DROPDOWN def = 2 max = 2 full = _news_display @@ -3549,7 +3500,7 @@ strval = STR_CONFIG_SETTING_NEWS_MESSAGES_OFF [SDTC_VAR] var = gui.network_chat_box_width_pct type = SLE_UINT16 -flags = SLF_NOT_IN_SAVE | SLF_NO_NETWORK_SYNC +flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC def = 40 min = 10 max = 100 @@ -3558,7 +3509,7 @@ cat = SC_EXPERT [SDTC_VAR] var = gui.network_chat_box_height type = SLE_UINT8 -flags = SLF_NOT_IN_SAVE | SLF_NO_NETWORK_SYNC +flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC def = 25 min = 5 max = 255 @@ -3567,7 +3518,7 @@ cat = SC_EXPERT [SDTC_VAR] var = gui.network_chat_timeout type = SLE_UINT16 -flags = SLF_NOT_IN_SAVE | SLF_NO_NETWORK_SYNC +flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC def = 20 min = 1 max = 65535 @@ -3576,8 +3527,7 @@ cat = SC_EXPERT [SDTC_VAR] var = network.sync_freq type = SLE_UINT16 -flags = SLF_NOT_IN_SAVE | SLF_NOT_IN_CONFIG | SLF_NO_NETWORK_SYNC -guiflags = SF_NETWORK_ONLY +flags = SF_NOT_IN_SAVE | SF_NOT_IN_CONFIG | SF_NO_NETWORK_SYNC | SF_NETWORK_ONLY def = 100 min = 0 max = 100 @@ -3586,8 +3536,7 @@ cat = SC_EXPERT [SDTC_VAR] var = network.frame_freq type = SLE_UINT8 -flags = SLF_NOT_IN_SAVE | SLF_NOT_IN_CONFIG | SLF_NO_NETWORK_SYNC -guiflags = SF_NETWORK_ONLY +flags = SF_NOT_IN_SAVE | SF_NOT_IN_CONFIG | SF_NO_NETWORK_SYNC | SF_NETWORK_ONLY def = 0 min = 0 max = 100 @@ -3596,8 +3545,7 @@ cat = SC_EXPERT [SDTC_VAR] var = network.commands_per_frame type = SLE_UINT16 -flags = SLF_NOT_IN_SAVE | SLF_NO_NETWORK_SYNC -guiflags = SF_NETWORK_ONLY +flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC | SF_NETWORK_ONLY def = 2 min = 1 max = 65535 @@ -3606,8 +3554,7 @@ cat = SC_EXPERT [SDTC_VAR] var = network.max_commands_in_queue type = SLE_UINT16 -flags = SLF_NOT_IN_SAVE | SLF_NO_NETWORK_SYNC -guiflags = SF_NETWORK_ONLY +flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC | SF_NETWORK_ONLY def = 16 min = 1 max = 65535 @@ -3616,8 +3563,7 @@ cat = SC_EXPERT [SDTC_VAR] var = network.bytes_per_frame type = SLE_UINT16 -flags = SLF_NOT_IN_SAVE | SLF_NO_NETWORK_SYNC -guiflags = SF_NETWORK_ONLY +flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC | SF_NETWORK_ONLY def = 8 min = 1 max = 65535 @@ -3626,8 +3572,7 @@ cat = SC_EXPERT [SDTC_VAR] var = network.bytes_per_frame_burst type = SLE_UINT16 -flags = SLF_NOT_IN_SAVE | SLF_NO_NETWORK_SYNC -guiflags = SF_NETWORK_ONLY +flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC | SF_NETWORK_ONLY def = 256 min = 1 max = 65535 @@ -3636,8 +3581,7 @@ cat = SC_EXPERT [SDTC_VAR] var = network.max_init_time type = SLE_UINT16 -flags = SLF_NOT_IN_SAVE | SLF_NO_NETWORK_SYNC -guiflags = SF_NETWORK_ONLY +flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC | SF_NETWORK_ONLY def = 100 min = 0 max = 32000 @@ -3646,8 +3590,7 @@ cat = SC_EXPERT [SDTC_VAR] var = network.max_join_time type = SLE_UINT16 -flags = SLF_NOT_IN_SAVE | SLF_NO_NETWORK_SYNC -guiflags = SF_NETWORK_ONLY +flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC | SF_NETWORK_ONLY def = 500 min = 0 max = 32000 @@ -3655,8 +3598,7 @@ max = 32000 [SDTC_VAR] var = network.max_download_time type = SLE_UINT16 -flags = SLF_NOT_IN_SAVE | SLF_NO_NETWORK_SYNC -guiflags = SF_NETWORK_ONLY +flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC | SF_NETWORK_ONLY def = 1000 min = 0 max = 32000 @@ -3664,8 +3606,7 @@ max = 32000 [SDTC_VAR] var = network.max_password_time type = SLE_UINT16 -flags = SLF_NOT_IN_SAVE | SLF_NO_NETWORK_SYNC -guiflags = SF_NETWORK_ONLY +flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC | SF_NETWORK_ONLY def = 2000 min = 0 max = 32000 @@ -3673,23 +3614,20 @@ max = 32000 [SDTC_VAR] var = network.max_lag_time type = SLE_UINT16 -flags = SLF_NOT_IN_SAVE | SLF_NO_NETWORK_SYNC -guiflags = SF_NETWORK_ONLY +flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC | SF_NETWORK_ONLY def = 500 min = 0 max = 32000 [SDTC_BOOL] var = network.pause_on_join -flags = SLF_NOT_IN_SAVE | SLF_NO_NETWORK_SYNC -guiflags = SF_NETWORK_ONLY +flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC | SF_NETWORK_ONLY def = true [SDTC_VAR] var = network.server_port type = SLE_UINT16 -flags = SLF_NOT_IN_SAVE | SLF_NO_NETWORK_SYNC -guiflags = SF_NETWORK_ONLY +flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC | SF_NETWORK_ONLY def = NETWORK_DEFAULT_PORT min = 0 max = 65535 @@ -3698,8 +3636,7 @@ cat = SC_EXPERT [SDTC_VAR] var = network.server_admin_port type = SLE_UINT16 -flags = SLF_NOT_IN_SAVE | SLF_NO_NETWORK_SYNC -guiflags = SF_NETWORK_ONLY +flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC | SF_NETWORK_ONLY def = NETWORK_ADMIN_PORT min = 0 max = 65535 @@ -3707,22 +3644,20 @@ cat = SC_EXPERT [SDTC_BOOL] var = network.server_admin_chat -flags = SLF_NOT_IN_SAVE | SLF_NO_NETWORK_SYNC -guiflags = SF_NETWORK_ONLY +flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC | SF_NETWORK_ONLY def = true cat = SC_EXPERT [SDTC_BOOL] var = network.server_advertise -flags = SLF_NOT_IN_SAVE | SLF_NO_NETWORK_SYNC -guiflags = SF_NETWORK_ONLY +flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC | SF_NETWORK_ONLY def = false [SDTC_SSTR] var = network.client_name type = SLE_STR length = NETWORK_CLIENT_NAME_LENGTH -flags = SLF_NOT_IN_SAVE | SLF_NO_NETWORK_SYNC +flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC def = nullptr pre_cb = NetworkValidateClientName post_cb = NetworkUpdateClientName @@ -3732,8 +3667,7 @@ cat = SC_BASIC var = network.server_password type = SLE_STR length = NETWORK_PASSWORD_LENGTH -flags = SLF_NOT_IN_SAVE | SLF_NO_NETWORK_SYNC -guiflags = SF_NETWORK_ONLY +flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC | SF_NETWORK_ONLY def = nullptr pre_cb = ReplaceAsteriskWithEmptyPassword post_cb = [](auto) { NetworkServerUpdateGameInfo(); } @@ -3743,8 +3677,7 @@ cat = SC_BASIC var = network.rcon_password type = SLE_STR length = NETWORK_PASSWORD_LENGTH -flags = SLF_NOT_IN_SAVE | SLF_NO_NETWORK_SYNC -guiflags = SF_NETWORK_ONLY +flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC | SF_NETWORK_ONLY def = nullptr pre_cb = ReplaceAsteriskWithEmptyPassword cat = SC_BASIC @@ -3753,8 +3686,7 @@ cat = SC_BASIC var = network.admin_password type = SLE_STR length = NETWORK_PASSWORD_LENGTH -flags = SLF_NOT_IN_SAVE | SLF_NO_NETWORK_SYNC -guiflags = SF_NETWORK_ONLY +flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC | SF_NETWORK_ONLY def = nullptr cat = SC_BASIC @@ -3762,15 +3694,14 @@ cat = SC_BASIC var = network.default_company_pass type = SLE_STR length = NETWORK_PASSWORD_LENGTH -flags = SLF_NOT_IN_SAVE | SLF_NO_NETWORK_SYNC +flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC def = nullptr [SDTC_SSTR] var = network.server_name type = SLE_STR length = NETWORK_NAME_LENGTH -flags = SLF_NOT_IN_SAVE | SLF_NO_NETWORK_SYNC -guiflags = SF_NETWORK_ONLY +flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC | SF_NETWORK_ONLY def = nullptr pre_cb = NetworkValidateServerName post_cb = [](auto) { UpdateClientConfigValues(); } @@ -3780,28 +3711,25 @@ cat = SC_BASIC var = network.connect_to_ip type = SLE_STR length = 0 -flags = SLF_NOT_IN_SAVE | SLF_NO_NETWORK_SYNC +flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC def = nullptr [SDTC_SSTR] var = network.network_id type = SLE_STR length = NETWORK_SERVER_ID_LENGTH -flags = SLF_NOT_IN_SAVE | SLF_NO_NETWORK_SYNC -guiflags = SF_NETWORK_ONLY +flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC | SF_NETWORK_ONLY def = nullptr [SDTC_BOOL] var = network.autoclean_companies -flags = SLF_NOT_IN_SAVE | SLF_NO_NETWORK_SYNC -guiflags = SF_NETWORK_ONLY +flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC | SF_NETWORK_ONLY def = false [SDTC_VAR] var = network.autoclean_unprotected type = SLE_UINT8 -flags = SLF_NOT_IN_SAVE | SLF_NO_NETWORK_SYNC -guiflags = SF_GUI_0_IS_SPECIAL | SF_NETWORK_ONLY +flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC | SF_GUI_0_IS_SPECIAL | SF_NETWORK_ONLY def = 12 min = 0 max = 240 @@ -3809,8 +3737,7 @@ max = 240 [SDTC_VAR] var = network.autoclean_protected type = SLE_UINT8 -flags = SLF_NOT_IN_SAVE | SLF_NO_NETWORK_SYNC -guiflags = SF_GUI_0_IS_SPECIAL | SF_NETWORK_ONLY +flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC | SF_GUI_0_IS_SPECIAL | SF_NETWORK_ONLY def = 36 min = 0 max = 240 @@ -3818,8 +3745,7 @@ max = 240 [SDTC_VAR] var = network.autoclean_novehicles type = SLE_UINT8 -flags = SLF_NOT_IN_SAVE | SLF_NO_NETWORK_SYNC -guiflags = SF_GUI_0_IS_SPECIAL | SF_NETWORK_ONLY +flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC | SF_GUI_0_IS_SPECIAL | SF_NETWORK_ONLY def = 0 min = 0 max = 240 @@ -3827,8 +3753,7 @@ max = 240 [SDTC_VAR] var = network.max_companies type = SLE_UINT8 -flags = SLF_NOT_IN_SAVE | SLF_NO_NETWORK_SYNC -guiflags = SF_NETWORK_ONLY +flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC | SF_NETWORK_ONLY def = 15 min = 1 max = MAX_COMPANIES @@ -3838,8 +3763,7 @@ cat = SC_BASIC [SDTC_VAR] var = network.max_clients type = SLE_UINT8 -flags = SLF_NOT_IN_SAVE | SLF_NO_NETWORK_SYNC -guiflags = SF_NETWORK_ONLY +flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC | SF_NETWORK_ONLY def = 25 min = 2 max = MAX_CLIENTS @@ -3849,8 +3773,7 @@ cat = SC_BASIC [SDTC_VAR] var = network.max_spectators type = SLE_UINT8 -flags = SLF_NOT_IN_SAVE | SLF_NO_NETWORK_SYNC -guiflags = SF_NETWORK_ONLY +flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC | SF_NETWORK_ONLY def = 15 min = 0 max = MAX_CLIENTS @@ -3860,8 +3783,7 @@ cat = SC_BASIC [SDTC_VAR] var = network.restart_game_year type = SLE_INT32 -flags = SLF_NOT_IN_SAVE | SLF_NO_NETWORK_SYNC -guiflags = SF_GUI_0_IS_SPECIAL | SF_NETWORK_ONLY +flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC | SF_GUI_0_IS_SPECIAL | SF_NETWORK_ONLY def = 0 min = MIN_YEAR max = MAX_YEAR @@ -3870,16 +3792,14 @@ interval = 1 [SDTC_VAR] var = network.min_active_clients type = SLE_UINT8 -flags = SLF_NOT_IN_SAVE | SLF_NO_NETWORK_SYNC -guiflags = SF_NETWORK_ONLY +flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC | SF_NETWORK_ONLY def = 0 min = 0 max = MAX_CLIENTS [SDTC_BOOL] var = network.reload_cfg -flags = SLF_NOT_IN_SAVE | SLF_NO_NETWORK_SYNC -guiflags = SF_NETWORK_ONLY +flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC | SF_NETWORK_ONLY def = false cat = SC_EXPERT @@ -3887,12 +3807,12 @@ cat = SC_EXPERT var = network.last_joined type = SLE_STR length = 0 -flags = SLF_NOT_IN_SAVE | SLF_NO_NETWORK_SYNC +flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC def = """" cat = SC_EXPERT [SDTC_BOOL] var = network.no_http_content_downloads -flags = SLF_NOT_IN_SAVE | SLF_NO_NETWORK_SYNC +flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC def = false cat = SC_EXPERT diff --git a/src/table/settings/win32_settings.ini b/src/table/settings/win32_settings.ini index 32a5cf5c93..df1e0cb272 100644 --- a/src/table/settings/win32_settings.ini +++ b/src/table/settings/win32_settings.ini @@ -17,15 +17,14 @@ static const SettingTable _win32_settings{ }; #endif /* _WIN32 */ [templates] -SDTG_BOOL = SDTG_BOOL($name, $flags, $guiflags, $var, $def, $str, $strhelp, $strval, $pre_cb, $post_cb, $from, $to, $cat, $extra, $startup), -SDTG_VAR = SDTG_VAR($name, $type, $flags, $guiflags, $var, $def, $min, $max, $interval, $str, $strhelp, $strval, $pre_cb, $post_cb, $from, $to, $cat, $extra, $startup), +SDTG_BOOL = SDTG_BOOL($name, $flags, $var, $def, $str, $strhelp, $strval, $pre_cb, $post_cb, $from, $to, $cat, $extra, $startup), +SDTG_VAR = SDTG_VAR($name, $type, $flags, $var, $def, $min, $max, $interval, $str, $strhelp, $strval, $pre_cb, $post_cb, $from, $to, $cat, $extra, $startup), [validation] SDTG_VAR = static_assert($max <= MAX_$type, "Maximum value for $var exceeds storage size"); [defaults] -flags = SLF_NOT_IN_SAVE | SLF_NO_NETWORK_SYNC -guiflags = SF_NONE +flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC interval = 0 str = STR_NULL strhelp = STR_CONFIG_SETTING_NO_EXPLANATION_AVAILABLE_HELPTEXT diff --git a/src/table/settings/window_settings.ini b/src/table/settings/window_settings.ini index f9301ef2ce..3a7669754f 100644 --- a/src/table/settings/window_settings.ini +++ b/src/table/settings/window_settings.ini @@ -13,15 +13,14 @@ static const SettingTable _window_settings{ [post-amble] }; [templates] -SDT_BOOL = SDT_BOOL(WindowDesc, $var, $flags, $guiflags, $def, $str, $strhelp, $strval, $pre_cb, $post_cb, $from, $to, $cat, $extra, $startup), -SDT_VAR = SDT_VAR(WindowDesc, $var, $type, $flags, $guiflags, $def, $min, $max, $interval, $str, $strhelp, $strval, $pre_cb, $post_cb, $from, $to, $cat, $extra, $startup), +SDT_BOOL = SDT_BOOL(WindowDesc, $var, $flags, $def, $str, $strhelp, $strval, $pre_cb, $post_cb, $from, $to, $cat, $extra, $startup), +SDT_VAR = SDT_VAR(WindowDesc, $var, $type, $flags, $def, $min, $max, $interval, $str, $strhelp, $strval, $pre_cb, $post_cb, $from, $to, $cat, $extra, $startup), [validation] SDT_VAR = static_assert($max <= MAX_$type, "Maximum value for WindowDesc.$var exceeds storage size"); [defaults] -flags = SLF_NOT_IN_SAVE | SLF_NO_NETWORK_SYNC -guiflags = SF_NONE +flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC interval = 0 str = STR_NULL strhelp = STR_CONFIG_SETTING_NO_EXPLANATION_AVAILABLE_HELPTEXT From 1e564b333fa2d7bde2f21d7a05bb3e81305185c5 Mon Sep 17 00:00:00 2001 From: Patric Stout Date: Mon, 7 Jun 2021 23:03:12 +0200 Subject: [PATCH 04/27] Codechange: make [Save|Load]Settings() behave more like other Save/Load code (#9335) Prepare the full description and send it to SlObject. This does require some code to be able to read to a SLE_VAR_NULL, like strings etc, as there is no way to know their length beforehand. --- src/saveload/saveload.cpp | 13 ++++++-- src/saveload/saveload.h | 1 - src/settings.cpp | 62 +++++++++++++++++++++++---------------- 3 files changed, 47 insertions(+), 29 deletions(-) diff --git a/src/saveload/saveload.cpp b/src/saveload/saveload.cpp index 35a6437e18..29fcf89daf 100644 --- a/src/saveload/saveload.cpp +++ b/src/saveload/saveload.cpp @@ -584,7 +584,7 @@ static inline uint SlGetArrayLength(size_t length) * @param conv VarType type of variable that is used for calculating the size * @return Return the size of this type in bytes */ -uint SlCalcConvMemLen(VarType conv) +static inline uint SlCalcConvMemLen(VarType conv) { static const byte conv_mem_size[] = {1, 1, 1, 2, 2, 4, 4, 8, 8, 0}; byte length = GB(conv, 4, 4); @@ -943,6 +943,9 @@ static void SlString(void *ptr, size_t length, VarType conv) switch (GetVarMemType(conv)) { default: NOT_REACHED(); + case SLE_VAR_NULL: + SlSkipBytes(len); + return; case SLE_VAR_STRB: if (len >= length) { DEBUG(sl, 1, "String length in savegame is bigger than buffer, truncating"); @@ -1007,8 +1010,12 @@ static void SlStdString(void *ptr, VarType conv) case SLA_LOAD_CHECK: case SLA_LOAD: { size_t len = SlReadArrayLength(); - char *buf = AllocaM(char, len + 1); + if (GetVarMemType(conv) == SLE_VAR_NULL) { + SlSkipBytes(len); + return; + } + char *buf = AllocaM(char, len + 1); SlCopyBytes(buf, len); buf[len] = '\0'; // properly terminate the string @@ -1469,6 +1476,8 @@ size_t SlCalcObjMemberLength(const void *object, const SaveLoad &sld) */ [[maybe_unused]] static bool IsVariableSizeRight(const SaveLoad &sld) { + if (GetVarMemType(sld.conv) == SLE_VAR_NULL) return true; + switch (sld.cmd) { case SL_VAR: switch (GetVarMemType(sld.conv)) { diff --git a/src/saveload/saveload.h b/src/saveload/saveload.h index 94138eb747..53a81f7c2f 100644 --- a/src/saveload/saveload.h +++ b/src/saveload/saveload.h @@ -893,7 +893,6 @@ void WriteValue(void *ptr, VarType conv, int64 val); void SlSetArrayIndex(uint index); int SlIterateArray(); -uint SlCalcConvMemLen(VarType conv); void SlAutolength(AutolengthProc *proc, void *arg); size_t SlGetFieldLength(); void SlSetLength(size_t length); diff --git a/src/settings.cpp b/src/settings.cpp index c3afd55089..24039c564a 100644 --- a/src/settings.cpp +++ b/src/settings.cpp @@ -2014,6 +2014,31 @@ void IConsoleListSettings(const char *prefilter) IConsolePrintF(CC_WARNING, "Use 'setting' command to change a value"); } +/** + * Get the SaveLoad description for the SettingTable. + * @param settings SettingDesc struct containing all information. + * @param is_loading True iff the SaveLoad table is for loading. + * @return Vector with SaveLoad entries for the SettingTable. + */ +static std::vector GetSettingsDesc(const SettingTable &settings, bool is_loading) +{ + std::vector saveloads; + for (auto &sd : settings) { + if (sd->flags & SF_NOT_IN_SAVE) continue; + + if (is_loading && (sd->flags & SF_NO_NETWORK_SYNC) && _networking && !_network_server) { + /* We don't want to read this setting, so we do need to skip over it. */ + saveloads.push_back({sd->save.cmd, GetVarFileType(sd->save.conv) | SLE_VAR_NULL, sd->save.length, sd->save.version_from, sd->save.version_to, 0, nullptr, 0}); + continue; + } + + saveloads.push_back(sd->save); + } + + return saveloads; +} + + /** * Save and load handler for settings * @param settings SettingDesc struct containing all information @@ -2022,20 +2047,18 @@ void IConsoleListSettings(const char *prefilter) */ static void LoadSettings(const SettingTable &settings, void *object) { - for (auto &osd : settings) { - if (osd->flags & SF_NOT_IN_SAVE) continue; + const std::vector slt = GetSettingsDesc(settings, true); - SaveLoad sl = osd->save; - if ((osd->flags & SF_NO_NETWORK_SYNC) && _networking && !_network_server) { - /* We don't want to read this setting, so we do need to skip over it. */ - sl = SLE_NULL(static_cast(SlCalcConvMemLen(osd->save.conv) * osd->save.length)); - } + SlObject(object, slt); - void *ptr = GetVariableAddress(object, sl); - if (!SlObjectMember(ptr, sl)) continue; + /* Ensure all IntSettings are valid (min/max could have changed between versions etc). */ + for (auto &sd : settings) { + if (sd->flags & SF_NOT_IN_SAVE) continue; + if ((sd->flags & SF_NO_NETWORK_SYNC) && _networking && !_network_server) continue; + if (!SlIsObjectCurrentlyValid(sd->save.version_from, sd->save.version_to)) continue; - if (osd->IsIntSetting()) { - const IntSettingDesc *int_setting = osd->AsIntSetting(); + if (sd->IsIntSetting()) { + const IntSettingDesc *int_setting = sd->AsIntSetting(); int_setting->MakeValueValidAndWrite(object, int_setting->Read(object)); } } @@ -2049,22 +2072,9 @@ static void LoadSettings(const SettingTable &settings, void *object) */ static void SaveSettings(const SettingTable &settings, void *object) { - /* We need to write the CH_RIFF header, but unfortunately can't call - * SlCalcLength() because we have a different format. So do this manually */ - size_t length = 0; - for (auto &sd : settings) { - if (sd->flags & SF_NOT_IN_SAVE) continue; + const std::vector slt = GetSettingsDesc(settings, false); - length += SlCalcObjMemberLength(object, sd->save); - } - SlSetLength(length); - - for (auto &sd : settings) { - if (sd->flags & SF_NOT_IN_SAVE) continue; - - void *ptr = GetVariableAddress(object, sd->save); - SlObjectMember(ptr, sd->save); - } + SlObject(object, slt); } static void Load_OPTS() From f997eb6ca4177b577387306b4c15ec4815f0f13c Mon Sep 17 00:00:00 2001 From: Patric Stout Date: Tue, 8 Jun 2021 20:30:44 +0200 Subject: [PATCH 05/27] Fix: compatible NewGRFs in crash-log reported wrong md5 (#9340) The text suggests it reports the original md5, but it does in fact report the replaced md5. Now it reports both. --- src/saveload/afterload.cpp | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/saveload/afterload.cpp b/src/saveload/afterload.cpp index f60c12b91b..ff21599963 100644 --- a/src/saveload/afterload.cpp +++ b/src/saveload/afterload.cpp @@ -402,9 +402,11 @@ static void CDECL HandleSavegameLoadCrash(int signum) for (const GRFConfig *c = _grfconfig; c != nullptr; c = c->next) { if (HasBit(c->flags, GCF_COMPATIBLE)) { const GRFIdentifier *replaced = GetOverriddenIdentifier(c); - char buf[40]; - md5sumToString(buf, lastof(buf), replaced->md5sum); - p += seprintf(p, lastof(buffer), "NewGRF %08X (checksum %s) not found.\n Loaded NewGRF \"%s\" with same GRF ID instead.\n", BSWAP32(c->ident.grfid), buf, c->filename); + char original_md5[40]; + char replaced_md5[40]; + md5sumToString(original_md5, lastof(original_md5), c->original_md5sum); + md5sumToString(replaced_md5, lastof(replaced_md5), replaced->md5sum); + p += seprintf(p, lastof(buffer), "NewGRF %08X (checksum %s) not found.\n Loaded NewGRF \"%s\" (checksum %s) with same GRF ID instead.\n", BSWAP32(c->ident.grfid), original_md5, c->filename, replaced_md5); } if (c->status == GCS_NOT_FOUND) { char buf[40]; From 12de256b72fb7442cd84c6a0e0c6a61636255a6b Mon Sep 17 00:00:00 2001 From: translators Date: Tue, 8 Jun 2021 19:22:42 +0000 Subject: [PATCH 06/27] Update: Translations from eints german: 1 change by Wuzzy2 spanish: 1 change by ilyabakhlin --- src/lang/german.txt | 1 + src/lang/spanish.txt | 1 + 2 files changed, 2 insertions(+) diff --git a/src/lang/german.txt b/src/lang/german.txt index 7088b47303..64d2f71bcb 100644 --- a/src/lang/german.txt +++ b/src/lang/german.txt @@ -2205,6 +2205,7 @@ STR_NETWORK_ERROR_CLIENT_START :{WHITE}Verbindu STR_NETWORK_ERROR_TIMEOUT :{WHITE}Verbindung #{NUM} hat das Zeitlimit überschritten STR_NETWORK_ERROR_SERVER_ERROR :{WHITE}Protokollfehler: Die Verbindung musste getrennt werden STR_NETWORK_ERROR_BAD_PLAYER_NAME :{WHITE}Ihr Spielername wurde nicht gesetzt. Der Name kann im Mehrspielerfenster oben gesetzt werden +STR_NETWORK_ERROR_BAD_SERVER_NAME :{WHITE}Ihr Servername wurde nicht gesetzt. Der Name kann oben im Mehrspielerfenster gesetzt werden STR_NETWORK_ERROR_WRONG_REVISION :{WHITE}Diese Version des Spiels entspricht nicht der des Servers STR_NETWORK_ERROR_WRONG_PASSWORD :{WHITE}Falsches Passwort STR_NETWORK_ERROR_SERVER_FULL :{WHITE}Der Server ist voll diff --git a/src/lang/spanish.txt b/src/lang/spanish.txt index 8bdbbe7a76..e69260ca03 100644 --- a/src/lang/spanish.txt +++ b/src/lang/spanish.txt @@ -2205,6 +2205,7 @@ STR_NETWORK_ERROR_CLIENT_START :{WHITE}No se pu STR_NETWORK_ERROR_TIMEOUT :{WHITE}Tiempo de espera agotado en conexión #{NUM} STR_NETWORK_ERROR_SERVER_ERROR :{WHITE}Se ha producido un error de protocolo y la conexión ha sido cerrada STR_NETWORK_ERROR_BAD_PLAYER_NAME :{WHITE}No se ha establecido tu nombre de jugador. El nombre se puede establecer en la parte superior de la ventana de Multijugador +STR_NETWORK_ERROR_BAD_SERVER_NAME :{WHITE}El nombre de tu servidor no se ha definido. El nombre puede definirse al principio de la ventana de Multijugador STR_NETWORK_ERROR_WRONG_REVISION :{WHITE}La versión de este cliente no corresponde con la versión del servidor STR_NETWORK_ERROR_WRONG_PASSWORD :{WHITE}Contraseña incorrecta STR_NETWORK_ERROR_SERVER_FULL :{WHITE}El servidor está completo From 37b285ad83207d98136a8a36da85f2dec9e415c8 Mon Sep 17 00:00:00 2001 From: translators Date: Wed, 9 Jun 2021 19:13:47 +0000 Subject: [PATCH 07/27] Update: Translations from eints spanish (mexican): 2 changes by absay --- src/lang/spanish_MX.txt | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/lang/spanish_MX.txt b/src/lang/spanish_MX.txt index f314f9deae..c74c5685ab 100644 --- a/src/lang/spanish_MX.txt +++ b/src/lang/spanish_MX.txt @@ -3560,7 +3560,7 @@ STR_GROUP_CREATE_TOOLTIP :{BLACK}Clic par STR_GROUP_DELETE_TOOLTIP :{BLACK}Eliminar el grupo seleccionado STR_GROUP_RENAME_TOOLTIP :{BLACK}Cambiar nombre del grupo seleccionado STR_GROUP_LIVERY_TOOLTIP :{BLACK}Cambiar cromática del grupo elegido -STR_GROUP_REPLACE_PROTECTION_TOOLTIP :{BLACK}Clic para evitar que los vehículos en este grupo se reemplacen automáticamente. +STR_GROUP_REPLACE_PROTECTION_TOOLTIP :{BLACK}Clic para evitar que los vehículos en este grupo se reemplacen automáticamente. Ctrl+Clic incluye a los subgrupos. STR_QUERY_GROUP_DELETE_CAPTION :{WHITE}Eliminar grupo STR_GROUP_DELETE_QUERY_TEXT :{WHITE}¿Eliminar este grupo y todos sus subgrupos? @@ -3815,6 +3815,7 @@ STR_REPLACE_TRAM_VEHICLES :Vehículos de t STR_REPLACE_REMOVE_WAGON :{BLACK}Quitar vagó ({STRING}): {ORANGE}{STRING} STR_REPLACE_REMOVE_WAGON_HELP :{BLACK}Hacer que el reemplazo automático mantenga la longitud del tren quitando vagones (empezando por el frente), si el cambio de locomotora produce un tren más largo +STR_REPLACE_REMOVE_WAGON_GROUP_HELP :{STRING}. Ctrl+Clic para incluir subgrupos # Vehicle view STR_VEHICLE_VIEW_CAPTION :{WHITE}{VEHICLE} From f899772ec29b9b802ab07e074dc0421f4e2d1a28 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?V=C3=ADt=20=C5=A0efl?= Date: Thu, 10 Jun 2021 15:49:25 +0200 Subject: [PATCH 08/27] Fix 2e136285: Crash when CTRL-clicking on a sign (#9345) --- src/signs_gui.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/signs_gui.cpp b/src/signs_gui.cpp index 27c618087c..711cd735ee 100644 --- a/src/signs_gui.cpp +++ b/src/signs_gui.cpp @@ -566,7 +566,7 @@ static WindowDesc _query_sign_edit_desc( void HandleClickOnSign(const Sign *si) { if (_ctrl_pressed && (si->owner == _local_company || (si->owner == OWNER_DEITY && _game_mode == GM_EDITOR))) { - RenameSign(si->index, nullptr); + RenameSign(si->index, ""); return; } ShowRenameSignWindow(si); From fba86f711fe091fa0802a65979df019f690e8827 Mon Sep 17 00:00:00 2001 From: Patric Stout Date: Mon, 31 May 2021 22:49:44 +0200 Subject: [PATCH 09/27] Codechange: move GetVariableAddress inside SlObjectMember Also move it to static, as nobody else is using it. --- src/saveload/saveload.cpp | 7 ++++--- src/saveload/saveload.h | 1 - 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/saveload/saveload.cpp b/src/saveload/saveload.cpp index 29fcf89daf..c325c1ee58 100644 --- a/src/saveload/saveload.cpp +++ b/src/saveload/saveload.cpp @@ -1517,8 +1517,10 @@ size_t SlCalcObjMemberLength(const void *object, const SaveLoad &sld) } } -bool SlObjectMember(void *ptr, const SaveLoad &sld) +static bool SlObjectMember(void *object, const SaveLoad &sld) { + void *ptr = GetVariableAddress(object, sld); + assert(IsVariableSizeRight(sld)); VarType conv = GB(sld.conv, 0, 8); @@ -1604,8 +1606,7 @@ void SlObject(void *object, const SaveLoadTable &slt) } for (auto &sld : slt) { - void *ptr = GetVariableAddress(object, sld); - SlObjectMember(ptr, sld); + SlObjectMember(object, sld); } } diff --git a/src/saveload/saveload.h b/src/saveload/saveload.h index 53a81f7c2f..e320c7d8b9 100644 --- a/src/saveload/saveload.h +++ b/src/saveload/saveload.h @@ -905,7 +905,6 @@ void SlWriteByte(byte b); void SlGlobList(const SaveLoadTable &slt); void SlArray(void *array, size_t length, VarType conv); void SlObject(void *object, const SaveLoadTable &slt); -bool SlObjectMember(void *object, const SaveLoad &sld); void NORETURN SlError(StringID string, const char *extra_msg = nullptr); void NORETURN SlErrorCorrupt(const char *msg); void NORETURN SlErrorCorruptFmt(const char *format, ...) WARN_FORMAT(1, 2); From a2147d437e970b22da0290f6ac8e75c12ed6fe92 Mon Sep 17 00:00:00 2001 From: Patric Stout Date: Fri, 4 Jun 2021 10:33:38 +0200 Subject: [PATCH 10/27] Codechange: use wrappers to get Var[Mem|File]Type, instead of GB() --- src/saveload/saveload.cpp | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/src/saveload/saveload.cpp b/src/saveload/saveload.cpp index c325c1ee58..40f631e312 100644 --- a/src/saveload/saveload.cpp +++ b/src/saveload/saveload.cpp @@ -587,17 +587,17 @@ static inline uint SlGetArrayLength(size_t length) static inline uint SlCalcConvMemLen(VarType conv) { static const byte conv_mem_size[] = {1, 1, 1, 2, 2, 4, 4, 8, 8, 0}; - byte length = GB(conv, 4, 4); - switch (length << 4) { + switch (GetVarMemType(conv)) { case SLE_VAR_STRB: case SLE_VAR_STR: case SLE_VAR_STRQ: return SlReadArrayLength(); default: - assert(length < lengthof(conv_mem_size)); - return conv_mem_size[length]; + uint8 type = GetVarMemType(conv) >> 4; + assert(type < lengthof(conv_mem_size)); + return conv_mem_size[type]; } } @@ -610,9 +610,10 @@ static inline uint SlCalcConvMemLen(VarType conv) static inline byte SlCalcConvFileLen(VarType conv) { static const byte conv_file_size[] = {1, 1, 2, 2, 4, 4, 8, 8, 2}; - byte length = GB(conv, 0, 4); - assert(length < lengthof(conv_file_size)); - return conv_file_size[length]; + + uint8 type = GetVarFileType(conv); + assert(type < lengthof(conv_file_size)); + return conv_file_size[type]; } /** Return the size in bytes of a reference (pointer) */ From 23857af6931e1cd4dc22d15e75850b83cc8af198 Mon Sep 17 00:00:00 2001 From: Patric Stout Date: Sun, 6 Jun 2021 10:22:55 +0200 Subject: [PATCH 11/27] Codechange: refactor SlDequeueHelper to work with unsigned and be more generic Future additions will start using it for std::list too. --- src/saveload/saveload.cpp | 179 +++++++++++++++++--------------------- 1 file changed, 78 insertions(+), 101 deletions(-) diff --git a/src/saveload/saveload.cpp b/src/saveload/saveload.cpp index 40f631e312..97f4a82d0b 100644 --- a/src/saveload/saveload.cpp +++ b/src/saveload/saveload.cpp @@ -1217,6 +1217,66 @@ static void *IntToReference(size_t index, SLRefType rt) } } +/** + * Template class to help with list-like types. + */ +template typename Tstorage, typename Tvar, typename Tallocator = std::allocator> +class SlStorageHelper { + typedef Tstorage SlStorageT; +public: + /** + * Internal templated helper to return the size in bytes of a list-like type. + * @param storage The storage to find the size of + * @param conv VarType type of variable that is used for calculating the size + */ + static size_t SlCalcLen(const void *storage, VarType conv) + { + const SlStorageT *list = static_cast(storage); + + int type_size = SlCalcConvFileLen(SLE_FILE_U32); // Size of the length of the list. + int item_size = SlCalcConvFileLen(conv); + return list->size() * item_size + type_size; + } + + /** + * Internal templated helper to save/load a list-like type. + * @param storage The storage being manipulated. + * @param conv VarType type of variable that is used for calculating the size. + */ + static void SlSaveLoad(void *storage, VarType conv) + { + SlStorageT *list = static_cast(storage); + + switch (_sl.action) { + case SLA_SAVE: { + SlWriteUint32((uint32)list->size()); + + for (auto &item : *list) { + SlSaveLoadConv(&item, conv); + } + break; + } + case SLA_LOAD_CHECK: + case SLA_LOAD: { + size_t length = SlReadUint32(); + + /* Load each value and push to the end of the storage. */ + for (size_t i = 0; i < length; i++) { + Tvar &data = list->emplace_back(); + SlSaveLoadConv(&data, conv); + } + break; + } + case SLA_PTRS: + break; + case SLA_NULL: + list->clear(); + break; + default: NOT_REACHED(); + } + } +}; + /** * Return the size in bytes of a list * @param list The std::list to find the size of @@ -1231,7 +1291,6 @@ static inline size_t SlCalcListLen(const void *list) return l->size() * type_size + type_size; } - /** * Save/Load a list. * @param list The list being manipulated @@ -1289,71 +1348,6 @@ static void SlList(void *list, SLRefType conv) } } - -/** - * Template class to help with std::deque. - */ -template -class SlDequeHelper { - typedef std::deque SlDequeT; -public: - /** - * Internal templated helper to return the size in bytes of a std::deque. - * @param deque The std::deque to find the size of - * @param conv VarType type of variable that is used for calculating the size - */ - static size_t SlCalcDequeLen(const void *deque, VarType conv) - { - const SlDequeT *l = (const SlDequeT *)deque; - - int type_size = 4; - /* Each entry is saved as type_size bytes, plus type_size bytes are used for the length - * of the list */ - return l->size() * SlCalcConvFileLen(conv) + type_size; - } - - /** - * Internal templated helper to save/load a std::deque. - * @param deque The std::deque being manipulated - * @param conv VarType type of variable that is used for calculating the size - */ - static void SlDeque(void *deque, VarType conv) - { - SlDequeT *l = (SlDequeT *)deque; - - switch (_sl.action) { - case SLA_SAVE: { - SlWriteUint32((uint32)l->size()); - - typename SlDequeT::iterator iter; - for (iter = l->begin(); iter != l->end(); ++iter) { - SlSaveLoadConv(&(*iter), conv); - } - break; - } - case SLA_LOAD_CHECK: - case SLA_LOAD: { - size_t length = SlReadUint32(); - - /* Load each value and push to the end of the deque */ - for (size_t i = 0; i < length; i++) { - T data; - SlSaveLoadConv(&data, conv); - l->push_back(data); - } - break; - } - case SLA_PTRS: - break; - case SLA_NULL: - l->clear(); - break; - default: NOT_REACHED(); - } - } -}; - - /** * Return the size in bytes of a std::deque. * @param deque The std::deque to find the size of @@ -1362,25 +1356,19 @@ public: static inline size_t SlCalcDequeLen(const void *deque, VarType conv) { switch (GetVarMemType(conv)) { - case SLE_VAR_BL: - return SlDequeHelper::SlCalcDequeLen(deque, conv); - case SLE_VAR_I8: - case SLE_VAR_U8: - return SlDequeHelper::SlCalcDequeLen(deque, conv); - case SLE_VAR_I16: - case SLE_VAR_U16: - return SlDequeHelper::SlCalcDequeLen(deque, conv); - case SLE_VAR_I32: - case SLE_VAR_U32: - return SlDequeHelper::SlCalcDequeLen(deque, conv); - case SLE_VAR_I64: - case SLE_VAR_U64: - return SlDequeHelper::SlCalcDequeLen(deque, conv); + case SLE_VAR_BL: return SlStorageHelper::SlCalcLen(deque, conv); + case SLE_VAR_I8: return SlStorageHelper::SlCalcLen(deque, conv); + case SLE_VAR_U8: return SlStorageHelper::SlCalcLen(deque, conv); + case SLE_VAR_I16: return SlStorageHelper::SlCalcLen(deque, conv); + case SLE_VAR_U16: return SlStorageHelper::SlCalcLen(deque, conv); + case SLE_VAR_I32: return SlStorageHelper::SlCalcLen(deque, conv); + case SLE_VAR_U32: return SlStorageHelper::SlCalcLen(deque, conv); + case SLE_VAR_I64: return SlStorageHelper::SlCalcLen(deque, conv); + case SLE_VAR_U64: return SlStorageHelper::SlCalcLen(deque, conv); default: NOT_REACHED(); } } - /** * Save/load a std::deque. * @param deque The std::deque being manipulated @@ -1389,30 +1377,19 @@ static inline size_t SlCalcDequeLen(const void *deque, VarType conv) static void SlDeque(void *deque, VarType conv) { switch (GetVarMemType(conv)) { - case SLE_VAR_BL: - SlDequeHelper::SlDeque(deque, conv); - break; - case SLE_VAR_I8: - case SLE_VAR_U8: - SlDequeHelper::SlDeque(deque, conv); - break; - case SLE_VAR_I16: - case SLE_VAR_U16: - SlDequeHelper::SlDeque(deque, conv); - break; - case SLE_VAR_I32: - case SLE_VAR_U32: - SlDequeHelper::SlDeque(deque, conv); - break; - case SLE_VAR_I64: - case SLE_VAR_U64: - SlDequeHelper::SlDeque(deque, conv); - break; + case SLE_VAR_BL: SlStorageHelper::SlSaveLoad(deque, conv); break; + case SLE_VAR_I8: SlStorageHelper::SlSaveLoad(deque, conv); break; + case SLE_VAR_U8: SlStorageHelper::SlSaveLoad(deque, conv); break; + case SLE_VAR_I16: SlStorageHelper::SlSaveLoad(deque, conv); break; + case SLE_VAR_U16: SlStorageHelper::SlSaveLoad(deque, conv); break; + case SLE_VAR_I32: SlStorageHelper::SlSaveLoad(deque, conv); break; + case SLE_VAR_U32: SlStorageHelper::SlSaveLoad(deque, conv); break; + case SLE_VAR_I64: SlStorageHelper::SlSaveLoad(deque, conv); break; + case SLE_VAR_U64: SlStorageHelper::SlSaveLoad(deque, conv); break; default: NOT_REACHED(); } } - /** Are we going to save this object or not? */ static inline bool SlIsObjectValidInSavegame(const SaveLoad &sld) { From aa6443d57a6e821fabeee65541d3eb869b96772b Mon Sep 17 00:00:00 2001 From: Patric Stout Date: Sun, 6 Jun 2021 11:05:03 +0200 Subject: [PATCH 12/27] Codechange: refactor SlList to use SlStorageHelper --- src/saveload/saveload.cpp | 157 ++++++++++++++++++-------------------- 1 file changed, 74 insertions(+), 83 deletions(-) diff --git a/src/saveload/saveload.cpp b/src/saveload/saveload.cpp index 97f4a82d0b..733ff509da 100644 --- a/src/saveload/saveload.cpp +++ b/src/saveload/saveload.cpp @@ -1217,6 +1217,31 @@ static void *IntToReference(size_t index, SLRefType rt) } } +/** + * Handle conversion for references. + * @param ptr The object being filled/read. + * @param conv VarType type of the current element of the struct. + */ +void SlSaveLoadRef(void *ptr, VarType conv) +{ + switch (_sl.action) { + case SLA_SAVE: + SlWriteUint32((uint32)ReferenceToInt(*(void **)ptr, (SLRefType)conv)); + break; + case SLA_LOAD_CHECK: + case SLA_LOAD: + *(size_t *)ptr = IsSavegameVersionBefore(SLV_69) ? SlReadUint16() : SlReadUint32(); + break; + case SLA_PTRS: + *(void **)ptr = IntToReference(*(size_t *)ptr, (SLRefType)conv); + break; + case SLA_NULL: + *(void **)ptr = nullptr; + break; + default: NOT_REACHED(); + } +} + /** * Template class to help with list-like types. */ @@ -1228,124 +1253,107 @@ public: * Internal templated helper to return the size in bytes of a list-like type. * @param storage The storage to find the size of * @param conv VarType type of variable that is used for calculating the size + * @param cmd The SaveLoadType ware are saving/loading. */ - static size_t SlCalcLen(const void *storage, VarType conv) + static size_t SlCalcLen(const void *storage, VarType conv, SaveLoadType cmd = SL_VAR) { + assert(cmd == SL_VAR || cmd == SL_REF); + const SlStorageT *list = static_cast(storage); int type_size = SlCalcConvFileLen(SLE_FILE_U32); // Size of the length of the list. - int item_size = SlCalcConvFileLen(conv); + int item_size = SlCalcConvFileLen(cmd == SL_VAR ? conv : (VarType)SLE_FILE_U32); return list->size() * item_size + type_size; } + static void SlSaveLoadMember(SaveLoadType cmd, Tvar *item, VarType conv) + { + switch (cmd) { + case SL_VAR: SlSaveLoadConv(item, conv); break; + case SL_REF: SlSaveLoadRef(item, conv); break; + default: + NOT_REACHED(); + } + } + /** * Internal templated helper to save/load a list-like type. * @param storage The storage being manipulated. * @param conv VarType type of variable that is used for calculating the size. - */ - static void SlSaveLoad(void *storage, VarType conv) + * @param cmd The SaveLoadType ware are saving/loading. + */ + static void SlSaveLoad(void *storage, VarType conv, SaveLoadType cmd = SL_VAR) { + assert(cmd == SL_VAR || cmd == SL_REF); + SlStorageT *list = static_cast(storage); switch (_sl.action) { - case SLA_SAVE: { + case SLA_SAVE: SlWriteUint32((uint32)list->size()); for (auto &item : *list) { - SlSaveLoadConv(&item, conv); + SlSaveLoadMember(cmd, &item, conv); } break; - } + case SLA_LOAD_CHECK: case SLA_LOAD: { - size_t length = SlReadUint32(); + size_t length; + switch (cmd) { + case SL_VAR: length = SlReadUint32(); break; + case SL_REF: length = IsSavegameVersionBefore(SLV_69) ? SlReadUint16() : SlReadUint32(); break; + default: NOT_REACHED(); + } /* Load each value and push to the end of the storage. */ for (size_t i = 0; i < length; i++) { Tvar &data = list->emplace_back(); - SlSaveLoadConv(&data, conv); + SlSaveLoadMember(cmd, &data, conv); } break; } + case SLA_PTRS: + for (auto &item : *list) { + SlSaveLoadMember(cmd, &item, conv); + } break; + case SLA_NULL: list->clear(); break; + default: NOT_REACHED(); } } }; /** - * Return the size in bytes of a list - * @param list The std::list to find the size of + * Return the size in bytes of a list. + * @param list The std::list to find the size of. + * @param conv VarType type of variable that is used for calculating the size. */ -static inline size_t SlCalcListLen(const void *list) +static inline size_t SlCalcListLen(const void *list, VarType conv) { - const std::list *l = (const std::list *) list; - - int type_size = IsSavegameVersionBefore(SLV_69) ? 2 : 4; - /* Each entry is saved as type_size bytes, plus type_size bytes are used for the length - * of the list */ - return l->size() * type_size + type_size; + return SlStorageHelper::SlCalcLen(list, conv, SL_REF); } /** * Save/Load a list. - * @param list The list being manipulated - * @param conv SLRefType type of the list (Vehicle *, Station *, etc) + * @param list The list being manipulated. + * @param conv VarType type of variable that is used for calculating the size. */ -static void SlList(void *list, SLRefType conv) +static void SlList(void *list, VarType conv) { /* Automatically calculate the length? */ if (_sl.need_length != NL_NONE) { - SlSetLength(SlCalcListLen(list)); + SlSetLength(SlCalcListLen(list, conv)); /* Determine length only? */ if (_sl.need_length == NL_CALCLENGTH) return; } - typedef std::list PtrList; - PtrList *l = (PtrList *)list; - - switch (_sl.action) { - case SLA_SAVE: { - SlWriteUint32((uint32)l->size()); - - PtrList::iterator iter; - for (iter = l->begin(); iter != l->end(); ++iter) { - void *ptr = *iter; - SlWriteUint32((uint32)ReferenceToInt(ptr, conv)); - } - break; - } - case SLA_LOAD_CHECK: - case SLA_LOAD: { - size_t length = IsSavegameVersionBefore(SLV_69) ? SlReadUint16() : SlReadUint32(); - - /* Load each reference and push to the end of the list */ - for (size_t i = 0; i < length; i++) { - size_t data = IsSavegameVersionBefore(SLV_69) ? SlReadUint16() : SlReadUint32(); - l->push_back((void *)data); - } - break; - } - case SLA_PTRS: { - PtrList temp = *l; - - l->clear(); - PtrList::iterator iter; - for (iter = temp.begin(); iter != temp.end(); ++iter) { - void *ptr = IntToReference((size_t)*iter, conv); - l->push_back(ptr); - } - break; - } - case SLA_NULL: - l->clear(); - break; - default: NOT_REACHED(); - } + SlStorageHelper::SlSaveLoad(list, conv, SL_REF); } /** @@ -1433,7 +1441,7 @@ size_t SlCalcObjMemberLength(const void *object, const SaveLoad &sld) case SL_REF: return SlCalcRefLen(); case SL_ARR: return SlCalcArrayLen(sld.length, sld.conv); case SL_STR: return SlCalcStringLen(GetVariableAddress(object, sld), sld.length, sld.conv); - case SL_LST: return SlCalcListLen(GetVariableAddress(object, sld)); + case SL_LST: return SlCalcListLen(GetVariableAddress(object, sld), sld.conv); case SL_DEQUE: return SlCalcDequeLen(GetVariableAddress(object, sld), sld.conv); case SL_STDSTR: return SlCalcStdStringLen(GetVariableAddress(object, sld)); default: NOT_REACHED(); @@ -1515,27 +1523,10 @@ static bool SlObjectMember(void *object, const SaveLoad &sld) switch (sld.cmd) { case SL_VAR: SlSaveLoadConv(ptr, conv); break; - case SL_REF: // Reference variable, translate - switch (_sl.action) { - case SLA_SAVE: - SlWriteUint32((uint32)ReferenceToInt(*(void **)ptr, (SLRefType)conv)); - break; - case SLA_LOAD_CHECK: - case SLA_LOAD: - *(size_t *)ptr = IsSavegameVersionBefore(SLV_69) ? SlReadUint16() : SlReadUint32(); - break; - case SLA_PTRS: - *(void **)ptr = IntToReference(*(size_t *)ptr, (SLRefType)conv); - break; - case SLA_NULL: - *(void **)ptr = nullptr; - break; - default: NOT_REACHED(); - } - break; + case SL_REF: SlSaveLoadRef(ptr, conv); break; case SL_ARR: SlArray(ptr, sld.length, conv); break; case SL_STR: SlString(ptr, sld.length, sld.conv); break; - case SL_LST: SlList(ptr, (SLRefType)conv); break; + case SL_LST: SlList(ptr, conv); break; case SL_DEQUE: SlDeque(ptr, conv); break; case SL_STDSTR: SlStdString(ptr, sld.conv); break; default: NOT_REACHED(); From 8f323855b11faa039ce547cff9826be8e5437555 Mon Sep 17 00:00:00 2001 From: Patric Stout Date: Sun, 6 Jun 2021 11:21:39 +0200 Subject: [PATCH 13/27] Codechange: rename SL_LST to SL_REFLIST to highlight the "reference" part You can easily mistake SlList / SL_LST to be a list of SL_VAR, but it is a list of SL_REF. With this rename, it hopefully saves a few people from "wtf?" moments. --- src/saveload/linkgraph_sl.cpp | 4 ++-- src/saveload/saveload.cpp | 14 +++++++------- src/saveload/saveload.h | 32 ++++++++++++++++---------------- src/saveload/station_sl.cpp | 8 ++++---- src/saveload/town_sl.cpp | 2 +- src/saveload/vehicle_sl.cpp | 2 +- 6 files changed, 31 insertions(+), 31 deletions(-) diff --git a/src/saveload/linkgraph_sl.cpp b/src/saveload/linkgraph_sl.cpp index 470d00be48..0640dba19c 100644 --- a/src/saveload/linkgraph_sl.cpp +++ b/src/saveload/linkgraph_sl.cpp @@ -87,8 +87,8 @@ SaveLoadTable GetLinkGraphJobDesc() SaveLoadTable GetLinkGraphScheduleDesc() { static const SaveLoad schedule_desc[] = { - SLE_LST(LinkGraphSchedule, schedule, REF_LINK_GRAPH), - SLE_LST(LinkGraphSchedule, running, REF_LINK_GRAPH_JOB), + SLE_REFLIST(LinkGraphSchedule, schedule, REF_LINK_GRAPH), + SLE_REFLIST(LinkGraphSchedule, running, REF_LINK_GRAPH_JOB), }; return schedule_desc; } diff --git a/src/saveload/saveload.cpp b/src/saveload/saveload.cpp index 733ff509da..8059348584 100644 --- a/src/saveload/saveload.cpp +++ b/src/saveload/saveload.cpp @@ -1334,7 +1334,7 @@ public: * @param list The std::list to find the size of. * @param conv VarType type of variable that is used for calculating the size. */ -static inline size_t SlCalcListLen(const void *list, VarType conv) +static inline size_t SlCalcRefListLen(const void *list, VarType conv) { return SlStorageHelper::SlCalcLen(list, conv, SL_REF); } @@ -1344,11 +1344,11 @@ static inline size_t SlCalcListLen(const void *list, VarType conv) * @param list The list being manipulated. * @param conv VarType type of variable that is used for calculating the size. */ -static void SlList(void *list, VarType conv) +static void SlRefList(void *list, VarType conv) { /* Automatically calculate the length? */ if (_sl.need_length != NL_NONE) { - SlSetLength(SlCalcListLen(list, conv)); + SlSetLength(SlCalcRefListLen(list, conv)); /* Determine length only? */ if (_sl.need_length == NL_CALCLENGTH) return; } @@ -1430,7 +1430,7 @@ size_t SlCalcObjMemberLength(const void *object, const SaveLoad &sld) case SL_REF: case SL_ARR: case SL_STR: - case SL_LST: + case SL_REFLIST: case SL_DEQUE: case SL_STDSTR: /* CONDITIONAL saveload types depend on the savegame version */ @@ -1441,7 +1441,7 @@ size_t SlCalcObjMemberLength(const void *object, const SaveLoad &sld) case SL_REF: return SlCalcRefLen(); case SL_ARR: return SlCalcArrayLen(sld.length, sld.conv); case SL_STR: return SlCalcStringLen(GetVariableAddress(object, sld), sld.length, sld.conv); - case SL_LST: return SlCalcListLen(GetVariableAddress(object, sld), sld.conv); + case SL_REFLIST: return SlCalcRefListLen(GetVariableAddress(object, sld), sld.conv); case SL_DEQUE: return SlCalcDequeLen(GetVariableAddress(object, sld), sld.conv); case SL_STDSTR: return SlCalcStdStringLen(GetVariableAddress(object, sld)); default: NOT_REACHED(); @@ -1515,7 +1515,7 @@ static bool SlObjectMember(void *object, const SaveLoad &sld) case SL_REF: case SL_ARR: case SL_STR: - case SL_LST: + case SL_REFLIST: case SL_DEQUE: case SL_STDSTR: /* CONDITIONAL saveload types depend on the savegame version */ @@ -1526,7 +1526,7 @@ static bool SlObjectMember(void *object, const SaveLoad &sld) case SL_REF: SlSaveLoadRef(ptr, conv); break; case SL_ARR: SlArray(ptr, sld.length, conv); break; case SL_STR: SlString(ptr, sld.length, sld.conv); break; - case SL_LST: SlList(ptr, conv); break; + case SL_REFLIST: SlRefList(ptr, conv); break; case SL_DEQUE: SlDeque(ptr, conv); break; case SL_STDSTR: SlStdString(ptr, sld.conv); break; default: NOT_REACHED(); diff --git a/src/saveload/saveload.h b/src/saveload/saveload.h index e320c7d8b9..3a2427c933 100644 --- a/src/saveload/saveload.h +++ b/src/saveload/saveload.h @@ -495,10 +495,10 @@ typedef uint32 VarType; enum SaveLoadType : byte { SL_VAR = 0, ///< Save/load a variable. SL_REF = 1, ///< Save/load a reference. - SL_ARR = 2, ///< Save/load an array. + SL_ARR = 2, ///< Save/load a fixed-size array of #SL_VAR elements. SL_STR = 3, ///< Save/load a string. - SL_LST = 4, ///< Save/load a list. - SL_DEQUE = 5, ///< Save/load a deque. + SL_REFLIST = 4, ///< Save/load a list of #SL_REF elements. + SL_DEQUE = 5, ///< Save/load a deque of #SL_VAR elements. SL_STDSTR = 6, ///< Save/load a \c std::string. /* non-normal save-load types */ SL_WRITEBYTE = 8, @@ -557,7 +557,7 @@ using SaveLoadTable = span; #define SLE_CONDREF(base, variable, type, from, to) SLE_GENERAL(SL_REF, base, variable, type, 0, from, to, 0) /** - * Storage of an array in some savegame versions. + * Storage of a fixed-size array of #SL_VAR elements in some savegame versions. * @param base Name of the class or struct containing the array. * @param variable Name of the variable in the class or struct referenced by \a base. * @param type Storage of the data in memory and in the savegame. @@ -589,17 +589,17 @@ using SaveLoadTable = span; #define SLE_CONDSSTR(base, variable, type, from, to) SLE_GENERAL(SL_STDSTR, base, variable, type, 0, from, to, 0) /** - * Storage of a list in some savegame versions. + * Storage of a list of #SL_REF elements in some savegame versions. * @param base Name of the class or struct containing the list. * @param variable Name of the variable in the class or struct referenced by \a base. * @param type Storage of the data in memory and in the savegame. * @param from First savegame version that has the list. * @param to Last savegame version that has the list. */ -#define SLE_CONDLST(base, variable, type, from, to) SLE_GENERAL(SL_LST, base, variable, type, 0, from, to, 0) +#define SLE_CONDREFLIST(base, variable, type, from, to) SLE_GENERAL(SL_REFLIST, base, variable, type, 0, from, to, 0) /** - * Storage of a deque in some savegame versions. + * Storage of a deque of #SL_VAR elements in some savegame versions. * @param base Name of the class or struct containing the list. * @param variable Name of the variable in the class or struct referenced by \a base. * @param type Storage of the data in memory and in the savegame. @@ -625,7 +625,7 @@ using SaveLoadTable = span; #define SLE_REF(base, variable, type) SLE_CONDREF(base, variable, type, SL_MIN_VERSION, SL_MAX_VERSION) /** - * Storage of an array in every version of a savegame. + * Storage of fixed-size array of #SL_VAR elements in every version of a savegame. * @param base Name of the class or struct containing the array. * @param variable Name of the variable in the class or struct referenced by \a base. * @param type Storage of the data in memory and in the savegame. @@ -651,12 +651,12 @@ using SaveLoadTable = span; #define SLE_SSTR(base, variable, type) SLE_CONDSSTR(base, variable, type, SL_MIN_VERSION, SL_MAX_VERSION) /** - * Storage of a list in every savegame version. + * Storage of a list of #SL_REF elements in every savegame version. * @param base Name of the class or struct containing the list. * @param variable Name of the variable in the class or struct referenced by \a base. * @param type Storage of the data in memory and in the savegame. */ -#define SLE_LST(base, variable, type) SLE_CONDLST(base, variable, type, SL_MIN_VERSION, SL_MAX_VERSION) +#define SLE_REFLIST(base, variable, type) SLE_CONDREFLIST(base, variable, type, SL_MIN_VERSION, SL_MAX_VERSION) /** * Empty space in every savegame version. @@ -709,7 +709,7 @@ using SaveLoadTable = span; #define SLEG_CONDREF(variable, type, from, to) SLEG_GENERAL(SL_REF, variable, type, 0, from, to, 0) /** - * Storage of a global array in some savegame versions. + * Storage of a global fixed-size array of #SL_VAR elements in some savegame versions. * @param variable Name of the global variable. * @param type Storage of the data in memory and in the savegame. * @param length Number of elements in the array. @@ -738,13 +738,13 @@ using SaveLoadTable = span; #define SLEG_CONDSSTR(variable, type, from, to) SLEG_GENERAL(SL_STDSTR, variable, type, 0, from, to, 0) /** - * Storage of a global list in some savegame versions. + * Storage of a global reference list in some savegame versions. * @param variable Name of the global variable. * @param type Storage of the data in memory and in the savegame. * @param from First savegame version that has the list. * @param to Last savegame version that has the list. */ -#define SLEG_CONDLST(variable, type, from, to) SLEG_GENERAL(SL_LST, variable, type, 0, from, to, 0) +#define SLEG_CONDREFLIST(variable, type, from, to) SLEG_GENERAL(SL_REFLIST, variable, type, 0, from, to, 0) /** * Storage of a global variable in every savegame version. @@ -761,7 +761,7 @@ using SaveLoadTable = span; #define SLEG_REF(variable, type) SLEG_CONDREF(variable, type, SL_MIN_VERSION, SL_MAX_VERSION) /** - * Storage of a global array in every savegame version. + * Storage of a global fixed-size array of #SL_VAR elements in every savegame version. * @param variable Name of the global variable. * @param type Storage of the data in memory and in the savegame. */ @@ -782,11 +782,11 @@ using SaveLoadTable = span; #define SLEG_SSTR(variable, type) SLEG_CONDSSTR(variable, type, SL_MIN_VERSION, SL_MAX_VERSION) /** - * Storage of a global list in every savegame version. + * Storage of a global reference list in every savegame version. * @param variable Name of the global variable. * @param type Storage of the data in memory and in the savegame. */ -#define SLEG_LST(variable, type) SLEG_CONDLST(variable, type, SL_MIN_VERSION, SL_MAX_VERSION) +#define SLEG_REFLIST(variable, type) SLEG_CONDREFLIST(variable, type, SL_MIN_VERSION, SL_MAX_VERSION) /** * Empty global space in some savegame versions. diff --git a/src/saveload/station_sl.cpp b/src/saveload/station_sl.cpp index 75b6043e7a..92fa2bafdf 100644 --- a/src/saveload/station_sl.cpp +++ b/src/saveload/station_sl.cpp @@ -207,7 +207,7 @@ static const SaveLoad _old_station_desc[] = { SLE_CONDVAR(Station, waiting_triggers, SLE_UINT8, SLV_27, SL_MAX_VERSION), SLE_CONDVAR(Station, num_specs, SLE_UINT8, SLV_27, SL_MAX_VERSION), - SLE_CONDLST(Station, loading_vehicles, REF_VEHICLE, SLV_57, SL_MAX_VERSION), + SLE_CONDREFLIST(Station, loading_vehicles, REF_VEHICLE, SLV_57, SL_MAX_VERSION), /* reserve extra space in savegame here. (currently 32 bytes) */ SLE_CONDNULL(32, SLV_2, SL_MAX_VERSION), @@ -265,7 +265,7 @@ SaveLoadTable GetGoodsDesc() SLEG_CONDVAR( _cargo_feeder_share, SLE_FILE_U32 | SLE_VAR_I64, SLV_14, SLV_65), SLEG_CONDVAR( _cargo_feeder_share, SLE_INT64, SLV_65, SLV_68), SLE_CONDVAR(GoodsEntry, amount_fract, SLE_UINT8, SLV_150, SL_MAX_VERSION), - SLEG_CONDLST( _packets, REF_CARGO_PACKET, SLV_68, SLV_183), + SLEG_CONDREFLIST( _packets, REF_CARGO_PACKET, SLV_68, SLV_183), SLEG_CONDVAR( _num_dests, SLE_UINT32, SLV_183, SL_MAX_VERSION), SLE_CONDVAR(GoodsEntry, cargo.reserved_count, SLE_UINT, SLV_181, SL_MAX_VERSION), SLE_CONDVAR(GoodsEntry, link_graph, SLE_UINT16, SLV_183, SL_MAX_VERSION), @@ -281,7 +281,7 @@ typedef std::pair > StationCargoPair; static const SaveLoad _cargo_list_desc[] = { SLE_VAR(StationCargoPair, first, SLE_UINT16), - SLE_LST(StationCargoPair, second, REF_CARGO_PACKET), + SLE_REFLIST(StationCargoPair, second, REF_CARGO_PACKET), }; /** @@ -426,7 +426,7 @@ static const SaveLoad _station_desc[] = { SLE_VAR(Station, time_since_unload, SLE_UINT8), SLE_VAR(Station, last_vehicle_type, SLE_UINT8), SLE_VAR(Station, had_vehicle_of_type, SLE_UINT8), - SLE_LST(Station, loading_vehicles, REF_VEHICLE), + SLE_REFLIST(Station, loading_vehicles, REF_VEHICLE), SLE_CONDVAR(Station, always_accepted, SLE_FILE_U32 | SLE_VAR_U64, SLV_127, SLV_EXTEND_CARGOTYPES), SLE_CONDVAR(Station, always_accepted, SLE_UINT64, SLV_EXTEND_CARGOTYPES, SL_MAX_VERSION), }; diff --git a/src/saveload/town_sl.cpp b/src/saveload/town_sl.cpp index 908ff2dd71..581d26cd77 100644 --- a/src/saveload/town_sl.cpp +++ b/src/saveload/town_sl.cpp @@ -189,7 +189,7 @@ static const SaveLoad _town_desc[] = { SLE_CONDVAR(Town, larger_town, SLE_BOOL, SLV_56, SL_MAX_VERSION), SLE_CONDVAR(Town, layout, SLE_UINT8, SLV_113, SL_MAX_VERSION), - SLE_CONDLST(Town, psa_list, REF_STORAGE, SLV_161, SL_MAX_VERSION), + SLE_CONDREFLIST(Town, psa_list, REF_STORAGE, SLV_161, SL_MAX_VERSION), SLE_CONDNULL(4, SLV_166, SLV_EXTEND_CARGOTYPES), ///< cargo_produced, no longer in use SLE_CONDNULL(8, SLV_EXTEND_CARGOTYPES, SLV_REMOVE_TOWN_CARGO_CACHE), ///< cargo_produced, no longer in use diff --git a/src/saveload/vehicle_sl.cpp b/src/saveload/vehicle_sl.cpp index 7e9005779d..2609730506 100644 --- a/src/saveload/vehicle_sl.cpp +++ b/src/saveload/vehicle_sl.cpp @@ -629,7 +629,7 @@ SaveLoadTable GetVehicleDescription(VehicleType vt) SLE_VAR(Vehicle, cargo_cap, SLE_UINT16), SLE_CONDVAR(Vehicle, refit_cap, SLE_UINT16, SLV_182, SL_MAX_VERSION), SLEG_CONDVAR( _cargo_count, SLE_UINT16, SL_MIN_VERSION, SLV_68), - SLE_CONDLST(Vehicle, cargo.packets, REF_CARGO_PACKET, SLV_68, SL_MAX_VERSION), + SLE_CONDREFLIST(Vehicle, cargo.packets, REF_CARGO_PACKET, SLV_68, SL_MAX_VERSION), SLE_CONDARR(Vehicle, cargo.action_counts, SLE_UINT, VehicleCargoList::NUM_MOVE_TO_ACTION, SLV_181, SL_MAX_VERSION), SLE_CONDVAR(Vehicle, cargo_age_counter, SLE_UINT16, SLV_162, SL_MAX_VERSION), From 174952440a1e0440ed61ca8cdbc9fa36cf66d757 Mon Sep 17 00:00:00 2001 From: Patric Stout Date: Sun, 6 Jun 2021 14:01:42 +0200 Subject: [PATCH 14/27] Codechange: rework CHTS-chunk save/load to be more like the others --- src/cheat_type.h | 3 --- src/saveload/cheat_sl.cpp | 57 +++++++++++++++++++++++++++------------ 2 files changed, 40 insertions(+), 20 deletions(-) diff --git a/src/cheat_type.h b/src/cheat_type.h index 3d70d527f9..8ca032c860 100644 --- a/src/cheat_type.h +++ b/src/cheat_type.h @@ -28,12 +28,9 @@ struct Cheats { Cheat switch_company; ///< change to another company Cheat money; ///< get rich or poor Cheat crossing_tunnels; ///< allow tunnels that cross each other - Cheat dummy1; ///< empty cheat (build while in pause mode) Cheat no_jetcrash; ///< no jet will crash on small airports anymore - Cheat dummy2; ///< empty cheat (change the climate of the map) Cheat change_date; ///< changes date ingame Cheat setup_prod; ///< setup raw-material production in game - Cheat dummy3; ///< empty cheat (enable running el-engines on normal rail) Cheat edit_max_hl; ///< edit the maximum heightlevel; this is a cheat because of the fact that it needs to reset NewGRF game state and doing so as a simple configuration breaks the expectation of many }; diff --git a/src/saveload/cheat_sl.cpp b/src/saveload/cheat_sl.cpp index 970e5f3be1..fde1fc1761 100644 --- a/src/saveload/cheat_sl.cpp +++ b/src/saveload/cheat_sl.cpp @@ -14,21 +14,38 @@ #include "../safeguards.h" +static const SaveLoad _cheats_desc[] = { + SLE_VAR(Cheats, magic_bulldozer.been_used, SLE_BOOL), + SLE_VAR(Cheats, magic_bulldozer.value, SLE_BOOL), + SLE_VAR(Cheats, switch_company.been_used, SLE_BOOL), + SLE_VAR(Cheats, switch_company.value, SLE_BOOL), + SLE_VAR(Cheats, money.been_used, SLE_BOOL), + SLE_VAR(Cheats, money.value, SLE_BOOL), + SLE_VAR(Cheats, crossing_tunnels.been_used, SLE_BOOL), + SLE_VAR(Cheats, crossing_tunnels.value, SLE_BOOL), + SLE_NULL(1), + SLE_NULL(1), // Needs to be two NULL fields. See Load_CHTS(). + SLE_VAR(Cheats, no_jetcrash.been_used, SLE_BOOL), + SLE_VAR(Cheats, no_jetcrash.value, SLE_BOOL), + SLE_NULL(1), + SLE_NULL(1), // Needs to be two NULL fields. See Load_CHTS(). + SLE_VAR(Cheats, change_date.been_used, SLE_BOOL), + SLE_VAR(Cheats, change_date.value, SLE_BOOL), + SLE_VAR(Cheats, setup_prod.been_used, SLE_BOOL), + SLE_VAR(Cheats, setup_prod.value, SLE_BOOL), + SLE_NULL(1), + SLE_NULL(1), // Needs to be two NULL fields. See Load_CHTS(). + SLE_VAR(Cheats, edit_max_hl.been_used, SLE_BOOL), + SLE_VAR(Cheats, edit_max_hl.value, SLE_BOOL), +}; + /** * Save the cheat values. */ static void Save_CHTS() { - /* Cannot use lengthof because _cheats is of type Cheats, not Cheat */ - byte count = sizeof(_cheats) / sizeof(Cheat); - Cheat *cht = (Cheat*) &_cheats; - Cheat *cht_last = &cht[count]; - - SlSetLength(count * 2); - for (; cht != cht_last; cht++) { - SlWriteByte(cht->been_used); - SlWriteByte(cht->value); - } + SlSetLength(std::size(_cheats_desc)); + SlObject(&_cheats, _cheats_desc); } /** @@ -36,15 +53,21 @@ static void Save_CHTS() */ static void Load_CHTS() { - Cheat *cht = (Cheat*)&_cheats; - size_t count = SlGetFieldLength() / 2; - /* Cannot use lengthof because _cheats is of type Cheats, not Cheat */ - if (count > sizeof(_cheats) / sizeof(Cheat)) SlErrorCorrupt("Too many cheat values"); + size_t count = SlGetFieldLength(); + std::vector slt; - for (uint i = 0; i < count; i++) { - cht[i].been_used = (SlReadByte() != 0); - cht[i].value = (SlReadByte() != 0); + /* Cheats were added over the years without a savegame bump. They are + * stored as 2 SLE_BOOLs per entry. "count" indicates how many SLE_BOOLs + * are stored for this savegame. So read only "count" SLE_BOOLs (and in + * result "count / 2" cheats). */ + for (auto &sld : _cheats_desc) { + count--; + slt.push_back(sld); + + if (count == 0) break; } + + SlObject(&_cheats, slt); } /** Chunk handlers related to cheats. */ From 37ae6b8ae3762ddccdeb96a178b2634791e2bbe0 Mon Sep 17 00:00:00 2001 From: Patric Stout Date: Thu, 10 Jun 2021 19:34:53 +0200 Subject: [PATCH 15/27] Add: adhere the autosave_on_exit setting for Null videodriver (#9343) This is especially useful for automated-testing, to make a save when the game quits while using "-vnull:ticks=N". --- src/video/null_v.cpp | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/video/null_v.cpp b/src/video/null_v.cpp index 4f7843b75a..e4f4ecf472 100644 --- a/src/video/null_v.cpp +++ b/src/video/null_v.cpp @@ -10,6 +10,7 @@ #include "../stdafx.h" #include "../gfx_func.h" #include "../blitter/factory.hpp" +#include "../saveload/saveload.h" #include "../window_func.h" #include "null_v.h" @@ -52,6 +53,12 @@ void VideoDriver_Null::MainLoop() ::InputLoop(); ::UpdateWindows(); } + + /* If requested, make a save just before exit. The normal exit-flow is + * not triggered from this driver, so we have to do this manually. */ + if (_settings_client.gui.autosave_on_exit) { + DoExitSave(); + } } bool VideoDriver_Null::ChangeResolution(int w, int h) { return false; } From 6bb3f034e4788b67c7c3b4c8cf4a5de44c8644d0 Mon Sep 17 00:00:00 2001 From: rubidium42 Date: Sun, 30 May 2021 12:32:59 +0200 Subject: [PATCH 16/27] Cleanup: [ContentInfo] Remove unused function --- src/network/core/tcp_content.cpp | 16 ---------------- src/network/core/tcp_content_type.h | 1 - 2 files changed, 17 deletions(-) diff --git a/src/network/core/tcp_content.cpp b/src/network/core/tcp_content.cpp index a53a352c28..abeb3d9255 100644 --- a/src/network/core/tcp_content.cpp +++ b/src/network/core/tcp_content.cpp @@ -48,22 +48,6 @@ void ContentInfo::TransferFrom(ContentInfo *other) } } -/** - * Get the size of the data as send over the network. - * @return the size. - */ -size_t ContentInfo::Size() const -{ - size_t len = 0; - for (uint i = 0; i < this->tag_count; i++) len += strlen(this->tags[i]) + 1; - - /* The size is never larger than the content info size plus the size of the - * tags and dependencies */ - return sizeof(*this) + - sizeof(this->dependency_count) + - sizeof(*this->dependencies) * this->dependency_count; -} - /** * Is the state either selected or autoselected? * @return true iff that's the case diff --git a/src/network/core/tcp_content_type.h b/src/network/core/tcp_content_type.h index 4dc20f46bb..739cf1379f 100644 --- a/src/network/core/tcp_content_type.h +++ b/src/network/core/tcp_content_type.h @@ -79,7 +79,6 @@ struct ContentInfo { void TransferFrom(ContentInfo *other); - size_t Size() const; bool IsSelected() const; bool IsValid() const; const char *GetTextfile(TextfileType type) const; From dfb89f3891ec73b4d5a6f46092ad825dabec6bb7 Mon Sep 17 00:00:00 2001 From: rubidium42 Date: Sun, 30 May 2021 12:41:45 +0200 Subject: [PATCH 17/27] Codechange: [ContentInfo] Do not use memset/memcpy to make it possible to use vector/string --- src/network/core/tcp_content.cpp | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/network/core/tcp_content.cpp b/src/network/core/tcp_content.cpp index abeb3d9255..ddea9fd5ea 100644 --- a/src/network/core/tcp_content.cpp +++ b/src/network/core/tcp_content.cpp @@ -22,8 +22,11 @@ /** Clear everything in the struct */ ContentInfo::ContentInfo() + : /* Temporary... will be removed later in the PR. */ + type((ContentType)0), id((ContentID)0), filesize(0), filename(""), name(""), version(""), + url(""), description(""), unique_id(0), md5sum(""), dependency_count(0), dependencies(nullptr), + tag_count(0), tags(nullptr), state((State)0), upgrade(false) { - memset(this, 0, sizeof(*this)); } /** Free everything allocated */ @@ -42,7 +45,7 @@ void ContentInfo::TransferFrom(ContentInfo *other) if (other != this) { free(this->dependencies); free(this->tags); - memcpy(this, other, sizeof(ContentInfo)); + *this = *other; other->dependencies = nullptr; other->tags = nullptr; } From 9c424ab741218238205e8d1f2644a3912fda250a Mon Sep 17 00:00:00 2001 From: rubidium42 Date: Sun, 30 May 2021 12:47:50 +0200 Subject: [PATCH 18/27] Codechange: [ContentInfo] Use StringList for tags instead of custom allocations --- src/network/core/config.h | 1 + src/network/core/tcp_content.cpp | 6 ++---- src/network/core/tcp_content_type.h | 3 +-- src/network/network_content.cpp | 6 +++--- src/network/network_content_gui.cpp | 11 +++++------ 5 files changed, 12 insertions(+), 15 deletions(-) diff --git a/src/network/core/config.h b/src/network/core/config.h index cacc907faf..ce614188dd 100644 --- a/src/network/core/config.h +++ b/src/network/core/config.h @@ -65,6 +65,7 @@ static const uint NETWORK_CLIENT_NAME_LENGTH = 25; ///< The maxim static const uint NETWORK_RCONCOMMAND_LENGTH = 500; ///< The maximum length of a rconsole command, in bytes including '\0' static const uint NETWORK_GAMESCRIPT_JSON_LENGTH = COMPAT_MTU-3; ///< The maximum length of a gamescript json string, in bytes including '\0'. Must not be longer than COMPAT_MTU including header (3 bytes) static const uint NETWORK_CHAT_LENGTH = 900; ///< The maximum length of a chat message, in bytes including '\0' +static const uint NETWORK_CONTENT_TAG_LENGTH = 32; ///< The maximum length of a content's tag, in bytes including '\0'. static const uint NETWORK_GRF_NAME_LENGTH = 80; ///< Maximum length of the name of a GRF diff --git a/src/network/core/tcp_content.cpp b/src/network/core/tcp_content.cpp index ddea9fd5ea..041e932e4e 100644 --- a/src/network/core/tcp_content.cpp +++ b/src/network/core/tcp_content.cpp @@ -25,7 +25,7 @@ ContentInfo::ContentInfo() : /* Temporary... will be removed later in the PR. */ type((ContentType)0), id((ContentID)0), filesize(0), filename(""), name(""), version(""), url(""), description(""), unique_id(0), md5sum(""), dependency_count(0), dependencies(nullptr), - tag_count(0), tags(nullptr), state((State)0), upgrade(false) + state((State)0), upgrade(false) { } @@ -33,7 +33,6 @@ ContentInfo::ContentInfo() ContentInfo::~ContentInfo() { free(this->dependencies); - free(this->tags); } /** @@ -44,10 +43,9 @@ void ContentInfo::TransferFrom(ContentInfo *other) { if (other != this) { free(this->dependencies); - free(this->tags); *this = *other; other->dependencies = nullptr; - other->tags = nullptr; + other->tags.clear(); } } diff --git a/src/network/core/tcp_content_type.h b/src/network/core/tcp_content_type.h index 739cf1379f..93367746db 100644 --- a/src/network/core/tcp_content_type.h +++ b/src/network/core/tcp_content_type.h @@ -69,8 +69,7 @@ struct ContentInfo { byte md5sum[16]; ///< The MD5 checksum uint8 dependency_count; ///< Number of dependencies ContentID *dependencies; ///< Malloced array of dependencies (unique server side ids) - uint8 tag_count; ///< Number of tags - char (*tags)[32]; ///< Malloced array of tags (strings) + StringList tags; ///< Tags associated with the content State state; ///< Whether the content info is selected (for download) bool upgrade; ///< This item is an upgrade diff --git a/src/network/network_content.cpp b/src/network/network_content.cpp index f78a839b81..27ffee9706 100644 --- a/src/network/network_content.cpp +++ b/src/network/network_content.cpp @@ -70,9 +70,9 @@ bool ClientNetworkContentSocketHandler::Receive_SERVER_INFO(Packet *p) ci->dependencies = MallocT(ci->dependency_count); for (uint i = 0; i < ci->dependency_count; i++) ci->dependencies[i] = (ContentID)p->Recv_uint32(); - ci->tag_count = p->Recv_uint8(); - ci->tags = MallocT(ci->tag_count); - for (uint i = 0; i < ci->tag_count; i++) p->Recv_string(ci->tags[i], lengthof(*ci->tags)); + uint tag_count = p->Recv_uint8(); + ci->tags.reserve(tag_count); + for (uint i = 0; i < tag_count; i++) ci->tags.push_back(p->Recv_string(NETWORK_CONTENT_TAG_LENGTH)); if (!ci->IsValid()) { delete ci; diff --git a/src/network/network_content_gui.cpp b/src/network/network_content_gui.cpp index a74d902a3c..a617f4e499 100644 --- a/src/network/network_content_gui.cpp +++ b/src/network/network_content_gui.cpp @@ -443,9 +443,8 @@ class NetworkContentListWindow : public Window, ContentCallback { static bool CDECL TagNameFilter(const ContentInfo * const *a, ContentListFilterData &filter) { filter.string_filter.ResetState(); - for (int i = 0; i < (*a)->tag_count; i++) { - filter.string_filter.AddLine((*a)->tags[i]); - } + for (auto &tag : (*a)->tags) filter.string_filter.AddLine(tag.c_str()); + filter.string_filter.AddLine((*a)->name); return filter.string_filter.GetState(); } @@ -747,12 +746,12 @@ public: y = DrawStringMultiLine(r.left + DETAIL_LEFT, r.right - DETAIL_RIGHT, y, max_y, STR_CONTENT_DETAIL_DEPENDENCIES); } - if (this->selected->tag_count != 0) { + if (!this->selected->tags.empty()) { /* List all tags */ char buf[DRAW_STRING_BUFFER] = ""; char *p = buf; - for (uint i = 0; i < this->selected->tag_count; i++) { - p += seprintf(p, lastof(buf), i == 0 ? "%s" : ", %s", this->selected->tags[i]); + for (auto &tag : this->selected->tags) { + p += seprintf(p, lastof(buf), p == buf ? "%s" : ", %s", tag.c_str()); } SetDParamStr(0, buf); y = DrawStringMultiLine(r.left + DETAIL_LEFT, r.right - DETAIL_RIGHT, y, max_y, STR_CONTENT_DETAIL_TAGS); From df181bb641a75e9fae557c683b790cfba961ec5a Mon Sep 17 00:00:00 2001 From: rubidium42 Date: Sun, 30 May 2021 12:53:42 +0200 Subject: [PATCH 19/27] Codechange: [ContentInfo] Use a vector for dependencies instead of custom allocation --- src/network/core/tcp_content.cpp | 6 ++---- src/network/core/tcp_content_type.h | 3 +-- src/network/network_content.cpp | 22 +++++++++++----------- src/network/network_content_gui.cpp | 6 ++---- 4 files changed, 16 insertions(+), 21 deletions(-) diff --git a/src/network/core/tcp_content.cpp b/src/network/core/tcp_content.cpp index 041e932e4e..fb726e2e7c 100644 --- a/src/network/core/tcp_content.cpp +++ b/src/network/core/tcp_content.cpp @@ -24,7 +24,7 @@ ContentInfo::ContentInfo() : /* Temporary... will be removed later in the PR. */ type((ContentType)0), id((ContentID)0), filesize(0), filename(""), name(""), version(""), - url(""), description(""), unique_id(0), md5sum(""), dependency_count(0), dependencies(nullptr), + url(""), description(""), unique_id(0), md5sum(""), state((State)0), upgrade(false) { } @@ -32,7 +32,6 @@ ContentInfo::ContentInfo() /** Free everything allocated */ ContentInfo::~ContentInfo() { - free(this->dependencies); } /** @@ -42,9 +41,8 @@ ContentInfo::~ContentInfo() void ContentInfo::TransferFrom(ContentInfo *other) { if (other != this) { - free(this->dependencies); *this = *other; - other->dependencies = nullptr; + other->dependencies.clear(); other->tags.clear(); } } diff --git a/src/network/core/tcp_content_type.h b/src/network/core/tcp_content_type.h index 93367746db..2186997e8e 100644 --- a/src/network/core/tcp_content_type.h +++ b/src/network/core/tcp_content_type.h @@ -67,8 +67,7 @@ struct ContentInfo { char description[512]; ///< Description of the content uint32 unique_id; ///< Unique ID; either GRF ID or shortname byte md5sum[16]; ///< The MD5 checksum - uint8 dependency_count; ///< Number of dependencies - ContentID *dependencies; ///< Malloced array of dependencies (unique server side ids) + std::vector dependencies; ///< The dependencies (unique server side ids) StringList tags; ///< Tags associated with the content State state; ///< Whether the content info is selected (for download) bool upgrade; ///< This item is an upgrade diff --git a/src/network/network_content.cpp b/src/network/network_content.cpp index 27ffee9706..37df60877a 100644 --- a/src/network/network_content.cpp +++ b/src/network/network_content.cpp @@ -66,9 +66,9 @@ bool ClientNetworkContentSocketHandler::Receive_SERVER_INFO(Packet *p) ci->md5sum[j] = p->Recv_uint8(); } - ci->dependency_count = p->Recv_uint8(); - ci->dependencies = MallocT(ci->dependency_count); - for (uint i = 0; i < ci->dependency_count; i++) ci->dependencies[i] = (ContentID)p->Recv_uint32(); + uint dependency_count = p->Recv_uint8(); + ci->dependencies.reserve(dependency_count); + for (uint i = 0; i < dependency_count; i++) ci->dependencies.push_back((ContentID)p->Recv_uint32()); uint tag_count = p->Recv_uint8(); ci->tags.reserve(tag_count); @@ -927,8 +927,8 @@ void ClientNetworkContentSocketHandler::ReverseLookupDependency(ConstContentVect for (const ContentInfo *ci : this->infos) { if (ci == child) continue; - for (uint i = 0; i < ci->dependency_count; i++) { - if (ci->dependencies[i] == child->id) { + for (auto &dependency : ci->dependencies) { + if (dependency == child->id) { parents.push_back(ci); break; } @@ -969,10 +969,10 @@ void ClientNetworkContentSocketHandler::CheckDependencyState(ContentInfo *ci) /* Selection is easy; just walk all children and set the * autoselected state. That way we can see what we automatically * selected and thus can unselect when a dependency is removed. */ - for (uint i = 0; i < ci->dependency_count; i++) { - ContentInfo *c = this->GetContent(ci->dependencies[i]); + for (auto &dependency : ci->dependencies) { + ContentInfo *c = this->GetContent(dependency); if (c == nullptr) { - this->DownloadContentInfo(ci->dependencies[i]); + this->DownloadContentInfo(dependency); } else if (c->state == ContentInfo::UNSELECTED) { c->state = ContentInfo::AUTOSELECTED; this->CheckDependencyState(c); @@ -995,10 +995,10 @@ void ClientNetworkContentSocketHandler::CheckDependencyState(ContentInfo *ci) this->Unselect(c->id); } - for (uint i = 0; i < ci->dependency_count; i++) { - const ContentInfo *c = this->GetContent(ci->dependencies[i]); + for (auto &dependency : ci->dependencies) { + const ContentInfo *c = this->GetContent(dependency); if (c == nullptr) { - DownloadContentInfo(ci->dependencies[i]); + DownloadContentInfo(dependency); continue; } if (c->state != ContentInfo::AUTOSELECTED) continue; diff --git a/src/network/network_content_gui.cpp b/src/network/network_content_gui.cpp index a617f4e499..5a03561c9c 100644 --- a/src/network/network_content_gui.cpp +++ b/src/network/network_content_gui.cpp @@ -725,13 +725,11 @@ public: SetDParam(0, this->selected->filesize); y = DrawStringMultiLine(r.left + DETAIL_LEFT, r.right - DETAIL_RIGHT, y, max_y, STR_CONTENT_DETAIL_FILESIZE); - if (this->selected->dependency_count != 0) { + if (!this->selected->dependencies.empty()) { /* List dependencies */ char buf[DRAW_STRING_BUFFER] = ""; char *p = buf; - for (uint i = 0; i < this->selected->dependency_count; i++) { - ContentID cid = this->selected->dependencies[i]; - + for (auto &cid : this->selected->dependencies) { /* Try to find the dependency */ ConstContentIterator iter = _network_content_client.Begin(); for (; iter != _network_content_client.End(); iter++) { From e3717ae903cb770ae2ebc4abe45fa0cc77326409 Mon Sep 17 00:00:00 2001 From: rubidium42 Date: Sun, 30 May 2021 13:02:44 +0200 Subject: [PATCH 20/27] Codechange: [ContentInfo] Use std::string instead of string buffers --- src/console_cmds.cpp | 4 ++-- src/network/core/config.h | 5 +++++ src/network/core/tcp_content_type.h | 10 +++++----- src/network/network_content.cpp | 14 +++++++------- src/network/network_content_gui.cpp | 20 ++++++++++---------- src/newgrf_gui.cpp | 2 +- 6 files changed, 30 insertions(+), 25 deletions(-) diff --git a/src/console_cmds.cpp b/src/console_cmds.cpp index 3c5ca5d24b..7a756a657a 100644 --- a/src/console_cmds.cpp +++ b/src/console_cmds.cpp @@ -1812,7 +1812,7 @@ static void OutputContentState(const ContentInfo *const ci) char buf[sizeof(ci->md5sum) * 2 + 1]; md5sumToString(buf, lastof(buf), ci->md5sum); - IConsolePrintF(state_to_colour[ci->state], "%d, %s, %s, %s, %08X, %s", ci->id, types[ci->type - 1], states[ci->state], ci->name, ci->unique_id, buf); + IConsolePrintF(state_to_colour[ci->state], "%d, %s, %s, %s, %08X, %s", ci->id, types[ci->type - 1], states[ci->state], ci->name.c_str(), ci->unique_id, buf); } DEF_CONSOLE_CMD(ConContent) @@ -1882,7 +1882,7 @@ DEF_CONSOLE_CMD(ConContent) if (strcasecmp(argv[1], "state") == 0) { IConsolePrintF(CC_WHITE, "id, type, state, name"); for (ConstContentIterator iter = _network_content_client.Begin(); iter != _network_content_client.End(); iter++) { - if (argc > 2 && strcasestr((*iter)->name, argv[2]) == nullptr) continue; + if (argc > 2 && strcasestr((*iter)->name.c_str(), argv[2]) == nullptr) continue; OutputContentState(*iter); } return true; diff --git a/src/network/core/config.h b/src/network/core/config.h index ce614188dd..6d6038ec75 100644 --- a/src/network/core/config.h +++ b/src/network/core/config.h @@ -65,6 +65,11 @@ static const uint NETWORK_CLIENT_NAME_LENGTH = 25; ///< The maxim static const uint NETWORK_RCONCOMMAND_LENGTH = 500; ///< The maximum length of a rconsole command, in bytes including '\0' static const uint NETWORK_GAMESCRIPT_JSON_LENGTH = COMPAT_MTU-3; ///< The maximum length of a gamescript json string, in bytes including '\0'. Must not be longer than COMPAT_MTU including header (3 bytes) static const uint NETWORK_CHAT_LENGTH = 900; ///< The maximum length of a chat message, in bytes including '\0' +static const uint NETWORK_CONTENT_FILENAME_LENGTH = 48; ///< The maximum length of a content's filename, in bytes including '\0'. +static const uint NETWORK_CONTENT_NAME_LENGTH = 32; ///< The maximum length of a content's name, in bytes including '\0'. +static const uint NETWORK_CONTENT_VERSION_LENGTH = 16; ///< The maximum length of a content's version, in bytes including '\0'. +static const uint NETWORK_CONTENT_URL_LENGTH = 96; ///< The maximum length of a content's url, in bytes including '\0'. +static const uint NETWORK_CONTENT_DESC_LENGTH = 512; ///< The maximum length of a content's description, in bytes including '\0'. static const uint NETWORK_CONTENT_TAG_LENGTH = 32; ///< The maximum length of a content's tag, in bytes including '\0'. static const uint NETWORK_GRF_NAME_LENGTH = 80; ///< Maximum length of the name of a GRF diff --git a/src/network/core/tcp_content_type.h b/src/network/core/tcp_content_type.h index 2186997e8e..25097c3ab1 100644 --- a/src/network/core/tcp_content_type.h +++ b/src/network/core/tcp_content_type.h @@ -60,11 +60,11 @@ struct ContentInfo { ContentType type; ///< Type of content ContentID id; ///< Unique (server side) ID for the content uint32 filesize; ///< Size of the file - char filename[48]; ///< Filename (for the .tar.gz; only valid on download) - char name[32]; ///< Name of the content - char version[16]; ///< Version of the content - char url[96]; ///< URL related to the content - char description[512]; ///< Description of the content + std::string filename; ///< Filename (for the .tar.gz; only valid on download) + std::string name; ///< Name of the content + std::string version; ///< Version of the content + std::string url; ///< URL related to the content + std::string description; ///< Description of the content uint32 unique_id; ///< Unique ID; either GRF ID or shortname byte md5sum[16]; ///< The MD5 checksum std::vector dependencies; ///< The dependencies (unique server side ids) diff --git a/src/network/network_content.cpp b/src/network/network_content.cpp index 37df60877a..f85c942afd 100644 --- a/src/network/network_content.cpp +++ b/src/network/network_content.cpp @@ -56,10 +56,10 @@ bool ClientNetworkContentSocketHandler::Receive_SERVER_INFO(Packet *p) ci->id = (ContentID)p->Recv_uint32(); ci->filesize = p->Recv_uint32(); - p->Recv_string(ci->name, lengthof(ci->name)); - p->Recv_string(ci->version, lengthof(ci->version)); - p->Recv_string(ci->url, lengthof(ci->url)); - p->Recv_string(ci->description, lengthof(ci->description), SVS_REPLACE_WITH_QUESTION_MARK | SVS_ALLOW_NEWLINE); + ci->name = p->Recv_string(NETWORK_CONTENT_NAME_LENGTH); + ci->version = p->Recv_string(NETWORK_CONTENT_VERSION_LENGTH); + ci->url = p->Recv_string(NETWORK_CONTENT_URL_LENGTH); + ci->description = p->Recv_string(NETWORK_CONTENT_DESC_LENGTH, SVS_REPLACE_WITH_QUESTION_MARK | SVS_ALLOW_NEWLINE); ci->unique_id = p->Recv_uint32(); for (uint j = 0; j < sizeof(ci->md5sum); j++) { @@ -143,7 +143,7 @@ bool ClientNetworkContentSocketHandler::Receive_SERVER_INFO(Packet *p) if (ici->type == ci->type && ici->unique_id == ci->unique_id && memcmp(ci->md5sum, ici->md5sum, sizeof(ci->md5sum)) == 0) { /* Preserve the name if possible */ - if (StrEmpty(ci->name)) strecpy(ci->name, ici->name, lastof(ci->name)); + if (ci->name.empty()) ci->name = ici->name; if (ici->IsSelected()) ci->state = ici->state; /* @@ -485,7 +485,7 @@ bool ClientNetworkContentSocketHandler::Receive_SERVER_CONTENT(Packet *p) this->curInfo->type = (ContentType)p->Recv_uint8(); this->curInfo->id = (ContentID)p->Recv_uint32(); this->curInfo->filesize = p->Recv_uint32(); - p->Recv_string(this->curInfo->filename, lengthof(this->curInfo->filename)); + this->curInfo->filename = p->Recv_string(NETWORK_CONTENT_FILENAME_LENGTH); if (!this->BeforeDownload()) { this->CloseConnection(); @@ -704,7 +704,7 @@ void ClientNetworkContentSocketHandler::OnReceiveData(const char *data, size_t l } /* Copy the string, without extension, to the filename. */ - strecpy(this->curInfo->filename, tmp, lastof(this->curInfo->filename)); + this->curInfo->filename = tmp; /* Request the next file. */ if (!this->BeforeDownload()) { diff --git a/src/network/network_content_gui.cpp b/src/network/network_content_gui.cpp index 5a03561c9c..dfd4370b36 100644 --- a/src/network/network_content_gui.cpp +++ b/src/network/network_content_gui.cpp @@ -147,7 +147,7 @@ void BaseNetworkContentDownloadStatusWindow::DrawWidget(const Rect &r, int widge void BaseNetworkContentDownloadStatusWindow::OnDownloadProgress(const ContentInfo *ci, int bytes) { if (ci->id != this->cur_id) { - strecpy(this->name, ci->filename, lastof(this->name)); + strecpy(this->name, ci->filename.c_str(), lastof(this->name)); this->cur_id = ci->id; this->downloaded_files++; } @@ -408,7 +408,7 @@ class NetworkContentListWindow : public Window, ContentCallback { /** Sort content by name. */ static bool NameSorter(const ContentInfo * const &a, const ContentInfo * const &b) { - return strnatcmp(a->name, b->name, true) < 0; // Sort by name (natural sorting). + return strnatcmp(a->name.c_str(), b->name.c_str(), true) < 0; // Sort by name (natural sorting). } /** Sort content by type. */ @@ -445,7 +445,7 @@ class NetworkContentListWindow : public Window, ContentCallback { filter.string_filter.ResetState(); for (auto &tag : (*a)->tags) filter.string_filter.AddLine(tag.c_str()); - filter.string_filter.AddLine((*a)->name); + filter.string_filter.AddLine((*a)->name.c_str()); return filter.string_filter.GetState(); } @@ -703,17 +703,17 @@ public: SetDParamStr(0, this->selected->name); y = DrawStringMultiLine(r.left + DETAIL_LEFT, r.right - DETAIL_RIGHT, y, max_y, STR_CONTENT_DETAIL_NAME); - if (!StrEmpty(this->selected->version)) { + if (!this->selected->version.empty()) { SetDParamStr(0, this->selected->version); y = DrawStringMultiLine(r.left + DETAIL_LEFT, r.right - DETAIL_RIGHT, y, max_y, STR_CONTENT_DETAIL_VERSION); } - if (!StrEmpty(this->selected->description)) { + if (!this->selected->description.empty()) { SetDParamStr(0, this->selected->description); y = DrawStringMultiLine(r.left + DETAIL_LEFT, r.right - DETAIL_RIGHT, y, max_y, STR_CONTENT_DETAIL_DESCRIPTION); } - if (!StrEmpty(this->selected->url)) { + if (!this->selected->url.empty()) { SetDParamStr(0, this->selected->url); y = DrawStringMultiLine(r.left + DETAIL_LEFT, r.right - DETAIL_RIGHT, y, max_y, STR_CONTENT_DETAIL_URL); } @@ -736,7 +736,7 @@ public: const ContentInfo *ci = *iter; if (ci->id != cid) continue; - p += seprintf(p, lastof(buf), p == buf ? "%s" : ", %s", (*iter)->name); + p += seprintf(p, lastof(buf), p == buf ? "%s" : ", %s", (*iter)->name.c_str()); break; } } @@ -765,7 +765,7 @@ public: for (const ContentInfo *ci : tree) { if (ci == this->selected || ci->state != ContentInfo::SELECTED) continue; - p += seprintf(p, lastof(buf), buf == p ? "%s" : ", %s", ci->name); + p += seprintf(p, lastof(buf), buf == p ? "%s" : ", %s", ci->name.c_str()); } if (p != buf) { SetDParamStr(0, buf); @@ -842,7 +842,7 @@ public: case WID_NCL_OPEN_URL: if (this->selected != nullptr) { extern void OpenBrowser(const char *url); - OpenBrowser(this->selected->url); + OpenBrowser(this->selected->url.c_str()); } break; @@ -983,7 +983,7 @@ public: this->SetWidgetDisabledState(WID_NCL_UNSELECT, this->filesize_sum == 0); this->SetWidgetDisabledState(WID_NCL_SELECT_ALL, !show_select_all); this->SetWidgetDisabledState(WID_NCL_SELECT_UPDATE, !show_select_upgrade); - this->SetWidgetDisabledState(WID_NCL_OPEN_URL, this->selected == nullptr || StrEmpty(this->selected->url)); + this->SetWidgetDisabledState(WID_NCL_OPEN_URL, this->selected == nullptr || this->selected->url.empty()); for (TextfileType tft = TFT_BEGIN; tft < TFT_END; tft++) { this->SetWidgetDisabledState(WID_NCL_TEXTFILE + tft, this->selected == nullptr || this->selected->state != ContentInfo::ALREADY_HERE || this->selected->GetTextfile(tft) == nullptr); } diff --git a/src/newgrf_gui.cpp b/src/newgrf_gui.cpp index f017cbf7f9..1b7ab44f6c 100644 --- a/src/newgrf_gui.cpp +++ b/src/newgrf_gui.cpp @@ -1550,7 +1550,7 @@ void ShowMissingContentWindow(const GRFConfig *list) ContentInfo *ci = new ContentInfo(); ci->type = CONTENT_TYPE_NEWGRF; ci->state = ContentInfo::DOES_NOT_EXIST; - strecpy(ci->name, c->GetName(), lastof(ci->name)); + ci->name = c->GetName(); ci->unique_id = BSWAP32(c->ident.grfid); memcpy(ci->md5sum, HasBit(c->flags, GCF_COMPATIBLE) ? c->original_md5sum : c->ident.md5sum, sizeof(ci->md5sum)); cv.push_back(ci); From e2417193c9dbe8a7ecf00521bed7bf6c3fb573fc Mon Sep 17 00:00:00 2001 From: rubidium42 Date: Sun, 30 May 2021 13:12:00 +0200 Subject: [PATCH 21/27] Cleanup: [ContentInfo] Remove some functions that are not needed anymore --- src/network/core/tcp_content.cpp | 27 ----------------------- src/network/core/tcp_content_type.h | 34 +++++++++++++---------------- src/network/network_content.cpp | 3 +-- 3 files changed, 16 insertions(+), 48 deletions(-) diff --git a/src/network/core/tcp_content.cpp b/src/network/core/tcp_content.cpp index fb726e2e7c..84c82ead12 100644 --- a/src/network/core/tcp_content.cpp +++ b/src/network/core/tcp_content.cpp @@ -20,33 +20,6 @@ #include "../../safeguards.h" -/** Clear everything in the struct */ -ContentInfo::ContentInfo() - : /* Temporary... will be removed later in the PR. */ - type((ContentType)0), id((ContentID)0), filesize(0), filename(""), name(""), version(""), - url(""), description(""), unique_id(0), md5sum(""), - state((State)0), upgrade(false) -{ -} - -/** Free everything allocated */ -ContentInfo::~ContentInfo() -{ -} - -/** - * Copy data from other #ContentInfo and take ownership of allocated stuff. - * @param other Source to copy from. #dependencies and #tags will be NULLed. - */ -void ContentInfo::TransferFrom(ContentInfo *other) -{ - if (other != this) { - *this = *other; - other->dependencies.clear(); - other->tags.clear(); - } -} - /** * Is the state either selected or autoselected? * @return true iff that's the case diff --git a/src/network/core/tcp_content_type.h b/src/network/core/tcp_content_type.h index 25097c3ab1..5daae39dc6 100644 --- a/src/network/core/tcp_content_type.h +++ b/src/network/core/tcp_content_type.h @@ -26,6 +26,7 @@ enum ContentType { CONTENT_TYPE_GAME = 9, ///< The content consists of a game script CONTENT_TYPE_GAME_LIBRARY = 10, ///< The content consists of a GS library CONTENT_TYPE_END, ///< Helper to mark the end of the types + INVALID_CONTENT_TYPE = 0xFF, ///< Invalid/uninitialized content }; /** Enum with all types of TCP content packets. The order MUST not be changed **/ @@ -57,25 +58,20 @@ struct ContentInfo { INVALID, ///< The content's invalid }; - ContentType type; ///< Type of content - ContentID id; ///< Unique (server side) ID for the content - uint32 filesize; ///< Size of the file - std::string filename; ///< Filename (for the .tar.gz; only valid on download) - std::string name; ///< Name of the content - std::string version; ///< Version of the content - std::string url; ///< URL related to the content - std::string description; ///< Description of the content - uint32 unique_id; ///< Unique ID; either GRF ID or shortname - byte md5sum[16]; ///< The MD5 checksum - std::vector dependencies; ///< The dependencies (unique server side ids) - StringList tags; ///< Tags associated with the content - State state; ///< Whether the content info is selected (for download) - bool upgrade; ///< This item is an upgrade - - ContentInfo(); - ~ContentInfo(); - - void TransferFrom(ContentInfo *other); + ContentType type = INVALID_CONTENT_TYPE; ///< Type of content + ContentID id = INVALID_CONTENT_ID; ///< Unique (server side) ID for the content + uint32 filesize = 0; ///< Size of the file + std::string filename; ///< Filename (for the .tar.gz; only valid on download) + std::string name; ///< Name of the content + std::string version; ///< Version of the content + std::string url; ///< URL related to the content + std::string description; ///< Description of the content + uint32 unique_id = 0; ///< Unique ID; either GRF ID or shortname + byte md5sum[16] = {0}; ///< The MD5 checksum + std::vector dependencies; ///< The dependencies (unique server side ids) + StringList tags; ///< Tags associated with the content + State state = State::UNSELECTED; ///< Whether the content info is selected (for download) + bool upgrade = false; ///< This item is an upgrade bool IsSelected() const; bool IsValid() const; diff --git a/src/network/network_content.cpp b/src/network/network_content.cpp index f85c942afd..eff54885de 100644 --- a/src/network/network_content.cpp +++ b/src/network/network_content.cpp @@ -150,9 +150,8 @@ bool ClientNetworkContentSocketHandler::Receive_SERVER_INFO(Packet *p) * As ici might be selected by the content window we cannot delete that. * However, we want to keep most of the values of ci, except the values * we (just) already preserved. - * So transfer data and ownership of allocated memory from ci to ici. */ - ici->TransferFrom(ci); + *ici = *ci; delete ci; this->OnReceiveContentInfo(ici); From 849a10520cc26a98d91981a7705775a2481beef2 Mon Sep 17 00:00:00 2001 From: Patric Stout Date: Thu, 10 Jun 2021 20:11:50 +0200 Subject: [PATCH 22/27] Change: allow pause/unpause console command in single player too (#9342) --- src/console_cmds.cpp | 31 +++++++++++++++++++++++++++---- 1 file changed, 27 insertions(+), 4 deletions(-) diff --git a/src/console_cmds.cpp b/src/console_cmds.cpp index 7a756a657a..b5c1748ab8 100644 --- a/src/console_cmds.cpp +++ b/src/console_cmds.cpp @@ -160,11 +160,24 @@ DEF_CONSOLE_HOOK(ConHookNoNetwork) return CHR_ALLOW; } +/** + * Check if are either in singleplayer or a server. + * @return True iff we are either in singleplayer or a server. + */ +DEF_CONSOLE_HOOK(ConHookServerOrNoNetwork) +{ + if (_networking && !_network_server) { + if (echo) IConsoleError("This command is only available to a network server."); + return CHR_DISALLOW; + } + return CHR_ALLOW; +} + DEF_CONSOLE_HOOK(ConHookNewGRFDeveloperTool) { if (_settings_client.gui.newgrf_developer_tools) { if (_game_mode == GM_MENU) { - if (echo) IConsoleError("This command is only available in game and editor."); + if (echo) IConsoleError("This command is only available in-game and in the editor."); return CHR_DISALLOW; } return ConHookNoNetwork(echo); @@ -209,7 +222,7 @@ DEF_CONSOLE_CMD(ConResetEnginePool) } if (_game_mode == GM_MENU) { - IConsoleError("This command is only available in game and editor."); + IConsoleError("This command is only available in-game and in the editor."); return true; } @@ -622,6 +635,11 @@ DEF_CONSOLE_CMD(ConPauseGame) return true; } + if (_game_mode == GM_MENU) { + IConsoleError("This command is only available in-game and in the editor."); + return true; + } + if ((_pause_mode & PM_PAUSED_NORMAL) == PM_UNPAUSED) { DoCommandP(0, PM_PAUSED_NORMAL, 1, CMD_PAUSE); if (!_networking) IConsolePrint(CC_DEFAULT, "Game paused."); @@ -639,6 +657,11 @@ DEF_CONSOLE_CMD(ConUnpauseGame) return true; } + if (_game_mode == GM_MENU) { + IConsoleError("This command is only available in-game and in the editor."); + return true; + } + if ((_pause_mode & PM_PAUSED_NORMAL) != PM_UNPAUSED) { DoCommandP(0, PM_PAUSED_NORMAL, 0, CMD_PAUSE); if (!_networking) IConsolePrint(CC_DEFAULT, "Game unpaused."); @@ -2393,8 +2416,8 @@ void IConsoleStdLibRegister() IConsole::CmdRegister("unban", ConUnBan, ConHookServerOnly); IConsole::CmdRegister("banlist", ConBanList, ConHookServerOnly); - IConsole::CmdRegister("pause", ConPauseGame, ConHookServerOnly); - IConsole::CmdRegister("unpause", ConUnpauseGame, ConHookServerOnly); + IConsole::CmdRegister("pause", ConPauseGame, ConHookServerOrNoNetwork); + IConsole::CmdRegister("unpause", ConUnpauseGame, ConHookServerOrNoNetwork); IConsole::CmdRegister("company_pw", ConCompanyPassword, ConHookNeedNetwork); IConsole::AliasRegister("company_password", "company_pw %+"); From ab9b937ab7a80562b88d72ec17c6b2a6b3ed2b61 Mon Sep 17 00:00:00 2001 From: rubidium42 Date: Sun, 30 May 2021 13:34:58 +0200 Subject: [PATCH 23/27] Codechange: [Network] Use std::string to get a NewGRF's name --- src/network/network_udp.cpp | 5 ++--- src/newgrf_text.cpp | 4 ++-- src/newgrf_text.h | 2 +- 3 files changed, 5 insertions(+), 6 deletions(-) diff --git a/src/network/network_udp.cpp b/src/network/network_udp.cpp index 0da5a8b260..a0d9ae136c 100644 --- a/src/network/network_udp.cpp +++ b/src/network/network_udp.cpp @@ -415,15 +415,14 @@ void ClientNetworkUDPSocketHandler::Receive_SERVER_NEWGRFS(Packet *p, NetworkAdd if (num_grfs > NETWORK_MAX_GRF_COUNT) return; for (i = 0; i < num_grfs; i++) { - char name[NETWORK_GRF_NAME_LENGTH]; GRFIdentifier c; DeserializeGRFIdentifier(p, &c); - p->Recv_string(name, sizeof(name)); + std::string name = p->Recv_string(NETWORK_GRF_NAME_LENGTH); /* An empty name is not possible under normal circumstances * and causes problems when showing the NewGRF list. */ - if (StrEmpty(name)) continue; + if (name.empty()) continue; /* Try to find the GRFTextWrapper for the name of this GRF ID and MD5sum tuple. * If it exists and not resolved yet, then name of the fake GRF is diff --git a/src/newgrf_text.cpp b/src/newgrf_text.cpp index f1fac8b510..2bb8fd6365 100644 --- a/src/newgrf_text.cpp +++ b/src/newgrf_text.cpp @@ -539,10 +539,10 @@ void AddGRFTextToList(GRFTextWrapper &list, byte langid, uint32 grfid, bool allo * @param list The list where the text should be added to. * @param text_to_add The text to add to the list. */ -void AddGRFTextToList(GRFTextWrapper &list, const char *text_to_add) +void AddGRFTextToList(GRFTextWrapper &list, const std::string &text_to_add) { if (!list) list.reset(new GRFTextList()); - AddGRFTextToList(*list, GRFLX_UNSPECIFIED, std::string(text_to_add)); + AddGRFTextToList(*list, GRFLX_UNSPECIFIED, text_to_add); } /** diff --git a/src/newgrf_text.h b/src/newgrf_text.h index 2c7eb731db..dc33710a43 100644 --- a/src/newgrf_text.h +++ b/src/newgrf_text.h @@ -42,7 +42,7 @@ void SetCurrentGrfLangID(byte language_id); std::string TranslateTTDPatchCodes(uint32 grfid, uint8 language_id, bool allow_newlines, const std::string &str, StringControlCode byte80 = SCC_NEWGRF_PRINT_WORD_STRING_ID); void AddGRFTextToList(GRFTextList &list, byte langid, uint32 grfid, bool allow_newlines, const char *text_to_add); void AddGRFTextToList(GRFTextWrapper &list, byte langid, uint32 grfid, bool allow_newlines, const char *text_to_add); -void AddGRFTextToList(GRFTextWrapper &list, const char *text_to_add); +void AddGRFTextToList(GRFTextWrapper &list, const std::string &text_to_add); bool CheckGrfLangID(byte lang_id, byte grf_version); From bb8fd007605c17c4f96fdda75e3d2780b8944faf Mon Sep 17 00:00:00 2001 From: rubidium42 Date: Sun, 30 May 2021 13:36:07 +0200 Subject: [PATCH 24/27] Cleanup: [Network] Remove C-string Recv_string and its last use --- src/network/core/packet.cpp | 31 ------------------------------- src/network/core/packet.h | 1 - src/network/network_server.cpp | 6 ++---- 3 files changed, 2 insertions(+), 36 deletions(-) diff --git a/src/network/core/packet.cpp b/src/network/core/packet.cpp index c27a37d461..737b4624c9 100644 --- a/src/network/core/packet.cpp +++ b/src/network/core/packet.cpp @@ -366,37 +366,6 @@ uint64 Packet::Recv_uint64() return n; } -/** - * Reads a string till it finds a '\0' in the stream. - * @param buffer The buffer to put the data into. - * @param size The size of the buffer. - * @param settings The string validation settings. - */ -void Packet::Recv_string(char *buffer, size_t size, StringValidationSettings settings) -{ - char *bufp = buffer; - const char *last = buffer + size - 1; - - /* Don't allow reading from a closed socket */ - if (cs->HasClientQuit()) return; - - size_t pos = this->pos; - while (--size > 0 && pos < this->Size() && (*buffer++ = this->buffer[pos++]) != '\0') {} - - if (size == 0 || pos == this->Size()) { - *buffer = '\0'; - /* If size was sooner to zero then the string in the stream - * skip till the \0, so than packet can be read out correctly for the rest */ - while (pos < this->Size() && this->buffer[pos] != '\0') pos++; - pos++; - } - - assert(pos <= std::numeric_limits::max()); - this->pos = static_cast(pos); - - StrMakeValidInPlace(bufp, last, settings); -} - /** * Reads characters (bytes) from the packet until it finds a '\0', or reaches a * maximum of \c length characters. diff --git a/src/network/core/packet.h b/src/network/core/packet.h index 21a88e3ea9..277ff8bba1 100644 --- a/src/network/core/packet.h +++ b/src/network/core/packet.h @@ -87,7 +87,6 @@ public: uint16 Recv_uint16(); uint32 Recv_uint32(); uint64 Recv_uint64(); - void Recv_string(char *buffer, size_t size, StringValidationSettings settings = SVS_REPLACE_WITH_QUESTION_MARK); std::string Recv_string(size_t length, StringValidationSettings settings = SVS_REPLACE_WITH_QUESTION_MARK); size_t RemainingBytesToTransfer() const; diff --git a/src/network/network_server.cpp b/src/network/network_server.cpp index 5b1da8fa2a..9b9dc6fc91 100644 --- a/src/network/network_server.cpp +++ b/src/network/network_server.cpp @@ -874,13 +874,11 @@ NetworkRecvStatus ServerNetworkGameSocketHandler::Receive_CLIENT_JOIN(Packet *p) return this->SendError(NETWORK_ERROR_NOT_EXPECTED); } - char client_revision[NETWORK_REVISION_LENGTH]; - - p->Recv_string(client_revision, sizeof(client_revision)); + std::string client_revision = p->Recv_string(NETWORK_REVISION_LENGTH); uint32 newgrf_version = p->Recv_uint32(); /* Check if the client has revision control enabled */ - if (!IsNetworkCompatibleVersion(client_revision) || _openttd_newgrf_version != newgrf_version) { + if (!IsNetworkCompatibleVersion(client_revision.c_str()) || _openttd_newgrf_version != newgrf_version) { /* Different revisions!! */ return this->SendError(NETWORK_ERROR_WRONG_REVISION); } From 2924ac48c5013acf18b7577de4f610612d88dd6c Mon Sep 17 00:00:00 2001 From: rubidium42 Date: Fri, 4 Jun 2021 18:59:13 +0200 Subject: [PATCH 25/27] Fix: [Script] Ensure the saved script strings are properly validated and terminated when being read from the savegame --- src/script/script_instance.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/script/script_instance.cpp b/src/script/script_instance.cpp index 24dbb9c395..7c2fa43d67 100644 --- a/src/script/script_instance.cpp +++ b/src/script/script_instance.cpp @@ -569,8 +569,9 @@ bool ScriptInstance::IsPaused() case SQSL_STRING: { SlObject(nullptr, _script_byte); - static char buf[256]; + static char buf[std::numeric_limits::max()]; SlArray(buf, _script_sl_byte, SLE_CHAR); + StrMakeValidInPlace(buf, buf + _script_sl_byte); if (vm != nullptr) sq_pushstring(vm, buf, -1); return true; } From 076f3d26c238a9443b367629ab97dc1a5cf9b931 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lo=C3=AFc=20Guilloux?= Date: Thu, 10 Jun 2021 22:14:08 +0200 Subject: [PATCH 26/27] Fix #9329: [CMake] FindVersion.cmake relied on internal cmake variable (#9330) --- CMakeLists.txt | 1 + cmake/scripts/FindVersion.cmake | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index d060ffbbff..6cc2f7e2a9 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -77,6 +77,7 @@ add_custom_target(find_version -DREV_MAJOR=${PROJECT_VERSION_MAJOR} -DREV_MINOR=${PROJECT_VERSION_MINOR} -DREV_BUILD=${PROJECT_VERSION_PATCH} + -DWINDOWS=${WIN32} -P "${CMAKE_SOURCE_DIR}/cmake/scripts/FindVersion.cmake" WORKING_DIRECTORY ${CMAKE_SOURCE_DIR} BYPRODUCTS ${GENERATED_SOURCE_FILES} diff --git a/cmake/scripts/FindVersion.cmake b/cmake/scripts/FindVersion.cmake index 6e4a2b3909..43255e8011 100644 --- a/cmake/scripts/FindVersion.cmake +++ b/cmake/scripts/FindVersion.cmake @@ -138,7 +138,7 @@ else() configure_file("${CMAKE_SOURCE_DIR}/src/rev.cpp.in" "${FIND_VERSION_BINARY_DIR}/rev.cpp") - if(WIN32) + if(WINDOWS) message(STATUS "Generating ottdres.rc") configure_file("${CMAKE_SOURCE_DIR}/src/os/windows/ottdres.rc.in" "${FIND_VERSION_BINARY_DIR}/ottdres.rc") From ed3946e295f0e74880d85ffb6f6a933ca87e460d Mon Sep 17 00:00:00 2001 From: Patric Stout Date: Thu, 10 Jun 2021 23:13:34 +0200 Subject: [PATCH 27/27] Add: '-X' option to ignore global folders in the search path (#9341) This is extreme useful for automated testing. Without this, OpenTTD will always look in your personal-dir (like ~/.local/share/openttd or %USER%\Documents\OpenTTD). For most users this is exactly what we want, that there is a shared place for all their files. However, for automated testing this is rather annoying, as your local development files influence the automated test. As such, '-X' counters this, and only gives the local folders. This is especially useful in combination with '-x' and '-c'. --- src/fileio.cpp | 29 +++++++++++++++++++++++++---- src/fileio_func.h | 2 +- src/openttd.cpp | 10 +++++++--- 3 files changed, 33 insertions(+), 8 deletions(-) diff --git a/src/fileio.cpp b/src/fileio.cpp index bd05a4e7d5..c958684dd7 100644 --- a/src/fileio.cpp +++ b/src/fileio.cpp @@ -79,10 +79,22 @@ static bool IsValidSearchPath(Searchpath sp) return sp < _searchpaths.size() && !_searchpaths[sp].empty(); } -static void FillValidSearchPaths() +static void FillValidSearchPaths(bool only_local_path) { _valid_searchpaths.clear(); for (Searchpath sp = SP_FIRST_DIR; sp < NUM_SEARCHPATHS; sp++) { + if (only_local_path) { + switch (sp) { + case SP_WORKING_DIR: // Can be influence by "-c" option. + case SP_BINARY_DIR: // Most likely contains all the language files. + case SP_AUTODOWNLOAD_DIR: // Otherwise we cannot download in-game content. + break; + + default: + continue; + } + } + if (IsValidSearchPath(sp)) _valid_searchpaths.emplace_back(sp); } } @@ -952,11 +964,12 @@ std::string _personal_dir; * fill all other paths (save dir, autosave dir etc) and * make the save and scenario directories. * @param exe the path from the current path to the executable + * @param only_local_path Whether we shouldn't fill searchpaths with global folders. */ -void DeterminePaths(const char *exe) +void DeterminePaths(const char *exe, bool only_local_path) { DetermineBasePaths(exe); - FillValidSearchPaths(); + FillValidSearchPaths(only_local_path); #ifdef USE_XDG std::string config_home; @@ -1023,6 +1036,13 @@ void DeterminePaths(const char *exe) /* We are using the XDG configuration home for the config file, * then store the rest in the XDG data home folder. */ _personal_dir = _searchpaths[SP_PERSONAL_DIR_XDG]; + if (only_local_path) { + /* In case of XDG and we only want local paths and we detected that + * the user either manually indicated the XDG path or didn't use + * "-c" option, we change the working-dir to the XDG personal-dir, + * as this is most likely what the user is expecting. */ + _searchpaths[SP_WORKING_DIR] = _searchpaths[SP_PERSONAL_DIR_XDG]; + } } else #endif { @@ -1047,8 +1067,9 @@ void DeterminePaths(const char *exe) /* If we have network we make a directory for the autodownloading of content */ _searchpaths[SP_AUTODOWNLOAD_DIR] = _personal_dir + "content_download" PATHSEP; + DEBUG(misc, 4, "%s added as search path", _searchpaths[SP_AUTODOWNLOAD_DIR].c_str()); FioCreateDirectory(_searchpaths[SP_AUTODOWNLOAD_DIR]); - FillValidSearchPaths(); + FillValidSearchPaths(only_local_path); /* Create the directory for each of the types of content */ const Subdirectory dirs[] = { SCENARIO_DIR, HEIGHTMAP_DIR, BASESET_DIR, NEWGRF_DIR, AI_DIR, AI_LIBRARY_DIR, GAME_DIR, GAME_LIBRARY_DIR }; diff --git a/src/fileio_func.h b/src/fileio_func.h index baa8cb1bb1..3556849a0f 100644 --- a/src/fileio_func.h +++ b/src/fileio_func.h @@ -27,7 +27,7 @@ const char *FiosGetScreenshotDir(); void SanitizeFilename(char *filename); void AppendPathSeparator(std::string &buf); -void DeterminePaths(const char *exe); +void DeterminePaths(const char *exe, bool only_local_path); std::unique_ptr ReadFileToMem(const std::string &filename, size_t &lenp, size_t maxsize); bool FileExists(const std::string &filename); bool ExtractTar(const std::string &tar_filename, Subdirectory subdir); diff --git a/src/openttd.cpp b/src/openttd.cpp index f39b87c87e..fcd8fcd34b 100644 --- a/src/openttd.cpp +++ b/src/openttd.cpp @@ -197,6 +197,7 @@ static void ShowHelp() " -M music_set = Force the music set (see below)\n" " -c config_file = Use 'config_file' instead of 'openttd.cfg'\n" " -x = Never save configuration changes to disk\n" + " -X = Don't use global folders to search for files\n" " -q savegame = Write some information about the savegame and exit\n" "\n", lastof(buf) @@ -506,6 +507,7 @@ static const OptionData _options[] = { GETOPT_SHORT_VALUE('G'), GETOPT_SHORT_VALUE('c'), GETOPT_SHORT_NOVAL('x'), + GETOPT_SHORT_NOVAL('X'), GETOPT_SHORT_VALUE('q'), GETOPT_SHORT_NOVAL('h'), GETOPT_END() @@ -530,6 +532,7 @@ int openttd_main(int argc, char *argv[]) std::unique_ptr scanner(new AfterNewGRFScan()); bool dedicated = false; char *debuglog_conn = nullptr; + bool only_local_path = false; extern bool _dedicated_forks; _dedicated_forks = false; @@ -608,7 +611,7 @@ int openttd_main(int argc, char *argv[]) } break; case 'q': { - DeterminePaths(argv[0]); + DeterminePaths(argv[0], only_local_path); if (StrEmpty(mgo.opt)) { ret = 1; return ret; @@ -637,6 +640,7 @@ int openttd_main(int argc, char *argv[]) case 'G': scanner->generation_seed = strtoul(mgo.opt, nullptr, 10); break; case 'c': _config_file = mgo.opt; break; case 'x': scanner->save_config = false; break; + case 'X': only_local_path = true; break; case 'h': i = -2; // Force printing of help. break; @@ -650,7 +654,7 @@ int openttd_main(int argc, char *argv[]) * * The next two functions are needed to list the graphics sets. We can't do them earlier * because then we cannot show it on the debug console as that hasn't been configured yet. */ - DeterminePaths(argv[0]); + DeterminePaths(argv[0], only_local_path); TarScanner::DoScan(TarScanner::BASESET); BaseGraphics::FindSets(); BaseSounds::FindSets(); @@ -659,7 +663,7 @@ int openttd_main(int argc, char *argv[]) return ret; } - DeterminePaths(argv[0]); + DeterminePaths(argv[0], only_local_path); TarScanner::DoScan(TarScanner::BASESET); if (dedicated) DEBUG(net, 3, "Starting dedicated server, version %s", _openttd_revision);