summaryrefslogtreecommitdiff
path: root/settings.h
diff options
context:
space:
mode:
authorDarkvater <Darkvater@openttd.org>2006-03-01 23:53:20 +0000
committerDarkvater <Darkvater@openttd.org>2006-03-01 23:53:20 +0000
commitf5b51b1cb99f114248187d8ca680d4d8c8ff7b6b (patch)
treee944f27325635c837de8daa350f4401f58e0b6d0 /settings.h
parent8e8bd459a6b030e78844d0864375e85b8bb47390 (diff)
downloadopenttd-f5b51b1cb99f114248187d8ca680d4d8c8ff7b6b.tar.xz
(svn r3719) - [1/4] Present the game with a unified structure for the configuration-ini, saveload, console and gui representations of the settings. This first part rewrites the configuration section to use the SaveLoad VarType in general.
- This unified structure consists of a SaveLoad type which stores all data relevant about the variable internals such as type, mem/filesize, address, version-control. The SettingDesc type is concerned more about the representation. Things like default value, string-name, minimum/maximum values, gui-behaviour etc. - The SaveLoad type has received a few flags controlling saving/loading. These are: SLF_SAVE_NO: the setting is not saved with the savegame, effectively making this setting player-based. Eg. it will NOT be overwritten when joining a network-game SLF_CONFIG_NO: the setting is not saved to the configuration file so you cannot overwrite it ingame. SLF_NETWORK_NO: the setting is not synchronised with the local settings when the game is loaded during network-play. Note that when SLF_SAVE_NO is set, SLF_NETWORK_NO is also set (which is logical), at least if the proper macros are used (in [2/4]). - NOTE! The game is not compilable after this commit.
Diffstat (limited to 'settings.h')
-rw-r--r--settings.h106
1 files changed, 61 insertions, 45 deletions
diff --git a/settings.h b/settings.h
index aaf27cda4..4486c7568 100644
--- a/settings.h
+++ b/settings.h
@@ -3,60 +3,76 @@
#ifndef SETTINGS_H
#define SETTINGS_H
-/* Convention/Type of settings. This will be merged mostly with the SaveLoad
- * SLE_ enums. So it looks a bit strange. The layout is as follows:
- * bits 0-7: the type (size) of the variable. Eg int8, uint8, bool, etc. Same as VarTypes
- * bits 8-15: the generic variable type. Eg string, oneofmany, number, intlist
- * bits 16-31: the size of a string, an intlist (which is an implicit array). */
-/* XXX - the GenericType will NOT be shifted in the final implementation, just for compatility */
+#include "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 SettingDescBase */
enum SettingDescType {
/* 4 bytes allocated a maximum of 16 types for GenericType */
- SDT_NUMX = 0 << 8, // value must be 0!!, refers to any number-type
- SDT_BOOLX = 1 << 8, // a boolean number
- SDT_ONEOFMANY = 2 << 8, // bitmasked number where only ONE bit may be set
- SDT_MANYOFMANY = 3 << 8, // bitmasked number where MULTIPLE bits may be set
- SDT_INTLIST = 4 << 8, // list of integers seperated by a comma ','
- SDT_STRING = 5 << 8, // string which is only a pointer, so needs dynamic allocation
- SDT_STRINGBUF = 6 << 8, // string with a fixed length, preset buffer
- SDT_STRINGQUOT = 7 << 8, // string with quotation marks around it (enables spaces in string)
- SDT_CHAR = 8 << 8, // single character
- /* 7 more possible primitives */
+ 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 seperated by a comma ','
+ SDT_STRING = 5, // string with a pre-allocated buffer
+ /* 10 more possible primitives */
+};
- /* 4 bytes allocated a maximum of 16 types for NumberType */
- SDT_INT8 = 0 << 4,
- SDT_UINT8 = 1 << 4,
- SDT_INT16 = 2 << 4,
- SDT_UINT16 = 3 << 4,
- SDT_INT32 = 4 << 4,
- SDT_UINT32 = 5 << 4,
- SDT_INT64 = 6 << 4,
- SDT_UINT64 = 7 << 4,
- /* 8 more possible primitives */
+enum SettingGuiFlag {
+ /* 8 bytes allocated for a maximum of 8 flags
+ * Flags directing saving/loading of a variable */
+ SGF_0ISDISABLED = 1 << 0, ///< a value of zero means the feature is disabled
+ SGF_NOCOMMA = 1 << 1, ///< number without any thousand seperators (no formatting)
+ 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
+ /* 3 more possible flags */
+};
- /* Shortcut values */
- SDT_BOOL = SDT_BOOLX | SDT_UINT8,
- SDT_UINT = SDT_UINT32,
- SDT_INT = SDT_INT32,
- SDT_STR = SDT_STRING,
- SDT_STRB = SDT_STRINGBUF,
- SDT_STRQ = SDT_STRINGQUOT,
+typedef int32 OnChange(int32 var);
+typedef byte SettingDescType;
+typedef byte SettingGuiFlag;
- /* The value is read from the configuration file but not saved */
- SDT_NOSAVE = 1 << 31,
-};
+typedef struct SettingDescBase {
+ const char *name; ///< name of the setting. Used in configuration file and for console
+ const void *def; ///< default value given when none is present
+ SettingDescType cmd; ///< various flags for the variable
+ SettingGuiFlag flags; ///< handles how a setting would show up in the GUI (text/currency, etc.)
+ int32 min, max; ///< minimum and maximum values
+ const char *many; ///< ONE/MANY_OF_MANY: string of possible values for this type
+ StringID str; ///< (translated) string with descriptive text; gui and console
+ OnChange *proc; ///< callback procedure for when the value is changed
+} SettingDescBase;
+
+typedef struct SettingDesc {
+ SettingDescBase desc; ///, Settings structure (going to configuration file)
+ SaveLoad save; ///< Internal structure (going to savegame, parts to config)
+} SettingDesc;
+
+/* NOTE: The only difference between SettingDesc and SettingDescGlob is
+ * that one uses global variables as a source and the other offsets
+ * in a struct which are bound to a certain variable during runtime.
+ * The only way to differentiate between these two is to check if an object
+ * has been passed to the function or not. If not, then it is a global variable
+ * and save->variable has its address, otherwise save->variable only holds the
+ * offset in a certain struct */
+typedef SettingDesc SettingDescGlobVarList;
typedef enum {
- IGT_VARIABLES = 0, // values of the form "landscape = hilly"
- IGT_LIST = 1, // a list of values, seperated by \n and terminated by the next group block
+ IGT_VARIABLES = 0, ///< values of the form "landscape = hilly"
+ IGT_LIST = 1, ///< a list of values, seperated by \n and terminated by the next group block
} IniGroupType;
-typedef struct SettingDesc {
- const char *name;
- uint32 flags;
- const void *def;
- void *ptr;
- const void *many;
-} SettingDesc;
+/** Get the address of the variable. Which one to pick depends on the object
+ * pointer. If it is NULL we are dealing with global variables so the address
+ * is taken. If non-null only the offset is stored in the union and we need
+ * to add this to the address of the object */
+static inline void *ini_get_variable(const SaveLoad *sld, const void *object)
+{
+ return (object == NULL) ? sld->address : (byte*)object + (unsigned long)sld->address;
+}
void IConsoleSetPatchSetting(const char *name, const char *value);
void IConsoleGetPatchSetting(const char *name);