OpenTTD Source 20260129-master-g2bb01bd0e4
settings_internal.h
Go to the documentation of this file.
1/*
2 * This file is part of OpenTTD.
3 * 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.
4 * 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.
5 * 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 <https://www.gnu.org/licenses/old-licenses/gpl-2.0>.
6 */
7
10#ifndef SETTINGS_INTERNAL_H
11#define SETTINGS_INTERNAL_H
12
13#include <variant>
14#include "saveload/saveload.h"
15#include "core/enum_type.hpp"
16
34
43enum SettingCategory : uint8_t {
44 SC_NONE = 0,
45
46 /* Filters for the list */
47 SC_BASIC_LIST = 1 << 0,
49 SC_EXPERT_LIST = 1 << 2,
50
51 /* Setting classification */
55
56 SC_END,
57};
58
69
70struct IniItem;
71
77template <typename T, typename TTo>
78concept ConvertibleThroughBaseOrUnderlyingOrTo = ConvertibleThroughBaseOrTo<T, TTo> || (is_scoped_enum_v<T> && std::is_convertible_v<std::underlying_type_t<T>, TTo>);
79
84 virtual ~SettingDesc() = default;
85
87 bool startup;
89
90 bool IsEditable(bool do_command = false) const;
91 SettingType GetType() const;
92
97 constexpr const std::string &GetName() const
98 {
99 return this->save.name;
100 }
101
106 virtual bool IsIntSetting() const { return false; }
107
112 virtual bool IsStringSetting() const { return false; }
113
114 const struct IntSettingDesc *AsIntSetting() const;
115 const struct StringSettingDesc *AsStringSetting() const;
116
122 virtual std::string FormatValue(const void *object) const = 0;
123
129 virtual void ParseValue(const IniItem *item, void *object) const = 0;
130
140 virtual bool IsSameValue(const IniItem *item, void *object) const = 0;
141
148 virtual bool IsDefaultValue(void *object) const = 0;
149
153 virtual void ResetToDefault(void *object) const = 0;
154};
155
158 using GetTitleCallback = StringID(const IntSettingDesc &sd);
159 using GetHelpCallback = StringID(const IntSettingDesc &sd);
160 using GetValueParamsCallback = std::pair<StringParameter, StringParameter>(const IntSettingDesc &sd, int32_t value);
161 using GetDefaultValueCallback = int32_t(const IntSettingDesc &sd);
162 using GetRangeCallback = std::tuple<int32_t, uint32_t>(const IntSettingDesc &sd);
163
172 using PreChangeCheck = bool(int32_t &value);
177 using PostChangeCallback = void(int32_t value);
178
179 template <ConvertibleThroughBaseOrUnderlyingOrTo<int32_t> Tdef, ConvertibleThroughBaseOrUnderlyingOrTo<int32_t> Tmin, ConvertibleThroughBaseOrUnderlyingOrTo<uint32_t> Tmax, ConvertibleThroughBaseOrUnderlyingOrTo<int32_t> Tinterval>
181 Tmin min, Tmax max, Tinterval interval, StringID str, StringID str_help, StringID str_val,
183 GetTitleCallback get_title_cb, GetHelpCallback get_help_cb, GetValueParamsCallback get_value_params_cb,
184 GetDefaultValueCallback get_def_cb, GetRangeCallback get_range_cb) :
188 get_title_cb(get_title_cb), get_help_cb(get_help_cb), get_value_params_cb(get_value_params_cb),
189 get_def_cb(get_def_cb), get_range_cb(get_range_cb)
190 {
191 if constexpr (ConvertibleThroughBase<Tdef>) {
192 this->def = def.base();
193 } else if constexpr (is_scoped_enum_v<Tdef>) {
194 this->def = to_underlying(def);
195 } else {
196 this->def = def;
197 }
198
199 if constexpr (ConvertibleThroughBase<Tmin>) {
200 this->min = min.base();
201 } else if constexpr (is_scoped_enum_v<Tmin>) {
202 this->min = to_underlying(min);
203 } else {
204 this->min = min;
205 }
206
207 if constexpr (ConvertibleThroughBase<Tmax>) {
208 this->max = max.base();
209 } else if constexpr (is_scoped_enum_v<Tmax>) {
210 this->max = to_underlying(max);
211 } else {
212 this->max = max;
213 }
214
215 if constexpr (ConvertibleThroughBase<Tinterval>) {
216 this->interval = interval.base();
217 } else if constexpr (is_scoped_enum_v<Tinterval>) {
218 this->interval = to_underlying(interval);
219 } else {
220 this->interval = interval;
221 }
222 }
223
224 int32_t def;
225 int32_t min;
226 uint32_t max;
227 int32_t interval;
234 GetTitleCallback *get_title_cb;
235 GetHelpCallback *get_help_cb;
236 GetValueParamsCallback *get_value_params_cb;
237 GetDefaultValueCallback *get_def_cb;
238 GetRangeCallback *get_range_cb;
239
240 StringID GetTitle() const;
241 StringID GetHelp() const;
242 std::pair<StringParameter, StringParameter> GetValueParams(int32_t value) const;
243 int32_t GetDefaultValue() const;
244 std::tuple<int32_t, uint32_t> GetRange() const;
245
250 virtual bool IsBoolSetting() const { return false; }
251 bool IsIntSetting() const override { return true; }
252
253 void ChangeValue(const void *object, int32_t newvalue) const;
254 void MakeValueValidAndWrite(const void *object, int32_t value) const;
255
256 virtual int32_t ParseValue(std::string_view str) const;
257 std::string FormatValue(const void *object) const override;
258 void ParseValue(const IniItem *item, void *object) const override;
259 bool IsSameValue(const IniItem *item, void *object) const override;
260 bool IsDefaultValue(void *object) const override;
261 void ResetToDefault(void *object) const override;
262 int32_t Read(const void *object) const;
263
264private:
265 void MakeValueValid(int32_t &value) const;
266 void Write(const void *object, int32_t value) const;
267};
268
274 GetTitleCallback get_title_cb, GetHelpCallback get_help_cb, GetValueParamsCallback get_value_params_cb,
275 GetDefaultValueCallback get_def_cb) :
276 IntSettingDesc(save, flags, startup, def ? 1 : 0, 0, 1, 0, str, str_help, str_val, cat,
277 pre_check, post_callback, get_title_cb, get_help_cb, get_value_params_cb, get_def_cb, nullptr) {}
278
279 static std::optional<bool> ParseSingleValue(std::string_view str);
280
281 bool IsBoolSetting() const override { return true; }
282 int32_t ParseValue(std::string_view str) const override;
283 std::string FormatValue(const void *object) const override;
284};
285
288 typedef std::optional<uint32_t> OnConvert(std::string_view value);
289
290 template <ConvertibleThroughBaseOrUnderlyingOrTo<int32_t> Tdef, ConvertibleThroughBaseOrUnderlyingOrTo<uint32_t> Tmax>
294 GetTitleCallback get_title_cb, GetHelpCallback get_help_cb, GetValueParamsCallback get_value_params_cb,
295 GetDefaultValueCallback get_def_cb, std::initializer_list<std::string_view> many, OnConvert *many_cnvt) :
297 pre_check, post_callback, get_title_cb, get_help_cb, get_value_params_cb, get_def_cb, nullptr), many_cnvt(many_cnvt)
298 {
299 for (auto one : many) this->many.push_back(one);
300 }
301
302 std::vector<std::string_view> many;
304
305 static std::optional<uint32_t> ParseSingleValue(std::string_view str, std::span<const std::string_view> many);
306 std::string FormatSingleValue(uint id) const;
307
308 int32_t ParseValue(std::string_view str) const override;
309 std::string FormatValue(const void *object) const override;
310};
311
314 template <ConvertibleThroughBaseOrTo<int32_t> Tdef>
318 GetTitleCallback get_title_cb, GetHelpCallback get_help_cb, GetValueParamsCallback get_value_params_cb,
319 GetDefaultValueCallback get_def_cb, std::initializer_list<std::string_view> many, OnConvert *many_cnvt) :
320 OneOfManySettingDesc(save, flags, startup, def, (1 << many.size()) - 1, str, str_help,
321 str_val, cat, pre_check, post_callback, get_title_cb, get_help_cb, get_value_params_cb, get_def_cb, many, many_cnvt) {}
322
323 int32_t ParseValue(std::string_view str) const override;
324 std::string FormatValue(const void *object) const override;
325};
326
337 typedef bool PreChangeCheck(std::string &value);
342 typedef void PostChangeCallback(const std::string &value);
343
344 StringSettingDesc(const SaveLoad &save, SettingFlags flags, bool startup, std::string_view def,
348
349 std::string_view def;
350 uint32_t max_length;
353
354 bool IsStringSetting() const override { return true; }
355 void ChangeValue(const void *object, std::string &&newval) const;
356
357 std::string FormatValue(const void *object) const override;
358 void ParseValue(const IniItem *item, void *object) const override;
359 bool IsSameValue(const IniItem *item, void *object) const override;
360 bool IsDefaultValue(void *object) const override;
361 void ResetToDefault(void *object) const override;
362 const std::string &Read(const void *object) const;
363
364private:
365 void MakeValueValid(std::string &str) const;
366 void Write(const void *object, std::string_view str) const;
367};
368
371 ListSettingDesc(const SaveLoad &save, SettingFlags flags, bool startup, std::string_view def) :
373
374 std::string_view def;
375
376 std::string FormatValue(const void *object) const override;
377 void ParseValue(const IniItem *item, void *object) const override;
378 bool IsSameValue(const IniItem *item, void *object) const override;
379 bool IsDefaultValue(void *object) const override;
380 void ResetToDefault(void *object) const override;
381};
382
387
388 std::string FormatValue(const void *) const override { NOT_REACHED(); }
389 void ParseValue(const IniItem *, void *) const override { NOT_REACHED(); }
390 bool IsSameValue(const IniItem *, void *) const override { NOT_REACHED(); }
391 bool IsDefaultValue(void *) const override { NOT_REACHED(); }
392 void ResetToDefault(void *) const override { NOT_REACHED(); }
393};
394
395typedef std::variant<IntSettingDesc, BoolSettingDesc, OneOfManySettingDesc, ManyOfManySettingDesc, StringSettingDesc, ListSettingDesc, NullSettingDesc> SettingVariant;
396
402static constexpr const SettingDesc *GetSettingDesc(const SettingVariant &desc)
403{
404 return std::visit([](auto&& arg) -> const SettingDesc * { return &arg; }, desc);
405}
406
407typedef std::span<const SettingVariant> SettingTable;
408
409const SettingDesc *GetSettingFromName(std::string_view name);
410void GetSaveLoadFromSettingTable(SettingTable settings, std::vector<SaveLoad> &saveloads);
411SettingTable GetSaveLoadSettingTable();
412bool SetSettingValue(const IntSettingDesc *sd, int32_t value, bool force_newgame = false);
413bool SetSettingValue(const StringSettingDesc *sd, std::string_view value, bool force_newgame = false);
414
415std::vector<const SettingDesc *> GetFilteredSettingCollection(std::function<bool(const SettingDesc &desc)> func);
416
417#endif /* SETTINGS_INTERNAL_H */
Type is convertible to TTo, either directly or through ConvertibleThroughBase.
Type is convertible to TTo, either directly, through ConvertibleThroughBase or through to_underlying.
A type is considered 'convertible through base()' when it has a 'base()' function that returns someth...
Type (helpers) for enums.
constexpr std::underlying_type_t< enum_type > to_underlying(enum_type e)
Implementation of std::to_underlying (from C++23)
Definition enum_type.hpp:17
fluid_settings_t * settings
FluidSynth settings handle.
Functions/types related to saving and loading games.
const SettingDesc * GetSettingFromName(std::string_view name)
Given a name of any setting, return any setting description of it.
SettingFlag
Flags describing the behaviour of a setting.
@ NotInSave
Do not save with savegame, basically client-based.
@ GuiCurrency
The number represents money, so when reading value multiply by exchange rate.
@ Sandbox
This setting is a sandbox setting.
@ SceneditOnly
This setting can only be changed in the scenario editor.
@ PerCompany
This setting can be different for each company (saved in company struct).
@ NewgameOnly
This setting cannot be changed in a game.
@ GuiZeroIsSpecial
A value of zero is possible and has a custom string (the one after "strval").
@ NoNetwork
This setting does not apply to network games; it may not be changed during the game.
@ NotInConfig
Do not save to config file.
@ GuiDropdown
The value represents a limited number of string-options (internally integer) presented as dropdown.
@ SceneditToo
This setting can be changed in the scenario editor (only makes sense when SettingFlag::NewgameOnly is...
@ NoNetworkSync
Do not synchronize over network (but it is saved if SettingFlag::NotInSave is not set).
@ NetworkOnly
This setting only applies to network games.
std::vector< const SettingDesc * > GetFilteredSettingCollection(std::function< bool(const SettingDesc &desc)> func)
Get a collection of settings matching a custom filter.
SettingType
Type of settings for filtering.
@ ST_CLIENT
Client setting.
@ ST_ALL
Used in setting filter to match all types.
@ ST_GAME
Game setting.
@ ST_COMPANY
Company setting.
void GetSaveLoadFromSettingTable(SettingTable settings, std::vector< SaveLoad > &saveloads)
Get the SaveLoad for all settings in the settings table.
bool SetSettingValue(const IntSettingDesc *sd, int32_t value, bool force_newgame=false)
Top function to save the new value of an element of the Settings struct.
SettingTable GetSaveLoadSettingTable()
Create a single table with all settings that should be stored/loaded in the savegame.
SettingCategory
A SettingCategory defines a grouping of the settings.
@ SC_ADVANCED
Advanced settings are part of advanced and expert list.
@ SC_EXPERT
Expert settings can only be seen in the expert list.
@ SC_ADVANCED_LIST
Settings displayed in the list of advanced settings.
@ SC_EXPERT_LIST
Settings displayed in the list of expert settings.
@ SC_BASIC_LIST
Settings displayed in the list of basic settings.
@ SC_BASIC
Basic settings are part of all lists.
static constexpr const SettingDesc * GetSettingDesc(const SettingVariant &desc)
Helper to convert the type of the iterated settings description to a pointer to it.
uint32_t StringID
Numeric value that represents a string, independent of the selected language.
Boolean setting.
std::string FormatValue(const void *object) const override
Format the value of the setting associated with this object.
Definition settings.cpp:747
bool IsBoolSetting() const override
Check whether this setting is a boolean type setting.
static std::optional< bool > ParseSingleValue(std::string_view str)
Find whether a string was a boolean true or a boolean false.
Definition settings.cpp:206
int32_t ParseValue(std::string_view str) const override
Convert a string representation (external) of an integer-like setting to an integer.
Definition settings.cpp:411
A single "line" in an ini file.
Definition ini_type.h:23
Base integer type, including boolean, settings.
StringID str_help
(Translated) string with help text; gui only.
StringID str_val
(Translated) first string describing the value.
void MakeValueValid(int32_t &value) const
Make the value valid given the limitations of this setting.
Definition settings.cpp:502
void ResetToDefault(void *object) const override
Reset the setting to its default value.
Definition settings.cpp:766
std::string FormatValue(const void *object) const override
Format the value of the setting associated with this object.
Definition settings.cpp:736
int32_t def
default value given when none is present
SettingCategory cat
assigned categories of the setting
bool IsIntSetting() const override
Check whether this setting is an integer type setting.
std::tuple< int32_t, uint32_t > GetRange() const
Get the min/max range for the setting.
Definition settings.cpp:476
StringID GetTitle() const
Get the title of the setting.
Definition settings.cpp:427
void ChangeValue(const void *object, int32_t newvalue) const
Handle changing a value.
uint32_t max
maximum values
GetDefaultValueCallback * get_def_cb
Callback to set the correct default value.
bool IsSameValue(const IniItem *item, void *object) const override
Check whether the value in the Ini item is the same as is saved in this setting in the object.
Definition settings.cpp:753
int32_t min
minimum values
bool(int32_t &value) PreChangeCheck
A check to be performed before the setting gets changed.
PreChangeCheck * pre_check
Callback to check for the validity of the setting.
int32_t GetDefaultValue() const
Get the default value of the setting.
Definition settings.cpp:467
void Write(const void *object, int32_t value) const
Set the value of a setting.
Definition settings.cpp:556
StringID GetHelp() const
Get the help text of the setting.
Definition settings.cpp:436
virtual bool IsBoolSetting() const
Check whether this setting is a boolean type setting.
PostChangeCallback * post_callback
Callback when the setting has been changed.
StringID str
(translated) string with descriptive text; gui and console
void MakeValueValidAndWrite(const void *object, int32_t value) const
Make the value valid and then write it to the setting.
Definition settings.cpp:487
void(int32_t value) PostChangeCallback
A callback to denote that a setting has been changed.
std::pair< StringParameter, StringParameter > GetValueParams(int32_t value) const
Get parameters for drawing the value of the setting.
Definition settings.cpp:445
int32_t Read(const void *object) const
Read the integer from the the actual setting.
Definition settings.cpp:567
int32_t interval
the interval to use between settings in the 'settings' window. If interval is '0' the interval is dyn...
virtual int32_t ParseValue(std::string_view str) const
Convert a string representation (external) of an integer-like setting to an integer.
Definition settings.cpp:367
bool IsDefaultValue(void *object) const override
Check whether the value is the same as the default value.
Definition settings.cpp:760
List/array settings.
void ParseValue(const IniItem *item, void *object) const override
Parse/read the value from the Ini item into the setting associated with this object.
Definition settings.cpp:674
void ResetToDefault(void *object) const override
Reset the setting to its default value.
Definition settings.cpp:820
bool IsSameValue(const IniItem *item, void *object) const override
Check whether the value in the Ini item is the same as is saved in this setting in the object.
Definition settings.cpp:808
std::string_view def
default value given when none is present
std::string FormatValue(const void *object) const override
Convert an integer-array (intlist) to a string representation.
Definition settings.cpp:310
bool IsDefaultValue(void *object) const override
Check whether the value is the same as the default value.
Definition settings.cpp:814
Many of many setting.
int32_t ParseValue(std::string_view str) const override
Convert a string representation (external) of an integer-like setting to an integer.
Definition settings.cpp:400
std::string FormatValue(const void *object) const override
Format the value of the setting associated with this object.
Definition settings.cpp:347
Placeholder for settings that have been removed, but might still linger in the savegame.
bool IsSameValue(const IniItem *, void *) const override
Check whether the value in the Ini item is the same as is saved in this setting in the object.
void ParseValue(const IniItem *, void *) const override
Parse/read the value from the Ini item into the setting associated with this object.
std::string FormatValue(const void *) const override
Format the value of the setting associated with this object.
bool IsDefaultValue(void *) const override
Check whether the value is the same as the default value.
void ResetToDefault(void *) const override
Reset the setting to its default value.
One of many setting.
OnConvert * many_cnvt
callback procedure when loading value mechanism fails
std::optional< uint32_t > OnConvert(std::string_view value)
callback prototype for conversion error
std::string FormatValue(const void *object) const override
Format the value of the setting associated with this object.
Definition settings.cpp:341
static std::optional< uint32_t > ParseSingleValue(std::string_view str, std::span< const std::string_view > many)
Find the index value of a ONEofMANY type in a string.
Definition settings.cpp:188
std::vector< std::string_view > many
possible values for this type
int32_t ParseValue(std::string_view str) const override
Convert a string representation (external) of an integer-like setting to an integer.
Definition settings.cpp:386
SaveLoad type struct.
Definition saveload.h:753
std::string name
Name of this field (optional, used for tables).
Definition saveload.h:754
Properties of config file settings.
virtual void ParseValue(const IniItem *item, void *object) const =0
Parse/read the value from the Ini item into the setting associated with this object.
bool IsEditable(bool do_command=false) const
Check whether the setting is editable in the current gamemode.
Definition settings.cpp:894
SettingFlags flags
Handles how a setting would show up in the GUI (text/currency, etc.).
virtual bool IsStringSetting() const
Check whether this setting is an string type setting.
virtual void ResetToDefault(void *object) const =0
Reset the setting to its default value.
SettingType GetType() const
Return the type of the setting.
Definition settings.cpp:911
constexpr const std::string & GetName() const
Get the name of this setting.
bool startup
Setting has to be loaded directly at startup?.
virtual std::string FormatValue(const void *object) const =0
Format the value of the setting associated with this object.
const struct StringSettingDesc * AsStringSetting() const
Get the setting description of this setting as a string setting.
Definition settings.cpp:931
virtual bool IsSameValue(const IniItem *item, void *object) const =0
Check whether the value in the Ini item is the same as is saved in this setting in the object.
virtual bool IsDefaultValue(void *object) const =0
Check whether the value is the same as the default value.
SaveLoad save
Internal structure (going to savegame, parts to config).
virtual bool IsIntSetting() const
Check whether this setting is an integer type setting.
const struct IntSettingDesc * AsIntSetting() const
Get the setting description of this setting as an integer setting.
Definition settings.cpp:921
String settings.
const std::string & Read(const void *object) const
Read the string from the the actual setting.
Definition settings.cpp:606
void PostChangeCallback(const std::string &value)
A callback to denote that a setting has been changed.
std::string_view def
Default value given when none is present.
void Write(const void *object, std::string_view str) const
Write a string to the actual setting.
Definition settings.cpp:596
uint32_t max_length
Maximum length of the string, 0 means no maximum length.
PreChangeCheck * pre_check
Callback to check for the validity of the setting.
void ChangeValue(const void *object, std::string &&newval) const
Handle changing a string value.
void MakeValueValid(std::string &str) const
Make the value valid given the limitations of this setting.
Definition settings.cpp:580
bool IsSameValue(const IniItem *item, void *object) const override
Check whether the value in the Ini item is the same as is saved in this setting in the object.
Definition settings.cpp:787
bool IsDefaultValue(void *object) const override
Check whether the value is the same as the default value.
Definition settings.cpp:797
PostChangeCallback * post_callback
Callback when the setting has been changed.
void ResetToDefault(void *object) const override
Reset the setting to its default value.
Definition settings.cpp:803
bool PreChangeCheck(std::string &value)
A check to be performed before the setting gets changed.
std::string FormatValue(const void *object) const override
Format the value of the setting associated with this object.
Definition settings.cpp:771
bool IsStringSetting() const override
Check whether this setting is an string type setting.
void ParseValue(const IniItem *item, void *object) const override
Parse/read the value from the Ini item into the setting associated with this object.
Definition settings.cpp:667