From 76484833643c1aff90d41eb01de70f7e8ba0ceb9 Mon Sep 17 00:00:00 2001 From: Patric Stout Date: Thu, 27 May 2021 18:56:39 +0200 Subject: [PATCH 01/10] Change: by default, make "unload all" leave stations empty (#9301) --- src/order_gui.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/order_gui.cpp b/src/order_gui.cpp index 8504ee16f1..2b3715ebd6 100644 --- a/src/order_gui.cpp +++ b/src/order_gui.cpp @@ -643,8 +643,8 @@ private: DoCommandP(this->vehicle->tile, this->vehicle->index + (sel_ord << 20), MOF_UNLOAD | (unload_type << 4), CMD_MODIFY_ORDER | CMD_MSG(STR_ERROR_CAN_T_MODIFY_THIS_ORDER)); - /* Transfer orders with leave empty as default */ - if (unload_type == OUFB_TRANSFER) { + /* Transfer and unload orders with leave empty as default */ + if (unload_type == OUFB_TRANSFER || unload_type == OUFB_UNLOAD) { DoCommandP(this->vehicle->tile, this->vehicle->index + (sel_ord << 20), MOF_LOAD | (OLFB_NO_LOAD << 4), CMD_MODIFY_ORDER); this->SetWidgetDirty(WID_O_FULL_LOAD); } From 7b5c0b4236b5de9aece6540c7fbc256390552cea Mon Sep 17 00:00:00 2001 From: translators Date: Thu, 27 May 2021 19:38:25 +0000 Subject: [PATCH 02/10] Update: Translations from eints chinese (traditional): 9 changes by benny30111 english (us): 3 changes by 2TallTyler --- src/lang/english_US.txt | 4 +++- src/lang/traditional_chinese.txt | 9 +++++++++ 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/src/lang/english_US.txt b/src/lang/english_US.txt index 2b5fd29afd..a76b1d9079 100644 --- a/src/lang/english_US.txt +++ b/src/lang/english_US.txt @@ -3558,7 +3558,7 @@ STR_GROUP_CREATE_TOOLTIP :{BLACK}Click to STR_GROUP_DELETE_TOOLTIP :{BLACK}Delete the selected group STR_GROUP_RENAME_TOOLTIP :{BLACK}Rename the selected group STR_GROUP_LIVERY_TOOLTIP :{BLACK}Change livery of the selected group -STR_GROUP_REPLACE_PROTECTION_TOOLTIP :{BLACK}Click to protect this group from global autoreplace +STR_GROUP_REPLACE_PROTECTION_TOOLTIP :{BLACK}Click to protect this group from global autoreplace. Ctrl+Click to also protect sub-groups. STR_QUERY_GROUP_DELETE_CAPTION :{WHITE}Delete Group STR_GROUP_DELETE_QUERY_TEXT :{WHITE}Are you sure you want to delete this group and any descendants? @@ -3811,7 +3811,9 @@ STR_REPLACE_MAGLEV_VEHICLES :Maglev Vehicles STR_REPLACE_ROAD_VEHICLES :Road Vehicles STR_REPLACE_TRAM_VEHICLES :Streetcars +STR_REPLACE_REMOVE_WAGON :{BLACK}Wagon removal ({STRING}): {ORANGE}{STRING} STR_REPLACE_REMOVE_WAGON_HELP :{BLACK}Make autoreplace keep the length of a train the same by removing cars (starting at the front), if replacing the engine would make the train longer +STR_REPLACE_REMOVE_WAGON_GROUP_HELP :{STRING}. Ctrl+Click to also apply to sub-groups # Vehicle view STR_VEHICLE_VIEW_CAPTION :{WHITE}{VEHICLE} diff --git a/src/lang/traditional_chinese.txt b/src/lang/traditional_chinese.txt index e70c5beb5a..1441c0f474 100644 --- a/src/lang/traditional_chinese.txt +++ b/src/lang/traditional_chinese.txt @@ -966,6 +966,7 @@ STR_GAME_OPTIONS_AUTOSAVE_DROPDOWN_EVERY_12_MONTHS :每 12 個月 STR_GAME_OPTIONS_LANGUAGE :{BLACK}語言 STR_GAME_OPTIONS_LANGUAGE_TOOLTIP :{BLACK}選擇要用的介面語言 +STR_GAME_OPTIONS_LANGUAGE_PERCENTAGE :{STRING} (已完成{NUM}%) STR_GAME_OPTIONS_FULLSCREEN :{BLACK}全螢幕 STR_GAME_OPTIONS_FULLSCREEN_TOOLTIP :{BLACK}勾選即可在全螢幕下玩 OpenTTD @@ -2007,7 +2008,10 @@ STR_NETWORK_NEED_COMPANY_PASSWORD_CAPTION :{WHITE}公司 STR_NETWORK_COMPANY_LIST_CLIENT_LIST :用戶端清單 # Network client list +STR_NETWORK_CLIENT_LIST_CAPTION :{WHITE}多人遊戲 +STR_NETWORK_CLIENT_LIST_SERVER :{BLACK}伺服器 +STR_NETWORK_CLIENT_LIST_ADMIN_CLIENT_KICK :踢出 STR_NETWORK_SERVER :伺服器 @@ -2337,6 +2341,7 @@ STR_ROAD_TOOLBAR_TOOLTIP_BUILD_TRAMWAY_TUNNEL :{BLACK}挖掘 STR_ROAD_TOOLBAR_TOOLTIP_TOGGLE_BUILD_REMOVE_FOR_ROAD :{BLACK}切換鋪設/移除公路 STR_ROAD_TOOLBAR_TOOLTIP_TOGGLE_BUILD_REMOVE_FOR_TRAMWAYS :{BLACK}切換鋪設電車軌 STR_ROAD_TOOLBAR_TOOLTIP_CONVERT_ROAD :{BLACK}轉換或升級路面類型。按 Shift 鍵可切換鋪設和顯示預估成本。 +STR_ROAD_TOOLBAR_TOOLTIP_CONVERT_TRAM :{BLACK}轉換/升級電車軌道類型。按 Shift 鍵可切換建築/顯示預估成本。 STR_ROAD_NAME_ROAD :路面 STR_ROAD_NAME_TRAM :電車軌 @@ -2631,6 +2636,7 @@ STR_FRAMERATE_DATA_POINTS :{BLACK}數據 STR_FRAMERATE_MS_BAD :{RED}{DECIMAL} 毫秒 STR_FRAMERATE_BYTES_GOOD :{LTBLUE}{BYTES} ############ Leave those lines in this order!! +STR_FRAMERATE_AI :{BLACK} AI {NUM} {STRING} ############ End of leave-in-this-order ############ Leave those lines in this order!! STR_FRAMETIME_CAPTION_GL_LANDSCAPE :世界刻 @@ -2675,6 +2681,7 @@ STR_MAPGEN_BY :{BLACK}* STR_MAPGEN_NUMBER_OF_TOWNS :{BLACK}市鎮數量: STR_MAPGEN_DATE :{BLACK}日期: STR_MAPGEN_NUMBER_OF_INDUSTRIES :{BLACK}工業數量: +STR_MAPGEN_SNOW_COVERAGE_TEXT :{BLACK}{NUM}% STR_MAPGEN_LAND_GENERATOR :{BLACK}地形產生器: STR_MAPGEN_TERRAIN_TYPE :{BLACK}地形種類: STR_MAPGEN_QUANTITY_OF_SEA_LAKES :{BLACK}海平面: @@ -3309,6 +3316,7 @@ STR_BUY_VEHICLE_AIRCRAFT_CAPTION :新購飛機 ############ range for vehicle availability ends STR_PURCHASE_INFO_COST_WEIGHT :{BLACK}費用:{GOLD}{CURRENCY_LONG}{BLACK} 載重:{GOLD}{WEIGHT_SHORT} +STR_PURCHASE_INFO_COST_REFIT_WEIGHT :{BLACK}費用:{GOLD}{CURRENCY_LONG}{BLACK} (改裝費用:{GOLD}{CURRENCY_LONG}{BLACK}) 載重:{GOLD}{WEIGHT_SHORT} STR_PURCHASE_INFO_SPEED_POWER :{BLACK}速度:{GOLD}{VELOCITY}{BLACK} 功率:{GOLD}{POWER} STR_PURCHASE_INFO_SPEED :{BLACK}速度:{GOLD}{VELOCITY} STR_PURCHASE_INFO_SPEED_OCEAN :{BLACK}在海上速度: {GOLD}{VELOCITY} @@ -3340,6 +3348,7 @@ STR_BUY_VEHICLE_SHIP_BUY_VEHICLE_BUTTON :{BLACK}購買 STR_BUY_VEHICLE_AIRCRAFT_BUY_VEHICLE_BUTTON :{BLACK}購買飛機 STR_BUY_VEHICLE_TRAIN_BUY_REFIT_VEHICLE_BUTTON :{BLACK}購買並改裝車輛 +STR_BUY_VEHICLE_AIRCRAFT_BUY_REFIT_VEHICLE_BUTTON :{BLACK}購買並改裝飛機 STR_BUY_VEHICLE_TRAIN_BUY_VEHICLE_TOOLTIP :{BLACK}購買選定的列車。按住 Shift 點選則只會顯示預估的購買費用 STR_BUY_VEHICLE_ROAD_VEHICLE_BUY_VEHICLE_TOOLTIP :{BLACK}購買選定的車輛。按住 Shift 點選則只會顯示預估的購買費用 From ce1c60699afc7c7fa857fb118995a255e87c5b91 Mon Sep 17 00:00:00 2001 From: translators Date: Fri, 28 May 2021 19:53:19 +0000 Subject: [PATCH 03/10] Update: Translations from eints norwegian (bokmal): 3 changes by Anolitt dutch: 3 changes by Afoklala portuguese (brazilian): 3 changes by Vimerum --- src/lang/brazilian_portuguese.txt | 4 +++- src/lang/dutch.txt | 4 +++- src/lang/norwegian_bokmal.txt | 4 +++- 3 files changed, 9 insertions(+), 3 deletions(-) diff --git a/src/lang/brazilian_portuguese.txt b/src/lang/brazilian_portuguese.txt index 386701dc15..4776249796 100644 --- a/src/lang/brazilian_portuguese.txt +++ b/src/lang/brazilian_portuguese.txt @@ -3559,7 +3559,7 @@ STR_GROUP_CREATE_TOOLTIP :{BLACK}Clique p STR_GROUP_DELETE_TOOLTIP :{BLACK}Remove o grupo selecionado STR_GROUP_RENAME_TOOLTIP :{BLACK}Renomeia o grupo selecionado STR_GROUP_LIVERY_TOOLTIP :{BLACK}Alterar a pintura do grupo selecionado -STR_GROUP_REPLACE_PROTECTION_TOOLTIP :{BLACK}Clique para excluir esse grupo da substituição automática +STR_GROUP_REPLACE_PROTECTION_TOOLTIP :{BLACK}Clique para excluir esse grupo da substituição automática global. Ctrl+Clique para também excluir os subgrupos. STR_QUERY_GROUP_DELETE_CAPTION :{WHITE}Remover grupo STR_GROUP_DELETE_QUERY_TEXT :{WHITE}Tem certeza que quer remover esse grupo e seus descendentes? @@ -3812,7 +3812,9 @@ STR_REPLACE_MAGLEV_VEHICLES :Maglevs STR_REPLACE_ROAD_VEHICLES :Veículos terrestres STR_REPLACE_TRAM_VEHICLES :Bondes +STR_REPLACE_REMOVE_WAGON :{BLACK}Remoção de vagões ({STRING}): {ORANGE}{STRING} STR_REPLACE_REMOVE_WAGON_HELP :{BLACK}Faz autosubstituição manter o tamanho do trem removendo vagões (começando pela frente), se ao substituir a locomotiva o trem ficar maior +STR_REPLACE_REMOVE_WAGON_GROUP_HELP :{STRING}. Ctrl+Clique para também aplicar para os subgrupos # Vehicle view STR_VEHICLE_VIEW_CAPTION :{WHITE}{VEHICLE} diff --git a/src/lang/dutch.txt b/src/lang/dutch.txt index 9798a97823..a156876303 100644 --- a/src/lang/dutch.txt +++ b/src/lang/dutch.txt @@ -3558,7 +3558,7 @@ STR_GROUP_CREATE_TOOLTIP :{BLACK}Klik om STR_GROUP_DELETE_TOOLTIP :{BLACK}Verwijder de geselecteerde groep STR_GROUP_RENAME_TOOLTIP :{BLACK}Hiermee hernoem je de geselecteerde groep STR_GROUP_LIVERY_TOOLTIP :{BLACK}Wijzig het uiterlijk van de geselecteerde groep -STR_GROUP_REPLACE_PROTECTION_TOOLTIP :{BLACK}Klik om deze groep te beschermen tegen globaal automatisch vervangen +STR_GROUP_REPLACE_PROTECTION_TOOLTIP :{BLACK}Klik om deze groep te beschermen tegen globaal automatisch vervangen. Met Ctrl+klik geldt dit ook voor subgroepen. STR_QUERY_GROUP_DELETE_CAPTION :{WHITE}Verwijder groep STR_GROUP_DELETE_QUERY_TEXT :{WHITE}Weet je zeker dat je deze groep en de eventuele subgroepen wilt verwijderen? @@ -3811,7 +3811,9 @@ STR_REPLACE_MAGLEV_VEHICLES :Magneetzweefspo STR_REPLACE_ROAD_VEHICLES :Wegvoertuigen STR_REPLACE_TRAM_VEHICLES :Trams +STR_REPLACE_REMOVE_WAGON :{BLACK}Wagons verwijderen ({STRING}): {ORANGE}{STRING} STR_REPLACE_REMOVE_WAGON_HELP :{BLACK}De te vervangen trein behoudt zijn lengte door wagons weg te halen (startend aan de voorkant), als het vervangen de trein langer zou maken +STR_REPLACE_REMOVE_WAGON_GROUP_HELP :{STRING}. Met Ctrl+klik geldt dit ook voor subgroepen # Vehicle view STR_VEHICLE_VIEW_CAPTION :{WHITE}{VEHICLE} diff --git a/src/lang/norwegian_bokmal.txt b/src/lang/norwegian_bokmal.txt index 5b675a667d..34a55d0c87 100644 --- a/src/lang/norwegian_bokmal.txt +++ b/src/lang/norwegian_bokmal.txt @@ -3562,7 +3562,7 @@ STR_GROUP_CREATE_TOOLTIP :{BLACK}Klikk fo STR_GROUP_DELETE_TOOLTIP :{BLACK}Fjern den valgte gruppen STR_GROUP_RENAME_TOOLTIP :{BLACK}Gi nytt navn på den valgte gruppen STR_GROUP_LIVERY_TOOLTIP :{BLACK}Endre firmafarger for valgt gruppe -STR_GROUP_REPLACE_PROTECTION_TOOLTIP :{BLACK}Klikk for å beskytte denne gruppen fra global autoerstatning +STR_GROUP_REPLACE_PROTECTION_TOOLTIP :{BLACK}Klikk for å beskytte denne gruppen fra global autoerstatning. Ctrl+klikk for å også beskytte undergrupper STR_QUERY_GROUP_DELETE_CAPTION :{WHITE}Slette gruppe STR_GROUP_DELETE_QUERY_TEXT :{WHITE}Er du sikker på at du vil slette denne gruppen og eventuelle etterkommere? @@ -3815,7 +3815,9 @@ STR_REPLACE_MAGLEV_VEHICLES :Maglev-kjøret STR_REPLACE_ROAD_VEHICLES :Veikjøretøy STR_REPLACE_TRAM_VEHICLES :Trikkekjøretøy +STR_REPLACE_REMOVE_WAGON :{BLACK}Vognfjerning ({STRING}): {ORANGE}{STRING} STR_REPLACE_REMOVE_WAGON_HELP :{BLACK}La autoerstatningen beholde lengen på toget ved å fjerne vogner (fra første vogn), hvis utskiftningen gjør toget lengre. +STR_REPLACE_REMOVE_WAGON_GROUP_HELP :{STRING}. Ctrl+klikk for å også gjelde undergrupper # Vehicle view STR_VEHICLE_VIEW_CAPTION :{WHITE}{VEHICLE} From 208952f2ba80faeb2fd16f18193a96bf066a7dae Mon Sep 17 00:00:00 2001 From: rubidium42 Date: Mon, 24 May 2021 09:44:20 +0200 Subject: [PATCH 04/10] Codechange: split Write_ValidateSetting to get separate functions for making strings valid and writing strings --- src/network/network_gui.cpp | 2 +- src/settings.cpp | 61 ++++++++++++++++++------------------- src/settings_internal.h | 14 ++++++--- 3 files changed, 40 insertions(+), 37 deletions(-) diff --git a/src/network/network_gui.cpp b/src/network/network_gui.cpp index 3c61cf77aa..6df77cd083 100644 --- a/src/network/network_gui.cpp +++ b/src/network/network_gui.cpp @@ -2208,7 +2208,7 @@ public: std::string client_name(str); if (!NetworkValidateClientName(client_name)) break; - SetSettingValue(GetSettingFromName("network.client_name")->AsStringSetting(), client_name.c_str()); + SetSettingValue(GetSettingFromName("network.client_name")->AsStringSetting(), client_name); this->InvalidateData(); break; } diff --git a/src/settings.cpp b/src/settings.cpp index af06d3befc..26460fbb10 100644 --- a/src/settings.cpp +++ b/src/settings.cpp @@ -460,34 +460,31 @@ int32 IntSettingDesc::Read(const void *object) const } /** - * Set the string value of a setting. - * @param object The object the setting is to be saved in. - * @param str The string to save. + * Make the value valid given the limitations of this setting. + * + * In the case of string settings this is ensuring the string contains only accepted + * Utf8 characters and is at most the maximum length defined in this setting. + * @param str The string to make valid. */ -void StringSettingDesc::Write_ValidateSetting(const void *object, const char *str) const +void StringSettingDesc::MakeValueValid(std::string &str) const { - std::string *dst = reinterpret_cast(GetVariableAddress(object, &this->save)); + if (this->max_length == 0 || str.size() < this->max_length) return; - switch (GetVarMemType(this->save.conv)) { - case SLE_VAR_STR: - case SLE_VAR_STRQ: - if (str != nullptr) { - if (this->max_length != 0 && strlen(str) >= this->max_length) { - /* In case a maximum length is imposed by the setting, the length - * includes the '\0' termination for network transfer purposes. - * Also ensure the string is valid after chopping of some bytes. */ - std::string stdstr(str, this->max_length - 1); - dst->assign(str_validate(stdstr, SVS_NONE)); - } else { - dst->assign(str); - } - } else { - dst->clear(); - } - break; + /* In case a maximum length is imposed by the setting, the length + * includes the '\0' termination for network transfer purposes. + * Also ensure the string is valid after chopping of some bytes. */ + std::string stdstr(str, this->max_length - 1); + str.assign(str_validate(stdstr, SVS_NONE)); +} - default: NOT_REACHED(); - } +/** + * Write a string to the actual setting. + * @param object The object the setting is to be saved in. + * @param str The string to save. + */ +void StringSettingDesc::Write(const void *object, const std::string &str) const +{ + reinterpret_cast(GetVariableAddress(object, &this->save))->assign(str); } /** @@ -553,8 +550,9 @@ void IntSettingDesc::ParseValue(const IniItem *item, void *object) const void StringSettingDesc::ParseValue(const IniItem *item, void *object) const { - const char *str = (item == nullptr) ? this->def : item->value.has_value() ? item->value->c_str() : nullptr; - this->Write_ValidateSetting(object, str); + std::string str = (item == nullptr) ? this->def : item->value.value_or(""); + this->MakeValueValid(str); + this->Write(object, str); } void ListSettingDesc::ParseValue(const IniItem *item, void *object) const @@ -2026,12 +2024,12 @@ uint GetCompanySettingIndex(const char *name) * @param force_newgame force the newgame settings * @note Strings WILL NOT be synced over the network */ -bool SetSettingValue(const StringSettingDesc *sd, const char *value, bool force_newgame) +bool SetSettingValue(const StringSettingDesc *sd, std::string value, bool force_newgame) { assert(sd->save.conv & SLF_NO_NETWORK_SYNC); - if (GetVarMemType(sd->save.conv) == SLE_VAR_STRQ && strcmp(value, "(null)") == 0) { - value = nullptr; + if (GetVarMemType(sd->save.conv) == SLE_VAR_STRQ && value.compare("(null)") == 0) { + value.clear(); } const void *object = (_game_mode == GM_MENU || force_newgame) ? &_settings_newgame : &_settings_game; @@ -2045,9 +2043,10 @@ bool SetSettingValue(const StringSettingDesc *sd, const char *value, bool force_ * @param object The object the setting is in. * @param newval The new value for the setting. */ -void StringSettingDesc::ChangeValue(const void *object, const char *newval) const +void StringSettingDesc::ChangeValue(const void *object, std::string &newval) const { - this->Write_ValidateSetting(object, newval); + this->MakeValueValid(newval); + this->Write(object, newval); if (this->proc != nullptr) this->proc(0); if (_save_config) SaveToConfig(); diff --git a/src/settings_internal.h b/src/settings_internal.h index e7dd6e9149..9e6358a6c6 100644 --- a/src/settings_internal.h +++ b/src/settings_internal.h @@ -210,21 +210,25 @@ struct ManyOfManySettingDesc : OneOfManySettingDesc { struct StringSettingDesc : SettingDesc { StringSettingDesc(SaveLoad save, const char *name, SettingGuiFlag flags, bool startup, const char *def, uint32 max_length, OnChange proc) : - SettingDesc(save, name, flags, startup), def(def), max_length(max_length), proc(proc) {} + SettingDesc(save, name, flags, startup), def(def == nullptr ? "" : def), max_length(max_length), + proc(proc) {} virtual ~StringSettingDesc() {} - const char *def; ///< default value given when none is present + std::string def; ///< default value given when none is present uint32 max_length; ///< maximum length of the string, 0 means no maximum length OnChange *proc; ///< callback procedure for when the value is changed bool IsStringSetting() const override { return true; } - void ChangeValue(const void *object, const char *newval) const; - void Write_ValidateSetting(const void *object, const char *str) const; + void ChangeValue(const void *object, std::string &newval) const; void FormatValue(char *buf, const char *last, const void *object) const override; void ParseValue(const IniItem *item, void *object) const override; bool IsSameValue(const IniItem *item, void *object) const override; const std::string &Read(const void *object) const; + +private: + void MakeValueValid(std::string &str) const; + void Write(const void *object, const std::string &str) const; }; /** List/array settings. */ @@ -255,7 +259,7 @@ typedef std::initializer_list> SettingTable; const SettingDesc *GetSettingFromName(const char *name); bool SetSettingValue(const IntSettingDesc *sd, int32 value, bool force_newgame = false); -bool SetSettingValue(const StringSettingDesc *sd, const char *value, bool force_newgame = false); +bool SetSettingValue(const StringSettingDesc *sd, const std::string value, bool force_newgame = false); uint GetSettingIndex(const SettingDesc *sd); #endif /* SETTINGS_INTERNAL_H */ From ea9715d970911300b17f8a55dd1047f3706d22f4 Mon Sep 17 00:00:00 2001 From: rubidium42 Date: Mon, 24 May 2021 10:42:02 +0200 Subject: [PATCH 05/10] Codechange: split Write_ValidateSetting to get separate functions for making ints valid and writing ints --- src/settings.cpp | 43 +++++++++++++++++++++++++++++++---------- src/settings_internal.h | 6 +++++- 2 files changed, 38 insertions(+), 11 deletions(-) diff --git a/src/settings.cpp b/src/settings.cpp index 26460fbb10..bf3360319a 100644 --- a/src/settings.cpp +++ b/src/settings.cpp @@ -392,14 +392,28 @@ size_t BoolSettingDesc::ParseValue(const char *str) const } /** - * Set the value of a setting and if needed clamp the value to the preset minimum and maximum. + * Make the value valid and then write it to the setting. + * See #MakeValidValid and #Write for more details. * @param object The object the setting is to be saved in. * @param val Signed version of the new value. */ -void IntSettingDesc::Write_ValidateSetting(const void *object, int32 val) const +void IntSettingDesc::MakeValueValidAndWrite(const void *object, int32 val) const { - void *ptr = GetVariableAddress(object, &this->save); + this->MakeValueValid(val); + this->Write(object, val); +} +/** + * Make the value valid given the limitations of this setting. + * + * In the case of int settings this is ensuring the value is between the minimum and + * maximum value, with a special case for 0 if SGF_0ISDISABLED is set. + * This is generally done by clamping the value so it is within the allowed value range. + * However, for SGF_MULTISTRING the default is used when the value is not valid. + * @param val The value to make valid. + */ +void IntSettingDesc::MakeValueValid(int32 &val) const +{ /* We need to take special care of the uint32 type as we receive from the function * a signed integer. While here also bail out on 64-bit settings as those are not * supported. Unsigned 8 and 16-bit variables are safe since they fit into a signed @@ -437,14 +451,23 @@ void IntSettingDesc::Write_ValidateSetting(const void *object, int32 val) const uval = (uint32)this->def; } } - WriteValue(ptr, SLE_VAR_U32, (int64)uval); + val = (int32)val; return; } case SLE_VAR_I64: case SLE_VAR_U64: default: NOT_REACHED(); } +} +/** + * Set the value of a setting. + * @param object The object the setting is to be saved in. + * @param val Signed version of the new value. + */ +void IntSettingDesc::Write(const void *object, int32 val) const +{ + void *ptr = GetVariableAddress(object, &this->save); WriteValue(ptr, this->save.conv, (int64)val); } @@ -545,7 +568,7 @@ static void IniLoadSettings(IniFile *ini, const SettingTable &settings_table, co void IntSettingDesc::ParseValue(const IniItem *item, void *object) const { size_t val = (item == nullptr) ? this->def : this->ParseValue(item->value.has_value() ? item->value->c_str() : ""); - this->Write_ValidateSetting(object, (int32)val); + this->MakeValueValidAndWrite(object, (int32)val); } void StringSettingDesc::ParseValue(const IniItem *item, void *object) const @@ -1388,7 +1411,7 @@ static void HandleOldDiffCustom(bool savegame) /* Skip deprecated options */ if (!SlIsObjectCurrentlyValid(sd->save.version_from, sd->save.version_to)) continue; int32 value = (int32)((i == 4 ? 1000 : 1) * _old_diff_custom[i]); - sd->AsIntSetting()->Write_ValidateSetting(savegame ? &_settings_game : &_settings_newgame, value); + sd->AsIntSetting()->MakeValueValidAndWrite(savegame ? &_settings_game : &_settings_newgame, value); } } @@ -1825,14 +1848,14 @@ void IntSettingDesc::ChangeValue(const void *object, int32 newval) const { int32 oldval = this->Read(object); - this->Write_ValidateSetting(object, newval); + this->MakeValueValidAndWrite(object, newval); newval = this->Read(object); if (oldval == newval) return; if (this->proc != nullptr && !this->proc(newval)) { /* The change was not allowed, so revert. */ - WriteValue(GetVariableAddress(object, &this->save), this->save.conv, (int64)oldval); + this->Write(object, oldval); return; } @@ -1987,7 +2010,7 @@ void SetDefaultCompanySettings(CompanyID cid) Company *c = Company::Get(cid); for (auto &sd : _company_settings) { const IntSettingDesc *int_setting = sd->AsIntSetting(); - int_setting->Write_ValidateSetting(&c->settings, int_setting->def); + int_setting->MakeValueValidAndWrite(&c->settings, int_setting->def); } } @@ -2189,7 +2212,7 @@ static void LoadSettings(const SettingTable &settings, void *object) if (!SlObjectMember(ptr, &osd->save)) continue; if (osd->IsIntSetting()) { const IntSettingDesc *int_setting = osd->AsIntSetting(); - int_setting->Write_ValidateSetting(object, int_setting->Read(object)); + int_setting->MakeValueValidAndWrite(object, int_setting->Read(object)); } } } diff --git a/src/settings_internal.h b/src/settings_internal.h index 9e6358a6c6..d13f4c89eb 100644 --- a/src/settings_internal.h +++ b/src/settings_internal.h @@ -150,13 +150,17 @@ struct IntSettingDesc : SettingDesc { bool IsIntSetting() const override { return true; } void ChangeValue(const void *object, int32 newvalue) const; - void Write_ValidateSetting(const void *object, int32 value) const; + void MakeValueValidAndWrite(const void *object, int32 value) const; virtual size_t ParseValue(const char *str) const; void FormatValue(char *buf, const char *last, const void *object) const override; void ParseValue(const IniItem *item, void *object) const override; bool IsSameValue(const IniItem *item, void *object) const override; int32 Read(const void *object) const; + +private: + void MakeValueValid(int32 &value) const; + void Write(const void *object, int32 value) const; }; /** Boolean setting. */ From e2f5d9e561b70aec85d67b4eea822ba49f0c20bf Mon Sep 17 00:00:00 2001 From: rubidium42 Date: Mon, 24 May 2021 09:44:20 +0200 Subject: [PATCH 06/10] Codechange: use separate pre and post callbacks for string settings --- src/network/network_client.cpp | 17 ++++-------- src/network/network_func.h | 2 +- src/settings.cpp | 35 ++++++++++------------- src/settings_internal.h | 26 +++++++++++++---- src/table/currency_settings.ini | 6 ++-- src/table/misc_settings.ini | 14 ++++++---- src/table/settings.h.preamble | 12 ++++---- src/table/settings.ini | 49 +++++++++++++++++---------------- 8 files changed, 86 insertions(+), 75 deletions(-) diff --git a/src/network/network_client.cpp b/src/network/network_client.cpp index 08a35e980b..1a729e34fc 100644 --- a/src/network/network_client.cpp +++ b/src/network/network_client.cpp @@ -1344,27 +1344,22 @@ bool NetworkValidateClientName() } /** - * Send the server our name. + * Send the server our name as callback from the setting. + * @param newname The new client name. */ -void NetworkUpdateClientName() +void NetworkUpdateClientName(const std::string &client_name) { NetworkClientInfo *ci = NetworkClientInfo::GetByClientID(_network_own_client_id); - if (ci == nullptr) return; - /* There is no validation on string settings, it is actually a post change callback. - * This method is called from that post change callback. So, when the client name is - * changed via the console there is no easy way to prevent an invalid name. Though, - * we can prevent it getting sent here. */ - if (!NetworkValidateClientName()) return; /* Don't change the name if it is the same as the old name */ - if (_settings_client.network.client_name.compare(ci->client_name) != 0) { + if (client_name.compare(ci->client_name) != 0) { if (!_network_server) { - MyClient::SendSetName(_settings_client.network.client_name.c_str()); + MyClient::SendSetName(client_name.c_str()); } else { /* Copy to a temporary buffer so no #n gets added after our name in the settings when there are duplicate names. */ char temporary_name[NETWORK_CLIENT_NAME_LENGTH]; - strecpy(temporary_name, _settings_client.network.client_name.c_str(), lastof(temporary_name)); + strecpy(temporary_name, client_name.c_str(), lastof(temporary_name)); if (NetworkFindName(temporary_name, lastof(temporary_name))) { NetworkTextMessage(NETWORK_ACTION_NAME_CHANGE, CC_DEFAULT, false, ci->client_name, temporary_name); ci->client_name = temporary_name; diff --git a/src/network/network_func.h b/src/network/network_func.h index 1c5916eda0..fbae8daf76 100644 --- a/src/network/network_func.h +++ b/src/network/network_func.h @@ -38,7 +38,7 @@ byte NetworkSpectatorCount(); bool NetworkIsValidClientName(const std::string_view client_name); bool NetworkValidateClientName(); bool NetworkValidateClientName(std::string &client_name); -void NetworkUpdateClientName(); +void NetworkUpdateClientName(const std::string &client_name); bool NetworkCompanyHasClients(CompanyID company); std::string NetworkChangeCompanyPassword(CompanyID company_id, std::string password); void NetworkReboot(); diff --git a/src/settings.cpp b/src/settings.cpp index bf3360319a..f2980a3632 100644 --- a/src/settings.cpp +++ b/src/settings.cpp @@ -1343,37 +1343,28 @@ static bool InvalidateShipPathCache(int32 p1) return true; } -static bool UpdateClientName(int32 p1) +/** + * Replace a passwords that are a literal asterisk with an empty string. + * @param newval The new string value for this password field. + * @return Always true. + */ +static bool ReplaceAsteriskWithEmptyPassword(std::string &newval) { - NetworkUpdateClientName(); + if (newval.compare("*") == 0) newval.clear(); return true; } -static bool UpdateServerPassword(int32 p1) -{ - if (_settings_client.network.server_password.compare("*") == 0) { - _settings_client.network.server_password.clear(); - } - - NetworkServerUpdateGameInfo(); - return true; -} - -static bool UpdateRconPassword(int32 p1) +static bool UpdateClientConfigValues(int32 p1) { - if (_settings_client.network.rcon_password.compare("*") == 0) { - _settings_client.network.rcon_password.clear(); - } - + UpdateClientConfigValues(); return true; } -static bool UpdateClientConfigValues(int32 p1) +/** Update the game info, and send it to the clients when we are running as a server. */ +static void UpdateClientConfigValues() { NetworkServerUpdateGameInfo(); if (_network_server) NetworkServerSendConfigUpdate(); - - return true; } /* End - Callback Functions */ @@ -2069,8 +2060,10 @@ bool SetSettingValue(const StringSettingDesc *sd, std::string value, bool force_ void StringSettingDesc::ChangeValue(const void *object, std::string &newval) const { this->MakeValueValid(newval); + if (this->pre_check != nullptr && !this->pre_check(newval)) return; + this->Write(object, newval); - if (this->proc != nullptr) this->proc(0); + if (this->post_callback != nullptr) this->post_callback(newval); if (_save_config) SaveToConfig(); } diff --git a/src/settings_internal.h b/src/settings_internal.h index d13f4c89eb..4a483cc0e8 100644 --- a/src/settings_internal.h +++ b/src/settings_internal.h @@ -212,15 +212,31 @@ struct ManyOfManySettingDesc : OneOfManySettingDesc { /** String settings. */ struct StringSettingDesc : SettingDesc { + /** + * A check to be performed before the setting gets changed. The passed string may be + * changed by the check if that is important, for example to remove unwanted white + * space. The return value denotes whether the value, potentially after the changes, + * is allowed to be used/set in the configuration. + * @param value The prospective new value for the setting. + * @return True when the setting is accepted. + */ + typedef bool PreChangeCheck(std::string &value); + /** + * A callback to denote that a setting has been changed. + * @param The new value for the setting. + */ + typedef void PostChangeCallback(const std::string &value); + StringSettingDesc(SaveLoad save, const char *name, SettingGuiFlag flags, bool startup, const char *def, - uint32 max_length, OnChange proc) : + uint32 max_length, PreChangeCheck pre_check, PostChangeCallback post_callback) : SettingDesc(save, name, flags, startup), def(def == nullptr ? "" : def), max_length(max_length), - proc(proc) {} + pre_check(pre_check), post_callback(post_callback) {} virtual ~StringSettingDesc() {} - std::string def; ///< default value given when none is present - uint32 max_length; ///< maximum length of the string, 0 means no maximum length - OnChange *proc; ///< callback procedure for when the value is changed + std::string def; ///< Default value given when none is present + uint32 max_length; ///< Maximum length of the string, 0 means no maximum length + PreChangeCheck *pre_check; ///< Callback to check for the validity of the setting. + PostChangeCallback *post_callback; ///< Callback when the setting has been changed. bool IsStringSetting() const override { return true; } void ChangeValue(const void *object, std::string &newval) const; diff --git a/src/table/currency_settings.ini b/src/table/currency_settings.ini index 76eecc1043..0714b1b93d 100644 --- a/src/table/currency_settings.ini +++ b/src/table/currency_settings.ini @@ -9,8 +9,8 @@ static const SettingTable _currency_settings{ [post-amble] }; [templates] -SDT_VAR = SDT_VAR ($base, $var, $type, $flags, $guiflags, $def, $min, $max, $interval, $str, $strhelp, $strval, $proc, $from, $to, $cat, $extra, $startup), -SDT_SSTR = SDT_SSTR($base, $var, $type, $flags, $guiflags, $def, $proc, $from, $to, $cat, $extra, $startup), +SDT_VAR = SDT_VAR ($base, $var, $type, $flags, $guiflags, $def, $min, $max, $interval, $str, $strhelp, $strval, $proc, $from, $to, $cat, $extra, $startup), +SDT_SSTR = SDT_SSTR($base, $var, $type, $flags, $guiflags, $def, $pre_cb, $post_cb, $from, $to, $cat, $extra, $startup), [validation] SDT_VAR = static_assert($max <= MAX_$type, "Maximum value for $base.$var exceeds storage size"); @@ -23,6 +23,8 @@ str = STR_NULL strhelp = STR_CONFIG_SETTING_NO_EXPLANATION_AVAILABLE_HELPTEXT strval = STR_NULL proc = nullptr +pre_cb = nullptr +post_cb = nullptr load = nullptr from = SL_MIN_VERSION to = SL_MAX_VERSION diff --git a/src/table/misc_settings.ini b/src/table/misc_settings.ini index 017320c863..952839daa4 100644 --- a/src/table/misc_settings.ini +++ b/src/table/misc_settings.ini @@ -21,12 +21,12 @@ 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, $proc, $from, $to, $cat, $extra, $startup), -SDTG_OMANY = SDTG_OMANY($name, $type, $flags, $guiflags, $var, $def, $max, $full, $str, $strhelp, $strval, $proc, $from, $to, $cat, $extra, $startup), -SDTG_SSTR = SDTG_SSTR($name, $type, $flags, $guiflags, $var, $def, 0, $proc, $from, $to, $cat, $extra, $startup), -SDTG_BOOL = SDTG_BOOL($name, $flags, $guiflags, $var, $def, $str, $strhelp, $strval, $proc, $from, $to, $cat, $extra, $startup), -SDTG_VAR = SDTG_VAR($name, $type, $flags, $guiflags, $var, $def, $min, $max, $interval, $str, $strhelp, $strval, $proc, $from, $to, $cat, $extra, $startup), +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, $proc, $from, $to, $cat, $extra, $startup), +SDTG_OMANY = SDTG_OMANY($name, $type, $flags, $guiflags, $var, $def, $max, $full, $str, $strhelp, $strval, $proc, $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, $proc, $from, $to, $cat, $extra, $startup), +SDTG_VAR = SDTG_VAR($name, $type, $flags, $guiflags, $var, $def, $min, $max, $interval, $str, $strhelp, $strval, $proc, $from, $to, $cat, $extra, $startup), [validation] SDTG_VAR = static_assert($max <= MAX_$type, "Maximum value for $var exceeds storage size"); @@ -40,6 +40,8 @@ str = STR_NULL strhelp = STR_CONFIG_SETTING_NO_EXPLANATION_AVAILABLE_HELPTEXT strval = STR_NULL proc = nullptr +pre_cb = nullptr +post_cb = nullptr load = nullptr from = SL_MIN_VERSION to = SL_MAX_VERSION diff --git a/src/table/settings.h.preamble b/src/table/settings.h.preamble index 7f9ac2dd59..f5f7352440 100644 --- a/src/table/settings.h.preamble +++ b/src/table/settings.h.preamble @@ -67,8 +67,8 @@ static size_t ConvertLandscape(const char *value); #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_SSTR(name, type, flags, guiflags, var, def, max_length, proc, 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, proc) +#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_OMANY(name, type, flags, guiflags, var, def, max, full, str, strhelp, strval, proc, 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, proc, full, nullptr) @@ -90,8 +90,8 @@ static size_t ConvertLandscape(const char *value); #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_SSTR(base, var, type, flags, guiflags, def, proc, 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, proc) +#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_OMANY(base, var, type, flags, guiflags, def, max, full, str, strhelp, strval, proc, 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, proc, full, load) @@ -112,8 +112,8 @@ static size_t ConvertLandscape(const char *value); #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_SSTR(var, type, flags, guiflags, def, max_length, proc, from, to, cat, extra, startup)\ - SDTG_SSTR(#var, type, flags, guiflags, _settings_client.var, def, max_length, proc, 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_OMANY(var, type, flags, guiflags, def, max, full, str, strhelp, strval, proc, from, to, cat, extra, startup)\ SDTG_OMANY(#var, type, flags, guiflags, _settings_client.var, def, max, full, str, strhelp, strval, proc, from, to, cat, extra, startup) diff --git a/src/table/settings.ini b/src/table/settings.ini index 4f105b5f66..1de905c5b4 100644 --- a/src/table/settings.ini +++ b/src/table/settings.ini @@ -43,9 +43,8 @@ static bool SpriteZoomMinChanged(int32 p1); static bool MaxVehiclesChanged(int32 p1); static bool InvalidateShipPathCache(int32 p1); -static bool UpdateClientName(int32 p1); -static bool UpdateServerPassword(int32 p1); -static bool UpdateRconPassword(int32 p1); +static bool ReplaceAsteriskWithEmptyPassword(std::string &newval); +static void UpdateClientConfigValues(); static bool UpdateClientConfigValues(int32 p1); /* End - Callback Functions for the various settings */ @@ -54,7 +53,7 @@ static bool UpdateClientConfigValues(int32 p1); * These include for example the GUI settings and will not be saved with the * savegame. * It is also a bit tricky since you would think that service_interval - * for example doesn't need to be synched. Every client assigns the + * for example does not need to be synched. Every client assigns the * service_interval value to the v->service_interval, meaning that every client * assigns its own value. If the setting was company-based, that would mean that * vehicles could decide on different moments that they are heading back to a @@ -63,18 +62,18 @@ const SettingTable _settings{ [post-amble] }; [templates] -SDTG_BOOL = SDTG_BOOL($name, $flags, $guiflags, $var, $def, $str, $strhelp, $strval, $proc, $from, $to, $cat, $extra, $startup), -SDTG_VAR = SDTG_VAR($name, $type, $flags, $guiflags, $var, $def, $min, $max, $interval, $str, $strhelp, $strval, $proc, $from, $to, $cat, $extra, $startup), -SDTG_OMANY = SDTG_OMANY($name, $type, $flags, $guiflags, $var, $def, $max, $full, $str, $strhelp, $strval, $proc, $from, $to, $cat, $extra, $startup), -SDTC_BOOL = SDTC_BOOL( $var, $flags, $guiflags, $def, $str, $strhelp, $strval, $proc, $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, $proc, $from, $to, $cat, $extra, $startup), -SDTC_SSTR = SDTC_SSTR( $var, $type, $flags, $guiflags, $def, $length, $proc, $from, $to, $cat, $extra, $startup), -SDTC_VAR = SDTC_VAR( $var, $type, $flags, $guiflags, $def, $min, $max, $interval, $str, $strhelp, $strval, $proc, $from, $to, $cat, $extra, $startup), -SDT_BOOL = SDT_BOOL($base, $var, $flags, $guiflags, $def, $str, $strhelp, $strval, $proc, $from, $to, $cat, $extra, $startup), -SDT_OMANY = SDT_OMANY($base, $var, $type, $flags, $guiflags, $def, $max, $full, $str, $strhelp, $strval, $proc, $from, $to, $load, $cat, $extra, $startup), -SDT_SSTR = SDT_SSTR($base, $var, $type, $flags, $guiflags, $def, $proc, $from, $to, $cat, $extra, $startup), -SDT_VAR = SDT_VAR($base, $var, $type, $flags, $guiflags, $def, $min, $max, $interval, $str, $strhelp, $strval, $proc, $from, $to, $cat, $extra, $startup), +SDTG_BOOL = SDTG_BOOL($name, $flags, $guiflags, $var, $def, $str, $strhelp, $strval, $proc, $from, $to, $cat, $extra, $startup), +SDTG_VAR = SDTG_VAR($name, $type, $flags, $guiflags, $var, $def, $min, $max, $interval, $str, $strhelp, $strval, $proc, $from, $to, $cat, $extra, $startup), +SDTG_OMANY = SDTG_OMANY($name, $type, $flags, $guiflags, $var, $def, $max, $full, $str, $strhelp, $strval, $proc, $from, $to, $cat, $extra, $startup), +SDTC_BOOL = SDTC_BOOL( $var, $flags, $guiflags, $def, $str, $strhelp, $strval, $proc, $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, $proc, $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, $proc, $from, $to, $cat, $extra, $startup), +SDT_BOOL = SDT_BOOL($base, $var, $flags, $guiflags, $def, $str, $strhelp, $strval, $proc, $from, $to, $cat, $extra, $startup), +SDT_OMANY = SDT_OMANY($base, $var, $type, $flags, $guiflags, $def, $max, $full, $str, $strhelp, $strval, $proc, $from, $to, $load, $cat, $extra, $startup), +SDT_SSTR = SDT_SSTR($base, $var, $type, $flags, $guiflags, $def, $pre_cb, $post_cb, $from, $to, $cat, $extra, $startup), +SDT_VAR = SDT_VAR($base, $var, $type, $flags, $guiflags, $def, $min, $max, $interval, $str, $strhelp, $strval, $proc, $from, $to, $cat, $extra, $startup), SDT_NULL = SDT_NULL($length, $from, $to), [validation] @@ -93,6 +92,8 @@ str = STR_NULL strhelp = STR_CONFIG_SETTING_NO_EXPLANATION_AVAILABLE_HELPTEXT strval = STR_NULL proc = nullptr +pre_cb = nullptr +post_cb = nullptr load = nullptr from = SL_MIN_VERSION to = SL_MAX_VERSION @@ -2646,7 +2647,7 @@ type = SLE_STRQ from = SLV_118 flags = SLF_NO_NETWORK_SYNC def = nullptr -proc = RedrawScreen +post_cb = [](auto) { MarkWholeScreenDirty(); } cat = SC_BASIC [SDT_SSTR] @@ -2656,7 +2657,7 @@ type = SLE_STRQ from = SLV_118 flags = SLF_NO_NETWORK_SYNC def = nullptr -proc = RedrawScreen +post_cb = [](auto) { MarkWholeScreenDirty(); } cat = SC_BASIC [SDT_SSTR] @@ -2666,7 +2667,7 @@ type = SLE_STRQ from = SLV_126 flags = SLF_NO_NETWORK_SYNC def = nullptr -proc = RedrawScreen +post_cb = [](auto) { MarkWholeScreenDirty(); } cat = SC_BASIC @@ -3921,7 +3922,8 @@ type = SLE_STR length = NETWORK_CLIENT_NAME_LENGTH flags = SLF_NOT_IN_SAVE | SLF_NO_NETWORK_SYNC def = nullptr -proc = UpdateClientName +pre_cb = NetworkValidateClientName +post_cb = NetworkUpdateClientName cat = SC_BASIC [SDTC_SSTR] @@ -3931,7 +3933,8 @@ length = NETWORK_PASSWORD_LENGTH flags = SLF_NOT_IN_SAVE | SLF_NO_NETWORK_SYNC guiflags = SGF_NETWORK_ONLY def = nullptr -proc = UpdateServerPassword +pre_cb = ReplaceAsteriskWithEmptyPassword +post_cb = [](auto) { NetworkServerUpdateGameInfo(); } cat = SC_BASIC [SDTC_SSTR] @@ -3941,7 +3944,7 @@ length = NETWORK_PASSWORD_LENGTH flags = SLF_NOT_IN_SAVE | SLF_NO_NETWORK_SYNC guiflags = SGF_NETWORK_ONLY def = nullptr -proc = UpdateRconPassword +pre_cb = ReplaceAsteriskWithEmptyPassword cat = SC_BASIC [SDTC_SSTR] @@ -3967,7 +3970,7 @@ length = NETWORK_NAME_LENGTH flags = SLF_NOT_IN_SAVE | SLF_NO_NETWORK_SYNC guiflags = SGF_NETWORK_ONLY def = nullptr -proc = UpdateClientConfigValues +post_cb = [](auto) { UpdateClientConfigValues(); } cat = SC_BASIC [SDTC_SSTR] From 08308d808c2ab3a6621762127eed6c46f16286c6 Mon Sep 17 00:00:00 2001 From: rubidium42 Date: Mon, 24 May 2021 11:47:37 +0200 Subject: [PATCH 07/10] Codechange: use separate pre and post callbacks for int settings --- src/elrail.cpp | 5 +- src/elrail_func.h | 2 +- src/newgrf_config.cpp | 6 +- src/newgrf_config.h | 2 +- src/rail_gui.cpp | 7 +- src/rail_gui.h | 2 +- src/settings.cpp | 282 ++++++++------------------------ src/settings_internal.h | 50 ++++-- src/table/company_settings.ini | 30 ++-- src/table/currency_settings.ini | 3 +- src/table/gameopt_settings.ini | 13 +- src/table/misc_settings.ini | 9 +- src/table/settings.h.preamble | 44 ++--- src/table/settings.ini | 219 ++++++++++++------------- src/table/win32_settings.ini | 7 +- src/table/window_settings.ini | 7 +- 16 files changed, 272 insertions(+), 416 deletions(-) diff --git a/src/elrail.cpp b/src/elrail.cpp index 44481dd313..4959bb2cba 100644 --- a/src/elrail.cpp +++ b/src/elrail.cpp @@ -593,9 +593,9 @@ void DrawRailCatenary(const TileInfo *ti) DrawRailCatenaryRailway(ti); } -bool SettingsDisableElrail(int32 p1) +void SettingsDisableElrail(int32 new_value) { - bool disable = (p1 != 0); + bool disable = (new_value != 0); /* we will now walk through all electric train engines and change their railtypes if it is the wrong one*/ const RailType old_railtype = disable ? RAILTYPE_ELECTRIC : RAILTYPE_RAIL; @@ -639,5 +639,4 @@ bool SettingsDisableElrail(int32 p1) * rails. It may have unintended consequences if that function is ever * extended, though. */ ReinitGuiAfterToggleElrail(disable); - return true; } diff --git a/src/elrail_func.h b/src/elrail_func.h index 0438437241..bd301d6bb1 100644 --- a/src/elrail_func.h +++ b/src/elrail_func.h @@ -36,6 +36,6 @@ void DrawRailCatenary(const TileInfo *ti); void DrawRailCatenaryOnTunnel(const TileInfo *ti); void DrawRailCatenaryOnBridge(const TileInfo *ti); -bool SettingsDisableElrail(int32 p1); ///< _settings_game.disable_elrail callback +void SettingsDisableElrail(int32 new_value); ///< _settings_game.disable_elrail callback #endif /* ELRAIL_FUNC_H */ diff --git a/src/newgrf_config.cpp b/src/newgrf_config.cpp index b92b297da0..044d361939 100644 --- a/src/newgrf_config.cpp +++ b/src/newgrf_config.cpp @@ -282,15 +282,13 @@ void GRFParameterInfo::Finalize() /** * Update the palettes of the graphics from the config file. * Called when changing the default palette in advanced settings. - * @param p1 Unused. - * @return Always true. + * @param new_value Unused. */ -bool UpdateNewGRFConfigPalette(int32 p1) +void UpdateNewGRFConfigPalette(int32 new_value) { for (GRFConfig *c = _grfconfig_newgame; c != nullptr; c = c->next) c->SetSuitablePalette(); for (GRFConfig *c = _grfconfig_static; c != nullptr; c = c->next) c->SetSuitablePalette(); for (GRFConfig *c = _all_grfs; c != nullptr; c = c->next) c->SetSuitablePalette(); - return true; } /** diff --git a/src/newgrf_config.h b/src/newgrf_config.h index 1588f8c3ab..3b3da962ea 100644 --- a/src/newgrf_config.h +++ b/src/newgrf_config.h @@ -239,6 +239,6 @@ void ShowNewGRFSettings(bool editable, bool show_params, bool exec_changes, GRFC GRFTextWrapper FindUnknownGRFName(uint32 grfid, uint8 *md5sum, bool create); void UpdateNewGRFScanStatus(uint num, const char *name); -bool UpdateNewGRFConfigPalette(int32 p1 = 0); +void UpdateNewGRFConfigPalette(int32 new_value = 0); #endif /* NEWGRF_CONFIG_H */ diff --git a/src/rail_gui.cpp b/src/rail_gui.cpp index e7221d01c4..86f7189843 100644 --- a/src/rail_gui.cpp +++ b/src/rail_gui.cpp @@ -2130,10 +2130,9 @@ static void SetDefaultRailGui() /** * Updates the current signal variant used in the signal GUI * to the one adequate to current year. - * @param p needed to be called when a setting changes - * @return success, needed for settings + * @param new_value needed to be called when a setting changes */ -bool ResetSignalVariant(int32 p) +void ResetSignalVariant(int32 new_value) { SignalVariant new_variant = (_cur_year < _settings_client.gui.semaphore_build_before ? SIG_SEMAPHORE : SIG_ELECTRIC); @@ -2145,8 +2144,6 @@ bool ResetSignalVariant(int32 p) } _cur_signal_variant = new_variant; } - - return true; } /** diff --git a/src/rail_gui.h b/src/rail_gui.h index 29a1b9b161..81fb8f6271 100644 --- a/src/rail_gui.h +++ b/src/rail_gui.h @@ -15,7 +15,7 @@ struct Window *ShowBuildRailToolbar(RailType railtype); void ReinitGuiAfterToggleElrail(bool disable); -bool ResetSignalVariant(int32 = 0); +void ResetSignalVariant(int32 = 0); void InitializeRailGUI(); DropDownList GetRailTypeDropDownList(bool for_replacement = false, bool all_option = false); diff --git a/src/settings.cpp b/src/settings.cpp index f2980a3632..0160f8e0e3 100644 --- a/src/settings.cpp +++ b/src/settings.cpp @@ -807,99 +807,56 @@ const StringSettingDesc *SettingDesc::AsStringSetting() const /* Begin - Callback Functions for the various settings. */ /** Reposition the main toolbar as the setting changed. */ -static bool v_PositionMainToolbar(int32 p1) +static void v_PositionMainToolbar(int32 new_value) { if (_game_mode != GM_MENU) PositionMainToolbar(nullptr); - return true; } /** Reposition the statusbar as the setting changed. */ -static bool v_PositionStatusbar(int32 p1) +static void v_PositionStatusbar(int32 new_value) { if (_game_mode != GM_MENU) { PositionStatusbar(nullptr); PositionNewsMessage(nullptr); PositionNetworkChatWindow(nullptr); } - return true; -} - -static bool PopulationInLabelActive(int32 p1) -{ - UpdateAllTownVirtCoords(); - return true; -} - -static bool RedrawScreen(int32 p1) -{ - MarkWholeScreenDirty(); - return true; } /** * Redraw the smallmap after a colour scheme change. * @param p1 Callback parameter. - * @return Always true. */ -static bool RedrawSmallmap(int32 p1) +static void RedrawSmallmap(int32 new_value) { BuildLandLegend(); BuildOwnerLegend(); SetWindowClassesDirty(WC_SMALLMAP); - return true; } -static bool InvalidateDetailsWindow(int32 p1) -{ - SetWindowClassesDirty(WC_VEHICLE_DETAILS); - return true; -} - -static bool StationSpreadChanged(int32 p1) +static void StationSpreadChanged(int32 p1) { InvalidateWindowData(WC_SELECT_STATION, 0); InvalidateWindowData(WC_BUILD_STATION, 0); - return true; } -static bool InvalidateBuildIndustryWindow(int32 p1) +static void CloseSignalGUI(int32 new_value) { - InvalidateWindowData(WC_BUILD_INDUSTRY, 0); - return true; -} - -static bool CloseSignalGUI(int32 p1) -{ - if (p1 == 0) { + if (new_value == 0) { DeleteWindowByClass(WC_BUILD_SIGNAL); } - return true; -} - -static bool InvalidateTownViewWindow(int32 p1) -{ - InvalidateWindowClassesData(WC_TOWN_VIEW, p1); - return true; } -static bool DeleteSelectStationWindow(int32 p1) -{ - DeleteWindowById(WC_SELECT_STATION, 0); - return true; -} - -static bool UpdateConsists(int32 p1) +static void UpdateConsists(int32 new_value) { for (Train *t : Train::Iterate()) { /* Update the consist of all trains so the maximum speed is set correctly. */ if (t->IsFrontEngine() || t->IsFreeWagon()) t->ConsistChanged(CCF_TRACK); } InvalidateWindowClassesData(WC_BUILD_VEHICLE, 0); - return true; } -/* Check service intervals of vehicles, p1 is value of % or day based servicing */ -static bool CheckInterval(int32 p1) +/* Check service intervals of vehicles, newvalue is value of % or day based servicing */ +static void UpdateServiceInterval(int32 new_value) { bool update_vehicles; VehicleDefaultSettings *vds; @@ -911,7 +868,7 @@ static bool CheckInterval(int32 p1) update_vehicles = true; } - if (p1 != 0) { + if (new_value != 0) { vds->servint_trains = 50; vds->servint_roadveh = 50; vds->servint_aircraft = 50; @@ -928,66 +885,42 @@ static bool CheckInterval(int32 p1) for (Vehicle *v : Vehicle::Iterate()) { if (v->owner == _current_company && v->IsPrimaryVehicle() && !v->ServiceIntervalIsCustom()) { v->SetServiceInterval(CompanyServiceInterval(c, v->type)); - v->SetServiceIntervalIsPercent(p1 != 0); + v->SetServiceIntervalIsPercent(new_value != 0); } } } - InvalidateDetailsWindow(0); - - return true; + SetWindowClassesDirty(WC_VEHICLE_DETAILS); } -static bool UpdateInterval(VehicleType type, int32 p1) +static bool CanUpdateServiceInterval(VehicleType type, int32 &new_value) { - bool update_vehicles; VehicleDefaultSettings *vds; if (_game_mode == GM_MENU || !Company::IsValidID(_current_company)) { vds = &_settings_client.company.vehicle; - update_vehicles = false; } else { vds = &Company::Get(_current_company)->settings.vehicle; - update_vehicles = true; } /* Test if the interval is valid */ - uint16 interval = GetServiceIntervalClamped(p1, vds->servint_ispercent); - if (interval != p1) return false; + int32 interval = GetServiceIntervalClamped(new_value, vds->servint_ispercent); + return interval == new_value; +} - if (update_vehicles) { +static void UpdateServiceInterval(VehicleType type, int32 new_value) +{ + if (_game_mode != GM_MENU && Company::IsValidID(_current_company)) { for (Vehicle *v : Vehicle::Iterate()) { if (v->owner == _current_company && v->type == type && v->IsPrimaryVehicle() && !v->ServiceIntervalIsCustom()) { - v->SetServiceInterval(p1); + v->SetServiceInterval(new_value); } } } - InvalidateDetailsWindow(0); - - return true; -} - -static bool UpdateIntervalTrains(int32 p1) -{ - return UpdateInterval(VEH_TRAIN, p1); -} - -static bool UpdateIntervalRoadVeh(int32 p1) -{ - return UpdateInterval(VEH_ROAD, p1); -} - -static bool UpdateIntervalShips(int32 p1) -{ - return UpdateInterval(VEH_SHIP, p1); -} - -static bool UpdateIntervalAircraft(int32 p1) -{ - return UpdateInterval(VEH_AIRCRAFT, p1); + SetWindowClassesDirty(WC_VEHICLE_DETAILS); } -static bool TrainAccelerationModelChanged(int32 p1) +static void TrainAccelerationModelChanged(int32 new_value) { for (Train *t : Train::Iterate()) { if (t->IsFrontEngine()) { @@ -1000,30 +933,24 @@ static bool TrainAccelerationModelChanged(int32 p1) SetWindowClassesDirty(WC_ENGINE_PREVIEW); InvalidateWindowClassesData(WC_BUILD_VEHICLE, 0); SetWindowClassesDirty(WC_VEHICLE_DETAILS); - - return true; } /** * This function updates the train acceleration cache after a steepness change. - * @param p1 Callback parameter. - * @return Always true. + * @param new_value Unused new value of setting. */ -static bool TrainSlopeSteepnessChanged(int32 p1) +static void TrainSlopeSteepnessChanged(int32 new_value) { for (Train *t : Train::Iterate()) { if (t->IsFrontEngine()) t->CargoChanged(); } - - return true; } /** * This function updates realistic acceleration caches when the setting "Road vehicle acceleration model" is set. - * @param p1 Callback parameter - * @return Always true + * @param new_value Unused new value of setting. */ -static bool RoadVehAccelerationModelChanged(int32 p1) +static void RoadVehAccelerationModelChanged(int32 new_value) { if (_settings_game.vehicle.roadveh_acceleration_model != AM_ORIGINAL) { for (RoadVehicle *rv : RoadVehicle::Iterate()) { @@ -1037,48 +964,29 @@ static bool RoadVehAccelerationModelChanged(int32 p1) SetWindowClassesDirty(WC_ENGINE_PREVIEW); InvalidateWindowClassesData(WC_BUILD_VEHICLE, 0); SetWindowClassesDirty(WC_VEHICLE_DETAILS); - - return true; } /** * This function updates the road vehicle acceleration cache after a steepness change. - * @param p1 Callback parameter. - * @return Always true. + * @param new_value Unused new value of setting. */ -static bool RoadVehSlopeSteepnessChanged(int32 p1) +static void RoadVehSlopeSteepnessChanged(int32 new_value) { for (RoadVehicle *rv : RoadVehicle::Iterate()) { if (rv->IsFrontEngine()) rv->CargoChanged(); } - - return true; -} - -static bool DragSignalsDensityChanged(int32) -{ - InvalidateWindowData(WC_BUILD_SIGNAL, 0); - - return true; } -static bool TownFoundingChanged(int32 p1) +static void TownFoundingChanged(int32 new_value) { if (_game_mode != GM_EDITOR && _settings_game.economy.found_town == TF_FORBIDDEN) { DeleteWindowById(WC_FOUND_TOWN, 0); - return true; + } else { + InvalidateWindowData(WC_FOUND_TOWN, 0); } - InvalidateWindowData(WC_FOUND_TOWN, 0); - return true; -} - -static bool InvalidateVehTimetableWindow(int32 p1) -{ - InvalidateWindowClassesData(WC_VEHICLE_TIMETABLE, VIWD_MODIFY_ORDERS); - return true; } -static bool ZoomMinMaxChanged(int32 p1) +static void ZoomMinMaxChanged(int32 new_value) { extern void ConstrainAllViewportsZoom(); ConstrainAllViewportsZoom(); @@ -1089,81 +997,32 @@ static bool ZoomMinMaxChanged(int32 p1) UpdateCursorSize(); LoadStringWidthTable(); } - return true; } -static bool SpriteZoomMinChanged(int32 p1) { +static void SpriteZoomMinChanged(int32 new_value) +{ GfxClearSpriteCache(); /* Force all sprites to redraw at the new chosen zoom level */ MarkWholeScreenDirty(); - return true; } /** * Update any possible saveload window and delete any newgrf dialogue as * its widget parts might change. Reinit all windows as it allows access to the * newgrf debug button. - * @param p1 unused. - * @return Always true. + * @param new_value unused. */ -static bool InvalidateNewGRFChangeWindows(int32 p1) +static void InvalidateNewGRFChangeWindows(int32 new_value) { InvalidateWindowClassesData(WC_SAVELOAD); DeleteWindowByClass(WC_GAME_OPTIONS); ReInitAllWindows(_gui_zoom_cfg); - return true; } -static bool InvalidateCompanyLiveryWindow(int32 p1) +static void InvalidateCompanyLiveryWindow(int32 new_value) { InvalidateWindowClassesData(WC_COMPANY_COLOUR, -1); ResetVehicleColourMap(); - return RedrawScreen(p1); -} - -static bool InvalidateIndustryViewWindow(int32 p1) -{ - InvalidateWindowClassesData(WC_INDUSTRY_VIEW); - return true; -} - -static bool InvalidateAISettingsWindow(int32 p1) -{ - InvalidateWindowClassesData(WC_AI_SETTINGS); - return true; -} - -/** - * Update the town authority window after a town authority setting change. - * @param p1 Unused. - * @return Always true. - */ -static bool RedrawTownAuthority(int32 p1) -{ - SetWindowClassesDirty(WC_TOWN_AUTHORITY); - return true; -} - -/** - * Invalidate the company infrastructure details window after a infrastructure maintenance setting change. - * @param p1 Unused. - * @return Always true. - */ -static bool InvalidateCompanyInfrastructureWindow(int32 p1) -{ - InvalidateWindowClassesData(WC_COMPANY_INFRASTRUCTURE); - return true; -} - -/** - * Invalidate the company details window after the shares setting changed. - * @param p1 Unused. - * @return Always true. - */ -static bool InvalidateCompanyWindow(int32 p1) -{ - InvalidateWindowClassesData(WC_COMPANY); - return true; } /** Checks if any settings are set to incorrect values, and sets them to correct values in that case. */ @@ -1176,7 +1035,7 @@ static void ValidateSettings() } } -static bool DifficultyNoiseChange(int32 i) +static void DifficultyNoiseChange(int32 new_value) { if (_game_mode == GM_NORMAL) { UpdateAirportsNoise(); @@ -1184,11 +1043,9 @@ static bool DifficultyNoiseChange(int32 i) InvalidateWindowClassesData(WC_TOWN_VIEW, 0); } } - - return true; } -static bool MaxNoAIsChange(int32 i) +static void MaxNoAIsChange(int32 new_value) { if (GetGameSettings().difficulty.max_no_competitors != 0 && AI::GetInfoList()->size() == 0 && @@ -1197,15 +1054,14 @@ static bool MaxNoAIsChange(int32 i) } InvalidateWindowClassesData(WC_GAME_OPTIONS, 0); - return true; } /** * Check whether the road side may be changed. - * @param p1 unused + * @param new_value unused * @return true if the road side may be changed. */ -static bool CheckRoadSide(int p1) +static bool CheckRoadSide(int32 &new_value) { extern bool RoadVehiclesAreBuilt(); return _game_mode == GM_MENU || !RoadVehiclesAreBuilt(); @@ -1225,10 +1081,10 @@ static size_t ConvertLandscape(const char *value) return OneOfManySettingDesc::ParseSingleValue(value, strlen(value), _old_landscape_values); } -static bool CheckFreeformEdges(int32 p1) +static bool CheckFreeformEdges(int32 &new_value) { if (_game_mode == GM_MENU) return true; - if (p1 != 0) { + if (new_value != 0) { for (Ship *s : Ship::Iterate()) { /* Check if there is a ship on the northern border. */ if (TileX(s->tile) == 0 || TileY(s->tile) == 0) { @@ -1243,8 +1099,6 @@ static bool CheckFreeformEdges(int32 p1) return false; } } - for (uint x = 0; x < MapSizeX(); x++) MakeVoid(TileXY(x, 0)); - for (uint y = 0; y < MapSizeY(); y++) MakeVoid(TileXY(0, y)); } else { for (uint i = 0; i < MapMaxX(); i++) { if (TileHeight(TileXY(i, 1)) != 0) { @@ -1270,6 +1124,18 @@ static bool CheckFreeformEdges(int32 p1) return false; } } + } + return true; +} + +static void UpdateFreeformEdges(int32 new_value) +{ + if (_game_mode == GM_MENU) return; + + if (new_value != 0) { + for (uint x = 0; x < MapSizeX(); x++) MakeVoid(TileXY(x, 0)); + for (uint y = 0; y < MapSizeY(); y++) MakeVoid(TileXY(0, y)); + } else { /* Make tiles at the border water again. */ for (uint i = 0; i < MapMaxX(); i++) { SetTileHeight(TileXY(i, 0), 0); @@ -1281,14 +1147,13 @@ static bool CheckFreeformEdges(int32 p1) } } MarkWholeScreenDirty(); - return true; } /** * Changing the setting "allow multiple NewGRF sets" is not allowed * if there are vehicles. */ -static bool ChangeDynamicEngines(int32 p1) +static bool CheckDynamicEngines(int32 &new_value) { if (_game_mode == GM_MENU) return true; @@ -1300,7 +1165,7 @@ static bool ChangeDynamicEngines(int32 p1) return true; } -static bool ChangeMaxHeightLevel(int32 p1) +static bool CheckMaxHeightLevel(int32 &new_value) { if (_game_mode == GM_NORMAL) return false; if (_game_mode != GM_EDITOR) return true; @@ -1308,39 +1173,33 @@ static bool ChangeMaxHeightLevel(int32 p1) /* Check if at least one mountain on the map is higher than the new value. * If yes, disallow the change. */ for (TileIndex t = 0; t < MapSize(); t++) { - if ((int32)TileHeight(t) > p1) { + if ((int32)TileHeight(t) > new_value) { ShowErrorMessage(STR_CONFIG_SETTING_TOO_HIGH_MOUNTAIN, INVALID_STRING_ID, WL_ERROR); /* Return old, unchanged value */ return false; } } - /* The smallmap uses an index from heightlevels to colours. Trigger rebuilding it. */ - InvalidateWindowClassesData(WC_SMALLMAP, 2); - return true; } -static bool StationCatchmentChanged(int32 p1) +static void StationCatchmentChanged(int32 new_value) { Station::RecomputeCatchmentForAll(); MarkWholeScreenDirty(); - return true; } -static bool MaxVehiclesChanged(int32 p1) +static void MaxVehiclesChanged(int32 new_value) { InvalidateWindowClassesData(WC_BUILD_TOOLBAR); MarkWholeScreenDirty(); - return true; } -static bool InvalidateShipPathCache(int32 p1) +static void InvalidateShipPathCache(int32 new_value) { for (Ship *s : Ship::Iterate()) { s->path.clear(); } - return true; } /** @@ -1354,12 +1213,6 @@ static bool ReplaceAsteriskWithEmptyPassword(std::string &newval) return true; } -static bool UpdateClientConfigValues(int32 p1) -{ - UpdateClientConfigValues(); - return true; -} - /** Update the game info, and send it to the clients when we are running as a server. */ static void UpdateClientConfigValues() { @@ -1838,17 +1691,12 @@ void DeleteGRFPresetFromConfig(const char *config_name) void IntSettingDesc::ChangeValue(const void *object, int32 newval) const { int32 oldval = this->Read(object); - - this->MakeValueValidAndWrite(object, newval); - newval = this->Read(object); - + this->MakeValueValid(newval); + if (this->pre_check != nullptr && !this->pre_check(newval)) return; if (oldval == newval) return; - if (this->proc != nullptr && !this->proc(newval)) { - /* The change was not allowed, so revert. */ - this->Write(object, oldval); - return; - } + this->Write(object, newval); + if (this->post_callback != nullptr) this->post_callback(newval); if (this->flags & SGF_NO_NETWORK) { GamelogStartAction(GLAT_SETTING); diff --git a/src/settings_internal.h b/src/settings_internal.h index 4a483cc0e8..4de0178379 100644 --- a/src/settings_internal.h +++ b/src/settings_internal.h @@ -64,8 +64,6 @@ enum SettingType { }; struct IniItem; -typedef bool OnChange(int32 var); ///< callback prototype on data modification -typedef size_t OnConvert(const char *value); ///< callback prototype for conversion error /** Properties of config file settings. */ struct SettingDesc { @@ -125,11 +123,27 @@ struct SettingDesc { /** Base integer type, including boolean, settings. Only these are shown in the settings UI. */ struct IntSettingDesc : SettingDesc { + /** + * A check to be performed before the setting gets changed. The passed integer may be + * changed by the check if that is important, for example to remove some unwanted bit. + * The return value denotes whether the value, potentially after the changes, + * is allowed to be used/set in the configuration. + * @param value The prospective new value for the setting. + * @return True when the setting is accepted. + */ + typedef bool PreChangeCheck(int32 &value); + /** + * A callback to denote that a setting has been changed. + * @param The new value for the setting. + */ + typedef void PostChangeCallback(int32 value); + IntSettingDesc(SaveLoad save, const char *name, SettingGuiFlag flags, bool startup, int32 def, - int32 min, uint32 max, int32 interval, StringID str, StringID str_help, StringID str_val, - SettingCategory cat, OnChange *proc) : + int32 min, uint32 max, int32 interval, StringID str, StringID str_help, StringID str_val, + SettingCategory cat, PreChangeCheck pre_check, PostChangeCallback post_callback) : SettingDesc(save, name, flags, startup), def(def), min(min), max(max), interval(interval), - str(str), str_help(str_help), str_val(str_val), cat(cat), proc(proc) {} + str(str), str_help(str_help), str_val(str_val), cat(cat), pre_check(pre_check), + post_callback(post_callback) {} virtual ~IntSettingDesc() {} int32 def; ///< default value given when none is present @@ -140,7 +154,8 @@ struct IntSettingDesc : SettingDesc { StringID str_help; ///< (Translated) string with help text; gui only. StringID str_val; ///< (Translated) first string describing the value. SettingCategory cat; ///< assigned categories of the setting - OnChange *proc; ///< callback procedure for when the value is changed + PreChangeCheck *pre_check; ///< Callback to check for the validity of the setting. + PostChangeCallback *post_callback; ///< Callback when the setting has been changed. /** * Check whether this setting is a boolean type setting. @@ -166,8 +181,10 @@ private: /** Boolean setting. */ struct BoolSettingDesc : IntSettingDesc { BoolSettingDesc(SaveLoad save, const char *name, SettingGuiFlag flags, bool startup, bool def, - StringID str, StringID str_help, StringID str_val, SettingCategory cat, OnChange *proc) : - IntSettingDesc(save, name, flags, startup, def, 0, 1, 0, str, str_help, str_val, cat, proc) {} + StringID str, StringID str_help, StringID str_val, SettingCategory cat, + PreChangeCheck pre_check, PostChangeCallback post_callback) : + IntSettingDesc(save, name, flags, startup, def, 0, 1, 0, str, str_help, str_val, cat, + pre_check, post_callback) {} virtual ~BoolSettingDesc() {} bool IsBoolSetting() const override { return true; } @@ -177,10 +194,14 @@ struct BoolSettingDesc : IntSettingDesc { /** One of many setting. */ struct OneOfManySettingDesc : IntSettingDesc { - OneOfManySettingDesc(SaveLoad save, const char *name, SettingGuiFlag flags, bool startup, - int32 def, int32 max, StringID str, StringID str_help, StringID str_val, SettingCategory cat, OnChange *proc, - std::initializer_list many, OnConvert *many_cnvt) : - IntSettingDesc(save, name, flags, startup, def, 0, max, 0, str, str_help, str_val, cat, proc), many_cnvt(many_cnvt) + typedef size_t OnConvert(const char *value); ///< callback prototype for conversion error + + OneOfManySettingDesc(SaveLoad save, const char *name, SettingGuiFlag flags, bool startup, int32 def, + int32 max, StringID str, StringID str_help, StringID str_val, SettingCategory cat, + PreChangeCheck pre_check, PostChangeCallback post_callback, + std::initializer_list many, OnConvert *many_cnvt) : + IntSettingDesc(save, name, flags, startup, def, 0, max, 0, str, str_help, str_val, cat, + pre_check, post_callback), many_cnvt(many_cnvt) { for (auto one : many) this->many.push_back(one); } @@ -200,10 +221,11 @@ struct OneOfManySettingDesc : IntSettingDesc { /** Many of many setting. */ struct ManyOfManySettingDesc : OneOfManySettingDesc { ManyOfManySettingDesc(SaveLoad save, const char *name, SettingGuiFlag flags, bool startup, - int32 def, StringID str, StringID str_help, StringID str_val, SettingCategory cat, OnChange *proc, + int32 def, StringID str, StringID str_help, StringID str_val, SettingCategory cat, + PreChangeCheck pre_check, PostChangeCallback post_callback, std::initializer_list many, OnConvert *many_cnvt) : OneOfManySettingDesc(save, name, flags, startup, def, (1 << many.size()) - 1, str, str_help, - str_val, cat, proc, many, many_cnvt) {} + str_val, cat, pre_check, post_callback, many, many_cnvt) {} virtual ~ManyOfManySettingDesc() {} size_t ParseValue(const char *str) const override; diff --git a/src/table/company_settings.ini b/src/table/company_settings.ini index eecebb40e6..019c26dd9c 100644 --- a/src/table/company_settings.ini +++ b/src/table/company_settings.ini @@ -5,19 +5,16 @@ ; [pre-amble] -static bool CheckInterval(int32 p1); -static bool InvalidateDetailsWindow(int32 p1); -static bool UpdateIntervalTrains(int32 p1); -static bool UpdateIntervalRoadVeh(int32 p1); -static bool UpdateIntervalShips(int32 p1); -static bool UpdateIntervalAircraft(int32 p1); +static void UpdateServiceInterval(int32 new_value); +static bool CanUpdateServiceInterval(VehicleType type, int32 &new_value); +static void UpdateServiceInterval(VehicleType type, int32 new_value); static const SettingTable _company_settings{ [post-amble] }; [templates] -SDT_BOOL = SDT_BOOL($base, $var, $flags, $guiflags, $def, $str, $strhelp, $strval, $proc, $from, $to, $cat, $extra, $startup), -SDT_VAR = SDT_VAR($base, $var, $type, $flags, $guiflags, $def, $min, $max, $interval, $str, $strhelp, $strval, $proc, $from, $to, $cat, $extra, $startup), +SDT_BOOL = SDT_BOOL($base, $var, $flags, $guiflags, $def, $str, $strhelp, $strval, $pre_cb, $post_cb, $from, $to, $cat, $extra, $startup), +SDT_VAR = SDT_VAR($base, $var, $type, $flags, $guiflags, $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 $base.$var exceeds storage size"); @@ -29,7 +26,8 @@ interval = 0 str = STR_NULL strhelp = STR_CONFIG_SETTING_NO_EXPLANATION_AVAILABLE_HELPTEXT strval = STR_NULL -proc = nullptr +pre_cb = nullptr +post_cb = nullptr load = nullptr from = SL_MIN_VERSION to = SL_MAX_VERSION @@ -82,7 +80,7 @@ var = vehicle.servint_ispercent def = false str = STR_CONFIG_SETTING_SERVINT_ISPERCENT strhelp = STR_CONFIG_SETTING_SERVINT_ISPERCENT_HELPTEXT -proc = CheckInterval +post_cb = UpdateServiceInterval [SDT_VAR] base = CompanySettings @@ -95,7 +93,8 @@ max = 800 str = STR_CONFIG_SETTING_SERVINT_TRAINS strhelp = STR_CONFIG_SETTING_SERVINT_TRAINS_HELPTEXT strval = STR_CONFIG_SETTING_SERVINT_VALUE -proc = UpdateIntervalTrains +pre_cb = [](auto new_value) { return CanUpdateServiceInterval(VEH_TRAIN, new_value); } +post_cb = [](auto new_value) { UpdateServiceInterval(VEH_TRAIN, new_value); } [SDT_VAR] base = CompanySettings @@ -108,7 +107,8 @@ max = 800 str = STR_CONFIG_SETTING_SERVINT_ROAD_VEHICLES strhelp = STR_CONFIG_SETTING_SERVINT_ROAD_VEHICLES_HELPTEXT strval = STR_CONFIG_SETTING_SERVINT_VALUE -proc = UpdateIntervalRoadVeh +pre_cb = [](auto new_value) { return CanUpdateServiceInterval(VEH_ROAD, new_value); } +post_cb = [](auto new_value) { UpdateServiceInterval(VEH_ROAD, new_value); } [SDT_VAR] base = CompanySettings @@ -121,7 +121,8 @@ max = 800 str = STR_CONFIG_SETTING_SERVINT_SHIPS strhelp = STR_CONFIG_SETTING_SERVINT_SHIPS_HELPTEXT strval = STR_CONFIG_SETTING_SERVINT_VALUE -proc = UpdateIntervalShips +pre_cb = [](auto new_value) { return CanUpdateServiceInterval(VEH_SHIP, new_value); } +post_cb = [](auto new_value) { UpdateServiceInterval(VEH_SHIP, new_value); } [SDT_VAR] base = CompanySettings @@ -134,4 +135,5 @@ max = 800 str = STR_CONFIG_SETTING_SERVINT_AIRCRAFT strhelp = STR_CONFIG_SETTING_SERVINT_AIRCRAFT_HELPTEXT strval = STR_CONFIG_SETTING_SERVINT_VALUE -proc = UpdateIntervalAircraft +pre_cb = [](auto new_value) { return CanUpdateServiceInterval(VEH_AIRCRAFT, new_value); } +post_cb = [](auto new_value) { UpdateServiceInterval(VEH_AIRCRAFT, new_value); } diff --git a/src/table/currency_settings.ini b/src/table/currency_settings.ini index 0714b1b93d..449bbee983 100644 --- a/src/table/currency_settings.ini +++ b/src/table/currency_settings.ini @@ -9,7 +9,7 @@ static const SettingTable _currency_settings{ [post-amble] }; [templates] -SDT_VAR = SDT_VAR ($base, $var, $type, $flags, $guiflags, $def, $min, $max, $interval, $str, $strhelp, $strval, $proc, $from, $to, $cat, $extra, $startup), +SDT_VAR = SDT_VAR ($base, $var, $type, $flags, $guiflags, $def, $min, $max, $interval, $str, $strhelp, $strval, $pre_cb, $post_cb, $from, $to, $cat, $extra, $startup), SDT_SSTR = SDT_SSTR($base, $var, $type, $flags, $guiflags, $def, $pre_cb, $post_cb, $from, $to, $cat, $extra, $startup), [validation] @@ -22,7 +22,6 @@ interval = 0 str = STR_NULL strhelp = STR_CONFIG_SETTING_NO_EXPLANATION_AVAILABLE_HELPTEXT strval = STR_NULL -proc = nullptr pre_cb = nullptr post_cb = nullptr load = nullptr diff --git a/src/table/gameopt_settings.ini b/src/table/gameopt_settings.ini index 56ac7d7816..131833a415 100644 --- a/src/table/gameopt_settings.ini +++ b/src/table/gameopt_settings.ini @@ -37,12 +37,12 @@ static const SettingTable _gameopt_settings{ }; [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, $proc, $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), SDT_NULL = SDT_NULL( $length, $from, $to), -SDTC_OMANY = SDTC_OMANY( $var, $type, $flags, $guiflags, $def, $max, $full, $str, $strhelp, $strval, $proc, $from, $to, $cat, $extra, $startup), -SDTG_OMANY = SDTG_OMANY($name, $type, $flags, $guiflags, $var, $def, $max, $full, $str, $strhelp, $strval, $proc, $from, $to, $cat, $extra, $startup), -SDT_OMANY = SDT_OMANY($base, $var, $type, $flags, $guiflags, $def, $max, $full, $str, $strhelp, $strval, $proc, $from, $to, $load, $cat, $extra, $startup), -SDT_VAR = SDT_VAR($base, $var, $type, $flags, $guiflags, $def, $min, $max, $interval, $str, $strhelp, $strval, $proc, $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), +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($base, $var, $type, $flags, $guiflags, $def, $max, $full, $str, $strhelp, $strval, $pre_cb, $post_cb, $from, $to, $load, $cat, $extra, $startup), +SDT_VAR = SDT_VAR($base, $var, $type, $flags, $guiflags, $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"); @@ -58,7 +58,8 @@ interval = 0 str = STR_NULL strhelp = STR_CONFIG_SETTING_NO_EXPLANATION_AVAILABLE_HELPTEXT strval = STR_NULL -proc = nullptr +pre_cb = nullptr +post_cb = nullptr load = nullptr from = SL_MIN_VERSION to = SL_MAX_VERSION diff --git a/src/table/misc_settings.ini b/src/table/misc_settings.ini index 952839daa4..1b633a65aa 100644 --- a/src/table/misc_settings.ini +++ b/src/table/misc_settings.ini @@ -22,11 +22,11 @@ static const SettingTable _misc_settings{ }; [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, $proc, $from, $to, $cat, $extra, $startup), -SDTG_OMANY = SDTG_OMANY($name, $type, $flags, $guiflags, $var, $def, $max, $full, $str, $strhelp, $strval, $proc, $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, $proc, $from, $to, $cat, $extra, $startup), -SDTG_VAR = SDTG_VAR($name, $type, $flags, $guiflags, $var, $def, $min, $max, $interval, $str, $strhelp, $strval, $proc, $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), [validation] SDTG_VAR = static_assert($max <= MAX_$type, "Maximum value for $var exceeds storage size"); @@ -39,7 +39,6 @@ interval = 0 str = STR_NULL strhelp = STR_CONFIG_SETTING_NO_EXPLANATION_AVAILABLE_HELPTEXT strval = STR_NULL -proc = nullptr pre_cb = nullptr post_cb = nullptr load = nullptr diff --git a/src/table/settings.h.preamble b/src/table/settings.h.preamble index f5f7352440..3c8e6cb721 100644 --- a/src/table/settings.h.preamble +++ b/src/table/settings.h.preamble @@ -58,11 +58,11 @@ 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, proc, 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, proc) +#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_BOOL(name, flags, guiflags, var, def, str, strhelp, strval, proc, 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, proc) +#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_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) @@ -70,22 +70,22 @@ static size_t ConvertLandscape(const char *value); #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_OMANY(name, type, flags, guiflags, var, def, max, full, str, strhelp, strval, proc, 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, proc, full, nullptr) +#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_MMANY(name, type, flags, guiflags, var, def, full, str, strhelp, strval, proc, 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, proc, 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_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, proc, 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, proc) +#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_BOOL(base, var, flags, guiflags, def, str, strhelp, strval, proc, 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, proc) +#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_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) @@ -93,21 +93,21 @@ static size_t ConvertLandscape(const char *value); #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_OMANY(base, var, type, flags, guiflags, def, max, full, str, strhelp, strval, proc, 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, proc, full, load) +#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_MMANY(base, var, type, flags, guiflags, def, full, str, proc, 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, proc, full, nullptr) +#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_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, proc, from, to, cat, extra, startup)\ - SDTG_VAR(#var, type, flags, guiflags, _settings_client.var, def, min, max, interval, str, strhelp, strval, proc, from, to, cat, extra, startup) +#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_BOOL(var, flags, guiflags, def, str, strhelp, strval, proc, from, to, cat, extra, startup)\ - SDTG_BOOL(#var, flags, guiflags, _settings_client.var, def, str, strhelp, strval, proc, 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_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) @@ -115,5 +115,5 @@ static size_t ConvertLandscape(const char *value); #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_OMANY(var, type, flags, guiflags, def, max, full, str, strhelp, strval, proc, from, to, cat, extra, startup)\ - SDTG_OMANY(#var, type, flags, guiflags, _settings_client.var, def, max, full, str, strhelp, strval, proc, 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) diff --git a/src/table/settings.ini b/src/table/settings.ini index 1de905c5b4..2b6187087f 100644 --- a/src/table/settings.ini +++ b/src/table/settings.ini @@ -6,46 +6,34 @@ [pre-amble] /* Begin - Callback Functions for the various settings */ -static bool v_PositionMainToolbar(int32 p1); -static bool v_PositionStatusbar(int32 p1); -static bool PopulationInLabelActive(int32 p1); -static bool RedrawScreen(int32 p1); -static bool RedrawSmallmap(int32 p1); -static bool StationSpreadChanged(int32 p1); -static bool InvalidateBuildIndustryWindow(int32 p1); -static bool CloseSignalGUI(int32 p1); -static bool InvalidateTownViewWindow(int32 p1); -static bool DeleteSelectStationWindow(int32 p1); -static bool UpdateConsists(int32 p1); -static bool TrainAccelerationModelChanged(int32 p1); -static bool RoadVehAccelerationModelChanged(int32 p1); -static bool TrainSlopeSteepnessChanged(int32 p1); -static bool RoadVehSlopeSteepnessChanged(int32 p1); -static bool DragSignalsDensityChanged(int32); -static bool TownFoundingChanged(int32 p1); -static bool DifficultyNoiseChange(int32 i); -static bool MaxNoAIsChange(int32 i); -static bool CheckRoadSide(int p1); -static bool ChangeMaxHeightLevel(int32 p1); -static bool CheckFreeformEdges(int32 p1); -static bool ChangeDynamicEngines(int32 p1); -static bool StationCatchmentChanged(int32 p1); -static bool InvalidateVehTimetableWindow(int32 p1); -static bool InvalidateCompanyLiveryWindow(int32 p1); -static bool InvalidateNewGRFChangeWindows(int32 p1); -static bool InvalidateIndustryViewWindow(int32 p1); -static bool InvalidateAISettingsWindow(int32 p1); -static bool RedrawTownAuthority(int32 p1); -static bool InvalidateCompanyInfrastructureWindow(int32 p1); -static bool InvalidateCompanyWindow(int32 p1); -static bool ZoomMinMaxChanged(int32 p1); -static bool SpriteZoomMinChanged(int32 p1); -static bool MaxVehiclesChanged(int32 p1); -static bool InvalidateShipPathCache(int32 p1); +static void v_PositionMainToolbar(int32 new_value); +static void v_PositionStatusbar(int32 new_value); +static void RedrawSmallmap(int32 new_value); +static void StationSpreadChanged(int32 new_value); +static void CloseSignalGUI(int32 new_value); +static void UpdateConsists(int32 new_value); +static void TrainAccelerationModelChanged(int32 new_value); +static void RoadVehAccelerationModelChanged(int32 new_value); +static void TrainSlopeSteepnessChanged(int32 new_value); +static void RoadVehSlopeSteepnessChanged(int32 new_value); +static void TownFoundingChanged(int32 new_value); +static void DifficultyNoiseChange(int32 new_value); +static void MaxNoAIsChange(int32 new_value); +static bool CheckRoadSide(int32 &new_value); +static bool CheckMaxHeightLevel(int32 &new_value); +static bool CheckFreeformEdges(int32 &new_value); +static void UpdateFreeformEdges(int32 new_value); +static bool CheckDynamicEngines(int32 &new_value); +static void StationCatchmentChanged(int32 new_value); +static void InvalidateCompanyLiveryWindow(int32 new_value); +static void InvalidateNewGRFChangeWindows(int32 new_value); +static void ZoomMinMaxChanged(int32 new_value); +static void SpriteZoomMinChanged(int32 new_value); +static void MaxVehiclesChanged(int32 new_value); +static void InvalidateShipPathCache(int32 new_value); static bool ReplaceAsteriskWithEmptyPassword(std::string &newval); static void UpdateClientConfigValues(); -static bool UpdateClientConfigValues(int32 p1); /* End - Callback Functions for the various settings */ @@ -62,18 +50,18 @@ const SettingTable _settings{ [post-amble] }; [templates] -SDTG_BOOL = SDTG_BOOL($name, $flags, $guiflags, $var, $def, $str, $strhelp, $strval, $proc, $from, $to, $cat, $extra, $startup), -SDTG_VAR = SDTG_VAR($name, $type, $flags, $guiflags, $var, $def, $min, $max, $interval, $str, $strhelp, $strval, $proc, $from, $to, $cat, $extra, $startup), -SDTG_OMANY = SDTG_OMANY($name, $type, $flags, $guiflags, $var, $def, $max, $full, $str, $strhelp, $strval, $proc, $from, $to, $cat, $extra, $startup), -SDTC_BOOL = SDTC_BOOL( $var, $flags, $guiflags, $def, $str, $strhelp, $strval, $proc, $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_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, $proc, $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, $proc, $from, $to, $cat, $extra, $startup), -SDT_BOOL = SDT_BOOL($base, $var, $flags, $guiflags, $def, $str, $strhelp, $strval, $proc, $from, $to, $cat, $extra, $startup), -SDT_OMANY = SDT_OMANY($base, $var, $type, $flags, $guiflags, $def, $max, $full, $str, $strhelp, $strval, $proc, $from, $to, $load, $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($base, $var, $flags, $guiflags, $def, $str, $strhelp, $strval, $pre_cb, $post_cb, $from, $to, $cat, $extra, $startup), +SDT_OMANY = SDT_OMANY($base, $var, $type, $flags, $guiflags, $def, $max, $full, $str, $strhelp, $strval, $pre_cb, $post_cb, $from, $to, $load, $cat, $extra, $startup), SDT_SSTR = SDT_SSTR($base, $var, $type, $flags, $guiflags, $def, $pre_cb, $post_cb, $from, $to, $cat, $extra, $startup), -SDT_VAR = SDT_VAR($base, $var, $type, $flags, $guiflags, $def, $min, $max, $interval, $str, $strhelp, $strval, $proc, $from, $to, $cat, $extra, $startup), +SDT_VAR = SDT_VAR($base, $var, $type, $flags, $guiflags, $def, $min, $max, $interval, $str, $strhelp, $strval, $pre_cb, $post_cb, $from, $to, $cat, $extra, $startup), SDT_NULL = SDT_NULL($length, $from, $to), [validation] @@ -91,7 +79,6 @@ interval = 0 str = STR_NULL strhelp = STR_CONFIG_SETTING_NO_EXPLANATION_AVAILABLE_HELPTEXT strval = STR_NULL -proc = nullptr pre_cb = nullptr post_cb = nullptr load = nullptr @@ -114,7 +101,7 @@ def = 0 min = 0 max = MAX_COMPANIES - 1 interval = 1 -proc = MaxNoAIsChange +post_cb = MaxNoAIsChange cat = SC_BASIC [SDT_NULL] @@ -324,7 +311,7 @@ interval = 1 str = STR_CONFIG_SETTING_CITY_APPROVAL strhelp = STR_CONFIG_SETTING_CITY_APPROVAL_HELPTEXT strval = STR_CITY_APPROVAL_PERMISSIVE -proc = DifficultyNoiseChange +post_cb = DifficultyNoiseChange [SDTG_VAR] name = ""diff_level"" @@ -384,7 +371,7 @@ full = _roadsides str = STR_CONFIG_SETTING_ROAD_SIDE strhelp = STR_CONFIG_SETTING_ROAD_SIDE_HELPTEXT strval = STR_GAME_OPTIONS_ROAD_VEHICLES_DROPDOWN_LEFT -proc = CheckRoadSide +pre_cb = CheckRoadSide cat = SC_BASIC ; Construction @@ -402,7 +389,8 @@ interval = 1 str = STR_CONFIG_SETTING_MAP_HEIGHT_LIMIT strhelp = STR_CONFIG_SETTING_MAP_HEIGHT_LIMIT_HELPTEXT strval = STR_CONFIG_SETTING_MAP_HEIGHT_LIMIT_VALUE -proc = ChangeMaxHeightLevel +pre_cb = CheckMaxHeightLevel +post_cb = [](auto) { InvalidateWindowClassesData(WC_SMALLMAP, 2); } cat = SC_ADVANCED [SDT_VAR] @@ -578,7 +566,7 @@ max = 2 str = STR_CONFIG_SETTING_SIGNALSIDE strhelp = STR_CONFIG_SETTING_SIGNALSIDE_HELPTEXT strval = STR_CONFIG_SETTING_SIGNALSIDE_LEFT -proc = RedrawScreen +post_cb = [](auto) { MarkWholeScreenDirty(); } cat = SC_BASIC [SDT_BOOL] @@ -602,7 +590,7 @@ interval = 1 str = STR_CONFIG_SETTING_TOWN_LAYOUT strhelp = STR_CONFIG_SETTING_TOWN_LAYOUT_HELPTEXT strval = STR_CONFIG_SETTING_TOWN_LAYOUT_DEFAULT -proc = TownFoundingChanged +post_cb = TownFoundingChanged [SDT_BOOL] base = GameSettings @@ -626,7 +614,7 @@ interval = 1 str = STR_CONFIG_SETTING_TOWN_FOUNDING strhelp = STR_CONFIG_SETTING_TOWN_FOUNDING_HELPTEXT strval = STR_CONFIG_SETTING_TOWN_FOUNDING_FORBIDDEN -proc = TownFoundingChanged +post_cb = TownFoundingChanged cat = SC_BASIC [SDT_BOOL] @@ -822,7 +810,7 @@ interval = 1 str = STR_CONFIG_SETTING_TRAIN_ACCELERATION_MODEL strhelp = STR_CONFIG_SETTING_TRAIN_ACCELERATION_MODEL_HELPTEXT strval = STR_CONFIG_SETTING_ORIGINAL -proc = TrainAccelerationModelChanged +post_cb = TrainAccelerationModelChanged [SDT_VAR] base = GameSettings @@ -837,7 +825,7 @@ interval = 1 str = STR_CONFIG_SETTING_ROAD_VEHICLE_ACCELERATION_MODEL strhelp = STR_CONFIG_SETTING_ROAD_VEHICLE_ACCELERATION_MODEL_HELPTEXT strval = STR_CONFIG_SETTING_ORIGINAL -proc = RoadVehAccelerationModelChanged +post_cb = RoadVehAccelerationModelChanged [SDT_VAR] base = GameSettings @@ -851,7 +839,7 @@ interval = 1 str = STR_CONFIG_SETTING_TRAIN_SLOPE_STEEPNESS strhelp = STR_CONFIG_SETTING_TRAIN_SLOPE_STEEPNESS_HELPTEXT strval = STR_CONFIG_SETTING_PERCENTAGE -proc = TrainSlopeSteepnessChanged +post_cb = TrainSlopeSteepnessChanged cat = SC_EXPERT [SDT_VAR] @@ -866,7 +854,7 @@ interval = 1 str = STR_CONFIG_SETTING_ROAD_VEHICLE_SLOPE_STEEPNESS strhelp = STR_CONFIG_SETTING_ROAD_VEHICLE_SLOPE_STEEPNESS_HELPTEXT strval = STR_CONFIG_SETTING_PERCENTAGE -proc = RoadVehSlopeSteepnessChanged +post_cb = RoadVehSlopeSteepnessChanged cat = SC_EXPERT [SDT_BOOL] @@ -875,7 +863,7 @@ var = pf.forbid_90_deg def = false str = STR_CONFIG_SETTING_FORBID_90_DEG strhelp = STR_CONFIG_SETTING_FORBID_90_DEG_HELPTEXT -proc = InvalidateShipPathCache +post_cb = InvalidateShipPathCache cat = SC_EXPERT [SDT_VAR] @@ -998,7 +986,7 @@ interval = 1 str = STR_CONFIG_SETTING_PATHFINDER_FOR_SHIPS strhelp = STR_CONFIG_SETTING_PATHFINDER_FOR_SHIPS_HELPTEXT strval = STR_CONFIG_SETTING_PATHFINDER_NPF -proc = InvalidateShipPathCache +post_cb = InvalidateShipPathCache cat = SC_EXPERT [SDT_BOOL] @@ -1019,7 +1007,7 @@ max = 5000 str = STR_CONFIG_SETTING_MAX_TRAINS strhelp = STR_CONFIG_SETTING_MAX_TRAINS_HELPTEXT strval = STR_JUST_COMMA -proc = MaxVehiclesChanged +post_cb = MaxVehiclesChanged cat = SC_BASIC [SDT_VAR] @@ -1032,7 +1020,7 @@ max = 5000 str = STR_CONFIG_SETTING_MAX_ROAD_VEHICLES strhelp = STR_CONFIG_SETTING_MAX_ROAD_VEHICLES_HELPTEXT strval = STR_JUST_COMMA -proc = MaxVehiclesChanged +post_cb = MaxVehiclesChanged cat = SC_BASIC [SDT_VAR] @@ -1045,7 +1033,7 @@ max = 5000 str = STR_CONFIG_SETTING_MAX_AIRCRAFT strhelp = STR_CONFIG_SETTING_MAX_AIRCRAFT_HELPTEXT strval = STR_JUST_COMMA -proc = MaxVehiclesChanged +post_cb = MaxVehiclesChanged cat = SC_BASIC [SDT_VAR] @@ -1058,7 +1046,7 @@ max = 5000 str = STR_CONFIG_SETTING_MAX_SHIPS strhelp = STR_CONFIG_SETTING_MAX_SHIPS_HELPTEXT strval = STR_JUST_COMMA -proc = MaxVehiclesChanged +post_cb = MaxVehiclesChanged cat = SC_BASIC [SDTG_BOOL] @@ -1122,7 +1110,7 @@ guiflags = SGF_NO_NETWORK def = true str = STR_CONFIG_SETTING_WAGONSPEEDLIMITS strhelp = STR_CONFIG_SETTING_WAGONSPEEDLIMITS_HELPTEXT -proc = UpdateConsists +post_cb = UpdateConsists [SDT_BOOL] base = GameSettings @@ -1132,7 +1120,7 @@ guiflags = SGF_NO_NETWORK def = false str = STR_CONFIG_SETTING_DISABLE_ELRAILS strhelp = STR_CONFIG_SETTING_DISABLE_ELRAILS_HELPTEXT -proc = SettingsDisableElrail +post_cb = SettingsDisableElrail cat = SC_EXPERT [SDT_VAR] @@ -1148,7 +1136,7 @@ interval = 1 str = STR_CONFIG_SETTING_FREIGHT_TRAINS strhelp = STR_CONFIG_SETTING_FREIGHT_TRAINS_HELPTEXT strval = STR_JUST_COMMA -proc = UpdateConsists +post_cb = UpdateConsists ; order.timetabling [SDT_NULL] @@ -1175,7 +1163,7 @@ var = vehicle.dynamic_engines from = SLV_95 guiflags = SGF_NO_NETWORK def = true -proc = ChangeDynamicEngines +pre_cb = CheckDynamicEngines cat = SC_EXPERT [SDT_VAR] @@ -1238,7 +1226,7 @@ max = 64 str = STR_CONFIG_SETTING_STATION_SPREAD strhelp = STR_CONFIG_SETTING_STATION_SPREAD_HELPTEXT strval = STR_CONFIG_SETTING_TILE_LENGTH -proc = StationSpreadChanged +post_cb = StationSpreadChanged cat = SC_BASIC [SDT_BOOL] @@ -1255,7 +1243,7 @@ var = station.modified_catchment def = true str = STR_CONFIG_SETTING_CATCHMENT strhelp = STR_CONFIG_SETTING_CATCHMENT_HELPTEXT -proc = StationCatchmentChanged +post_cb = StationCatchmentChanged cat = SC_EXPERT [SDT_BOOL] @@ -1265,7 +1253,7 @@ def = true from = SLV_SERVE_NEUTRAL_INDUSTRIES str = STR_CONFIG_SETTING_SERVE_NEUTRAL_INDUSTRIES strhelp = STR_CONFIG_SETTING_SERVE_NEUTRAL_INDUSTRIES_HELPTEXT -proc = StationCatchmentChanged +post_cb = StationCatchmentChanged [SDT_BOOL] base = GameSettings @@ -1308,7 +1296,7 @@ guiflags = SGF_NO_NETWORK def = false str = STR_CONFIG_SETTING_NOISE_LEVEL strhelp = STR_CONFIG_SETTING_NOISE_LEVEL_HELPTEXT -proc = InvalidateTownViewWindow +post_cb = [](auto new_value) { InvalidateWindowClassesData(WC_TOWN_VIEW, new_value); } [SDT_BOOL] base = GameSettings @@ -1317,7 +1305,7 @@ from = SLV_106 def = true str = STR_CONFIG_SETTING_DISTANT_JOIN_STATIONS strhelp = STR_CONFIG_SETTING_DISTANT_JOIN_STATIONS_HELPTEXT -proc = DeleteSelectStationWindow +post_cb = [](auto) { DeleteWindowById(WC_SELECT_STATION, 0); } ## [SDT_BOOL] @@ -1340,7 +1328,7 @@ max = 2 str = STR_CONFIG_SETTING_RAW_INDUSTRY_CONSTRUCTION_METHOD strhelp = STR_CONFIG_SETTING_RAW_INDUSTRY_CONSTRUCTION_METHOD_HELPTEXT strval = STR_CONFIG_SETTING_RAW_INDUSTRY_CONSTRUCTION_METHOD_NONE -proc = InvalidateBuildIndustryWindow +post_cb = [](auto) { InvalidateWindowData(WC_BUILD_INDUSTRY, 0); } cat = SC_BASIC [SDT_VAR] @@ -1373,7 +1361,7 @@ var = economy.bribe def = true str = STR_CONFIG_SETTING_BRIBE strhelp = STR_CONFIG_SETTING_BRIBE_HELPTEXT -proc = RedrawTownAuthority +post_cb = [](auto) { SetWindowClassesDirty(WC_TOWN_AUTHORITY); } cat = SC_BASIC [SDT_BOOL] @@ -1383,7 +1371,7 @@ from = SLV_79 def = true str = STR_CONFIG_SETTING_ALLOW_EXCLUSIVE strhelp = STR_CONFIG_SETTING_ALLOW_EXCLUSIVE_HELPTEXT -proc = RedrawTownAuthority +post_cb = [](auto) { SetWindowClassesDirty(WC_TOWN_AUTHORITY); } cat = SC_BASIC [SDT_BOOL] @@ -1393,7 +1381,7 @@ from = SLV_165 def = true str = STR_CONFIG_SETTING_ALLOW_FUND_BUILDINGS strhelp = STR_CONFIG_SETTING_ALLOW_FUND_BUILDINGS_HELPTEXT -proc = RedrawTownAuthority +post_cb = [](auto) { SetWindowClassesDirty(WC_TOWN_AUTHORITY); } cat = SC_BASIC [SDT_BOOL] @@ -1403,7 +1391,7 @@ from = SLV_160 def = true str = STR_CONFIG_SETTING_ALLOW_FUND_ROAD strhelp = STR_CONFIG_SETTING_ALLOW_FUND_ROAD_HELPTEXT -proc = RedrawTownAuthority +post_cb = [](auto) { SetWindowClassesDirty(WC_TOWN_AUTHORITY); } cat = SC_BASIC [SDT_BOOL] @@ -1505,7 +1493,7 @@ max = ET_END - 1 str = STR_CONFIG_SETTING_ECONOMY_TYPE strhelp = STR_CONFIG_SETTING_ECONOMY_TYPE_HELPTEXT strval = STR_CONFIG_SETTING_ECONOMY_TYPE_ORIGINAL -proc = InvalidateIndustryViewWindow +post_cb = [](auto) { InvalidateWindowClassesData(WC_INDUSTRY_VIEW); } cat = SC_BASIC [SDT_BOOL] @@ -1514,7 +1502,7 @@ var = economy.allow_shares def = false str = STR_CONFIG_SETTING_ALLOW_SHARES strhelp = STR_CONFIG_SETTING_ALLOW_SHARES_HELPTEXT -proc = InvalidateCompanyWindow +post_cb = [](auto) { InvalidateWindowClassesData(WC_COMPANY); } [SDT_VAR] base = GameSettings @@ -1758,7 +1746,7 @@ from = SLV_166 def = false str = STR_CONFIG_SETTING_INFRASTRUCTURE_MAINTENANCE strhelp = STR_CONFIG_SETTING_INFRASTRUCTURE_MAINTENANCE_HELPTEXT -proc = InvalidateCompanyInfrastructureWindow +post_cb = [](auto) { InvalidateWindowClassesData(WC_COMPANY_INFRASTRUCTURE); } cat = SC_BASIC ## @@ -2427,7 +2415,8 @@ base = GameSettings var = construction.freeform_edges from = SLV_111 def = true -proc = CheckFreeformEdges +pre_cb = CheckFreeformEdges +post_cb = UpdateFreeformEdges cat = SC_EXPERT [SDT_VAR] @@ -2528,7 +2517,7 @@ flags = SLF_NO_NETWORK_SYNC def = 0 max = CURRENCY_END - 1 full = _locale_currencies -proc = RedrawScreen +post_cb = [](auto) { MarkWholeScreenDirty(); } cat = SC_BASIC [SDTG_OMANY] @@ -2541,7 +2530,7 @@ flags = SLF_NOT_IN_CONFIG def = 1 max = 2 full = _locale_units -proc = RedrawScreen +post_cb = [](auto) { MarkWholeScreenDirty(); } cat = SC_BASIC [SDT_OMANY] @@ -2554,7 +2543,7 @@ guiflags = SGF_MULTISTRING def = 1 max = 3 full = _locale_units -proc = RedrawScreen +post_cb = [](auto) { MarkWholeScreenDirty(); } cat = SC_BASIC str = STR_CONFIG_SETTING_LOCALISATION_UNITS_VELOCITY strhelp = STR_CONFIG_SETTING_LOCALISATION_UNITS_VELOCITY_HELPTEXT @@ -2570,7 +2559,7 @@ guiflags = SGF_MULTISTRING def = 1 max = 2 full = _locale_units -proc = RedrawScreen +post_cb = [](auto) { MarkWholeScreenDirty(); } cat = SC_BASIC str = STR_CONFIG_SETTING_LOCALISATION_UNITS_POWER strhelp = STR_CONFIG_SETTING_LOCALISATION_UNITS_POWER_HELPTEXT @@ -2586,7 +2575,7 @@ guiflags = SGF_MULTISTRING def = 1 max = 2 full = _locale_units -proc = RedrawScreen +post_cb = [](auto) { MarkWholeScreenDirty(); } cat = SC_BASIC str = STR_CONFIG_SETTING_LOCALISATION_UNITS_WEIGHT strhelp = STR_CONFIG_SETTING_LOCALISATION_UNITS_WEIGHT_HELPTEXT @@ -2602,7 +2591,7 @@ guiflags = SGF_MULTISTRING def = 1 max = 2 full = _locale_units -proc = RedrawScreen +post_cb = [](auto) { MarkWholeScreenDirty(); } cat = SC_BASIC str = STR_CONFIG_SETTING_LOCALISATION_UNITS_VOLUME strhelp = STR_CONFIG_SETTING_LOCALISATION_UNITS_VOLUME_HELPTEXT @@ -2618,7 +2607,7 @@ guiflags = SGF_MULTISTRING def = 2 max = 2 full = _locale_units -proc = RedrawScreen +post_cb = [](auto) { MarkWholeScreenDirty(); } cat = SC_BASIC str = STR_CONFIG_SETTING_LOCALISATION_UNITS_FORCE strhelp = STR_CONFIG_SETTING_LOCALISATION_UNITS_FORCE_HELPTEXT @@ -2634,7 +2623,7 @@ guiflags = SGF_MULTISTRING def = 1 max = 2 full = _locale_units -proc = RedrawScreen +post_cb = [](auto) { MarkWholeScreenDirty(); } cat = SC_BASIC str = STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT strhelp = STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT_HELPTEXT @@ -2811,7 +2800,7 @@ max = 2 str = STR_CONFIG_SETTING_TOOLBAR_POS strhelp = STR_CONFIG_SETTING_TOOLBAR_POS_HELPTEXT strval = STR_CONFIG_SETTING_HORIZONTAL_POS_LEFT -proc = v_PositionMainToolbar +post_cb = v_PositionMainToolbar cat = SC_BASIC [SDTC_VAR] @@ -2825,7 +2814,7 @@ max = 2 str = STR_CONFIG_SETTING_STATUSBAR_POS strhelp = STR_CONFIG_SETTING_STATUSBAR_POS_HELPTEXT strval = STR_CONFIG_SETTING_HORIZONTAL_POS_LEFT -proc = v_PositionStatusbar +post_cb = v_PositionStatusbar cat = SC_BASIC [SDTC_VAR] @@ -2866,7 +2855,7 @@ max = ZOOM_LVL_OUT_4X str = STR_CONFIG_SETTING_ZOOM_MIN strhelp = STR_CONFIG_SETTING_ZOOM_MIN_HELPTEXT strval = STR_CONFIG_SETTING_ZOOM_LVL_MIN -proc = ZoomMinMaxChanged +post_cb = ZoomMinMaxChanged startup = true [SDTC_VAR] @@ -2880,7 +2869,7 @@ max = ZOOM_LVL_MAX str = STR_CONFIG_SETTING_ZOOM_MAX strhelp = STR_CONFIG_SETTING_ZOOM_MAX_HELPTEXT strval = STR_CONFIG_SETTING_ZOOM_LVL_OUT_2X -proc = ZoomMinMaxChanged +post_cb = ZoomMinMaxChanged startup = true [SDTC_VAR] @@ -2894,7 +2883,7 @@ max = ZOOM_LVL_OUT_4X str = STR_CONFIG_SETTING_SPRITE_ZOOM_MIN strhelp = STR_CONFIG_SETTING_SPRITE_ZOOM_MIN_HELPTEXT strval = STR_CONFIG_SETTING_SPRITE_ZOOM_LVL_MIN -proc = SpriteZoomMinChanged +post_cb = SpriteZoomMinChanged [SDTC_BOOL] var = gui.population_in_label @@ -2902,7 +2891,7 @@ flags = SLF_NOT_IN_SAVE | SLF_NO_NETWORK_SYNC def = true str = STR_CONFIG_SETTING_POPULATION_IN_LABEL strhelp = STR_CONFIG_SETTING_POPULATION_IN_LABEL_HELPTEXT -proc = PopulationInLabelActive +post_cb = [](auto) { UpdateAllTownVirtCoords(); } [SDTC_BOOL] var = gui.link_terraform_toolbar @@ -2922,7 +2911,7 @@ max = 2 str = STR_CONFIG_SETTING_SMALLMAP_LAND_COLOUR strhelp = STR_CONFIG_SETTING_SMALLMAP_LAND_COLOUR_HELPTEXT strval = STR_CONFIG_SETTING_SMALLMAP_LAND_COLOUR_GREEN -proc = RedrawSmallmap +post_cb = RedrawSmallmap [SDTC_VAR] var = gui.liveries @@ -2935,7 +2924,7 @@ max = 2 str = STR_CONFIG_SETTING_LIVERIES strhelp = STR_CONFIG_SETTING_LIVERIES_HELPTEXT strval = STR_CONFIG_SETTING_LIVERIES_NONE -proc = InvalidateCompanyLiveryWindow +post_cb = InvalidateCompanyLiveryWindow [SDTC_VAR] var = gui.starting_colour @@ -3017,7 +3006,7 @@ flags = SLF_NOT_IN_SAVE | SLF_NO_NETWORK_SYNC def = false str = STR_CONFIG_SETTING_TIMETABLE_IN_TICKS strhelp = STR_CONFIG_SETTING_TIMETABLE_IN_TICKS_HELPTEXT -proc = InvalidateVehTimetableWindow +post_cb = [](auto) { InvalidateWindowClassesData(WC_VEHICLE_TIMETABLE, VIWD_MODIFY_ORDERS); } cat = SC_EXPERT [SDTC_BOOL] @@ -3026,7 +3015,7 @@ flags = SLF_NOT_IN_SAVE | SLF_NO_NETWORK_SYNC def = true str = STR_CONFIG_SETTING_TIMETABLE_SHOW_ARRIVAL_DEPARTURE strhelp = STR_CONFIG_SETTING_TIMETABLE_SHOW_ARRIVAL_DEPARTURE_HELPTEXT -proc = InvalidateVehTimetableWindow +post_cb = [](auto) { InvalidateWindowClassesData(WC_VEHICLE_TIMETABLE, VIWD_MODIFY_ORDERS); } [SDTC_BOOL] var = gui.quick_goto @@ -3047,7 +3036,7 @@ max = 2 str = STR_CONFIG_SETTING_LOADING_INDICATORS strhelp = STR_CONFIG_SETTING_LOADING_INDICATORS_HELPTEXT strval = STR_CONFIG_SETTING_COMPANIES_OFF -proc = RedrawScreen +post_cb = [](auto) { MarkWholeScreenDirty(); } cat = SC_BASIC [SDTC_VAR] @@ -3069,7 +3058,7 @@ flags = SLF_NOT_IN_SAVE | SLF_NO_NETWORK_SYNC def = true str = STR_CONFIG_SETTING_ENABLE_SIGNAL_GUI strhelp = STR_CONFIG_SETTING_ENABLE_SIGNAL_GUI_HELPTEXT -proc = CloseSignalGUI +post_cb = CloseSignalGUI cat = SC_EXPERT [SDTC_VAR] @@ -3095,7 +3084,7 @@ max = 20 str = STR_CONFIG_SETTING_DRAG_SIGNALS_DENSITY strhelp = STR_CONFIG_SETTING_DRAG_SIGNALS_DENSITY_HELPTEXT strval = STR_CONFIG_SETTING_DRAG_SIGNALS_DENSITY_VALUE -proc = DragSignalsDensityChanged +post_cb = [](auto) { InvalidateWindowData(WC_BUILD_SIGNAL, 0); } cat = SC_BASIC [SDTC_BOOL] @@ -3117,7 +3106,7 @@ interval = 1 str = STR_CONFIG_SETTING_SEMAPHORE_BUILD_BEFORE_DATE strhelp = STR_CONFIG_SETTING_SEMAPHORE_BUILD_BEFORE_DATE_HELPTEXT strval = STR_JUST_INT -proc = ResetSignalVariant +post_cb = ResetSignalVariant [SDTC_BOOL] var = gui.vehicle_income_warn @@ -3213,7 +3202,7 @@ flags = SLF_NOT_IN_SAVE | SLF_NO_NETWORK_SYNC def = true str = STR_CONFIG_SETTING_SHOW_TRACK_RESERVATION strhelp = STR_CONFIG_SETTING_SHOW_TRACK_RESERVATION_HELPTEXT -proc = RedrawScreen +post_cb = [](auto) { MarkWholeScreenDirty(); } cat = SC_BASIC [SDTC_VAR] @@ -3286,7 +3275,7 @@ flags = SLF_NOT_IN_SAVE | SLF_NO_NETWORK_SYNC def = true str = STR_CONFIG_SETTING_EXPENSES_LAYOUT strhelp = STR_CONFIG_SETTING_EXPENSES_LAYOUT_HELPTEXT -proc = RedrawScreen +post_cb = [](auto) { MarkWholeScreenDirty(); } [SDTC_VAR] var = gui.station_gui_group_order @@ -3334,7 +3323,7 @@ max = 5 str = STR_CONFIG_SETTING_GRAPH_LINE_THICKNESS strhelp = STR_CONFIG_SETTING_GRAPH_LINE_THICKNESS_HELPTEXT strval = STR_JUST_COMMA -proc = RedrawScreen +post_cb = [](auto) { MarkWholeScreenDirty(); } [SDTC_BOOL] var = gui.show_newgrf_name @@ -3342,7 +3331,7 @@ flags = SLF_NOT_IN_SAVE | SLF_NO_NETWORK_SYNC def = false str = STR_CONFIG_SETTING_SHOW_NEWGRF_NAME strhelp = STR_CONFIG_SETTING_SHOW_NEWGRF_NAME_HELPTEXT -proc = RedrawScreen +post_cb = [](auto) { MarkWholeScreenDirty(); } cat = SC_ADVANCED ; For the dedicated build we'll enable dates in logs by default. @@ -3379,21 +3368,21 @@ cat = SC_EXPERT var = gui.newgrf_developer_tools flags = SLF_NOT_IN_SAVE | SLF_NO_NETWORK_SYNC def = false -proc = InvalidateNewGRFChangeWindows +post_cb = InvalidateNewGRFChangeWindows cat = SC_EXPERT [SDTC_BOOL] var = gui.ai_developer_tools flags = SLF_NOT_IN_SAVE | SLF_NO_NETWORK_SYNC def = false -proc = InvalidateAISettingsWindow +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 def = false -proc = InvalidateNewGRFChangeWindows +post_cb = InvalidateNewGRFChangeWindows [SDTC_BOOL] var = gui.newgrf_show_old_versions @@ -3409,7 +3398,7 @@ guiflags = SGF_MULTISTRING def = 1 min = 0 max = 1 -proc = UpdateNewGRFConfigPalette +post_cb = UpdateNewGRFConfigPalette cat = SC_EXPERT [SDTC_VAR] @@ -4029,7 +4018,7 @@ guiflags = SGF_NETWORK_ONLY def = 15 min = 1 max = MAX_COMPANIES -proc = UpdateClientConfigValues +post_cb = [](auto) { UpdateClientConfigValues(); } cat = SC_BASIC [SDTC_VAR] @@ -4040,7 +4029,7 @@ guiflags = SGF_NETWORK_ONLY def = 25 min = 2 max = MAX_CLIENTS -proc = UpdateClientConfigValues +post_cb = [](auto) { UpdateClientConfigValues(); } cat = SC_BASIC [SDTC_VAR] @@ -4051,7 +4040,7 @@ guiflags = SGF_NETWORK_ONLY def = 15 min = 0 max = MAX_CLIENTS -proc = UpdateClientConfigValues +post_cb = [](auto) { UpdateClientConfigValues(); } cat = SC_BASIC [SDTC_VAR] diff --git a/src/table/win32_settings.ini b/src/table/win32_settings.ini index 669474cc74..6b7d5276d8 100644 --- a/src/table/win32_settings.ini +++ b/src/table/win32_settings.ini @@ -14,8 +14,8 @@ static const SettingTable _win32_settings{ }; #endif /* _WIN32 */ [templates] -SDTG_BOOL = SDTG_BOOL($name, $flags, $guiflags, $var, $def, $str, $strhelp, $strval, $proc, $from, $to, $cat, $extra, $startup), -SDTG_VAR = SDTG_VAR($name, $type, $flags, $guiflags, $var, $def, $min, $max, $interval, $str, $strhelp, $strval, $proc, $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), [validation] SDTG_VAR = static_assert($max <= MAX_$type, "Maximum value for $var exceeds storage size"); @@ -27,7 +27,8 @@ interval = 0 str = STR_NULL strhelp = STR_CONFIG_SETTING_NO_EXPLANATION_AVAILABLE_HELPTEXT strval = STR_NULL -proc = nullptr +pre_cb = nullptr +post_cb = nullptr load = nullptr from = SL_MIN_VERSION to = SL_MAX_VERSION diff --git a/src/table/window_settings.ini b/src/table/window_settings.ini index 5e11ea002a..5334b0fc1d 100644 --- a/src/table/window_settings.ini +++ b/src/table/window_settings.ini @@ -10,8 +10,8 @@ static const SettingTable _window_settings{ [post-amble] }; [templates] -SDT_BOOL = SDT_BOOL($base, $var, $flags, $guiflags, $def, $str, $strhelp, $strval, $proc, $from, $to, $cat, $extra, $startup), -SDT_VAR = SDT_VAR($base, $var, $type, $flags, $guiflags, $def, $min, $max, $interval, $str, $strhelp, $strval, $proc, $from, $to, $cat, $extra, $startup), +SDT_BOOL = SDT_BOOL($base, $var, $flags, $guiflags, $def, $str, $strhelp, $strval, $pre_cb, $post_cb, $from, $to, $cat, $extra, $startup), +SDT_VAR = SDT_VAR($base, $var, $type, $flags, $guiflags, $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 $base.$var exceeds storage size"); @@ -24,7 +24,8 @@ interval = 0 str = STR_NULL strhelp = STR_CONFIG_SETTING_NO_EXPLANATION_AVAILABLE_HELPTEXT strval = STR_NULL -proc = nullptr +pre_cb = nullptr +post_cb = nullptr load = nullptr from = SL_MIN_VERSION to = SL_MAX_VERSION From 4144e949edf3b14c2d478aa0fcba1996942a03fa Mon Sep 17 00:00:00 2001 From: rubidium42 Date: Mon, 24 May 2021 12:13:54 +0200 Subject: [PATCH 08/10] Fix: [Network] Prevent an empty server name to be set anywhere --- src/lang/english.txt | 1 + src/network/network.cpp | 25 +++++++++++++++++++++---- src/network/network_func.h | 1 + src/network/network_gui.cpp | 21 ++++++++++++--------- src/table/settings.ini | 1 + 5 files changed, 36 insertions(+), 13 deletions(-) diff --git a/src/lang/english.txt b/src/lang/english.txt index db74c230bd..4a92eba893 100644 --- a/src/lang/english.txt +++ b/src/lang/english.txt @@ -2204,6 +2204,7 @@ STR_NETWORK_ERROR_CLIENT_START :{WHITE}Could no STR_NETWORK_ERROR_TIMEOUT :{WHITE}Connection #{NUM} timed out STR_NETWORK_ERROR_SERVER_ERROR :{WHITE}A protocol error was detected and the connection was closed STR_NETWORK_ERROR_BAD_PLAYER_NAME :{WHITE}Your player name has not been set. The name can be set at the top of the Multiplayer window +STR_NETWORK_ERROR_BAD_SERVER_NAME :{WHITE}Your server name has not been set. The name can be set at the top of the Multiplayer window STR_NETWORK_ERROR_WRONG_REVISION :{WHITE}The revision of this client does not match the server's revision STR_NETWORK_ERROR_WRONG_PASSWORD :{WHITE}Wrong password STR_NETWORK_ERROR_SERVER_FULL :{WHITE}The server is full diff --git a/src/network/network.cpp b/src/network/network.cpp index 53ef645d7b..94a5539f0e 100644 --- a/src/network/network.cpp +++ b/src/network/network.cpp @@ -835,10 +835,6 @@ void NetworkClientJoinGame() static void NetworkInitGameInfo() { - if (_settings_client.network.server_name.empty()) { - _settings_client.network.server_name = "Unnamed Server"; - } - FillStaticNetworkServerGameInfo(); /* The server is a client too */ _network_game_info.clients_on = _network_dedicated ? 0 : 1; @@ -851,6 +847,25 @@ static void NetworkInitGameInfo() ci->client_name = _settings_client.network.client_name; } +/** + * Trim the given server name in place, i.e. remove leading and trailing spaces. + * After the trim check whether the server name is not empty. + * When the server name is empty a GUI error message is shown telling the + * user to set the servername and this function returns false. + * + * @param server_name The server name to validate. It will be trimmed of leading + * and trailing spaces. + * @return True iff the server name is valid. + */ +bool NetworkValidateServerName(std::string &server_name) +{ + StrTrimInPlace(server_name); + if (!server_name.empty()) return true; + + ShowErrorMessage(STR_NETWORK_ERROR_BAD_SERVER_NAME, INVALID_STRING_ID, WL_ERROR); + return false; +} + /** * Check whether the client and server name are set, for a dedicated server and if not set them to some default * value and tell the user to change this as soon as possible. @@ -860,12 +875,14 @@ static void NetworkInitGameInfo() static void CheckClientAndServerName() { static const std::string fallback_client_name = "Unnamed Client"; + StrTrimInPlace(_settings_client.network.client_name); if (_settings_client.network.client_name.empty() || _settings_client.network.client_name.compare(fallback_client_name) == 0) { DEBUG(net, 1, "No \"client_name\" has been set, using \"%s\" instead. Please set this now using the \"name \" command", fallback_client_name.c_str()); _settings_client.network.client_name = fallback_client_name; } static const std::string fallback_server_name = "Unnamed Server"; + StrTrimInPlace(_settings_client.network.server_name); if (_settings_client.network.server_name.empty() || _settings_client.network.server_name.compare(fallback_server_name) == 0) { DEBUG(net, 1, "No \"server_name\" has been set, using \"%s\" instead. Please set this now using the \"server_name \" command", fallback_server_name.c_str()); _settings_client.network.server_name = fallback_server_name; diff --git a/src/network/network_func.h b/src/network/network_func.h index fbae8daf76..d30616fd0a 100644 --- a/src/network/network_func.h +++ b/src/network/network_func.h @@ -38,6 +38,7 @@ byte NetworkSpectatorCount(); bool NetworkIsValidClientName(const std::string_view client_name); bool NetworkValidateClientName(); bool NetworkValidateClientName(std::string &client_name); +bool NetworkValidateServerName(std::string &server_name); void NetworkUpdateClientName(const std::string &client_name); bool NetworkCompanyHasClients(CompanyID company); std::string NetworkChangeCompanyPassword(CompanyID company_id, std::string password); diff --git a/src/network/network_gui.cpp b/src/network/network_gui.cpp index 6df77cd083..d06ff27be4 100644 --- a/src/network/network_gui.cpp +++ b/src/network/network_gui.cpp @@ -1095,6 +1095,7 @@ struct NetworkStartServerWindow : public Window { break; case WID_NSS_GENERATE_GAME: // Start game + if (!CheckServerName()) return; _is_network_server = true; if (_ctrl_pressed) { StartNewGameWithoutGUI(GENERATE_NEW_SEED); @@ -1104,16 +1105,19 @@ struct NetworkStartServerWindow : public Window { break; case WID_NSS_LOAD_GAME: + if (!CheckServerName()) return; _is_network_server = true; ShowSaveLoadDialog(FT_SAVEGAME, SLO_LOAD); break; case WID_NSS_PLAY_SCENARIO: + if (!CheckServerName()) return; _is_network_server = true; ShowSaveLoadDialog(FT_SCENARIO, SLO_LOAD); break; case WID_NSS_PLAY_HEIGHTMAP: + if (!CheckServerName()) return; _is_network_server = true; ShowSaveLoadDialog(FT_HEIGHTMAP,SLO_LOAD); break; @@ -1133,11 +1137,13 @@ struct NetworkStartServerWindow : public Window { this->SetDirty(); } - void OnEditboxChanged(int wid) override + bool CheckServerName() { - if (wid == WID_NSS_GAMENAME) { - _settings_client.network.server_name = this->name_editbox.text.buf; - } + std::string str = this->name_editbox.text.buf; + if (!NetworkValidateServerName(str)) return false; + + SetSettingValue(GetSettingFromName("network.server_name")->AsStringSetting(), str); + return true; } void OnTimeout() override @@ -2199,16 +2205,13 @@ public: case WID_CL_SERVER_NAME_EDIT: { if (!_network_server) break; - SetSettingValue(GetSettingFromName("network.server_name")->AsStringSetting(), StrEmpty(str) ? "Unnamed Server" : str); + SetSettingValue(GetSettingFromName("network.server_name")->AsStringSetting(), str); this->InvalidateData(); break; } case WID_CL_CLIENT_NAME_EDIT: { - std::string client_name(str); - if (!NetworkValidateClientName(client_name)) break; - - SetSettingValue(GetSettingFromName("network.client_name")->AsStringSetting(), client_name); + SetSettingValue(GetSettingFromName("network.client_name")->AsStringSetting(), str); this->InvalidateData(); break; } diff --git a/src/table/settings.ini b/src/table/settings.ini index 2b6187087f..6a2cb5b14a 100644 --- a/src/table/settings.ini +++ b/src/table/settings.ini @@ -3959,6 +3959,7 @@ length = NETWORK_NAME_LENGTH flags = SLF_NOT_IN_SAVE | SLF_NO_NETWORK_SYNC guiflags = SGF_NETWORK_ONLY def = nullptr +pre_cb = NetworkValidateServerName post_cb = [](auto) { UpdateClientConfigValues(); } cat = SC_BASIC From 4c0e083128a4e9c3eefefaab70648057bd1d9fb2 Mon Sep 17 00:00:00 2001 From: rubidium42 Date: Sat, 29 May 2021 09:12:11 +0200 Subject: [PATCH 09/10] Cleanup: set the base in the setting templates, instead of defining the base for every setting This has the added benefit of not getting mistaken that multiple bases can be used for the same SettingTable --- src/table/company_settings.ini | 15 +- src/table/currency_settings.ini | 11 +- src/table/gameopt_settings.ini | 23 ++- src/table/settings.ini | 243 ++------------------------------ src/table/window_settings.ini | 7 +- 5 files changed, 33 insertions(+), 266 deletions(-) diff --git a/src/table/company_settings.ini b/src/table/company_settings.ini index 019c26dd9c..bb104adebf 100644 --- a/src/table/company_settings.ini +++ b/src/table/company_settings.ini @@ -13,11 +13,11 @@ static const SettingTable _company_settings{ [post-amble] }; [templates] -SDT_BOOL = SDT_BOOL($base, $var, $flags, $guiflags, $def, $str, $strhelp, $strval, $pre_cb, $post_cb, $from, $to, $cat, $extra, $startup), -SDT_VAR = SDT_VAR($base, $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, $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), [validation] -SDT_VAR = static_assert($max <= MAX_$type, "Maximum value for $base.$var exceeds storage size"); +SDT_VAR = static_assert($max <= MAX_$type, "Maximum value for CompanySettings.$var exceeds storage size"); [defaults] flags = 0 @@ -38,7 +38,6 @@ startup = false [SDT_BOOL] -base = CompanySettings var = engine_renew def = true str = STR_CONFIG_SETTING_AUTORENEW_VEHICLE @@ -46,7 +45,6 @@ strhelp = STR_CONFIG_SETTING_AUTORENEW_VEHICLE_HELPTEXT cat = SC_BASIC [SDT_VAR] -base = CompanySettings var = engine_renew_months type = SLE_INT16 guiflags = SGF_PER_COMPANY | SGF_DISPLAY_ABS @@ -58,7 +56,6 @@ strhelp = STR_CONFIG_SETTING_AUTORENEW_MONTHS_HELPTEXT strval = STR_CONFIG_SETTING_AUTORENEW_MONTHS_VALUE_BEFORE [SDT_VAR] -base = CompanySettings var = engine_renew_money type = SLE_UINT guiflags = SGF_PER_COMPANY | SGF_CURRENCY @@ -70,12 +67,10 @@ strhelp = STR_CONFIG_SETTING_AUTORENEW_MONEY_HELPTEXT strval = STR_JUST_CURRENCY_LONG [SDT_BOOL] -base = CompanySettings var = renew_keep_length def = false [SDT_BOOL] -base = CompanySettings var = vehicle.servint_ispercent def = false str = STR_CONFIG_SETTING_SERVINT_ISPERCENT @@ -83,7 +78,6 @@ strhelp = STR_CONFIG_SETTING_SERVINT_ISPERCENT_HELPTEXT post_cb = UpdateServiceInterval [SDT_VAR] -base = CompanySettings var = vehicle.servint_trains type = SLE_UINT16 guiflags = SGF_PER_COMPANY | SGF_0ISDISABLED @@ -97,7 +91,6 @@ pre_cb = [](auto new_value) { return CanUpdateServiceInterval(VEH_TRAIN, new_v post_cb = [](auto new_value) { UpdateServiceInterval(VEH_TRAIN, new_value); } [SDT_VAR] -base = CompanySettings var = vehicle.servint_roadveh type = SLE_UINT16 guiflags = SGF_PER_COMPANY | SGF_0ISDISABLED @@ -111,7 +104,6 @@ pre_cb = [](auto new_value) { return CanUpdateServiceInterval(VEH_ROAD, new_va post_cb = [](auto new_value) { UpdateServiceInterval(VEH_ROAD, new_value); } [SDT_VAR] -base = CompanySettings var = vehicle.servint_ships type = SLE_UINT16 guiflags = SGF_PER_COMPANY | SGF_0ISDISABLED @@ -125,7 +117,6 @@ pre_cb = [](auto new_value) { return CanUpdateServiceInterval(VEH_SHIP, new_va post_cb = [](auto new_value) { UpdateServiceInterval(VEH_SHIP, new_value); } [SDT_VAR] -base = CompanySettings var = vehicle.servint_aircraft type = SLE_UINT16 guiflags = SGF_PER_COMPANY | SGF_0ISDISABLED diff --git a/src/table/currency_settings.ini b/src/table/currency_settings.ini index 449bbee983..ce0213758d 100644 --- a/src/table/currency_settings.ini +++ b/src/table/currency_settings.ini @@ -9,11 +9,11 @@ static const SettingTable _currency_settings{ [post-amble] }; [templates] -SDT_VAR = SDT_VAR ($base, $var, $type, $flags, $guiflags, $def, $min, $max, $interval, $str, $strhelp, $strval, $pre_cb, $post_cb, $from, $to, $cat, $extra, $startup), -SDT_SSTR = SDT_SSTR($base, $var, $type, $flags, $guiflags, $def, $pre_cb, $post_cb, $from, $to, $cat, $extra, $startup), +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), [validation] -SDT_VAR = static_assert($max <= MAX_$type, "Maximum value for $base.$var exceeds storage size"); +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 @@ -34,7 +34,6 @@ startup = false [SDT_VAR] -base = CurrencySpec var = rate type = SLE_UINT16 def = 1 @@ -42,14 +41,12 @@ min = 0 max = UINT16_MAX [SDT_SSTR] -base = CurrencySpec var = separator type = SLE_STRQ def = ""."" cat = SC_BASIC [SDT_VAR] -base = CurrencySpec var = to_euro type = SLE_INT32 def = 0 @@ -57,13 +54,11 @@ min = MIN_YEAR max = MAX_YEAR [SDT_SSTR] -base = CurrencySpec var = prefix type = SLE_STRQ def = nullptr [SDT_SSTR] -base = CurrencySpec var = suffix type = SLE_STRQ def = "" credits"" diff --git a/src/table/gameopt_settings.ini b/src/table/gameopt_settings.ini index 131833a415..b3b7ec6510 100644 --- a/src/table/gameopt_settings.ini +++ b/src/table/gameopt_settings.ini @@ -36,20 +36,20 @@ 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), -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($base, $var, $type, $flags, $guiflags, $def, $max, $full, $str, $strhelp, $strval, $pre_cb, $post_cb, $from, $to, $load, $cat, $extra, $startup), -SDT_VAR = SDT_VAR($base, $var, $type, $flags, $guiflags, $def, $min, $max, $interval, $str, $strhelp, $strval, $pre_cb, $post_cb, $from, $to, $cat, $extra, $startup), +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), +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), [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"); SDTC_OMANY = static_assert($max <= MAX_$type, "Maximum value for $var exceeds storage size"); -SDT_OMANY = static_assert($max <= MAX_$type, "Maximum value for $base.$var exceeds storage size"); -SDT_VAR = static_assert($max <= MAX_$type, "Maximum value for $base.$var exceeds storage size"); +SDT_OMANY = static_assert($max <= MAX_$type, "Maximum value for GameSettings.$var exceeds storage size"); +SDT_VAR = static_assert($max <= MAX_$type, "Maximum value for GameSettings.$var exceeds storage size"); [defaults] flags = 0 @@ -104,7 +104,6 @@ max = SP_CUSTOM cat = SC_BASIC [SDT_OMANY] -base = GameSettings var = locale.currency type = SLE_UINT8 flags = SLF_NO_NETWORK_SYNC @@ -126,7 +125,6 @@ cat = SC_BASIC # There are only 21 predefined town_name values (0-20), but you can have more with newgrf action F so allow # these bigger values (21-255). Invalid values will fallback to english on use and (undefined string) in GUI. [SDT_OMANY] -base = GameSettings var = game_creation.town_name type = SLE_UINT8 def = 0 @@ -135,7 +133,6 @@ full = _town_names cat = SC_BASIC [SDT_OMANY] -base = GameSettings var = game_creation.landscape type = SLE_UINT8 def = 0 @@ -145,7 +142,6 @@ load = ConvertLandscape cat = SC_BASIC [SDT_VAR] -base = GameSettings var = game_creation.snow_line_height type = SLE_UINT8 def = DEF_SNOWLINE_HEIGHT * TILE_HEIGHT @@ -174,7 +170,6 @@ full = _autosave_interval cat = SC_BASIC [SDT_OMANY] -base = GameSettings var = vehicle.road_side type = SLE_UINT8 def = 1 diff --git a/src/table/settings.ini b/src/table/settings.ini index 6a2cb5b14a..3c22ec4c18 100644 --- a/src/table/settings.ini +++ b/src/table/settings.ini @@ -50,27 +50,27 @@ 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($base, $var, $flags, $guiflags, $def, $str, $strhelp, $strval, $pre_cb, $post_cb, $from, $to, $cat, $extra, $startup), -SDT_OMANY = SDT_OMANY($base, $var, $type, $flags, $guiflags, $def, $max, $full, $str, $strhelp, $strval, $pre_cb, $post_cb, $from, $to, $load, $cat, $extra, $startup), -SDT_SSTR = SDT_SSTR($base, $var, $type, $flags, $guiflags, $def, $pre_cb, $post_cb, $from, $to, $cat, $extra, $startup), -SDT_VAR = SDT_VAR($base, $var, $type, $flags, $guiflags, $def, $min, $max, $interval, $str, $strhelp, $strval, $pre_cb, $post_cb, $from, $to, $cat, $extra, $startup), -SDT_NULL = SDT_NULL($length, $from, $to), +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), +SDT_NULL = SDT_NULL( $length, $from, $to), [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"); SDTC_OMANY = static_assert($max <= MAX_$type, "Maximum value for $var exceeds storage size"); SDTC_VAR = static_assert($max <= MAX_$type, "Maximum value for $var exceeds storage size"); -SDT_OMANY = static_assert($max <= MAX_$type, "Maximum value for $base.$var exceeds storage size"); -SDT_VAR = static_assert($max <= MAX_$type, "Maximum value for $base.$var exceeds storage size"); +SDT_OMANY = static_assert($max <= MAX_$type, "Maximum value for GameSettings.$var exceeds storage size"); +SDT_VAR = static_assert($max <= MAX_$type, "Maximum value for GameSettings.$var exceeds storage size"); [defaults] flags = 0 @@ -93,7 +93,6 @@ startup = false ; Saved settings variables. ; Do not ADD or REMOVE something in this "difficulty.XXX" table or before it. It breaks savegame compatibility. [SDT_VAR] -base = GameSettings var = difficulty.max_no_competitors type = SLE_UINT8 from = SLV_97 @@ -110,7 +109,6 @@ from = SLV_97 to = SLV_110 [SDT_VAR] -base = GameSettings var = difficulty.number_towns type = SLE_UINT8 from = SLV_97 @@ -123,7 +121,6 @@ strval = STR_NUM_VERY_LOW cat = SC_BASIC [SDT_VAR] -base = GameSettings var = difficulty.industry_density type = SLE_UINT8 from = SLV_97 @@ -138,7 +135,6 @@ strval = STR_FUNDING_ONLY cat = SC_BASIC [SDT_VAR] -base = GameSettings var = difficulty.max_loan type = SLE_UINT32 from = SLV_97 @@ -153,7 +149,6 @@ strval = STR_JUST_CURRENCY_LONG cat = SC_BASIC [SDT_VAR] -base = GameSettings var = difficulty.initial_interest type = SLE_UINT8 from = SLV_97 @@ -167,7 +162,6 @@ strhelp = STR_CONFIG_SETTING_INTEREST_RATE_HELPTEXT strval = STR_CONFIG_SETTING_PERCENTAGE [SDT_VAR] -base = GameSettings var = difficulty.vehicle_costs type = SLE_UINT8 from = SLV_97 @@ -182,7 +176,6 @@ strval = STR_SEA_LEVEL_LOW cat = SC_BASIC [SDT_VAR] -base = GameSettings var = difficulty.competitor_speed type = SLE_UINT8 from = SLV_97 @@ -202,7 +195,6 @@ from = SLV_97 to = SLV_110 [SDT_VAR] -base = GameSettings var = difficulty.vehicle_breakdowns type = SLE_UINT8 from = SLV_97 @@ -217,7 +209,6 @@ strval = STR_DISASTER_NONE cat = SC_BASIC [SDT_VAR] -base = GameSettings var = difficulty.subsidy_multiplier type = SLE_UINT8 from = SLV_97 @@ -231,7 +222,6 @@ strhelp = STR_CONFIG_SETTING_SUBSIDY_MULTIPLIER_HELPTEXT strval = STR_SUBSIDY_X1_5 [SDT_VAR] -base = GameSettings var = difficulty.construction_cost type = SLE_UINT8 from = SLV_97 @@ -246,7 +236,6 @@ strval = STR_SEA_LEVEL_LOW cat = SC_BASIC [SDT_VAR] -base = GameSettings var = difficulty.terrain_type type = SLE_UINT8 from = SLV_97 @@ -261,7 +250,6 @@ strval = STR_TERRAIN_TYPE_VERY_FLAT cat = SC_BASIC [SDT_VAR] -base = GameSettings var = difficulty.quantity_sea_lakes type = SLE_UINT8 from = SLV_97 @@ -274,7 +262,6 @@ strval = STR_SEA_LEVEL_VERY_LOW cat = SC_BASIC [SDT_BOOL] -base = GameSettings var = difficulty.economy from = SLV_97 def = false @@ -282,7 +269,6 @@ str = STR_CONFIG_SETTING_RECESSIONS strhelp = STR_CONFIG_SETTING_RECESSIONS_HELPTEXT [SDT_BOOL] -base = GameSettings var = difficulty.line_reverse_mode from = SLV_97 def = false @@ -290,7 +276,6 @@ str = STR_CONFIG_SETTING_TRAIN_REVERSING strhelp = STR_CONFIG_SETTING_TRAIN_REVERSING_HELPTEXT [SDT_BOOL] -base = GameSettings var = difficulty.disasters from = SLV_97 def = false @@ -299,7 +284,6 @@ strhelp = STR_CONFIG_SETTING_DISASTERS_HELPTEXT cat = SC_BASIC [SDT_VAR] -base = GameSettings var = difficulty.town_council_tolerance type = SLE_UINT8 from = SLV_97 @@ -328,7 +312,6 @@ cat = SC_BASIC ; There are only 21 predefined town_name values (0-20), but you can have more with newgrf action F so allow ; these bigger values (21-255). Invalid values will fallback to english on use and (undefined string) in GUI. [SDT_OMANY] -base = GameSettings var = game_creation.town_name type = SLE_UINT8 from = SLV_97 @@ -339,7 +322,6 @@ full = _town_names cat = SC_BASIC [SDT_OMANY] -base = GameSettings var = game_creation.landscape type = SLE_UINT8 from = SLV_97 @@ -360,7 +342,6 @@ from = SLV_97 to = SLV_164 [SDT_OMANY] -base = GameSettings var = vehicle.road_side type = SLE_UINT8 from = SLV_97 @@ -377,7 +358,6 @@ cat = SC_BASIC ; Construction [SDT_VAR] -base = GameSettings var = construction.map_height_limit type = SLE_UINT8 from = SLV_194 @@ -394,7 +374,6 @@ post_cb = [](auto) { InvalidateWindowClassesData(WC_SMALLMAP, 2); } cat = SC_ADVANCED [SDT_VAR] -base = GameSettings var = game_creation.heightmap_height type = SLE_UINT8 from = SLV_MAPGEN_SETTINGS_REVAMP @@ -405,14 +384,12 @@ max = MAX_MAP_HEIGHT_LIMIT interval = 1 [SDT_BOOL] -base = GameSettings var = construction.build_on_slopes guiflags = SGF_NO_NETWORK def = true cat = SC_EXPERT [SDT_VAR] -base = GameSettings var = construction.command_pause_level type = SLE_UINT8 from = SLV_154 @@ -426,7 +403,6 @@ strhelp = STR_CONFIG_SETTING_COMMAND_PAUSE_LEVEL_HELPTEXT strval = STR_CONFIG_SETTING_COMMAND_PAUSE_LEVEL_NO_ACTIONS [SDT_VAR] -base = GameSettings var = construction.terraform_per_64k_frames type = SLE_UINT32 from = SLV_156 @@ -437,7 +413,6 @@ interval = 1 cat = SC_EXPERT [SDT_VAR] -base = GameSettings var = construction.terraform_frame_burst type = SLE_UINT16 from = SLV_156 @@ -448,7 +423,6 @@ interval = 1 cat = SC_EXPERT [SDT_VAR] -base = GameSettings var = construction.clear_per_64k_frames type = SLE_UINT32 from = SLV_156 @@ -459,7 +433,6 @@ interval = 1 cat = SC_EXPERT [SDT_VAR] -base = GameSettings var = construction.clear_frame_burst type = SLE_UINT16 from = SLV_156 @@ -470,7 +443,6 @@ interval = 1 cat = SC_EXPERT [SDT_VAR] -base = GameSettings var = construction.tree_per_64k_frames type = SLE_UINT32 from = SLV_175 @@ -481,7 +453,6 @@ interval = 1 cat = SC_EXPERT [SDT_VAR] -base = GameSettings var = construction.tree_frame_burst type = SLE_UINT16 from = SLV_175 @@ -492,7 +463,6 @@ interval = 1 cat = SC_EXPERT [SDT_BOOL] -base = GameSettings var = construction.autoslope from = SLV_75 def = true @@ -501,14 +471,12 @@ strhelp = STR_CONFIG_SETTING_AUTOSLOPE_HELPTEXT cat = SC_EXPERT [SDT_BOOL] -base = GameSettings var = construction.extra_dynamite def = true str = STR_CONFIG_SETTING_EXTRADYNAMITE strhelp = STR_CONFIG_SETTING_EXTRADYNAMITE_HELPTEXT [SDT_VAR] -base = GameSettings var = construction.max_bridge_length type = SLE_UINT16 from = SLV_159 @@ -522,7 +490,6 @@ strhelp = STR_CONFIG_SETTING_MAX_BRIDGE_LENGTH_HELPTEXT strval = STR_CONFIG_SETTING_TILE_LENGTH [SDT_VAR] -base = GameSettings var = construction.max_bridge_height type = SLE_UINT8 from = SLV_194 @@ -537,7 +504,6 @@ strval = STR_JUST_COMMA cat = SC_EXPERT [SDT_VAR] -base = GameSettings var = construction.max_tunnel_length type = SLE_UINT16 from = SLV_159 @@ -556,7 +522,6 @@ length = 1 to = SLV_159 [SDT_VAR] -base = GameSettings var = construction.train_signal_side type = SLE_UINT8 guiflags = SGF_MULTISTRING | SGF_NO_NETWORK @@ -570,7 +535,6 @@ post_cb = [](auto) { MarkWholeScreenDirty(); } cat = SC_BASIC [SDT_BOOL] -base = GameSettings var = station.never_expire_airports guiflags = SGF_NO_NETWORK def = false @@ -578,7 +542,6 @@ str = STR_CONFIG_SETTING_NEVER_EXPIRE_AIRPORTS strhelp = STR_CONFIG_SETTING_NEVER_EXPIRE_AIRPORTS_HELPTEXT [SDT_VAR] -base = GameSettings var = economy.town_layout type = SLE_UINT8 from = SLV_59 @@ -593,7 +556,6 @@ strval = STR_CONFIG_SETTING_TOWN_LAYOUT_DEFAULT post_cb = TownFoundingChanged [SDT_BOOL] -base = GameSettings var = economy.allow_town_roads from = SLV_113 guiflags = SGF_NO_NETWORK @@ -602,7 +564,6 @@ str = STR_CONFIG_SETTING_ALLOW_TOWN_ROADS strhelp = STR_CONFIG_SETTING_ALLOW_TOWN_ROADS_HELPTEXT [SDT_VAR] -base = GameSettings var = economy.found_town type = SLE_UINT8 from = SLV_128 @@ -618,7 +579,6 @@ post_cb = TownFoundingChanged cat = SC_BASIC [SDT_BOOL] -base = GameSettings var = economy.allow_town_level_crossings from = SLV_143 guiflags = SGF_NO_NETWORK @@ -627,7 +587,6 @@ str = STR_CONFIG_SETTING_ALLOW_TOWN_LEVEL_CROSSINGS strhelp = STR_CONFIG_SETTING_ALLOW_TOWN_LEVEL_CROSSINGS_HELPTEXT [SDT_VAR] -base = GameSettings var = economy.town_cargogen_mode type = SLE_UINT8 from = SLV_TOWN_CARGOGEN @@ -644,7 +603,6 @@ cat = SC_ADVANCED ; link graph [SDT_VAR] -base = GameSettings var = linkgraph.recalc_interval type = SLE_UINT16 from = SLV_183 @@ -658,7 +616,6 @@ strhelp = STR_CONFIG_SETTING_LINKGRAPH_INTERVAL_HELPTEXT extra = offsetof(LinkGraphSettings, recalc_interval) [SDT_VAR] -base = GameSettings var = linkgraph.recalc_time type = SLE_UINT16 from = SLV_183 @@ -673,7 +630,6 @@ extra = offsetof(LinkGraphSettings, recalc_time) [SDT_VAR] -base = GameSettings var = linkgraph.distribution_pax type = SLE_UINT8 from = SLV_183 @@ -689,7 +645,6 @@ extra = offsetof(LinkGraphSettings, distribution_pax) [SDT_VAR] -base = GameSettings var = linkgraph.distribution_mail type = SLE_UINT8 from = SLV_183 @@ -705,7 +660,6 @@ extra = offsetof(LinkGraphSettings, distribution_mail) [SDT_VAR] -base = GameSettings var = linkgraph.distribution_armoured type = SLE_UINT8 from = SLV_183 @@ -721,7 +675,6 @@ extra = offsetof(LinkGraphSettings, distribution_armoured) [SDT_VAR] -base = GameSettings var = linkgraph.distribution_default type = SLE_UINT8 from = SLV_183 @@ -737,7 +690,6 @@ extra = offsetof(LinkGraphSettings, distribution_default) [SDT_VAR] -base = GameSettings var = linkgraph.accuracy type = SLE_UINT8 from = SLV_183 @@ -752,7 +704,6 @@ extra = offsetof(LinkGraphSettings, accuracy) [SDT_VAR] -base = GameSettings var = linkgraph.demand_distance type = SLE_UINT8 from = SLV_183 @@ -767,7 +718,6 @@ extra = offsetof(LinkGraphSettings, demand_distance) [SDT_VAR] -base = GameSettings var = linkgraph.demand_size type = SLE_UINT8 from = SLV_183 @@ -782,7 +732,6 @@ extra = offsetof(LinkGraphSettings, demand_size) [SDT_VAR] -base = GameSettings var = linkgraph.short_path_saturation type = SLE_UINT8 from = SLV_183 @@ -799,7 +748,6 @@ extra = offsetof(LinkGraphSettings, short_path_saturation) ; Vehicles [SDT_VAR] -base = GameSettings var = vehicle.train_acceleration_model type = SLE_UINT8 guiflags = SGF_MULTISTRING @@ -813,7 +761,6 @@ strval = STR_CONFIG_SETTING_ORIGINAL post_cb = TrainAccelerationModelChanged [SDT_VAR] -base = GameSettings var = vehicle.roadveh_acceleration_model type = SLE_UINT8 from = SLV_139 @@ -828,7 +775,6 @@ strval = STR_CONFIG_SETTING_ORIGINAL post_cb = RoadVehAccelerationModelChanged [SDT_VAR] -base = GameSettings var = vehicle.train_slope_steepness type = SLE_UINT8 from = SLV_133 @@ -843,7 +789,6 @@ post_cb = TrainSlopeSteepnessChanged cat = SC_EXPERT [SDT_VAR] -base = GameSettings var = vehicle.roadveh_slope_steepness type = SLE_UINT8 from = SLV_139 @@ -858,7 +803,6 @@ post_cb = RoadVehSlopeSteepnessChanged cat = SC_EXPERT [SDT_BOOL] -base = GameSettings var = pf.forbid_90_deg def = false str = STR_CONFIG_SETTING_FORBID_90_DEG @@ -867,7 +811,6 @@ post_cb = InvalidateShipPathCache cat = SC_EXPERT [SDT_VAR] -base = GameSettings var = vehicle.max_train_length type = SLE_UINT8 from = SLV_159 @@ -886,7 +829,6 @@ length = 1 to = SLV_159 [SDT_VAR] -base = GameSettings var = vehicle.smoke_amount type = SLE_UINT8 from = SLV_145 @@ -906,20 +848,17 @@ to = SLV_159 ; path finder [SDT_BOOL] -base = GameSettings var = pf.roadveh_queue def = true cat = SC_EXPERT [SDT_BOOL] -base = GameSettings var = pf.new_pathfinding_all to = SLV_87 def = false cat = SC_EXPERT [SDT_BOOL] -base = GameSettings var = pf.yapf.ship_use_yapf from = SLV_28 to = SLV_87 @@ -927,7 +866,6 @@ def = false cat = SC_EXPERT [SDT_BOOL] -base = GameSettings var = pf.yapf.road_use_yapf from = SLV_28 to = SLV_87 @@ -935,7 +873,6 @@ def = true cat = SC_EXPERT [SDT_BOOL] -base = GameSettings var = pf.yapf.rail_use_yapf from = SLV_28 to = SLV_87 @@ -944,7 +881,6 @@ cat = SC_EXPERT ## [SDT_VAR] -base = GameSettings var = pf.pathfinder_for_trains type = SLE_UINT8 from = SLV_87 @@ -959,7 +895,6 @@ strval = STR_CONFIG_SETTING_PATHFINDER_NPF cat = SC_EXPERT [SDT_VAR] -base = GameSettings var = pf.pathfinder_for_roadvehs type = SLE_UINT8 from = SLV_87 @@ -974,7 +909,6 @@ strval = STR_CONFIG_SETTING_PATHFINDER_NPF cat = SC_EXPERT [SDT_VAR] -base = GameSettings var = pf.pathfinder_for_ships type = SLE_UINT8 from = SLV_87 @@ -990,7 +924,6 @@ post_cb = InvalidateShipPathCache cat = SC_EXPERT [SDT_BOOL] -base = GameSettings var = vehicle.never_expire_vehicles guiflags = SGF_NO_NETWORK def = false @@ -998,7 +931,6 @@ str = STR_CONFIG_SETTING_NEVER_EXPIRE_VEHICLES strhelp = STR_CONFIG_SETTING_NEVER_EXPIRE_VEHICLES_HELPTEXT [SDT_VAR] -base = GameSettings var = vehicle.max_trains type = SLE_UINT16 def = 500 @@ -1011,7 +943,6 @@ post_cb = MaxVehiclesChanged cat = SC_BASIC [SDT_VAR] -base = GameSettings var = vehicle.max_roadveh type = SLE_UINT16 def = 500 @@ -1024,7 +955,6 @@ post_cb = MaxVehiclesChanged cat = SC_BASIC [SDT_VAR] -base = GameSettings var = vehicle.max_aircraft type = SLE_UINT16 def = 200 @@ -1037,7 +967,6 @@ post_cb = MaxVehiclesChanged cat = SC_BASIC [SDT_VAR] -base = GameSettings var = vehicle.max_ships type = SLE_UINT16 def = 300 @@ -1097,14 +1026,12 @@ max = 800 to = SLV_120 [SDT_BOOL] -base = GameSettings var = order.no_servicing_if_no_breakdowns def = true str = STR_CONFIG_SETTING_NOSERVICE strhelp = STR_CONFIG_SETTING_NOSERVICE_HELPTEXT [SDT_BOOL] -base = GameSettings var = vehicle.wagon_speed_limits guiflags = SGF_NO_NETWORK def = true @@ -1113,7 +1040,6 @@ strhelp = STR_CONFIG_SETTING_WAGONSPEEDLIMITS_HELPTEXT post_cb = UpdateConsists [SDT_BOOL] -base = GameSettings var = vehicle.disable_elrails from = SLV_38 guiflags = SGF_NO_NETWORK @@ -1124,7 +1050,6 @@ post_cb = SettingsDisableElrail cat = SC_EXPERT [SDT_VAR] -base = GameSettings var = vehicle.freight_trains type = SLE_UINT8 from = SLV_39 @@ -1145,7 +1070,6 @@ from = SLV_67 to = SLV_159 [SDT_VAR] -base = GameSettings var = vehicle.plane_speed type = SLE_UINT8 from = SLV_90 @@ -1158,7 +1082,6 @@ strhelp = STR_CONFIG_SETTING_PLANE_SPEED_HELPTEXT strval = STR_CONFIG_SETTING_PLANE_SPEED_VALUE [SDT_BOOL] -base = GameSettings var = vehicle.dynamic_engines from = SLV_95 guiflags = SGF_NO_NETWORK @@ -1167,7 +1090,6 @@ pre_cb = CheckDynamicEngines cat = SC_EXPERT [SDT_VAR] -base = GameSettings var = vehicle.plane_crashes type = SLE_UINT8 from = SLV_138 @@ -1193,14 +1115,12 @@ to = SLV_93 def = true [SDT_BOOL] -base = GameSettings var = order.improved_load guiflags = SGF_NO_NETWORK def = true cat = SC_EXPERT [SDT_BOOL] -base = GameSettings var = order.selectgoods def = true cat = SC_EXPERT @@ -1217,7 +1137,6 @@ length = 1 to = SLV_159 [SDT_VAR] -base = GameSettings var = station.station_spread type = SLE_UINT8 def = 12 @@ -1230,7 +1149,6 @@ post_cb = StationSpreadChanged cat = SC_BASIC [SDT_BOOL] -base = GameSettings var = order.serviceathelipad def = true str = STR_CONFIG_SETTING_SERVICEATHELIPAD @@ -1238,7 +1156,6 @@ strhelp = STR_CONFIG_SETTING_SERVICEATHELIPAD_HELPTEXT cat = SC_EXPERT [SDT_BOOL] -base = GameSettings var = station.modified_catchment def = true str = STR_CONFIG_SETTING_CATCHMENT @@ -1247,7 +1164,6 @@ post_cb = StationCatchmentChanged cat = SC_EXPERT [SDT_BOOL] -base = GameSettings var = station.serve_neutral_industries def = true from = SLV_SERVE_NEUTRAL_INDUSTRIES @@ -1256,7 +1172,6 @@ strhelp = STR_CONFIG_SETTING_SERVE_NEUTRAL_INDUSTRIES_HELPTEXT post_cb = StationCatchmentChanged [SDT_BOOL] -base = GameSettings var = order.gradual_loading from = SLV_40 guiflags = SGF_NO_NETWORK @@ -1264,7 +1179,6 @@ def = true cat = SC_EXPERT [SDT_BOOL] -base = GameSettings var = construction.road_stop_on_town_road from = SLV_47 def = true @@ -1273,7 +1187,6 @@ strhelp = STR_CONFIG_SETTING_STOP_ON_TOWN_ROAD_HELPTEXT cat = SC_BASIC [SDT_BOOL] -base = GameSettings var = construction.road_stop_on_competitor_road from = SLV_114 def = true @@ -1282,14 +1195,12 @@ strhelp = STR_CONFIG_SETTING_STOP_ON_COMPETITOR_ROAD_HELPTEXT cat = SC_BASIC [SDT_BOOL] -base = GameSettings var = station.adjacent_stations from = SLV_62 def = true cat = SC_EXPERT [SDT_BOOL] -base = GameSettings var = economy.station_noise_level from = SLV_96 guiflags = SGF_NO_NETWORK @@ -1299,7 +1210,6 @@ strhelp = STR_CONFIG_SETTING_NOISE_LEVEL_HELPTEXT post_cb = [](auto new_value) { InvalidateWindowClassesData(WC_TOWN_VIEW, new_value); } [SDT_BOOL] -base = GameSettings var = station.distant_join_stations from = SLV_106 def = true @@ -1309,7 +1219,6 @@ post_cb = [](auto) { DeleteWindowById(WC_SELECT_STATION, 0); } ## [SDT_BOOL] -base = GameSettings var = economy.inflation guiflags = SGF_NO_NETWORK def = false @@ -1318,7 +1227,6 @@ strhelp = STR_CONFIG_SETTING_INFLATION_HELPTEXT cat = SC_BASIC [SDT_VAR] -base = GameSettings var = construction.raw_industry_construction type = SLE_UINT8 guiflags = SGF_MULTISTRING @@ -1332,7 +1240,6 @@ post_cb = [](auto) { InvalidateWindowData(WC_BUILD_INDUSTRY, 0); } cat = SC_BASIC [SDT_VAR] -base = GameSettings var = construction.industry_platform type = SLE_UINT8 from = SLV_148 @@ -1345,7 +1252,6 @@ strval = STR_CONFIG_SETTING_TILE_LENGTH cat = SC_EXPERT [SDT_BOOL] -base = GameSettings var = economy.multiple_industry_per_town def = false str = STR_CONFIG_SETTING_MULTIPINDTOWN @@ -1356,7 +1262,6 @@ length = 1 to = SLV_141 [SDT_BOOL] -base = GameSettings var = economy.bribe def = true str = STR_CONFIG_SETTING_BRIBE @@ -1365,7 +1270,6 @@ post_cb = [](auto) { SetWindowClassesDirty(WC_TOWN_AUTHORITY); } cat = SC_BASIC [SDT_BOOL] -base = GameSettings var = economy.exclusive_rights from = SLV_79 def = true @@ -1375,7 +1279,6 @@ post_cb = [](auto) { SetWindowClassesDirty(WC_TOWN_AUTHORITY); } cat = SC_BASIC [SDT_BOOL] -base = GameSettings var = economy.fund_buildings from = SLV_165 def = true @@ -1385,7 +1288,6 @@ post_cb = [](auto) { SetWindowClassesDirty(WC_TOWN_AUTHORITY); } cat = SC_BASIC [SDT_BOOL] -base = GameSettings var = economy.fund_roads from = SLV_160 def = true @@ -1395,7 +1297,6 @@ post_cb = [](auto) { SetWindowClassesDirty(WC_TOWN_AUTHORITY); } cat = SC_BASIC [SDT_BOOL] -base = GameSettings var = economy.give_money from = SLV_79 def = true @@ -1404,7 +1305,6 @@ strhelp = STR_CONFIG_SETTING_ALLOW_GIVE_MONEY_HELPTEXT cat = SC_BASIC [SDT_VAR] -base = GameSettings var = game_creation.snow_line_height type = SLE_UINT8 guiflags = SGF_SCENEDIT_ONLY @@ -1418,7 +1318,6 @@ strval = STR_JUST_COMMA cat = SC_BASIC [SDT_VAR] -base = GameSettings var = game_creation.snow_coverage type = SLE_UINT8 from = SLV_MAPGEN_SETTINGS_REVAMP @@ -1433,7 +1332,6 @@ strval = STR_CONFIG_SETTING_SNOW_COVERAGE_VALUE cat = SC_BASIC [SDT_VAR] -base = GameSettings var = game_creation.desert_coverage type = SLE_UINT8 from = SLV_MAPGEN_SETTINGS_REVAMP @@ -1452,7 +1350,6 @@ length = 4 to = SLV_144 [SDT_VAR] -base = GameSettings var = game_creation.starting_year type = SLE_INT32 def = DEF_START_YEAR @@ -1468,7 +1365,6 @@ length = 4 to = SLV_105 [SDT_VAR] -base = GameSettings var = game_creation.ending_year type = SLE_INT32 from = SLV_ENDING_YEAR @@ -1483,7 +1379,6 @@ strval = STR_CONFIG_SETTING_ENDING_YEAR_VALUE cat = SC_ADVANCED [SDT_VAR] -base = GameSettings var = economy.type type = SLE_UINT8 guiflags = SGF_MULTISTRING @@ -1497,7 +1392,6 @@ post_cb = [](auto) { InvalidateWindowClassesData(WC_INDUSTRY_VIEW); } cat = SC_BASIC [SDT_BOOL] -base = GameSettings var = economy.allow_shares def = false str = STR_CONFIG_SETTING_ALLOW_SHARES @@ -1505,7 +1399,6 @@ strhelp = STR_CONFIG_SETTING_ALLOW_SHARES_HELPTEXT post_cb = [](auto) { InvalidateWindowClassesData(WC_COMPANY); } [SDT_VAR] -base = GameSettings var = economy.min_years_for_shares type = SLE_UINT8 from = SLV_TRADING_AGE @@ -1519,7 +1412,6 @@ strval = STR_JUST_INT cat = SC_EXPERT [SDT_VAR] -base = GameSettings var = economy.feeder_payment_share type = SLE_UINT8 from = SLV_134 @@ -1532,7 +1424,6 @@ strval = STR_CONFIG_SETTING_PERCENTAGE cat = SC_EXPERT [SDT_VAR] -base = GameSettings var = economy.town_growth_rate type = SLE_UINT8 from = SLV_54 @@ -1545,7 +1436,6 @@ strhelp = STR_CONFIG_SETTING_TOWN_GROWTH_HELPTEXT strval = STR_CONFIG_SETTING_TOWN_GROWTH_NONE [SDT_VAR] -base = GameSettings var = economy.larger_towns type = SLE_UINT8 from = SLV_54 @@ -1559,7 +1449,6 @@ strhelp = STR_CONFIG_SETTING_LARGER_TOWNS_HELPTEXT strval = STR_CONFIG_SETTING_LARGER_TOWNS_VALUE [SDT_VAR] -base = GameSettings var = economy.initial_city_size type = SLE_UINT8 from = SLV_56 @@ -1572,7 +1461,6 @@ strhelp = STR_CONFIG_SETTING_CITY_SIZE_MULTIPLIER_HELPTEXT strval = STR_JUST_COMMA [SDT_BOOL] -base = GameSettings var = economy.mod_road_rebuild from = SLV_77 def = true @@ -1584,7 +1472,6 @@ length = 1 to = SLV_107 [SDT_OMANY] -base = GameSettings var = script.settings_profile type = SLE_UINT8 from = SLV_178 @@ -1599,7 +1486,6 @@ strval = STR_CONFIG_SETTING_AI_PROFILE_EASY cat = SC_BASIC [SDT_BOOL] -base = GameSettings var = ai.ai_in_multiplayer def = true str = STR_CONFIG_SETTING_AI_IN_MULTIPLAYER @@ -1607,35 +1493,30 @@ strhelp = STR_CONFIG_SETTING_AI_IN_MULTIPLAYER_HELPTEXT cat = SC_BASIC [SDT_BOOL] -base = GameSettings var = ai.ai_disable_veh_train def = false str = STR_CONFIG_SETTING_AI_BUILDS_TRAINS strhelp = STR_CONFIG_SETTING_AI_BUILDS_TRAINS_HELPTEXT [SDT_BOOL] -base = GameSettings var = ai.ai_disable_veh_roadveh def = false str = STR_CONFIG_SETTING_AI_BUILDS_ROAD_VEHICLES strhelp = STR_CONFIG_SETTING_AI_BUILDS_ROAD_VEHICLES_HELPTEXT [SDT_BOOL] -base = GameSettings var = ai.ai_disable_veh_aircraft def = false str = STR_CONFIG_SETTING_AI_BUILDS_AIRCRAFT strhelp = STR_CONFIG_SETTING_AI_BUILDS_AIRCRAFT_HELPTEXT [SDT_BOOL] -base = GameSettings var = ai.ai_disable_veh_ship def = false str = STR_CONFIG_SETTING_AI_BUILDS_SHIPS strhelp = STR_CONFIG_SETTING_AI_BUILDS_SHIPS_HELPTEXT [SDT_VAR] -base = GameSettings var = script.script_max_opcode_till_suspend type = SLE_UINT32 from = SLV_107 @@ -1650,7 +1531,6 @@ strval = STR_JUST_COMMA cat = SC_EXPERT [SDT_VAR] -base = GameSettings var = script.script_max_memory_megabytes type = SLE_UINT32 from = SLV_SCRIPT_MEMLIMIT @@ -1666,7 +1546,6 @@ cat = SC_EXPERT ## [SDT_VAR] -base = GameSettings var = vehicle.extend_vehicle_life type = SLE_UINT8 def = 0 @@ -1675,7 +1554,6 @@ max = 100 cat = SC_EXPERT [SDT_VAR] -base = GameSettings var = economy.dist_local_authority type = SLE_UINT8 def = 20 @@ -1684,7 +1562,6 @@ max = 60 cat = SC_EXPERT [SDT_BOOL] -base = GameSettings var = pf.reverse_at_signals from = SLV_159 def = false @@ -1692,7 +1569,6 @@ str = STR_CONFIG_SETTING_REVERSE_AT_SIGNALS strhelp = STR_CONFIG_SETTING_REVERSE_AT_SIGNALS_HELPTEXT [SDT_VAR] -base = GameSettings var = pf.wait_oneway_signal type = SLE_UINT8 def = 15 @@ -1701,7 +1577,6 @@ max = 255 cat = SC_EXPERT [SDT_VAR] -base = GameSettings var = pf.wait_twoway_signal type = SLE_UINT8 def = 41 @@ -1710,7 +1585,6 @@ max = 255 cat = SC_EXPERT [SDT_VAR] -base = GameSettings var = economy.town_noise_population[0] type = SLE_UINT16 from = SLV_96 @@ -1720,7 +1594,6 @@ max = 65535 cat = SC_EXPERT [SDT_VAR] -base = GameSettings var = economy.town_noise_population[1] type = SLE_UINT16 from = SLV_96 @@ -1730,7 +1603,6 @@ max = 65535 cat = SC_EXPERT [SDT_VAR] -base = GameSettings var = economy.town_noise_population[2] type = SLE_UINT16 from = SLV_96 @@ -1740,7 +1612,6 @@ max = 65535 cat = SC_EXPERT [SDT_BOOL] -base = GameSettings var = economy.infrastructure_maintenance from = SLV_166 def = false @@ -1751,7 +1622,6 @@ cat = SC_BASIC ## [SDT_VAR] -base = GameSettings var = pf.wait_for_pbs_path type = SLE_UINT8 from = SLV_100 @@ -1761,14 +1631,12 @@ max = 255 cat = SC_EXPERT [SDT_BOOL] -base = GameSettings var = pf.reserve_paths from = SLV_100 def = false cat = SC_EXPERT [SDT_VAR] -base = GameSettings var = pf.path_backoff_interval type = SLE_UINT8 from = SLV_100 @@ -1785,7 +1653,6 @@ to = SLV_REMOVE_OPF ## [SDT_VAR] -base = GameSettings var = pf.npf.npf_max_search_nodes type = SLE_UINT def = 10000 @@ -1794,7 +1661,6 @@ max = 100000 cat = SC_EXPERT [SDT_VAR] -base = GameSettings var = pf.npf.npf_rail_firstred_penalty type = SLE_UINT def = 10 * NPF_TILE_LENGTH @@ -1803,7 +1669,6 @@ max = 100000 cat = SC_EXPERT [SDT_VAR] -base = GameSettings var = pf.npf.npf_rail_firstred_exit_penalty type = SLE_UINT def = 100 * NPF_TILE_LENGTH @@ -1812,7 +1677,6 @@ max = 100000 cat = SC_EXPERT [SDT_VAR] -base = GameSettings var = pf.npf.npf_rail_lastred_penalty type = SLE_UINT def = 10 * NPF_TILE_LENGTH @@ -1821,7 +1685,6 @@ max = 100000 cat = SC_EXPERT [SDT_VAR] -base = GameSettings var = pf.npf.npf_rail_station_penalty type = SLE_UINT def = 1 * NPF_TILE_LENGTH @@ -1830,7 +1693,6 @@ max = 100000 cat = SC_EXPERT [SDT_VAR] -base = GameSettings var = pf.npf.npf_rail_slope_penalty type = SLE_UINT def = 1 * NPF_TILE_LENGTH @@ -1839,7 +1701,6 @@ max = 100000 cat = SC_EXPERT [SDT_VAR] -base = GameSettings var = pf.npf.npf_rail_curve_penalty type = SLE_UINT def = 1 * NPF_TILE_LENGTH @@ -1848,7 +1709,6 @@ max = 100000 cat = SC_EXPERT [SDT_VAR] -base = GameSettings var = pf.npf.npf_rail_depot_reverse_penalty type = SLE_UINT def = 50 * NPF_TILE_LENGTH @@ -1857,7 +1717,6 @@ max = 100000 cat = SC_EXPERT [SDT_VAR] -base = GameSettings var = pf.npf.npf_rail_pbs_cross_penalty type = SLE_UINT from = SLV_100 @@ -1867,7 +1726,6 @@ max = 100000 cat = SC_EXPERT [SDT_VAR] -base = GameSettings var = pf.npf.npf_rail_pbs_signal_back_penalty type = SLE_UINT from = SLV_100 @@ -1877,7 +1735,6 @@ max = 100000 cat = SC_EXPERT [SDT_VAR] -base = GameSettings var = pf.npf.npf_buoy_penalty type = SLE_UINT def = 2 * NPF_TILE_LENGTH @@ -1886,7 +1743,6 @@ max = 100000 cat = SC_EXPERT [SDT_VAR] -base = GameSettings var = pf.npf.npf_water_curve_penalty type = SLE_UINT def = 1 * NPF_TILE_LENGTH @@ -1895,7 +1751,6 @@ max = 100000 cat = SC_EXPERT [SDT_VAR] -base = GameSettings var = pf.npf.npf_road_curve_penalty type = SLE_UINT def = 1 * NPF_TILE_LENGTH @@ -1904,7 +1759,6 @@ max = 100000 cat = SC_EXPERT [SDT_VAR] -base = GameSettings var = pf.npf.npf_crossing_penalty type = SLE_UINT def = 3 * NPF_TILE_LENGTH @@ -1913,7 +1767,6 @@ max = 100000 cat = SC_EXPERT [SDT_VAR] -base = GameSettings var = pf.npf.npf_road_drive_through_penalty type = SLE_UINT from = SLV_47 @@ -1923,7 +1776,6 @@ max = 100000 cat = SC_EXPERT [SDT_VAR] -base = GameSettings var = pf.npf.npf_road_dt_occupied_penalty type = SLE_UINT from = SLV_130 @@ -1933,7 +1785,6 @@ max = 100000 cat = SC_EXPERT [SDT_VAR] -base = GameSettings var = pf.npf.npf_road_bay_occupied_penalty type = SLE_UINT from = SLV_130 @@ -1943,7 +1794,6 @@ max = 100000 cat = SC_EXPERT [SDT_VAR] -base = GameSettings var = pf.npf.maximum_go_to_depot_penalty type = SLE_UINT from = SLV_131 @@ -1954,14 +1804,12 @@ cat = SC_EXPERT ## [SDT_BOOL] -base = GameSettings var = pf.yapf.disable_node_optimization from = SLV_28 def = false cat = SC_EXPERT [SDT_VAR] -base = GameSettings var = pf.yapf.max_search_nodes type = SLE_UINT from = SLV_28 @@ -1971,14 +1819,12 @@ max = 1000000 cat = SC_EXPERT [SDT_BOOL] -base = GameSettings var = pf.yapf.rail_firstred_twoway_eol from = SLV_28 def = false cat = SC_EXPERT [SDT_VAR] -base = GameSettings var = pf.yapf.rail_firstred_penalty type = SLE_UINT from = SLV_28 @@ -1988,7 +1834,6 @@ max = 1000000 cat = SC_EXPERT [SDT_VAR] -base = GameSettings var = pf.yapf.rail_firstred_exit_penalty type = SLE_UINT from = SLV_28 @@ -1998,7 +1843,6 @@ max = 1000000 cat = SC_EXPERT [SDT_VAR] -base = GameSettings var = pf.yapf.rail_lastred_penalty type = SLE_UINT from = SLV_28 @@ -2008,7 +1852,6 @@ max = 1000000 cat = SC_EXPERT [SDT_VAR] -base = GameSettings var = pf.yapf.rail_lastred_exit_penalty type = SLE_UINT from = SLV_28 @@ -2018,7 +1861,6 @@ max = 1000000 cat = SC_EXPERT [SDT_VAR] -base = GameSettings var = pf.yapf.rail_station_penalty type = SLE_UINT from = SLV_28 @@ -2028,7 +1870,6 @@ max = 1000000 cat = SC_EXPERT [SDT_VAR] -base = GameSettings var = pf.yapf.rail_slope_penalty type = SLE_UINT from = SLV_28 @@ -2038,7 +1879,6 @@ max = 1000000 cat = SC_EXPERT [SDT_VAR] -base = GameSettings var = pf.yapf.rail_curve45_penalty type = SLE_UINT from = SLV_28 @@ -2048,7 +1888,6 @@ max = 1000000 cat = SC_EXPERT [SDT_VAR] -base = GameSettings var = pf.yapf.rail_curve90_penalty type = SLE_UINT from = SLV_28 @@ -2058,7 +1897,6 @@ max = 1000000 cat = SC_EXPERT [SDT_VAR] -base = GameSettings var = pf.yapf.rail_depot_reverse_penalty type = SLE_UINT from = SLV_28 @@ -2068,7 +1906,6 @@ max = 1000000 cat = SC_EXPERT [SDT_VAR] -base = GameSettings var = pf.yapf.rail_crossing_penalty type = SLE_UINT from = SLV_28 @@ -2078,7 +1915,6 @@ max = 1000000 cat = SC_EXPERT [SDT_VAR] -base = GameSettings var = pf.yapf.rail_look_ahead_max_signals type = SLE_UINT from = SLV_28 @@ -2088,7 +1924,6 @@ max = 100 cat = SC_EXPERT [SDT_VAR] -base = GameSettings var = pf.yapf.rail_look_ahead_signal_p0 type = SLE_INT from = SLV_28 @@ -2098,7 +1933,6 @@ max = 1000000 cat = SC_EXPERT [SDT_VAR] -base = GameSettings var = pf.yapf.rail_look_ahead_signal_p1 type = SLE_INT from = SLV_28 @@ -2108,7 +1942,6 @@ max = 1000000 cat = SC_EXPERT [SDT_VAR] -base = GameSettings var = pf.yapf.rail_look_ahead_signal_p2 type = SLE_INT from = SLV_28 @@ -2118,7 +1951,6 @@ max = 1000000 cat = SC_EXPERT [SDT_VAR] -base = GameSettings var = pf.yapf.rail_pbs_cross_penalty type = SLE_UINT from = SLV_100 @@ -2128,7 +1960,6 @@ max = 1000000 cat = SC_EXPERT [SDT_VAR] -base = GameSettings var = pf.yapf.rail_pbs_station_penalty type = SLE_UINT from = SLV_100 @@ -2138,7 +1969,6 @@ max = 1000000 cat = SC_EXPERT [SDT_VAR] -base = GameSettings var = pf.yapf.rail_pbs_signal_back_penalty type = SLE_UINT from = SLV_100 @@ -2148,7 +1978,6 @@ max = 1000000 cat = SC_EXPERT [SDT_VAR] -base = GameSettings var = pf.yapf.rail_doubleslip_penalty type = SLE_UINT from = SLV_100 @@ -2158,7 +1987,6 @@ max = 1000000 cat = SC_EXPERT [SDT_VAR] -base = GameSettings var = pf.yapf.rail_longer_platform_penalty type = SLE_UINT from = SLV_33 @@ -2168,7 +1996,6 @@ max = 20000 cat = SC_EXPERT [SDT_VAR] -base = GameSettings var = pf.yapf.rail_longer_platform_per_tile_penalty type = SLE_UINT from = SLV_33 @@ -2178,7 +2005,6 @@ max = 20000 cat = SC_EXPERT [SDT_VAR] -base = GameSettings var = pf.yapf.rail_shorter_platform_penalty type = SLE_UINT from = SLV_33 @@ -2188,7 +2014,6 @@ max = 20000 cat = SC_EXPERT [SDT_VAR] -base = GameSettings var = pf.yapf.rail_shorter_platform_per_tile_penalty type = SLE_UINT from = SLV_33 @@ -2198,7 +2023,6 @@ max = 20000 cat = SC_EXPERT [SDT_VAR] -base = GameSettings var = pf.yapf.road_slope_penalty type = SLE_UINT from = SLV_33 @@ -2208,7 +2032,6 @@ max = 1000000 cat = SC_EXPERT [SDT_VAR] -base = GameSettings var = pf.yapf.road_curve_penalty type = SLE_UINT from = SLV_33 @@ -2218,7 +2041,6 @@ max = 1000000 cat = SC_EXPERT [SDT_VAR] -base = GameSettings var = pf.yapf.road_crossing_penalty type = SLE_UINT from = SLV_33 @@ -2228,7 +2050,6 @@ max = 1000000 cat = SC_EXPERT [SDT_VAR] -base = GameSettings var = pf.yapf.road_stop_penalty type = SLE_UINT from = SLV_47 @@ -2238,7 +2059,6 @@ max = 1000000 cat = SC_EXPERT [SDT_VAR] -base = GameSettings var = pf.yapf.road_stop_occupied_penalty type = SLE_UINT from = SLV_130 @@ -2248,7 +2068,6 @@ max = 1000000 cat = SC_EXPERT [SDT_VAR] -base = GameSettings var = pf.yapf.road_stop_bay_occupied_penalty type = SLE_UINT from = SLV_130 @@ -2258,7 +2077,6 @@ max = 1000000 cat = SC_EXPERT [SDT_VAR] -base = GameSettings var = pf.yapf.maximum_go_to_depot_penalty type = SLE_UINT from = SLV_131 @@ -2268,7 +2086,6 @@ max = 1000000 cat = SC_EXPERT [SDT_VAR] -base = GameSettings var = pf.yapf.ship_curve45_penalty type = SLE_UINT from = SLV_SHIP_CURVE_PENALTY @@ -2278,7 +2095,6 @@ max = 1000000 cat = SC_EXPERT [SDT_VAR] -base = GameSettings var = pf.yapf.ship_curve90_penalty type = SLE_UINT from = SLV_SHIP_CURVE_PENALTY @@ -2289,7 +2105,6 @@ cat = SC_EXPERT ## [SDT_VAR] -base = GameSettings var = game_creation.land_generator type = SLE_UINT8 from = SLV_30 @@ -2302,7 +2117,6 @@ strhelp = STR_CONFIG_SETTING_LAND_GENERATOR_HELPTEXT strval = STR_CONFIG_SETTING_LAND_GENERATOR_ORIGINAL [SDT_VAR] -base = GameSettings var = game_creation.oil_refinery_limit type = SLE_UINT8 from = SLV_30 @@ -2314,7 +2128,6 @@ strval = STR_CONFIG_SETTING_TILE_LENGTH strhelp = STR_CONFIG_SETTING_OIL_REF_EDGE_DISTANCE_HELPTEXT [SDT_VAR] -base = GameSettings var = game_creation.tgen_smoothness type = SLE_UINT8 from = SLV_30 @@ -2328,7 +2141,6 @@ strval = STR_CONFIG_SETTING_ROUGHNESS_OF_TERRAIN_VERY_SMOOTH cat = SC_BASIC [SDT_VAR] -base = GameSettings var = game_creation.variety type = SLE_UINT8 from = SLV_197 @@ -2341,7 +2153,6 @@ strhelp = STR_CONFIG_SETTING_VARIETY_HELPTEXT strval = STR_VARIETY_NONE [SDT_VAR] -base = GameSettings var = game_creation.generation_seed type = SLE_UINT32 from = SLV_30 @@ -2351,7 +2162,6 @@ max = UINT32_MAX cat = SC_EXPERT [SDT_VAR] -base = GameSettings var = game_creation.tree_placer type = SLE_UINT8 from = SLV_30 @@ -2365,7 +2175,6 @@ strval = STR_CONFIG_SETTING_TREE_PLACER_NONE cat = SC_BASIC [SDT_VAR] -base = GameSettings var = game_creation.heightmap_rotation type = SLE_UINT8 flags = SLF_NOT_IN_SAVE | SLF_NO_NETWORK_SYNC @@ -2378,7 +2187,6 @@ strval = STR_CONFIG_SETTING_HEIGHTMAP_ROTATION_COUNTER_CLOCKWISE cat = SC_BASIC [SDT_VAR] -base = GameSettings var = game_creation.se_flat_world_height type = SLE_UINT8 flags = SLF_NOT_IN_SAVE | SLF_NO_NETWORK_SYNC @@ -2391,7 +2199,6 @@ cat = SC_BASIC ## [SDT_VAR] -base = GameSettings var = game_creation.map_x type = SLE_UINT8 flags = SLF_NOT_IN_SAVE | SLF_NO_NETWORK_SYNC @@ -2401,7 +2208,6 @@ max = MAX_MAP_SIZE_BITS cat = SC_BASIC [SDT_VAR] -base = GameSettings var = game_creation.map_y type = SLE_UINT8 flags = SLF_NOT_IN_SAVE | SLF_NO_NETWORK_SYNC @@ -2411,7 +2217,6 @@ max = MAX_MAP_SIZE_BITS cat = SC_BASIC [SDT_BOOL] -base = GameSettings var = construction.freeform_edges from = SLV_111 def = true @@ -2420,7 +2225,6 @@ post_cb = UpdateFreeformEdges cat = SC_EXPERT [SDT_VAR] -base = GameSettings var = game_creation.water_borders type = SLE_UINT8 from = SLV_111 @@ -2429,7 +2233,6 @@ min = 0 max = 16 [SDT_VAR] -base = GameSettings var = game_creation.custom_town_number type = SLE_UINT16 from = SLV_115 @@ -2439,7 +2242,6 @@ max = 5000 cat = SC_BASIC [SDT_VAR] -base = GameSettings var = construction.extra_tree_placement type = SLE_UINT8 from = SLV_132 @@ -2453,7 +2255,6 @@ strval = STR_CONFIG_SETTING_EXTRA_TREE_PLACEMENT_NO_SPREAD cat = SC_BASIC [SDT_VAR] -base = GameSettings var = game_creation.custom_terrain_type type = SLE_UINT8 from = SLV_MAPGEN_SETTINGS_REVAMP @@ -2464,7 +2265,6 @@ max = MAX_MAP_HEIGHT_LIMIT interval = 1 [SDT_VAR] -base = GameSettings var = game_creation.custom_sea_level type = SLE_UINT8 from = SLV_149 @@ -2474,7 +2274,6 @@ max = CUSTOM_SEA_LEVEL_MAX_PERCENTAGE cat = SC_BASIC [SDT_VAR] -base = GameSettings var = game_creation.min_river_length type = SLE_UINT8 from = SLV_163 @@ -2484,7 +2283,6 @@ max = 255 cat = SC_EXPERT [SDT_VAR] -base = GameSettings var = game_creation.river_route_random type = SLE_UINT8 from = SLV_163 @@ -2494,7 +2292,6 @@ max = 255 cat = SC_EXPERT [SDT_VAR] -base = GameSettings var = game_creation.amount_of_rivers type = SLE_UINT8 from = SLV_163 @@ -2509,7 +2306,6 @@ strval = STR_RIVERS_NONE ; locale [SDT_OMANY] -base = GameSettings var = locale.currency type = SLE_UINT8 from = SLV_97 @@ -2534,7 +2330,6 @@ post_cb = [](auto) { MarkWholeScreenDirty(); } cat = SC_BASIC [SDT_OMANY] -base = GameSettings var = locale.units_velocity type = SLE_UINT8 from = SLV_184 @@ -2550,7 +2345,6 @@ strhelp = STR_CONFIG_SETTING_LOCALISATION_UNITS_VELOCITY_HELPTEXT strval = STR_CONFIG_SETTING_LOCALISATION_UNITS_VELOCITY_IMPERIAL [SDT_OMANY] -base = GameSettings var = locale.units_power type = SLE_UINT8 from = SLV_184 @@ -2566,7 +2360,6 @@ strhelp = STR_CONFIG_SETTING_LOCALISATION_UNITS_POWER_HELPTEXT strval = STR_CONFIG_SETTING_LOCALISATION_UNITS_POWER_IMPERIAL [SDT_OMANY] -base = GameSettings var = locale.units_weight type = SLE_UINT8 from = SLV_184 @@ -2582,7 +2375,6 @@ strhelp = STR_CONFIG_SETTING_LOCALISATION_UNITS_WEIGHT_HELPTEXT strval = STR_CONFIG_SETTING_LOCALISATION_UNITS_WEIGHT_IMPERIAL [SDT_OMANY] -base = GameSettings var = locale.units_volume type = SLE_UINT8 from = SLV_184 @@ -2598,7 +2390,6 @@ strhelp = STR_CONFIG_SETTING_LOCALISATION_UNITS_VOLUME_HELPTEXT strval = STR_CONFIG_SETTING_LOCALISATION_UNITS_VOLUME_IMPERIAL [SDT_OMANY] -base = GameSettings var = locale.units_force type = SLE_UINT8 from = SLV_184 @@ -2614,7 +2405,6 @@ strhelp = STR_CONFIG_SETTING_LOCALISATION_UNITS_FORCE_HELPTEXT strval = STR_CONFIG_SETTING_LOCALISATION_UNITS_FORCE_IMPERIAL [SDT_OMANY] -base = GameSettings var = locale.units_height type = SLE_UINT8 from = SLV_184 @@ -2630,7 +2420,6 @@ strhelp = STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT_HELPTEXT strval = STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT_IMPERIAL [SDT_SSTR] -base = GameSettings var = locale.digit_group_separator type = SLE_STRQ from = SLV_118 @@ -2640,7 +2429,6 @@ post_cb = [](auto) { MarkWholeScreenDirty(); } cat = SC_BASIC [SDT_SSTR] -base = GameSettings var = locale.digit_group_separator_currency type = SLE_STRQ from = SLV_118 @@ -2650,7 +2438,6 @@ post_cb = [](auto) { MarkWholeScreenDirty(); } cat = SC_BASIC [SDT_SSTR] -base = GameSettings var = locale.digit_decimal_separator type = SLE_STRQ from = SLV_126 diff --git a/src/table/window_settings.ini b/src/table/window_settings.ini index 5334b0fc1d..560a197ab6 100644 --- a/src/table/window_settings.ini +++ b/src/table/window_settings.ini @@ -10,14 +10,13 @@ static const SettingTable _window_settings{ [post-amble] }; [templates] -SDT_BOOL = SDT_BOOL($base, $var, $flags, $guiflags, $def, $str, $strhelp, $strval, $pre_cb, $post_cb, $from, $to, $cat, $extra, $startup), -SDT_VAR = SDT_VAR($base, $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, $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), [validation] -SDT_VAR = static_assert($max <= MAX_$type, "Maximum value for $base.$var exceeds storage size"); +SDT_VAR = static_assert($max <= MAX_$type, "Maximum value for WindowDesc.$var exceeds storage size"); [defaults] -base = WindowDesc flags = SLF_NOT_IN_SAVE | SLF_NO_NETWORK_SYNC guiflags = SGF_NONE interval = 0 From 4d74e519074bec9a07c2997715ab635ac0e8f084 Mon Sep 17 00:00:00 2001 From: Patric Stout Date: Sat, 29 May 2021 11:21:30 +0200 Subject: [PATCH 10/10] Fix #9281: acquire a company uses special bookkeeping to make you rich (#9300) When you buy-out a company, you got your shares back. This is based on company-value, which includes values for the vehicles etc. In other words, you not only got the vehicles, but you also got paid to get them back. Additionally, you also got the loan of the company, but not the money for the loan (as that is subtracted from the company-value). Solve this by changing the rules of a buy-out: don't sell your shares, get the loan AND the balance and get the infrastructure. --- src/economy.cpp | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/src/economy.cpp b/src/economy.cpp index 09adf81b99..cde08f76a0 100644 --- a/src/economy.cpp +++ b/src/economy.cpp @@ -324,8 +324,11 @@ void ChangeOwnershipOfCompanyItems(Owner old_owner, Owner new_owner) Backup cur_company2(_current_company, FILE_LINE); const Company *c = Company::Get(old_owner); for (i = 0; i < 4; i++) { - cur_company2.Change(c->share_owners[i]); - if (_current_company != INVALID_OWNER) { + if (c->bankrupt_value == 0 && c->share_owners[i] == new_owner) { + /* You are the one buying the company; so don't sell the shares back to you. */ + Company::Get(new_owner)->share_owners[i] = COMPANY_SPECTATOR; + } else if (c->share_owners[i] != INVALID_OWNER) { + cur_company2.Change(c->share_owners[i]); /* Sell the shares */ CommandCost res = DoCommand(0, old_owner, 0, DC_EXEC | DC_BANKRUPT, CMD_SELL_SHARE_IN_COMPANY); /* Because we are in a DoCommand, we can't just execute another one and @@ -1986,6 +1989,9 @@ static void DoAcquireCompany(Company *c) if (c->bankrupt_value == 0) { Company *owner = Company::Get(_current_company); + + /* Get both the balance and the loan of the company you just bought. */ + SubtractMoneyFromCompany(CommandCost(EXPENSES_OTHER, -c->money)); owner->current_loan += c->current_loan; }