1; This file is part of OpenTTD.
2; 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.
3; 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.
4; 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/>.
5;
6
7; Difficulty settings as stored in the main configuration file ("openttd.cfg")
8; and in the savegame PATS chunk.
9
10[pre-amble]
11const 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"};
12
13uint16 _old_diff_custom[GAME_DIFFICULTY_NUM];
14uint8 _old_diff_level;                                 ///< Old difficulty level from old savegames
15
16static void DifficultyNoiseChange(int32 new_value);
17static void MaxNoAIsChange(int32 new_value);
18
19static const SettingVariant _difficulty_settings_table[] = {
20[post-amble]
21};
22[templates]
23SDTG_VAR   =   SDTG_VAR($name,              $type, $flags, $var, $def, $min, $max, $interval, $str, $strhelp, $strval, $pre_cb, $post_cb, $from, $to,        $cat, $extra, $startup),
24SDT_BOOL   =   SDT_BOOL(GameSettings, $var,        $flags, $def,                              $str, $strhelp, $strval, $pre_cb, $post_cb, $from, $to,        $cat, $extra, $startup),
25SDT_VAR    =    SDT_VAR(GameSettings, $var, $type, $flags, $def,       $min, $max, $interval, $str, $strhelp, $strval, $pre_cb, $post_cb, $from, $to,        $cat, $extra, $startup),
26
27[validation]
28SDTG_VAR = static_assert($max <= MAX_$type, "Maximum value for $var exceeds storage size");
29SDT_VAR = static_assert($max <= MAX_$type, "Maximum value for GameSettings.$var exceeds storage size");
30
31[defaults]
32flags    = SF_NONE
33interval = 0
34str      = STR_NULL
35strhelp  = STR_CONFIG_SETTING_NO_EXPLANATION_AVAILABLE_HELPTEXT
36strval   = STR_NULL
37pre_cb   = nullptr
38post_cb  = nullptr
39load     = nullptr
40from     = SL_MIN_VERSION
41to       = SL_MAX_VERSION
42cat      = SC_ADVANCED
43extra    = 0
44startup  = false
45
46
47; Saved settings variables.
48; The next 18 entries are important for savegame compatibility. Do NOT remove those. See HandleOldDiffCustom() for more details.
49[SDT_VAR]
50var      = difficulty.max_no_competitors
51type     = SLE_UINT8
52from     = SLV_97
53def      = 0
54min      = 0
55max      = MAX_COMPANIES - 1
56interval = 1
57post_cb  = MaxNoAIsChange
58cat      = SC_BASIC
59
60[SDT_VAR]
61var      = difficulty.competitor_start_time
62type     = SLE_UINT8
63from     = SLV_97
64to       = SLV_110
65def      = 2
66min      = 0
67max      = 3
68
69[SDT_VAR]
70var      = difficulty.number_towns
71type     = SLE_UINT8
72from     = SLV_97
73flags    = SF_NEWGAME_ONLY
74def      = 2
75min      = 0
76max      = 4
77interval = 1
78strval   = STR_NUM_VERY_LOW
79cat      = SC_BASIC
80
81[SDT_VAR]
82var      = difficulty.industry_density
83type     = SLE_UINT8
84from     = SLV_97
85flags    = SF_GUI_DROPDOWN
86def      = ID_END - 1
87min      = 0
88max      = ID_END - 1
89interval = 1
90str      = STR_CONFIG_SETTING_INDUSTRY_DENSITY
91strhelp  = STR_CONFIG_SETTING_INDUSTRY_DENSITY_HELPTEXT
92strval   = STR_FUNDING_ONLY
93cat      = SC_BASIC
94
95[SDT_VAR]
96var      = difficulty.max_loan
97type     = SLE_UINT32
98from     = SLV_97
99flags    = SF_NEWGAME_ONLY | SF_SCENEDIT_TOO | SF_GUI_CURRENCY
100def      = 300000
101min      = 0
102max      = 2000000000
103interval = 50000
104str      = STR_CONFIG_SETTING_MAXIMUM_INITIAL_LOAN
105strhelp  = STR_CONFIG_SETTING_MAXIMUM_INITIAL_LOAN_HELPTEXT
106strval   = STR_JUST_CURRENCY_LONG
107cat      = SC_BASIC
108
109[SDT_VAR]
110var      = difficulty.initial_interest
111type     = SLE_UINT8
112from     = SLV_97
113flags    = SF_NEWGAME_ONLY | SF_SCENEDIT_TOO
114def      = 2
115min      = 2
116max      = 4
117interval = 1
118str      = STR_CONFIG_SETTING_INTEREST_RATE
119strhelp  = STR_CONFIG_SETTING_INTEREST_RATE_HELPTEXT
120strval   = STR_CONFIG_SETTING_PERCENTAGE
121
122[SDT_VAR]
123var      = difficulty.vehicle_costs
124type     = SLE_UINT8
125from     = SLV_97
126flags    = SF_NEWGAME_ONLY | SF_SCENEDIT_TOO | SF_GUI_DROPDOWN
127def      = 0
128min      = 0
129max      = 2
130interval = 1
131str      = STR_CONFIG_SETTING_RUNNING_COSTS
132strhelp  = STR_CONFIG_SETTING_RUNNING_COSTS_HELPTEXT
133strval   = STR_SEA_LEVEL_LOW
134cat      = SC_BASIC
135
136[SDT_VAR]
137var      = difficulty.competitor_speed
138type     = SLE_UINT8
139from     = SLV_97
140flags    = SF_GUI_DROPDOWN
141def      = 2
142min      = 0
143max      = 4
144interval = 1
145str      = STR_CONFIG_SETTING_CONSTRUCTION_SPEED
146strhelp  = STR_CONFIG_SETTING_CONSTRUCTION_SPEED_HELPTEXT
147strval   = STR_AI_SPEED_VERY_SLOW
148cat      = SC_BASIC
149
150[SDT_VAR]
151var      = difficulty.competitor_intelligence
152type     = SLE_UINT8
153from     = SLV_97
154to       = SLV_110
155def      = 0
156min      = 0
157max      = 2
158
159[SDT_VAR]
160var      = difficulty.vehicle_breakdowns
161type     = SLE_UINT8
162from     = SLV_97
163flags    = SF_GUI_DROPDOWN
164def      = 1
165min      = 0
166max      = 2
167interval = 1
168str      = STR_CONFIG_SETTING_VEHICLE_BREAKDOWNS
169strhelp  = STR_CONFIG_SETTING_VEHICLE_BREAKDOWNS_HELPTEXT
170strval   = STR_DISASTER_NONE
171cat      = SC_BASIC
172
173[SDT_VAR]
174var      = difficulty.subsidy_multiplier
175type     = SLE_UINT8
176from     = SLV_97
177flags    = SF_GUI_DROPDOWN
178def      = 2
179min      = 0
180max      = 3
181interval = 1
182str      = STR_CONFIG_SETTING_SUBSIDY_MULTIPLIER
183strhelp  = STR_CONFIG_SETTING_SUBSIDY_MULTIPLIER_HELPTEXT
184strval   = STR_SUBSIDY_X1_5
185
186[SDT_VAR]
187var      = difficulty.subsidy_duration
188type     = SLE_UINT16
189from     = SLV_CUSTOM_SUBSIDY_DURATION
190flags    = SF_GUI_0_IS_SPECIAL
191def      = 1
192min      = 0
193max      = 5000
194interval = 1
195str      = STR_CONFIG_SETTING_SUBSIDY_DURATION
196strhelp  = STR_CONFIG_SETTING_SUBSIDY_DURATION_HELPTEXT
197strval   = STR_CONFIG_SETTING_SUBSIDY_DURATION_VALUE
198
199[SDT_VAR]
200var      = difficulty.construction_cost
201type     = SLE_UINT8
202from     = SLV_97
203flags    = SF_NEWGAME_ONLY | SF_SCENEDIT_TOO | SF_GUI_DROPDOWN
204def      = 0
205min      = 0
206max      = 2
207interval = 1
208str      = STR_CONFIG_SETTING_CONSTRUCTION_COSTS
209strhelp  = STR_CONFIG_SETTING_CONSTRUCTION_COSTS_HELPTEXT
210strval   = STR_SEA_LEVEL_LOW
211cat      = SC_BASIC
212
213[SDT_VAR]
214var      = difficulty.terrain_type
215type     = SLE_UINT8
216from     = SLV_97
217flags    = SF_GUI_DROPDOWN | SF_NEWGAME_ONLY
218def      = 1
219min      = 0
220max      = 5
221interval = 1
222str      = STR_CONFIG_SETTING_TERRAIN_TYPE
223strhelp  = STR_CONFIG_SETTING_TERRAIN_TYPE_HELPTEXT
224strval   = STR_TERRAIN_TYPE_VERY_FLAT
225cat      = SC_BASIC
226
227[SDT_VAR]
228var      = difficulty.quantity_sea_lakes
229type     = SLE_UINT8
230from     = SLV_97
231flags    = SF_NEWGAME_ONLY
232def      = 0
233min      = 0
234max      = 4
235interval = 1
236strval   = STR_SEA_LEVEL_VERY_LOW
237cat      = SC_BASIC
238
239[SDT_BOOL]
240var      = difficulty.economy
241from     = SLV_97
242def      = false
243str      = STR_CONFIG_SETTING_RECESSIONS
244strhelp  = STR_CONFIG_SETTING_RECESSIONS_HELPTEXT
245
246[SDT_BOOL]
247var      = difficulty.line_reverse_mode
248from     = SLV_97
249def      = false
250str      = STR_CONFIG_SETTING_TRAIN_REVERSING
251strhelp  = STR_CONFIG_SETTING_TRAIN_REVERSING_HELPTEXT
252
253[SDT_BOOL]
254var      = difficulty.disasters
255from     = SLV_97
256def      = false
257str      = STR_CONFIG_SETTING_DISASTERS
258strhelp  = STR_CONFIG_SETTING_DISASTERS_HELPTEXT
259cat      = SC_BASIC
260
261[SDT_VAR]
262var      = difficulty.town_council_tolerance
263type     = SLE_UINT8
264from     = SLV_97
265flags    = SF_GUI_DROPDOWN
266def      = 0
267min      = 0
268max      = 2
269interval = 1
270str      = STR_CONFIG_SETTING_CITY_APPROVAL
271strhelp  = STR_CONFIG_SETTING_CITY_APPROVAL_HELPTEXT
272strval   = STR_CITY_APPROVAL_PERMISSIVE
273post_cb  = DifficultyNoiseChange
274
275[SDTG_VAR]
276name     = ""diff_level""
277var      = _old_diff_level
278type     = SLE_UINT8
279flags    = SF_NOT_IN_CONFIG
280from     = SLV_97
281to       = SLV_178
282def      = 3
283min      = 0
284max      = 3
285cat      = SC_BASIC
286
287