Files
@ r25541:0d6ae25223d4
Branch filter:
Location: cpp/openttd-patchpack/source/src/settings_internal.h - annotation
r25541:0d6ae25223d4
12.7 KiB
text/x-c
Codechange: let OneOfMany and ManyOfMany be their own classes as well
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 | r12768:980ae0491352 r12768:980ae0491352 r12768:980ae0491352 r12768:980ae0491352 r12768:980ae0491352 r12768:980ae0491352 r12768:980ae0491352 r8208:69bb74cd3d21 r8208:69bb74cd3d21 r8208:69bb74cd3d21 r8208:69bb74cd3d21 r8208:69bb74cd3d21 r10571:99cb9a95b4cf r8208:69bb74cd3d21 r15610:623a23fb6560 r15610:623a23fb6560 r8208:69bb74cd3d21 r8208:69bb74cd3d21 r25531:8f2ac79adcfc r15613:193c12018337 r23678:26fe843cbb90 r8208:69bb74cd3d21 r8208:69bb74cd3d21 r8208:69bb74cd3d21 r8208:69bb74cd3d21 r19944:25a78576fb5e r24217:df2f5854f1e3 r25531:8f2ac79adcfc r8208:69bb74cd3d21 r8208:69bb74cd3d21 r23678:26fe843cbb90 r25526:33520e7899c5 r8208:69bb74cd3d21 r25076:d074a1f15942 r25076:d074a1f15942 r25076:d074a1f15942 r25076:d074a1f15942 r25076:d074a1f15942 r25076:d074a1f15942 r25076:d074a1f15942 r25076:d074a1f15942 r25076:d074a1f15942 r25076:d074a1f15942 r8208:69bb74cd3d21 r23678:26fe843cbb90 r8208:69bb74cd3d21 r19716:f48509378d1e r19716:f48509378d1e r19716:f48509378d1e r19716:f48509378d1e r19716:f48509378d1e r19716:f48509378d1e r19716:f48509378d1e r19716:f48509378d1e r19716:f48509378d1e r19716:f48509378d1e r19716:f48509378d1e r19716:f48509378d1e r19716:f48509378d1e r19716:f48509378d1e r19716:f48509378d1e r19716:f48509378d1e r19716:f48509378d1e r19716:f48509378d1e r19716:f48509378d1e r19716:f48509378d1e r19716:f48509378d1e r19716:f48509378d1e r19716:f48509378d1e r19716:f48509378d1e r19904:596445e72cf1 r19904:596445e72cf1 r19904:596445e72cf1 r19904:596445e72cf1 r19904:596445e72cf1 r19904:596445e72cf1 r19904:596445e72cf1 r19906:1257c5c4bfd5 r19906:1257c5c4bfd5 r19904:596445e72cf1 r8208:69bb74cd3d21 r25536:93e072c5a8dc r10994:9aeee22b7578 r19944:25a78576fb5e r8208:69bb74cd3d21 r16724:241f3035597b r25530:8fd77372ff51 r25538:77b13389a352 r25538:77b13389a352 r25531:8f2ac79adcfc r25531:8f2ac79adcfc r8208:69bb74cd3d21 r25538:77b13389a352 r8208:69bb74cd3d21 r24817:a7332a241fe2 r8208:69bb74cd3d21 r19832:28610f312539 r19832:28610f312539 r19904:596445e72cf1 r25534:05340c405341 r25535:2511c73be71c r25534:05340c405341 r25535:2511c73be71c r25532:3688d577352b r25532:3688d577352b r25532:3688d577352b r25532:3688d577352b r25532:3688d577352b r25532:3688d577352b r25532:3688d577352b r25532:3688d577352b r25536:93e072c5a8dc r25536:93e072c5a8dc r25536:93e072c5a8dc r25536:93e072c5a8dc r25536:93e072c5a8dc r25536:93e072c5a8dc r25536:93e072c5a8dc r25536:93e072c5a8dc r25536:93e072c5a8dc r25536:93e072c5a8dc r25536:93e072c5a8dc r25536:93e072c5a8dc r25536:93e072c5a8dc r25536:93e072c5a8dc r25536:93e072c5a8dc r25536:93e072c5a8dc r25536:93e072c5a8dc r25536:93e072c5a8dc r8208:69bb74cd3d21 r8208:69bb74cd3d21 r25540:aae6ee72a2f1 r25531:8f2ac79adcfc r25531:8f2ac79adcfc r25538:77b13389a352 r25541:0d6ae25223d4 r25538:77b13389a352 r25541:0d6ae25223d4 r25531:8f2ac79adcfc r25532:3688d577352b r25538:77b13389a352 r25538:77b13389a352 r25538:77b13389a352 r25538:77b13389a352 r25538:77b13389a352 r25538:77b13389a352 r25538:77b13389a352 r25538:77b13389a352 r25538:77b13389a352 r25538:77b13389a352 r25534:05340c405341 r25534:05340c405341 r25534:05340c405341 r25540:aae6ee72a2f1 r25532:3688d577352b r25536:93e072c5a8dc r25536:93e072c5a8dc r25531:8f2ac79adcfc r25531:8f2ac79adcfc r25540:aae6ee72a2f1 r25540:aae6ee72a2f1 r25540:aae6ee72a2f1 r25540:aae6ee72a2f1 r25540:aae6ee72a2f1 r25540:aae6ee72a2f1 r25540:aae6ee72a2f1 r25540:aae6ee72a2f1 r25540:aae6ee72a2f1 r25540:aae6ee72a2f1 r25540:aae6ee72a2f1 r25541:0d6ae25223d4 r25541:0d6ae25223d4 r25541:0d6ae25223d4 r25541:0d6ae25223d4 r25541:0d6ae25223d4 r25541:0d6ae25223d4 r25541:0d6ae25223d4 r25541:0d6ae25223d4 r25541:0d6ae25223d4 r25541:0d6ae25223d4 r25541:0d6ae25223d4 r25541:0d6ae25223d4 r25541:0d6ae25223d4 r25541:0d6ae25223d4 r25541:0d6ae25223d4 r25541:0d6ae25223d4 r25541:0d6ae25223d4 r25541:0d6ae25223d4 r25541:0d6ae25223d4 r25541:0d6ae25223d4 r25541:0d6ae25223d4 r25541:0d6ae25223d4 r25541:0d6ae25223d4 r25541:0d6ae25223d4 r25541:0d6ae25223d4 r25541:0d6ae25223d4 r25541:0d6ae25223d4 r25541:0d6ae25223d4 r25541:0d6ae25223d4 r25541:0d6ae25223d4 r25541:0d6ae25223d4 r25541:0d6ae25223d4 r25541:0d6ae25223d4 r25541:0d6ae25223d4 r25541:0d6ae25223d4 r25531:8f2ac79adcfc r25531:8f2ac79adcfc r25531:8f2ac79adcfc r25531:8f2ac79adcfc r25538:77b13389a352 r25531:8f2ac79adcfc r25532:3688d577352b r25538:77b13389a352 r25538:77b13389a352 r25538:77b13389a352 r25538:77b13389a352 r25535:2511c73be71c r25535:2511c73be71c r25535:2511c73be71c r25532:3688d577352b r25536:93e072c5a8dc r25536:93e072c5a8dc r25532:3688d577352b r25531:8f2ac79adcfc r25531:8f2ac79adcfc r25531:8f2ac79adcfc r25531:8f2ac79adcfc r25531:8f2ac79adcfc r25538:77b13389a352 r25531:8f2ac79adcfc r25532:3688d577352b r25538:77b13389a352 r25538:77b13389a352 r25532:3688d577352b r25536:93e072c5a8dc r25536:93e072c5a8dc r25531:8f2ac79adcfc r25531:8f2ac79adcfc r25531:8f2ac79adcfc r25531:8f2ac79adcfc r25531:8f2ac79adcfc r25538:77b13389a352 r25531:8f2ac79adcfc r25532:3688d577352b r25532:3688d577352b r25536:93e072c5a8dc r25536:93e072c5a8dc r25531:8f2ac79adcfc r25531:8f2ac79adcfc r25530:8fd77372ff51 r25528:52b815c03f32 r25525:663d9d693469 r25539:74dbbbf4d689 r25539:74dbbbf4d689 r25525:663d9d693469 r8208:69bb74cd3d21 r16849:d593358b4346 | /*
* 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/>.
*/
/** @file settings_internal.h Functions and types used internally for the settings configurations. */
#ifndef SETTINGS_INTERNAL_H
#define SETTINGS_INTERNAL_H
#include "saveload/saveload.h"
/**
* Convention/Type of settings. This is then further specified if necessary
* with the SLE_ (SLE_VAR/SLE_FILE) enums in saveload.h
* @see VarTypes
* @see SettingDesc
*/
enum SettingDescType : byte {
SDT_NUMX = 0, ///< any number-type
SDT_BOOLX = 1, ///< a boolean number
SDT_ONEOFMANY = 2, ///< bitmasked number where only ONE bit may be set
SDT_MANYOFMANY = 3, ///< bitmasked number where MULTIPLE bits may be set
SDT_INTLIST = 4, ///< list of integers separated by a comma ','
SDT_STDSTRING = 6, ///< \c std::string
SDT_NULL = 7, ///< an old setting that has been removed but could still be in savegames
};
enum SettingGuiFlag : uint16 {
/* 2 bytes allocated for a maximum of 16 flags. */
SGF_NONE = 0,
SGF_0ISDISABLED = 1 << 0, ///< a value of zero means the feature is disabled
SGF_DISPLAY_ABS = 1 << 1, ///< display absolute value of the setting
SGF_MULTISTRING = 1 << 2, ///< the value represents a limited number of string-options (internally integer)
SGF_NETWORK_ONLY = 1 << 3, ///< this setting only applies to network games
SGF_CURRENCY = 1 << 4, ///< the number represents money, so when reading value multiply by exchange rate
SGF_NO_NETWORK = 1 << 5, ///< this setting does not apply to network games; it may not be changed during the game
SGF_NEWGAME_ONLY = 1 << 6, ///< this setting cannot be changed in a game
SGF_SCENEDIT_TOO = 1 << 7, ///< this setting can be changed in the scenario editor (only makes sense when SGF_NEWGAME_ONLY is set)
SGF_PER_COMPANY = 1 << 8, ///< this setting can be different for each company (saved in company struct)
SGF_SCENEDIT_ONLY = 1 << 9, ///< this setting can only be changed in the scenario editor
};
DECLARE_ENUM_AS_BIT_SET(SettingGuiFlag)
/**
* A SettingCategory defines a grouping of the settings.
* The group #SC_BASIC is intended for settings which also a novice player would like to change and is able to understand.
* The group #SC_ADVANCED is intended for settings which an experienced player would like to use. This is the case for most settings.
* Finally #SC_EXPERT settings only few people want to see in rare cases.
* The grouping is meant to be inclusive, i.e. all settings in #SC_BASIC also will be included
* in the set of settings in #SC_ADVANCED. The group #SC_EXPERT contains all settings.
*/
enum SettingCategory {
SC_NONE = 0,
/* Filters for the list */
SC_BASIC_LIST = 1 << 0, ///< Settings displayed in the list of basic settings.
SC_ADVANCED_LIST = 1 << 1, ///< Settings displayed in the list of advanced settings.
SC_EXPERT_LIST = 1 << 2, ///< Settings displayed in the list of expert settings.
/* Setting classification */
SC_BASIC = SC_BASIC_LIST | SC_ADVANCED_LIST | SC_EXPERT_LIST, ///< Basic settings are part of all lists.
SC_ADVANCED = SC_ADVANCED_LIST | SC_EXPERT_LIST, ///< Advanced settings are part of advanced and expert list.
SC_EXPERT = SC_EXPERT_LIST, ///< Expert settings can only be seen in the expert list.
SC_END,
};
/**
* Type of settings for filtering.
*/
enum SettingType {
ST_GAME, ///< Game setting.
ST_COMPANY, ///< Company setting.
ST_CLIENT, ///< Client setting.
ST_ALL, ///< Used in setting filter to match all types.
};
struct IniItem;
typedef bool OnChange(int32 var); ///< callback prototype on data modification
typedef size_t OnConvert(const char *value); ///< callback prototype for conversion error
/** Properties of config file settings. */
struct SettingDesc {
SettingDesc(SaveLoad save, const char *name, SettingGuiFlag flags, SettingDescType cmd, bool startup) :
name(name), flags(flags), cmd(cmd), startup(startup), save(save) {}
virtual ~SettingDesc() {}
const char *name; ///< name of the setting. Used in configuration file and for console
SettingGuiFlag flags; ///< handles how a setting would show up in the GUI (text/currency, etc.)
SettingDescType cmd; ///< various flags for the variable
bool startup; ///< setting has to be loaded directly at startup?
SaveLoad save; ///< Internal structure (going to savegame, parts to config)
bool IsEditable(bool do_command = false) const;
SettingType GetType() const;
bool IsIntSetting() const;
bool IsStringSetting() const;
const struct IntSettingDesc *AsIntSetting() const;
const struct StringSettingDesc *AsStringSetting() const;
/**
* Format the value of the setting associated with this object.
* @param buf The before of the buffer to format into.
* @param last The end of the buffer to format into.
* @param object The object the setting is in.
*/
virtual void FormatValue(char *buf, const char *last, const void *object) const = 0;
/**
* Parse/read the value from the Ini item into the setting associated with this object.
* @param item The Ini item with the content of this setting.
* @param object The object the setting is in.
*/
virtual void ParseValue(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.
* It might be that determining whether the value is the same is way more expensive than just
* writing the value. In those cases this function may unconditionally return false even though
* the value might be the same as in the Ini item.
* @param item The Ini item with the content of this setting.
* @param object The object the setting is in.
* @return True if the value is definitely the same (might be false when the same).
*/
virtual bool IsSameValue(const IniItem *item, void *object) const = 0;
};
/** Base integer type, including boolean, settings. Only these are shown in the settings UI. */
struct IntSettingDesc : SettingDesc {
IntSettingDesc(SaveLoad save, const char *name, SettingGuiFlag flags, SettingDescType cmd, bool startup, int32 def,
int32 min, uint32 max, int32 interval, StringID str, StringID str_help, StringID str_val,
SettingCategory cat, OnChange *proc) :
SettingDesc(save, name, flags, cmd, startup), def(def), min(min), max(max), interval(interval),
str(str), str_help(str_help), str_val(str_val), cat(cat), proc(proc) {}
virtual ~IntSettingDesc() {}
int32 def; ///< default value given when none is present
int32 min; ///< minimum values
uint32 max; ///< maximum values
int32 interval; ///< the interval to use between settings in the 'settings' window. If interval is '0' the interval is dynamically determined
StringID str; ///< (translated) string with descriptive text; gui and console
StringID str_help; ///< (Translated) string with help text; gui only.
StringID str_val; ///< (Translated) first string describing the value.
SettingCategory cat; ///< assigned categories of the setting
OnChange *proc; ///< callback procedure for when the value is changed
void ChangeValue(const void *object, int32 newvalue) const;
void Write_ValidateSetting(const void *object, int32 value) const;
virtual size_t ParseValue(const char *str) const;
void FormatValue(char *buf, const char *last, const void *object) const override;
void ParseValue(const IniItem *item, void *object) const override;
bool IsSameValue(const IniItem *item, void *object) const override;
};
/** Boolean setting. */
struct BoolSettingDesc : IntSettingDesc {
BoolSettingDesc(SaveLoad save, const char *name, SettingGuiFlag flags, SettingDescType cmd, bool startup, bool def,
StringID str, StringID str_help, StringID str_val, SettingCategory cat, OnChange *proc) :
IntSettingDesc(save, name, flags, cmd, startup, def, 0, 1, 0, str, str_help, str_val, cat, proc) {}
virtual ~BoolSettingDesc() {}
size_t ParseValue(const char *str) const override;
void FormatValue(char *buf, const char *last, const void *object) const override;
};
/** One of many setting. */
struct OneOfManySettingDesc : IntSettingDesc {
OneOfManySettingDesc(SaveLoad save, const char *name, SettingGuiFlag flags, SettingDescType cmd, bool startup,
int32 def, int32 max, StringID str, StringID str_help, StringID str_val, SettingCategory cat, OnChange *proc,
std::initializer_list<const char *> many, OnConvert *many_cnvt) :
IntSettingDesc(save, name, flags, cmd, startup, def, 0, max, 0, str, str_help, str_val, cat, proc), many_cnvt(many_cnvt)
{
for (auto one : many) this->many.push_back(one);
}
virtual ~OneOfManySettingDesc() {}
std::vector<std::string> many; ///< possible values for this type
OnConvert *many_cnvt; ///< callback procedure when loading value mechanism fails
static size_t ParseSingleValue(const char *str, size_t len, const std::vector<std::string> &many);
char *FormatSingleValue(char *buf, const char *last, uint id) const;
size_t ParseValue(const char *str) const override;
void FormatValue(char *buf, const char *last, const void *object) const override;
};
/** Many of many setting. */
struct ManyOfManySettingDesc : OneOfManySettingDesc {
ManyOfManySettingDesc(SaveLoad save, const char *name, SettingGuiFlag flags, SettingDescType cmd, bool startup,
int32 def, StringID str, StringID str_help, StringID str_val, SettingCategory cat, OnChange *proc,
std::initializer_list<const char *> many, OnConvert *many_cnvt) :
OneOfManySettingDesc(save, name, flags, cmd, startup, def, (1 << many.size()) - 1, str, str_help,
str_val, cat, proc, many, many_cnvt) {}
virtual ~ManyOfManySettingDesc() {}
size_t ParseValue(const char *str) const override;
void FormatValue(char *buf, const char *last, const void *object) const override;
};
/** String settings. */
struct StringSettingDesc : SettingDesc {
StringSettingDesc(SaveLoad save, const char *name, SettingGuiFlag flags, SettingDescType cmd, bool startup, const char *def,
uint32 max_length, OnChange proc) :
SettingDesc(save, name, flags, cmd, startup), def(def), max_length(max_length), proc(proc) {}
virtual ~StringSettingDesc() {}
const char *def; ///< default value given when none is present
uint32 max_length; ///< maximum length of the string, 0 means no maximum length
OnChange *proc; ///< callback procedure for when the value is changed
void ChangeValue(const void *object, const char *newval) const;
void Write_ValidateSetting(const void *object, const char *str) const;
void FormatValue(char *buf, const char *last, const void *object) const override;
void ParseValue(const IniItem *item, void *object) const override;
bool IsSameValue(const IniItem *item, void *object) const override;
const std::string &Read(const void *object) const;
};
/** List/array settings. */
struct ListSettingDesc : SettingDesc {
ListSettingDesc(SaveLoad save, const char *name, SettingGuiFlag flags, SettingDescType cmd, bool startup, const char *def) :
SettingDesc(save, name, flags, cmd, startup), def(def) {}
virtual ~ListSettingDesc() {}
const char *def; ///< default value given when none is present
void FormatValue(char *buf, const char *last, const void *object) const override;
void ParseValue(const IniItem *item, void *object) const override;
bool IsSameValue(const IniItem *item, void *object) const override;
};
/** Placeholder for settings that have been removed, but might still linger in the savegame. */
struct NullSettingDesc : SettingDesc {
NullSettingDesc(SaveLoad save) :
SettingDesc(save, "", SGF_NONE, SDT_NULL, false) {}
virtual ~NullSettingDesc() {}
void FormatValue(char *buf, const char *last, const void *object) const override { NOT_REACHED(); }
void ParseValue(const IniItem *item, void *object) const override { NOT_REACHED(); }
bool IsSameValue(const IniItem *item, void *object) const override { NOT_REACHED(); }
};
typedef std::initializer_list<std::unique_ptr<const SettingDesc>> SettingTable;
const SettingDesc *GetSettingFromName(const char *name);
bool SetSettingValue(const IntSettingDesc *sd, int32 value, bool force_newgame = false);
bool SetSettingValue(const StringSettingDesc *sd, const char *value, bool force_newgame = false);
uint GetSettingIndex(const SettingDesc *sd);
#endif /* SETTINGS_INTERNAL_H */
|