summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorPatric Stout <truebrain@openttd.org>2021-07-09 21:16:03 +0200
committerGitHub <noreply@github.com>2021-07-09 21:16:03 +0200
commit8f5d0ecde39cbaf2ac1a6d27e82239bfc3bf1515 (patch)
tree232daba5b6f77f8ae33191c0b88dd21ef662a1c1 /src
parentd9ca9ca55571829af88429147e20bf0734e07e2d (diff)
downloadopenttd-8f5d0ecde39cbaf2ac1a6d27e82239bfc3bf1515.tar.xz
Codechange: split settings.ini over several files (#9421)
This reduced the load on compilers, as currently for example MacOS doesn't like the huge settings-tables. Additionally, nobody can find settings, as the list is massive and unordered. By splitting it, it becomes a little bit more sensible.
Diffstat (limited to 'src')
-rw-r--r--src/saveload/linkgraph_sl.cpp4
-rw-r--r--src/saveload/settings_sl.cpp37
-rw-r--r--src/settings.cpp24
-rw-r--r--src/settings_internal.h4
-rw-r--r--src/settings_table.cpp21
-rw-r--r--src/settings_table.h23
-rw-r--r--src/table/settings/CMakeLists.txt14
-rw-r--r--src/table/settings/currency_settings.ini1
-rw-r--r--src/table/settings/difficulty_settings.ini286
-rw-r--r--src/table/settings/economy_settings.ini294
-rw-r--r--src/table/settings/game_settings.ini421
-rw-r--r--src/table/settings/gui_settings.ini858
-rw-r--r--src/table/settings/linkgraph_settings.ini168
-rw-r--r--src/table/settings/locale_settings.ini177
-rw-r--r--src/table/settings/multimedia_settings.ini148
-rw-r--r--src/table/settings/news_display_settings.ini201
-rw-r--r--src/table/settings/old_gameopt_settings.ini (renamed from src/table/settings/gameopt_settings.ini)19
-rw-r--r--src/table/settings/pathfinding_settings.ini617
-rw-r--r--src/table/settings/script_settings.ini112
-rw-r--r--src/table/settings/settings.ini3487
-rw-r--r--src/table/settings/world_settings.ini545
21 files changed, 3926 insertions, 3535 deletions
diff --git a/src/saveload/linkgraph_sl.cpp b/src/saveload/linkgraph_sl.cpp
index e1094326b..ae21de4c7 100644
--- a/src/saveload/linkgraph_sl.cpp
+++ b/src/saveload/linkgraph_sl.cpp
@@ -17,6 +17,7 @@
#include "../linkgraph/linkgraphschedule.h"
#include "../network/network.h"
#include "../settings_internal.h"
+#include "../settings_table.h"
#include "../safeguards.h"
@@ -165,7 +166,6 @@ public:
SaveLoadTable GetLinkGraphJobDesc()
{
static std::vector<SaveLoad> saveloads;
- static const char *prefix = "linkgraph.";
static const SaveLoad job_desc[] = {
SLE_VAR(LinkGraphJob, join_date, SLE_INT32),
@@ -184,7 +184,7 @@ SaveLoadTable GetLinkGraphJobDesc()
/* Build the SaveLoad array on first call and don't touch it later on */
if (saveloads.size() == 0) {
- GetSettingSaveLoadByPrefix(prefix, saveloads);
+ GetSaveLoadFromSettingTable(_linkgraph_settings, saveloads);
for (auto &sl : saveloads) {
sl.address_proc = proc;
diff --git a/src/saveload/settings_sl.cpp b/src/saveload/settings_sl.cpp
index 59b00e0f0..f19ff910c 100644
--- a/src/saveload/settings_sl.cpp
+++ b/src/saveload/settings_sl.cpp
@@ -151,7 +151,7 @@ struct OPTSChunkHandler : ChunkHandler {
* a networking environment. This ensures for example that the local
* autosave-frequency stays when joining a network-server */
PrepareOldDiffCustom();
- LoadSettings(_gameopt_settings, &_settings_game, _gameopt_sl_compat);
+ LoadSettings(_old_gameopt_settings, &_settings_game, _gameopt_sl_compat);
HandleOldDiffCustom(true);
}
};
@@ -159,22 +159,51 @@ struct OPTSChunkHandler : ChunkHandler {
struct PATSChunkHandler : ChunkHandler {
PATSChunkHandler() : ChunkHandler('PATS', CH_TABLE) {}
+ /**
+ * Create a single table with all settings that should be stored/loaded
+ * in the savegame.
+ */
+ SettingTable GetSettingTable() const
+ {
+ static const SettingTable saveload_settings_tables[] = {
+ _difficulty_settings,
+ _economy_settings,
+ _game_settings,
+ _linkgraph_settings,
+ _locale_settings,
+ _pathfinding_settings,
+ _script_settings,
+ _world_settings,
+ };
+ static std::vector<SettingVariant> settings_table;
+
+ if (settings_table.empty()) {
+ for (auto &saveload_settings_table : saveload_settings_tables) {
+ for (auto &saveload_setting : saveload_settings_table) {
+ settings_table.push_back(saveload_setting);
+ }
+ }
+ }
+
+ return settings_table;
+ }
+
void Load() const override
{
/* Copy over default setting since some might not get loaded in
* a networking environment. This ensures for example that the local
* currency setting stays when joining a network-server */
- LoadSettings(_settings, &_settings_game, _settings_sl_compat);
+ LoadSettings(this->GetSettingTable(), &_settings_game, _settings_sl_compat);
}
void LoadCheck(size_t) const override
{
- LoadSettings(_settings, &_load_check_data.settings, _settings_sl_compat);
+ LoadSettings(this->GetSettingTable(), &_load_check_data.settings, _settings_sl_compat);
}
void Save() const override
{
- SaveSettings(_settings, &_settings_game);
+ SaveSettings(this->GetSettingTable(), &_settings_game);
}
};
diff --git a/src/settings.cpp b/src/settings.cpp
index e3741c235..09223c585 100644
--- a/src/settings.cpp
+++ b/src/settings.cpp
@@ -72,8 +72,18 @@ static ErrorList _settings_error_list; ///< Errors while loading minimal setting
static auto &GenericSettingTables()
{
static const SettingTable _generic_setting_tables[] = {
- _settings,
+ _difficulty_settings,
+ _economy_settings,
+ _game_settings,
+ _gui_settings,
+ _linkgraph_settings,
+ _locale_settings,
+ _multimedia_settings,
_network_settings,
+ _news_display_settings,
+ _pathfinding_settings,
+ _script_settings,
+ _world_settings,
};
return _generic_setting_tables;
}
@@ -1207,7 +1217,7 @@ void LoadFromConfig(bool startup)
GameLoadConfig(generic_ini, "game_scripts");
PrepareOldDiffCustom();
- IniLoadSettings(generic_ini, _gameopt_settings, "gameopt", &_settings_newgame, false);
+ IniLoadSettings(generic_ini, _old_gameopt_settings, "gameopt", &_settings_newgame, false);
HandleOldDiffCustom(false);
ValidateSettings();
@@ -1393,16 +1403,16 @@ static const SettingDesc *GetSettingFromName(const std::string_view name, const
}
/**
- * Get the SaveLoad from all settings matching the prefix.
- * @param prefix The prefix to look for.
+ * Get the SaveLoad for all settings in the settings table.
+ * @param settings The settings table to get the SaveLoad objects from.
* @param saveloads A vector to store the result in.
*/
-void GetSettingSaveLoadByPrefix(std::string_view prefix, std::vector<SaveLoad> &saveloads)
+void GetSaveLoadFromSettingTable(SettingTable settings, std::vector<SaveLoad> &saveloads)
{
- for (auto &desc : _settings) {
+ for (auto &desc : settings) {
const SettingDesc *sd = GetSettingDesc(desc);
if (!SlIsObjectCurrentlyValid(sd->save.version_from, sd->save.version_to)) continue;
- if (StrStartsWith(sd->name, prefix)) saveloads.push_back(sd->save);
+ saveloads.push_back(sd->save);
}
}
diff --git a/src/settings_internal.h b/src/settings_internal.h
index 304f1393a..a9083ce40 100644
--- a/src/settings_internal.h
+++ b/src/settings_internal.h
@@ -312,8 +312,10 @@ static constexpr const SettingDesc *GetSettingDesc(const SettingVariant &desc)
return std::visit([](auto&& arg) -> const SettingDesc * { return &arg; }, desc);
}
+typedef span<const SettingVariant> SettingTable;
+
const SettingDesc *GetSettingFromName(const std::string_view name);
-void GetSettingSaveLoadByPrefix(const std::string_view prefix, std::vector<SaveLoad> &saveloads);
+void GetSaveLoadFromSettingTable(SettingTable settings, std::vector<SaveLoad> &saveloads);
bool SetSettingValue(const IntSettingDesc *sd, int32 value, bool force_newgame = false);
bool SetSettingValue(const StringSettingDesc *sd, const std::string value, bool force_newgame = false);
diff --git a/src/settings_table.cpp b/src/settings_table.cpp
index bc1e588cd..045d8e56c 100644
--- a/src/settings_table.cpp
+++ b/src/settings_table.cpp
@@ -49,16 +49,25 @@
#include "safeguards.h"
-SettingTable _settings{ _settings_table };
-SettingTable _network_settings{ _network_settings_table };
-SettingTable _network_private_settings{ _network_private_settings_table };
-SettingTable _network_secrets_settings{ _network_secrets_settings_table };
-
SettingTable _company_settings{ _company_settings_table };
SettingTable _currency_settings{ _currency_settings_table };
-SettingTable _gameopt_settings{ _gameopt_settings_table };
+SettingTable _difficulty_settings{ _difficulty_settings_table };
+SettingTable _multimedia_settings{ _multimedia_settings_table };
+SettingTable _economy_settings{ _economy_settings_table };
+SettingTable _game_settings{ _game_settings_table };
+SettingTable _gui_settings{ _gui_settings_table };
+SettingTable _linkgraph_settings{ _linkgraph_settings_table };
+SettingTable _locale_settings{ _locale_settings_table };
SettingTable _misc_settings{ _misc_settings_table };
+SettingTable _network_private_settings{ _network_private_settings_table };
+SettingTable _network_secrets_settings{ _network_secrets_settings_table };
+SettingTable _network_settings{ _network_settings_table };
+SettingTable _news_display_settings{ _news_display_settings_table };
+SettingTable _old_gameopt_settings{ _old_gameopt_settings_table };
+SettingTable _pathfinding_settings{ _pathfinding_settings_table };
+SettingTable _script_settings{ _script_settings_table };
SettingTable _window_settings{ _window_settings_table };
+SettingTable _world_settings{ _world_settings_table };
#if defined(_WIN32) && !defined(DEDICATED)
SettingTable _win32_settings{ _win32_settings_table };
#endif /* _WIN32 */
diff --git a/src/settings_table.h b/src/settings_table.h
index ace0ec7a2..d662b6a57 100644
--- a/src/settings_table.h
+++ b/src/settings_table.h
@@ -15,18 +15,25 @@
#include <array>
#include "settings_internal.h"
-typedef span<const SettingVariant> SettingTable;
-
-extern SettingTable _settings;
-extern SettingTable _network_settings;
-extern SettingTable _network_private_settings;
-extern SettingTable _network_secrets_settings;
-
extern SettingTable _company_settings;
extern SettingTable _currency_settings;
-extern SettingTable _gameopt_settings;
+extern SettingTable _difficulty_settings;
+extern SettingTable _economy_settings;
+extern SettingTable _game_settings;
+extern SettingTable _gui_settings;
+extern SettingTable _linkgraph_settings;
+extern SettingTable _locale_settings;
extern SettingTable _misc_settings;
+extern SettingTable _multimedia_settings;
+extern SettingTable _network_private_settings;
+extern SettingTable _network_secrets_settings;
+extern SettingTable _network_settings;
+extern SettingTable _news_display_settings;
+extern SettingTable _old_gameopt_settings;
+extern SettingTable _pathfinding_settings;
+extern SettingTable _script_settings;
extern SettingTable _window_settings;
+extern SettingTable _world_settings;
#if defined(_WIN32) && !defined(DEDICATED)
extern SettingTable _win32_settings;
#endif /* _WIN32 */
diff --git a/src/table/settings/CMakeLists.txt b/src/table/settings/CMakeLists.txt
index f4d3c209e..f00c72051 100644
--- a/src/table/settings/CMakeLists.txt
+++ b/src/table/settings/CMakeLists.txt
@@ -4,14 +4,24 @@ set(TABLE_BINARY_DIR ${GENERATED_BINARY_DIR}/table)
set(TABLE_INI_SOURCE_FILES
${CMAKE_CURRENT_SOURCE_DIR}/company_settings.ini
${CMAKE_CURRENT_SOURCE_DIR}/currency_settings.ini
- ${CMAKE_CURRENT_SOURCE_DIR}/gameopt_settings.ini
+ ${CMAKE_CURRENT_SOURCE_DIR}/difficulty_settings.ini
+ ${CMAKE_CURRENT_SOURCE_DIR}/economy_settings.ini
+ ${CMAKE_CURRENT_SOURCE_DIR}/game_settings.ini
+ ${CMAKE_CURRENT_SOURCE_DIR}/gui_settings.ini
+ ${CMAKE_CURRENT_SOURCE_DIR}/linkgraph_settings.ini
+ ${CMAKE_CURRENT_SOURCE_DIR}/locale_settings.ini
${CMAKE_CURRENT_SOURCE_DIR}/misc_settings.ini
+ ${CMAKE_CURRENT_SOURCE_DIR}/multimedia_settings.ini
${CMAKE_CURRENT_SOURCE_DIR}/network_settings.ini
${CMAKE_CURRENT_SOURCE_DIR}/network_private_settings.ini
${CMAKE_CURRENT_SOURCE_DIR}/network_secrets_settings.ini
- ${CMAKE_CURRENT_SOURCE_DIR}/settings.ini
+ ${CMAKE_CURRENT_SOURCE_DIR}/news_display_settings.ini
+ ${CMAKE_CURRENT_SOURCE_DIR}/old_gameopt_settings.ini
+ ${CMAKE_CURRENT_SOURCE_DIR}/pathfinding_settings.ini
+ ${CMAKE_CURRENT_SOURCE_DIR}/script_settings.ini
${CMAKE_CURRENT_SOURCE_DIR}/win32_settings.ini
${CMAKE_CURRENT_SOURCE_DIR}/window_settings.ini
+ ${CMAKE_CURRENT_SOURCE_DIR}/world_settings.ini
)
if (HOST_BINARY_DIR)
diff --git a/src/table/settings/currency_settings.ini b/src/table/settings/currency_settings.ini
index 03c6425b2..4a0e73338 100644
--- a/src/table/settings/currency_settings.ini
+++ b/src/table/settings/currency_settings.ini
@@ -33,7 +33,6 @@ extra = 0
startup = false
-
[SDT_VAR]
var = rate
type = SLE_UINT16
diff --git a/src/table/settings/difficulty_settings.ini b/src/table/settings/difficulty_settings.ini
new file mode 100644
index 000000000..18d2ea7bb
--- /dev/null
+++ b/src/table/settings/difficulty_settings.ini
@@ -0,0 +1,286 @@
+; This file is part of OpenTTD.
+; OpenTTD is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2.
+; OpenTTD is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+; See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with OpenTTD. If not, see <http://www.gnu.org/licenses/>.
+;
+
+; Difficulty settings as stored in the main configuration file ("openttd.cfg")
+; and in the savegame PATS chunk.
+
+[pre-amble]
+const std::array<std::string, GAME_DIFFICULTY_NUM> _old_diff_settings{"max_no_competitors", "competitor_start_time", "number_towns", "industry_density", "max_loan", "initial_interest", "vehicle_costs", "competitor_speed", "competitor_intelligence", "vehicle_breakdowns", "subsidy_multiplier", "construction_cost", "terrain_type", "quantity_sea_lakes", "economy", "line_reverse_mode", "disasters", "town_council_tolerance"};
+
+uint16 _old_diff_custom[GAME_DIFFICULTY_NUM];
+uint8 _old_diff_level; ///< Old difficulty level from old savegames
+
+static void DifficultyNoiseChange(int32 new_value);
+static void MaxNoAIsChange(int32 new_value);
+
+static const SettingVariant _difficulty_settings_table[] = {
+[post-amble]
+};
+[templates]
+SDTG_VAR = SDTG_VAR($name, $type, $flags, $var, $def, $min, $max, $interval, $str, $strhelp, $strval, $pre_cb, $post_cb, $from, $to, $cat, $extra, $startup),
+SDT_BOOL = SDT_BOOL(GameSettings, $var, $flags, $def, $str, $strhelp, $strval, $pre_cb, $post_cb, $from, $to, $cat, $extra, $startup),
+SDT_VAR = SDT_VAR(GameSettings, $var, $type, $flags, $def, $min, $max, $interval, $str, $strhelp, $strval, $pre_cb, $post_cb, $from, $to, $cat, $extra, $startup),
+
+[validation]
+SDTG_VAR = static_assert($max <= MAX_$type, "Maximum value for $var exceeds storage size");
+SDT_VAR = static_assert($max <= MAX_$type, "Maximum value for GameSettings.$var exceeds storage size");
+
+[defaults]
+flags = SF_NONE
+interval = 0
+str = STR_NULL
+strhelp = STR_CONFIG_SETTING_NO_EXPLANATION_AVAILABLE_HELPTEXT
+strval = STR_NULL
+pre_cb = nullptr
+post_cb = nullptr
+load = nullptr
+from = SL_MIN_VERSION
+to = SL_MAX_VERSION
+cat = SC_ADVANCED
+extra = 0
+startup = false
+
+
+; Saved settings variables.
+; The next 18 entries are important for savegame compatibility. Do NOT remove those. See HandleOldDiffCustom() for more details.
+[SDT_VAR]
+var = difficulty.max_no_competitors
+type = SLE_UINT8
+from = SLV_97
+def = 0
+min = 0
+max = MAX_COMPANIES - 1
+interval = 1
+post_cb = MaxNoAIsChange
+cat = SC_BASIC
+
+[SDT_VAR]
+var = difficulty.competitor_start_time
+type = SLE_UINT8
+from = SLV_97
+to = SLV_110
+def = 2
+min = 0
+max = 3
+
+[SDT_VAR]
+var = difficulty.number_towns
+type = SLE_UINT8
+from = SLV_97
+flags = SF_NEWGAME_ONLY
+def = 2
+min = 0
+max = 4
+interval = 1
+strval = STR_NUM_VERY_LOW
+cat = SC_BASIC
+
+[SDT_VAR]
+var = difficulty.industry_density
+type = SLE_UINT8
+from = SLV_97
+flags = SF_GUI_DROPDOWN
+def = ID_END - 1
+min = 0
+max = ID_END - 1
+interval = 1
+str = STR_CONFIG_SETTING_INDUSTRY_DENSITY
+strhelp = STR_CONFIG_SETTING_INDUSTRY_DENSITY_HELPTEXT
+strval = STR_FUNDING_ONLY
+cat = SC_BASIC
+
+[SDT_VAR]
+var = difficulty.max_loan
+type = SLE_UINT32
+from = SLV_97
+flags = SF_NEWGAME_ONLY | SF_SCENEDIT_TOO | SF_GUI_CURRENCY
+def = 300000
+min = 0
+max = 2000000000
+interval = 50000
+str = STR_CONFIG_SETTING_MAXIMUM_INITIAL_LOAN
+strhelp = STR_CONFIG_SETTING_MAXIMUM_INITIAL_LOAN_HELPTEXT
+strval = STR_JUST_CURRENCY_LONG
+cat = SC_BASIC
+
+[SDT_VAR]
+var = difficulty.initial_interest
+type = SLE_UINT8
+from = SLV_97
+flags = SF_NEWGAME_ONLY | SF_SCENEDIT_TOO
+def = 2
+min = 2
+max = 4
+interval = 1
+str = STR_CONFIG_SETTING_INTEREST_RATE
+strhelp = STR_CONFIG_SETTING_INTEREST_RATE_HELPTEXT
+strval = STR_CONFIG_SETTING_PERCENTAGE
+
+[SDT_VAR]
+var = difficulty.vehicle_costs
+type = SLE_UINT8
+from = SLV_97
+flags = SF_NEWGAME_ONLY | SF_SCENEDIT_TOO | SF_GUI_DROPDOWN
+def = 0
+min = 0
+max = 2
+interval = 1
+str = STR_CONFIG_SETTING_RUNNING_COSTS
+strhelp = STR_CONFIG_SETTING_RUNNING_COSTS_HELPTEXT
+strval = STR_SEA_LEVEL_LOW
+cat = SC_BASIC
+
+[SDT_VAR]
+var = difficulty.competitor_speed
+type = SLE_UINT8
+from = SLV_97
+flags = SF_GUI_DROPDOWN
+def = 2
+min = 0
+max = 4
+interval = 1
+str = STR_CONFIG_SETTING_CONSTRUCTION_SPEED
+strhelp = STR_CONFIG_SETTING_CONSTRUCTION_SPEED_HELPTEXT
+strval = STR_AI_SPEED_VERY_SLOW
+cat = SC_BASIC
+
+[SDT_VAR]
+var = difficulty.competitor_intelligence
+type = SLE_UINT8
+from = SLV_97
+to = SLV_110
+def = 0
+min = 0
+max = 2
+
+[SDT_VAR]
+var = difficulty.vehicle_breakdowns
+type = SLE_UINT8
+from = SLV_97
+flags = SF_GUI_DROPDOWN
+def = 1
+min = 0
+max = 2
+interval = 1
+str = STR_CONFIG_SETTING_VEHICLE_BREAKDOWNS
+strhelp = STR_CONFIG_SETTING_VEHICLE_BREAKDOWNS_HELPTEXT
+strval = STR_DISASTER_NONE
+cat = SC_BASIC
+
+[SDT_VAR]
+var = difficulty.subsidy_multiplier
+type = SLE_UINT8
+from = SLV_97
+flags = SF_GUI_DROPDOWN
+def = 2
+min = 0
+max = 3
+interval = 1
+str = STR_CONFIG_SETTING_SUBSIDY_MULTIPLIER
+strhelp = STR_CONFIG_SETTING_SUBSIDY_MULTIPLIER_HELPTEXT
+strval = STR_SUBSIDY_X1_5
+
+[SDT_VAR]
+var = difficulty.subsidy_duration
+type = SLE_UINT16
+from = SLV_CUSTOM_SUBSIDY_DURATION
+flags = SF_GUI_0_IS_SPECIAL
+def = 1
+min = 0
+max = 5000
+interval = 1
+str = STR_CONFIG_SETTING_SUBSIDY_DURATION
+strhelp = STR_CONFIG_SETTING_SUBSIDY_DURATION_HELPTEXT
+strval = STR_CONFIG_SETTING_SUBSIDY_DURATION_VALUE
+
+[SDT_VAR]
+var = difficulty.construction_cost
+type = SLE_UINT8
+from = SLV_97
+flags = SF_NEWGAME_ONLY | SF_SCENEDIT_TOO | SF_GUI_DROPDOWN
+def = 0
+min = 0
+max = 2
+interval = 1
+str = STR_CONFIG_SETTING_CONSTRUCTION_COSTS
+strhelp = STR_CONFIG_SETTING_CONSTRUCTION_COSTS_HELPTEXT
+strval = STR_SEA_LEVEL_LOW
+cat = SC_BASIC
+
+[SDT_VAR]
+var = difficulty.terrain_type
+type = SLE_UINT8
+from = SLV_97
+flags = SF_GUI_DROPDOWN | SF_NEWGAME_ONLY
+def = 1
+min = 0
+max = 5
+interval = 1
+str = STR_CONFIG_SETTING_TERRAIN_TYPE
+strhelp = STR_CONFIG_SETTING_TERRAIN_TYPE_HELPTEXT
+strval = STR_TERRAIN_TYPE_VERY_FLAT
+cat = SC_BASIC
+
+[SDT_VAR]
+var = difficulty.quantity_sea_lakes
+type = SLE_UINT8
+from = SLV_97
+flags = SF_NEWGAME_ONLY
+def = 0
+min = 0
+max = 4
+interval = 1
+strval = STR_SEA_LEVEL_VERY_LOW
+cat = SC_BASIC
+
+[SDT_BOOL]
+var = difficulty.economy
+from = SLV_97
+def = false
+str = STR_CONFIG_SETTING_RECESSIONS
+strhelp = STR_CONFIG_SETTING_RECESSIONS_HELPTEXT
+
+[SDT_BOOL]
+var = difficulty.line_reverse_mode
+from = SLV_97
+def = false
+str = STR_CONFIG_SETTING_TRAIN_REVERSING
+strhelp = STR_CONFIG_SETTING_TRAIN_REVERSING_HELPTEXT
+
+[SDT_BOOL]
+var = difficulty.disasters
+from = SLV_97
+def = false
+str = STR_CONFIG_SETTING_DISASTERS
+strhelp = STR_CONFIG_SETTING_DISASTERS_HELPTEXT
+cat = SC_BASIC
+
+[SDT_VAR]
+var = difficulty.town_council_tolerance
+type = SLE_UINT8
+from = SLV_97
+flags = SF_GUI_DROPDOWN
+def = 0
+min = 0
+max = 2
+interval = 1
+str = STR_CONFIG_SETTING_CITY_APPROVAL
+strhelp = STR_CONFIG_SETTING_CITY_APPROVAL_HELPTEXT
+strval = STR_CITY_APPROVAL_PERMISSIVE
+post_cb = DifficultyNoiseChange
+
+[SDTG_VAR]
+name = ""diff_level""
+var = _old_diff_level
+type = SLE_UINT8
+flags = SF_NOT_IN_CONFIG
+from = SLV_97
+to = SLV_178
+def = 3
+min = 0
+max = 3
+cat = SC_BASIC
+
diff --git a/src/table/settings/economy_settings.ini b/src/table/settings/economy_settings.ini
new file mode 100644
index 000000000..9ffd9edb7
--- /dev/null
+++ b/src/table/settings/economy_settings.ini
@@ -0,0 +1,294 @@
+; This file is part of OpenTTD.
+; OpenTTD is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2.
+; OpenTTD is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+; See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with OpenTTD. If not, see <http://www.gnu.org/licenses/>.
+;
+
+; Economy settings as stored in the main configuration file ("openttd.cfg")
+; and in the savegame PATS chunk.
+
+[pre-amble]
+static void TownFoundingChanged(int32 new_value);
+
+static const SettingVariant _economy_settings_table[] = {
+[post-amble]
+};
+[templates]
+SDT_BOOL = SDT_BOOL(GameSettings, $var, $flags, $def, $str, $strhelp, $strval, $pre_cb, $post_cb, $from, $to, $cat, $extra, $startup),
+SDT_VAR = SDT_VAR(GameSettings, $var, $type, $flags, $def, $min, $max, $interval, $str, $strhelp, $strval, $pre_cb, $post_cb, $from, $to, $cat, $extra, $startup),
+
+[validation]
+SDT_VAR = static_assert($max <= MAX_$type, "Maximum value for GameSettings.$var exceeds storage size");
+
+[defaults]
+flags = SF_NONE
+interval = 0
+str = STR_NULL
+strhelp = STR_CONFIG_SETTING_NO_EXPLANATION_AVAILABLE_HELPTEXT
+strval = STR_NULL
+pre_cb = nullptr
+post_cb = nullptr
+load = nullptr
+from = SL_MIN_VERSION
+to = SL_MAX_VERSION
+cat = SC_ADVANCED
+extra = 0
+startup = false
+
+
+[SDT_VAR]
+var = economy.town_layout
+type = SLE_UINT8
+from = SLV_59
+flags = SF_GUI_DROPDOWN
+def = TL_ORIGINAL
+min = TL_BEGIN
+max = NUM_TLS - 1
+interval = 1
+str = STR_CONFIG_SETTING_TOWN_LAYOUT
+strhelp = STR_CONFIG_SETTING_TOWN_LAYOUT_HELPTEXT
+strval = STR_CONFIG_SETTING_TOWN_LAYOUT_DEFAULT
+post_cb = TownFoundingChanged
+
+[SDT_BOOL]
+var = economy.allow_town_roads
+from = SLV_113
+flags = SF_NO_NETWORK
+def = true
+str = STR_CONFIG_SETTING_ALLOW_TOWN_ROADS
+strhelp = STR_CONFIG_SETTING_ALLOW_TOWN_ROADS_HELPTEXT
+
+[SDT_VAR]
+var = economy.found_town
+type = SLE_UINT8
+from = SLV_128
+flags = SF_GUI_DROPDOWN
+def = TF_FORBIDDEN
+min = TF_BEGIN
+max = TF_END - 1
+interval = 1
+str = STR_CONFIG_SETTING_TOWN_FOUNDING
+strhelp = STR_CONFIG_SETTING_TOWN_FOUNDING_HELPTEXT
+strval = STR_CONFIG_SETTING_TOWN_FOUNDING_FORBIDDEN
+post_cb = TownFoundingChanged
+cat = SC_BASIC
+
+[SDT_BOOL]
+var = economy.allow_town_level_crossings
+from = SLV_143
+flags = SF_NO_NETWORK
+def = true
+str = STR_CONFIG_SETTING_ALLOW_TOWN_LEVEL_CROSSINGS
+strhelp = STR_CONFIG_SETTING_ALLOW_TOWN_LEVEL_CROSSINGS_HELPTEXT
+
+[SDT_VAR]
+var = economy.town_cargogen_mode
+type = SLE_UINT8
+from = SLV_TOWN_CARGOGEN
+flags = SF_GUI_DROPDOWN
+def = TCGM_BITCOUNT
+min = TCGM_BEGIN
+max = TCGM_END - 1
+interval = 1
+str = STR_CONFIG_SETTING_TOWN_CARGOGENMODE
+strhelp = STR_CONFIG_SETTING_TOWN_CARGOGENMODE_HELPTEXT
+strval = STR_CONFIG_SETTING_TOWN_CARGOGENMODE_ORIGINAL
+cat = SC_ADVANCED
+
+[SDT_BOOL]
+var = economy.station_noise_level
+from = SLV_96
+flags = SF_NO_NETWORK
+def = false
+str = STR_CONFIG_SETTING_NOISE_LEVEL
+strhelp = STR_CONFIG_SETTING_NOISE_LEVEL_HELPTEXT
+post_cb = [](auto new_value) { InvalidateWindowClassesData(WC_TOWN_VIEW, new_value); }
+
+[SDT_BOOL]
+var = economy.inflation
+flags = SF_NO_NETWORK
+def = false
+str = STR_CONFIG_SETTING_INFLATION
+strhelp = STR_CONFIG_SETTING_INFLATION_HELPTEXT
+cat = SC_BASIC
+
+[SDT_BOOL]
+var = economy.multiple_industry_per_town
+def = false
+str = STR_CONFIG_SETTING_MULTIPINDTOWN
+strhelp = STR_CONFIG_SETTING_MULTIPINDTOWN_HELPTEXT
+
+[SDT_BOOL]
+var = economy.bribe
+def = true
+str = STR_CONFIG_SETTING_BRIBE
+strhelp = STR_CONFIG_SETTING_BRIBE_HELPTEXT
+post_cb = [](auto) { SetWindowClassesDirty(WC_TOWN_AUTHORITY); }
+cat = SC_BASIC
+
+[SDT_BOOL]
+var = economy.exclusive_rights
+from = SLV_79
+def = true
+str = STR_CONFIG_SETTING_ALLOW_EXCLUSIVE
+strhelp = STR_CONFIG_SETTING_ALLOW_EXCLUSIVE_HELPTEXT
+post_cb = [](auto) { SetWindowClassesDirty(WC_TOWN_AUTHORITY); }
+cat = SC_BASIC
+
+[SDT_BOOL]
+var = economy.fund_buildings
+from = SLV_165
+def = true
+str = STR_CONFIG_SETTING_ALLOW_FUND_BUILDINGS
+strhelp = STR_CONFIG_SETTING_ALLOW_FUND_BUILDINGS_HELPTEXT
+post_cb = [](auto) { SetWindowClassesDirty(WC_TOWN_AUTHORITY); }
+cat = SC_BASIC
+
+[SDT_BOOL]
+var = economy.fund_roads
+from = SLV_160
+def = true
+str = STR_CONFIG_SETTING_ALLOW_FUND_ROAD
+strhelp = STR_CONFIG_SETTING_ALLOW_FUND_ROAD_HELPTEXT
+post_cb = [](auto) { SetWindowClassesDirty(WC_TOWN_AUTHORITY); }
+cat = SC_BASIC
+
+[SDT_BOOL]
+var = economy.give_money
+from = SLV_79
+def = true
+str = STR_CONFIG_SETTING_ALLOW_GIVE_MONEY
+strhelp = STR_CONFIG_SETTING_ALLOW_GIVE_MONEY_HELPTEXT
+cat = SC_BASIC
+
+[SDT_VAR]
+var = economy.type
+type = SLE_UINT8
+flags = SF_GUI_DROPDOWN
+def = ET_SMOOTH
+min = ET_BEGIN
+max = ET_END - 1
+str = STR_CONFIG_SETTING_ECONOMY_TYPE
+strhelp = STR_CONFIG_SETTING_ECONOMY_TYPE_HELPTEXT
+strval = STR_CONFIG_SETTING_ECONOMY_TYPE_ORIGINAL
+post_cb = [](auto) { InvalidateWindowClassesData(WC_INDUSTRY_VIEW); }
+cat = SC_BASIC
+
+[SDT_BOOL]
+var = economy.allow_shares
+def = false
+str = STR_CONFIG_SETTING_ALLOW_SHARES
+strhelp = STR_CONFIG_SETTING_ALLOW_SHARES_HELPTEXT
+post_cb = [](auto) { InvalidateWindowClassesData(WC_COMPANY); }
+
+[SDT_VAR]
+var = economy.min_years_for_shares
+type = SLE_UINT8
+from = SLV_TRADING_AGE
+def = 6
+min = 0
+max = 255
+interval = 1
+str = STR_CONFIG_SETTING_MIN_YEARS_FOR_SHARES
+strhelp = STR_CONFIG_SETTING_MIN_YEARS_FOR_SHARES_HELPTEXT
+strval = STR_JUST_INT
+cat = SC_EXPERT
+
+[SDT_VAR]
+var = economy.feeder_payment_share
+type = SLE_UINT8
+from = SLV_134
+def = 75
+min = 0
+max = 100
+str = STR_CONFIG_SETTING_FEEDER_PAYMENT_SHARE
+strhelp = STR_CONFIG_SETTING_FEEDER_PAYMENT_SHARE_HELPTEXT
+strval = STR_CONFIG_SETTING_PERCENTAGE
+cat = SC_EXPERT
+
+[SDT_VAR]
+var = economy.town_growth_rate
+type = SLE_UINT8
+from = SLV_54
+flags = SF_GUI_DROPDOWN
+def = 2
+min = 0
+max = 4
+str = STR_CONFIG_SETTING_TOWN_GROWTH
+strhelp = STR_CONFIG_SETTING_TOWN_GROWTH_HELPTEXT
+strval = STR_CONFIG_SETTING_TOWN_GROWTH_NONE
+
+[SDT_VAR]
+var = economy.larger_towns
+type = SLE_UINT8
+from = SLV_54
+flags = SF_GUI_0_IS_SPECIAL
+def = 4
+min = 0
+max = 255
+interval = 1
+str = STR_CONFIG_SETTING_LARGER_TOWNS
+strhelp = STR_CONFIG_SETTING_LARGER_TOWNS_HELPTEXT
+strval = STR_CONFIG_SETTING_LARGER_TOWNS_VALUE
+
+[SDT_VAR]
+var = economy.initial_city_size
+type = SLE_UINT8
+from = SLV_56
+def = 2
+min = 1
+max = 10
+interval = 1
+str = STR_CONFIG_SETTING_CITY_SIZE_MULTIPLIER
+strhelp = STR_CONFIG_SETTING_CITY_SIZE_MULTIPLIER_HELPTEXT
+strval = STR_JUST_COMMA
+
+[SDT_BOOL]
+var = economy.mod_road_rebuild
+from = SLV_77
+def = true
+cat = SC_EXPERT
+
+[SDT_VAR]
+var = economy.dist_local_authority
+type = SLE_UINT8
+def = 20
+min = 5
+max = 60
+cat = SC_EXPERT
+
+[SDT_VAR]
+var = economy.town_noise_population[0]
+type = SLE_UINT16
+from = SLV_96
+def = 800
+min = 200
+max = 65535
+cat = SC_EXPERT
+
+[SDT_VAR]
+var = economy.town_noise_population[1]
+type = SLE_UINT16
+from = SLV_96
+def = 2000
+min = 400
+max = 65535
+cat = SC_EXPERT
+
+[SDT_VAR]
+var = economy.town_noise_population[2]
+type = SLE_UINT16
+from = SLV_96
+def = 4000
+min = 800
+max = 65535
+cat = SC_EXPERT
+
+[SDT_BOOL]
+var = economy.infrastructure_maintenance
+from = SLV_166
+def = false
+str = STR_CONFIG_SETTING_INFRASTRUCTURE_MAINTENANCE
+strhelp = STR_CONFIG_SETTING_INFRASTRUCTURE_MAINTENANCE_HELPTEXT
+post_cb = [](auto) { InvalidateWindowClassesData(WC_COMPANY_INFRASTRUCTURE); }
+cat = SC_BASIC
diff --git a/src/table/settings/game_settings.ini b/src/table/settings/game_settings.ini
new file mode 100644
index 000000000..2a51279e5
--- /dev/null
+++ b/src/table/settings/game_settings.ini
@@ -0,0 +1,421 @@
+; This file is part of OpenTTD.
+; OpenTTD is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2.
+; OpenTTD is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+; See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with OpenTTD. If not, see <http://www.gnu.org/licenses/>.
+;
+
+; Game settings as stored in the main configuration file ("openttd.cfg")
+; and in the savegame PATS chunk.
+; Game settings are everything related to vehicles, stations, orders, etc.
+
+[pre-amble]
+static std::initializer_list<const char*> _roadsides{"left", "right"};
+
+static void StationSpreadChanged(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 bool CheckRoadSide(int32 &new_value);
+static bool CheckDynamicEngines(int32 &new_value);
+static void StationCatchmentChanged(int32 new_value);
+static void MaxVehiclesChanged(int32 new_value);
+
+static const SettingVariant _game_settings_table[] = {
+[post-amble]
+};
+[templates]
+SDTG_BOOL = SDTG_BOOL($name, $flags, $var, $def, $str, $strhelp, $strval, $pre_cb, $post_cb, $from, $to, $cat, $extra, $startup),
+SDTG_VAR = SDTG_VAR($name, $type, $flags, $var, $def, $min, $max, $interval, $str, $strhelp, $strval, $pre_cb, $post_cb, $from, $to, $cat, $extra, $startup),
+SDTC_BOOL = SDTC_BOOL( $var, $flags, $def, $str, $strhelp, $strval, $pre_cb, $post_cb, $from, $to, $cat, $extra, $startup),
+SDT_BOOL = SDT_BOOL(GameSettings, $var, $flags, $def, $str, $strhelp, $strval, $pre_cb, $post_cb, $from, $to, $cat, $extra, $startup),
+SDT_OMANY = SDT_OMANY(GameSettings, $var, $type, $flags, $def, $max, $full, $str, $strhelp, $strval, $pre_cb, $post_cb, $from, $to, $load, $cat, $extra, $startup),
+SDT_VAR = SDT_VAR(GameSettings, $var, $type, $flags, $def, $min, $max, $interval, $str, $strhelp, $strval, $pre_cb, $post_cb, $from, $to, $cat, $extra, $startup),
+
+[validation]
+SDTG_VAR = static_assert($max <= MAX_$type, "Maximum value for $var exceeds storage size");
+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 = SF_NONE
+interval = 0
+str = STR_NULL
+strhelp = STR_CONFIG_SETTING_NO_EXPLANATION_AVAILABLE_HELPTEXT
+strval = STR_NULL
+pre_cb = nullptr
+post_cb = nullptr
+load = nullptr
+from = SL_MIN_VERSION
+to = SL_MAX_VERSION
+cat = SC_ADVANCED
+extra = 0
+startup = false
+
+
+[SDT_BOOL]
+var = order.no_servicing_if_no_breakdowns
+def = true
+str = STR_CONFIG_SETTING_NOSERVICE
+strhelp = STR_CONFIG_SETTING_NOSERVICE_HELPTEXT
+
+[SDT_BOOL]
+var = order.improved_load
+flags = SF_NO_NETWORK
+def = true
+cat = SC_EXPERT
+
+[SDT_BOOL]
+var = order.selectgoods
+def = true
+cat = SC_EXPERT
+
+[SDT_BOOL]
+var = order.serviceathelipad
+def = true
+str = STR_CONFIG_SETTING_SERVICEATHELIPAD
+strhelp = STR_CONFIG_SETTING_SERVICEATHELIPAD_HELPTEXT
+cat = SC_EXPERT
+
+[SDT_BOOL]
+var = order.gradual_loading
+from = SLV_40
+flags = SF_NO_NETWORK
+def = true
+cat = SC_EXPERT
+
+[SDT_BOOL]
+var = station.never_expire_airports
+flags = SF_NO_NETWORK
+def = false
+str = STR_CONFIG_SETTING_NEVER_EXPIRE_AIRPORTS
+strhelp = STR_CONFIG_SETTING_NEVER_EXPIRE_AIRPORTS_HELPTEXT
+
+[SDT_VAR]
+var = station.station_spread
+type = SLE_UINT8
+def = 12
+min = 4
+max = 64
+str = STR_CONFIG_SETTING_STATION_SPREAD
+strhelp = STR_CONFIG_SETTING_STATION_SPREAD_HELPTEXT
+strval = STR_CONFIG_SETTING_TILE_LENGTH
+post_cb = StationSpreadChanged
+cat = SC_BASIC
+
+[SDT_BOOL]
+var = station.modified_catchment
+def = true
+str = STR_CONFIG_SETTING_CATCHMENT
+strhelp = STR_CONFIG_SETTING_CATCHMENT_HELPTEXT
+post_cb = StationCatchmentChanged
+cat = SC_EXPERT
+
+[SDT_BOOL]
+var = station.serve_neutral_industries
+def = true
+from = SLV_SERVE_NEUTRAL_INDUSTRIES
+str = STR_CONFIG_SETTING_SERVE_NEUTRAL_INDUSTRIES
+strhelp = STR_CONFIG_SETTING_SERVE_NEUTRAL_INDUSTRIES_HELPTEXT
+post_cb = StationCatchmentChanged
+
+[SDT_BOOL]
+var = station.adjacent_stations
+from = SLV_62
+def = true
+cat = SC_EXPERT
+
+[SDT_BOOL]
+var = station.distant_join_stations
+from = SLV_106
+def = true
+str = STR_CONFIG_SETTING_DISTANT_JOIN_STATIONS
+strhelp = STR_CONFIG_SETTING_DISTANT_JOIN_STATIONS_HELPTEXT
+post_cb = [](auto) { CloseWindowById(WC_SELECT_STATION, 0); }
+
+[SDT_OMANY]
+var = vehicle.road_side
+type = SLE_UINT8
+from = SLV_97
+flags = SF_GUI_DROPDOWN | SF_NO_NETWORK
+def = 1
+max = 1
+full = _roadsides
+str = STR_CONFIG_SETTING_ROAD_SIDE
+strhelp = STR_CONFIG_SETTING_ROAD_SIDE_HELPTEXT
+strval = STR_GAME_OPTIONS_ROAD_VEHICLES_DROPDOWN_LEFT
+pre_cb = CheckRoadSide
+cat = SC_BASIC
+
+[SDT_VAR]
+var = vehicle.train_acceleration_model
+type = SLE_UINT8
+flags = SF_GUI_DROPDOWN
+def = 1
+min = 0
+max = 1
+interval = 1
+str = STR_CONFIG_SETTING_TRAIN_ACCELERATION_MODEL
+strhelp = STR_CONFIG_SETTING_TRAIN_ACCELERATION_MODEL_HELPTEXT
+strval = STR_CONFIG_SETTING_ORIGINAL
+post_cb = TrainAccelerationModelChanged
+
+[SDT_VAR]
+var = vehicle.roadveh_acceleration_model
+type = SLE_UINT8
+from = SLV_139
+flags = SF_GUI_DROPDOWN
+def = 1
+min = 0
+max = 1
+interval = 1
+str = STR_CONFIG_SETTING_ROAD_VEHICLE_ACCELERATION_MODEL
+strhelp = STR_CONFIG_SETTING_ROAD_VEHICLE_ACCELERATION_MODEL_HELPTEXT
+strval = STR_CONFIG_SETTING_ORIGINAL
+post_cb = RoadVehAccelerationModelChanged
+
+[SDT_VAR]
+var = vehicle.train_slope_steepness
+type = SLE_UINT8
+from = SLV_133
+def = 3
+min = 0
+max = 10
+interval = 1
+str = STR_CONFIG_SETTING_TRAIN_SLOPE_STEEPNESS
+strhelp = STR_CONFIG_SETTING_TRAIN_SLOPE_STEEPNESS_HELPTEXT
+strval = STR_CONFIG_SETTING_PERCENTAGE
+post_cb = TrainSlopeSteepnessChanged
+cat = SC_EXPERT
+
+[SDT_VAR]
+var = vehicle.roadveh_slope_steepness
+type = SLE_UINT8
+from = SLV_139
+def = 7
+min = 0
+max = 10
+interval = 1
+str = STR_CONFIG_SETTING_ROAD_VEHICLE_SLOPE_STEEPNESS
+strhelp = STR_CONFIG_SETTING_ROAD_VEHICLE_SLOPE_STEEPNESS_HELPTEXT
+strval = STR_CONFIG_SETTING_PERCENTAGE
+post_cb = RoadVehSlopeSteepnessChanged
+cat = SC_EXPERT
+
+[SDT_VAR]
+var = vehicle.max_train_length
+type = SLE_UINT8
+from = SLV_159
+def = 7
+min = 1
+max = 64
+interval = 1
+str = STR_CONFIG_SETTING_TRAIN_LENGTH
+strhelp = STR_CONFIG_SETTING_TRAIN_LENGTH_HELPTEXT
+strval = STR_CONFIG_SETTING_TILE_LENGTH
+cat = SC_BASIC
+
+[SDT_VAR]
+var = vehicle.smoke_amount
+type = SLE_UINT8
+from = SLV_145
+flags = SF_GUI_DROPDOWN
+def = 1
+min = 0
+max = 2
+str = STR_CONFIG_SETTING_SMOKE_AMOUNT
+strhelp = STR_CONFIG_SETTING_SMOKE_AMOUNT_HELPTEXT
+strval = STR_CONFIG_SETTING_NONE
+
+[SDT_BOOL]
+var = vehicle.never_expire_vehicles
+flags = SF_NO_NETWORK
+def = false
+str = STR_CONFIG_SETTING_NEVER_EXPIRE_VEHICLES
+strhelp = STR_CONFIG_SETTING_NEVER_EXPIRE_VEHICLES_HELPTEXT
+
+[SDT_VAR]
+var = vehicle.max_trains
+type = SLE_UINT16
+def = 500
+min = 0
+max = 5000
+str = STR_CONFIG_SETTING_MAX_TRAINS
+strhelp = STR_CONFIG_SETTING_MAX_TRAINS_HELPTEXT
+strval = STR_JUST_COMMA
+post_cb = MaxVehiclesChanged
+cat = SC_BASIC
+
+[SDT_VAR]
+var = vehicle.max_roadveh
+type = SLE_UINT16
+def = 500
+min = 0
+max = 5000
+str = STR_CONFIG_SETTING_MAX_ROAD_VEHICLES
+strhelp = STR_CONFIG_SETTING_MAX_ROAD_VEHICLES_HELPTEXT
+strval = STR_JUST_COMMA
+post_cb = MaxVehiclesChanged
+cat = SC_BASIC
+
+[SDT_VAR]
+var = vehicle.max_aircraft
+type = SLE_UINT16
+def = 200
+min = 0
+max = 5000
+str = STR_CONFIG_SETTING_MAX_AIRCRAFT
+strhelp = STR_CONFIG_SETTING_MAX_AIRCRAFT_HELPTEXT
+strval = STR_JUST_COMMA
+post_cb = MaxVehiclesChanged
+cat = SC_BASIC
+
+[SDT_VAR]
+var = vehicle.max_ships
+type = SLE_UINT16
+def = 300
+min = 0
+max = 5000
+str = STR_CONFIG_SETTING_MAX_SHIPS
+strhelp = STR_CONFIG_SETTING_MAX_SHIPS_HELPTEXT
+strval = STR_JUST_COMMA
+post_cb = MaxVehiclesChanged
+cat = SC_BASIC
+
+[SDT_BOOL]
+var = vehicle.wagon_speed_limits
+flags = SF_NO_NETWORK
+def = true
+str = STR_CONFIG_SETTING_WAGONSPEEDLIMITS
+strhelp = STR_CONFIG_SETTING_WAGONSPEEDLIMITS_HELPTEXT
+post_cb = UpdateConsists
+
+[SDT_BOOL]
+var = vehicle.disable_elrails
+from = SLV_38
+flags = SF_NO_NETWORK
+def = false
+str = STR_CONFIG_SETTING_DISABLE_ELRAILS
+strhelp = STR_CONFIG_SETTING_DISABLE_ELRAILS_HELPTEXT
+post_cb = SettingsDisableElrail
+cat = SC_EXPERT
+
+[SDT_VAR]
+var = vehicle.freight_trains
+type = SLE_UINT8
+from = SLV_39
+flags = SF_NO_NETWORK
+def = 1
+min = 1
+max = 255
+interval = 1
+str = STR_CONFIG_SETTING_FREIGHT_TRAINS
+strhelp = STR_CONFIG_SETTING_FREIGHT_TRAINS_HELPTEXT
+strval = STR_JUST_COMMA
+post_cb = UpdateConsists
+
+[SDT_VAR]
+var = vehicle.plane_speed
+type = SLE_UINT8
+from = SLV_90
+flags = SF_NO_NETWORK
+def = 4
+min = 1
+max = 4
+str = STR_CONFIG_SETTING_PLANE_SPEED
+strhelp = STR_CONFIG_SETTING_PLANE_SPEED_HELPTEXT
+strval = STR_CONFIG_SETTING_PLANE_SPEED_VALUE
+
+[SDT_BOOL]
+var = vehicle.dynamic_engines
+from = SLV_95
+flags = SF_NO_NETWORK
+def = true
+pre_cb = CheckDynamicEngines
+cat = SC_EXPERT
+
+[SDT_VAR]
+var = vehicle.plane_crashes
+type = SLE_UINT8
+from = SLV_138
+flags = SF_GUI_DROPDOWN
+def = 2
+min = 0
+max = 2
+interval = 1
+str = STR_CONFIG_SETTING_PLANE_CRASHES
+strhelp = STR_CONFIG_SETTING_PLANE_CRASHES_HELPTEXT
+strval = STR_CONFIG_SETTING_PLANE_CRASHES_NONE
+cat = SC_BASIC
+
+[SDT_VAR]
+var = vehicle.extend_vehicle_life
+type = SLE_UINT8
+def = 0
+min = 0
+max = 100
+cat = SC_EXPERT
+
+## Old vehicle settings.
+
+[SDTG_BOOL]
+name = """"
+flags = SF_NO_NETWORK
+var = _old_vds.servint_ispercent
+def = false
+to = SLV_120
+
+[SDTG_VAR]
+name = """"
+type = SLE_UINT16
+flags = SF_GUI_0_IS_SPECIAL
+var = _old_vds.servint_trains
+def = 150
+min = 5
+max = 800
+to = SLV_120
+
+[SDTG_VAR]
+name = """"
+type = SLE_UINT16
+flags = SF_GUI_0_IS_SPECIAL
+var = _old_vds.servint_roadveh
+def = 150
+min = 5
+max = 800
+to = SLV_120
+
+[SDTG_VAR]
+name = """"
+type = SLE_UINT16
+flags = SF_GUI_0_IS_SPECIAL
+var = _old_vds.servint_ships
+def = 360
+min = 5
+max = 800
+to = SLV_120
+
+[SDTG_VAR]
+name = """"
+type = SLE_UINT16
+flags = SF_GUI_0_IS_SPECIAL
+var = _old_vds.servint_aircraft
+def = 150
+min = 5
+max = 800
+to = SLV_120
+
+## These were once in the "gui" section, but they really are related to orders.
+
+[SDTC_BOOL]
+var = gui.sg_full_load_any
+from = SLV_22
+to = SLV_93
+def = true
+
+[SDTC_BOOL]
+var = gui.sg_new_nonstop
+from = SLV_22
+to = SLV_93
+def = false
diff --git a/src/table/settings/gui_settings.ini b/src/table/settings/gui_settings.ini
new file mode 100644
index 000000000..427402660
--- /dev/null
+++ b/src/table/settings/gui_settings.ini
@@ -0,0 +1,858 @@
+; This file is part of OpenTTD.
+; OpenTTD is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2.
+; OpenTTD is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+; See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with OpenTTD. If not, see <http://www.gnu.org/licenses/>.
+;
+
+; GUI settings as stored in the main configuration file ("openttd.cfg").
+
+[pre-amble]
+static void v_PositionMainToolbar(int32 new_value);
+static void v_PositionStatusbar(int32 new_value);
+static void RedrawSmallmap(int32 new_value);
+static void CloseSignalGUI(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 std::initializer_list<const char*> _autosave_interval{"off", "monthly", "quarterly", "half year", "yearly"};
+static std::initializer_list<const char*> _osk_activation{"disabled", "double", "single", "immediately"};
+static std::initializer_list<const char*> _savegame_date{"long", "short", "iso"};
+
+static const SettingVariant _gui_settings_table[] = {
+[post-amble]
+};
+[templates]
+SDTC_BOOL = SDTC_BOOL( $var, $flags, $def, $str, $strhelp, $strval, $pre_cb, $post_cb, $from, $to, $cat, $extra, $startup),
+SDTC_OMANY = SDTC_OMANY( $var, $type, $flags, $def, $max, $full, $str, $strhelp, $strval, $pre_cb, $post_cb, $from, $to, $cat, $extra, $startup),
+SDTC_VAR = SDTC_VAR( $var, $type, $flags, $def, $min, $max, $interval, $str, $strhelp, $strval, $pre_cb, $post_cb, $from, $to, $cat, $extra, $startup),
+
+[validation]
+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");
+
+[defaults]
+flags = SF_NONE
+interval = 0
+str = STR_NULL
+strhelp = STR_CONFIG_SETTING_NO_EXPLANATION_AVAILABLE_HELPTEXT
+strval = STR_NULL
+pre_cb = nullptr
+post_cb = nullptr
+load = nullptr
+from = SL_MIN_VERSION
+to = SL_MAX_VERSION
+cat = SC_ADVANCED
+extra = 0
+startup = false
+
+
+[SDTC_OMANY]
+var = gui.autosave
+type = SLE_UINT8
+flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC | SF_GUI_DROPDOWN
+def = 1
+max = 4
+full = _autosave_interval
+str = STR_CONFIG_SETTING_AUTOSAVE
+strhelp = STR_CONFIG_SETTING_AUTOSAVE_HELPTEXT
+strval = STR_GAME_OPTIONS_AUTOSAVE_DROPDOWN_OFF
+cat = SC_BASIC
+
+[SDTC_BOOL]
+var = gui.threaded_saves
+flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC
+def = true
+cat = SC_EXPERT
+
+[SDTC_OMANY]
+var = gui.date_format_in_default_names
+type = SLE_UINT8
+flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC | SF_GUI_DROPDOWN
+def = 2
+max = 2
+full = _savegame_date
+str = STR_CONFIG_SETTING_DATE_FORMAT_IN_SAVE_NAMES
+strhelp = STR_CONFIG_SETTING_DATE_FORMAT_IN_SAVE_NAMES_HELPTEXT
+strval = STR_CONFIG_SETTING_DATE_FORMAT_IN_SAVE_NAMES_LONG
+
+[SDTC_BOOL]
+var = gui.show_finances
+flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC
+def = true
+str = STR_CONFIG_SETTING_SHOWFINANCES
+strhelp = STR_CONFIG_SETTING_SHOWFINANCES_HELPTEXT
+cat = SC_BASIC
+
+[SDTC_VAR]
+var = gui.auto_scrolling
+type = SLE_UINT8
+flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC | SF_GUI_DROPDOWN
+def = 0
+min = 0
+max = 3
+str = STR_CONFIG_SETTING_AUTOSCROLL
+strhelp = STR_CONFIG_SETTING_AUTOSCROLL_HELPTEXT
+strval = STR_CONFIG_SETTING_AUTOSCROLL_DISABLED
+cat = SC_BASIC
+
+[SDTC_VAR]
+ifdef = __EMSCRIPTEN__
+var = gui.scroll_mode
+type = SLE_UINT8
+flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC | SF_GUI_DROPDOWN
+def = 2
+min = 0
+max = 3
+str = STR_CONFIG_SETTING_SCROLLMODE
+strhelp = STR_CONFIG_SETTING_SCROLLMODE_HELPTEXT
+strval = STR_CONFIG_SETTING_SCROLLMODE_DEFAULT
+cat = SC_BASIC
+
+[SDTC_VAR]
+ifndef = __EMSCRIPTEN__
+var = gui.scroll_mode
+type = SLE_UINT8
+flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC | SF_GUI_DROPDOWN
+def = 0
+min = 0
+max = 3
+str = STR_CONFIG_SETTING_SCROLLMODE
+strhelp = STR_CONFIG_SETTING_SCROLLMODE_HELPTEXT
+strval = STR_CONFIG_SETTING_SCROLLMODE_DEFAULT
+cat = SC_BASIC
+
+[SDTC_BOOL]
+var = gui.smooth_scroll
+flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC
+def = false
+str = STR_CONFIG_SETTING_SMOOTH_SCROLLING
+strhelp = STR_CONFIG_SETTING_SMOOTH_SCROLLING_HELPTEXT
+
+[SDTC_BOOL]
+var = gui.right_mouse_wnd_close
+flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC
+def = false
+str = STR_CONFIG_SETTING_RIGHT_MOUSE_WND_CLOSE
+strhelp = STR_CONFIG_SETTING_RIGHT_MOUSE_WND_CLOSE_HELPTEXT
+cat = SC_BASIC
+
+; We might need to emulate a right mouse button on mac
+[SDTC_VAR]
+ifdef = __APPLE__
+var = gui.right_mouse_btn_emulation
+type = SLE_UINT8
+flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC | SF_GUI_DROPDOWN
+def = 0
+min = 0
+max = 2
+str = STR_CONFIG_SETTING_RIGHT_MOUSE_BTN_EMU
+strhelp = STR_CONFIG_SETTING_RIGHT_MOUSE_BTN_EMU_HELPTEXT
+strval = STR_CONFIG_SETTING_RIGHT_MOUSE_BTN_EMU_COMMAND
+cat = SC_BASIC
+
+[SDTC_BOOL]
+var = gui.measure_tooltip
+flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC
+def = true
+str = STR_CONFIG_SETTING_MEASURE_TOOLTIP
+strhelp = STR_CONFIG_SETTING_MEASURE_TOOLTIP_HELPTEXT
+cat = SC_BASIC
+
+[SDTC_VAR]
+var = gui.errmsg_duration
+type = SLE_UINT8
+flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC
+def = 5
+min = 0
+max = 20
+str = STR_CONFIG_SETTING_ERRMSG_DURATION
+strhelp = STR_CONFIG_SETTING_ERRMSG_DURATION_HELPTEXT
+strval = STR_CONFIG_SETTING_ERRMSG_DURATION_VALUE
+
+[SDTC_VAR]
+var = gui.hover_delay_ms
+type = SLE_UINT16
+flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC | SF_GUI_0_IS_SPECIAL
+def = 250
+min = 50
+max = 6000
+interval = 50
+str = STR_CONFIG_SETTING_HOVER_DELAY
+strhelp = STR_CONFIG_SETTING_HOVER_DELAY_HELPTEXT
+strval = STR_CONFIG_SETTING_HOVER_DELAY_VALUE
+
+[SDTC_OMANY]
+var = gui.osk_activation
+type = SLE_UINT8
+flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC
+str = STR_CONFIG_SETTING_OSK_ACTIVATION
+strhelp = STR_CONFIG_SETTING_OSK_ACTIVATION_HELPTEXT
+strval = STR_CONFIG_SETTING_OSK_ACTIVATION_DISABLED
+flags = SF_GUI_DROPDOWN
+full = _osk_activation
+def = 1
+min = 0
+max = 3
+cat = SC_BASIC
+
+[SDTC_VAR]
+var = gui.toolbar_pos
+type = SLE_UINT8
+flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC | SF_GUI_DROPDOWN
+def = 1
+min = 0
+max = 2
+str = STR_CONFIG_SETTING_TOOLBAR_POS
+strhelp = STR_CONFIG_SETTING_TOOLBAR_POS_HELPTEXT
+strval = STR_CONFIG_SETTING_HORIZONTAL_POS_LEFT
+post_cb = v_PositionMainToolbar
+cat = SC_BASIC
+
+[SDTC_VAR]
+var = gui.statusbar_pos
+type = SLE_UINT8
+flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC | SF_GUI_DROPDOWN
+def = 1
+min = 0
+max = 2
+str = STR_CONFIG_SETTING_STATUSBAR_POS
+strhelp = STR_CONFIG_SETTING_STATUSBAR_POS_HELPTEXT
+strval = STR_CONFIG_SETTING_HORIZONTAL_POS_LEFT
+post_cb = v_PositionStatusbar
+cat = SC_BASIC
+
+[SDTC_VAR]
+var = gui.window_snap_radius
+type = SLE_UINT8
+flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC | SF_GUI_0_IS_SPECIAL
+def = 10
+min = 1
+max = 32
+str = STR_CONFIG_SETTING_SNAP_RADIUS
+strhelp = STR_CONFIG_SETTING_SNAP_RADIUS_HELPTEXT
+strval = STR_CONFIG_SETTING_SNAP_RADIUS_VALUE
+cat = SC_EXPERT
+
+[SDTC_VAR]
+var = gui.window_soft_limit
+type = SLE_UINT8
+flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC | SF_GUI_0_IS_SPECIAL
+def = 20
+min = 5
+max = 255
+interval = 1
+str = STR_CONFIG_SETTING_SOFT_LIMIT
+strhelp = STR_CONFIG_SETTING_SOFT_LIMIT_HELPTEXT
+strval = STR_CONFIG_SETTING_SOFT_LIMIT_VALUE
+cat = SC_EXPERT
+
+[SDTC_VAR]
+var = gui.zoom_min
+type = SLE_UINT8
+flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC | SF_GUI_DROPDOWN
+def = ZOOM_LVL_MIN
+min = ZOOM_LVL_MIN
+max = ZOOM_LVL_OUT_4X
+str = STR_CONFIG_SETTING_ZOOM_MIN
+strhelp = STR_CONFIG_SETTING_ZOOM_MIN_HELPTEXT
+strval = STR_CONFIG_SETTING_ZOOM_LVL_MIN
+post_cb = ZoomMinMaxChanged
+startup = true
+
+[SDTC_VAR]
+var = gui.zoom_max
+type = SLE_UINT8
+flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC | SF_GUI_DROPDOWN
+def = ZOOM_LVL_MAX
+min = ZOOM_LVL_OUT_8X
+max = ZOOM_LVL_MAX
+str = STR_CONFIG_SETTING_ZOOM_MAX
+strhelp = STR_CONFIG_SETTING_ZOOM_MAX_HELPTEXT
+strval = STR_CONFIG_SETTING_ZOOM_LVL_OUT_2X
+post_cb = ZoomMinMaxChanged
+startup = true
+
+[SDTC_VAR]
+var = gui.sprite_zoom_min
+type = SLE_UINT8
+flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC | SF_GUI_DROPDOWN
+def = ZOOM_LVL_MIN
+min = ZOOM_LVL_MIN
+max = ZOOM_LVL_OUT_4X
+str = STR_CONFIG_SETTING_SPRITE_ZOOM_MIN
+strhelp = STR_CONFIG_SETTING_SPRITE_ZOOM_MIN_HELPTEXT
+strval = STR_CONFIG_SETTING_SPRITE_ZOOM_LVL_MIN
+post_cb = SpriteZoomMinChanged
+
+[SDTC_BOOL]
+var = gui.population_in_label
+flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC
+def = true
+str = STR_CONFIG_SETTING_POPULATION_IN_LABEL
+strhelp = STR_CONFIG_SETTING_POPULATION_IN_LABEL_HELPTEXT
+post_cb = [](auto) { UpdateAllTownVirtCoords(); }
+
+[SDTC_BOOL]
+var = gui.link_terraform_toolbar
+flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC
+def = false
+str = STR_CONFIG_SETTING_LINK_TERRAFORM_TOOLBAR
+strhelp = STR_CONFIG_SETTING_LINK_TERRAFORM_TOOLBAR_HELPTEXT
+
+[SDTC_VAR]
+var = gui.smallmap_land_colour
+type = SLE_UINT8
+flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC | SF_GUI_DROPDOWN
+def = 0
+min = 0
+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
+post_cb = RedrawSmallmap
+
+[SDTC_VAR]
+var = gui.liveries
+type = SLE_UINT8
+flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC | SF_GUI_DROPDOWN
+def = 2
+min = 0
+max = 2
+str = STR_CONFIG_SETTING_LIVERIES
+strhelp = STR_CONFIG_SETTING_LIVERIES_HELPTEXT
+strval = STR_CONFIG_SETTING_LIVERIES_NONE
+post_cb = InvalidateCompanyLiveryWindow
+
+[SDTC_VAR]
+var = gui.starting_colour
+type = SLE_UINT8
+flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC | SF_GUI_DROPDOWN
+def = COLOUR_END
+min = 0
+max = COLOUR_END
+str = STR_CONFIG_SETTING_COMPANY_STARTING_COLOUR
+strhelp = STR_CONFIG_SETTING_COMPANY_STARTING_COLOUR_HELPTEXT
+strval = STR_COLOUR_DARK_BLUE
+
+[SDTC_BOOL]
+var = gui.auto_remove_signals
+flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC
+def = false
+str = STR_CONFIG_SETTING_AUTO_REMOVE_SIGNALS
+strhelp = STR_CONFIG_SETTING_AUTO_REMOVE_SIGNALS_HELPTEXT
+cat = SC_ADVANCED
+
+[SDTC_BOOL]
+var = gui.prefer_teamchat
+flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC
+def = false
+str = STR_CONFIG_SETTING_PREFER_TEAMCHAT
+strhelp = STR_CONFIG_SETTING_PREFER_TEAMCHAT_HELPTEXT
+cat = SC_BASIC
+
+[SDTC_VAR]
+var = gui.scrollwheel_scrolling
+type = SLE_UINT8
+flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC | SF_GUI_DROPDOWN
+def = 0
+min = 0
+max = 2
+str = STR_CONFIG_SETTING_SCROLLWHEEL_SCROLLING
+strhelp = STR_CONFIG_SETTING_SCROLLWHEEL_SCROLLING_HELPTEXT
+strval = STR_CONFIG_SETTING_SCROLLWHEEL_ZOOM
+cat = SC_BASIC
+
+[SDTC_VAR]
+var = gui.scrollwheel_multiplier
+type = SLE_UINT8
+flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC
+def = 5
+min = 1
+max = 15
+interval = 1
+str = STR_CONFIG_SETTING_SCROLLWHEEL_MULTIPLIER
+strhelp = STR_CONFIG_SETTING_SCROLLWHEEL_MULTIPLIER_HELPTEXT
+strval = STR_JUST_COMMA
+cat = SC_BASIC
+
+[SDTC_BOOL]
+var = gui.pause_on_newgame
+flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC
+def = false
+str = STR_CONFIG_SETTING_PAUSE_ON_NEW_GAME
+strhelp = STR_CONFIG_SETTING_PAUSE_ON_NEW_GAME_HELPTEXT
+cat = SC_BASIC
+
+[SDTC_VAR]
+var = gui.advanced_vehicle_list
+type = SLE_UINT8
+flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC | SF_GUI_DROPDOWN
+def = 1
+min = 0
+max = 2
+str = STR_CONFIG_SETTING_ADVANCED_VEHICLE_LISTS
+strhelp = STR_CONFIG_SETTING_ADVANCED_VEHICLE_LISTS_HELPTEXT
+strval = STR_CONFIG_SETTING_COMPANIES_OFF
+
+[SDTC_BOOL]
+var = gui.timetable_in_ticks
+flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC
+def = false
+str = STR_CONFIG_SETTING_TIMETABLE_IN_TICKS
+strhelp = STR_CONFIG_SETTING_TIMETABLE_IN_TICKS_HELPTEXT
+post_cb = [](auto) { InvalidateWindowClassesData(WC_VEHICLE_TIMETABLE, VIWD_MODIFY_ORDERS); }
+cat = SC_EXPERT
+
+[SDTC_BOOL]
+var = gui.timetable_arrival_departure
+flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC
+def = true
+str = STR_CONFIG_SETTING_TIMETABLE_SHOW_ARRIVAL_DEPARTURE
+strhelp = STR_CONFIG_SETTING_TIMETABLE_SHOW_ARRIVAL_DEPARTURE_HELPTEXT
+post_cb = [](auto) { InvalidateWindowClassesData(WC_VEHICLE_TIMETABLE, VIWD_MODIFY_ORDERS); }
+
+[SDTC_BOOL]
+var = gui.quick_goto
+flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC
+def = true
+str = STR_CONFIG_SETTING_QUICKGOTO
+strhelp = STR_CONFIG_SETTING_QUICKGOTO_HELPTEXT
+cat = SC_BASIC
+
+[SDTC_VAR]
+var = gui.loading_indicators
+type = SLE_UINT8
+flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC | SF_GUI_DROPDOWN
+def = 1
+min = 0
+max = 2
+str = STR_CONFIG_SETTING_LOADING_INDICATORS
+strhelp = STR_CONFIG_SETTING_LOADING_INDICATORS_HELPTEXT
+strval = STR_CONFIG_SETTING_COMPANIES_OFF
+post_cb = [](auto) { MarkWholeScreenDirty(); }
+cat = SC_BASIC
+
+[SDTC_VAR]
+var = gui.default_rail_type
+type = SLE_UINT8
+flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC | SF_GUI_DROPDOWN
+def = 0
+min = 0
+max = 2
+str = STR_CONFIG_SETTING_DEFAULT_RAIL_TYPE
+strhelp = STR_CONFIG_SETTING_DEFAULT_RAIL_TYPE_HELPTEXT
+strval = STR_CONFIG_SETTING_DEFAULT_RAIL_TYPE_FIRST
+cat = SC_BASIC
+
+[SDTC_BOOL]
+var = gui.enable_signal_gui
+flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC
+def = true
+str = STR_CONFIG_SETTING_ENABLE_SIGNAL_GUI
+strhelp = STR_CONFIG_SETTING_ENABLE_SIGNAL_GUI_HELPTEXT
+post_cb = CloseSignalGUI
+cat = SC_EXPERT
+
+[SDTC_VAR]
+var = gui.coloured_news_year
+type = SLE_INT32
+flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC
+def = 2000
+min = MIN_YEAR
+max = MAX_YEAR
+interval = 1
+str = STR_CONFIG_SETTING_COLOURED_NEWS_YEAR
+strhelp = STR_CONFIG_SETTING_COLOURED_NEWS_YEAR_HELPTEXT
+strval = STR_JUST_INT
+cat = SC_EXPERT
+
+[SDTC_VAR]
+var = gui.drag_signals_density
+type = SLE_UINT8
+flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC
+def = 4
+min = 1
+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
+post_cb = [](auto) { InvalidateWindowData(WC_BUILD_SIGNAL, 0); }
+cat = SC_BASIC
+
+[SDTC_BOOL]
+var = gui.drag_signals_fixed_distance
+flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC
+def = false
+str = STR_CONFIG_SETTING_DRAG_SIGNALS_FIXED_DISTANCE
+strhelp = STR_CONFIG_SETTING_DRAG_SIGNALS_FIXED_DISTANCE_HELPTEXT
+cat = SC_EXPERT
+
+[SDTC_VAR]
+var = gui.semaphore_build_before
+type = SLE_INT32
+flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC
+def = 1950
+min = MIN_YEAR
+max = MAX_YEAR
+interval = 1
+str = STR_CONFIG_SETTING_SEMAPHORE_BUILD_BEFORE_DATE
+strhelp = STR_CONFIG_SETTING_SEMAPHORE_BUILD_BEFORE_DATE_HELPTEXT
+strval = STR_JUST_INT
+post_cb = ResetSignalVariant
+
+[SDTC_BOOL]
+var = gui.vehicle_income_warn
+flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC
+def = true
+str = STR_CONFIG_SETTING_WARN_INCOME_LESS
+strhelp = STR_CONFIG_SETTING_WARN_INCOME_LESS_HELPTEXT
+cat = SC_BASIC
+
+[SDTC_VAR]
+var = gui.order_review_system
+type = SLE_UINT8
+flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC | SF_GUI_DROPDOWN
+def = 2
+min = 0
+max = 2
+str = STR_CONFIG_SETTING_ORDER_REVIEW
+strhelp = STR_CONFIG_SETTING_ORDER_REVIEW_HELPTEXT
+strval = STR_CONFIG_SETTING_ORDER_REVIEW_OFF
+cat = SC_BASIC
+
+[SDTC_BOOL]
+var = gui.lost_vehicle_warn
+flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC
+def = true
+str = STR_CONFIG_SETTING_WARN_LOST_VEHICLE
+strhelp = STR_CONFIG_SETTING_WARN_LOST_VEHICLE_HELPTEXT
+
+[SDTC_BOOL]
+var = gui.new_nonstop
+flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC
+def = true
+str = STR_CONFIG_SETTING_NONSTOP_BY_DEFAULT
+strhelp = STR_CONFIG_SETTING_NONSTOP_BY_DEFAULT_HELPTEXT
+cat = SC_BASIC
+
+[SDTC_VAR]
+var = gui.stop_location
+type = SLE_UINT8
+flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC | SF_GUI_DROPDOWN
+def = 2
+min = 0
+max = 2
+interval = 1
+str = STR_CONFIG_SETTING_STOP_LOCATION
+strhelp = STR_CONFIG_SETTING_STOP_LOCATION_HELPTEXT
+strval = STR_CONFIG_SETTING_STOP_LOCATION_NEAR_END
+cat = SC_BASIC
+
+[SDTC_BOOL]
+var = gui.keep_all_autosave
+flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC
+def = false
+
+[SDTC_BOOL]
+var = gui.autosave_on_exit
+flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC
+def = false
+cat = SC_BASIC
+
+[SDTC_BOOL]
+var = gui.autosave_on_network_disconnect
+flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC
+def = true
+cat = SC_EXPERT
+
+[SDTC_VAR]
+var = gui.max_num_autosaves
+type = SLE_UINT8
+flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC
+def = 16
+min = 0
+max = 255
+
+[SDTC_BOOL]
+var = gui.auto_euro
+flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC
+def = true
+
+[SDTC_VAR]
+var = gui.news_message_timeout
+type = SLE_UINT8
+flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC
+def = 2
+min = 1
+max = 255
+
+[SDTC_BOOL]
+var = gui.show_track_reservation
+flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC
+def = true
+str = STR_CONFIG_SETTING_SHOW_TRACK_RESERVATION
+strhelp = STR_CONFIG_SETTING_SHOW_TRACK_RESERVATION_HELPTEXT
+post_cb = [](auto) { MarkWholeScreenDirty(); }
+cat = SC_BASIC
+
+[SDTC_VAR]
+var = gui.default_signal_type
+type = SLE_UINT8
+flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC | SF_GUI_DROPDOWN
+def = 1
+min = 0
+max = 2
+interval = 1
+str = STR_CONFIG_SETTING_DEFAULT_SIGNAL_TYPE
+strhelp = STR_CONFIG_SETTING_DEFAULT_SIGNAL_TYPE_HELPTEXT
+strval = STR_CONFIG_SETTING_DEFAULT_SIGNAL_NORMAL
+cat = SC_BASIC
+
+[SDTC_VAR]
+var = gui.cycle_signal_types
+type = SLE_UINT8
+flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC | SF_GUI_DROPDOWN
+def = 2
+min = 0
+max = 2
+interval = 1
+str = STR_CONFIG_SETTING_CYCLE_SIGNAL_TYPES
+strhelp = STR_CONFIG_SETTING_CYCLE_SIGNAL_TYPES_HELPTEXT
+strval = STR_CONFIG_SETTING_CYCLE_SIGNAL_NORMAL
+
+[SDTC_VAR]
+var = gui.station_numtracks
+type = SLE_UINT8
+flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC
+def = 1
+min = 1
+max = 7
+
+[SDTC_VAR]
+var = gui.station_platlength
+type = SLE_UINT8
+flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC
+def = 5
+min = 1
+max = 7
+cat = SC_BASIC
+
+[SDTC_BOOL]
+var = gui.station_dragdrop
+flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC
+def = true
+cat = SC_BASIC
+
+[SDTC_BOOL]
+var = gui.station_show_coverage
+flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC
+def = false
+cat = SC_BASIC
+
+[SDTC_BOOL]
+var = gui.persistent_buildingtools
+flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC
+def = true
+str = STR_CONFIG_SETTING_PERSISTENT_BUILDINGTOOLS
+strhelp = STR_CONFIG_SETTING_PERSISTENT_BUILDINGTOOLS_HELPTEXT
+cat = SC_BASIC
+
+[SDTC_BOOL]
+var = gui.expenses_layout
+flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC
+def = true
+str = STR_CONFIG_SETTING_EXPENSES_LAYOUT
+strhelp = STR_CONFIG_SETTING_EXPENSES_LAYOUT_HELPTEXT
+post_cb = [](auto) { MarkWholeScreenDirty(); }
+
+[SDTC_VAR]
+var = gui.station_gui_group_order
+type = SLE_UINT8
+flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC
+def = 0
+min = 0
+max = 5
+interval = 1
+
+[SDTC_VAR]
+var = gui.station_gui_sort_by
+type = SLE_UINT8
+flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC
+def = 0
+min = 0
+max = 3
+interval = 1
+
+[SDTC_VAR]
+var = gui.station_gui_sort_order
+type = SLE_UINT8
+flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC
+def = 0
+min = 0
+max = 1
+interval = 1
+
+[SDTC_VAR]
+var = gui.missing_strings_threshold
+type = SLE_UINT8
+flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC
+def = 25
+min = 1
+max = UINT8_MAX
+cat = SC_EXPERT
+
+[SDTC_VAR]
+var = gui.graph_line_thickness
+type = SLE_UINT8
+flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC
+def = 3
+min = 1
+max = 5
+str = STR_CONFIG_SETTING_GRAPH_LINE_THICKNESS
+strhelp = STR_CONFIG_SETTING_GRAPH_LINE_THICKNESS_HELPTEXT
+strval = STR_JUST_COMMA
+post_cb = [](auto) { MarkWholeScreenDirty(); }
+
+[SDTC_BOOL]
+var = gui.show_newgrf_name
+flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC
+def = false
+str = STR_CONFIG_SETTING_SHOW_NEWGRF_NAME
+strhelp = STR_CONFIG_SETTING_SHOW_NEWGRF_NAME_HELPTEXT
+post_cb = [](auto) { MarkWholeScreenDirty(); }
+cat = SC_ADVANCED
+
+; For the dedicated build we'll enable dates in logs by default.
+[SDTC_BOOL]
+ifdef = DEDICATED
+var = gui.show_date_in_logs
+flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC
+def = true
+
+[SDTC_BOOL]
+ifndef = DEDICATED
+var = gui.show_date_in_logs
+flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC
+def = false
+
+[SDTC_VAR]
+var = gui.settings_restriction_mode
+type = SLE_UINT8
+flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC
+def = 0
+min = 0
+max = 2
+
+[SDTC_VAR]
+var = gui.developer
+type = SLE_UINT8
+flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC
+def = 1
+min = 0
+max = 2
+cat = SC_EXPERT
+
+[SDTC_BOOL]
+var = gui.newgrf_developer_tools
+flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC
+def = false
+post_cb = InvalidateNewGRFChangeWindows
+cat = SC_EXPERT
+
+[SDTC_BOOL]
+var = gui.ai_developer_tools
+flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC
+def = false
+post_cb = [](auto) { InvalidateWindowClassesData(WC_AI_SETTINGS); }
+cat = SC_EXPERT
+
+[SDTC_BOOL]
+var = gui.scenario_developer
+flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC
+def = false
+post_cb = InvalidateNewGRFChangeWindows
+
+[SDTC_BOOL]
+var = gui.newgrf_show_old_versions
+flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC
+def = false
+cat = SC_EXPERT
+
+[SDTC_VAR]
+var = gui.newgrf_default_palette
+type = SLE_UINT8
+flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC | SF_GUI_DROPDOWN
+def = 1
+min = 0
+max = 1
+post_cb = UpdateNewGRFConfigPalette
+cat = SC_EXPERT
+
+[SDTC_VAR]
+var = gui.console_backlog_timeout
+type = SLE_UINT16
+flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC
+def = 100
+min = 10
+max = 65500
+
+[SDTC_VAR]
+var = gui.console_backlog_length
+type = SLE_UINT16
+flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC
+def = 100
+min = 10
+max = 65500
+
+[SDTC_VAR]
+var = gui.refresh_rate
+type = SLE_UINT16
+flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC
+def = 60
+min = 10
+max = 1000
+cat = SC_EXPERT
+startup = true
+
+[SDTC_VAR]
+var = gui.fast_forward_speed_limit
+type = SLE_UINT16
+flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC | SF_GUI_0_IS_SPECIAL | SF_NO_NETWORK
+def = 2500
+min = 0
+max = 50000
+interval = 10
+str = STR_CONFIG_SETTING_FAST_FORWARD_SPEED_LIMIT
+strhelp = STR_CONFIG_SETTING_FAST_FORWARD_SPEED_LIMIT_HELPTEXT
+strval = STR_CONFIG_SETTING_FAST_FORWARD_SPEED_LIMIT_VAL
+cat = SC_BASIC
+
+[SDTC_VAR]
+var = gui.network_chat_box_width_pct
+type = SLE_UINT16
+flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC
+def = 40
+min = 10
+max = 100
+cat = SC_EXPERT
+
+[SDTC_VAR]
+var = gui.network_chat_box_height
+type = SLE_UINT8
+flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC
+def = 25
+min = 5
+max = 255
+cat = SC_EXPERT
+
+[SDTC_VAR]
+var = gui.network_chat_timeout
+type = SLE_UINT16
+flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC
+def = 20
+min = 1
+max = 65535
+cat = SC_EXPERT
+
diff --git a/src/table/settings/linkgraph_settings.ini b/src/table/settings/linkgraph_settings.ini
new file mode 100644
index 000000000..04ef32d62
--- /dev/null
+++ b/src/table/settings/linkgraph_settings.ini
@@ -0,0 +1,168 @@
+; This file is part of OpenTTD.
+; OpenTTD is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2.
+; OpenTTD is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+; See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with OpenTTD. If not, see <http://www.gnu.org/licenses/>.
+;
+
+; Linkgraph settings as stored in the main configuration file ("openttd.cfg")
+; and in the savegame PATS chunk and in the linkgraph chunks for each job running.
+
+[pre-amble]
+static const SettingVariant _linkgraph_settings_table[] = {
+[post-amble]
+};
+[templates]
+SDT_VAR = SDT_VAR(GameSettings, $var, $type, $flags, $def, $min, $max, $interval, $str, $strhelp, $strval, $pre_cb, $post_cb, $from, $to, $cat, $extra, $startup),
+
+[validation]
+SDT_VAR = static_assert($max <= MAX_$type, "Maximum value for GameSettings.$var exceeds storage size");
+
+[defaults]
+flags = SF_NONE
+interval = 0
+str = STR_NULL
+strhelp = STR_CONFIG_SETTING_NO_EXPLANATION_AVAILABLE_HELPTEXT
+strval = STR_NULL
+pre_cb = nullptr
+post_cb = nullptr
+load = nullptr
+from = SL_MIN_VERSION
+to = SL_MAX_VERSION
+cat = SC_ADVANCED
+extra = 0
+startup = false
+
+
+[SDT_VAR]
+var = linkgraph.recalc_interval
+type = SLE_UINT16
+from = SLV_183
+def = 4
+min = 2
+max = 32
+interval = 2
+str = STR_CONFIG_SETTING_LINKGRAPH_INTERVAL
+strval = STR_JUST_COMMA
+strhelp = STR_CONFIG_SETTING_LINKGRAPH_INTERVAL_HELPTEXT
+extra = offsetof(LinkGraphSettings, recalc_interval)
+
+[SDT_VAR]
+var = linkgraph.recalc_time
+type = SLE_UINT16
+from = SLV_183
+def = 16
+min = 1
+max = 4096
+interval = 1
+str = STR_CONFIG_SETTING_LINKGRAPH_TIME
+strval = STR_JUST_COMMA
+strhelp = STR_CONFIG_SETTING_LINKGRAPH_TIME_HELPTEXT
+extra = offsetof(LinkGraphSettings, recalc_time)
+
+[SDT_VAR]
+var = linkgraph.distribution_pax
+type = SLE_UINT8
+from = SLV_183
+flags = SF_GUI_DROPDOWN
+def = DT_MANUAL
+min = DT_MIN
+max = DT_MAX
+interval = 1
+str = STR_CONFIG_SETTING_DISTRIBUTION_PAX
+strval = STR_CONFIG_SETTING_DISTRIBUTION_MANUAL
+strhelp = STR_CONFIG_SETTING_DISTRIBUTION_PAX_HELPTEXT
+extra = offsetof(LinkGraphSettings, distribution_pax)
+
+[SDT_VAR]
+var = linkgraph.distribution_mail
+type = SLE_UINT8
+from = SLV_183
+flags = SF_GUI_DROPDOWN
+def = DT_MANUAL
+min = DT_MIN
+max = DT_MAX
+interval = 1
+str = STR_CONFIG_SETTING_DISTRIBUTION_MAIL
+strval = STR_CONFIG_SETTING_DISTRIBUTION_MANUAL
+strhelp = STR_CONFIG_SETTING_DISTRIBUTION_MAIL_HELPTEXT
+extra = offsetof(LinkGraphSettings, distribution_mail)
+
+[SDT_VAR]
+var = linkgraph.distribution_armoured
+type = SLE_UINT8
+from = SLV_183
+flags = SF_GUI_DROPDOWN
+def = DT_MANUAL
+min = DT_MIN
+max = DT_MAX
+interval = 1
+str = STR_CONFIG_SETTING_DISTRIBUTION_ARMOURED
+strval = STR_CONFIG_SETTING_DISTRIBUTION_MANUAL
+strhelp = STR_CONFIG_SETTING_DISTRIBUTION_ARMOURED_HELPTEXT
+extra = offsetof(LinkGraphSettings, distribution_armoured)
+
+[SDT_VAR]
+var = linkgraph.distribution_default
+type = SLE_UINT8
+from = SLV_183
+flags = SF_GUI_DROPDOWN
+def = DT_MANUAL
+min = DT_BEGIN
+max = DT_MAX_NONSYMMETRIC
+interval = 1
+str = STR_CONFIG_SETTING_DISTRIBUTION_DEFAULT
+strval = STR_CONFIG_SETTING_DISTRIBUTION_MANUAL
+strhelp = STR_CONFIG_SETTING_DISTRIBUTION_DEFAULT_HELPTEXT
+extra = offsetof(LinkGraphSettings, distribution_default)
+
+[SDT_VAR]
+var = linkgraph.accuracy
+type = SLE_UINT8
+from = SLV_183
+def = 16
+min = 2
+max = 64
+interval = 1
+str = STR_CONFIG_SETTING_LINKGRAPH_ACCURACY
+strval = STR_JUST_COMMA
+strhelp = STR_CONFIG_SETTING_LINKGRAPH_ACCURACY_HELPTEXT
+extra = offsetof(LinkGraphSettings, accuracy)
+
+[SDT_VAR]
+var = linkgraph.demand_distance
+type = SLE_UINT8
+from = SLV_183
+def = 100
+min = 0
+max = 255
+interval = 5
+str = STR_CONFIG_SETTING_DEMAND_DISTANCE
+strval = STR_CONFIG_SETTING_PERCENTAGE
+strhelp = STR_CONFIG_SETTING_DEMAND_DISTANCE_HELPTEXT
+extra = offsetof(LinkGraphSettings, demand_distance)
+
+[SDT_VAR]
+var = linkgraph.demand_size
+type = SLE_UINT8
+from = SLV_183
+def = 100
+min = 0
+max = 100
+interval = 5
+str = STR_CONFIG_SETTING_DEMAND_SIZE
+strval = STR_CONFIG_SETTING_PERCENTAGE
+strhelp = STR_CONFIG_SETTING_DEMAND_SIZE_HELPTEXT
+extra = offsetof(LinkGraphSettings, demand_size)
+
+[SDT_VAR]
+var = linkgraph.short_path_saturation
+type = SLE_UINT8
+from = SLV_183
+def = 80
+min = 0
+max = 250
+interval = 5
+str = STR_CONFIG_SETTING_SHORT_PATH_SATURATION
+strval = STR_CONFIG_SETTING_PERCENTAGE
+strhelp = STR_CONFIG_SETTING_SHORT_PATH_SATURATION_HELPTEXT
+extra = offsetof(LinkGraphSettings, short_path_saturation)
diff --git a/src/table/settings/locale_settings.ini b/src/table/settings/locale_settings.ini
new file mode 100644
index 000000000..777ae15cf
--- /dev/null
+++ b/src/table/settings/locale_settings.ini
@@ -0,0 +1,177 @@
+; This file is part of OpenTTD.
+; OpenTTD is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2.
+; OpenTTD is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+; See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with OpenTTD. If not, see <http://www.gnu.org/licenses/>.
+;
+
+; Locale settings as stored in the main configuration file ("openttd.cfg") and
+; in the savegame PATS chunk. These settings are not sync'd over the network.
+
+[pre-amble]
+uint8 _old_units; ///< Old units from old savegames
+
+static std::initializer_list<const char*> _locale_currencies{"GBP", "USD", "EUR", "YEN", "ATS", "BEF", "CHF", "CZK", "DEM", "DKK", "ESP", "FIM", "FRF", "GRD", "HUF", "ISK", "ITL", "NLG", "NOK", "PLN", "RON", "RUR", "SIT", "SEK", "YTL", "SKK", "BRL", "EEK", "custom"};
+static std::initializer_list<const char*> _locale_units{"imperial", "metric", "si", "gameunits"};
+
+static const SettingVariant _locale_settings_table[] = {
+[post-amble]
+};
+[templates]
+SDTG_OMANY = SDTG_OMANY($name, $type, $flags, $var, $def, $max, $full, $str, $strhelp, $strval, $pre_cb, $post_cb, $from, $to, $cat, $extra, $startup),
+SDT_OMANY = SDT_OMANY(GameSettings, $var, $type, $flags, $def, $max, $full, $str, $strhelp, $strval, $pre_cb, $post_cb, $from, $to, $load, $cat, $extra, $startup),
+SDT_SSTR = SDT_SSTR(GameSettings, $var, $type, $flags, $def, $pre_cb, $post_cb, $from, $to, $cat, $extra, $startup),
+
+[validation]
+SDTG_OMANY = static_assert($max <= MAX_$type, "Maximum value for $var exceeds storage size");
+SDT_OMANY = static_assert($max <= MAX_$type, "Maximum value for GameSettings.$var exceeds storage size");
+
+[defaults]
+flags = SF_NONE
+interval = 0
+str = STR_NULL
+strhelp = STR_CONFIG_SETTING_NO_EXPLANATION_AVAILABLE_HELPTEXT
+strval = STR_NULL
+pre_cb = nullptr
+post_cb = nullptr
+load = nullptr
+from = SL_MIN_VERSION
+to = SL_MAX_VERSION
+cat = SC_ADVANCED
+extra = 0
+startup = false
+
+
+[SDT_OMANY]
+var = locale.currency
+type = SLE_UINT8
+from = SLV_97
+flags = SF_NO_NETWORK_SYNC
+def = 0
+max = CURRENCY_END - 1
+full = _locale_currencies
+post_cb = [](auto) { MarkWholeScreenDirty(); }
+cat = SC_BASIC
+
+[SDTG_OMANY]
+name = ""units""
+var = _old_units
+type = SLE_UINT8
+from = SLV_97
+to = SLV_184
+flags = SF_NOT_IN_CONFIG
+def = 1
+max = 2
+full = _locale_units
+post_cb = [](auto) { MarkWholeScreenDirty(); }
+cat = SC_BASIC
+
+[SDT_OMANY]
+var = locale.units_velocity
+type = SLE_UINT8
+from = SLV_184
+flags = SF_NO_NETWORK_SYNC | SF_GUI_DROPDOWN
+def = 1
+max = 3
+full = _locale_units
+post_cb = [](auto) { MarkWholeScreenDirty(); }
+cat = SC_BASIC
+str = STR_CONFIG_SETTING_LOCALISATION_UNITS_VELOCITY
+strhelp = STR_CONFIG_SETTING_LOCALISATION_UNITS_VELOCITY_HELPTEXT
+strval = STR_CONFIG_SETTING_LOCALISATION_UNITS_VELOCITY_IMPERIAL
+
+[SDT_OMANY]
+var = locale.units_power
+type = SLE_UINT8
+from = SLV_184
+flags = SF_NO_NETWORK_SYNC | SF_GUI_DROPDOWN
+def = 1
+max = 2
+full = _locale_units
+post_cb = [](auto) { MarkWholeScreenDirty(); }
+cat = SC_BASIC
+str = STR_CONFIG_SETTING_LOCALISATION_UNITS_POWER
+strhelp = STR_CONFIG_SETTING_LOCALISATION_UNITS_POWER_HELPTEXT
+strval = STR_CONFIG_SETTING_LOCALISATION_UNITS_POWER_IMPERIAL
+
+[SDT_OMANY]
+var = locale.units_weight
+type = SLE_UINT8
+from = SLV_184
+flags = SF_NO_NETWORK_SYNC | SF_GUI_DROPDOWN
+def = 1
+max = 2
+full = _locale_units
+post_cb = [](auto) { MarkWholeScreenDirty(); }
+cat = SC_BASIC
+str = STR_CONFIG_SETTING_LOCALISATION_UNITS_WEIGHT
+strhelp = STR_CONFIG_SETTING_LOCALISATION_UNITS_WEIGHT_HELPTEXT
+strval = STR_CONFIG_SETTING_LOCALISATION_UNITS_WEIGHT_IMPERIAL
+
+[SDT_OMANY]
+var = locale.units_volume
+type = SLE_UINT8
+from = SLV_184
+flags = SF_NO_NETWORK_SYNC | SF_GUI_DROPDOWN
+def = 1
+max = 2
+full = _locale_units
+post_cb = [](auto) { MarkWholeScreenDirty(); }
+cat = SC_BASIC
+str = STR_CONFIG_SETTING_LOCALISATION_UNITS_VOLUME
+strhelp = STR_CONFIG_SETTING_LOCALISATION_UNITS_VOLUME_HELPTEXT
+strval = STR_CONFIG_SETTING_LOCALISATION_UNITS_VOLUME_IMPERIAL
+
+[SDT_OMANY]
+var = locale.units_force
+type = SLE_UINT8
+from = SLV_184
+flags = SF_NO_NETWORK_SYNC | SF_GUI_DROPDOWN
+def = 2
+max = 2
+full = _locale_units
+post_cb = [](auto) { MarkWholeScreenDirty(); }
+cat = SC_BASIC
+str = STR_CONFIG_SETTING_LOCALISATION_UNITS_FORCE
+strhelp = STR_CONFIG_SETTING_LOCALISATION_UNITS_FORCE_HELPTEXT
+strval = STR_CONFIG_SETTING_LOCALISATION_UNITS_FORCE_IMPERIAL
+
+[SDT_OMANY]
+var = locale.units_height
+type = SLE_UINT8
+from = SLV_184
+flags = SF_NO_NETWORK_SYNC | SF_GUI_DROPDOWN
+def = 1
+max = 2
+full = _locale_units
+post_cb = [](auto) { MarkWholeScreenDirty(); }
+cat = SC_BASIC
+str = STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT
+strhelp = STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT_HELPTEXT
+strval = STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT_IMPERIAL
+
+[SDT_SSTR]
+var = locale.digit_group_separator
+type = SLE_STRQ
+from = SLV_118
+flags = SF_NO_NETWORK_SYNC
+def = nullptr
+post_cb = [](auto) { MarkWholeScreenDirty(); }
+cat = SC_BASIC
+
+[SDT_SSTR]
+var = locale.digit_group_separator_currency
+type = SLE_STRQ
+from = SLV_118
+flags = SF_NO_NETWORK_SYNC
+def = nullptr
+post_cb = [](auto) { MarkWholeScreenDirty(); }
+cat = SC_BASIC
+
+[SDT_SSTR]
+var = locale.digit_decimal_separator
+type = SLE_STRQ
+from = SLV_126
+flags = SF_NO_NETWORK_SYNC
+def = nullptr
+post_cb = [](auto) { MarkWholeScreenDirty(); }
+cat = SC_BASIC
diff --git a/src/table/settings/multimedia_settings.ini b/src/table/settings/multimedia_settings.ini
new file mode 100644
index 000000000..14c6b7b30
--- /dev/null
+++ b/src/table/settings/multimedia_settings.ini
@@ -0,0 +1,148 @@
+; This file is part of OpenTTD.
+; OpenTTD is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2.
+; OpenTTD is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+; See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with OpenTTD. If not, see <http://www.gnu.org/licenses/>.
+;
+
+; Multimedia (sound / music) settings as stored in the main configuration file ("openttd.cfg").
+
+[pre-amble]
+
+static const SettingVariant _multimedia_settings_table[] = {
+[post-amble]
+};
+[templates]
+SDTC_BOOL = SDTC_BOOL( $var, $flags, $def, $str, $strhelp, $strval, $pre_cb, $post_cb, $from, $to, $cat, $extra, $startup),
+SDTC_LIST = SDTC_LIST( $var, $type, $flags, $def, $from, $to, $cat, $extra, $startup),
+SDTC_VAR = SDTC_VAR( $var, $type, $flags, $def, $min, $max, $interval, $str, $strhelp, $strval, $pre_cb, $post_cb, $from, $to, $cat, $extra, $startup),
+
+[validation]
+SDTC_VAR = static_assert($max <= MAX_$type, "Maximum value for $var exceeds storage size");
+
+[defaults]
+flags = SF_NONE
+interval = 0
+str = STR_NULL
+strhelp = STR_CONFIG_SETTING_NO_EXPLANATION_AVAILABLE_HELPTEXT
+strval = STR_NULL
+pre_cb = nullptr
+post_cb = nullptr
+load = nullptr
+from = SL_MIN_VERSION
+to = SL_MAX_VERSION
+cat = SC_ADVANCED
+extra = 0
+startup = false
+
+
+[SDTC_BOOL]
+var = sound.news_ticker
+flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC
+def = true
+str = STR_CONFIG_SETTING_SOUND_TICKER
+strhelp = STR_CONFIG_SETTING_SOUND_TICKER_HELPTEXT
+
+[SDTC_BOOL]
+var = sound.news_full
+flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC
+def = true
+str = STR_CONFIG_SETTING_SOUND_NEWS
+strhelp = STR_CONFIG_SETTING_SOUND_NEWS_HELPTEXT
+
+[SDTC_BOOL]
+var = sound.new_year
+flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC
+def = true
+str = STR_CONFIG_SETTING_SOUND_NEW_YEAR
+strhelp = STR_CONFIG_SETTING_SOUND_NEW_YEAR_HELPTEXT
+
+[SDTC_BOOL]
+var = sound.confirm
+flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC
+def = true
+str = STR_CONFIG_SETTING_SOUND_CONFIRM
+strhelp = STR_CONFIG_SETTING_SOUND_CONFIRM_HELPTEXT
+
+[SDTC_BOOL]
+var = sound.click_beep
+flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC
+def = true
+str = STR_CONFIG_SETTING_SOUND_CLICK
+strhelp = STR_CONFIG_SETTING_SOUND_CLICK_HELPTEXT
+
+[SDTC_BOOL]
+var = sound.disaster
+flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC
+def = true
+str = STR_CONFIG_SETTING_SOUND_DISASTER
+strhelp = STR_CONFIG_SETTING_SOUND_DISASTER_HELPTEXT
+
+[SDTC_BOOL]
+var = sound.vehicle
+flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC
+def = true
+str = STR_CONFIG_SETTING_SOUND_VEHICLE
+strhelp = STR_CONFIG_SETTING_SOUND_VEHICLE_HELPTEXT
+
+[SDTC_BOOL]
+var = sound.ambient
+flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC
+def = true
+str = STR_CONFIG_SETTING_SOUND_AMBIENT
+strhelp = STR_CONFIG_SETTING_SOUND_AMBIENT_HELPTEXT
+
+[SDTC_VAR]
+var = music.playlist
+type = SLE_UINT8
+flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC
+def = 0
+min = 0
+max = 5
+interval = 1
+cat = SC_BASIC
+
+[SDTC_VAR]
+var = music.music_vol
+type = SLE_UINT8
+flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC
+def = 50
+min = 0
+max = 127
+interval = 1
+cat = SC_BASIC
+
+[SDTC_VAR]
+var = music.effect_vol
+type = SLE_UINT8
+flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC
+def = 100
+min = 0
+max = 127
+interval = 1
+cat = SC_BASIC
+
+[SDTC_LIST]
+var = music.custom_1
+type = SLE_UINT8
+flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC
+def = nullptr
+cat = SC_BASIC
+
+[SDTC_LIST]
+var = music.custom_2
+type = SLE_UINT8
+flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC
+def = nullptr
+cat = SC_BASIC
+
+[SDTC_BOOL]
+var = music.playing
+flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC
+def = true
+cat = SC_BASIC
+
+[SDTC_BOOL]
+var = music.shuffle
+flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC
+def = false
+cat = SC_BASIC
diff --git a/src/table/settings/news_display_settings.ini b/src/table/settings/news_display_settings.ini
new file mode 100644
index 000000000..e3a23d355
--- /dev/null
+++ b/src/table/settings/news_display_settings.ini
@@ -0,0 +1,201 @@
+; This file is part of OpenTTD.
+; OpenTTD is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2.
+; OpenTTD is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+; See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with OpenTTD. If not, see <http://www.gnu.org/licenses/>.
+;
+
+; News display settings as stored in the main configuration file ("openttd.cfg").
+
+[pre-amble]
+static std::initializer_list<const char*> _news_display{ "off", "summarized", "full"};
+
+static const SettingVariant _news_display_settings_table[] = {
+[post-amble]
+};
+[templates]
+SDTC_OMANY = SDTC_OMANY( $var, $type, $flags, $def, $max, $full, $str, $strhelp, $strval, $pre_cb, $post_cb, $from, $to, $cat, $extra, $startup),
+
+[validation]
+SDTC_OMANY = static_assert($max <= MAX_$type, "Maximum value for $var exceeds storage size");
+
+[defaults]
+flags = SF_NONE
+interval = 0
+str = STR_NULL
+strhelp = STR_CONFIG_SETTING_NO_EXPLANATION_AVAILABLE_HELPTEXT
+strval = STR_NULL
+pre_cb = nullptr
+post_cb = nullptr
+load = nullptr
+from = SL_MIN_VERSION
+to = SL_MAX_VERSION
+cat = SC_ADVANCED
+extra = 0
+startup = false
+
+
+[SDTC_OMANY]
+var = news_display.arrival_player
+type = SLE_UINT8
+flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC | SF_GUI_DROPDOWN
+def = 2
+max = 2
+full = _news_display
+str = STR_CONFIG_SETTING_NEWS_ARRIVAL_FIRST_VEHICLE_OWN
+strhelp = STR_CONFIG_SETTING_NEWS_ARRIVAL_FIRST_VEHICLE_OWN_HELPTEXT
+strval = STR_CONFIG_SETTING_NEWS_MESSAGES_OFF
+
+[SDTC_OMANY]
+var = news_display.arrival_other
+type = SLE_UINT8
+flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC | SF_GUI_DROPDOWN
+def = 1
+max = 2
+full = _news_display
+str = STR_CONFIG_SETTING_NEWS_ARRIVAL_FIRST_VEHICLE_OTHER
+strhelp = STR_CONFIG_SETTING_NEWS_ARRIVAL_FIRST_VEHICLE_OTHER_HELPTEXT
+strval = STR_CONFIG_SETTING_NEWS_MESSAGES_OFF
+
+[SDTC_OMANY]
+var = news_display.accident
+type = SLE_UINT8
+flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC | SF_GUI_DROPDOWN
+def = 2
+max = 2
+full = _news_display
+str = STR_CONFIG_SETTING_NEWS_ACCIDENTS_DISASTERS
+strhelp = STR_CONFIG_SETTING_NEWS_ACCIDENTS_DISASTERS_HELPTEXT
+strval = STR_CONFIG_SETTING_NEWS_MESSAGES_OFF
+
+[SDTC_OMANY]
+var = news_display.company_info
+type = SLE_UINT8
+flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC | SF_GUI_DROPDOWN
+def = 2
+max = 2
+full = _news_display
+str = STR_CONFIG_SETTING_NEWS_COMPANY_INFORMATION
+strhelp = STR_CONFIG_SETTING_NEWS_COMPANY_INFORMATION_HELPTEXT
+strval = STR_CONFIG_SETTING_NEWS_MESSAGES_OFF
+
+[SDTC_OMANY]
+var = news_display.open
+type = SLE_UINT8
+flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC | SF_GUI_DROPDOWN
+def = 1
+max = 2
+full = _news_display
+str = STR_CONFIG_SETTING_NEWS_INDUSTRY_OPEN
+strhelp = STR_CONFIG_SETTING_NEWS_INDUSTRY_OPEN_HELPTEXT
+strval = STR_CONFIG_SETTING_NEWS_MESSAGES_OFF
+
+[SDTC_OMANY]
+var = news_display.close
+type = SLE_UINT8
+flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC | SF_GUI_DROPDOWN
+def = 1
+max = 2
+full = _news_display
+str = STR_CONFIG_SETTING_NEWS_INDUSTRY_CLOSE
+strhelp = STR_CONFIG_SETTING_NEWS_INDUSTRY_CLOSE_HELPTEXT
+strval = STR_CONFIG_SETTING_NEWS_MESSAGES_OFF
+
+[SDTC_OMANY]
+var = news_display.economy
+type = SLE_UINT8
+flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC | SF_GUI_DROPDOWN
+def = 2
+max = 2
+full = _news_display
+str = STR_CONFIG_SETTING_NEWS_ECONOMY_CHANGES
+strhelp = STR_CONFIG_SETTING_NEWS_ECONOMY_CHANGES_HELPTEXT
+strval = STR_CONFIG_SETTING_NEWS_MESSAGES_OFF
+
+[SDTC_OMANY]
+var = news_display.production_player
+type = SLE_UINT8
+flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC | SF_GUI_DROPDOWN
+def = 1
+max = 2
+full = _news_display
+str = STR_CONFIG_SETTING_NEWS_INDUSTRY_CHANGES_COMPANY
+strhelp = STR_CONFIG_SETTING_NEWS_INDUSTRY_CHANGES_COMPANY_HELPTEXT
+strval = STR_CONFIG_SETTING_NEWS_MESSAGES_OFF
+
+[SDTC_OMANY]
+var = news_display.production_other
+type = SLE_UINT8
+flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC | SF_GUI_DROPDOWN
+def = 0
+max = 2
+full = _news_display
+str = STR_CONFIG_SETTING_NEWS_INDUSTRY_CHANGES_OTHER
+strhelp = STR_CONFIG_SETTING_NEWS_INDUSTRY_CHANGES_OTHER_HELPTEXT
+strval = STR_CONFIG_SETTING_NEWS_MESSAGES_OFF
+
+[SDTC_OMANY]
+var = news_display.production_nobody
+type = SLE_UINT8
+flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC | SF_GUI_DROPDOWN
+def = 0
+max = 2
+full = _news_display
+str = STR_CONFIG_SETTING_NEWS_INDUSTRY_CHANGES_UNSERVED
+strhelp = STR_CONFIG_SETTING_NEWS_INDUSTRY_CHANGES_UNSERVED_HELPTEXT
+strval = STR_CONFIG_SETTING_NEWS_MESSAGES_OFF
+
+[SDTC_OMANY]
+var = news_display.advice
+type = SLE_UINT8
+flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC | SF_GUI_DROPDOWN
+def = 2
+max = 2
+full = _news_display
+str = STR_CONFIG_SETTING_NEWS_ADVICE
+strhelp = STR_CONFIG_SETTING_NEWS_ADVICE_HELPTEXT
+strval = STR_CONFIG_SETTING_NEWS_MESSAGES_OFF
+
+[SDTC_OMANY]
+var = news_display.new_vehicles
+type = SLE_UINT8
+flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC | SF_GUI_DROPDOWN
+def = 2
+max = 2
+full = _news_display
+str = STR_CONFIG_SETTING_NEWS_NEW_VEHICLES
+strhelp = STR_CONFIG_SETTING_NEWS_NEW_VEHICLES_HELPTEXT
+strval = STR_CONFIG_SETTING_NEWS_MESSAGES_OFF
+
+[SDTC_OMANY]
+var = news_display.acceptance
+type = SLE_UINT8
+flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC | SF_GUI_DROPDOWN
+def = 2
+max = 2
+full = _news_display
+str = STR_CONFIG_SETTING_NEWS_CHANGES_ACCEPTANCE
+strhelp = STR_CONFIG_SETTING_NEWS_CHANGES_ACCEPTANCE_HELPTEXT
+strval = STR_CONFIG_SETTING_NEWS_MESSAGES_OFF
+
+[SDTC_OMANY]
+var = news_display.subsidies
+type = SLE_UINT8
+flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC | SF_GUI_DROPDOWN
+def = 1
+max = 2
+full = _news_display
+str = STR_CONFIG_SETTING_NEWS_SUBSIDIES
+strhelp = STR_CONFIG_SETTING_NEWS_SUBSIDIES_HELPTEXT
+strval = STR_CONFIG_SETTING_NEWS_MESSAGES_OFF
+
+[SDTC_OMANY]
+var = news_display.general
+type = SLE_UINT8
+flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC | SF_GUI_DROPDOWN
+def = 2
+max = 2
+full = _news_display
+str = STR_CONFIG_SETTING_NEWS_GENERAL_INFORMATION
+strhelp = STR_CONFIG_SETTING_NEWS_GENERAL_INFORMATION_HELPTEXT
+strval = STR_CONFIG_SETTING_NEWS_MESSAGES_OFF
+
diff --git a/src/table/settings/gameopt_settings.ini b/src/table/settings/old_gameopt_settings.ini
index 83e7c6395..4e8e46716 100644
--- a/src/table/settings/gameopt_settings.ini
+++ b/src/table/settings/old_gameopt_settings.ini
@@ -14,25 +14,10 @@
; be saved in their new place.
[pre-amble]
-const std::array<std::string, GAME_DIFFICULTY_NUM> _old_diff_settings{"max_no_competitors", "competitor_start_time", "number_towns", "industry_density", "max_loan", "initial_interest", "vehicle_costs", "competitor_speed", "competitor_intelligence", "vehicle_breakdowns", "subsidy_multiplier", "construction_cost", "terrain_type", "quantity_sea_lakes", "economy", "line_reverse_mode", "disasters", "town_council_tolerance"};
-uint16 _old_diff_custom[GAME_DIFFICULTY_NUM];
-uint8 _old_diff_level; ///< Old difficulty level from old savegames
-uint8 _old_units; ///< Old units from old savegames
-
-/* Most of these strings are used both for gameopt-backward compatibility
- * and the settings tables. The rest is here for consistency. */
-static std::initializer_list<const char*> _locale_currencies{"GBP", "USD", "EUR", "YEN", "ATS", "BEF", "CHF", "CZK", "DEM", "DKK", "ESP", "FIM", "FRF", "GRD", "HUF", "ISK", "ITL", "NLG", "NOK", "PLN", "RON", "RUR", "SIT", "SEK", "YTL", "SKK", "BRL", "EEK", "custom"};
-static std::initializer_list<const char*> _locale_units{"imperial", "metric", "si", "gameunits"};
static std::initializer_list<const char*> _town_names{"english", "french", "german", "american", "latin", "silly", "swedish", "dutch", "finnish", "polish", "slovak", "norwegian", "hungarian", "austrian", "romanian", "czech", "swiss", "danish", "turkish", "italian", "catalan"};
static std::initializer_list<const char*> _climates{"temperate", "arctic", "tropic", "toyland"};
-static std::initializer_list<const char*> _autosave_interval{"off", "monthly", "quarterly", "half year", "yearly"};
-static std::initializer_list<const char*> _roadsides{"left", "right"};
-static std::initializer_list<const char*> _savegame_date{"long", "short", "iso"};
-static std::initializer_list<const char*> _osk_activation{"disabled", "double", "single", "immediately"};
-static std::initializer_list<const char*> _settings_profiles{"easy", "medium", "hard"};
-static std::initializer_list<const char*> _news_display{ "off", "summarized", "full"};
-
-static const SettingVariant _gameopt_settings_table[] = {
+
+static const SettingVariant _old_gameopt_settings_table[] = {
/* In version 4 a new difficulty setting has been added to the difficulty settings,
* town attitude towards demolishing. Needs special handling because some dimwit thought
* it funny to have the GameDifficulty struct be an array while it is a struct of
diff --git a/src/table/settings/pathfinding_settings.ini b/src/table/settings/pathfinding_settings.ini
new file mode 100644
index 000000000..322090001
--- /dev/null
+++ b/src/table/settings/pathfinding_settings.ini
@@ -0,0 +1,617 @@
+; This file is part of OpenTTD.
+; OpenTTD is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2.
+; OpenTTD is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+; See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with OpenTTD. If not, see <http://www.gnu.org/licenses/>.
+;
+
+; Pathfinding settings as stored in the main configuration file ("openttd.cfg")
+; and in the savegame PATS chunk.
+
+[pre-amble]
+static void InvalidateShipPathCache(int32 new_value);
+
+static const SettingVariant _pathfinding_settings_table[] = {
+[post-amble]
+};
+[templates]
+SDT_BOOL = SDT_BOOL(GameSettings, $var, $flags, $def, $str, $strhelp, $strval, $pre_cb, $post_cb, $from, $to, $cat, $extra, $startup),
+SDT_VAR = SDT_VAR(GameSettings, $var, $type, $flags, $def, $min, $max, $interval, $str, $strhelp, $strval, $pre_cb, $post_cb, $from, $to, $cat, $extra, $startup),
+
+[validation]
+SDT_VAR = static_assert($max <= MAX_$type, "Maximum value for GameSettings.$var exceeds storage size");
+
+[defaults]
+flags = SF_NONE
+interval = 0
+str = STR_NULL
+strhelp = STR_CONFIG_SETTING_NO_EXPLANATION_AVAILABLE_HELPTEXT
+strval = STR_NULL
+pre_cb = nullptr
+post_cb = nullptr
+load = nullptr
+from = SL_MIN_VERSION
+to = SL_MAX_VERSION
+cat = SC_ADVANCED
+extra = 0
+startup = false
+
+
+[SDT_BOOL]
+var = pf.forbid_90_deg
+def = false
+str = STR_CONFIG_SETTING_FORBID_90_DEG
+strhelp = STR_CONFIG_SETTING_FORBID_90_DEG_HELPTEXT
+post_cb = InvalidateShipPathCache
+cat = SC_EXPERT
+
+[SDT_BOOL]
+var = pf.roadveh_queue
+def = true
+cat = SC_EXPERT
+
+[SDT_BOOL]
+var = pf.new_pathfinding_all
+to = SLV_87
+def = false
+cat = SC_EXPERT
+
+[SDT_BOOL]
+var = pf.yapf.ship_use_yapf
+from = SLV_28
+to = SLV_87
+def = false
+cat = SC_EXPERT
+
+[SDT_BOOL]
+var = pf.yapf.road_use_yapf
+from = SLV_28
+to = SLV_87
+def = true
+cat = SC_EXPERT
+
+[SDT_BOOL]
+var = pf.yapf.rail_use_yapf
+from = SLV_28
+to = SLV_87
+def = true
+cat = SC_EXPERT
+
+[SDT_VAR]
+var = pf.pathfinder_for_trains
+type = SLE_UINT8
+from = SLV_87
+flags = SF_GUI_DROPDOWN
+def = 2
+min = 1
+max = 2
+interval = 1
+str = STR_CONFIG_SETTING_PATHFINDER_FOR_TRAINS
+strhelp = STR_CONFIG_SETTING_PATHFINDER_FOR_TRAINS_HELPTEXT
+strval = STR_CONFIG_SETTING_PATHFINDER_NPF
+cat = SC_EXPERT
+
+[SDT_VAR]
+var = pf.pathfinder_for_roadvehs
+type = SLE_UINT8
+from = SLV_87
+flags = SF_GUI_DROPDOWN
+def = 2
+min = 1
+max = 2
+interval = 1
+str = STR_CONFIG_SETTING_PATHFINDER_FOR_ROAD_VEHICLES
+strhelp = STR_CONFIG_SETTING_PATHFINDER_FOR_ROAD_VEHICLES_HELPTEXT
+strval = STR_CONFIG_SETTING_PATHFINDER_NPF
+cat = SC_EXPERT
+
+[SDT_VAR]
+var = pf.pathfinder_for_ships
+type = SLE_UINT8
+from = SLV_87
+flags = SF_GUI_DROPDOWN
+def = 2
+min = 1
+max = 2
+interval = 1
+str = STR_CONFIG_SETTING_PATHFINDER_FOR_SHIPS
+strhelp = STR_CONFIG_SETTING_PATHFINDER_FOR_SHIPS_HELPTEXT
+strval = STR_CONFIG_SETTING_PATHFINDER_NPF
+post_cb = InvalidateShipPathCache
+cat = SC_EXPERT
+
+[SDT_BOOL]
+var = pf.reverse_at_signals
+from = SLV_159
+def = false
+str = STR_CONFIG_SETTING_REVERSE_AT_SIGNALS
+strhelp = STR_CONFIG_SETTING_REVERSE_AT_SIGNALS_HELPTEXT
+
+[SDT_VAR]
+var = pf.wait_oneway_signal
+type = SLE_UINT8
+def = 15
+min = 2
+max = 255
+cat = SC_EXPERT
+
+[SDT_VAR]
+var = pf.wait_twoway_signal
+type = SLE_UINT8
+def = 41
+min = 2
+max = 255
+cat = SC_EXPERT
+
+[SDT_VAR]
+var = pf.wait_for_pbs_path
+type = SLE_UINT8
+from = SLV_100
+def = 30
+min = 2
+max = 255
+cat = SC_EXPERT
+
+[SDT_BOOL]
+var = pf.reserve_paths
+from = SLV_100
+def = false
+cat = SC_EXPERT
+
+[SDT_VAR]
+var = pf.path_backoff_interval
+type = SLE_UINT8
+from = SLV_100
+def = 20
+min = 1
+max = 255
+cat = SC_EXPERT
+
+[SDT_VAR]
+var = pf.npf.npf_max_search_nodes
+type = SLE_UINT
+def = 10000
+min = 500
+max = 100000
+cat = SC_EXPERT
+
+[SDT_VAR]
+var = pf.npf.npf_rail_firstred_penalty
+type = SLE_UINT
+def = 10 * NPF_TILE_LENGTH
+min = 0
+max = 100000
+cat = SC_EXPERT
+
+[SDT_VAR]
+var = pf.npf.npf_rail_firstred_exit_penalty
+type = SLE_UINT
+def = 100 * NPF_TILE_LENGTH
+min = 0
+max = 100000
+cat = SC_EXPERT
+
+[SDT_VAR]
+var = pf.npf.npf_rail_lastred_penalty
+type = SLE_UINT
+def = 10 * NPF_TILE_LENGTH
+min = 0
+max = 100000
+cat = SC_EXPERT
+
+[SDT_VAR]
+var = pf.npf.npf_rail_station_penalty
+type = SLE_UINT
+def = 1 * NPF_TILE_LENGTH
+min = 0
+max = 100000
+cat = SC_EXPERT
+
+[SDT_VAR]
+var = pf.npf.npf_rail_slope_penalty
+type = SLE_UINT
+def = 1 * NPF_TILE_LENGTH
+min = 0
+max = 100000
+cat = SC_EXPERT
+
+[SDT_VAR]
+var = pf.npf.npf_rail_curve_penalty
+type = SLE_UINT
+def = 1 * NPF_TILE_LENGTH
+min = 0
+max = 100000
+cat = SC_EXPERT
+
+[SDT_VAR]
+var = pf.npf.npf_rail_depot_reverse_penalty
+type = SLE_UINT
+def = 50 * NPF_TILE_LENGTH
+min = 0
+max = 100000
+cat = SC_EXPERT
+
+[SDT_VAR]
+var = pf.npf.npf_rail_pbs_cross_penalty
+type = SLE_UINT
+from = SLV_100
+def = 3 * NPF_TILE_LENGTH
+min = 0
+max = 100000
+cat = SC_EXPERT
+
+[SDT_VAR]
+var = pf.npf.npf_rail_pbs_signal_back_penalty
+type = SLE_UINT
+from = SLV_100
+def = 15 * NPF_TILE_LENGTH
+min = 0
+max = 100000
+cat = SC_EXPERT
+
+[SDT_VAR]
+var = pf.npf.npf_buoy_penalty
+type = SLE_UINT
+def = 2 * NPF_TILE_LENGTH
+min = 0
+max = 100000
+cat = SC_EXPERT
+
+[SDT_VAR]
+var = pf.npf.npf_water_curve_penalty
+type = SLE_UINT
+def = 1 * NPF_TILE_LENGTH
+min = 0
+max = 100000
+cat = SC_EXPERT
+
+[SDT_VAR]
+var = pf.npf.npf_road_curve_penalty
+type = SLE_UINT
+def = 1 * NPF_TILE_LENGTH
+min = 0
+max = 100000
+cat = SC_EXPERT
+
+[SDT_VAR]
+var = pf.npf.npf_crossing_penalty
+type = SLE_UINT
+def = 3 * NPF_TILE_LENGTH
+min = 0
+max = 100000
+cat = SC_EXPERT
+
+[SDT_VAR]
+var = pf.npf.npf_road_drive_through_penalty
+type = SLE_UINT
+from = SLV_47
+def = 8 * NPF_TILE_LENGTH
+min = 0
+max = 100000
+cat = SC_EXPERT
+
+[SDT_VAR]
+var = pf.npf.npf_road_dt_occupied_penalty
+type = SLE_UINT
+from = SLV_130
+def = 8 * NPF_TILE_LENGTH
+min = 0
+max = 100000
+cat = SC_EXPERT
+
+[SDT_VAR]
+var = pf.npf.npf_road_bay_occupied_penalty
+type = SLE_UINT
+from = SLV_130
+def = 15 * NPF_TILE_LENGTH
+min = 0
+max = 100000
+cat = SC_EXPERT
+
+[SDT_VAR]
+var = pf.npf.maximum_go_to_depot_penalty
+type = SLE_UINT
+from = SLV_131
+def = 20 * NPF_TILE_LENGTH
+min = 0
+max = 1000000
+cat = SC_EXPERT
+
+[SDT_BOOL]
+var = pf.yapf.disable_node_optimization
+from = SLV_28
+def = false
+cat = SC_EXPERT
+
+[SDT_VAR]
+var = pf.yapf.max_search_nodes
+type = SLE_UINT
+from = SLV_28
+def = 10000
+min = 500
+max = 1000000
+cat = SC_EXPERT
+
+[SDT_BOOL]
+var = pf.yapf.rail_firstred_twoway_eol
+from = SLV_28
+def = false
+cat = SC_EXPERT
+
+[SDT_VAR]
+var = pf.yapf.rail_firstred_penalty
+type = SLE_UINT
+from = SLV_28
+def = 10 * YAPF_TILE_LENGTH
+min = 0
+max = 1000000
+cat = SC_EXPERT
+
+[SDT_VAR]
+var = pf.yapf.rail_firstred_exit_penalty
+type = SLE_UINT
+from = SLV_28
+def = 100 * YAPF_TILE_LENGTH
+min = 0
+max = 1000000
+cat = SC_EXPERT
+
+[SDT_VAR]
+var = pf.yapf.rail_lastred_penalty
+type = SLE_UINT
+from = SLV_28
+def = 10 * YAPF_TILE_LENGTH
+min = 0
+max = 1000000
+cat = SC_EXPERT
+
+[SDT_VAR]
+var = pf.yapf.rail_lastred_exit_penalty
+type = SLE_UINT
+from = SLV_28
+def = 100 * YAPF_TILE_LENGTH
+min = 0
+max = 1000000
+cat = SC_EXPERT
+
+[SDT_VAR]
+var = pf.yapf.rail_station_penalty
+type = SLE_UINT
+from = SLV_28
+def = 10 * YAPF_TILE_LENGTH
+min = 0
+max = 1000000
+cat = SC_EXPERT
+
+[SDT_VAR]
+var = pf.yapf.rail_slope_penalty
+type = SLE_UINT
+from = SLV_28
+def = 2 * YAPF_TILE_LENGTH
+min = 0
+max = 1000000
+cat = SC_EXPERT
+
+[SDT_VAR]
+var = pf.yapf.rail_curve45_penalty
+type = SLE_UINT
+from = SLV_28
+def = 1 * YAPF_TILE_LENGTH
+min = 0
+max = 1000000
+cat = SC_EXPERT
+
+[SDT_VAR]
+var = pf.yapf.rail_curve90_penalty
+type = SLE_UINT
+from = SLV_28
+def = 6 * YAPF_TILE_LENGTH
+min = 0
+max = 1000000
+cat = SC_EXPERT
+
+[SDT_VAR]
+var = pf.yapf.rail_depot_reverse_penalty
+type = SLE_UINT
+from = SLV_28
+def = 50 * YAPF_TILE_LENGTH
+min = 0
+max = 1000000
+cat = SC_EXPERT
+
+[SDT_VAR]
+var = pf.yapf.rail_crossing_penalty
+type = SLE_UINT
+from = SLV_28
+def = 3 * YAPF_TILE_LENGTH
+min = 0
+max = 1000000
+cat = SC_EXPERT
+
+[SDT_VAR]
+var = pf.yapf.rail_look_ahead_max_signals
+type = SLE_UINT
+from = SLV_28
+def = 10
+min = 1
+max = 100
+cat = SC_EXPERT
+
+[SDT_VAR]
+var = pf.yapf.rail_look_ahead_signal_p0
+type = SLE_INT
+from = SLV_28
+def = 500
+min = -1000000
+max = 1000000
+cat = SC_EXPERT
+
+[SDT_VAR]
+var = pf.yapf.rail_look_ahead_signal_p1
+type = SLE_INT
+from = SLV_28
+def = -100
+min = -1000000
+max = 1000000
+cat = SC_EXPERT
+
+[SDT_VAR]
+var = pf.yapf.rail_look_ahead_signal_p2
+type = SLE_INT
+from = SLV_28
+def = 5
+min = -1000000
+max = 1000000
+cat = SC_EXPERT
+
+[SDT_VAR]
+var = pf.yapf.rail_pbs_cross_penalty
+type = SLE_UINT
+from = SLV_100
+def = 3 * YAPF_TILE_LENGTH
+min = 0
+max = 1000000
+cat = SC_EXPERT
+
+[SDT_VAR]
+var = pf.yapf.rail_pbs_station_penalty
+type = SLE_UINT
+from = SLV_100
+def = 8 * YAPF_TILE_LENGTH
+min = 0
+max = 1000000
+cat = SC_EXPERT
+
+[SDT_VAR]
+var = pf.yapf.rail_pbs_signal_back_penalty
+type = SLE_UINT
+from = SLV_100
+def = 15 * YAPF_TILE_LENGTH
+min = 0
+max = 1000000
+cat = SC_EXPERT
+
+[SDT_VAR]
+var = pf.yapf.rail_doubleslip_penalty
+type = SLE_UINT
+from = SLV_100
+def = 1 * YAPF_TILE_LENGTH
+min = 0
+max = 1000000
+cat = SC_EXPERT
+
+[SDT_VAR]
+var = pf.yapf.rail_longer_platform_penalty
+type = SLE_UINT
+from = SLV_33
+def = 8 * YAPF_TILE_LENGTH
+min = 0
+max = 20000
+cat = SC_EXPERT
+
+[SDT_VAR]
+var = pf.yapf.rail_longer_platform_per_tile_penalty
+type = SLE_UINT
+from = SLV_33
+def = 0 * YAPF_TILE_LENGTH
+min = 0
+max = 20000
+cat = SC_EXPERT
+
+[SDT_VAR]
+var = pf.yapf.rail_shorter_platform_penalty
+type = SLE_UINT
+from = SLV_33
+def = 40 * YAPF_TILE_LENGTH
+min = 0
+max = 20000
+cat = SC_EXPERT
+
+[SDT_VAR]
+var = pf.yapf.rail_shorter_platform_per_tile_penalty
+type = SLE_UINT
+from = SLV_33
+def = 0 * YAPF_TILE_LENGTH
+min = 0
+max = 20000
+cat = SC_EXPERT
+
+[SDT_VAR]
+var = pf.yapf.road_slope_penalty
+type = SLE_UINT
+from = SLV_33
+def = 2 * YAPF_TILE_LENGTH
+min = 0
+max = 1000000
+cat = SC_EXPERT
+
+[SDT_VAR]
+var = pf.yapf.road_curve_penalty
+type = SLE_UINT
+from = SLV_33
+def = 1 * YAPF_TILE_LENGTH
+min = 0
+max = 1000000
+cat = SC_EXPERT
+
+[SDT_VAR]
+var = pf.yapf.road_crossing_penalty
+type = SLE_UINT
+from = SLV_33
+def = 3 * YAPF_TILE_LENGTH
+min = 0
+max = 1000000
+cat = SC_EXPERT
+
+[SDT_VAR]
+var = pf.yapf.road_stop_penalty
+type = SLE_UINT
+from = SLV_47
+def = 8 * YAPF_TILE_LENGTH
+min = 0
+max = 1000000
+cat = SC_EXPERT
+
+[SDT_VAR]
+var = pf.yapf.road_stop_occupied_penalty
+type = SLE_UINT
+from = SLV_130
+def = 8 * YAPF_TILE_LENGTH
+min = 0
+max = 1000000
+cat = SC_EXPERT
+
+[SDT_VAR]
+var = pf.yapf.road_stop_bay_occupied_penalty
+type = SLE_UINT
+from = SLV_130
+def = 15 * YAPF_TILE_LENGTH
+min = 0
+max = 1000000
+cat = SC_EXPERT
+
+[SDT_VAR]
+var = pf.yapf.maximum_go_to_depot_penalty
+type = SLE_UINT
+from = SLV_131
+def = 20 * YAPF_TILE_LENGTH
+min = 0
+max = 1000000
+cat = SC_EXPERT
+
+[SDT_VAR]
+var = pf.yapf.ship_curve45_penalty
+type = SLE_UINT
+from = SLV_SHIP_CURVE_PENALTY
+def = 1 * YAPF_TILE_LENGTH
+min = 0
+max = 1000000
+cat = SC_EXPERT
+
+[SDT_VAR]
+var = pf.yapf.ship_curve90_penalty
+type = SLE_UINT
+from = SLV_SHIP_CURVE_PENALTY
+def = 6 * YAPF_TILE_LENGTH
+min = 0
+max = 1000000
+cat = SC_EXPERT
diff --git a/src/table/settings/script_settings.ini b/src/table/settings/script_settings.ini
new file mode 100644
index 000000000..2d3531939
--- /dev/null
+++ b/src/table/settings/script_settings.ini
@@ -0,0 +1,112 @@
+; This file is part of OpenTTD.
+; OpenTTD is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2.
+; OpenTTD is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+; See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with OpenTTD. If not, see <http://www.gnu.org/licenses/>.
+;
+
+; Script settings as stored in the main configuration file ("openttd.cfg")
+; and in the savegame PATS chunk.
+
+[pre-amble]
+static std::initializer_list<const char*> _settings_profiles{"easy", "medium", "hard"};
+
+static const SettingVariant _script_settings_table[] = {
+[post-amble]
+};
+[templates]
+SDT_BOOL = SDT_BOOL(GameSettings, $var, $flags, $def, $str, $strhelp, $strval, $pre_cb, $post_cb, $from, $to, $cat, $extra, $startup),
+SDT_OMANY = SDT_OMANY(GameSettings, $var, $type, $flags, $def, $max, $full, $str, $strhelp, $strval, $pre_cb, $post_cb, $from, $to, $load, $cat, $extra, $startup),
+SDT_VAR = SDT_VAR(GameSettings, $var, $type, $flags, $def, $min, $max, $interval, $str, $strhelp, $strval, $pre_cb, $post_cb, $from, $to, $cat, $extra, $startup),
+
+[validation]
+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 = SF_NONE
+interval = 0
+str = STR_NULL
+strhelp = STR_CONFIG_SETTING_NO_EXPLANATION_AVAILABLE_HELPTEXT
+strval = STR_NULL
+pre_cb = nullptr
+post_cb = nullptr
+load = nullptr
+from = SL_MIN_VERSION
+to = SL_MAX_VERSION
+cat = SC_ADVANCED
+extra = 0
+startup = false
+
+
+[SDT_OMANY]
+var = script.settings_profile
+type = SLE_UINT8
+from = SLV_178
+flags = SF_GUI_DROPDOWN
+def = SP_EASY
+min = SP_EASY
+max = SP_HARD
+full = _settings_profiles
+str = STR_CONFIG_SETTING_AI_PROFILE
+strhelp = STR_CONFIG_SETTING_AI_PROFILE_HELPTEXT
+strval = STR_CONFIG_SETTING_AI_PROFILE_EASY
+cat = SC_BASIC
+
+[SDT_VAR]
+var = script.script_max_opcode_till_suspend
+type = SLE_UINT32
+from = SLV_107
+flags = SF_NEWGAME_ONLY
+def = 10000
+min = 500
+max = 250000
+interval = 2500
+str = STR_CONFIG_SETTING_SCRIPT_MAX_OPCODES
+strhelp = STR_CONFIG_SETTING_SCRIPT_MAX_OPCODES_HELPTEXT
+strval = STR_JUST_COMMA
+cat = SC_EXPERT
+
+[SDT_VAR]
+var = script.script_max_memory_megabytes
+type = SLE_UINT32
+from = SLV_SCRIPT_MEMLIMIT
+flags = SF_NEWGAME_ONLY
+def = 1024
+min = 8
+max = 8192
+interval = 8
+str = STR_CONFIG_SETTING_SCRIPT_MAX_MEMORY
+strhelp = STR_CONFIG_SETTING_SCRIPT_MAX_MEMORY_HELPTEXT
+strval = STR_CONFIG_SETTING_SCRIPT_MAX_MEMORY_VALUE
+cat = SC_EXPERT
+
+[SDT_BOOL]
+var = ai.ai_in_multiplayer
+def = true
+str = STR_CONFIG_SETTING_AI_IN_MULTIPLAYER
+strhelp = STR_CONFIG_SETTING_AI_IN_MULTIPLAYER_HELPTEXT
+cat = SC_BASIC
+
+[SDT_BOOL]
+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]
+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]
+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]
+var = ai.ai_disable_veh_ship
+def = false
+str = STR_CONFIG_SETTING_AI_BUILDS_SHIPS
+strhelp = STR_CONFIG_SETTING_AI_BUILDS_SHIPS_HELPTEXT
diff --git a/src/table/settings/settings.ini b/src/table/settings/settings.ini
deleted file mode 100644
index 984668e51..000000000
--- a/src/table/settings/settings.ini
+++ /dev/null
@@ -1,3487 +0,0 @@
-; This file is part of OpenTTD.
-; OpenTTD is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2.
-; OpenTTD is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
-; See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with OpenTTD. If not, see <http://www.gnu.org/licenses/>.
-;
-
-; Settings as stored in the main configuration file ("openttd.cfg") and in the
-; savegame PATS chunk (if not flagged not to).
-
-[pre-amble]
-/* Begin - Callback Functions for the various settings */
-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);
-
-/* End - Callback Functions for the various settings */
-
-/* Some settings do not need to be synchronised when playing in multiplayer.
- * 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 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
- * service depot, causing desyncs on a massive scale. */
-static const SettingVariant _settings_table[] = {
-[post-amble]
-};
-[templates]
-SDTG_BOOL = SDTG_BOOL($name, $flags, $var, $def, $str, $strhelp, $strval, $pre_cb, $post_cb, $from, $to, $cat, $extra, $startup),
-SDTG_VAR = SDTG_VAR($name, $type, $flags, $var, $def, $min, $max, $interval, $str, $strhelp, $strval, $pre_cb, $post_cb, $from, $to, $cat, $extra, $startup),
-SDTG_OMANY = SDTG_OMANY($name, $type, $flags, $var, $def, $max, $full, $str, $strhelp, $strval, $pre_cb, $post_cb, $from, $to, $cat, $extra, $startup),
-SDTC_BOOL = SDTC_BOOL( $var, $flags, $def, $str, $strhelp, $strval, $pre_cb, $post_cb, $from, $to, $cat, $extra, $startup),
-SDTC_LIST = SDTC_LIST( $var, $type, $flags, $def, $from, $to, $cat, $extra, $startup),
-SDTC_OMANY = SDTC_OMANY( $var, $type, $flags, $def, $max, $full, $str, $strhelp, $strval, $pre_cb, $post_cb, $from, $to, $cat, $extra, $startup),
-SDTC_SSTR = SDTC_SSTR( $var, $type, $flags, $def, $length, $pre_cb, $post_cb, $from, $to, $cat, $extra, $startup),
-SDTC_VAR = SDTC_VAR( $var, $type, $flags, $def, $min, $max, $interval, $str, $strhelp, $strval, $pre_cb, $post_cb, $from, $to, $cat, $extra, $startup),
-SDT_BOOL = SDT_BOOL(GameSettings, $var, $flags, $def, $str, $strhelp, $strval, $pre_cb, $post_cb, $from, $to, $cat, $extra, $startup),
-SDT_OMANY = SDT_OMANY(GameSettings, $var, $type, $flags, $def, $max, $full, $str, $strhelp, $strval, $pre_cb, $post_cb, $from, $to, $load, $cat, $extra, $startup),
-SDT_SSTR = SDT_SSTR(GameSettings, $var, $type, $flags, $def, $pre_cb, $post_cb, $from, $to, $cat, $extra, $startup),
-SDT_VAR = SDT_VAR(GameSettings, $var, $type, $flags, $def, $min, $max, $interval, $str, $strhelp, $strval, $pre_cb, $post_cb, $from, $to, $cat, $extra, $startup),
-
-[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 GameSettings.$var exceeds storage size");
-SDT_VAR = static_assert($max <= MAX_$type, "Maximum value for GameSettings.$var exceeds storage size");
-
-[defaults]
-flags = SF_NONE
-interval = 0
-str = STR_NULL
-strhelp = STR_CONFIG_SETTING_NO_EXPLANATION_AVAILABLE_HELPTEXT
-strval = STR_NULL
-pre_cb = nullptr
-post_cb = nullptr
-load = nullptr
-from = SL_MIN_VERSION
-to = SL_MAX_VERSION
-cat = SC_ADVANCED
-extra = 0
-startup = false
-
-
-
-; Saved settings variables.
-; The next 18 entries are important for savegame compatibility. Do NOT remove those. See HandleOldDiffCustom() for more details.
-[SDT_VAR]
-var = difficulty.max_no_competitors
-type = SLE_UINT8
-from = SLV_97
-def = 0
-min = 0
-max = MAX_COMPANIES - 1
-interval = 1
-post_cb = MaxNoAIsChange
-cat = SC_BASIC
-
-[SDT_VAR]
-var = difficulty.competitor_start_time
-type = SLE_UINT8
-from = SLV_97
-to = SLV_110
-def = 2
-min = 0
-max = 3
-
-[SDT_VAR]
-var = difficulty.number_towns
-type = SLE_UINT8
-from = SLV_97
-flags = SF_NEWGAME_ONLY
-def = 2
-min = 0
-max = 4
-interval = 1
-strval = STR_NUM_VERY_LOW
-cat = SC_BASIC
-
-[SDT_VAR]
-var = difficulty.industry_density
-type = SLE_UINT8
-from = SLV_97
-flags = SF_GUI_DROPDOWN
-def = ID_END - 1
-min = 0
-max = ID_END - 1
-interval = 1
-str = STR_CONFIG_SETTING_INDUSTRY_DENSITY
-strhelp = STR_CONFIG_SETTING_INDUSTRY_DENSITY_HELPTEXT
-strval = STR_FUNDING_ONLY
-cat = SC_BASIC
-
-[SDT_VAR]
-var = difficulty.max_loan
-type = SLE_UINT32
-from = SLV_97
-flags = SF_NEWGAME_ONLY | SF_SCENEDIT_TOO | SF_GUI_CURRENCY
-def = 300000
-min = 0
-max = 2000000000
-interval = 50000
-str = STR_CONFIG_SETTING_MAXIMUM_INITIAL_LOAN
-strhelp = STR_CONFIG_SETTING_MAXIMUM_INITIAL_LOAN_HELPTEXT
-strval = STR_JUST_CURRENCY_LONG
-cat = SC_BASIC
-
-[SDT_VAR]
-var = difficulty.initial_interest
-type = SLE_UINT8
-from = SLV_97
-flags = SF_NEWGAME_ONLY | SF_SCENEDIT_TOO
-def = 2
-min = 2
-max = 4
-interval = 1
-str = STR_CONFIG_SETTING_INTEREST_RATE
-strhelp = STR_CONFIG_SETTING_INTEREST_RATE_HELPTEXT
-strval = STR_CONFIG_SETTING_PERCENTAGE
-
-[SDT_VAR]
-var = difficulty.vehicle_costs
-type = SLE_UINT8
-from = SLV_97
-flags = SF_NEWGAME_ONLY | SF_SCENEDIT_TOO | SF_GUI_DROPDOWN
-def = 0
-min = 0
-max = 2
-interval = 1
-str = STR_CONFIG_SETTING_RUNNING_COSTS
-strhelp = STR_CONFIG_SETTING_RUNNING_COSTS_HELPTEXT
-strval = STR_SEA_LEVEL_LOW
-cat = SC_BASIC
-
-[SDT_VAR]
-var = difficulty.competitor_speed
-type = SLE_UINT8
-from = SLV_97
-flags = SF_GUI_DROPDOWN
-def = 2
-min = 0
-max = 4
-interval = 1
-str = STR_CONFIG_SETTING_CONSTRUCTION_SPEED
-strhelp = STR_CONFIG_SETTING_CONSTRUCTION_SPEED_HELPTEXT
-strval = STR_AI_SPEED_VERY_SLOW
-cat = SC_BASIC
-
-[SDT_VAR]
-var = difficulty.competitor_intelligence
-type = SLE_UINT8
-from = SLV_97
-to = SLV_110
-def = 0
-min = 0
-max = 2
-
-[SDT_VAR]
-var = difficulty.vehicle_breakdowns
-type = SLE_UINT8
-from = SLV_97
-flags = SF_GUI_DROPDOWN
-def = 1
-min = 0
-max = 2
-interval = 1
-str = STR_CONFIG_SETTING_VEHICLE_BREAKDOWNS
-strhelp = STR_CONFIG_SETTING_VEHICLE_BREAKDOWNS_HELPTEXT
-strval = STR_DISASTER_NONE
-cat = SC_BASIC
-
-[SDT_VAR]
-var = difficulty.subsidy_multiplier
-type = SLE_UINT8
-from = SLV_97
-flags = SF_GUI_DROPDOWN
-def = 2
-min = 0
-max = 3
-interval = 1
-str = STR_CONFIG_SETTING_SUBSIDY_MULTIPLIER
-strhelp = STR_CONFIG_SETTING_SUBSIDY_MULTIPLIER_HELPTEXT
-strval = STR_SUBSIDY_X1_5
-
-[SDT_VAR]
-var = difficulty.subsidy_duration
-type = SLE_UINT16
-from = SLV_CUSTOM_SUBSIDY_DURATION
-flags = SF_GUI_0_IS_SPECIAL
-def = 1
-min = 0
-max = 5000
-interval = 1
-str = STR_CONFIG_SETTING_SUBSIDY_DURATION
-strhelp = STR_CONFIG_SETTING_SUBSIDY_DURATION_HELPTEXT
-strval = STR_CONFIG_SETTING_SUBSIDY_DURATION_VALUE
-
-[SDT_VAR]
-var = difficulty.construction_cost
-type = SLE_UINT8
-from = SLV_97
-flags = SF_NEWGAME_ONLY | SF_SCENEDIT_TOO | SF_GUI_DROPDOWN
-def = 0
-min = 0
-max = 2
-interval = 1
-str = STR_CONFIG_SETTING_CONSTRUCTION_COSTS
-strhelp = STR_CONFIG_SETTING_CONSTRUCTION_COSTS_HELPTEXT
-strval = STR_SEA_LEVEL_LOW
-cat = SC_BASIC
-
-[SDT_VAR]
-var = difficulty.terrain_type
-type = SLE_UINT8
-from = SLV_97
-flags = SF_GUI_DROPDOWN | SF_NEWGAME_ONLY
-def = 1
-min = 0
-max = 5
-interval = 1
-str = STR_CONFIG_SETTING_TERRAIN_TYPE
-strhelp = STR_CONFIG_SETTING_TERRAIN_TYPE_HELPTEXT
-strval = STR_TERRAIN_TYPE_VERY_FLAT
-cat = SC_BASIC
-
-[SDT_VAR]
-var = difficulty.quantity_sea_lakes
-type = SLE_UINT8
-from = SLV_97
-flags = SF_NEWGAME_ONLY
-def = 0
-min = 0
-max = 4
-interval = 1
-strval = STR_SEA_LEVEL_VERY_LOW
-cat = SC_BASIC
-
-[SDT_BOOL]
-var = difficulty.economy
-from = SLV_97
-def = false
-str = STR_CONFIG_SETTING_RECESSIONS
-strhelp = STR_CONFIG_SETTING_RECESSIONS_HELPTEXT
-
-[SDT_BOOL]
-var = difficulty.line_reverse_mode
-from = SLV_97
-def = false
-str = STR_CONFIG_SETTING_TRAIN_REVERSING
-strhelp = STR_CONFIG_SETTING_TRAIN_REVERSING_HELPTEXT
-
-[SDT_BOOL]
-var = difficulty.disasters
-from = SLV_97
-def = false
-str = STR_CONFIG_SETTING_DISASTERS
-strhelp = STR_CONFIG_SETTING_DISASTERS_HELPTEXT
-cat = SC_BASIC
-
-[SDT_VAR]
-var = difficulty.town_council_tolerance
-type = SLE_UINT8
-from = SLV_97
-flags = SF_GUI_DROPDOWN
-def = 0
-min = 0
-max = 2
-interval = 1
-str = STR_CONFIG_SETTING_CITY_APPROVAL
-strhelp = STR_CONFIG_SETTING_CITY_APPROVAL_HELPTEXT
-strval = STR_CITY_APPROVAL_PERMISSIVE
-post_cb = DifficultyNoiseChange
-
-[SDTG_VAR]
-name = ""diff_level""
-var = _old_diff_level
-type = SLE_UINT8
-flags = SF_NOT_IN_CONFIG
-from = SLV_97
-to = SLV_178
-def = 3
-min = 0
-max = 3
-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]
-var = game_creation.town_name
-type = SLE_UINT8
-from = SLV_97
-flags = SF_NO_NETWORK
-def = 0
-max = 255
-full = _town_names
-cat = SC_BASIC
-
-[SDT_OMANY]
-var = game_creation.landscape
-type = SLE_UINT8
-from = SLV_97
-flags = SF_GUI_DROPDOWN | SF_NEWGAME_ONLY
-def = 0
-max = 3
-full = _climates
-load = ConvertLandscape
-str = STR_CONFIG_SETTING_LANDSCAPE
-strhelp = STR_CONFIG_SETTING_LANDSCAPE_HELPTEXT
-strval = STR_CHEAT_SWITCH_CLIMATE_TEMPERATE_LANDSCAPE
-cat = SC_BASIC
-
-[SDT_OMANY]
-var = vehicle.road_side
-type = SLE_UINT8
-from = SLV_97
-flags = SF_GUI_DROPDOWN | SF_NO_NETWORK
-def = 1
-max = 1
-full = _roadsides
-str = STR_CONFIG_SETTING_ROAD_SIDE
-strhelp = STR_CONFIG_SETTING_ROAD_SIDE_HELPTEXT
-strval = STR_GAME_OPTIONS_ROAD_VEHICLES_DROPDOWN_LEFT
-pre_cb = CheckRoadSide
-cat = SC_BASIC
-
-; Construction
-
-[SDT_VAR]
-var = construction.map_height_limit
-type = SLE_UINT8
-from = SLV_194
-flags = SF_NEWGAME_ONLY | SF_SCENEDIT_TOO | SF_GUI_0_IS_SPECIAL
-def = 0
-min = MIN_MAP_HEIGHT_LIMIT
-max = MAX_MAP_HEIGHT_LIMIT
-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
-pre_cb = CheckMaxHeightLevel
-post_cb = [](auto) { InvalidateWindowClassesData(WC_SMALLMAP, 2); }
-cat = SC_ADVANCED
-
-[SDT_VAR]
-var = game_creation.heightmap_height
-type = SLE_UINT8
-from = SLV_MAPGEN_SETTINGS_REVAMP
-flags = SF_NEWGAME_ONLY
-def = MAP_HEIGHT_LIMIT_AUTO_MINIMUM
-min = MIN_HEIGHTMAP_HEIGHT
-max = MAX_MAP_HEIGHT_LIMIT
-interval = 1
-
-[SDT_BOOL]
-var = construction.build_on_slopes
-flags = SF_NO_NETWORK
-def = true
-cat = SC_EXPERT
-
-[SDT_VAR]
-var = construction.command_pause_level
-type = SLE_UINT8
-from = SLV_154
-flags = SF_GUI_DROPDOWN | SF_NO_NETWORK
-def = 1
-min = 0
-max = 3
-interval = 1
-str = STR_CONFIG_SETTING_COMMAND_PAUSE_LEVEL
-strhelp = STR_CONFIG_SETTING_COMMAND_PAUSE_LEVEL_HELPTEXT
-strval = STR_CONFIG_SETTING_COMMAND_PAUSE_LEVEL_NO_ACTIONS
-
-[SDT_VAR]
-var = construction.terraform_per_64k_frames
-type = SLE_UINT32
-from = SLV_156
-def = 64 << 16
-min = 0
-max = 1 << 30
-interval = 1
-cat = SC_EXPERT
-
-[SDT_VAR]
-var = construction.terraform_frame_burst
-type = SLE_UINT16
-from = SLV_156
-def = 4096
-min = 0
-max = 1 << 15
-interval = 1
-cat = SC_EXPERT
-
-[SDT_VAR]
-var = construction.clear_per_64k_frames
-type = SLE_UINT32
-from = SLV_156
-def = 64 << 16
-min = 0
-max = 1 << 30
-interval = 1
-cat = SC_EXPERT
-
-[SDT_VAR]
-var = construction.clear_frame_burst
-type = SLE_UINT16
-from = SLV_156
-def = 4096
-min = 0
-max = 1 << 15
-interval = 1
-cat = SC_EXPERT
-
-[SDT_VAR]
-var = construction.tree_per_64k_frames
-type = SLE_UINT32
-from = SLV_175
-def = 64 << 16
-min = 0
-max = 1 << 30
-interval = 1
-cat = SC_EXPERT
-
-[SDT_VAR]
-var = construction.tree_frame_burst
-type = SLE_UINT16
-from = SLV_175
-def = 4096
-min = 0
-max = 1 << 15
-interval = 1
-cat = SC_EXPERT
-
-[SDT_BOOL]
-var = construction.autoslope
-from = SLV_75
-def = true
-str = STR_CONFIG_SETTING_AUTOSLOPE
-strhelp = STR_CONFIG_SETTING_AUTOSLOPE_HELPTEXT
-cat = SC_EXPERT
-
-[SDT_BOOL]
-var = construction.extra_dynamite
-def = true
-str = STR_CONFIG_SETTING_EXTRADYNAMITE
-strhelp = STR_CONFIG_SETTING_EXTRADYNAMITE_HELPTEXT
-
-[SDT_VAR]
-var = construction.max_bridge_length
-type = SLE_UINT16
-from = SLV_159
-flags = SF_NO_NETWORK
-def = 64
-min = 1
-max = MAX_MAP_SIZE
-interval = 1
-str = STR_CONFIG_SETTING_MAX_BRIDGE_LENGTH
-strhelp = STR_CONFIG_SETTING_MAX_BRIDGE_LENGTH_HELPTEXT
-strval = STR_CONFIG_SETTING_TILE_LENGTH
-
-[SDT_VAR]
-var = construction.max_bridge_height
-type = SLE_UINT8
-from = SLV_194
-flags = SF_NO_NETWORK
-def = 12
-min = 1
-max = MAX_TILE_HEIGHT
-interval = 1
-str = STR_CONFIG_SETTING_MAX_BRIDGE_HEIGHT
-strhelp = STR_CONFIG_SETTING_MAX_BRIDGE_HEIGHT_HELPTEXT
-strval = STR_JUST_COMMA
-cat = SC_EXPERT
-
-[SDT_VAR]
-var = construction.max_tunnel_length
-type = SLE_UINT16
-from = SLV_159
-flags = SF_NO_NETWORK
-def = 64
-min = 1
-max = MAX_MAP_SIZE
-interval = 1
-str = STR_CONFIG_SETTING_MAX_TUNNEL_LENGTH
-strhelp = STR_CONFIG_SETTING_MAX_TUNNEL_LENGTH_HELPTEXT
-strval = STR_CONFIG_SETTING_TILE_LENGTH
-
-[SDT_VAR]
-var = construction.train_signal_side
-type = SLE_UINT8
-flags = SF_GUI_DROPDOWN | SF_NO_NETWORK
-def = 1
-min = 0
-max = 2
-str = STR_CONFIG_SETTING_SIGNALSIDE
-strhelp = STR_CONFIG_SETTING_SIGNALSIDE_HELPTEXT
-strval = STR_CONFIG_SETTING_SIGNALSIDE_LEFT
-post_cb = [](auto) { MarkWholeScreenDirty(); }
-cat = SC_BASIC
-
-[SDT_BOOL]
-var = station.never_expire_airports
-flags = SF_NO_NETWORK
-def = false
-str = STR_CONFIG_SETTING_NEVER_EXPIRE_AIRPORTS
-strhelp = STR_CONFIG_SETTING_NEVER_EXPIRE_AIRPORTS_HELPTEXT
-
-[SDT_VAR]
-var = economy.town_layout
-type = SLE_UINT8
-from = SLV_59
-flags = SF_GUI_DROPDOWN
-def = TL_ORIGINAL
-min = TL_BEGIN
-max = NUM_TLS - 1
-interval = 1
-str = STR_CONFIG_SETTING_TOWN_LAYOUT
-strhelp = STR_CONFIG_SETTING_TOWN_LAYOUT_HELPTEXT
-strval = STR_CONFIG_SETTING_TOWN_LAYOUT_DEFAULT
-post_cb = TownFoundingChanged
-
-[SDT_BOOL]
-var = economy.allow_town_roads
-from = SLV_113
-flags = SF_NO_NETWORK
-def = true
-str = STR_CONFIG_SETTING_ALLOW_TOWN_ROADS
-strhelp = STR_CONFIG_SETTING_ALLOW_TOWN_ROADS_HELPTEXT
-
-[SDT_VAR]
-var = economy.found_town
-type = SLE_UINT8
-from = SLV_128
-flags = SF_GUI_DROPDOWN
-def = TF_FORBIDDEN
-min = TF_BEGIN
-max = TF_END - 1
-interval = 1
-str = STR_CONFIG_SETTING_TOWN_FOUNDING
-strhelp = STR_CONFIG_SETTING_TOWN_FOUNDING_HELPTEXT
-strval = STR_CONFIG_SETTING_TOWN_FOUNDING_FORBIDDEN
-post_cb = TownFoundingChanged
-cat = SC_BASIC
-
-[SDT_BOOL]
-var = economy.allow_town_level_crossings
-from = SLV_143
-flags = SF_NO_NETWORK
-def = true
-str = STR_CONFIG_SETTING_ALLOW_TOWN_LEVEL_CROSSINGS
-strhelp = STR_CONFIG_SETTING_ALLOW_TOWN_LEVEL_CROSSINGS_HELPTEXT
-
-[SDT_VAR]
-var = economy.town_cargogen_mode
-type = SLE_UINT8
-from = SLV_TOWN_CARGOGEN
-flags = SF_GUI_DROPDOWN
-def = TCGM_BITCOUNT
-min = TCGM_BEGIN
-max = TCGM_END - 1
-interval = 1
-str = STR_CONFIG_SETTING_TOWN_CARGOGENMODE
-strhelp = STR_CONFIG_SETTING_TOWN_CARGOGENMODE_HELPTEXT
-strval = STR_CONFIG_SETTING_TOWN_CARGOGENMODE_ORIGINAL
-cat = SC_ADVANCED
-
-; link graph
-
-[SDT_VAR]
-var = linkgraph.recalc_interval
-type = SLE_UINT16
-from = SLV_183
-def = 4
-min = 2
-max = 32
-interval = 2
-str = STR_CONFIG_SETTING_LINKGRAPH_INTERVAL
-strval = STR_JUST_COMMA
-strhelp = STR_CONFIG_SETTING_LINKGRAPH_INTERVAL_HELPTEXT
-extra = offsetof(LinkGraphSettings, recalc_interval)
-
-[SDT_VAR]
-var = linkgraph.recalc_time
-type = SLE_UINT16
-from = SLV_183
-def = 16
-min = 1
-max = 4096
-interval = 1
-str = STR_CONFIG_SETTING_LINKGRAPH_TIME
-strval = STR_JUST_COMMA
-strhelp = STR_CONFIG_SETTING_LINKGRAPH_TIME_HELPTEXT
-extra = offsetof(LinkGraphSettings, recalc_time)
-
-
-[SDT_VAR]
-var = linkgraph.distribution_pax
-type = SLE_UINT8
-from = SLV_183
-flags = SF_GUI_DROPDOWN
-def = DT_MANUAL
-min = DT_MIN
-max = DT_MAX
-interval = 1
-str = STR_CONFIG_SETTING_DISTRIBUTION_PAX
-strval = STR_CONFIG_SETTING_DISTRIBUTION_MANUAL
-strhelp = STR_CONFIG_SETTING_DISTRIBUTION_PAX_HELPTEXT
-extra = offsetof(LinkGraphSettings, distribution_pax)
-
-
-[SDT_VAR]
-var = linkgraph.distribution_mail
-type = SLE_UINT8
-from = SLV_183
-flags = SF_GUI_DROPDOWN
-def = DT_MANUAL
-min = DT_MIN
-max = DT_MAX
-interval = 1
-str = STR_CONFIG_SETTING_DISTRIBUTION_MAIL
-strval = STR_CONFIG_SETTING_DISTRIBUTION_MANUAL
-strhelp = STR_CONFIG_SETTING_DISTRIBUTION_MAIL_HELPTEXT
-extra = offsetof(LinkGraphSettings, distribution_mail)
-
-
-[SDT_VAR]
-var = linkgraph.distribution_armoured
-type = SLE_UINT8
-from = SLV_183
-flags = SF_GUI_DROPDOWN
-def = DT_MANUAL
-min = DT_MIN
-max = DT_MAX
-interval = 1
-str = STR_CONFIG_SETTING_DISTRIBUTION_ARMOURED
-strval = STR_CONFIG_SETTING_DISTRIBUTION_MANUAL
-strhelp = STR_CONFIG_SETTING_DISTRIBUTION_ARMOURED_HELPTEXT
-extra = offsetof(LinkGraphSettings, distribution_armoured)
-
-
-[SDT_VAR]
-var = linkgraph.distribution_default
-type = SLE_UINT8
-from = SLV_183
-flags = SF_GUI_DROPDOWN
-def = DT_MANUAL
-min = DT_BEGIN
-max = DT_MAX_NONSYMMETRIC
-interval = 1
-str = STR_CONFIG_SETTING_DISTRIBUTION_DEFAULT
-strval = STR_CONFIG_SETTING_DISTRIBUTION_MANUAL
-strhelp = STR_CONFIG_SETTING_DISTRIBUTION_DEFAULT_HELPTEXT
-extra = offsetof(LinkGraphSettings, distribution_default)
-
-
-[SDT_VAR]
-var = linkgraph.accuracy
-type = SLE_UINT8
-from = SLV_183
-def = 16
-min = 2
-max = 64
-interval = 1
-str = STR_CONFIG_SETTING_LINKGRAPH_ACCURACY
-strval = STR_JUST_COMMA
-strhelp = STR_CONFIG_SETTING_LINKGRAPH_ACCURACY_HELPTEXT
-extra = offsetof(LinkGraphSettings, accuracy)
-
-
-[SDT_VAR]
-var = linkgraph.demand_distance
-type = SLE_UINT8
-from = SLV_183
-def = 100
-min = 0
-max = 255
-interval = 5
-str = STR_CONFIG_SETTING_DEMAND_DISTANCE
-strval = STR_CONFIG_SETTING_PERCENTAGE
-strhelp = STR_CONFIG_SETTING_DEMAND_DISTANCE_HELPTEXT
-extra = offsetof(LinkGraphSettings, demand_distance)
-
-
-[SDT_VAR]
-var = linkgraph.demand_size
-type = SLE_UINT8
-from = SLV_183
-def = 100
-min = 0
-max = 100
-interval = 5
-str = STR_CONFIG_SETTING_DEMAND_SIZE
-strval = STR_CONFIG_SETTING_PERCENTAGE
-strhelp = STR_CONFIG_SETTING_DEMAND_SIZE_HELPTEXT
-extra = offsetof(LinkGraphSettings, demand_size)
-
-
-[SDT_VAR]
-var = linkgraph.short_path_saturation
-type = SLE_UINT8
-from = SLV_183
-def = 80
-min = 0
-max = 250
-interval = 5
-str = STR_CONFIG_SETTING_SHORT_PATH_SATURATION
-strval = STR_CONFIG_SETTING_PERCENTAGE
-strhelp = STR_CONFIG_SETTING_SHORT_PATH_SATURATION_HELPTEXT
-extra = offsetof(LinkGraphSettings, short_path_saturation)
-
-
-; Vehicles
-
-[SDT_VAR]
-var = vehicle.train_acceleration_model
-type = SLE_UINT8
-flags = SF_GUI_DROPDOWN
-def = 1
-min = 0
-max = 1
-interval = 1
-str = STR_CONFIG_SETTING_TRAIN_ACCELERATION_MODEL
-strhelp = STR_CONFIG_SETTING_TRAIN_ACCELERATION_MODEL_HELPTEXT
-strval = STR_CONFIG_SETTING_ORIGINAL
-post_cb = TrainAccelerationModelChanged
-
-[SDT_VAR]
-var = vehicle.roadveh_acceleration_model
-type = SLE_UINT8
-from = SLV_139
-flags = SF_GUI_DROPDOWN
-def = 1
-min = 0
-max = 1
-interval = 1
-str = STR_CONFIG_SETTING_ROAD_VEHICLE_ACCELERATION_MODEL
-strhelp = STR_CONFIG_SETTING_ROAD_VEHICLE_ACCELERATION_MODEL_HELPTEXT
-strval = STR_CONFIG_SETTING_ORIGINAL
-post_cb = RoadVehAccelerationModelChanged
-
-[SDT_VAR]
-var = vehicle.train_slope_steepness
-type = SLE_UINT8
-from = SLV_133
-def = 3
-min = 0
-max = 10
-interval = 1
-str = STR_CONFIG_SETTING_TRAIN_SLOPE_STEEPNESS
-strhelp = STR_CONFIG_SETTING_TRAIN_SLOPE_STEEPNESS_HELPTEXT
-strval = STR_CONFIG_SETTING_PERCENTAGE
-post_cb = TrainSlopeSteepnessChanged
-cat = SC_EXPERT
-
-[SDT_VAR]
-var = vehicle.roadveh_slope_steepness
-type = SLE_UINT8
-from = SLV_139
-def = 7
-min = 0
-max = 10
-interval = 1
-str = STR_CONFIG_SETTING_ROAD_VEHICLE_SLOPE_STEEPNESS
-strhelp = STR_CONFIG_SETTING_ROAD_VEHICLE_SLOPE_STEEPNESS_HELPTEXT
-strval = STR_CONFIG_SETTING_PERCENTAGE
-post_cb = RoadVehSlopeSteepnessChanged
-cat = SC_EXPERT
-
-[SDT_BOOL]
-var = pf.forbid_90_deg
-def = false
-str = STR_CONFIG_SETTING_FORBID_90_DEG
-strhelp = STR_CONFIG_SETTING_FORBID_90_DEG_HELPTEXT
-post_cb = InvalidateShipPathCache
-cat = SC_EXPERT
-
-[SDT_VAR]
-var = vehicle.max_train_length
-type = SLE_UINT8
-from = SLV_159
-def = 7
-min = 1
-max = 64
-interval = 1
-str = STR_CONFIG_SETTING_TRAIN_LENGTH
-strhelp = STR_CONFIG_SETTING_TRAIN_LENGTH_HELPTEXT
-strval = STR_CONFIG_SETTING_TILE_LENGTH
-cat = SC_BASIC
-
-[SDT_VAR]
-var = vehicle.smoke_amount
-type = SLE_UINT8
-from = SLV_145
-flags = SF_GUI_DROPDOWN
-def = 1
-min = 0
-max = 2
-str = STR_CONFIG_SETTING_SMOKE_AMOUNT
-strhelp = STR_CONFIG_SETTING_SMOKE_AMOUNT_HELPTEXT
-strval = STR_CONFIG_SETTING_NONE
-
-; path finder
-
-[SDT_BOOL]
-var = pf.roadveh_queue
-def = true
-cat = SC_EXPERT
-
-[SDT_BOOL]
-var = pf.new_pathfinding_all
-to = SLV_87
-def = false
-cat = SC_EXPERT
-
-[SDT_BOOL]
-var = pf.yapf.ship_use_yapf
-from = SLV_28
-to = SLV_87
-def = false
-cat = SC_EXPERT
-
-[SDT_BOOL]
-var = pf.yapf.road_use_yapf
-from = SLV_28
-to = SLV_87
-def = true
-cat = SC_EXPERT
-
-[SDT_BOOL]
-var = pf.yapf.rail_use_yapf
-from = SLV_28
-to = SLV_87
-def = true
-cat = SC_EXPERT
-
-##
-[SDT_VAR]
-var = pf.pathfinder_for_trains
-type = SLE_UINT8
-from = SLV_87
-flags = SF_GUI_DROPDOWN
-def = 2
-min = 1
-max = 2
-interval = 1
-str = STR_CONFIG_SETTING_PATHFINDER_FOR_TRAINS
-strhelp = STR_CONFIG_SETTING_PATHFINDER_FOR_TRAINS_HELPTEXT
-strval = STR_CONFIG_SETTING_PATHFINDER_NPF
-cat = SC_EXPERT
-
-[SDT_VAR]
-var = pf.pathfinder_for_roadvehs
-type = SLE_UINT8
-from = SLV_87
-flags = SF_GUI_DROPDOWN
-def = 2
-min = 1
-max = 2
-interval = 1
-str = STR_CONFIG_SETTING_PATHFINDER_FOR_ROAD_VEHICLES
-strhelp = STR_CONFIG_SETTING_PATHFINDER_FOR_ROAD_VEHICLES_HELPTEXT
-strval = STR_CONFIG_SETTING_PATHFINDER_NPF
-cat = SC_EXPERT
-
-[SDT_VAR]
-var = pf.pathfinder_for_ships
-type = SLE_UINT8
-from = SLV_87
-flags = SF_GUI_DROPDOWN
-def = 2
-min = 1
-max = 2
-interval = 1
-str = STR_CONFIG_SETTING_PATHFINDER_FOR_SHIPS
-strhelp = STR_CONFIG_SETTING_PATHFINDER_FOR_SHIPS_HELPTEXT
-strval = STR_CONFIG_SETTING_PATHFINDER_NPF
-post_cb = InvalidateShipPathCache
-cat = SC_EXPERT
-
-[SDT_BOOL]
-var = vehicle.never_expire_vehicles
-flags = SF_NO_NETWORK
-def = false
-str = STR_CONFIG_SETTING_NEVER_EXPIRE_VEHICLES
-strhelp = STR_CONFIG_SETTING_NEVER_EXPIRE_VEHICLES_HELPTEXT
-
-[SDT_VAR]
-var = vehicle.max_trains
-type = SLE_UINT16
-def = 500
-min = 0
-max = 5000
-str = STR_CONFIG_SETTING_MAX_TRAINS
-strhelp = STR_CONFIG_SETTING_MAX_TRAINS_HELPTEXT
-strval = STR_JUST_COMMA
-post_cb = MaxVehiclesChanged
-cat = SC_BASIC
-
-[SDT_VAR]
-var = vehicle.max_roadveh
-type = SLE_UINT16
-def = 500
-min = 0
-max = 5000
-str = STR_CONFIG_SETTING_MAX_ROAD_VEHICLES
-strhelp = STR_CONFIG_SETTING_MAX_ROAD_VEHICLES_HELPTEXT
-strval = STR_JUST_COMMA
-post_cb = MaxVehiclesChanged
-cat = SC_BASIC
-
-[SDT_VAR]
-var = vehicle.max_aircraft
-type = SLE_UINT16
-def = 200
-min = 0
-max = 5000
-str = STR_CONFIG_SETTING_MAX_AIRCRAFT
-strhelp = STR_CONFIG_SETTING_MAX_AIRCRAFT_HELPTEXT
-strval = STR_JUST_COMMA
-post_cb = MaxVehiclesChanged
-cat = SC_BASIC
-
-[SDT_VAR]
-var = vehicle.max_ships
-type = SLE_UINT16
-def = 300
-min = 0
-max = 5000
-str = STR_CONFIG_SETTING_MAX_SHIPS
-strhelp = STR_CONFIG_SETTING_MAX_SHIPS_HELPTEXT
-strval = STR_JUST_COMMA
-post_cb = MaxVehiclesChanged
-cat = SC_BASIC
-
-[SDTG_BOOL]
-name = """"
-flags = SF_NO_NETWORK
-var = _old_vds.servint_ispercent
-def = false
-to = SLV_120
-
-[SDTG_VAR]
-name = """"
-type = SLE_UINT16
-flags = SF_GUI_0_IS_SPECIAL
-var = _old_vds.servint_trains
-def = 150
-min = 5
-max = 800
-to = SLV_120
-
-[SDTG_VAR]
-name = """"
-type = SLE_UINT16
-flags = SF_GUI_0_IS_SPECIAL
-var = _old_vds.servint_roadveh
-def = 150
-min = 5
-max = 800
-to = SLV_120
-
-[SDTG_VAR]
-name = """"
-type = SLE_UINT16
-flags = SF_GUI_0_IS_SPECIAL
-var = _old_vds.servint_ships
-def = 360
-min = 5
-max = 800
-to = SLV_120
-
-[SDTG_VAR]
-name = """"
-type = SLE_UINT16
-flags = SF_GUI_0_IS_SPECIAL
-var = _old_vds.servint_aircraft
-def = 150
-min = 5
-max = 800
-to = SLV_120
-
-[SDT_BOOL]
-var = order.no_servicing_if_no_breakdowns
-def = true
-str = STR_CONFIG_SETTING_NOSERVICE
-strhelp = STR_CONFIG_SETTING_NOSERVICE_HELPTEXT
-
-[SDT_BOOL]
-var = vehicle.wagon_speed_limits
-flags = SF_NO_NETWORK
-def = true
-str = STR_CONFIG_SETTING_WAGONSPEEDLIMITS
-strhelp = STR_CONFIG_SETTING_WAGONSPEEDLIMITS_HELPTEXT
-post_cb = UpdateConsists
-
-[SDT_BOOL]
-var = vehicle.disable_elrails
-from = SLV_38
-flags = SF_NO_NETWORK
-def = false
-str = STR_CONFIG_SETTING_DISABLE_ELRAILS
-strhelp = STR_CONFIG_SETTING_DISABLE_ELRAILS_HELPTEXT
-post_cb = SettingsDisableElrail
-cat = SC_EXPERT
-
-[SDT_VAR]
-var = vehicle.freight_trains
-type = SLE_UINT8
-from = SLV_39
-flags = SF_NO_NETWORK
-def = 1
-min = 1
-max = 255
-interval = 1
-str = STR_CONFIG_SETTING_FREIGHT_TRAINS
-strhelp = STR_CONFIG_SETTING_FREIGHT_TRAINS_HELPTEXT
-strval = STR_JUST_COMMA
-post_cb = UpdateConsists
-
-[SDT_VAR]
-var = vehicle.plane_speed
-type = SLE_UINT8
-from = SLV_90
-flags = SF_NO_NETWORK
-def = 4
-min = 1
-max = 4
-str = STR_CONFIG_SETTING_PLANE_SPEED
-strhelp = STR_CONFIG_SETTING_PLANE_SPEED_HELPTEXT
-strval = STR_CONFIG_SETTING_PLANE_SPEED_VALUE
-
-[SDT_BOOL]
-var = vehicle.dynamic_engines
-from = SLV_95
-flags = SF_NO_NETWORK
-def = true
-pre_cb = CheckDynamicEngines
-cat = SC_EXPERT
-
-[SDT_VAR]
-var = vehicle.plane_crashes
-type = SLE_UINT8
-from = SLV_138
-flags = SF_GUI_DROPDOWN
-def = 2
-min = 0
-max = 2
-interval = 1
-str = STR_CONFIG_SETTING_PLANE_CRASHES
-strhelp = STR_CONFIG_SETTING_PLANE_CRASHES_HELPTEXT
-strval = STR_CONFIG_SETTING_PLANE_CRASHES_NONE
-cat = SC_BASIC
-
-[SDTC_BOOL]
-var = gui.sg_full_load_any
-from = SLV_22
-to = SLV_93
-def = true
-
-[SDT_BOOL]
-var = order.improved_load
-flags = SF_NO_NETWORK
-def = true
-cat = SC_EXPERT
-
-[SDT_BOOL]
-var = order.selectgoods
-def = true
-cat = SC_EXPERT
-
-[SDTC_BOOL]
-var = gui.sg_new_nonstop
-from = SLV_22
-to = SLV_93
-def = false
-
-[SDT_VAR]
-var = station.station_spread
-type = SLE_UINT8
-def = 12
-min = 4
-max = 64
-str = STR_CONFIG_SETTING_STATION_SPREAD
-strhelp = STR_CONFIG_SETTING_STATION_SPREAD_HELPTEXT
-strval = STR_CONFIG_SETTING_TILE_LENGTH
-post_cb = StationSpreadChanged
-cat = SC_BASIC
-
-[SDT_BOOL]
-var = order.serviceathelipad
-def = true
-str = STR_CONFIG_SETTING_SERVICEATHELIPAD
-strhelp = STR_CONFIG_SETTING_SERVICEATHELIPAD_HELPTEXT
-cat = SC_EXPERT
-
-[SDT_BOOL]
-var = station.modified_catchment
-def = true
-str = STR_CONFIG_SETTING_CATCHMENT
-strhelp = STR_CONFIG_SETTING_CATCHMENT_HELPTEXT
-post_cb = StationCatchmentChanged
-cat = SC_EXPERT
-
-[SDT_BOOL]
-var = station.serve_neutral_industries
-def = true
-from = SLV_SERVE_NEUTRAL_INDUSTRIES
-str = STR_CONFIG_SETTING_SERVE_NEUTRAL_INDUSTRIES
-strhelp = STR_CONFIG_SETTING_SERVE_NEUTRAL_INDUSTRIES_HELPTEXT
-post_cb = StationCatchmentChanged
-
-[SDT_BOOL]
-var = order.gradual_loading
-from = SLV_40
-flags = SF_NO_NETWORK
-def = true
-cat = SC_EXPERT
-
-[SDT_BOOL]
-var = construction.road_stop_on_town_road
-from = SLV_47
-def = true
-str = STR_CONFIG_SETTING_STOP_ON_TOWN_ROAD
-strhelp = STR_CONFIG_SETTING_STOP_ON_TOWN_ROAD_HELPTEXT
-cat = SC_BASIC
-
-[SDT_BOOL]
-var = construction.road_stop_on_competitor_road
-from = SLV_114
-def = true
-str = STR_CONFIG_SETTING_STOP_ON_COMPETITOR_ROAD
-strhelp = STR_CONFIG_SETTING_STOP_ON_COMPETITOR_ROAD_HELPTEXT
-cat = SC_BASIC
-
-[SDT_BOOL]
-var = station.adjacent_stations
-from = SLV_62
-def = true
-cat = SC_EXPERT
-
-[SDT_BOOL]
-var = economy.station_noise_level
-from = SLV_96
-flags = SF_NO_NETWORK
-def = false
-str = STR_CONFIG_SETTING_NOISE_LEVEL
-strhelp = STR_CONFIG_SETTING_NOISE_LEVEL_HELPTEXT
-post_cb = [](auto new_value) { InvalidateWindowClassesData(WC_TOWN_VIEW, new_value); }
-
-[SDT_BOOL]
-var = station.distant_join_stations
-from = SLV_106
-def = true
-str = STR_CONFIG_SETTING_DISTANT_JOIN_STATIONS
-strhelp = STR_CONFIG_SETTING_DISTANT_JOIN_STATIONS_HELPTEXT
-post_cb = [](auto) { CloseWindowById(WC_SELECT_STATION, 0); }
-
-##
-[SDT_BOOL]
-var = economy.inflation
-flags = SF_NO_NETWORK
-def = false
-str = STR_CONFIG_SETTING_INFLATION
-strhelp = STR_CONFIG_SETTING_INFLATION_HELPTEXT
-cat = SC_BASIC
-
-[SDT_VAR]
-var = construction.raw_industry_construction
-type = SLE_UINT8
-flags = SF_GUI_DROPDOWN
-def = 0
-min = 0
-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
-post_cb = [](auto) { InvalidateWindowData(WC_BUILD_INDUSTRY, 0); }
-cat = SC_BASIC
-
-[SDT_VAR]
-var = construction.industry_platform
-type = SLE_UINT8
-from = SLV_148
-def = 1
-min = 0
-max = 4
-str = STR_CONFIG_SETTING_INDUSTRY_PLATFORM
-strhelp = STR_CONFIG_SETTING_INDUSTRY_PLATFORM_HELPTEXT
-strval = STR_CONFIG_SETTING_TILE_LENGTH
-cat = SC_EXPERT
-
-[SDT_BOOL]
-var = economy.multiple_industry_per_town
-def = false
-str = STR_CONFIG_SETTING_MULTIPINDTOWN
-strhelp = STR_CONFIG_SETTING_MULTIPINDTOWN_HELPTEXT
-
-[SDT_BOOL]
-var = economy.bribe
-def = true
-str = STR_CONFIG_SETTING_BRIBE
-strhelp = STR_CONFIG_SETTING_BRIBE_HELPTEXT
-post_cb = [](auto) { SetWindowClassesDirty(WC_TOWN_AUTHORITY); }
-cat = SC_BASIC
-
-[SDT_BOOL]
-var = economy.exclusive_rights
-from = SLV_79
-def = true
-str = STR_CONFIG_SETTING_ALLOW_EXCLUSIVE
-strhelp = STR_CONFIG_SETTING_ALLOW_EXCLUSIVE_HELPTEXT
-post_cb = [](auto) { SetWindowClassesDirty(WC_TOWN_AUTHORITY); }
-cat = SC_BASIC
-
-[SDT_BOOL]
-var = economy.fund_buildings
-from = SLV_165
-def = true
-str = STR_CONFIG_SETTING_ALLOW_FUND_BUILDINGS
-strhelp = STR_CONFIG_SETTING_ALLOW_FUND_BUILDINGS_HELPTEXT
-post_cb = [](auto) { SetWindowClassesDirty(WC_TOWN_AUTHORITY); }
-cat = SC_BASIC
-
-[SDT_BOOL]
-var = economy.fund_roads
-from = SLV_160
-def = true
-str = STR_CONFIG_SETTING_ALLOW_FUND_ROAD
-strhelp = STR_CONFIG_SETTING_ALLOW_FUND_ROAD_HELPTEXT
-post_cb = [](auto) { SetWindowClassesDirty(WC_TOWN_AUTHORITY); }
-cat = SC_BASIC
-
-[SDT_BOOL]
-var = economy.give_money
-from = SLV_79
-def = true
-str = STR_CONFIG_SETTING_ALLOW_GIVE_MONEY
-strhelp = STR_CONFIG_SETTING_ALLOW_GIVE_MONEY_HELPTEXT
-cat = SC_BASIC
-
-[SDT_VAR]
-var = game_creation.snow_line_height
-type = SLE_UINT8
-flags = SF_SCENEDIT_ONLY
-def = DEF_SNOWLINE_HEIGHT
-min = MIN_SNOWLINE_HEIGHT
-max = MAX_SNOWLINE_HEIGHT
-interval = 1
-str = STR_CONFIG_SETTING_SNOWLINE_HEIGHT
-strhelp = STR_CONFIG_SETTING_SNOWLINE_HEIGHT_HELPTEXT
-strval = STR_JUST_COMMA
-cat = SC_BASIC
-
-[SDT_VAR]
-var = game_creation.snow_coverage
-type = SLE_UINT8
-from = SLV_MAPGEN_SETTINGS_REVAMP
-flags = SF_NEWGAME_ONLY
-def = DEF_SNOW_COVERAGE
-min = 0
-max = 100
-interval = 10
-str = STR_CONFIG_SETTING_SNOW_COVERAGE
-strhelp = STR_CONFIG_SETTING_SNOW_COVERAGE_HELPTEXT
-strval = STR_CONFIG_SETTING_SNOW_COVERAGE_VALUE
-cat = SC_BASIC
-
-[SDT_VAR]
-var = game_creation.desert_coverage
-type = SLE_UINT8
-from = SLV_MAPGEN_SETTINGS_REVAMP
-flags = SF_NEWGAME_ONLY
-def = DEF_DESERT_COVERAGE
-min = 0
-max = 100
-interval = 10
-str = STR_CONFIG_SETTING_DESERT_COVERAGE
-strhelp = STR_CONFIG_SETTING_DESERT_COVERAGE_HELPTEXT
-strval = STR_CONFIG_SETTING_DESERT_COVERAGE_VALUE
-cat = SC_BASIC
-
-[SDT_VAR]
-var = game_creation.starting_year
-type = SLE_INT32
-def = DEF_START_YEAR
-min = MIN_YEAR
-max = MAX_YEAR
-interval = 1
-str = STR_CONFIG_SETTING_STARTING_YEAR
-strval = STR_JUST_INT
-cat = SC_BASIC
-
-[SDT_VAR]
-var = game_creation.ending_year
-type = SLE_INT32
-from = SLV_ENDING_YEAR
-flags = SF_GUI_0_IS_SPECIAL
-def = DEF_END_YEAR
-min = MIN_YEAR
-max = MAX_YEAR - 1
-interval = 1
-str = STR_CONFIG_SETTING_ENDING_YEAR
-strhelp = STR_CONFIG_SETTING_ENDING_YEAR_HELPTEXT
-strval = STR_CONFIG_SETTING_ENDING_YEAR_VALUE
-cat = SC_ADVANCED
-
-[SDT_VAR]
-var = economy.type
-type = SLE_UINT8
-flags = SF_GUI_DROPDOWN
-def = ET_SMOOTH
-min = ET_BEGIN
-max = ET_END - 1
-str = STR_CONFIG_SETTING_ECONOMY_TYPE
-strhelp = STR_CONFIG_SETTING_ECONOMY_TYPE_HELPTEXT
-strval = STR_CONFIG_SETTING_ECONOMY_TYPE_ORIGINAL
-post_cb = [](auto) { InvalidateWindowClassesData(WC_INDUSTRY_VIEW); }
-cat = SC_BASIC
-
-[SDT_BOOL]
-var = economy.allow_shares
-def = false
-str = STR_CONFIG_SETTING_ALLOW_SHARES
-strhelp = STR_CONFIG_SETTING_ALLOW_SHARES_HELPTEXT
-post_cb = [](auto) { InvalidateWindowClassesData(WC_COMPANY); }
-
-[SDT_VAR]
-var = economy.min_years_for_shares
-type = SLE_UINT8
-from = SLV_TRADING_AGE
-def = 6
-min = 0
-max = 255
-interval = 1
-str = STR_CONFIG_SETTING_MIN_YEARS_FOR_SHARES
-strhelp = STR_CONFIG_SETTING_MIN_YEARS_FOR_SHARES_HELPTEXT
-strval = STR_JUST_INT
-cat = SC_EXPERT
-
-[SDT_VAR]
-var = economy.feeder_payment_share
-type = SLE_UINT8
-from = SLV_134
-def = 75
-min = 0
-max = 100
-str = STR_CONFIG_SETTING_FEEDER_PAYMENT_SHARE
-strhelp = STR_CONFIG_SETTING_FEEDER_PAYMENT_SHARE_HELPTEXT
-strval = STR_CONFIG_SETTING_PERCENTAGE
-cat = SC_EXPERT
-
-[SDT_VAR]
-var = economy.town_growth_rate
-type = SLE_UINT8
-from = SLV_54
-flags = SF_GUI_DROPDOWN
-def = 2
-min = 0
-max = 4
-str = STR_CONFIG_SETTING_TOWN_GROWTH
-strhelp = STR_CONFIG_SETTING_TOWN_GROWTH_HELPTEXT
-strval = STR_CONFIG_SETTING_TOWN_GROWTH_NONE
-
-[SDT_VAR]
-var = economy.larger_towns
-type = SLE_UINT8
-from = SLV_54
-flags = SF_GUI_0_IS_SPECIAL
-def = 4
-min = 0
-max = 255
-interval = 1
-str = STR_CONFIG_SETTING_LARGER_TOWNS
-strhelp = STR_CONFIG_SETTING_LARGER_TOWNS_HELPTEXT
-strval = STR_CONFIG_SETTING_LARGER_TOWNS_VALUE
-
-[SDT_VAR]
-var = economy.initial_city_size
-type = SLE_UINT8
-from = SLV_56
-def = 2
-min = 1
-max = 10
-interval = 1
-str = STR_CONFIG_SETTING_CITY_SIZE_MULTIPLIER
-strhelp = STR_CONFIG_SETTING_CITY_SIZE_MULTIPLIER_HELPTEXT
-strval = STR_JUST_COMMA
-
-[SDT_BOOL]
-var = economy.mod_road_rebuild
-from = SLV_77
-def = true
-cat = SC_EXPERT
-
-[SDT_OMANY]
-var = script.settings_profile
-type = SLE_UINT8
-from = SLV_178
-flags = SF_GUI_DROPDOWN
-def = SP_EASY
-min = SP_EASY
-max = SP_HARD
-full = _settings_profiles
-str = STR_CONFIG_SETTING_AI_PROFILE
-strhelp = STR_CONFIG_SETTING_AI_PROFILE_HELPTEXT
-strval = STR_CONFIG_SETTING_AI_PROFILE_EASY
-cat = SC_BASIC
-
-[SDT_BOOL]
-var = ai.ai_in_multiplayer
-def = true
-str = STR_CONFIG_SETTING_AI_IN_MULTIPLAYER
-strhelp = STR_CONFIG_SETTING_AI_IN_MULTIPLAYER_HELPTEXT
-cat = SC_BASIC
-
-[SDT_BOOL]
-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]
-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]
-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]
-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]
-var = script.script_max_opcode_till_suspend
-type = SLE_UINT32
-from = SLV_107
-flags = SF_NEWGAME_ONLY
-def = 10000
-min = 500
-max = 250000
-interval = 2500
-str = STR_CONFIG_SETTING_SCRIPT_MAX_OPCODES
-strhelp = STR_CONFIG_SETTING_SCRIPT_MAX_OPCODES_HELPTEXT
-strval = STR_JUST_COMMA
-cat = SC_EXPERT
-
-[SDT_VAR]
-var = script.script_max_memory_megabytes
-type = SLE_UINT32
-from = SLV_SCRIPT_MEMLIMIT
-flags = SF_NEWGAME_ONLY
-def = 1024
-min = 8
-max = 8192
-interval = 8
-str = STR_CONFIG_SETTING_SCRIPT_MAX_MEMORY
-strhelp = STR_CONFIG_SETTING_SCRIPT_MAX_MEMORY_HELPTEXT
-strval = STR_CONFIG_SETTING_SCRIPT_MAX_MEMORY_VALUE
-cat = SC_EXPERT
-
-##
-[SDT_VAR]
-var = vehicle.extend_vehicle_life
-type = SLE_UINT8
-def = 0
-min = 0
-max = 100
-cat = SC_EXPERT
-
-[SDT_VAR]
-var = economy.dist_local_authority
-type = SLE_UINT8
-def = 20
-min = 5
-max = 60
-cat = SC_EXPERT
-
-[SDT_BOOL]
-var = pf.reverse_at_signals
-from = SLV_159
-def = false
-str = STR_CONFIG_SETTING_REVERSE_AT_SIGNALS
-strhelp = STR_CONFIG_SETTING_REVERSE_AT_SIGNALS_HELPTEXT
-
-[SDT_VAR]
-var = pf.wait_oneway_signal
-type = SLE_UINT8
-def = 15
-min = 2
-max = 255
-cat = SC_EXPERT
-
-[SDT_VAR]
-var = pf.wait_twoway_signal
-type = SLE_UINT8
-def = 41
-min = 2
-max = 255
-cat = SC_EXPERT
-
-[SDT_VAR]
-var = economy.town_noise_population[0]
-type = SLE_UINT16
-from = SLV_96
-def = 800
-min = 200
-max = 65535
-cat = SC_EXPERT
-
-[SDT_VAR]
-var = economy.town_noise_population[1]
-type = SLE_UINT16
-from = SLV_96
-def = 2000
-min = 400
-max = 65535
-cat = SC_EXPERT
-
-[SDT_VAR]
-var = economy.town_noise_population[2]
-type = SLE_UINT16
-from = SLV_96
-def = 4000
-min = 800
-max = 65535
-cat = SC_EXPERT
-
-[SDT_BOOL]
-var = economy.infrastructure_maintenance
-from = SLV_166
-def = false
-str = STR_CONFIG_SETTING_INFRASTRUCTURE_MAINTENANCE
-strhelp = STR_CONFIG_SETTING_INFRASTRUCTURE_MAINTENANCE_HELPTEXT
-post_cb = [](auto) { InvalidateWindowClassesData(WC_COMPANY_INFRASTRUCTURE); }
-cat = SC_BASIC
-
-##
-[SDT_VAR]
-var = pf.wait_for_pbs_path
-type = SLE_UINT8
-from = SLV_100
-def = 30
-min = 2
-max = 255
-cat = SC_EXPERT
-
-[SDT_BOOL]
-var = pf.reserve_paths
-from = SLV_100
-def = false
-cat = SC_EXPERT
-
-[SDT_VAR]
-var = pf.path_backoff_interval
-type = SLE_UINT8
-from = SLV_100
-def = 20
-min = 1
-max = 255
-cat = SC_EXPERT
-
-[SDT_VAR]
-var = pf.npf.npf_max_search_nodes
-type = SLE_UINT
-def = 10000
-min = 500
-max = 100000
-cat = SC_EXPERT
-
-[SDT_VAR]
-var = pf.npf.npf_rail_firstred_penalty
-type = SLE_UINT
-def = 10 * NPF_TILE_LENGTH
-min = 0
-max = 100000
-cat = SC_EXPERT
-
-[SDT_VAR]
-var = pf.npf.npf_rail_firstred_exit_penalty
-type = SLE_UINT
-def = 100 * NPF_TILE_LENGTH
-min = 0
-max = 100000
-cat = SC_EXPERT
-
-[SDT_VAR]
-var = pf.npf.npf_rail_lastred_penalty
-type = SLE_UINT
-def = 10 * NPF_TILE_LENGTH
-min = 0
-max = 100000
-cat = SC_EXPERT
-
-[SDT_VAR]
-var = pf.npf.npf_rail_station_penalty
-type = SLE_UINT
-def = 1 * NPF_TILE_LENGTH
-min = 0
-max = 100000
-cat = SC_EXPERT
-
-[SDT_VAR]
-var = pf.npf.npf_rail_slope_penalty
-type = SLE_UINT
-def = 1 * NPF_TILE_LENGTH
-min = 0
-max = 100000
-cat = SC_EXPERT
-
-[SDT_VAR]
-var = pf.npf.npf_rail_curve_penalty
-type = SLE_UINT
-def = 1 * NPF_TILE_LENGTH
-min = 0
-max = 100000
-cat = SC_EXPERT
-
-[SDT_VAR]
-var = pf.npf.npf_rail_depot_reverse_penalty
-type = SLE_UINT
-def = 50 * NPF_TILE_LENGTH
-min = 0
-max = 100000
-cat = SC_EXPERT
-
-[SDT_VAR]
-var = pf.npf.npf_rail_pbs_cross_penalty
-type = SLE_UINT
-from = SLV_100
-def = 3 * NPF_TILE_LENGTH
-min = 0
-max = 100000
-cat = SC_EXPERT
-
-[SDT_VAR]
-var = pf.npf.npf_rail_pbs_signal_back_penalty
-type = SLE_UINT
-from = SLV_100
-def = 15 * NPF_TILE_LENGTH
-min = 0
-max = 100000
-cat = SC_EXPERT
-
-[SDT_VAR]
-var = pf.npf.npf_buoy_penalty
-type = SLE_UINT
-def = 2 * NPF_TILE_LENGTH
-min = 0
-max = 100000
-cat = SC_EXPERT
-
-[SDT_VAR]
-var = pf.npf.npf_water_curve_penalty
-type = SLE_UINT
-def = 1 * NPF_TILE_LENGTH
-min = 0
-max = 100000
-cat = SC_EXPERT
-
-[SDT_VAR]
-var = pf.npf.npf_road_curve_penalty
-type = SLE_UINT
-def = 1 * NPF_TILE_LENGTH
-min = 0
-max = 100000
-cat = SC_EXPERT
-
-[SDT_VAR]
-var = pf.npf.npf_crossing_penalty
-type = SLE_UINT
-def = 3 * NPF_TILE_LENGTH
-min = 0
-max = 100000
-cat = SC_EXPERT
-
-[SDT_VAR]
-var = pf.npf.npf_road_drive_through_penalty
-type = SLE_UINT
-from = SLV_47
-def = 8 * NPF_TILE_LENGTH
-min = 0
-max = 100000
-cat = SC_EXPERT
-
-[SDT_VAR]
-var = pf.npf.npf_road_dt_occupied_penalty
-type = SLE_UINT
-from = SLV_130
-def = 8 * NPF_TILE_LENGTH
-min = 0
-max = 100000
-cat = SC_EXPERT
-
-[SDT_VAR]
-var = pf.npf.npf_road_bay_occupied_penalty
-type = SLE_UINT
-from = SLV_130
-def = 15 * NPF_TILE_LENGTH
-min = 0
-max = 100000
-cat = SC_EXPERT
-
-[SDT_VAR]
-var = pf.npf.maximum_go_to_depot_penalty
-type = SLE_UINT
-from = SLV_131
-def = 20 * NPF_TILE_LENGTH
-min = 0
-max = 1000000
-cat = SC_EXPERT
-
-##
-[SDT_BOOL]
-var = pf.yapf.disable_node_optimization
-from = SLV_28
-def = false
-cat = SC_EXPERT
-
-[SDT_VAR]
-var = pf.yapf.max_search_nodes
-type = SLE_UINT
-from = SLV_28
-def = 10000
-min = 500
-max = 1000000
-cat = SC_EXPERT
-
-[SDT_BOOL]
-var = pf.yapf.rail_firstred_twoway_eol
-from = SLV_28
-def = false
-cat = SC_EXPERT
-
-[SDT_VAR]
-var = pf.yapf.rail_firstred_penalty
-type = SLE_UINT
-from = SLV_28
-def = 10 * YAPF_TILE_LENGTH
-min = 0
-max = 1000000
-cat = SC_EXPERT
-
-[SDT_VAR]
-var = pf.yapf.rail_firstred_exit_penalty
-type = SLE_UINT
-from = SLV_28
-def = 100 * YAPF_TILE_LENGTH
-min = 0
-max = 1000000
-cat = SC_EXPERT
-
-[SDT_VAR]
-var = pf.yapf.rail_lastred_penalty
-type = SLE_UINT
-from = SLV_28
-def = 10 * YAPF_TILE_LENGTH
-min = 0
-max = 1000000
-cat = SC_EXPERT
-
-[SDT_VAR]
-var = pf.yapf.rail_lastred_exit_penalty
-type = SLE_UINT
-from = SLV_28
-def = 100 * YAPF_TILE_LENGTH
-min = 0
-max = 1000000
-cat = SC_EXPERT
-
-[SDT_VAR]
-var = pf.yapf.rail_station_penalty
-type = SLE_UINT
-from = SLV_28
-def = 10 * YAPF_TILE_LENGTH
-min = 0
-max = 1000000
-cat = SC_EXPERT
-
-[SDT_VAR]
-var = pf.yapf.rail_slope_penalty
-type = SLE_UINT
-from = SLV_28
-def = 2 * YAPF_TILE_LENGTH
-min = 0
-max = 1000000
-cat = SC_EXPERT
-
-[SDT_VAR]
-var = pf.yapf.rail_curve45_penalty
-type = SLE_UINT
-from = SLV_28
-def = 1 * YAPF_TILE_LENGTH
-min = 0
-max = 1000000
-cat = SC_EXPERT
-
-[SDT_VAR]
-var = pf.yapf.rail_curve90_penalty
-type = SLE_UINT
-from = SLV_28
-def = 6 * YAPF_TILE_LENGTH
-min = 0
-max = 1000000
-cat = SC_EXPERT
-
-[SDT_VAR]
-var = pf.yapf.rail_depot_reverse_penalty
-type = SLE_UINT
-from = SLV_28
-def = 50 * YAPF_TILE_LENGTH
-min = 0
-max = 1000000
-cat = SC_EXPERT
-
-[SDT_VAR]
-var = pf.yapf.rail_crossing_penalty
-type = SLE_UINT
-from = SLV_28
-def = 3 * YAPF_TILE_LENGTH
-min = 0
-max = 1000000
-cat = SC_EXPERT
-
-[SDT_VAR]
-var = pf.yapf.rail_look_ahead_max_signals
-type = SLE_UINT
-from = SLV_28
-def = 10
-min = 1
-max = 100
-cat = SC_EXPERT
-
-[SDT_VAR]
-var = pf.yapf.rail_look_ahead_signal_p0
-type = SLE_INT
-from = SLV_28
-def = 500
-min = -1000000
-max = 1000000
-cat = SC_EXPERT
-
-[SDT_VAR]
-var = pf.yapf.rail_look_ahead_signal_p1
-type = SLE_INT
-from = SLV_28
-def = -100
-min = -1000000
-max = 1000000
-cat = SC_EXPERT
-
-[SDT_VAR]
-var = pf.yapf.rail_look_ahead_signal_p2
-type = SLE_INT
-from = SLV_28
-def = 5
-min = -1000000
-max = 1000000
-cat = SC_EXPERT
-
-[SDT_VAR]
-var = pf.yapf.rail_pbs_cross_penalty
-type = SLE_UINT
-from = SLV_100
-def = 3 * YAPF_TILE_LENGTH
-min = 0
-max = 1000000
-cat = SC_EXPERT
-
-[SDT_VAR]
-var = pf.yapf.rail_pbs_station_penalty
-type = SLE_UINT
-from = SLV_100
-def = 8 * YAPF_TILE_LENGTH
-min = 0
-max = 1000000
-cat = SC_EXPERT
-
-[SDT_VAR]
-var = pf.yapf.rail_pbs_signal_back_penalty
-type = SLE_UINT
-from = SLV_100
-def = 15 * YAPF_TILE_LENGTH
-min = 0
-max = 1000000
-cat = SC_EXPERT
-
-[SDT_VAR]
-var = pf.yapf.rail_doubleslip_penalty
-type = SLE_UINT
-from = SLV_100
-def = 1 * YAPF_TILE_LENGTH
-min = 0
-max = 1000000
-cat = SC_EXPERT
-
-[SDT_VAR]
-var = pf.yapf.rail_longer_platform_penalty
-type = SLE_UINT
-from = SLV_33
-def = 8 * YAPF_TILE_LENGTH
-min = 0
-max = 20000
-cat = SC_EXPERT
-
-[SDT_VAR]
-var = pf.yapf.rail_longer_platform_per_tile_penalty
-type = SLE_UINT
-from = SLV_33
-def = 0 * YAPF_TILE_LENGTH
-min = 0
-max = 20000
-cat = SC_EXPERT
-
-[SDT_VAR]
-var = pf.yapf.rail_shorter_platform_penalty
-type = SLE_UINT
-from = SLV_33
-def = 40 * YAPF_TILE_LENGTH
-min = 0
-max = 20000
-cat = SC_EXPERT
-
-[SDT_VAR]
-var = pf.yapf.rail_shorter_platform_per_tile_penalty
-type = SLE_UINT
-from = SLV_33
-def = 0 * YAPF_TILE_LENGTH
-min = 0
-max = 20000
-cat = SC_EXPERT
-
-[SDT_VAR]
-var = pf.yapf.road_slope_penalty
-type = SLE_UINT
-from = SLV_33
-def = 2 * YAPF_TILE_LENGTH
-min = 0
-max = 1000000
-cat = SC_EXPERT
-
-[SDT_VAR]
-var = pf.yapf.road_curve_penalty
-type = SLE_UINT
-from = SLV_33
-def = 1 * YAPF_TILE_LENGTH
-min = 0
-max = 1000000
-cat = SC_EXPERT
-
-[SDT_VAR]
-var = pf.yapf.road_crossing_penalty
-type = SLE_UINT
-from = SLV_33
-def = 3 * YAPF_TILE_LENGTH
-min = 0
-max = 1000000
-cat = SC_EXPERT
-
-[SDT_VAR]
-var = pf.yapf.road_stop_penalty
-type = SLE_UINT
-from = SLV_47
-def = 8 * YAPF_TILE_LENGTH
-min = 0
-max = 1000000
-cat = SC_EXPERT
-
-[SDT_VAR]
-var = pf.yapf.road_stop_occupied_penalty
-type = SLE_UINT
-from = SLV_130
-def = 8 * YAPF_TILE_LENGTH
-min = 0
-max = 1000000
-cat = SC_EXPERT
-
-[SDT_VAR]
-var = pf.yapf.road_stop_bay_occupied_penalty
-type = SLE_UINT
-from = SLV_130
-def = 15 * YAPF_TILE_LENGTH
-min = 0
-max = 1000000
-cat = SC_EXPERT
-
-[SDT_VAR]
-var = pf.yapf.maximum_go_to_depot_penalty
-type = SLE_UINT
-from = SLV_131
-def = 20 * YAPF_TILE_LENGTH
-min = 0
-max = 1000000
-cat = SC_EXPERT
-
-[SDT_VAR]
-var = pf.yapf.ship_curve45_penalty
-type = SLE_UINT
-from = SLV_SHIP_CURVE_PENALTY
-def = 1 * YAPF_TILE_LENGTH
-min = 0
-max = 1000000
-cat = SC_EXPERT
-
-[SDT_VAR]
-var = pf.yapf.ship_curve90_penalty
-type = SLE_UINT
-from = SLV_SHIP_CURVE_PENALTY
-def = 6 * YAPF_TILE_LENGTH
-min = 0
-max = 1000000
-cat = SC_EXPERT
-
-##
-[SDT_VAR]
-var = game_creation.land_generator
-type = SLE_UINT8
-from = SLV_30
-flags = SF_GUI_DROPDOWN | SF_NEWGAME_ONLY
-def = 1
-min = 0
-max = 1
-str = STR_CONFIG_SETTING_LAND_GENERATOR
-strhelp = STR_CONFIG_SETTING_LAND_GENERATOR_HELPTEXT
-strval = STR_CONFIG_SETTING_LAND_GENERATOR_ORIGINAL
-
-[SDT_VAR]
-var = game_creation.oil_refinery_limit
-type = SLE_UINT8
-from = SLV_30
-def = 32
-min = 12
-max = 128
-str = STR_CONFIG_SETTING_OIL_REF_EDGE_DISTANCE
-strval = STR_CONFIG_SETTING_TILE_LENGTH
-strhelp = STR_CONFIG_SETTING_OIL_REF_EDGE_DISTANCE_HELPTEXT
-
-[SDT_VAR]
-var = game_creation.tgen_smoothness
-type = SLE_UINT8
-from = SLV_30
-flags = SF_GUI_DROPDOWN | SF_NEWGAME_ONLY
-def = 1
-min = TGEN_SMOOTHNESS_BEGIN
-max = TGEN_SMOOTHNESS_END - 1
-str = STR_CONFIG_SETTING_ROUGHNESS_OF_TERRAIN
-strhelp = STR_CONFIG_SETTING_ROUGHNESS_OF_TERRAIN_HELPTEXT
-strval = STR_CONFIG_SETTING_ROUGHNESS_OF_TERRAIN_VERY_SMOOTH
-cat = SC_BASIC
-
-[SDT_VAR]
-var = game_creation.variety
-type = SLE_UINT8
-from = SLV_197
-flags = SF_GUI_DROPDOWN | SF_NEWGAME_ONLY
-def = 0
-min = 0
-max = 5
-str = STR_CONFIG_SETTING_VARIETY
-strhelp = STR_CONFIG_SETTING_VARIETY_HELPTEXT
-strval = STR_VARIETY_NONE
-
-[SDT_VAR]
-var = game_creation.generation_seed
-type = SLE_UINT32
-from = SLV_30
-def = GENERATE_NEW_SEED
-min = 0
-max = UINT32_MAX
-cat = SC_EXPERT
-
-[SDT_VAR]
-var = game_creation.tree_placer
-type = SLE_UINT8
-from = SLV_30
-flags = SF_GUI_DROPDOWN | SF_NEWGAME_ONLY | SF_SCENEDIT_TOO
-def = 2
-min = 0
-max = 2
-str = STR_CONFIG_SETTING_TREE_PLACER
-strhelp = STR_CONFIG_SETTING_TREE_PLACER_HELPTEXT
-strval = STR_CONFIG_SETTING_TREE_PLACER_NONE
-cat = SC_BASIC
-
-[SDT_VAR]
-var = game_creation.heightmap_rotation
-type = SLE_UINT8
-flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC | SF_GUI_DROPDOWN
-def = 0
-min = 0
-max = 1
-str = STR_CONFIG_SETTING_HEIGHTMAP_ROTATION
-strval = STR_CONFIG_SETTING_HEIGHTMAP_ROTATION_COUNTER_CLOCKWISE
-cat = SC_BASIC
-
-[SDT_VAR]
-var = game_creation.se_flat_world_height
-type = SLE_UINT8
-flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC
-def = 1
-min = 0
-max = 15
-str = STR_CONFIG_SETTING_SE_FLAT_WORLD_HEIGHT
-strval = STR_JUST_COMMA
-cat = SC_BASIC
-
-##
-[SDT_VAR]
-var = game_creation.map_x
-type = SLE_UINT8
-flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC
-def = 8
-min = MIN_MAP_SIZE_BITS
-max = MAX_MAP_SIZE_BITS
-cat = SC_BASIC
-
-[SDT_VAR]
-var = game_creation.map_y
-type = SLE_UINT8
-flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC
-def = 8
-min = MIN_MAP_SIZE_BITS
-max = MAX_MAP_SIZE_BITS
-cat = SC_BASIC
-
-[SDT_BOOL]
-var = construction.freeform_edges
-from = SLV_111
-def = true
-pre_cb = CheckFreeformEdges
-post_cb = UpdateFreeformEdges
-cat = SC_EXPERT
-
-[SDT_VAR]
-var = game_creation.water_borders
-type = SLE_UINT8
-from = SLV_111
-def = 15
-min = 0
-max = 16
-
-[SDT_VAR]
-var = game_creation.custom_town_number
-type = SLE_UINT16
-from = SLV_115
-def = 1
-min = 1
-max = 5000
-cat = SC_BASIC
-
-[SDT_VAR]
-var = construction.extra_tree_placement
-type = SLE_UINT8
-from = SLV_132
-flags = SF_GUI_DROPDOWN
-def = 2
-min = 0
-max = 3
-str = STR_CONFIG_SETTING_EXTRA_TREE_PLACEMENT
-strhelp = STR_CONFIG_SETTING_EXTRA_TREE_PLACEMENT_HELPTEXT
-strval = STR_CONFIG_SETTING_EXTRA_TREE_PLACEMENT_NO_SPREAD
-cat = SC_BASIC
-
-[SDT_VAR]
-var = game_creation.custom_terrain_type
-type = SLE_UINT8
-from = SLV_MAPGEN_SETTINGS_REVAMP
-flags = SF_NEWGAME_ONLY
-def = MAP_HEIGHT_LIMIT_AUTO_MINIMUM
-min = MIN_CUSTOM_TERRAIN_TYPE
-max = MAX_MAP_HEIGHT_LIMIT
-interval = 1
-
-[SDT_VAR]
-var = game_creation.custom_sea_level
-type = SLE_UINT8
-from = SLV_149
-def = CUSTOM_SEA_LEVEL_MIN_PERCENTAGE
-min = CUSTOM_SEA_LEVEL_MIN_PERCENTAGE
-max = CUSTOM_SEA_LEVEL_MAX_PERCENTAGE
-cat = SC_BASIC
-
-[SDT_VAR]
-var = game_creation.min_river_length
-type = SLE_UINT8
-from = SLV_163
-def = 16
-min = 2
-max = 255
-cat = SC_EXPERT
-
-[SDT_VAR]
-var = game_creation.river_route_random
-type = SLE_UINT8
-from = SLV_163
-def = 5
-min = 1
-max = 255
-cat = SC_EXPERT
-
-[SDT_VAR]
-var = game_creation.amount_of_rivers
-type = SLE_UINT8
-from = SLV_163
-flags = SF_GUI_DROPDOWN | SF_NEWGAME_ONLY
-def = 2
-min = 0
-max = 3
-str = STR_CONFIG_SETTING_RIVER_AMOUNT
-strhelp = STR_CONFIG_SETTING_RIVER_AMOUNT_HELPTEXT
-strval = STR_RIVERS_NONE
-
-; locale
-
-[SDT_OMANY]
-var = locale.currency
-type = SLE_UINT8
-from = SLV_97
-flags = SF_NO_NETWORK_SYNC
-def = 0
-max = CURRENCY_END - 1
-full = _locale_currencies
-post_cb = [](auto) { MarkWholeScreenDirty(); }
-cat = SC_BASIC
-
-[SDTG_OMANY]
-name = ""units""
-var = _old_units
-type = SLE_UINT8
-from = SLV_97
-to = SLV_184
-flags = SF_NOT_IN_CONFIG
-def = 1
-max = 2
-full = _locale_units
-post_cb = [](auto) { MarkWholeScreenDirty(); }
-cat = SC_BASIC
-
-[SDT_OMANY]
-var = locale.units_velocity
-type = SLE_UINT8
-from = SLV_184
-flags = SF_NO_NETWORK_SYNC | SF_GUI_DROPDOWN
-def = 1
-max = 3
-full = _locale_units
-post_cb = [](auto) { MarkWholeScreenDirty(); }
-cat = SC_BASIC
-str = STR_CONFIG_SETTING_LOCALISATION_UNITS_VELOCITY
-strhelp = STR_CONFIG_SETTING_LOCALISATION_UNITS_VELOCITY_HELPTEXT
-strval = STR_CONFIG_SETTING_LOCALISATION_UNITS_VELOCITY_IMPERIAL
-
-[SDT_OMANY]
-var = locale.units_power
-type = SLE_UINT8
-from = SLV_184
-flags = SF_NO_NETWORK_SYNC | SF_GUI_DROPDOWN
-def = 1
-max = 2
-full = _locale_units
-post_cb = [](auto) { MarkWholeScreenDirty(); }
-cat = SC_BASIC
-str = STR_CONFIG_SETTING_LOCALISATION_UNITS_POWER
-strhelp = STR_CONFIG_SETTING_LOCALISATION_UNITS_POWER_HELPTEXT
-strval = STR_CONFIG_SETTING_LOCALISATION_UNITS_POWER_IMPERIAL
-
-[SDT_OMANY]
-var = locale.units_weight
-type = SLE_UINT8
-from = SLV_184
-flags = SF_NO_NETWORK_SYNC | SF_GUI_DROPDOWN
-def = 1
-max = 2
-full = _locale_units
-post_cb = [](auto) { MarkWholeScreenDirty(); }
-cat = SC_BASIC
-str = STR_CONFIG_SETTING_LOCALISATION_UNITS_WEIGHT
-strhelp = STR_CONFIG_SETTING_LOCALISATION_UNITS_WEIGHT_HELPTEXT
-strval = STR_CONFIG_SETTING_LOCALISATION_UNITS_WEIGHT_IMPERIAL
-
-[SDT_OMANY]
-var = locale.units_volume
-type = SLE_UINT8
-from = SLV_184
-flags = SF_NO_NETWORK_SYNC | SF_GUI_DROPDOWN
-def = 1
-max = 2
-full = _locale_units
-post_cb = [](auto) { MarkWholeScreenDirty(); }
-cat = SC_BASIC
-str = STR_CONFIG_SETTING_LOCALISATION_UNITS_VOLUME
-strhelp = STR_CONFIG_SETTING_LOCALISATION_UNITS_VOLUME_HELPTEXT
-strval = STR_CONFIG_SETTING_LOCALISATION_UNITS_VOLUME_IMPERIAL
-
-[SDT_OMANY]
-var = locale.units_force
-type = SLE_UINT8
-from = SLV_184
-flags = SF_NO_NETWORK_SYNC | SF_GUI_DROPDOWN
-def = 2
-max = 2
-full = _locale_units
-post_cb = [](auto) { MarkWholeScreenDirty(); }
-cat = SC_BASIC
-str = STR_CONFIG_SETTING_LOCALISATION_UNITS_FORCE
-strhelp = STR_CONFIG_SETTING_LOCALISATION_UNITS_FORCE_HELPTEXT
-strval = STR_CONFIG_SETTING_LOCALISATION_UNITS_FORCE_IMPERIAL
-
-[SDT_OMANY]
-var = locale.units_height
-type = SLE_UINT8
-from = SLV_184
-flags = SF_NO_NETWORK_SYNC | SF_GUI_DROPDOWN
-def = 1
-max = 2
-full = _locale_units
-post_cb = [](auto) { MarkWholeScreenDirty(); }
-cat = SC_BASIC
-str = STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT
-strhelp = STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT_HELPTEXT
-strval = STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT_IMPERIAL
-
-[SDT_SSTR]
-var = locale.digit_group_separator
-type = SLE_STRQ
-from = SLV_118
-flags = SF_NO_NETWORK_SYNC
-def = nullptr
-post_cb = [](auto) { MarkWholeScreenDirty(); }
-cat = SC_BASIC
-
-[SDT_SSTR]
-var = locale.digit_group_separator_currency
-type = SLE_STRQ
-from = SLV_118
-flags = SF_NO_NETWORK_SYNC
-def = nullptr
-post_cb = [](auto) { MarkWholeScreenDirty(); }
-cat = SC_BASIC
-
-[SDT_SSTR]
-var = locale.digit_decimal_separator
-type = SLE_STRQ
-from = SLV_126
-flags = SF_NO_NETWORK_SYNC
-def = nullptr
-post_cb = [](auto) { MarkWholeScreenDirty(); }
-cat = SC_BASIC
-
-
-;***************************************************************************
-; Unsaved setting variables.
-
-[SDTC_OMANY]
-var = gui.autosave
-type = SLE_UINT8
-flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC | SF_GUI_DROPDOWN
-def = 1
-max = 4
-full = _autosave_interval
-str = STR_CONFIG_SETTING_AUTOSAVE
-strhelp = STR_CONFIG_SETTING_AUTOSAVE_HELPTEXT
-strval = STR_GAME_OPTIONS_AUTOSAVE_DROPDOWN_OFF
-cat = SC_BASIC
-
-[SDTC_BOOL]
-var = gui.threaded_saves
-flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC
-def = true
-cat = SC_EXPERT
-
-[SDTC_OMANY]
-var = gui.date_format_in_default_names
-type = SLE_UINT8
-flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC | SF_GUI_DROPDOWN
-def = 2
-max = 2
-full = _savegame_date
-str = STR_CONFIG_SETTING_DATE_FORMAT_IN_SAVE_NAMES
-strhelp = STR_CONFIG_SETTING_DATE_FORMAT_IN_SAVE_NAMES_HELPTEXT
-strval = STR_CONFIG_SETTING_DATE_FORMAT_IN_SAVE_NAMES_LONG
-
-[SDTC_BOOL]
-var = gui.show_finances
-flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC
-def = true
-str = STR_CONFIG_SETTING_SHOWFINANCES
-strhelp = STR_CONFIG_SETTING_SHOWFINANCES_HELPTEXT
-cat = SC_BASIC
-
-[SDTC_VAR]
-var = gui.auto_scrolling
-type = SLE_UINT8
-flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC | SF_GUI_DROPDOWN
-def = 0
-min = 0
-max = 3
-str = STR_CONFIG_SETTING_AUTOSCROLL
-strhelp = STR_CONFIG_SETTING_AUTOSCROLL_HELPTEXT
-strval = STR_CONFIG_SETTING_AUTOSCROLL_DISABLED
-cat = SC_BASIC
-
-[SDTC_VAR]
-ifdef = __EMSCRIPTEN__
-var = gui.scroll_mode
-type = SLE_UINT8
-flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC | SF_GUI_DROPDOWN
-def = 2
-min = 0
-max = 3
-str = STR_CONFIG_SETTING_SCROLLMODE
-strhelp = STR_CONFIG_SETTING_SCROLLMODE_HELPTEXT
-strval = STR_CONFIG_SETTING_SCROLLMODE_DEFAULT
-cat = SC_BASIC
-
-[SDTC_VAR]
-ifndef = __EMSCRIPTEN__
-var = gui.scroll_mode
-type = SLE_UINT8
-flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC | SF_GUI_DROPDOWN
-def = 0
-min = 0
-max = 3
-str = STR_CONFIG_SETTING_SCROLLMODE
-strhelp = STR_CONFIG_SETTING_SCROLLMODE_HELPTEXT
-strval = STR_CONFIG_SETTING_SCROLLMODE_DEFAULT
-cat = SC_BASIC
-
-[SDTC_BOOL]
-var = gui.smooth_scroll
-flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC
-def = false
-str = STR_CONFIG_SETTING_SMOOTH_SCROLLING
-strhelp = STR_CONFIG_SETTING_SMOOTH_SCROLLING_HELPTEXT
-
-[SDTC_BOOL]
-var = gui.right_mouse_wnd_close
-flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC
-def = false
-str = STR_CONFIG_SETTING_RIGHT_MOUSE_WND_CLOSE
-strhelp = STR_CONFIG_SETTING_RIGHT_MOUSE_WND_CLOSE_HELPTEXT
-cat = SC_BASIC
-
-; We might need to emulate a right mouse button on mac
-[SDTC_VAR]
-ifdef = __APPLE__
-var = gui.right_mouse_btn_emulation
-type = SLE_UINT8
-flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC | SF_GUI_DROPDOWN
-def = 0
-min = 0
-max = 2
-str = STR_CONFIG_SETTING_RIGHT_MOUSE_BTN_EMU
-strhelp = STR_CONFIG_SETTING_RIGHT_MOUSE_BTN_EMU_HELPTEXT
-strval = STR_CONFIG_SETTING_RIGHT_MOUSE_BTN_EMU_COMMAND
-cat = SC_BASIC
-
-[SDTC_BOOL]
-var = gui.measure_tooltip
-flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC
-def = true
-str = STR_CONFIG_SETTING_MEASURE_TOOLTIP
-strhelp = STR_CONFIG_SETTING_MEASURE_TOOLTIP_HELPTEXT
-cat = SC_BASIC
-
-[SDTC_VAR]
-var = gui.errmsg_duration
-type = SLE_UINT8
-flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC
-def = 5
-min = 0
-max = 20
-str = STR_CONFIG_SETTING_ERRMSG_DURATION
-strhelp = STR_CONFIG_SETTING_ERRMSG_DURATION_HELPTEXT
-strval = STR_CONFIG_SETTING_ERRMSG_DURATION_VALUE
-
-[SDTC_VAR]
-var = gui.hover_delay_ms
-type = SLE_UINT16
-flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC | SF_GUI_0_IS_SPECIAL
-def = 250
-min = 50
-max = 6000
-interval = 50
-str = STR_CONFIG_SETTING_HOVER_DELAY
-strhelp = STR_CONFIG_SETTING_HOVER_DELAY_HELPTEXT
-strval = STR_CONFIG_SETTING_HOVER_DELAY_VALUE
-
-[SDTC_OMANY]
-var = gui.osk_activation
-type = SLE_UINT8
-flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC
-str = STR_CONFIG_SETTING_OSK_ACTIVATION
-strhelp = STR_CONFIG_SETTING_OSK_ACTIVATION_HELPTEXT
-strval = STR_CONFIG_SETTING_OSK_ACTIVATION_DISABLED
-flags = SF_GUI_DROPDOWN
-full = _osk_activation
-def = 1
-min = 0
-max = 3
-cat = SC_BASIC
-
-[SDTC_VAR]
-var = gui.toolbar_pos
-type = SLE_UINT8
-flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC | SF_GUI_DROPDOWN
-def = 1
-min = 0
-max = 2
-str = STR_CONFIG_SETTING_TOOLBAR_POS
-strhelp = STR_CONFIG_SETTING_TOOLBAR_POS_HELPTEXT
-strval = STR_CONFIG_SETTING_HORIZONTAL_POS_LEFT
-post_cb = v_PositionMainToolbar
-cat = SC_BASIC
-
-[SDTC_VAR]
-var = gui.statusbar_pos
-type = SLE_UINT8
-flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC | SF_GUI_DROPDOWN
-def = 1
-min = 0
-max = 2
-str = STR_CONFIG_SETTING_STATUSBAR_POS
-strhelp = STR_CONFIG_SETTING_STATUSBAR_POS_HELPTEXT
-strval = STR_CONFIG_SETTING_HORIZONTAL_POS_LEFT
-post_cb = v_PositionStatusbar
-cat = SC_BASIC
-
-[SDTC_VAR]
-var = gui.window_snap_radius
-type = SLE_UINT8
-flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC | SF_GUI_0_IS_SPECIAL
-def = 10
-min = 1
-max = 32
-str = STR_CONFIG_SETTING_SNAP_RADIUS
-strhelp = STR_CONFIG_SETTING_SNAP_RADIUS_HELPTEXT
-strval = STR_CONFIG_SETTING_SNAP_RADIUS_VALUE
-cat = SC_EXPERT
-
-[SDTC_VAR]
-var = gui.window_soft_limit
-type = SLE_UINT8
-flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC | SF_GUI_0_IS_SPECIAL
-def = 20
-min = 5
-max = 255
-interval = 1
-str = STR_CONFIG_SETTING_SOFT_LIMIT
-strhelp = STR_CONFIG_SETTING_SOFT_LIMIT_HELPTEXT
-strval = STR_CONFIG_SETTING_SOFT_LIMIT_VALUE
-cat = SC_EXPERT
-
-[SDTC_VAR]
-var = gui.zoom_min
-type = SLE_UINT8
-flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC | SF_GUI_DROPDOWN
-def = ZOOM_LVL_MIN
-min = ZOOM_LVL_MIN
-max = ZOOM_LVL_OUT_4X
-str = STR_CONFIG_SETTING_ZOOM_MIN
-strhelp = STR_CONFIG_SETTING_ZOOM_MIN_HELPTEXT
-strval = STR_CONFIG_SETTING_ZOOM_LVL_MIN
-post_cb = ZoomMinMaxChanged
-startup = true
-
-[SDTC_VAR]
-var = gui.zoom_max
-type = SLE_UINT8
-flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC | SF_GUI_DROPDOWN
-def = ZOOM_LVL_MAX
-min = ZOOM_LVL_OUT_8X
-max = ZOOM_LVL_MAX
-str = STR_CONFIG_SETTING_ZOOM_MAX
-strhelp = STR_CONFIG_SETTING_ZOOM_MAX_HELPTEXT
-strval = STR_CONFIG_SETTING_ZOOM_LVL_OUT_2X
-post_cb = ZoomMinMaxChanged
-startup = true
-
-[SDTC_VAR]
-var = gui.sprite_zoom_min
-type = SLE_UINT8
-flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC | SF_GUI_DROPDOWN
-def = ZOOM_LVL_MIN
-min = ZOOM_LVL_MIN
-max = ZOOM_LVL_OUT_4X
-str = STR_CONFIG_SETTING_SPRITE_ZOOM_MIN
-strhelp = STR_CONFIG_SETTING_SPRITE_ZOOM_MIN_HELPTEXT
-strval = STR_CONFIG_SETTING_SPRITE_ZOOM_LVL_MIN
-post_cb = SpriteZoomMinChanged
-
-[SDTC_BOOL]
-var = gui.population_in_label
-flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC
-def = true
-str = STR_CONFIG_SETTING_POPULATION_IN_LABEL
-strhelp = STR_CONFIG_SETTING_POPULATION_IN_LABEL_HELPTEXT
-post_cb = [](auto) { UpdateAllTownVirtCoords(); }
-
-[SDTC_BOOL]
-var = gui.link_terraform_toolbar
-flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC
-def = false
-str = STR_CONFIG_SETTING_LINK_TERRAFORM_TOOLBAR
-strhelp = STR_CONFIG_SETTING_LINK_TERRAFORM_TOOLBAR_HELPTEXT
-
-[SDTC_VAR]
-var = gui.smallmap_land_colour
-type = SLE_UINT8
-flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC | SF_GUI_DROPDOWN
-def = 0
-min = 0
-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
-post_cb = RedrawSmallmap
-
-[SDTC_VAR]
-var = gui.liveries
-type = SLE_UINT8
-flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC | SF_GUI_DROPDOWN
-def = 2
-min = 0
-max = 2
-str = STR_CONFIG_SETTING_LIVERIES
-strhelp = STR_CONFIG_SETTING_LIVERIES_HELPTEXT
-strval = STR_CONFIG_SETTING_LIVERIES_NONE
-post_cb = InvalidateCompanyLiveryWindow
-
-[SDTC_VAR]
-var = gui.starting_colour
-type = SLE_UINT8
-flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC | SF_GUI_DROPDOWN
-def = COLOUR_END
-min = 0
-max = COLOUR_END
-str = STR_CONFIG_SETTING_COMPANY_STARTING_COLOUR
-strhelp = STR_CONFIG_SETTING_COMPANY_STARTING_COLOUR_HELPTEXT
-strval = STR_COLOUR_DARK_BLUE
-
-[SDTC_BOOL]
-var = gui.auto_remove_signals
-flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC
-def = false
-str = STR_CONFIG_SETTING_AUTO_REMOVE_SIGNALS
-strhelp = STR_CONFIG_SETTING_AUTO_REMOVE_SIGNALS_HELPTEXT
-cat = SC_ADVANCED
-
-[SDTC_BOOL]
-var = gui.prefer_teamchat
-flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC
-def = false
-str = STR_CONFIG_SETTING_PREFER_TEAMCHAT
-strhelp = STR_CONFIG_SETTING_PREFER_TEAMCHAT_HELPTEXT
-cat = SC_BASIC
-
-[SDTC_VAR]
-var = gui.scrollwheel_scrolling
-type = SLE_UINT8
-flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC | SF_GUI_DROPDOWN
-def = 0
-min = 0
-max = 2
-str = STR_CONFIG_SETTING_SCROLLWHEEL_SCROLLING
-strhelp = STR_CONFIG_SETTING_SCROLLWHEEL_SCROLLING_HELPTEXT
-strval = STR_CONFIG_SETTING_SCROLLWHEEL_ZOOM
-cat = SC_BASIC
-
-[SDTC_VAR]
-var = gui.scrollwheel_multiplier
-type = SLE_UINT8
-flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC
-def = 5
-min = 1
-max = 15
-interval = 1
-str = STR_CONFIG_SETTING_SCROLLWHEEL_MULTIPLIER
-strhelp = STR_CONFIG_SETTING_SCROLLWHEEL_MULTIPLIER_HELPTEXT
-strval = STR_JUST_COMMA
-cat = SC_BASIC
-
-[SDTC_BOOL]
-var = gui.pause_on_newgame
-flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC
-def = false
-str = STR_CONFIG_SETTING_PAUSE_ON_NEW_GAME
-strhelp = STR_CONFIG_SETTING_PAUSE_ON_NEW_GAME_HELPTEXT
-cat = SC_BASIC
-
-[SDTC_VAR]
-var = gui.advanced_vehicle_list
-type = SLE_UINT8
-flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC | SF_GUI_DROPDOWN
-def = 1
-min = 0
-max = 2
-str = STR_CONFIG_SETTING_ADVANCED_VEHICLE_LISTS
-strhelp = STR_CONFIG_SETTING_ADVANCED_VEHICLE_LISTS_HELPTEXT
-strval = STR_CONFIG_SETTING_COMPANIES_OFF
-
-[SDTC_BOOL]
-var = gui.timetable_in_ticks
-flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC
-def = false
-str = STR_CONFIG_SETTING_TIMETABLE_IN_TICKS
-strhelp = STR_CONFIG_SETTING_TIMETABLE_IN_TICKS_HELPTEXT
-post_cb = [](auto) { InvalidateWindowClassesData(WC_VEHICLE_TIMETABLE, VIWD_MODIFY_ORDERS); }
-cat = SC_EXPERT
-
-[SDTC_BOOL]
-var = gui.timetable_arrival_departure
-flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC
-def = true
-str = STR_CONFIG_SETTING_TIMETABLE_SHOW_ARRIVAL_DEPARTURE
-strhelp = STR_CONFIG_SETTING_TIMETABLE_SHOW_ARRIVAL_DEPARTURE_HELPTEXT
-post_cb = [](auto) { InvalidateWindowClassesData(WC_VEHICLE_TIMETABLE, VIWD_MODIFY_ORDERS); }
-
-[SDTC_BOOL]
-var = gui.quick_goto
-flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC
-def = true
-str = STR_CONFIG_SETTING_QUICKGOTO
-strhelp = STR_CONFIG_SETTING_QUICKGOTO_HELPTEXT
-cat = SC_BASIC
-
-[SDTC_VAR]
-var = gui.loading_indicators
-type = SLE_UINT8
-flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC | SF_GUI_DROPDOWN
-def = 1
-min = 0
-max = 2
-str = STR_CONFIG_SETTING_LOADING_INDICATORS
-strhelp = STR_CONFIG_SETTING_LOADING_INDICATORS_HELPTEXT
-strval = STR_CONFIG_SETTING_COMPANIES_OFF
-post_cb = [](auto) { MarkWholeScreenDirty(); }
-cat = SC_BASIC
-
-[SDTC_VAR]
-var = gui.default_rail_type
-type = SLE_UINT8
-flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC | SF_GUI_DROPDOWN
-def = 0
-min = 0
-max = 2
-str = STR_CONFIG_SETTING_DEFAULT_RAIL_TYPE
-strhelp = STR_CONFIG_SETTING_DEFAULT_RAIL_TYPE_HELPTEXT
-strval = STR_CONFIG_SETTING_DEFAULT_RAIL_TYPE_FIRST
-cat = SC_BASIC
-
-[SDTC_BOOL]
-var = gui.enable_signal_gui
-flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC
-def = true
-str = STR_CONFIG_SETTING_ENABLE_SIGNAL_GUI
-strhelp = STR_CONFIG_SETTING_ENABLE_SIGNAL_GUI_HELPTEXT
-post_cb = CloseSignalGUI
-cat = SC_EXPERT
-
-[SDTC_VAR]
-var = gui.coloured_news_year
-type = SLE_INT32
-flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC
-def = 2000
-min = MIN_YEAR
-max = MAX_YEAR
-interval = 1
-str = STR_CONFIG_SETTING_COLOURED_NEWS_YEAR
-strhelp = STR_CONFIG_SETTING_COLOURED_NEWS_YEAR_HELPTEXT
-strval = STR_JUST_INT
-cat = SC_EXPERT
-
-[SDTC_VAR]
-var = gui.drag_signals_density
-type = SLE_UINT8
-flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC
-def = 4
-min = 1
-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
-post_cb = [](auto) { InvalidateWindowData(WC_BUILD_SIGNAL, 0); }
-cat = SC_BASIC
-
-[SDTC_BOOL]
-var = gui.drag_signals_fixed_distance
-flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC
-def = false
-str = STR_CONFIG_SETTING_DRAG_SIGNALS_FIXED_DISTANCE
-strhelp = STR_CONFIG_SETTING_DRAG_SIGNALS_FIXED_DISTANCE_HELPTEXT
-cat = SC_EXPERT
-
-[SDTC_VAR]
-var = gui.semaphore_build_before
-type = SLE_INT32
-flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC
-def = 1950
-min = MIN_YEAR
-max = MAX_YEAR
-interval = 1
-str = STR_CONFIG_SETTING_SEMAPHORE_BUILD_BEFORE_DATE
-strhelp = STR_CONFIG_SETTING_SEMAPHORE_BUILD_BEFORE_DATE_HELPTEXT
-strval = STR_JUST_INT
-post_cb = ResetSignalVariant
-
-[SDTC_BOOL]
-var = gui.vehicle_income_warn
-flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC
-def = true
-str = STR_CONFIG_SETTING_WARN_INCOME_LESS
-strhelp = STR_CONFIG_SETTING_WARN_INCOME_LESS_HELPTEXT
-cat = SC_BASIC
-
-[SDTC_VAR]
-var = gui.order_review_system
-type = SLE_UINT8
-flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC | SF_GUI_DROPDOWN
-def = 2
-min = 0
-max = 2
-str = STR_CONFIG_SETTING_ORDER_REVIEW
-strhelp = STR_CONFIG_SETTING_ORDER_REVIEW_HELPTEXT
-strval = STR_CONFIG_SETTING_ORDER_REVIEW_OFF
-cat = SC_BASIC
-
-[SDTC_BOOL]
-var = gui.lost_vehicle_warn
-flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC
-def = true
-str = STR_CONFIG_SETTING_WARN_LOST_VEHICLE
-strhelp = STR_CONFIG_SETTING_WARN_LOST_VEHICLE_HELPTEXT
-
-[SDTC_BOOL]
-var = gui.new_nonstop
-flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC
-def = true
-str = STR_CONFIG_SETTING_NONSTOP_BY_DEFAULT
-strhelp = STR_CONFIG_SETTING_NONSTOP_BY_DEFAULT_HELPTEXT
-cat = SC_BASIC
-
-[SDTC_VAR]
-var = gui.stop_location
-type = SLE_UINT8
-flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC | SF_GUI_DROPDOWN
-def = 2
-min = 0
-max = 2
-interval = 1
-str = STR_CONFIG_SETTING_STOP_LOCATION
-strhelp = STR_CONFIG_SETTING_STOP_LOCATION_HELPTEXT
-strval = STR_CONFIG_SETTING_STOP_LOCATION_NEAR_END
-cat = SC_BASIC
-
-[SDTC_BOOL]
-var = gui.keep_all_autosave
-flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC
-def = false
-
-[SDTC_BOOL]
-var = gui.autosave_on_exit
-flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC
-def = false
-cat = SC_BASIC
-
-[SDTC_BOOL]
-var = gui.autosave_on_network_disconnect
-flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC
-def = true
-cat = SC_EXPERT
-
-[SDTC_VAR]
-var = gui.max_num_autosaves
-type = SLE_UINT8
-flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC
-def = 16
-min = 0
-max = 255
-
-[SDTC_BOOL]
-var = gui.auto_euro
-flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC
-def = true
-
-[SDTC_VAR]
-var = gui.news_message_timeout
-type = SLE_UINT8
-flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC
-def = 2
-min = 1
-max = 255
-
-[SDTC_BOOL]
-var = gui.show_track_reservation
-flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC
-def = true
-str = STR_CONFIG_SETTING_SHOW_TRACK_RESERVATION
-strhelp = STR_CONFIG_SETTING_SHOW_TRACK_RESERVATION_HELPTEXT
-post_cb = [](auto) { MarkWholeScreenDirty(); }
-cat = SC_BASIC
-
-[SDTC_VAR]
-var = gui.default_signal_type
-type = SLE_UINT8
-flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC | SF_GUI_DROPDOWN
-def = 1
-min = 0
-max = 2
-interval = 1
-str = STR_CONFIG_SETTING_DEFAULT_SIGNAL_TYPE
-strhelp = STR_CONFIG_SETTING_DEFAULT_SIGNAL_TYPE_HELPTEXT
-strval = STR_CONFIG_SETTING_DEFAULT_SIGNAL_NORMAL
-cat = SC_BASIC
-
-[SDTC_VAR]
-var = gui.cycle_signal_types
-type = SLE_UINT8
-flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC | SF_GUI_DROPDOWN
-def = 2
-min = 0
-max = 2
-interval = 1
-str = STR_CONFIG_SETTING_CYCLE_SIGNAL_TYPES
-strhelp = STR_CONFIG_SETTING_CYCLE_SIGNAL_TYPES_HELPTEXT
-strval = STR_CONFIG_SETTING_CYCLE_SIGNAL_NORMAL
-
-[SDTC_VAR]
-var = gui.station_numtracks
-type = SLE_UINT8
-flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC
-def = 1
-min = 1
-max = 7
-
-[SDTC_VAR]
-var = gui.station_platlength
-type = SLE_UINT8
-flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC
-def = 5
-min = 1
-max = 7
-cat = SC_BASIC
-
-[SDTC_BOOL]
-var = gui.station_dragdrop
-flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC
-def = true
-cat = SC_BASIC
-
-[SDTC_BOOL]
-var = gui.station_show_coverage
-flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC
-def = false
-cat = SC_BASIC
-
-[SDTC_BOOL]
-var = gui.persistent_buildingtools
-flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC
-def = true
-str = STR_CONFIG_SETTING_PERSISTENT_BUILDINGTOOLS
-strhelp = STR_CONFIG_SETTING_PERSISTENT_BUILDINGTOOLS_HELPTEXT
-cat = SC_BASIC
-
-[SDTC_BOOL]
-var = gui.expenses_layout
-flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC
-def = true
-str = STR_CONFIG_SETTING_EXPENSES_LAYOUT
-strhelp = STR_CONFIG_SETTING_EXPENSES_LAYOUT_HELPTEXT
-post_cb = [](auto) { MarkWholeScreenDirty(); }
-
-[SDTC_VAR]
-var = gui.station_gui_group_order
-type = SLE_UINT8
-flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC
-def = 0
-min = 0
-max = 5
-interval = 1
-
-[SDTC_VAR]
-var = gui.station_gui_sort_by
-type = SLE_UINT8
-flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC
-def = 0
-min = 0
-max = 3
-interval = 1
-
-[SDTC_VAR]
-var = gui.station_gui_sort_order
-type = SLE_UINT8
-flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC
-def = 0
-min = 0
-max = 1
-interval = 1
-
-[SDTC_VAR]
-var = gui.missing_strings_threshold
-type = SLE_UINT8
-flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC
-def = 25
-min = 1
-max = UINT8_MAX
-cat = SC_EXPERT
-
-[SDTC_VAR]
-var = gui.graph_line_thickness
-type = SLE_UINT8
-flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC
-def = 3
-min = 1
-max = 5
-str = STR_CONFIG_SETTING_GRAPH_LINE_THICKNESS
-strhelp = STR_CONFIG_SETTING_GRAPH_LINE_THICKNESS_HELPTEXT
-strval = STR_JUST_COMMA
-post_cb = [](auto) { MarkWholeScreenDirty(); }
-
-[SDTC_BOOL]
-var = gui.show_newgrf_name
-flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC
-def = false
-str = STR_CONFIG_SETTING_SHOW_NEWGRF_NAME
-strhelp = STR_CONFIG_SETTING_SHOW_NEWGRF_NAME_HELPTEXT
-post_cb = [](auto) { MarkWholeScreenDirty(); }
-cat = SC_ADVANCED
-
-; For the dedicated build we'll enable dates in logs by default.
-[SDTC_BOOL]
-ifdef = DEDICATED
-var = gui.show_date_in_logs
-flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC
-def = true
-
-[SDTC_BOOL]
-ifndef = DEDICATED
-var = gui.show_date_in_logs
-flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC
-def = false
-
-[SDTC_VAR]
-var = gui.settings_restriction_mode
-type = SLE_UINT8
-flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC
-def = 0
-min = 0
-max = 2
-
-[SDTC_VAR]
-var = gui.developer
-type = SLE_UINT8
-flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC
-def = 1
-min = 0
-max = 2
-cat = SC_EXPERT
-
-[SDTC_BOOL]
-var = gui.newgrf_developer_tools
-flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC
-def = false
-post_cb = InvalidateNewGRFChangeWindows
-cat = SC_EXPERT
-
-[SDTC_BOOL]
-var = gui.ai_developer_tools
-flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC
-def = false
-post_cb = [](auto) { InvalidateWindowClassesData(WC_AI_SETTINGS); }
-cat = SC_EXPERT
-
-[SDTC_BOOL]
-var = gui.scenario_developer
-flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC
-def = false
-post_cb = InvalidateNewGRFChangeWindows
-
-[SDTC_BOOL]
-var = gui.newgrf_show_old_versions
-flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC
-def = false
-cat = SC_EXPERT
-
-[SDTC_VAR]
-var = gui.newgrf_default_palette
-type = SLE_UINT8
-flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC | SF_GUI_DROPDOWN
-def = 1
-min = 0
-max = 1
-post_cb = UpdateNewGRFConfigPalette
-cat = SC_EXPERT
-
-[SDTC_VAR]
-var = gui.console_backlog_timeout
-type = SLE_UINT16
-flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC
-def = 100
-min = 10
-max = 65500
-
-[SDTC_VAR]
-var = gui.console_backlog_length
-type = SLE_UINT16
-flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC
-def = 100
-min = 10
-max = 65500
-
-[SDTC_VAR]
-var = gui.refresh_rate
-type = SLE_UINT16
-flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC
-def = 60
-min = 10
-max = 1000
-cat = SC_EXPERT
-startup = true
-
-[SDTC_VAR]
-var = gui.fast_forward_speed_limit
-type = SLE_UINT16
-flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC | SF_GUI_0_IS_SPECIAL | SF_NO_NETWORK
-def = 2500
-min = 0
-max = 50000
-interval = 10
-str = STR_CONFIG_SETTING_FAST_FORWARD_SPEED_LIMIT
-strhelp = STR_CONFIG_SETTING_FAST_FORWARD_SPEED_LIMIT_HELPTEXT
-strval = STR_CONFIG_SETTING_FAST_FORWARD_SPEED_LIMIT_VAL
-cat = SC_BASIC
-
-[SDTC_BOOL]
-var = sound.news_ticker
-flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC
-def = true
-str = STR_CONFIG_SETTING_SOUND_TICKER
-strhelp = STR_CONFIG_SETTING_SOUND_TICKER_HELPTEXT
-
-[SDTC_BOOL]
-var = sound.news_full
-flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC
-def = true
-str = STR_CONFIG_SETTING_SOUND_NEWS
-strhelp = STR_CONFIG_SETTING_SOUND_NEWS_HELPTEXT
-
-[SDTC_BOOL]
-var = sound.new_year
-flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC
-def = true
-str = STR_CONFIG_SETTING_SOUND_NEW_YEAR
-strhelp = STR_CONFIG_SETTING_SOUND_NEW_YEAR_HELPTEXT
-
-[SDTC_BOOL]
-var = sound.confirm
-flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC
-def = true
-str = STR_CONFIG_SETTING_SOUND_CONFIRM
-strhelp = STR_CONFIG_SETTING_SOUND_CONFIRM_HELPTEXT
-
-[SDTC_BOOL]
-var = sound.click_beep
-flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC
-def = true
-str = STR_CONFIG_SETTING_SOUND_CLICK
-strhelp = STR_CONFIG_SETTING_SOUND_CLICK_HELPTEXT
-
-[SDTC_BOOL]
-var = sound.disaster
-flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC
-def = true
-str = STR_CONFIG_SETTING_SOUND_DISASTER
-strhelp = STR_CONFIG_SETTING_SOUND_DISASTER_HELPTEXT
-
-[SDTC_BOOL]
-var = sound.vehicle
-flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC
-def = true
-str = STR_CONFIG_SETTING_SOUND_VEHICLE
-strhelp = STR_CONFIG_SETTING_SOUND_VEHICLE_HELPTEXT
-
-[SDTC_BOOL]
-var = sound.ambient
-flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC
-def = true
-str = STR_CONFIG_SETTING_SOUND_AMBIENT
-strhelp = STR_CONFIG_SETTING_SOUND_AMBIENT_HELPTEXT
-
-[SDTC_VAR]
-var = music.playlist
-type = SLE_UINT8
-flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC
-def = 0
-min = 0
-max = 5
-interval = 1
-cat = SC_BASIC
-
-[SDTC_VAR]
-var = music.music_vol
-type = SLE_UINT8
-flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC
-def = 50
-min = 0
-max = 127
-interval = 1
-cat = SC_BASIC
-
-[SDTC_VAR]
-var = music.effect_vol
-type = SLE_UINT8
-flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC
-def = 100
-min = 0
-max = 127
-interval = 1
-cat = SC_BASIC
-
-[SDTC_LIST]
-var = music.custom_1
-type = SLE_UINT8
-flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC
-def = nullptr
-cat = SC_BASIC
-
-[SDTC_LIST]
-var = music.custom_2
-type = SLE_UINT8
-flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC
-def = nullptr
-cat = SC_BASIC
-
-[SDTC_BOOL]
-var = music.playing
-flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC
-def = true
-cat = SC_BASIC
-
-[SDTC_BOOL]
-var = music.shuffle
-flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC
-def = false
-cat = SC_BASIC
-
-[SDTC_OMANY]
-var = news_display.arrival_player
-type = SLE_UINT8
-flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC | SF_GUI_DROPDOWN
-def = 2
-max = 2
-full = _news_display
-str = STR_CONFIG_SETTING_NEWS_ARRIVAL_FIRST_VEHICLE_OWN
-strhelp = STR_CONFIG_SETTING_NEWS_ARRIVAL_FIRST_VEHICLE_OWN_HELPTEXT
-strval = STR_CONFIG_SETTING_NEWS_MESSAGES_OFF
-
-[SDTC_OMANY]
-var = news_display.arrival_other
-type = SLE_UINT8
-flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC | SF_GUI_DROPDOWN
-def = 1
-max = 2
-full = _news_display
-str = STR_CONFIG_SETTING_NEWS_ARRIVAL_FIRST_VEHICLE_OTHER
-strhelp = STR_CONFIG_SETTING_NEWS_ARRIVAL_FIRST_VEHICLE_OTHER_HELPTEXT
-strval = STR_CONFIG_SETTING_NEWS_MESSAGES_OFF
-
-[SDTC_OMANY]
-var = news_display.accident
-type = SLE_UINT8
-flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC | SF_GUI_DROPDOWN
-def = 2
-max = 2
-full = _news_display
-str = STR_CONFIG_SETTING_NEWS_ACCIDENTS_DISASTERS
-strhelp = STR_CONFIG_SETTING_NEWS_ACCIDENTS_DISASTERS_HELPTEXT
-strval = STR_CONFIG_SETTING_NEWS_MESSAGES_OFF
-
-[SDTC_OMANY]
-var = news_display.company_info
-type = SLE_UINT8
-flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC | SF_GUI_DROPDOWN
-def = 2
-max = 2
-full = _news_display
-str = STR_CONFIG_SETTING_NEWS_COMPANY_INFORMATION
-strhelp = STR_CONFIG_SETTING_NEWS_COMPANY_INFORMATION_HELPTEXT
-strval = STR_CONFIG_SETTING_NEWS_MESSAGES_OFF
-
-[SDTC_OMANY]
-var = news_display.open
-type = SLE_UINT8
-flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC | SF_GUI_DROPDOWN
-def = 1
-max = 2
-full = _news_display
-str = STR_CONFIG_SETTING_NEWS_INDUSTRY_OPEN
-strhelp = STR_CONFIG_SETTING_NEWS_INDUSTRY_OPEN_HELPTEXT
-strval = STR_CONFIG_SETTING_NEWS_MESSAGES_OFF
-
-[SDTC_OMANY]
-var = news_display.close
-type = SLE_UINT8
-flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC | SF_GUI_DROPDOWN
-def = 1
-max = 2
-full = _news_display
-str = STR_CONFIG_SETTING_NEWS_INDUSTRY_CLOSE
-strhelp = STR_CONFIG_SETTING_NEWS_INDUSTRY_CLOSE_HELPTEXT
-strval = STR_CONFIG_SETTING_NEWS_MESSAGES_OFF
-
-[SDTC_OMANY]
-var = news_display.economy
-type = SLE_UINT8
-flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC | SF_GUI_DROPDOWN
-def = 2
-max = 2
-full = _news_display
-str = STR_CONFIG_SETTING_NEWS_ECONOMY_CHANGES
-strhelp = STR_CONFIG_SETTING_NEWS_ECONOMY_CHANGES_HELPTEXT
-strval = STR_CONFIG_SETTING_NEWS_MESSAGES_OFF
-
-[SDTC_OMANY]
-var = news_display.production_player
-type = SLE_UINT8
-flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC | SF_GUI_DROPDOWN
-def = 1
-max = 2
-full = _news_display
-str = STR_CONFIG_SETTING_NEWS_INDUSTRY_CHANGES_COMPANY
-strhelp = STR_CONFIG_SETTING_NEWS_INDUSTRY_CHANGES_COMPANY_HELPTEXT
-strval = STR_CONFIG_SETTING_NEWS_MESSAGES_OFF
-
-[SDTC_OMANY]
-var = news_display.production_other
-type = SLE_UINT8
-flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC | SF_GUI_DROPDOWN
-def = 0
-max = 2
-full = _news_display
-str = STR_CONFIG_SETTING_NEWS_INDUSTRY_CHANGES_OTHER
-strhelp = STR_CONFIG_SETTING_NEWS_INDUSTRY_CHANGES_OTHER_HELPTEXT
-strval = STR_CONFIG_SETTING_NEWS_MESSAGES_OFF
-
-[SDTC_OMANY]
-var = news_display.production_nobody
-type = SLE_UINT8
-flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC | SF_GUI_DROPDOWN
-def = 0
-max = 2
-full = _news_display
-str = STR_CONFIG_SETTING_NEWS_INDUSTRY_CHANGES_UNSERVED
-strhelp = STR_CONFIG_SETTING_NEWS_INDUSTRY_CHANGES_UNSERVED_HELPTEXT
-strval = STR_CONFIG_SETTING_NEWS_MESSAGES_OFF
-
-[SDTC_OMANY]
-var = news_display.advice
-type = SLE_UINT8
-flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC | SF_GUI_DROPDOWN
-def = 2
-max = 2
-full = _news_display
-str = STR_CONFIG_SETTING_NEWS_ADVICE
-strhelp = STR_CONFIG_SETTING_NEWS_ADVICE_HELPTEXT
-strval = STR_CONFIG_SETTING_NEWS_MESSAGES_OFF
-
-[SDTC_OMANY]
-var = news_display.new_vehicles
-type = SLE_UINT8
-flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC | SF_GUI_DROPDOWN
-def = 2
-max = 2
-full = _news_display
-str = STR_CONFIG_SETTING_NEWS_NEW_VEHICLES
-strhelp = STR_CONFIG_SETTING_NEWS_NEW_VEHICLES_HELPTEXT
-strval = STR_CONFIG_SETTING_NEWS_MESSAGES_OFF
-
-[SDTC_OMANY]
-var = news_display.acceptance
-type = SLE_UINT8
-flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC | SF_GUI_DROPDOWN
-def = 2
-max = 2
-full = _news_display
-str = STR_CONFIG_SETTING_NEWS_CHANGES_ACCEPTANCE
-strhelp = STR_CONFIG_SETTING_NEWS_CHANGES_ACCEPTANCE_HELPTEXT
-strval = STR_CONFIG_SETTING_NEWS_MESSAGES_OFF
-
-[SDTC_OMANY]
-var = news_display.subsidies
-type = SLE_UINT8
-flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC | SF_GUI_DROPDOWN
-def = 1
-max = 2
-full = _news_display
-str = STR_CONFIG_SETTING_NEWS_SUBSIDIES
-strhelp = STR_CONFIG_SETTING_NEWS_SUBSIDIES_HELPTEXT
-strval = STR_CONFIG_SETTING_NEWS_MESSAGES_OFF
-
-[SDTC_OMANY]
-var = news_display.general
-type = SLE_UINT8
-flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC | SF_GUI_DROPDOWN
-def = 2
-max = 2
-full = _news_display
-str = STR_CONFIG_SETTING_NEWS_GENERAL_INFORMATION
-strhelp = STR_CONFIG_SETTING_NEWS_GENERAL_INFORMATION_HELPTEXT
-strval = STR_CONFIG_SETTING_NEWS_MESSAGES_OFF
-
-[SDTC_VAR]
-var = gui.network_chat_box_width_pct
-type = SLE_UINT16
-flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC
-def = 40
-min = 10
-max = 100
-cat = SC_EXPERT
-
-[SDTC_VAR]
-var = gui.network_chat_box_height
-type = SLE_UINT8
-flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC
-def = 25
-min = 5
-max = 255
-cat = SC_EXPERT
-
-[SDTC_VAR]
-var = gui.network_chat_timeout
-type = SLE_UINT16
-flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC
-def = 20
-min = 1
-max = 65535
-cat = SC_EXPERT
diff --git a/src/table/settings/world_settings.ini b/src/table/settings/world_settings.ini
new file mode 100644
index 000000000..5912f89f4
--- /dev/null
+++ b/src/table/settings/world_settings.ini
@@ -0,0 +1,545 @@
+; This file is part of OpenTTD.
+; OpenTTD is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2.
+; OpenTTD is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+; See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with OpenTTD. If not, see <http://www.gnu.org/licenses/>.
+;
+
+; World settings as stored in the main configuration file ("openttd.cfg")
+; and in the savegame PATS chunk.
+; World settings are everything related to how the world came to be, so
+; basically construction and game_creation settings.
+
+[pre-amble]
+static bool CheckMaxHeightLevel(int32 &new_value);
+static bool CheckFreeformEdges(int32 &new_value);
+static void UpdateFreeformEdges(int32 new_value);
+
+static const SettingVariant _world_settings_table[] = {
+[post-amble]
+};
+[templates]
+SDT_BOOL = SDT_BOOL(GameSettings, $var, $flags, $def, $str, $strhelp, $strval, $pre_cb, $post_cb, $from, $to, $cat, $extra, $startup),
+SDT_OMANY = SDT_OMANY(GameSettings, $var, $type, $flags, $def, $max, $full, $str, $strhelp, $strval, $pre_cb, $post_cb, $from, $to, $load, $cat, $extra, $startup),
+SDT_VAR = SDT_VAR(GameSettings, $var, $type, $flags, $def, $min, $max, $interval, $str, $strhelp, $strval, $pre_cb, $post_cb, $from, $to, $cat, $extra, $startup),
+
+[validation]
+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 = SF_NONE
+interval = 0
+str = STR_NULL
+strhelp = STR_CONFIG_SETTING_NO_EXPLANATION_AVAILABLE_HELPTEXT
+strval = STR_NULL
+pre_cb = nullptr
+post_cb = nullptr
+load = nullptr
+from = SL_MIN_VERSION
+to = SL_MAX_VERSION
+cat = SC_ADVANCED
+extra = 0
+startup = false
+
+
+; 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]
+var = game_creation.town_name
+type = SLE_UINT8
+from = SLV_97
+flags = SF_NO_NETWORK
+def = 0
+max = 255
+full = _town_names
+cat = SC_BASIC
+
+[SDT_OMANY]
+var = game_creation.landscape
+type = SLE_UINT8
+from = SLV_97
+flags = SF_GUI_DROPDOWN | SF_NEWGAME_ONLY
+def = 0
+max = 3
+full = _climates
+load = ConvertLandscape
+str = STR_CONFIG_SETTING_LANDSCAPE
+strhelp = STR_CONFIG_SETTING_LANDSCAPE_HELPTEXT
+strval = STR_CHEAT_SWITCH_CLIMATE_TEMPERATE_LANDSCAPE
+cat = SC_BASIC
+
+[SDT_VAR]
+var = game_creation.heightmap_height
+type = SLE_UINT8
+from = SLV_MAPGEN_SETTINGS_REVAMP
+flags = SF_NEWGAME_ONLY
+def = MAP_HEIGHT_LIMIT_AUTO_MINIMUM
+min = MIN_HEIGHTMAP_HEIGHT
+max = MAX_MAP_HEIGHT_LIMIT
+interval = 1
+
+[SDT_VAR]
+var = game_creation.snow_line_height
+type = SLE_UINT8
+flags = SF_SCENEDIT_ONLY
+def = DEF_SNOWLINE_HEIGHT
+min = MIN_SNOWLINE_HEIGHT
+max = MAX_SNOWLINE_HEIGHT
+interval = 1
+str = STR_CONFIG_SETTING_SNOWLINE_HEIGHT
+strhelp = STR_CONFIG_SETTING_SNOWLINE_HEIGHT_HELPTEXT
+strval = STR_JUST_COMMA
+cat = SC_BASIC
+
+[SDT_VAR]
+var = game_creation.snow_coverage
+type = SLE_UINT8
+from = SLV_MAPGEN_SETTINGS_REVAMP
+flags = SF_NEWGAME_ONLY
+def = DEF_SNOW_COVERAGE
+min = 0
+max = 100
+interval = 10
+str = STR_CONFIG_SETTING_SNOW_COVERAGE
+strhelp = STR_CONFIG_SETTING_SNOW_COVERAGE_HELPTEXT
+strval = STR_CONFIG_SETTING_SNOW_COVERAGE_VALUE
+cat = SC_BASIC
+
+[SDT_VAR]
+var = game_creation.desert_coverage
+type = SLE_UINT8
+from = SLV_MAPGEN_SETTINGS_REVAMP
+flags = SF_NEWGAME_ONLY
+def = DEF_DESERT_COVERAGE
+min = 0
+max = 100
+interval = 10
+str = STR_CONFIG_SETTING_DESERT_COVERAGE
+strhelp = STR_CONFIG_SETTING_DESERT_COVERAGE_HELPTEXT
+strval = STR_CONFIG_SETTING_DESERT_COVERAGE_VALUE
+cat = SC_BASIC
+
+[SDT_VAR]
+var = game_creation.starting_year
+type = SLE_INT32
+def = DEF_START_YEAR
+min = MIN_YEAR
+max = MAX_YEAR
+interval = 1
+str = STR_CONFIG_SETTING_STARTING_YEAR
+strval = STR_JUST_INT
+cat = SC_BASIC
+
+[SDT_VAR]
+var = game_creation.ending_year
+type = SLE_INT32
+from = SLV_ENDING_YEAR
+flags = SF_GUI_0_IS_SPECIAL
+def = DEF_END_YEAR
+min = MIN_YEAR
+max = MAX_YEAR - 1
+interval = 1
+str = STR_CONFIG_SETTING_ENDING_YEAR
+strhelp = STR_CONFIG_SETTING_ENDING_YEAR_HELPTEXT
+strval = STR_CONFIG_SETTING_ENDING_YEAR_VALUE
+cat = SC_ADVANCED
+
+[SDT_VAR]
+var = game_creation.land_generator
+type = SLE_UINT8
+from = SLV_30
+flags = SF_GUI_DROPDOWN | SF_NEWGAME_ONLY
+def = 1
+min = 0
+max = 1
+str = STR_CONFIG_SETTING_LAND_GENERATOR
+strhelp = STR_CONFIG_SETTING_LAND_GENERATOR_HELPTEXT
+strval = STR_CONFIG_SETTING_LAND_GENERATOR_ORIGINAL
+
+[SDT_VAR]
+var = game_creation.oil_refinery_limit
+type = SLE_UINT8
+from = SLV_30
+def = 32
+min = 12
+max = 128
+str = STR_CONFIG_SETTING_OIL_REF_EDGE_DISTANCE
+strval = STR_CONFIG_SETTING_TILE_LENGTH
+strhelp = STR_CONFIG_SETTING_OIL_REF_EDGE_DISTANCE_HELPTEXT
+
+[SDT_VAR]
+var = game_creation.tgen_smoothness
+type = SLE_UINT8
+from = SLV_30
+flags = SF_GUI_DROPDOWN | SF_NEWGAME_ONLY
+def = 1
+min = TGEN_SMOOTHNESS_BEGIN
+max = TGEN_SMOOTHNESS_END - 1
+str = STR_CONFIG_SETTING_ROUGHNESS_OF_TERRAIN
+strhelp = STR_CONFIG_SETTING_ROUGHNESS_OF_TERRAIN_HELPTEXT
+strval = STR_CONFIG_SETTING_ROUGHNESS_OF_TERRAIN_VERY_SMOOTH
+cat = SC_BASIC
+
+[SDT_VAR]
+var = game_creation.variety
+type = SLE_UINT8
+from = SLV_197
+flags = SF_GUI_DROPDOWN | SF_NEWGAME_ONLY
+def = 0
+min = 0
+max = 5
+str = STR_CONFIG_SETTING_VARIETY
+strhelp = STR_CONFIG_SETTING_VARIETY_HELPTEXT
+strval = STR_VARIETY_NONE
+
+[SDT_VAR]
+var = game_creation.generation_seed
+type = SLE_UINT32
+from = SLV_30
+def = GENERATE_NEW_SEED
+min = 0
+max = UINT32_MAX
+cat = SC_EXPERT
+
+[SDT_VAR]
+var = game_creation.tree_placer
+type = SLE_UINT8
+from = SLV_30
+flags = SF_GUI_DROPDOWN | SF_NEWGAME_ONLY | SF_SCENEDIT_TOO
+def = 2
+min = 0
+max = 2
+str = STR_CONFIG_SETTING_TREE_PLACER
+strhelp = STR_CONFIG_SETTING_TREE_PLACER_HELPTEXT
+strval = STR_CONFIG_SETTING_TREE_PLACER_NONE
+cat = SC_BASIC
+
+[SDT_VAR]
+var = game_creation.heightmap_rotation
+type = SLE_UINT8
+flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC | SF_GUI_DROPDOWN
+def = 0
+min = 0
+max = 1
+str = STR_CONFIG_SETTING_HEIGHTMAP_ROTATION
+strval = STR_CONFIG_SETTING_HEIGHTMAP_ROTATION_COUNTER_CLOCKWISE
+cat = SC_BASIC
+
+[SDT_VAR]
+var = game_creation.se_flat_world_height
+type = SLE_UINT8
+flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC
+def = 1
+min = 0
+max = 15
+str = STR_CONFIG_SETTING_SE_FLAT_WORLD_HEIGHT
+strval = STR_JUST_COMMA
+cat = SC_BASIC
+
+[SDT_VAR]
+var = game_creation.map_x
+type = SLE_UINT8
+flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC
+def = 8
+min = MIN_MAP_SIZE_BITS
+max = MAX_MAP_SIZE_BITS
+cat = SC_BASIC
+
+[SDT_VAR]
+var = game_creation.map_y
+type = SLE_UINT8
+flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC
+def = 8
+min = MIN_MAP_SIZE_BITS
+max = MAX_MAP_SIZE_BITS
+cat = SC_BASIC
+
+[SDT_VAR]
+var = game_creation.water_borders
+type = SLE_UINT8
+from = SLV_111
+def = 15
+min = 0
+max = 16
+
+[SDT_VAR]
+var = game_creation.custom_town_number
+type = SLE_UINT16
+from = SLV_115
+def = 1
+min = 1
+max = 5000
+cat = SC_BASIC
+
+[SDT_VAR]
+var = game_creation.custom_terrain_type
+type = SLE_UINT8
+from = SLV_MAPGEN_SETTINGS_REVAMP
+flags = SF_NEWGAME_ONLY
+def = MAP_HEIGHT_LIMIT_AUTO_MINIMUM
+min = MIN_CUSTOM_TERRAIN_TYPE
+max = MAX_MAP_HEIGHT_LIMIT
+interval = 1
+
+[SDT_VAR]
+var = game_creation.custom_sea_level
+type = SLE_UINT8
+from = SLV_149
+def = CUSTOM_SEA_LEVEL_MIN_PERCENTAGE
+min = CUSTOM_SEA_LEVEL_MIN_PERCENTAGE
+max = CUSTOM_SEA_LEVEL_MAX_PERCENTAGE
+cat = SC_BASIC
+
+[SDT_VAR]
+var = game_creation.min_river_length
+type = SLE_UINT8
+from = SLV_163
+def = 16
+min = 2
+max = 255
+cat = SC_EXPERT
+
+[SDT_VAR]
+var = game_creation.river_route_random
+type = SLE_UINT8
+from = SLV_163
+def = 5
+min = 1
+max = 255
+cat = SC_EXPERT
+
+[SDT_VAR]
+var = game_creation.amount_of_rivers
+type = SLE_UINT8
+from = SLV_163
+flags = SF_GUI_DROPDOWN | SF_NEWGAME_ONLY
+def = 2
+min = 0
+max = 3
+str = STR_CONFIG_SETTING_RIVER_AMOUNT
+strhelp = STR_CONFIG_SETTING_RIVER_AMOUNT_HELPTEXT
+strval = STR_RIVERS_NONE
+
+[SDT_VAR]
+var = construction.map_height_limit
+type = SLE_UINT8
+from = SLV_194
+flags = SF_NEWGAME_ONLY | SF_SCENEDIT_TOO | SF_GUI_0_IS_SPECIAL
+def = 0
+min = MIN_MAP_HEIGHT_LIMIT
+max = MAX_MAP_HEIGHT_LIMIT
+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
+pre_cb = CheckMaxHeightLevel
+post_cb = [](auto) { InvalidateWindowClassesData(WC_SMALLMAP, 2); }
+cat = SC_ADVANCED
+
+[SDT_BOOL]
+var = construction.build_on_slopes
+flags = SF_NO_NETWORK
+def = true
+cat = SC_EXPERT
+
+[SDT_VAR]
+var = construction.command_pause_level
+type = SLE_UINT8
+from = SLV_154
+flags = SF_GUI_DROPDOWN | SF_NO_NETWORK
+def = 1
+min = 0
+max = 3
+interval = 1
+str = STR_CONFIG_SETTING_COMMAND_PAUSE_LEVEL
+strhelp = STR_CONFIG_SETTING_COMMAND_PAUSE_LEVEL_HELPTEXT
+strval = STR_CONFIG_SETTING_COMMAND_PAUSE_LEVEL_NO_ACTIONS
+
+[SDT_VAR]
+var = construction.terraform_per_64k_frames
+type = SLE_UINT32
+from = SLV_156
+def = 64 << 16
+min = 0
+max = 1 << 30
+interval = 1
+cat = SC_EXPERT
+
+[SDT_VAR]
+var = construction.terraform_frame_burst
+type = SLE_UINT16
+from = SLV_156
+def = 4096
+min = 0
+max = 1 << 15
+interval = 1
+cat = SC_EXPERT
+
+[SDT_VAR]
+var = construction.clear_per_64k_frames
+type = SLE_UINT32
+from = SLV_156
+def = 64 << 16
+min = 0
+max = 1 << 30
+interval = 1
+cat = SC_EXPERT
+
+[SDT_VAR]
+var = construction.clear_frame_burst
+type = SLE_UINT16
+from = SLV_156
+def = 4096
+min = 0
+max = 1 << 15
+interval = 1
+cat = SC_EXPERT
+
+[SDT_VAR]
+var = construction.tree_per_64k_frames
+type = SLE_UINT32
+from = SLV_175
+def = 64 << 16
+min = 0
+max = 1 << 30
+interval = 1
+cat = SC_EXPERT
+
+[SDT_VAR]
+var = construction.tree_frame_burst
+type = SLE_UINT16
+from = SLV_175
+def = 4096
+min = 0
+max = 1 << 15
+interval = 1
+cat = SC_EXPERT
+
+[SDT_BOOL]
+var = construction.autoslope
+from = SLV_75
+def = true
+str = STR_CONFIG_SETTING_AUTOSLOPE
+strhelp = STR_CONFIG_SETTING_AUTOSLOPE_HELPTEXT
+cat = SC_EXPERT
+
+[SDT_BOOL]
+var = construction.extra_dynamite
+def = true
+str = STR_CONFIG_SETTING_EXTRADYNAMITE
+strhelp = STR_CONFIG_SETTING_EXTRADYNAMITE_HELPTEXT
+
+[SDT_VAR]
+var = construction.max_bridge_length
+type = SLE_UINT16
+from = SLV_159
+flags = SF_NO_NETWORK
+def = 64
+min = 1
+max = MAX_MAP_SIZE
+interval = 1
+str = STR_CONFIG_SETTING_MAX_BRIDGE_LENGTH
+strhelp = STR_CONFIG_SETTING_MAX_BRIDGE_LENGTH_HELPTEXT
+strval = STR_CONFIG_SETTING_TILE_LENGTH
+
+[SDT_VAR]
+var = construction.max_bridge_height
+type = SLE_UINT8
+from = SLV_194
+flags = SF_NO_NETWORK
+def = 12
+min = 1
+max = MAX_TILE_HEIGHT
+interval = 1
+str = STR_CONFIG_SETTING_MAX_BRIDGE_HEIGHT
+strhelp = STR_CONFIG_SETTING_MAX_BRIDGE_HEIGHT_HELPTEXT
+strval = STR_JUST_COMMA
+cat = SC_EXPERT
+
+[SDT_VAR]
+var = construction.max_tunnel_length
+type = SLE_UINT16
+from = SLV_159
+flags = SF_NO_NETWORK
+def = 64
+min = 1
+max = MAX_MAP_SIZE
+interval = 1
+str = STR_CONFIG_SETTING_MAX_TUNNEL_LENGTH
+strhelp = STR_CONFIG_SETTING_MAX_TUNNEL_LENGTH_HELPTEXT
+strval = STR_CONFIG_SETTING_TILE_LENGTH
+
+[SDT_VAR]
+var = construction.train_signal_side
+type = SLE_UINT8
+flags = SF_GUI_DROPDOWN | SF_NO_NETWORK
+def = 1
+min = 0
+max = 2
+str = STR_CONFIG_SETTING_SIGNALSIDE
+strhelp = STR_CONFIG_SETTING_SIGNALSIDE_HELPTEXT
+strval = STR_CONFIG_SETTING_SIGNALSIDE_LEFT
+post_cb = [](auto) { MarkWholeScreenDirty(); }
+cat = SC_BASIC
+
+[SDT_BOOL]
+var = construction.road_stop_on_town_road
+from = SLV_47
+def = true
+str = STR_CONFIG_SETTING_STOP_ON_TOWN_ROAD
+strhelp = STR_CONFIG_SETTING_STOP_ON_TOWN_ROAD_HELPTEXT
+cat = SC_BASIC
+
+[SDT_BOOL]
+var = construction.road_stop_on_competitor_road
+from = SLV_114
+def = true
+str = STR_CONFIG_SETTING_STOP_ON_COMPETITOR_ROAD
+strhelp = STR_CONFIG_SETTING_STOP_ON_COMPETITOR_ROAD_HELPTEXT
+cat = SC_BASIC
+
+[SDT_VAR]
+var = construction.raw_industry_construction
+type = SLE_UINT8
+flags = SF_GUI_DROPDOWN
+def = 0
+min = 0
+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
+post_cb = [](auto) { InvalidateWindowData(WC_BUILD_INDUSTRY, 0); }
+cat = SC_BASIC
+
+[SDT_VAR]
+var = construction.industry_platform
+type = SLE_UINT8
+from = SLV_148
+def = 1
+min = 0
+max = 4
+str = STR_CONFIG_SETTING_INDUSTRY_PLATFORM
+strhelp = STR_CONFIG_SETTING_INDUSTRY_PLATFORM_HELPTEXT
+strval = STR_CONFIG_SETTING_TILE_LENGTH
+cat = SC_EXPERT
+
+[SDT_BOOL]
+var = construction.freeform_edges
+from = SLV_111
+def = true
+pre_cb = CheckFreeformEdges
+post_cb = UpdateFreeformEdges
+cat = SC_EXPERT
+
+[SDT_VAR]
+var = construction.extra_tree_placement
+type = SLE_UINT8
+from = SLV_132
+flags = SF_GUI_DROPDOWN
+def = 2
+min = 0
+max = 3
+str = STR_CONFIG_SETTING_EXTRA_TREE_PLACEMENT
+strhelp = STR_CONFIG_SETTING_EXTRA_TREE_PLACEMENT_HELPTEXT
+strval = STR_CONFIG_SETTING_EXTRA_TREE_PLACEMENT_NO_SPREAD
+cat = SC_BASIC