Split save/load settings into separate INI files

Matching upstream for all settings
pull/611/head
Jonathan G Rennison 7 months ago
parent ccfdf626ad
commit 6e671ed6e2

@ -21,8 +21,6 @@
#include "../safeguards.h"
const SettingTable &GetSettingsTableInternal();
namespace upstream_sl {
/**
@ -34,7 +32,7 @@ namespace upstream_sl {
static std::vector<SaveLoad> GetSettingsDesc(bool is_loading)
{
std::vector<SaveLoad> saveloads;
for (auto &sd : GetSettingsTableInternal()) {
for (auto &sd : IterateSettingTables(GetSaveLoadSettingsTables())) {
if (sd->flags & SF_NOT_IN_SAVE) continue;
if (is_loading && !SlXvIsFeaturePresent(XSLFI_TABLE_PATS) && (sd->flags & SF_PATCH)) continue;
if (!sd->save.ext_feature_test.IsFeaturePresent(_sl_version, sd->save.version_from, sd->save.version_to)) continue;
@ -170,7 +168,7 @@ static void LoadSettings(void *object, const SaveLoadCompatTable &slct)
if (!IsSavegameVersionBefore(SLV_RIFF_TO_ARRAY) && SlIterateArray() != -1) SlErrorCorrupt("Too many settings entries");
/* Ensure all IntSettings are valid (min/max could have changed between versions etc). */
for (auto &sd : GetSettingsTableInternal()) {
for (auto &sd : IterateSettingTables(GetSaveLoadSettingsTables())) {
if (sd->flags & SF_NOT_IN_SAVE) continue;
if ((sd->flags & SF_NO_NETWORK_SYNC) && _networking && !_network_server) continue;
if (!sd->save.ext_feature_test.IsFeaturePresent(_sl_xv_feature_static_versions, MAX_LOAD_SAVEGAME_VERSION, sd->save.version_from, sd->save.version_to)) continue;

@ -124,14 +124,35 @@ static bool _fallback_gui_zoom_max = false;
* As such, they are not part of this list.
*/
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,
_scenario_settings,
};
/**
* List of all the save/load (PATS/PATX) setting tables.
*/
static const std::initializer_list<SettingTable> _saveload_setting_tables{
_difficulty_settings,
_economy_settings,
_game_settings,
_linkgraph_settings,
_locale_settings,
_pathfinding_settings,
_script_settings,
_world_settings,
};
void IterateSettingsTables(std::function<void(const SettingTable &, void *)> handler)
{
handler(_misc_settings, nullptr);
@ -207,17 +228,6 @@ enum IniFileVersion : uint32 {
const uint16 INIFILE_VERSION = (IniFileVersion)(IFV_MAX_VERSION - 1); ///< Current ini-file version of OpenTTD.
/**
* Get the setting at the given index into the settings table.
* @param index The index to look for.
* @return The setting at the given index, or nullptr when the index is invalid.
*/
const SettingDesc *GetSettingDescription(uint index)
{
if (index >= _settings.size()) return nullptr;
return _settings.begin()[index].get();
}
/**
* Find the index value of a ONEofMANY type in a string separated by |
* @param str the current value of the setting for which a value needs found
@ -2805,14 +2815,6 @@ CommandCost CmdChangeSetting(TileIndex tile, DoCommandFlag flags, uint32 p1, uin
return CommandCost();
}
const char *GetSettingNameByIndex(uint32 idx)
{
const SettingDesc *sd = GetSettingDescription(idx);
if (sd == nullptr) return nullptr;
return sd->name;
}
/**
* Change one of the per-company settings.
* @param tile unused
@ -2961,24 +2963,16 @@ void StringSettingDesc::ChangeValue(const void *object, std::string &newval, Sav
if (_save_config) SaveToConfig(ini_save_flags);
}
uint GetSettingIndexByFullName(const char *name)
uint GetSettingIndexByFullName(const SettingTable &table, const char *name)
{
uint index = 0;
for (auto &sd : _settings) {
for (auto &sd : table) {
if (sd->name != nullptr && strcmp(sd->name, name) == 0) return index;
index++;
}
return UINT32_MAX;
}
const SettingDesc *GetSettingFromFullName(const char *name)
{
for (auto &sd : _settings) {
if (sd->name != nullptr && strcmp(sd->name, name) == 0) return sd.get();
}
return nullptr;
}
/* Those 2 functions need to be here, else we have to make some stuff non-static
* and besides, it is also better to keep stuff like this at the same place */
void IConsoleSetSetting(const char *name, const char *value, bool force_newgame)
@ -3129,13 +3123,13 @@ std::vector<LoadSettingsItem> _settings_compat_items;
* @param object can be either nullptr in which case we load global variables or
* a pointer to a struct which is getting saved
*/
static void LoadSettings(const SettingTable &settings, std::initializer_list<SettingsCompat> compat, std::vector<LoadSettingsItem> &items, void *object)
static void LoadSettings(std::initializer_list<SettingTable> settings, std::initializer_list<SettingsCompat> compat, std::vector<LoadSettingsItem> &items, void *object)
{
if (items.empty()) {
/* Populate setting references */
btree::btree_multimap<std::string_view, const SettingDesc *> names;
for (auto &osd : settings) {
for (auto &osd : IterateSettingTables(settings)) {
if (osd->flags & SF_NOT_IN_SAVE) continue;
if (osd->name == nullptr) continue;
names.insert({osd->name, osd.get()});
@ -3212,11 +3206,11 @@ static void LoadSettings(const SettingTable &settings, std::initializer_list<Set
* Prepare a sorted list of settings to be potentially be loaded out of the PATX chunk
* This is to enable efficient lookup of settings by name
*/
static std::vector<const SettingDesc *> MakeSettingsPatxList(const SettingTable &settings)
static std::vector<const SettingDesc *> MakeSettingsPatxList(std::initializer_list<SettingTable> settings)
{
std::vector<const SettingDesc *> sorted_patx_settings;
for (auto &sd : settings) {
for (auto &sd : IterateSettingTables(settings)) {
if (sd->patx_name == nullptr) continue;
sorted_patx_settings.push_back(sd.get());
}
@ -3260,13 +3254,15 @@ static const SaveLoad _settings_ext_save_desc[] = {
/**
* Load handler for settings which go in the PATX chunk
* @param osd SettingDesc struct containing all information
* @param object can be either nullptr in which case we load global variables or
* a pointer to a struct which is getting saved
*/
static void LoadSettingsPatx(const SettingTable &settings, void *object)
static void LoadSettingsPatx(void *object)
{
std::vector<const SettingDesc *> sorted_patx_settings = MakeSettingsPatxList(settings);
static std::vector<const SettingDesc *> sorted_patx_settings;
if (sorted_patx_settings.empty()) {
sorted_patx_settings = MakeSettingsPatxList(_saveload_setting_tables);
}
SettingsExtLoad current_setting;
@ -3474,7 +3470,7 @@ static void Load_OPTS()
* a networking environment. This ensures for example that the local
* autosave-frequency stays when joining a network-server */
PrepareOldDiffCustom();
LoadSettings(_old_gameopt_settings, _gameopt_compat, _gameopt_compat_items, &_settings_game);
LoadSettings({ _old_gameopt_settings }, _gameopt_compat, _gameopt_compat_items, &_settings_game);
HandleOldDiffCustom(true);
}
@ -3483,22 +3479,22 @@ static void Load_PATS()
/* 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_compat, _settings_compat_items, &_settings_game);
LoadSettings(_saveload_setting_tables, _settings_compat, _settings_compat_items, &_settings_game);
}
static void Check_PATS()
{
LoadSettings(_settings, _settings_compat, _settings_compat_items, &_load_check_data.settings);
LoadSettings(_saveload_setting_tables, _settings_compat, _settings_compat_items, &_load_check_data.settings);
}
static void Load_PATX()
{
LoadSettingsPatx(_settings, &_settings_game);
LoadSettingsPatx(&_settings_game);
}
static void Check_PATX()
{
LoadSettingsPatx(_settings, &_load_check_data.settings);
LoadSettingsPatx(&_load_check_data.settings);
}
struct PATSChunkInfo
@ -3545,7 +3541,12 @@ void SetupTimeSettings()
_settings_time = (_game_mode == GM_MENU || _settings_client.gui.override_time_settings) ? _settings_client.gui : _settings_game.game_time;
}
const SettingTable &GetSettingsTableInternal()
std::initializer_list<SettingTable> GetSaveLoadSettingsTables()
{
return _saveload_setting_tables;
}
const SettingTable &GetLinkGraphSettingTable()
{
return _settings;
return _linkgraph_settings;
}

@ -47,7 +47,6 @@ void SyncCompanySettings();
void SetupTimeSettings();
const char *GetSettingNameByIndex(uint32 idx);
const char *GetCompanySettingNameByIndex(uint32 idx);
#endif /* SETTINGS_FUNC_H */

@ -55,9 +55,6 @@
#include "safeguards.h"
uint GetSettingIndexByFullName(const char *name);
const SettingDesc *GetSettingDescription(uint index);
extern void FlushDeparturesWindowTextCaches();
static const StringID _autosave_dropdown[] = {
@ -2444,10 +2441,11 @@ static SettingsContainer &GetSettingsTree()
cdist->Add(new SettingEntry("linkgraph.distribution_default"));
SettingsPage *cdist_override = cdist->Add(new SettingsPage(STR_CONFIG_SETTING_ENVIRONMENT_CARGODIST_PER_CARGO_OVERRIDE));
{
uint base_index = GetSettingIndexByFullName("linkgraph.distribution_per_cargo[0]");
const SettingTable &linkgraph_table = GetLinkGraphSettingTable();
uint base_index = GetSettingIndexByFullName(linkgraph_table, "linkgraph.distribution_per_cargo[0]");
assert(base_index != UINT32_MAX);
for (CargoID c = 0; c < NUM_CARGO; c++) {
cdist_override->Add(new CargoDestPerCargoSettingEntry(c, GetSettingDescription(base_index + c)->AsIntSetting()));
cdist_override->Add(new CargoDestPerCargoSettingEntry(c, GetSettingDescription(linkgraph_table, base_index + c)->AsIntSetting()));
}
}
cdist->Add(new SettingEntry("linkgraph.accuracy"));

@ -13,6 +13,7 @@
#include "sl/saveload_types.h"
#include <functional>
#include <initializer_list>
#include <vector>
enum SaveToConfigFlags : uint32;
@ -351,6 +352,71 @@ bool SetSettingValue(const IntSettingDesc *sd, int32 value, bool force_newgame =
bool SetSettingValue(const StringSettingDesc *sd, const std::string value, bool force_newgame = false);
void IterateSettingsTables(std::function<void(const SettingTable &, void *)> handler);
std::initializer_list<SettingTable> GetSaveLoadSettingsTables();
const SettingTable &GetLinkGraphSettingTable();
uint GetSettingIndexByFullName(const SettingTable &table, const char *name);
/**
* Get the setting at the given index into a settings table.
* @param table The settings table.
* @param index The index to look for.
* @return The setting at the given index, or nullptr when the index is invalid.
*/
inline const SettingDesc *GetSettingDescription(const SettingTable &table, uint index)
{
if (index >= table.size()) return nullptr;
return table.begin()[index].get();
}
struct SettingTablesIterator {
typedef const std::unique_ptr<const SettingDesc> value_type;
typedef const std::unique_ptr<const SettingDesc> *pointer;
typedef const std::unique_ptr<const SettingDesc> &reference;
typedef size_t difference_type;
typedef std::forward_iterator_tag iterator_category;
explicit SettingTablesIterator(std::initializer_list<SettingTable> &src, std::initializer_list<SettingTable>::iterator outer)
: src(src), outer(outer)
{
this->ResetInner();
this->ValidateIndex();
};
explicit SettingTablesIterator(std::initializer_list<SettingTable> &src, std::initializer_list<SettingTable>::iterator outer, SettingTable::iterator inner)
: src(src), outer(outer), inner(inner) {}
bool operator==(const SettingTablesIterator &other) const { return this->outer == other.outer && this->inner == other.inner; }
bool operator!=(const SettingTablesIterator &other) const { return !(*this == other); }
const std::unique_ptr<const SettingDesc> &operator*() const { return *this->inner; }
SettingTablesIterator &operator++() { ++this->inner; this->ValidateIndex(); return *this; }
private:
std::initializer_list<SettingTable> &src;
std::initializer_list<SettingTable>::iterator outer;
SettingTable::iterator inner;
void ResetInner()
{
this->inner = (this->outer != this->src.end()) ? this->outer->begin() : SettingTable::iterator();
}
void ValidateIndex()
{
while (this->outer != this->src.end() && this->inner == this->outer->end()) {
++this->outer;
this->ResetInner();
}
}
};
/* Wrapper to iterate the settings within a set of settings tables: std::initializer_list<SettingTable> */
struct IterateSettingTables {
std::initializer_list<SettingTable> tables;
IterateSettingTables(std::initializer_list<SettingTable> tables) : tables(tables) {}
SettingTablesIterator begin() { return SettingTablesIterator(this->tables, this->tables.begin()); }
SettingTablesIterator end() { return SettingTablesIterator(this->tables, this->tables.end(), SettingTable::iterator()); }
};
enum class SettingsCompatType : uint8 {
Null,

@ -20,8 +20,6 @@
typedef LinkGraph::BaseNode Node;
typedef LinkGraph::BaseEdge Edge;
const SettingDesc *GetSettingDescription(uint index);
static uint16 _num_nodes;
/**
@ -58,28 +56,21 @@ void GetLinkGraphJobDayLengthScaleAfterLoad(LinkGraphJob *lgj)
SaveLoadTable GetLinkGraphJobDesc()
{
static std::vector<SaveLoad> saveloads;
static const char *prefix = "linkgraph.";
/* Build the SaveLoad array on first call and don't touch it later on */
if (saveloads.size() == 0) {
size_t offset_gamesettings = cpp_offsetof(GameSettings, linkgraph);
size_t offset_component = cpp_offsetof(LinkGraphJob, settings);
size_t prefixlen = strlen(prefix);
int setting = 0;
const SettingDesc *desc = GetSettingDescription(setting);
while (desc != nullptr) {
if (desc->name != nullptr && strncmp(desc->name, prefix, prefixlen) == 0) {
SaveLoad sl = desc->save;
if (GetVarMemType(sl.conv) != SLE_VAR_NULL) {
char *&address = reinterpret_cast<char *&>(sl.address);
address -= offset_gamesettings;
address += offset_component;
}
saveloads.push_back(sl);
const SettingTable &linkgraph_table = GetLinkGraphSettingTable();
for (const auto &desc : linkgraph_table) {
SaveLoad sl = desc->save;
if (GetVarMemType(sl.conv) != SLE_VAR_NULL) {
char *&address = reinterpret_cast<char *&>(sl.address);
address -= offset_gamesettings;
address += offset_component;
}
desc = GetSettingDescription(++setting);
saveloads.push_back(sl);
}
const SaveLoad job_desc[] = {

@ -13,6 +13,9 @@ static size_t ConvertLandscape(const char *value);
/* Callback function used in _settings[] as well as _gui_settings[] */
static void UpdateTimeSettings(int32 new_value);
/* Callback function used for various settings */
static bool CheckTTDPatchSettingFlag(uint flag);
/****************************
* OTTD specific INI stuff

@ -4,7 +4,12 @@ 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}/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
@ -12,10 +17,12 @@ set(TABLE_INI_SOURCE_FILES
${CMAKE_CURRENT_SOURCE_DIR}/network_secrets_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}/scenario_settings.ini
${CMAKE_CURRENT_SOURCE_DIR}/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)

@ -8,9 +8,9 @@
; company changes them, it changes for all players.
[pre-amble]
static void UpdateAllServiceInterval(int32 new_value);
static bool CanUpdateServiceInterval(VehicleType type, int32 &new_value);
static void UpdateServiceInterval(VehicleType type, int32 new_value);
static void UpdateAllServiceInterval(int32_t new_value);
static bool CanUpdateServiceInterval(VehicleType type, int32_t &new_value);
static void UpdateServiceInterval(VehicleType type, int32_t new_value);
static const SettingTable _company_settings{
[post-amble]

@ -34,7 +34,6 @@ startup = false
extver = SlXvFeatureTest()
[SDT_VAR]
var = rate
type = SLE_UINT16

@ -0,0 +1,369 @@
; 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]
static const uint GAME_DIFFICULTY_NUM = 18;
static 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"};
static uint16 _old_diff_custom[GAME_DIFFICULTY_NUM];
uint8 _old_diff_level; ///< Old difficulty level from old savegames
static void DifficultyNoiseChange(int32_t new_value);
static void MaxNoAIsChange(int32_t new_value);
static bool TownCouncilToleranceAdjust(int32 &new_value);
static void DifficultyMoneyCheatMultiplayerChange(int32 new_value);
static void DifficultyRenameTownsMultiplayerChange(int32 new_value);
static void DifficultyOverrideTownSettingsMultiplayerChange(int32 new_value);
static const SettingDescEnumEntry _town_council_approval[] = {
{ 0, STR_CITY_APPROVAL_LENIENT },
{ 1, STR_CITY_APPROVAL_TOLERANT },
{ 2, STR_CITY_APPROVAL_HOSTILE },
{ 3, STR_CITY_APPROVAL_PERMISSIVE },
{ 0, STR_NULL }
};
static const SettingDescEnumEntry _vehicle_breakdown_modes[] = {
{ 0, STR_DISASTER_NONE },
{ 64, STR_VERY_REDUCED },
{ 1, STR_DISASTER_REDUCED },
{ 2, STR_DISASTER_NORMAL },
{ 0, STR_NULL }
};
static const SettingTable _difficulty_settings{
[post-amble]
};
[templates]
SDTG_VAR = SDTG_VAR($name, $type, $flags, $var, $def, $min, $max, $interval, $str, $strhelp, $strval, $pre_cb, $post_cb, $from, $to, $extver, $cat, $guiproc, $startup, $patxname),
SDT_BOOL = SDT_BOOL(GameSettings, $var, $flags, $def, $str, $strhelp, $strval, $pre_cb, $post_cb, $from, $to, $extver, $cat, $guiproc, $startup, $patxname),
SDT_VAR = SDT_VAR(GameSettings, $var, $type, $flags, $def, $min, $max, $interval, $str, $strhelp, $strval, $pre_cb, $post_cb, $from, $to, $extver, $cat, $guiproc, $startup, $patxname),
SDT_ENUM = SDT_ENUM(GameSettings, $var, $type, $flags, $def, $str, $strhelp, $pre_cb, $post_cb, $from, $to, $extver, $cat, $guiproc, $startup, $patxname, $enumlist),
[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
guiproc = nullptr
load = nullptr
from = SL_MIN_VERSION
to = SL_MAX_VERSION
cat = SC_ADVANCED
startup = false
extver = SlXvFeatureTest()
patxname = nullptr
enumlist = <this parameter must be set>
; 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.competitors_interval
type = SLE_UINT16
def = 10
min = MIN_COMPETITORS_INTERVAL
max = MAX_COMPETITORS_INTERVAL
interval = 1
patxname = ""difficulty.competitors_interval""
[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_NORMAL
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 | SF_GUI_0_IS_SPECIAL
def = 300000
min = LOAN_INTERVAL
max = 2000000000
pre_cb = [](auto &new_value) { new_value = (new_value + LOAN_INTERVAL / 2) / LOAN_INTERVAL * LOAN_INTERVAL; return true; }
interval = LOAN_INTERVAL
str = STR_CONFIG_SETTING_MAXIMUM_INITIAL_LOAN
strhelp = STR_CONFIG_SETTING_MAXIMUM_INITIAL_LOAN_HELPTEXT
strval = STR_CONFIG_SETTING_MAXIMUM_INITIAL_LOAN_VALUE
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.vehicle_costs_in_depot
type = SLE_UINT8
flags = SF_PATCH
def = 1
min = 1
max = 8
str = STR_CONFIG_SETTING_RUNNING_COSTS_IN_DEPOT
strhelp = STR_CONFIG_SETTING_RUNNING_COSTS_IN_DEPOT_HELPTEXT
strval = STR_CONFIG_SETTING_RUNNING_COSTS_IN_DEPOT_VALUE
patxname = ""difficulty.vehicle_costs_in_depot""
[SDT_VAR]
var = difficulty.vehicle_costs_when_stopped
type = SLE_UINT8
flags = SF_PATCH
def = 1
min = 1
max = 8
str = STR_CONFIG_SETTING_RUNNING_COSTS_WHEN_STOPPED
strhelp = STR_CONFIG_SETTING_RUNNING_COSTS_WHEN_STOPPED_HELPTEXT
strval = STR_CONFIG_SETTING_RUNNING_COSTS_WHEN_STOPPED_VALUE
strval = STR_CONFIG_SETTING_RUNNING_COSTS_IN_DEPOT_VALUE
patxname = ""difficulty.vehicle_costs_when_stopped""
[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_ENUM]
var = difficulty.vehicle_breakdowns
type = SLE_UINT8
from = SLV_97
def = 1
enumlist = _vehicle_breakdown_modes
str = STR_CONFIG_SETTING_VEHICLE_BREAKDOWNS
strhelp = STR_CONFIG_SETTING_VEHICLE_BREAKDOWNS_HELPTEXT
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_ENUM]
var = difficulty.town_council_tolerance
type = SLE_UINT8
from = SLV_97
flags = SF_ENUM_PRE_CB_VALIDATE
def = 0
enumlist = _town_council_approval
str = STR_CONFIG_SETTING_CITY_APPROVAL
strhelp = STR_CONFIG_SETTING_CITY_APPROVAL_HELPTEXT
pre_cb = TownCouncilToleranceAdjust
post_cb = DifficultyNoiseChange
[SDT_BOOL]
var = difficulty.money_cheat_in_multiplayer
flags = SF_PATCH
def = false
str = STR_CONFIG_SETTING_MONEY_CHEAT_MULTIPLAYER
strhelp = STR_CONFIG_SETTING_MONEY_CHEAT_MULTIPLAYER_HELPTEXT
post_cb = DifficultyMoneyCheatMultiplayerChange
cat = SC_EXPERT
patxname = ""cheat.difficulty.money_cheat_in_multiplayer""
[SDT_BOOL]
var = difficulty.rename_towns_in_multiplayer
flags = SF_PATCH
def = false
str = STR_CONFIG_SETTING_RENAME_TOWNS_MULTIPLAYER
strhelp = STR_CONFIG_SETTING_RENAME_TOWNS_MULTIPLAYER_HELPTEXT
post_cb = DifficultyRenameTownsMultiplayerChange
cat = SC_EXPERT
patxname = ""cheat.difficulty.rename_towns_in_multiplayer""
[SDT_BOOL]
var = difficulty.override_town_settings_in_multiplayer
flags = SF_PATCH
def = false
str = STR_CONFIG_SETTING_OVERRIDE_TOWN_SETTINGS_MULTIPLAYER
strhelp = STR_CONFIG_SETTING_OVERRIDE_TOWN_SETTINGS_MULTIPLAYER_HELPTEXT
post_cb = DifficultyOverrideTownSettingsMultiplayerChange
cat = SC_EXPERT
patxname = ""cheat.difficulty.override_town_settings_in_multiplayer""
[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

@ -0,0 +1,789 @@
; 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_t new_value);
static void InvalidateCompanyWindow(int32 new_value);
static bool DayLengthPreChange(int32 &new_value);
static void DayLengthChanged(int32 new_value);
static bool CheckSharingRail(int32 &new_value);
static void SharingRailChanged(int32 new_value);
static bool CheckSharingRoad(int32 &new_value);
static bool CheckSharingWater(int32 &new_value);
static bool CheckSharingAir(int32 &new_value);
static void TownZoneModeChanged(int32 new_value);
static void TownZoneCustomValueChanged(int32 new_value);
static bool OrderTownGrowthRate(SettingOnGuiCtrlData &data);
static const SettingTable _economy_settings{
[post-amble]
};
[templates]
SDT_BOOL = SDT_BOOL(GameSettings, $var, $flags, $def, $str, $strhelp, $strval, $pre_cb, $post_cb, $from, $to, $extver, $cat, $guiproc, $startup, $patxname),
SDT_VAR = SDT_VAR(GameSettings, $var, $type, $flags, $def, $min, $max, $interval, $str, $strhelp, $strval, $pre_cb, $post_cb, $from, $to, $extver, $cat, $guiproc, $startup, $patxname),
[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
guiproc = nullptr
load = nullptr
from = SL_MIN_VERSION
to = SL_MAX_VERSION
cat = SC_ADVANCED
startup = false
extver = SlXvFeatureTest()
patxname = nullptr
enumlist = <this parameter must be set>
[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
def = true
str = STR_CONFIG_SETTING_ALLOW_TOWN_ROADS
strhelp = STR_CONFIG_SETTING_ALLOW_TOWN_ROADS_HELPTEXT
pre_cb = [](int32 &new_value) -> bool { return CheckTTDPatchSettingFlag(0x62); }
[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
def = true
str = STR_CONFIG_SETTING_ALLOW_TOWN_LEVEL_CROSSINGS
strhelp = STR_CONFIG_SETTING_ALLOW_TOWN_LEVEL_CROSSINGS_HELPTEXT
[SDT_VAR]
var = economy.town_build_tunnels
type = SLE_UINT8
flags = SF_GUI_DROPDOWN | SF_PATCH
def = TTM_ALLOWED
min = TTM_BEGIN
max = TTM_END - 1
interval = 1
str = STR_CONFIG_SETTING_TOWN_TUNNELS
strhelp = STR_CONFIG_SETTING_TOWN_TUNNELS_HELPTEXT
strval = STR_CONFIG_SETTING_TOWN_TUNNELS_FORBIDDEN
cat = SC_BASIC
patxname = ""economy.town_build_tunnels""
[SDT_VAR]
var = economy.town_max_road_slope
type = SLE_UINT8
flags = SF_GUI_0_IS_SPECIAL | SF_PATCH
def = 4
min = 0
max = 8
interval = 1
str = STR_CONFIG_SETTING_TOWN_MAX_ROAD_SLOPE
strhelp = STR_CONFIG_SETTING_TOWN_MAX_ROAD_SLOPE_HELPTEXT
strval = STR_CONFIG_SETTING_TOWN_MAX_ROAD_SLOPE_VALUE
cat = SC_BASIC
patxname = ""economy.town_max_road_slope""
[SDT_BOOL]
var = economy.allow_town_bridges
flags = SF_PATCH
def = true
str = STR_CONFIG_SETTING_ALLOW_TOWN_BRIDGES
strhelp = STR_CONFIG_SETTING_ALLOW_TOWN_BRIDGES_HELPTEXT
cat = SC_BASIC
patxname = ""economy.allow_town_bridges""
[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_VAR]
var = economy.old_town_cargo_factor
type = SLE_INT8
flags = SF_PATCH
def = 0
min = -16
max = +8
interval = 1
str = STR_CONFIG_SETTING_TOWN_CARGO_FACTOR
strval = STR_JUST_INT
extver = SlXvFeatureTest(XSLFTO_AND, XSLFI_TOWN_CARGO_ADJ, 1, 1)
patxname = ""town_cargo_adj.economy.town_cargo_factor""
[SDT_VAR]
var = economy.town_cargo_scale_factor
type = SLE_INT16
flags = SF_DECIMAL1 | SF_DEC1SCALE | SF_PATCH
def = 0
min = -160
max = +80
interval = 1
str = STR_CONFIG_SETTING_TOWN_CARGO_FACTOR
strval = STR_DECIMAL1_WITH_SCALE
strhelp = STR_CONFIG_SETTING_TOWN_CARGO_FACTOR_HELPTEXT
patxname = ""town_cargo_adj.economy.town_cargo_scale_factor""
[SDT_VAR]
var = economy.industry_cargo_scale_factor
type = SLE_INT16
flags = SF_DECIMAL1 | SF_DEC1SCALE | SF_PATCH
def = 0
min = -50
max = +50
interval = 1
str = STR_CONFIG_SETTING_INDUSTRY_CARGO_FACTOR
strval = STR_DECIMAL1_WITH_SCALE
strhelp = STR_CONFIG_SETTING_INDUSTRY_CARGO_FACTOR_HELPTEXT
patxname = ""industry_cargo_adj.economy.industry_cargo_scale_factor""
[SDT_VAR]
var = economy.max_town_heightlevel
type = SLE_UINT8
flags = SF_PATCH
def = MAX_MAP_HEIGHT_LIMIT
min = 2
max = MAX_MAP_HEIGHT_LIMIT
interval = 1
str = STR_CONFIG_SETTING_TOWN_ABOVE_HEIGHT
strhelp = STR_CONFIG_SETTING_TOWN_ABOVE_HEIGHT_HELPTEXT
strval = STR_JUST_INT
cat = SC_BASIC
patxname = ""max_town_heightlevel.economy.max_town_heightlevel""
[SDT_VAR]
var = economy.min_town_land_area
type = SLE_UINT16
flags = SF_GUI_0_IS_SPECIAL | SF_PATCH
def = 0
min = 0
max = 400
interval = 5
str = STR_CONFIG_SETTING_MIN_TOWN_LAND_AREA
strhelp = STR_CONFIG_SETTING_MIN_TOWN_LAND_AREA_HELPTEXT
strval = STR_CONFIG_SETTING_MIN_LAND_AREA_VALUE
cat = SC_BASIC
patxname = ""max_town_heightlevel.economy.min_town_land_area""
[SDT_VAR]
var = economy.min_city_land_area
type = SLE_UINT16
flags = SF_GUI_0_IS_SPECIAL | SF_PATCH
def = 75
min = 0
max = 400
interval = 5
str = STR_CONFIG_SETTING_MIN_CITY_LAND_AREA
strhelp = STR_CONFIG_SETTING_MIN_CITY_LAND_AREA_HELPTEXT
strval = STR_CONFIG_SETTING_MIN_LAND_AREA_VALUE
cat = SC_BASIC
patxname = ""max_town_heightlevel.economy.min_city_land_area""
[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
def = false
str = STR_CONFIG_SETTING_INFLATION
strhelp = STR_CONFIG_SETTING_INFLATION_HELPTEXT
cat = SC_BASIC
pre_cb = [](int32 &new_value) -> bool { return CheckTTDPatchSettingFlag(0x81); }
[SDT_BOOL]
var = economy.inflation_fixed_dates
flags = SF_PATCH
def = true
str = STR_CONFIG_SETTING_INFLATION_FIXED_DATES
strhelp = STR_CONFIG_SETTING_INFLATION_FIXED_DATES_HELPTEXT
patxname = ""inflation_fixed_dates.economy.inflation_fixed_dates""
[SDT_VAR]
var = economy.day_length_factor
type = SLE_UINT8
flags = SF_PATCH
def = 1
min = 1
max = 125
str = STR_CONFIG_SETTING_DAY_LENGTH_FACTOR
strhelp = STR_CONFIG_SETTING_DAY_LENGTH_FACTOR_HELPTEXT
strval = STR_JUST_COMMA
pre_cb = DayLengthPreChange
post_cb = DayLengthChanged
cat = SC_BASIC
extver = SlXvFeatureTest(XSLFTO_AND, XSLFI_VARIABLE_DAY_LENGTH)
patxname = ""variable_day_length.economy.day_length_factor""
[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 = InvalidateCompanyWindow
[SDT_VAR]
var = economy.min_years_for_shares
type = SLE_UINT8
from = SLV_TRADING_AGE
flags = SF_GUI_0_IS_SPECIAL
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_CONFIG_SETTING_MIN_YEARS_FOR_SHARES_VALUE
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_INT8
from = SLV_54
flags = SF_GUI_DROPDOWN
def = 2
min = -2
max = 4
str = STR_CONFIG_SETTING_TOWN_GROWTH
strhelp = STR_CONFIG_SETTING_TOWN_GROWTH_HELPTEXT
strval = STR_CONFIG_SETTING_TOWN_GROWTH_EXTREME_SLOW
guiproc = OrderTownGrowthRate
[SDT_BOOL]
var = economy.town_zone_calc_mode
flags = SF_PATCH
def = false
str = STR_CONFIG_SETTING_TOWN_ZONE_CALC_MODE
strhelp = STR_CONFIG_SETTING_TOWN_ZONE_CALC_MODE_HELPTEXT
cat = SC_EXPERT
post_cb = TownZoneModeChanged
patxname = ""town_zone.economy.town_zone_calc_mode""
[SDT_VAR]
var = economy.town_zone_0_mult
type = SLE_UINT16
flags = SF_PATCH
def = 15
min = 0
max = 255
interval = 1
str = STR_CONFIG_SETTING_TOWN_ZONE_0_MULT
strhelp = STR_CONFIG_SETTING_TOWN_ZONE_0_MULT_HELPTEXT
strval = STR_JUST_COMMA
cat = SC_EXPERT
post_cb = TownZoneCustomValueChanged
patxname = ""town_zone.economy.town_zone_0_mult""
[SDT_VAR]
var = economy.town_zone_1_mult
type = SLE_UINT16
flags = SF_PATCH
def = 9
min = 0
max = 255
interval = 1
str = STR_CONFIG_SETTING_TOWN_ZONE_1_MULT
strhelp = STR_CONFIG_SETTING_TOWN_ZONE_1_MULT_HELPTEXT
strval = STR_JUST_COMMA
cat = SC_EXPERT
post_cb = TownZoneCustomValueChanged
patxname = ""town_zone.economy.town_zone_1_mult""
[SDT_VAR]
var = economy.town_zone_2_mult
type = SLE_UINT16
flags = SF_PATCH
def = 0
min = 0
max = 255
interval = 1
str = STR_CONFIG_SETTING_TOWN_ZONE_2_MULT
strhelp = STR_CONFIG_SETTING_TOWN_ZONE_2_MULT_HELPTEXT
strval = STR_JUST_COMMA
cat = SC_EXPERT
post_cb = TownZoneCustomValueChanged
patxname = ""town_zone.economy.town_zone_2_mult""
[SDT_VAR]
var = economy.town_zone_3_mult
type = SLE_UINT16
flags = SF_PATCH
def = 5
min = 0
max = 255
interval = 1
str = STR_CONFIG_SETTING_TOWN_ZONE_3_MULT
strhelp = STR_CONFIG_SETTING_TOWN_ZONE_3_MULT_HELPTEXT
strval = STR_JUST_COMMA
cat = SC_EXPERT
post_cb = TownZoneCustomValueChanged
patxname = ""town_zone.economy.town_zone_3_mult""
[SDT_VAR]
var = economy.town_zone_4_mult
type = SLE_UINT16
flags = SF_PATCH
def = 3
min = 0
max = 255
interval = 1
str = STR_CONFIG_SETTING_TOWN_ZONE_4_MULT
strhelp = STR_CONFIG_SETTING_TOWN_ZONE_4_MULT_HELPTEXT
strval = STR_JUST_COMMA
cat = SC_EXPERT
post_cb = TownZoneCustomValueChanged
patxname = ""town_zone.economy.town_zone_4_mult""
[SDT_VAR]
var = economy.city_zone_0_mult
type = SLE_UINT16
flags = SF_PATCH
def = 15
min = 0
max = 255
interval = 1
str = STR_CONFIG_SETTING_CITY_ZONE_0_MULT
strhelp = STR_CONFIG_SETTING_CITY_ZONE_0_MULT_HELPTEXT
strval = STR_JUST_COMMA
cat = SC_EXPERT
post_cb = TownZoneCustomValueChanged
patxname = ""town_zone.economy.city_zone_0_mult""
[SDT_VAR]
var = economy.city_zone_1_mult
type = SLE_UINT16
flags = SF_PATCH
def = 9
min = 0
max = 255
interval = 1
str = STR_CONFIG_SETTING_CITY_ZONE_1_MULT
strhelp = STR_CONFIG_SETTING_CITY_ZONE_1_MULT_HELPTEXT
strval = STR_JUST_COMMA
cat = SC_EXPERT
post_cb = TownZoneCustomValueChanged
patxname = ""town_zone.economy.city_zone_1_mult""
[SDT_VAR]
var = economy.city_zone_2_mult
type = SLE_UINT16
flags = SF_PATCH
def = 0
min = 0
max = 255
interval = 1
str = STR_CONFIG_SETTING_CITY_ZONE_2_MULT
strhelp = STR_CONFIG_SETTING_CITY_ZONE_2_MULT_HELPTEXT
strval = STR_JUST_COMMA
cat = SC_EXPERT
post_cb = TownZoneCustomValueChanged
patxname = ""town_zone.economy.city_zone_2_mult""
[SDT_VAR]
var = economy.city_zone_3_mult
type = SLE_UINT16
flags = SF_PATCH
def = 5
min = 0
max = 255
interval = 1
str = STR_CONFIG_SETTING_CITY_ZONE_3_MULT
strhelp = STR_CONFIG_SETTING_CITY_ZONE_3_MULT_HELPTEXT
strval = STR_JUST_COMMA
cat = SC_EXPERT
post_cb = TownZoneCustomValueChanged
patxname = ""town_zone.economy.city_zone_3_mult""
[SDT_VAR]
var = economy.city_zone_4_mult
type = SLE_UINT16
flags = SF_PATCH
def = 3
min = 0
max = 255
interval = 1
str = STR_CONFIG_SETTING_CITY_ZONE_4_MULT
strhelp = STR_CONFIG_SETTING_CITY_ZONE_4_MULT_HELPTEXT
strval = STR_JUST_COMMA
cat = SC_EXPERT
post_cb = TownZoneCustomValueChanged
patxname = ""town_zone.economy.city_zone_4_mult""
[SDT_VAR]
var = economy.town_growth_cargo_transported
type = SLE_UINT8
flags = SF_PATCH
def = 0
min = 0
max = 100
interval = 10
str = STR_CONFIG_SETTING_TOWN_GROWTH_CARGO_TRANSPORTED
strhelp = STR_CONFIG_SETTING_TOWN_GROWTH_CARGO_TRANSPORTED_HELPTEXT
strval = STR_CONFIG_SETTING_PERCENTAGE
cat = SC_EXPERT
patxname = ""town_growth.economy.town_growth_cargo_transported""
[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.town_min_distance
type = SLE_UINT16
flags = SF_PATCH
def = 20
min = 15
max = 500
interval = 5
str = STR_CONFIG_SETTING_TOWN_MIN_DISTANCE
strhelp = STR_CONFIG_SETTING_TOWN_MIN_DISTANCE_HELPTEXT
strval = STR_JUST_INT
patxname = ""town_min_distance.economy.town_min_distance""
[SDT_BOOL]
var = economy.infrastructure_sharing[0]
flags = SF_PATCH
def = false
str = STR_CONFIG_SETTING_SHARING_RAIL
pre_cb = CheckSharingRail
post_cb = SharingRailChanged
extver = SlXvFeatureTest(XSLFTO_AND, XSLFI_INFRA_SHARING)
patxname = ""infra_sharing.economy.infrastructure_sharing.rail""
[SDT_BOOL]
var = economy.infrastructure_sharing[1]
flags = SF_PATCH
def = false
str = STR_CONFIG_SETTING_SHARING_ROAD
pre_cb = CheckSharingRoad
extver = SlXvFeatureTest(XSLFTO_AND, XSLFI_INFRA_SHARING)
patxname = ""infra_sharing.economy.infrastructure_sharing.road""
[SDT_BOOL]
var = economy.infrastructure_sharing[2]
flags = SF_PATCH
def = false
str = STR_CONFIG_SETTING_SHARING_WATER
pre_cb = CheckSharingWater
extver = SlXvFeatureTest(XSLFTO_AND, XSLFI_INFRA_SHARING)
patxname = ""infra_sharing.economy.infrastructure_sharing.water""
[SDT_BOOL]
var = economy.infrastructure_sharing[3]
flags = SF_PATCH
def = false
str = STR_CONFIG_SETTING_SHARING_AIR
pre_cb = CheckSharingAir
extver = SlXvFeatureTest(XSLFTO_AND, XSLFI_INFRA_SHARING)
patxname = ""infra_sharing.economy.infrastructure_sharing.air""
[SDT_VAR]
var = economy.sharing_fee[0]
type = SLE_UINT
flags = SF_GUI_CURRENCY | SF_PATCH
def = 100
min = 0
max = 1000000
interval = 10
str = STR_CONFIG_SETTING_SHARING_FEE_RAIL
strhelp = STR_CONFIG_SETTING_SHARING_FEE_HELPTEXT
strval = STR_JUST_CURRENCY_LONG
extver = SlXvFeatureTest(XSLFTO_AND, XSLFI_INFRA_SHARING)
patxname = ""infra_sharing.economy.sharing_fee.rail""
[SDT_VAR]
var = economy.sharing_fee[1]
type = SLE_UINT
flags = SF_GUI_CURRENCY | SF_PATCH
def = 100
min = 0
max = 1000000
interval = 10
str = STR_CONFIG_SETTING_SHARING_FEE_ROAD
strhelp = STR_CONFIG_SETTING_SHARING_FEE_HELPTEXT
strval = STR_JUST_CURRENCY_LONG
extver = SlXvFeatureTest(XSLFTO_AND, XSLFI_INFRA_SHARING)
patxname = ""infra_sharing.economy.sharing_fee.road""
[SDT_VAR]
var = economy.sharing_fee[2]
type = SLE_UINT
flags = SF_GUI_CURRENCY | SF_PATCH
def = 100
min = 0
max = 1000000
interval = 10
str = STR_CONFIG_SETTING_SHARING_FEE_WATER
strhelp = STR_CONFIG_SETTING_SHARING_FEE_HELPTEXT
strval = STR_JUST_CURRENCY_LONG
extver = SlXvFeatureTest(XSLFTO_AND, XSLFI_INFRA_SHARING)
patxname = ""infra_sharing.economy.sharing_fee.water""
[SDT_VAR]
var = economy.sharing_fee[3]
type = SLE_UINT
flags = SF_GUI_CURRENCY | SF_PATCH
def = 100
min = 0
max = 1000000
interval = 10
str = STR_CONFIG_SETTING_SHARING_FEE_AIR
strhelp = STR_CONFIG_SETTING_SHARING_FEE_HELPTEXT
strval = STR_JUST_CURRENCY_LONG
extver = SlXvFeatureTest(XSLFTO_AND, XSLFI_INFRA_SHARING)
patxname = ""infra_sharing.economy.sharing_fee.air""
[SDT_BOOL]
var = economy.sharing_payment_in_debt
flags = SF_PATCH
def = false
str = STR_CONFIG_SETTING_SHARING_PAYMENT_IN_DEBT
extver = SlXvFeatureTest(XSLFTO_AND, XSLFI_INFRA_SHARING)
patxname = ""infra_sharing.economy.sharing_payment_in_debt""
[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
[SDT_VAR]
var = economy.random_road_reconstruction
type = SLE_UINT16
flags = SF_PATCH
def = 0
min = 0
max = 1000
str = STR_CONFIG_SETTING_RANDOM_ROAD_RECONSTRUCTION
strhelp = STR_CONFIG_SETTING_RANDOM_ROAD_RECONSTRUCTION_HELPTEXT
strval = STR_JUST_COMMA
cat = SC_BASIC
patxname = ""economy.random_road_reconstruction""
[SDT_BOOL]
var = economy.disable_inflation_newgrf_flag
flags = SF_PATCH
def = false
cat = SC_EXPERT
patxname = ""economy.disable_inflation_newgrf_flag""
[SDT_VAR]
var = economy.payment_algorithm
type = SLE_UINT8
flags = SF_GUI_DROPDOWN | SF_PATCH
def = CPA_MODERN
min = CPA_BEGIN
max = CPA_END - 1
interval = 1
str = STR_CONFIG_SETTING_CARGO_PAYMENT_ALGORITHM
strhelp = STR_CONFIG_SETTING_CARGO_PAYMENT_ALGORITHM_HELPTEXT
strval = STR_CONFIG_SETTING_CARGO_PAYMENT_ALGORITHM_TRADITIONAL
cat = SC_BASIC
patxname = ""economy.payment_algorithm""
[SDT_VAR]
var = economy.tick_rate
type = SLE_UINT8
flags = SF_GUI_DROPDOWN | SF_PATCH
def = TRM_TRADITIONAL
min = TRM_BEGIN
max = TRM_END - 1
interval = 1
str = STR_CONFIG_SETTING_TICK_RATE
strhelp = STR_CONFIG_SETTING_TICK_RATE_HELPTEXT
strval = STR_CONFIG_SETTING_TICK_RATE_TRADITIONAL
cat = SC_EXPERT
post_cb = [](auto) { SetupTickRate(); }
patxname = ""economy.tick_rate""

@ -0,0 +1,748 @@
; 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 constexpr std::initializer_list<const char*> _roadsides{"left", "right"};
static void StationSpreadChanged(int32_t new_value);
static void UpdateConsists(int32_t new_value);
static void TrainAccelerationModelChanged(int32_t new_value);
static bool CheckTrainBrakingModelChange(int32 &new_value);
static void TrainBrakingModelChanged(int32 new_value);
static void RoadVehAccelerationModelChanged(int32_t new_value);
static void TrainSlopeSteepnessChanged(int32_t new_value);
static void RoadVehSlopeSteepnessChanged(int32_t new_value);
static bool CheckRoadSide(int32_t &new_value);
static void RoadSideChanged(int32 new_value);
static bool CheckDynamicEngines(int32_t &new_value);
static void StationCatchmentChanged(int32_t new_value);
static void MaxVehiclesChanged(int32_t new_value);
static void ImprovedBreakdownsSettingChanged(int32 new_value);
static void TrainSpeedAdaptationChanged(int32 new_value);
static const SettingDescEnumEntry _train_braking_model[] = {
{ TBM_ORIGINAL, STR_CONFIG_SETTING_ORIGINAL },
{ TBM_REALISTIC, STR_CONFIG_SETTING_TRAIN_BRAKING_REALISTIC },
{ 0, STR_NULL }
};
static const SettingDescEnumEntry _realistic_braking_aspect_limited[] = {
{ TRBALM_OFF, STR_CONFIG_SETTING_OFF },
{ TRBALM_ON, STR_CONFIG_SETTING_TRAIN_BRAKING_ASPECT_LIMITED_ON },
{ 0, STR_NULL }
};
static const SettingDescEnumEntry _station_delivery_mode[] = {
{ SD_NEAREST_FIRST, STR_CONFIG_SETTING_ORIGINAL},
{ SD_BALANCED, STR_CONFIG_SETTING_DELIVERY_BALANCED},
{ 0, STR_NULL }
};
static const SettingTable _game_settings{
[post-amble]
};
[templates]
SDTG_BOOL = SDTG_BOOL($name, $flags, $var, $def, $str, $strhelp, $strval, $pre_cb, $post_cb, $from, $to, $extver, $cat, $guiproc, $startup, $patxname),
SDTG_VAR = SDTG_VAR($name, $type, $flags, $var, $def, $min, $max, $interval, $str, $strhelp, $strval, $pre_cb, $post_cb, $from, $to, $extver, $cat, $guiproc, $startup, $patxname),
SDTC_BOOL = SDTC_BOOL( $var, $flags, $def, $str, $strhelp, $strval, $pre_cb, $post_cb, $from, $to, $extver, $cat, $guiproc, $startup, $patxname),
SDT_BOOL = SDT_BOOL(GameSettings, $var, $flags, $def, $str, $strhelp, $strval, $pre_cb, $post_cb, $from, $to, $extver, $cat, $guiproc, $startup, $patxname),
SDT_OMANY = SDT_OMANY(GameSettings, $var, $type, $flags, $def, $max, $full, $str, $strhelp, $strval, $pre_cb, $post_cb, $from, $to, $extver, $load, $cat, $guiproc, $startup, $patxname),
SDT_VAR = SDT_VAR(GameSettings, $var, $type, $flags, $def, $min, $max, $interval, $str, $strhelp, $strval, $pre_cb, $post_cb, $from, $to, $extver, $cat, $guiproc, $startup, $patxname),
SDT_ENUM = SDT_ENUM(GameSettings, $var, $type, $flags, $def, $str, $strhelp, $pre_cb, $post_cb, $from, $to, $extver, $cat, $guiproc, $startup, $patxname, $enumlist),
[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
guiproc = nullptr
load = nullptr
from = SL_MIN_VERSION
to = SL_MAX_VERSION
cat = SC_ADVANCED
startup = false
extver = SlXvFeatureTest()
patxname = nullptr
enumlist = <this parameter must be set>
[SDT_BOOL]
var = order.old_timetable_separation
flags = SF_PATCH
def = true
cat = SC_EXPERT
extver = SlXvFeatureTest(XSLFTO_AND, XSLFI_AUTO_TIMETABLE, 1, 3)
patxname = ""auto_timetables.order.timetable_separation""
[SDT_VAR]
var = order.old_timetable_separation_rate
flags = SF_PATCH
type = SLE_UINT8
def = 100
min = 0
max = 100
interval = 10
str = STR_CONFIG_SETTING_TIMETABLE_SEPARATION_RATE
strhelp = STR_CONFIG_SETTING_TIMETABLE_SEPARATION_RATE_HELPTEXT
strval = STR_CONFIG_SETTING_PERCENTAGE
cat = SC_EXPERT
extver = SlXvFeatureTest(XSLFTO_AND, XSLFI_AUTO_TIMETABLE, 1, 2)
patxname = ""auto_timetables.order.timetable_separation_rate""
[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.nonstop_only
flags = SF_PATCH
def = false
str = STR_CONFIG_SETTING_NONSTOP_ORDER_ONLY
strhelp = STR_CONFIG_SETTING_NONSTOP_ORDER_ONLY_HELPTEXT
cat = SC_EXPERT
patxname = ""nonstop_only.order.nonstop_only""
[SDT_BOOL]
var = order.gradual_loading
from = SLV_40
flags = SF_NO_NETWORK
def = true
cat = SC_EXPERT
[SDT_VAR]
var = order.old_occupancy_smoothness
type = SLE_UINT8
flags = SF_PATCH
def = 75
min = 0
max = 100
interval = 10
str = STR_CONFIG_OCCUPANCY_SMOOTHNESS
strhelp = STR_CONFIG_OCCUPANCY_SMOOTHNESS_HELPTEXT
strval = STR_CONFIG_SETTING_PERCENTAGE
cat = SC_EXPERT
extver = SlXvFeatureTest(XSLFTO_AND, XSLFI_ORDER_OCCUPANCY, 1, 1)
patxname = ""order_occupancy.order.occupancy_smoothness""
[SDT_BOOL]
var = station.never_expire_airports
def = false
str = STR_CONFIG_SETTING_NEVER_EXPIRE_AIRPORTS
strhelp = STR_CONFIG_SETTING_NEVER_EXPIRE_AIRPORTS_HELPTEXT
pre_cb = [](int32 &new_value) -> bool { return CheckTTDPatchSettingFlag(0x0C); }
[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_VAR]
var = station.catchment_increase
type = SLE_UINT8
flags = SF_PATCH
def = 0
min = 0
max = 5
str = STR_CONFIG_SETTING_CATCHMENT_INCREASE
strhelp = STR_CONFIG_SETTING_CATCHMENT_INCREASE_HELPTEXT
strval = STR_JUST_COMMA
post_cb = StationCatchmentChanged
extver = SlXvFeatureTest(XSLFTO_AND, XSLFI_STATION_CATCHMENT_INC)
patxname = ""station_catchment_inc.station.catchment_increase""
[SDT_BOOL]
var = station.cargo_class_rating_wait_time
flags = SF_PATCH
def = false
str = STR_CONFIG_SETTING_STATION_RATING_CARGO_CLASS_WAIT_TIME
strhelp = STR_CONFIG_SETTING_STATION_RATING_CARGO_CLASS_WAIT_TIME_HELPTEXT
patxname = ""station_rating.station.cargo_class_rating_wait_time""
[SDT_BOOL]
var = station.station_size_rating_cargo_amount
flags = SF_PATCH
def = false
str = STR_CONFIG_SETTING_STATION_RATING_SIZE_CARGO_AMOUNT
strhelp = STR_CONFIG_SETTING_STATION_RATING_SIZE_CARGO_AMOUNT_HELPTEXT
patxname = ""station_rating.station.station_size_rating_cargo_amount""
[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_ENUM]
var = station.station_delivery_mode
type = SLE_UINT8
flags = SF_PATCH
def = SD_NEAREST_FIRST
enumlist = _station_delivery_mode
str = STR_CONFIG_SETTING_CARGO_DELIVERY_MODE
strhelp = STR_CONFIG_SETTING_CARGO_DELIVERY_MODE_HELPTEXT
patxname = ""station.station_delivery_mode""
[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_CONFIG_SETTING_ROAD_SIDE_LEFT
pre_cb = CheckRoadSide
post_cb = RoadSideChanged
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_ENUM]
var = vehicle.train_braking_model
type = SLE_UINT8
flags = SF_PATCH
def = TBM_ORIGINAL
enumlist = _train_braking_model
str = STR_CONFIG_SETTING_TRAIN_BRAKING_MODEL
strhelp = STR_CONFIG_SETTING_TRAIN_BRAKING_MODEL_HELPTEXT
pre_cb = CheckTrainBrakingModelChange
post_cb = TrainBrakingModelChanged
cat = SC_EXPERT
patxname = ""realistic_braking.vehicle.train_braking_model""
[SDT_ENUM]
var = vehicle.realistic_braking_aspect_limited
type = SLE_UINT8
flags = SF_PATCH
def = TRBALM_OFF
enumlist = _realistic_braking_aspect_limited
str = STR_CONFIG_SETTING_REALISTIC_BRAKING_ASPECT_LIMITED
strhelp = STR_CONFIG_SETTING_REALISTIC_BRAKING_ASPECT_LIMITED_HELPTEXT
cat = SC_EXPERT
patxname = ""realistic_braking.vehicle.realistic_braking_aspect_limited""
[SDT_BOOL]
var = vehicle.limit_train_acceleration
flags = SF_PATCH
def = false
str = STR_CONFIG_SETTING_LIMIT_TRAIN_ACCELERATION
strhelp = STR_CONFIG_SETTING_LIMIT_TRAIN_ACCELERATION_HELPTEXT
cat = SC_EXPERT
patxname = ""realistic_braking.vehicle.limit_train_acceleration""
[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.through_load_speed_limit
type = SLE_UINT16
flags = SF_GUI_VELOCITY | SF_PATCH
def = 15
min = 5
max = 500
interval = 5
str = STR_CONFIG_SETTING_THROUGH_LOAD_SPEED_LIMIT
strhelp = STR_CONFIG_SETTING_THROUGH_LOAD_SPEED_LIMIT_HELPTEXT
strval = STR_JUST_VELOCITY
cat = SC_EXPERT
patxname = ""vehicle.through_load_speed_limit""
[SDT_VAR]
var = vehicle.rail_depot_speed_limit
type = SLE_UINT16
flags = SF_GUI_VELOCITY | SF_PATCH
def = 61
min = 5
max = 100
interval = 5
str = STR_CONFIG_SETTING_RAIL_DEPOT_SPEED_LIMIT
strhelp = STR_CONFIG_SETTING_RAIL_DEPOT_SPEED_LIMIT_HELPTEXT
strval = STR_JUST_VELOCITY
cat = SC_EXPERT
patxname = ""vehicle.rail_depot_speed_limit""
[SDT_BOOL]
var = vehicle.non_leading_engines_keep_name
flags = SF_PATCH
def = false
str = STR_CONFIG_SETTING_NON_LEADING_ENGINES_KEEP_NAME
strhelp = STR_CONFIG_SETTING_NON_LEADING_ENGINES_KEEP_NAME_HELPTEXT
cat = SC_ADVANCED
patxname = ""vehicle.non_leading_engines_keep_name""
[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.no_expire_vehicles_after
type = SLE_INT32
flags = SF_NO_NETWORK | SF_GUI_0_IS_SPECIAL | SF_PATCH
def = 0
min = MIN_YEAR
max = MAX_YEAR
interval = 1
str = STR_CONFIG_SETTING_NO_EXPIRE_VEHICLES_AFTER
strhelp = STR_CONFIG_SETTING_NO_EXPIRE_VEHICLES_AFTER_HELPTEXT
strval = STR_CONFIG_SETTING_NO_EXPIRE_VEHICLES_AFTER_VALUE
cat = SC_EXPERT
patxname = ""vehicle.no_expire_vehicles_after""
[SDT_VAR]
var = vehicle.no_introduce_vehicles_after
type = SLE_INT32
flags = SF_NO_NETWORK | SF_GUI_0_IS_SPECIAL | SF_PATCH
def = 0
min = MIN_YEAR
max = MAX_YEAR
interval = 1
str = STR_CONFIG_SETTING_NO_INTRODUCE_VEHICLES_AFTER
strhelp = STR_CONFIG_SETTING_NO_INTRODUCE_VEHICLES_AFTER_HELPTEXT
strval = STR_CONFIG_SETTING_NO_INTRODUCE_VEHICLES_AFTER_VALUE
cat = SC_EXPERT
patxname = ""vehicle.no_introduce_vehicles_after""
[SDT_VAR]
var = vehicle.max_trains
type = SLE_UINT16
def = 500
min = 0
max = 10000
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 = 10000
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 = 10000
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 = 10000
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
def = true
str = STR_CONFIG_SETTING_WAGONSPEEDLIMITS
strhelp = STR_CONFIG_SETTING_WAGONSPEEDLIMITS_HELPTEXT
pre_cb = [](int32 &new_value) -> bool { return CheckTTDPatchSettingFlag(0x5D); }
post_cb = UpdateConsists
[SDT_BOOL]
var = vehicle.slow_road_vehicles_in_curves
flags = SF_PATCH
def = true
str = STR_CONFIG_SETTING_SLOW_ROAD_VEHICLES_IN_CURVES
strhelp = STR_CONFIG_SETTING_SLOW_ROAD_VEHICLES_IN_CURVES_HELPTEXT
cat = SC_BASIC
patxname = ""slow_road_vehicles_in_curves.vehicle.slow_road_vehicles_in_curves""
[SDT_BOOL]
var = vehicle.train_speed_adaptation
flags = SF_PATCH
def = false
str = STR_CONFIG_SETTING_TRAIN_SPEED_ADAPTATION
strhelp = STR_CONFIG_SETTING_TRAIN_SPEED_ADAPTATION_HELPTEXT
cat = SC_EXPERT
post_cb = TrainSpeedAdaptationChanged
patxname = ""train_speed_adaptation.vehicle.train_speed_adaptation""
[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
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
pre_cb = [](int32 &new_value) -> bool { return CheckTTDPatchSettingFlag(0x58); }
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_BOOL]
var = vehicle.improved_breakdowns
flags = SF_PATCH
def = false
str = STR_CONFIG_SETTING_IMPROVED_BREAKDOWNS
post_cb = ImprovedBreakdownsSettingChanged
patxname = ""improved_breakdowns.vehicle.improved_breakdowns""
[SDT_BOOL]
var = vehicle.ship_collision_avoidance
flags = SF_PATCH
def = true
str = STR_CONFIG_SETTING_SHIP_COLLISION_AVOIDANCE
strhelp = STR_CONFIG_SETTING_SHIP_COLLISION_AVOIDANCE_HELPTEXT
patxname = ""ship_collision_avoidance.vehicle.ship_collision_avoidance""
cat = SC_BASIC
[SDT_BOOL]
var = vehicle.no_train_crash_other_company
flags = SF_PATCH
def = false
str = STR_CONFIG_SETTING_NO_TRAIN_CRASH_OTHER_COMPANY
strhelp = STR_CONFIG_SETTING_NO_TRAIN_CRASH_OTHER_COMPANY_HELPTEXT
extver = SlXvFeatureTest(XSLFTO_AND, XSLFI_INFRA_SHARING)
patxname = ""infra_sharing.vehicle.no_train_crash_other_company""
[SDT_BOOL]
var = vehicle.roadveh_articulated_overtaking
flags = SF_PATCH
def = true
str = STR_CONFIG_SETTING_ROADVEH_ARTICULATED_OVERTAKING
strhelp = STR_CONFIG_SETTING_ROADVEH_ARTICULATED_OVERTAKING_HELPTEXT
patxname = ""roadveh_articulated_overtaking.vehicle.roadveh_articulated_overtaking""
cat = SC_BASIC
[SDT_BOOL]
var = vehicle.roadveh_cant_quantum_tunnel
flags = SF_PATCH
def = false
str = STR_CONFIG_SETTING_ROADVEH_CANT_QUANTUM_TUNNEL
strhelp = STR_CONFIG_SETTING_ROADVEH_CANT_QUANTUM_TUNNEL_HELPTEXT
patxname = ""roadveh_cant_quantum_tunnel.vehicle.roadveh_cant_quantum_tunnel""
cat = SC_BASIC
[SDT_BOOL]
var = vehicle.drive_through_train_depot
flags = SF_PATCH
def = false
str = STR_CONFIG_SETTING_DRIVE_THROUGH_TRAIN_DEPOT
strhelp = STR_CONFIG_SETTING_DRIVE_THROUGH_TRAIN_DEPOT_HELPTEXT
patxname = ""drive_through_train_depot.vehicle.drive_through_train_depot""
[SDT_VAR]
var = vehicle.extend_vehicle_life
type = SLE_UINT8
def = 0
min = 0
max = 100
cat = SC_EXPERT
[SDT_BOOL]
var = vehicle.adjacent_crossings
flags = SF_PATCH
def = true
str = STR_CONFIG_SETTING_ADJACENT_CROSSINGS
strhelp = STR_CONFIG_SETTING_ADJACENT_CROSSINGS_HELPTEXT
cat = SC_BASIC
patxname = ""adjacent_crossings.vehicle.adjacent_crossings""
[SDT_BOOL]
var = vehicle.safer_crossings
flags = SF_PATCH
def = false
str = STR_CONFIG_SETTING_SAFER_CROSSINGS
strhelp = STR_CONFIG_SETTING_SAFER_CROSSINGS_HELPTEXT
cat = SC_BASIC
patxname = ""safer_crossings.vehicle.safer_crossings""
[SDT_BOOL]
var = vehicle.pay_for_repair
def = true
flags = SF_PATCH
str = STR_CONFIG_SETTING_PAY_FOR_REPAIR_VEHICLE
strhelp = STR_CONFIG_SETTING_PAY_FOR_REPAIR_VEHICLE_HELPTEXT
cat = SC_EXPERT
extver = SlXvFeatureTest(XSLFTO_AND, XSLFI_VEHICLE_REPAIR_COST)
patxname = ""vehicle_repair_cost.vehicle.pay_for_repair""
[SDT_VAR]
var = vehicle.repair_cost
type = SLE_UINT8
flags = SF_PATCH
def = 100
min = 1
max = 255
interval = 1
str = STR_CONFIG_SETTING_REPAIR_COST
strhelp = STR_CONFIG_SETTING_REPAIR_COST_HELPTEXT
strval = STR_JUST_INT
cat = SC_EXPERT
extver = SlXvFeatureTest(XSLFTO_AND, XSLFI_VEHICLE_REPAIR_COST)
patxname = ""vehicle_repair_cost.vehicle.repair_cost""
## Old vehicle settings.
[SDTG_BOOL]
name = ""vehicle.servint_ispercent""
flags = SF_NO_NETWORK
var = _old_vds.servint_ispercent
def = false
to = SLV_120
[SDTG_VAR]
name = ""vehicle.servint_trains""
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 = ""vehicle.servint_roadveh""
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 = ""vehicle.servint_ships""
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 = ""vehicle.servint_aircraft""
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

@ -1116,7 +1116,7 @@ strhelp = STR_CONFIG_SETTING_WARN_NO_DEPOT_ORDER_HELPTEXT
[SDTC_BOOL]
var = gui.lost_vehicle_warn
flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC | SF_PATCH
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

@ -0,0 +1,331 @@
; 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 int64 LinkGraphDistModeXrefChillPP(int64 val);
static bool LinkGraphDistributionSettingGUI(SettingOnGuiCtrlData &data);
static const SettingDescEnumEntry _linkgraph_mode_symmetric[] = {
{ DT_MANUAL, STR_CONFIG_SETTING_DISTRIBUTION_MANUAL },
{ DT_SYMMETRIC, STR_CONFIG_SETTING_DISTRIBUTION_SYMMETRIC },
{ DT_ASYMMETRIC, STR_CONFIG_SETTING_DISTRIBUTION_ASYMMETRIC },
{ DT_ASYMMETRIC_EQ, STR_CONFIG_SETTING_DISTRIBUTION_ASYMMETRIC_EQ },
{ DT_ASYMMETRIC_NEAR, STR_CONFIG_SETTING_DISTRIBUTION_ASYMMETRIC_NEAREST },
{ 0, STR_NULL }
};
static const SettingDescEnumEntry _linkgraph_mode_asymmetric[] = {
{ DT_MANUAL, STR_CONFIG_SETTING_DISTRIBUTION_MANUAL },
{ DT_ASYMMETRIC, STR_CONFIG_SETTING_DISTRIBUTION_ASYMMETRIC },
{ DT_ASYMMETRIC_EQ, STR_CONFIG_SETTING_DISTRIBUTION_ASYMMETRIC_EQ },
{ DT_ASYMMETRIC_NEAR, STR_CONFIG_SETTING_DISTRIBUTION_ASYMMETRIC_NEAREST },
{ 0, STR_NULL }
};
static const SettingDescEnumEntry _linkgraph_mode_per_cargo[] = {
{ DT_PER_CARGO_DEFAULT, STR_CONFIG_SETTING_DISTRIBUTION_PER_CARGO_DEFAULT },
{ DT_MANUAL, STR_CONFIG_SETTING_DISTRIBUTION_MANUAL },
{ DT_SYMMETRIC, STR_CONFIG_SETTING_DISTRIBUTION_SYMMETRIC },
{ DT_ASYMMETRIC, STR_CONFIG_SETTING_DISTRIBUTION_ASYMMETRIC },
{ DT_ASYMMETRIC_EQ, STR_CONFIG_SETTING_DISTRIBUTION_ASYMMETRIC_EQ },
{ DT_ASYMMETRIC_NEAR, STR_CONFIG_SETTING_DISTRIBUTION_ASYMMETRIC_NEAREST },
{ 0, STR_NULL }
};
static const SettingTable _linkgraph_settings{
[post-amble]
};
[templates]
SDT_VAR = SDT_VAR(GameSettings, $var, $type, $flags, $def, $min, $max, $interval, $str, $strhelp, $strval, $pre_cb, $post_cb, $from, $to, $extver, $cat, $guiproc, $startup, $patxname),
SDT_ENUM = SDT_ENUM(GameSettings, $var, $type, $flags, $def, $str, $strhelp, $pre_cb, $post_cb, $from, $to, $extver, $cat, $guiproc, $startup, $patxname, $enumlist),
SDT_NAMED_NULL = SDT_NAMED_NULL($name, $length, $from, $to, $extver, $patxname),
SDT_LINKGRAPH_PER_CARGO = SDT_ENUM(GameSettings, linkgraph.distribution_per_cargo[$linkgraph_cargo], SLE_UINT8, $flags | SF_NOT_IN_CONFIG | SF_NO_NEWGAME | SF_PATCH, DT_PER_CARGO_DEFAULT, STR_CONFIG_SETTING_DISTRIBUTION_PER_CARGO, STR_CONFIG_SETTING_DISTRIBUTION_PER_CARGO_HELPTEXT, $pre_cb, $post_cb, $from, $to, SlXvFeatureTest(XSLFTO_AND, XSLFI_LINKGRAPH_MODES), SC_EXPERT, LinkGraphDistributionSettingGUI, false, nullptr, _linkgraph_mode_per_cargo),
[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
guiproc = nullptr
load = nullptr
from = SL_MIN_VERSION
to = SL_MAX_VERSION
cat = SC_ADVANCED
startup = false
extver = SlXvFeatureTest()
patxname = nullptr
enumlist = <this parameter must be set>
[SDT_VAR]
var = linkgraph.recalc_interval
type = SLE_UINT16
from = SLV_183
def = 8
min = 4
max = 90
interval = 1
str = STR_CONFIG_SETTING_LINKGRAPH_RECALC_INTERVAL
strval = STR_CONFIG_SETTING_SECONDS_VALUE
strhelp = STR_CONFIG_SETTING_LINKGRAPH_RECALC_INTERVAL_HELPTEXT
[SDT_VAR]
var = linkgraph.recalc_time
type = SLE_UINT16
from = SLV_183
def = 32
min = 1
max = 9000
interval = 1
str = STR_CONFIG_SETTING_LINKGRAPH_RECALC_TIME
strval = STR_CONFIG_SETTING_SECONDS_VALUE
strhelp = STR_CONFIG_SETTING_LINKGRAPH_RECALC_TIME_HELPTEXT
[SDT_NAMED_NULL]
name = ""linkgraph.recalc_not_scaled_by_daylength""
length = 1
extver = SlXvFeatureTest([](uint16 version, bool version_in_range, const std::array<uint16, XSLFI_SIZE> &feature_versions) -> bool { return version_in_range && SlXvIsFeaturePresent(feature_versions, XSLFI_LINKGRAPH_DAY_SCALE, 1, 1) && !SlXvIsFeaturePresent(feature_versions, XSLFI_JOKERPP); })
patxname = ""linkgraph_day_scale.linkgraph.recalc_not_scaled_by_daylength""
[SDT_ENUM]
var = linkgraph.distribution_pax
type = SLE_UINT8
from = SLV_183
def = DT_MANUAL
enumlist = _linkgraph_mode_symmetric
str = STR_CONFIG_SETTING_DISTRIBUTION_PAX
strhelp = STR_CONFIG_SETTING_DISTRIBUTION_PAX_HELPTEXT
guiproc = LinkGraphDistributionSettingGUI
[SDT_ENUM]
var = linkgraph.distribution_mail
type = SLE_UINT8
from = SLV_183
def = DT_MANUAL
enumlist = _linkgraph_mode_symmetric
str = STR_CONFIG_SETTING_DISTRIBUTION_MAIL
strhelp = STR_CONFIG_SETTING_DISTRIBUTION_MAIL_HELPTEXT
guiproc = LinkGraphDistributionSettingGUI
[SDT_ENUM]
var = linkgraph.distribution_armoured
type = SLE_UINT8
from = SLV_183
def = DT_MANUAL
enumlist = _linkgraph_mode_symmetric
str = STR_CONFIG_SETTING_DISTRIBUTION_ARMOURED
strhelp = STR_CONFIG_SETTING_DISTRIBUTION_ARMOURED_HELPTEXT
guiproc = LinkGraphDistributionSettingGUI
[SDT_ENUM]
var = linkgraph.distribution_default
type = SLE_UINT8
from = SLV_183
def = DT_MANUAL
enumlist = _linkgraph_mode_asymmetric
str = STR_CONFIG_SETTING_DISTRIBUTION_DEFAULT
strhelp = STR_CONFIG_SETTING_DISTRIBUTION_DEFAULT_HELPTEXT
guiproc = LinkGraphDistributionSettingGUI
[SDT_LINKGRAPH_PER_CARGO]
linkgraph_cargo = 0
[SDT_LINKGRAPH_PER_CARGO]
linkgraph_cargo = 1
[SDT_LINKGRAPH_PER_CARGO]
linkgraph_cargo = 2
[SDT_LINKGRAPH_PER_CARGO]
linkgraph_cargo = 3
[SDT_LINKGRAPH_PER_CARGO]
linkgraph_cargo = 4
[SDT_LINKGRAPH_PER_CARGO]
linkgraph_cargo = 5
[SDT_LINKGRAPH_PER_CARGO]
linkgraph_cargo = 6
[SDT_LINKGRAPH_PER_CARGO]
linkgraph_cargo = 7
[SDT_LINKGRAPH_PER_CARGO]
linkgraph_cargo = 8
[SDT_LINKGRAPH_PER_CARGO]
linkgraph_cargo = 9
[SDT_LINKGRAPH_PER_CARGO]
linkgraph_cargo = 10
[SDT_LINKGRAPH_PER_CARGO]
linkgraph_cargo = 11
[SDT_LINKGRAPH_PER_CARGO]
linkgraph_cargo = 12
[SDT_LINKGRAPH_PER_CARGO]
linkgraph_cargo = 13
[SDT_LINKGRAPH_PER_CARGO]
linkgraph_cargo = 14
[SDT_LINKGRAPH_PER_CARGO]
linkgraph_cargo = 15
[SDT_LINKGRAPH_PER_CARGO]
linkgraph_cargo = 16
[SDT_LINKGRAPH_PER_CARGO]
linkgraph_cargo = 17
[SDT_LINKGRAPH_PER_CARGO]
linkgraph_cargo = 18
[SDT_LINKGRAPH_PER_CARGO]
linkgraph_cargo = 19
[SDT_LINKGRAPH_PER_CARGO]
linkgraph_cargo = 20
[SDT_LINKGRAPH_PER_CARGO]
linkgraph_cargo = 21
[SDT_LINKGRAPH_PER_CARGO]
linkgraph_cargo = 22
[SDT_LINKGRAPH_PER_CARGO]
linkgraph_cargo = 23
[SDT_LINKGRAPH_PER_CARGO]
linkgraph_cargo = 24
[SDT_LINKGRAPH_PER_CARGO]
linkgraph_cargo = 25
[SDT_LINKGRAPH_PER_CARGO]
linkgraph_cargo = 26
[SDT_LINKGRAPH_PER_CARGO]
linkgraph_cargo = 27
[SDT_LINKGRAPH_PER_CARGO]
linkgraph_cargo = 28
[SDT_LINKGRAPH_PER_CARGO]
linkgraph_cargo = 29
[SDT_LINKGRAPH_PER_CARGO]
linkgraph_cargo = 30
[SDT_LINKGRAPH_PER_CARGO]
linkgraph_cargo = 31
[SDT_LINKGRAPH_PER_CARGO]
linkgraph_cargo = 32
[SDT_LINKGRAPH_PER_CARGO]
linkgraph_cargo = 33
[SDT_LINKGRAPH_PER_CARGO]
linkgraph_cargo = 34
[SDT_LINKGRAPH_PER_CARGO]
linkgraph_cargo = 35
[SDT_LINKGRAPH_PER_CARGO]
linkgraph_cargo = 36
[SDT_LINKGRAPH_PER_CARGO]
linkgraph_cargo = 37
[SDT_LINKGRAPH_PER_CARGO]
linkgraph_cargo = 38
[SDT_LINKGRAPH_PER_CARGO]
linkgraph_cargo = 39
[SDT_LINKGRAPH_PER_CARGO]
linkgraph_cargo = 40
[SDT_LINKGRAPH_PER_CARGO]
linkgraph_cargo = 41
[SDT_LINKGRAPH_PER_CARGO]
linkgraph_cargo = 42
[SDT_LINKGRAPH_PER_CARGO]
linkgraph_cargo = 43
[SDT_LINKGRAPH_PER_CARGO]
linkgraph_cargo = 44
[SDT_LINKGRAPH_PER_CARGO]
linkgraph_cargo = 45
[SDT_LINKGRAPH_PER_CARGO]
linkgraph_cargo = 46
[SDT_LINKGRAPH_PER_CARGO]
linkgraph_cargo = 47
[SDT_LINKGRAPH_PER_CARGO]
linkgraph_cargo = 48
[SDT_LINKGRAPH_PER_CARGO]
linkgraph_cargo = 49
[SDT_LINKGRAPH_PER_CARGO]
linkgraph_cargo = 50
[SDT_LINKGRAPH_PER_CARGO]
linkgraph_cargo = 51
[SDT_LINKGRAPH_PER_CARGO]
linkgraph_cargo = 52
[SDT_LINKGRAPH_PER_CARGO]
linkgraph_cargo = 53
[SDT_LINKGRAPH_PER_CARGO]
linkgraph_cargo = 54
[SDT_LINKGRAPH_PER_CARGO]
linkgraph_cargo = 55
[SDT_LINKGRAPH_PER_CARGO]
linkgraph_cargo = 56
[SDT_LINKGRAPH_PER_CARGO]
linkgraph_cargo = 57
[SDT_LINKGRAPH_PER_CARGO]
linkgraph_cargo = 58
[SDT_LINKGRAPH_PER_CARGO]
linkgraph_cargo = 59
[SDT_LINKGRAPH_PER_CARGO]
linkgraph_cargo = 60
[SDT_LINKGRAPH_PER_CARGO]
linkgraph_cargo = 61
[SDT_LINKGRAPH_PER_CARGO]
linkgraph_cargo = 62
[SDT_LINKGRAPH_PER_CARGO]
linkgraph_cargo = 63
[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
[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
[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
[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
[SDT_VAR]
var = linkgraph.aircraft_link_scale
type = SLE_UINT16
flags = SF_PATCH
def = 100
min = 100
max = 1000
interval = 50
str = STR_CONFIG_SETTING_AIRCRAFT_PATH_COST
strval = STR_CONFIG_SETTING_PERCENTAGE
strhelp = STR_CONFIG_SETTING_AIRCRAFT_PATH_COST_HELPTEXT
extver = SlXvFeatureTest(XSLFTO_AND, XSLFI_LINKGRAPH_AIRCRAFT)

@ -0,0 +1,209 @@
; 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_t _old_units; ///< Old units from old savegames
static constexpr std::initializer_list<const char*> _locale_currencies{"GBP", "USD", "EUR", "JPY", "ATS", "BEF", "CHF", "CZK", "DEM", "DKK", "ESP", "FIM", "FRF", "GRD", "HUF", "ISK", "ITL", "NLG", "NOK", "PLN", "RON", "RUR", "SIT", "SEK", "TRY", "SKK", "BRL", "EEK", "LTL", "KRW", "ZAR", "custom", "GEL", "IRR", "RUB", "MXN", "NTD", "CNY", "HKD", "INR", "IDR", "MYR"};
static constexpr std::initializer_list<const char*> _locale_units{"imperial", "metric", "si", "gameunits"};
static_assert(_locale_currencies.size() == CURRENCY_END);
static void VelocityUnitsChanged(int32 new_value);
static const SettingTable _locale_settings{
[post-amble]
};
[templates]
SDTC_BOOL = SDTC_BOOL( $var, $flags, $def, $str, $strhelp, $strval, $pre_cb, $post_cb, $from, $to, $extver, $cat, $guiproc, $startup, $patxname),
SDTG_OMANY = SDTG_OMANY($name, $type, $flags, $var, $def, $max, $full, $str, $strhelp, $strval, $pre_cb, $post_cb, $from, $to, $extver, $cat, $guiproc, $startup, $patxname),
SDT_OMANY = SDT_OMANY(GameSettings, $var, $type, $flags, $def, $max, $full, $str, $strhelp, $strval, $pre_cb, $post_cb, $from, $to, $extver, $load, $cat, $guiproc, $startup, $patxname),
SDT_SSTR = SDT_SSTR(GameSettings, $var, $type, $flags, $def, $pre_cb, $post_cb, $from, $to, $extver, $cat, $guiproc, $startup, $patxname),
[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
guiproc = nullptr
load = nullptr
from = SL_MIN_VERSION
to = SL_MAX_VERSION
cat = SC_ADVANCED
startup = false
extver = SlXvFeatureTest()
patxname = nullptr
enumlist = <this parameter must be set>
[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 = 4
full = _locale_units
post_cb = VelocityUnitsChanged
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_velocity_nautical
type = SLE_UINT8
from = SLV_VELOCITY_NAUTICAL
flags = SF_NO_NETWORK_SYNC | SF_GUI_DROPDOWN
def = 1
max = 4
full = _locale_units
post_cb = VelocityUnitsChanged
cat = SC_BASIC
str = STR_CONFIG_SETTING_LOCALISATION_UNITS_VELOCITY_NAUTICAL
strhelp = STR_CONFIG_SETTING_LOCALISATION_UNITS_VELOCITY_HELPTEXT
strval = STR_CONFIG_SETTING_LOCALISATION_UNITS_VELOCITY_IMPERIAL
extver = SlXvFeatureTest(XSLFTO_OR, XSLFI_VELOCITY_NAUTICAL)
patxname = ""locale.units_velocity_nautical""
[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
[SDTC_BOOL]
var = client_locale.sync_locale_network_server
flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC | SF_PATCH
def = false
str = STR_CONFIG_SETTING_SYNC_LOCALE_SETTINGS_NETWORK_SERVER
strhelp = STR_CONFIG_SETTING_SYNC_LOCALE_SETTINGS_NETWORK_SERVER_HELPTEXT
cat = SC_BASIC

@ -10,9 +10,9 @@
[pre-amble]
extern std::string _config_language_file;
static std::initializer_list<const char*> _support8bppmodes{"no", "system" , "hardware"};
static std::initializer_list<const char*> _display_opt_modes{"SHOW_TOWN_NAMES", "SHOW_STATION_NAMES", "SHOW_SIGNS", "FULL_ANIMATION", "", "FULL_DETAIL", "WAYPOINTS", "SHOW_COMPETITOR_SIGNS"};
static std::initializer_list<const char*> _extra_display_opt_modes{"SHOW_MONEY_TEXT_EFFECTS", "SHOW_HIDDEN_SIGNS"};
static constexpr std::initializer_list<const char*> _support8bppmodes{"no", "system", "hardware"};
static constexpr std::initializer_list<const char*> _display_opt_modes{"SHOW_TOWN_NAMES", "SHOW_STATION_NAMES", "SHOW_SIGNS", "FULL_ANIMATION", "", "FULL_DETAIL", "WAYPOINTS", "SHOW_COMPETITOR_SIGNS"};
static constexpr std::initializer_list<const char*> _extra_display_opt_modes{"SHOW_MONEY_TEXT_EFFECTS", "SHOW_HIDDEN_SIGNS"};
#ifdef WITH_COCOA
extern bool _allow_hidpi_window;
@ -64,6 +64,7 @@ full = _display_opt_modes
[SDTG_MMANY]
name = ""extra_display_opt""
type = SLE_UINT8
flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC | SF_PATCH
var = _extra_display_opt
def = (1 << XDO_SHOW_MONEY_TEXT_EFFECTS)
full = _extra_display_opt_modes
@ -304,6 +305,7 @@ cat = SC_BASIC
[SDTG_VAR]
name = ""extra_transparency_options""
type = SLE_UINT
flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC | SF_PATCH
var = _transparency_opt_extra
def = 0
min = 0
@ -313,6 +315,7 @@ cat = SC_BASIC
[SDTG_VAR]
name = ""transparency_locks""
type = SLE_UINT
flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC | SF_PATCH
var = _transparency_lock_base
def = 0
min = 0
@ -378,6 +381,7 @@ def = true
[SDTG_VAR]
name = ""zoning_overlay_inner""
type = SLE_UINT8
flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC | SF_PATCH
var = _zoning.inner
def = 0
min = 0
@ -387,6 +391,7 @@ cat = SC_BASIC
[SDTG_VAR]
name = ""zoning_overlay_outer""
type = SLE_UINT8
flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC | SF_PATCH
var = _zoning.outer
def = 0
min = 0
@ -396,6 +401,7 @@ cat = SC_BASIC
[SDTG_VAR]
name = ""cargo_payment_x_mode""
type = SLE_UINT8
flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC | SF_PATCH
var = _cargo_payment_x_mode
def = 0
min = 0

@ -9,7 +9,7 @@
[pre-amble]
static void UpdateClientConfigValues();
static std::initializer_list<const char*> _server_game_type{"local", "public", "invite-only"};
static constexpr std::initializer_list<const char*> _server_game_type{"local", "public", "invite-only"};
static const SettingTable _network_settings = {
[post-amble]

@ -14,21 +14,10 @@
; be saved in their new place.
[pre-amble]
static const uint GAME_DIFFICULTY_NUM = 18;
static 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"};
static 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 constexpr std::initializer_list<const char*> _locale_currencies{"GBP", "USD", "EUR", "JPY", "ATS", "BEF", "CHF", "CZK", "DEM", "DKK", "ESP", "FIM", "FRF", "GRD", "HUF", "ISK", "ITL", "NLG", "NOK", "PLN", "RON", "RUR", "SIT", "SEK", "TRY", "SKK", "BRL", "EEK", "LTL", "KRW", "ZAR", "custom", "GEL", "IRR", "RUB", "MXN", "NTD", "CNY", "HKD", "INR", "IDR", "MYR"};
static_assert(_locale_currencies.size() == CURRENCY_END);
static constexpr std::initializer_list<const char*> _locale_units{"imperial", "metric", "si", "gameunits"};
static constexpr 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 constexpr std::initializer_list<const char*> _climates{"temperate", "arctic", "tropic", "toyland"};
static constexpr std::initializer_list<const char*> _roadsides{"left", "right"};
static constexpr std::initializer_list<const char*> _settings_profiles{"easy", "medium", "hard"};
static const SettingTable _old_gameopt_settings{
/* In version 4 a new difficulty setting has been added to the difficulty settings,
@ -38,7 +27,7 @@ static const SettingTable _old_gameopt_settings{
* XXX - To save file-space and since values are never bigger than about 10? only
* save the first 16 bits in the savegame. Question is why the values are still int32
* and why not byte for example?
* 'SLE_FILE_I16 | SLE_VAR_U16' in "diff_custom" is needed to get around SlArray() hack
* 'SLE_FILE_I16 | SLE_VAR_U16' in "diff_custom" is needed to get around SlCopy() hack
* for savegames version 0 - though it is an array, it has to go through the byteswap process */
[post-amble]
};

@ -0,0 +1,647 @@
; 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_t new_value);
static void CheckYapfRailSignalPenalties(int32 new_value);
static const SettingTable _pathfinding_settings{
[post-amble]
};
[templates]
SDT_BOOL = SDT_BOOL(GameSettings, $var, $flags, $def, $str, $strhelp, $strval, $pre_cb, $post_cb, $from, $to, $extver, $cat, $guiproc, $startup, $patxname),
SDT_VAR = SDT_VAR(GameSettings, $var, $type, $flags, $def, $min, $max, $interval, $str, $strhelp, $strval, $pre_cb, $post_cb, $from, $to, $extver, $cat, $guiproc, $startup, $patxname),
[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
guiproc = nullptr
load = nullptr
from = SL_MIN_VERSION
to = SL_MAX_VERSION
cat = SC_ADVANCED
startup = false
extver = SlXvFeatureTest()
patxname = nullptr
enumlist = <this parameter must be set>
[SDT_BOOL]
var = pf.forbid_90_deg
def = true
str = STR_CONFIG_SETTING_FORBID_90_DEG
strhelp = STR_CONFIG_SETTING_FORBID_90_DEG_HELPTEXT
cat = SC_EXPERT
[SDT_BOOL]
var = pf.back_of_one_way_pbs_waiting_point
flags = SF_PATCH
def = true
str = STR_CONFIG_SETTING_BACK_ONE_WAY_PBS_SAFE_WAITING
str = STR_CONFIG_SETTING_BACK_ONE_WAY_PBS_SAFE_WAITING_HELPTEXT
cat = SC_EXPERT
patxname = ""pf.back_of_one_way_pbs_waiting_point""
[SDT_BOOL]
var = pf.roadveh_queue
def = true
cat = SC_EXPERT
[SDT_VAR]
var = pf.reroute_rv_on_layout_change
type = SLE_UINT8
flags = SF_GUI_DROPDOWN | SF_PATCH
def = 1
min = 0
max = 2
interval = 1
str = STR_CONFIG_SETTING_REROUTE_RV_ON_LAYOUT_CHANGE
strhelp = STR_CONFIG_SETTING_REROUTE_RV_ON_LAYOUT_CHANGE_HELPTEXT
strval = STR_CONFIG_SETTING_REROUTE_RV_ON_LAYOUT_CHANGE_NO
cat = SC_ADVANCED
patxname = ""pf.reroute_rv_on_layout_change""
[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 = true
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
post_cb = CheckYapfRailSignalPenalties
[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
post_cb = CheckYapfRailSignalPenalties
[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
post_cb = CheckYapfRailSignalPenalties
[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
post_cb = CheckYapfRailSignalPenalties
[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

@ -0,0 +1,120 @@
; 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 constexpr std::initializer_list<const char*> _settings_profiles{"easy", "medium", "hard"};
static void ScriptMaxOpsChange(int32 new_value);
static bool CheckScriptMaxMemoryChange(int32 &new_value);
static void ScriptMaxMemoryChange(int32 new_value);
const SettingTable _script_settings = {
[post-amble]
};
[templates]
SDT_BOOL = SDT_BOOL(GameSettings, $var, $flags, $def, $str, $strhelp, $strval, $pre_cb, $post_cb, $from, $to, $extver, $cat, $guiproc, $startup, $patxname),
SDT_OMANY = SDT_OMANY(GameSettings, $var, $type, $flags, $def, $max, $full, $str, $strhelp, $strval, $pre_cb, $post_cb, $from, $to, $extver, $load, $cat, $guiproc, $startup, $patxname),
SDT_VAR = SDT_VAR(GameSettings, $var, $type, $flags, $def, $min, $max, $interval, $str, $strhelp, $strval, $pre_cb, $post_cb, $from, $to, $extver, $cat, $guiproc, $startup, $patxname),
[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
guiproc = nullptr
load = nullptr
from = SL_MIN_VERSION
to = SL_MAX_VERSION
cat = SC_ADVANCED
startup = false
extver = SlXvFeatureTest()
patxname = nullptr
enumlist = <this parameter must be set>
[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
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
post_cb = ScriptMaxOpsChange
cat = SC_EXPERT
[SDT_VAR]
var = script.script_max_memory_megabytes
type = SLE_UINT32
from = SLV_SCRIPT_MEMLIMIT
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
pre_cb = CheckScriptMaxMemoryChange
post_cb = ScriptMaxMemoryChange
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

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff
Loading…
Cancel
Save