shithub: choc

Download patch

ref: b39121c6a682eb8ae5efd29a875bd7c098185f04
parent: 1f5ce047ad6cb709f746b794b4a2dea9e2f89fb6
author: Simon Howard <[email protected]>
date: Thu Feb 19 19:31:09 EST 2015

Refactor config file API.

The config file API previously relied on binding config variables
using M_BindVariable() which took a void pointer. It occurred to me
that if used on a boolean variable, this would be erroneous, but the
void pointer would make it impossible to tell. Split this into
separate M_Bind{Foo}Variable() functions based on type, which allows
for proper type checking on the pointers that are passed.

Vaguely related to #509.

--- a/src/d_iwad.c
+++ b/src/d_iwad.c
@@ -332,7 +332,7 @@
     int len;
 
     // Already configured? Don't stomp on the user's choices.
-    current_path = M_GetStrVariable("gus_patch_path");
+    current_path = M_GetStringVariable("gus_patch_path");
     if (current_path != NULL && strlen(current_path) > 0)
     {
         return;
--- a/src/doom/d_main.c
+++ b/src/doom/d_main.c
@@ -359,16 +359,16 @@
     NET_BindVariables();
 #endif
 
-    M_BindVariable("mouse_sensitivity",      &mouseSensitivity);
-    M_BindVariable("sfx_volume",             &sfxVolume);
-    M_BindVariable("music_volume",           &musicVolume);
-    M_BindVariable("show_messages",          &showMessages);
-    M_BindVariable("screenblocks",           &screenblocks);
-    M_BindVariable("detaillevel",            &detailLevel);
-    M_BindVariable("snd_channels",           &snd_channels);
-    M_BindVariable("vanilla_savegame_limit", &vanilla_savegame_limit);
-    M_BindVariable("vanilla_demo_limit",     &vanilla_demo_limit);
-    M_BindVariable("show_endoom",            &show_endoom);
+    M_BindIntVariable("mouse_sensitivity",      &mouseSensitivity);
+    M_BindIntVariable("sfx_volume",             &sfxVolume);
+    M_BindIntVariable("music_volume",           &musicVolume);
+    M_BindIntVariable("show_messages",          &showMessages);
+    M_BindIntVariable("screenblocks",           &screenblocks);
+    M_BindIntVariable("detaillevel",            &detailLevel);
+    M_BindIntVariable("snd_channels",           &snd_channels);
+    M_BindIntVariable("vanilla_savegame_limit", &vanilla_savegame_limit);
+    M_BindIntVariable("vanilla_demo_limit",     &vanilla_demo_limit);
+    M_BindIntVariable("show_endoom",            &show_endoom);
 
     // Multiplayer chat macros
 
@@ -377,7 +377,7 @@
         char buf[12];
 
         M_snprintf(buf, sizeof(buf), "chatmacro%i", i);
-        M_BindVariable(buf, &chat_macros[i]);
+        M_BindStringVariable(buf, &chat_macros[i]);
     }
 }
 
--- a/src/gusconf.c
+++ b/src/gusconf.c
@@ -39,7 +39,7 @@
 } gus_config_t;
 
 char *gus_patch_path = "";
-unsigned int gus_ram_kb = 1024;
+int gus_ram_kb = 1024;
 
 static unsigned int MappingIndex(void)
 {
--- a/src/gusconf.h
+++ b/src/gusconf.h
@@ -21,7 +21,7 @@
 #include "doomtype.h"
 
 extern char *gus_patch_path;
-extern unsigned int gus_ram_kb;
+extern int gus_ram_kb;
 
 boolean GUS_WriteConfig(char *path);
 
--- a/src/heretic/d_main.c
+++ b/src/heretic/d_main.c
@@ -756,13 +756,13 @@
     M_BindMenuControls();
     M_BindMapControls();
 
-    M_BindVariable("mouse_sensitivity",      &mouseSensitivity);
-    M_BindVariable("sfx_volume",             &snd_MaxVolume);
-    M_BindVariable("music_volume",           &snd_MusicVolume);
-    M_BindVariable("screenblocks",           &screenblocks);
-    M_BindVariable("snd_channels",           &snd_Channels);
-    M_BindVariable("show_endoom",            &show_endoom);
-    M_BindVariable("graphical_startup",      &graphical_startup);
+    M_BindIntVariable("mouse_sensitivity",      &mouseSensitivity);
+    M_BindIntVariable("sfx_volume",             &snd_MaxVolume);
+    M_BindIntVariable("music_volume",           &snd_MusicVolume);
+    M_BindIntVariable("screenblocks",           &screenblocks);
+    M_BindIntVariable("snd_channels",           &snd_Channels);
+    M_BindIntVariable("show_endoom",            &show_endoom);
+    M_BindIntVariable("graphical_startup",      &graphical_startup);
 
     for (i=0; i<10; ++i)
     {
@@ -769,7 +769,7 @@
         char buf[12];
 
         M_snprintf(buf, sizeof(buf), "chatmacro%i", i);
-        M_BindVariable(buf, &chat_macros[i]);
+        M_BindStringVariable(buf, &chat_macros[i]);
     }
 }
 
--- a/src/hexen/h2_main.c
+++ b/src/hexen/h2_main.c
@@ -149,15 +149,16 @@
     key_multi_msgplayer[6] = CT_KEY_PLAYER7;
     key_multi_msgplayer[7] = CT_KEY_PLAYER8;
 
-    M_BindVariable("graphical_startup",      &graphical_startup);
-    M_BindVariable("mouse_sensitivity",      &mouseSensitivity);
-    M_BindVariable("sfx_volume",             &snd_MaxVolume);
-    M_BindVariable("music_volume",           &snd_MusicVolume);
-    M_BindVariable("messageson",             &messageson);
-    M_BindVariable("screenblocks",           &screenblocks);
-    M_BindVariable("snd_channels",           &snd_Channels);
-    M_BindVariable("savedir",                &SavePath);
+    M_BindIntVariable("graphical_startup",      &graphical_startup);
+    M_BindIntVariable("mouse_sensitivity",      &mouseSensitivity);
+    M_BindIntVariable("sfx_volume",             &snd_MaxVolume);
+    M_BindIntVariable("music_volume",           &snd_MusicVolume);
+    M_BindIntVariable("messageson",             &messageson);
+    M_BindIntVariable("screenblocks",           &screenblocks);
+    M_BindIntVariable("snd_channels",           &snd_Channels);
 
+    M_BindStringVariable("savedir", &SavePath);
+
     // Multiplayer chat macros
 
     for (i=0; i<10; ++i)
@@ -165,7 +166,7 @@
         char buf[12];
 
         M_snprintf(buf, sizeof(buf), "chatmacro%i", i);
-        M_BindVariable(buf, &chat_macros[i]);
+        M_BindStringVariable(buf, &chat_macros[i]);
     }
 }
 
--- a/src/i_joystick.c
+++ b/src/i_joystick.c
@@ -328,20 +328,20 @@
 {
     int i;
 
-    M_BindVariable("use_joystick",          &usejoystick);
-    M_BindVariable("joystick_index",        &joystick_index);
-    M_BindVariable("joystick_x_axis",       &joystick_x_axis);
-    M_BindVariable("joystick_y_axis",       &joystick_y_axis);
-    M_BindVariable("joystick_strafe_axis",  &joystick_strafe_axis);
-    M_BindVariable("joystick_x_invert",     &joystick_x_invert);
-    M_BindVariable("joystick_y_invert",     &joystick_y_invert);
-    M_BindVariable("joystick_strafe_invert",&joystick_strafe_invert);
+    M_BindIntVariable("use_joystick",          &usejoystick);
+    M_BindIntVariable("joystick_index",        &joystick_index);
+    M_BindIntVariable("joystick_x_axis",       &joystick_x_axis);
+    M_BindIntVariable("joystick_y_axis",       &joystick_y_axis);
+    M_BindIntVariable("joystick_strafe_axis",  &joystick_strafe_axis);
+    M_BindIntVariable("joystick_x_invert",     &joystick_x_invert);
+    M_BindIntVariable("joystick_y_invert",     &joystick_y_invert);
+    M_BindIntVariable("joystick_strafe_invert",&joystick_strafe_invert);
 
     for (i = 0; i < NUM_VIRTUAL_BUTTONS; ++i)
     {
         char name[32];
         M_snprintf(name, sizeof(name), "joystick_physical_button%i", i);
-        M_BindVariable(name, &joystick_physical_buttons[i]);
+        M_BindIntVariable(name, &joystick_physical_buttons[i]);
     }
 }
 
--- a/src/i_sound.c
+++ b/src/i_sound.c
@@ -434,25 +434,25 @@
     extern int use_libsamplerate;
     extern float libsamplerate_scale;
 
-    M_BindVariable("snd_musicdevice",   &snd_musicdevice);
-    M_BindVariable("snd_sfxdevice",     &snd_sfxdevice);
-    M_BindVariable("snd_sbport",        &snd_sbport);
-    M_BindVariable("snd_sbirq",         &snd_sbirq);
-    M_BindVariable("snd_sbdma",         &snd_sbdma);
-    M_BindVariable("snd_mport",         &snd_mport);
-    M_BindVariable("snd_maxslicetime_ms", &snd_maxslicetime_ms);
-    M_BindVariable("snd_musiccmd",      &snd_musiccmd);
-    M_BindVariable("snd_samplerate",    &snd_samplerate);
-    M_BindVariable("snd_cachesize",     &snd_cachesize);
-    M_BindVariable("opl_io_port",       &opl_io_port);
+    M_BindIntVariable("snd_musicdevice",         &snd_musicdevice);
+    M_BindIntVariable("snd_sfxdevice",           &snd_sfxdevice);
+    M_BindIntVariable("snd_sbport",              &snd_sbport);
+    M_BindIntVariable("snd_sbirq",               &snd_sbirq);
+    M_BindIntVariable("snd_sbdma",               &snd_sbdma);
+    M_BindIntVariable("snd_mport",               &snd_mport);
+    M_BindIntVariable("snd_maxslicetime_ms",     &snd_maxslicetime_ms);
+    M_BindStringVariable("snd_musiccmd",         &snd_musiccmd);
+    M_BindIntVariable("snd_samplerate",          &snd_samplerate);
+    M_BindIntVariable("snd_cachesize",           &snd_cachesize);
+    M_BindIntVariable("opl_io_port",             &opl_io_port);
 
-    M_BindVariable("timidity_cfg_path", &timidity_cfg_path);
-    M_BindVariable("gus_patch_path",    &gus_patch_path);
-    M_BindVariable("gus_ram_kb",        &gus_ram_kb);
+    M_BindStringVariable("timidity_cfg_path",    &timidity_cfg_path);
+    M_BindStringVariable("gus_patch_path",       &gus_patch_path);
+    M_BindIntVariable("gus_ram_kb",              &gus_ram_kb);
 
 #ifdef FEATURE_SOUND
-    M_BindVariable("use_libsamplerate",   &use_libsamplerate);
-    M_BindVariable("libsamplerate_scale", &libsamplerate_scale);
+    M_BindIntVariable("use_libsamplerate",       &use_libsamplerate);
+    M_BindFloatVariable("libsamplerate_scale",   &libsamplerate_scale);
 #endif
 
     // Before SDL_mixer version 1.2.11, MIDI music caused the game
--- a/src/i_video.c
+++ b/src/i_video.c
@@ -2161,23 +2161,23 @@
 
 void I_BindVideoVariables(void)
 {
-    M_BindVariable("use_mouse",                 &usemouse);
-    M_BindVariable("autoadjust_video_settings", &autoadjust_video_settings);
-    M_BindVariable("fullscreen",                &fullscreen);
-    M_BindVariable("aspect_ratio_correct",      &aspect_ratio_correct);
-    M_BindVariable("startup_delay",             &startup_delay);
-    M_BindVariable("screen_width",              &screen_width);
-    M_BindVariable("screen_height",             &screen_height);
-    M_BindVariable("screen_bpp",                &screen_bpp);
-    M_BindVariable("grabmouse",                 &grabmouse);
-    M_BindVariable("mouse_acceleration",        &mouse_acceleration);
-    M_BindVariable("mouse_threshold",           &mouse_threshold);
-    M_BindVariable("video_driver",              &video_driver);
-    M_BindVariable("window_position",           &window_position);
-    M_BindVariable("usegamma",                  &usegamma);
-    M_BindVariable("vanilla_keyboard_mapping",  &vanilla_keyboard_mapping);
-    M_BindVariable("novert",                    &novert);
-    M_BindVariable("png_screenshots",           &png_screenshots);
+    M_BindIntVariable("use_mouse",                 &usemouse);
+    M_BindIntVariable("autoadjust_video_settings", &autoadjust_video_settings);
+    M_BindIntVariable("fullscreen",                &fullscreen);
+    M_BindIntVariable("aspect_ratio_correct",      &aspect_ratio_correct);
+    M_BindIntVariable("startup_delay",             &startup_delay);
+    M_BindIntVariable("screen_width",              &screen_width);
+    M_BindIntVariable("screen_height",             &screen_height);
+    M_BindIntVariable("screen_bpp",                &screen_bpp);
+    M_BindIntVariable("grabmouse",                 &grabmouse);
+    M_BindFloatVariable("mouse_acceleration",      &mouse_acceleration);
+    M_BindIntVariable("mouse_threshold",           &mouse_threshold);
+    M_BindStringVariable("video_driver",           &video_driver);
+    M_BindStringVariable("window_position",        &window_position);
+    M_BindIntVariable("usegamma",                  &usegamma);
+    M_BindIntVariable("vanilla_keyboard_mapping",  &vanilla_keyboard_mapping);
+    M_BindIntVariable("novert",                    &novert);
+    M_BindIntVariable("png_screenshots",           &png_screenshots);
 
     // Windows Vista or later?  Set screen color depth to
     // 32 bits per pixel, as 8-bit palettized screen modes
--- a/src/m_config.c
+++ b/src/m_config.c
@@ -23,6 +23,7 @@
 #include <string.h>
 #include <ctype.h>
 #include <errno.h>
+#include <assert.h>
 
 #include "config.h"
 
@@ -64,7 +65,11 @@
     char *name;
 
     // Pointer to the location in memory of the variable
-    void *location;
+    union {
+        int *i;
+        char **s;
+        float *f;
+    } location;
 
     // Type of the variable
     default_type_t type;
@@ -93,7 +98,7 @@
 } default_collection_t;
 
 #define CONFIG_VARIABLE_GENERIC(name, type) \
-    { #name, NULL, type, 0, 0, false }
+    { #name, {NULL}, type, 0, 0, false }
 
 #define CONFIG_VARIABLE_KEY(name) \
     CONFIG_VARIABLE_GENERIC(name, DEFAULT_KEY)
@@ -1646,7 +1651,7 @@
                 // the possibility of screwing up the user's config
                 // file
                 
-                v = * (int *) defaults[i].location;
+                v = *defaults[i].location.i;
 
                 if (v == KEY_RSHIFT)
                 {
@@ -1687,19 +1692,19 @@
                 break;
 
             case DEFAULT_INT:
-	        fprintf(f, "%i", * (int *) defaults[i].location);
+	        fprintf(f, "%i", *defaults[i].location.i);
                 break;
 
             case DEFAULT_INT_HEX:
-	        fprintf(f, "0x%x", * (int *) defaults[i].location);
+	        fprintf(f, "0x%x", *defaults[i].location.i);
                 break;
 
             case DEFAULT_FLOAT:
-                fprintf(f, "%f", * (float *) defaults[i].location);
+                fprintf(f, "%f", *defaults[i].location.f);
                 break;
 
             case DEFAULT_STRING:
-	        fprintf(f,"\"%s\"", * (char **) (defaults[i].location));
+	        fprintf(f,"\"%s\"", *defaults[i].location.s);
                 break;
         }
 
@@ -1732,12 +1737,12 @@
     switch (def->type)
     {
         case DEFAULT_STRING:
-            * (char **) def->location = M_StringDuplicate(value);
+            *def->location.s = M_StringDuplicate(value);
             break;
 
         case DEFAULT_INT:
         case DEFAULT_INT_HEX:
-            * (int *) def->location = ParseIntParameter(value);
+            *def->location.i = ParseIntParameter(value);
             break;
 
         case DEFAULT_KEY:
@@ -1757,11 +1762,11 @@
             }
 
             def->original_translated = intparm;
-            * (int *) def->location = intparm;
+            *def->location.i = intparm;
             break;
 
         case DEFAULT_FLOAT:
-            * (float *) def->location = (float) atof(value);
+            *def->location.f = (float) atof(value);
             break;
     }
 }
@@ -1957,16 +1962,41 @@
 // Bind a variable to a given configuration file variable, by name.
 //
 
-void M_BindVariable(char *name, void *location)
+void M_BindIntVariable(char *name, int *location)
 {
     default_t *variable;
 
     variable = GetDefaultForName(name);
+    assert(variable->type == DEFAULT_INT
+        || variable->type == DEFAULT_INT_HEX
+        || variable->type == DEFAULT_KEY);
 
-    variable->location = location;
+    variable->location.i = location;
     variable->bound = true;
 }
 
+void M_BindFloatVariable(char *name, float *location)
+{
+    default_t *variable;
+
+    variable = GetDefaultForName(name);
+    assert(variable->type == DEFAULT_FLOAT);
+
+    variable->location.f = location;
+    variable->bound = true;
+}
+
+void M_BindStringVariable(char *name, char **location)
+{
+    default_t *variable;
+
+    variable = GetDefaultForName(name);
+    assert(variable->type == DEFAULT_STRING);
+
+    variable->location.s = location;
+    variable->bound = true;
+}
+
 // Set the value of a particular variable; an API function for other
 // parts of the program to assign values to config variables by name.
 
@@ -2000,10 +2030,10 @@
         return 0;
     }
 
-    return *((int *) variable->location);
+    return *variable->location.i;
 }
 
-const char *M_GetStrVariable(char *name)
+const char *M_GetStringVariable(char *name)
 {
     default_t *variable;
 
@@ -2015,7 +2045,7 @@
         return NULL;
     }
 
-    return *((const char **) variable->location);
+    return *variable->location.s;
 }
 
 float M_GetFloatVariable(char *name)
@@ -2030,7 +2060,7 @@
         return 0;
     }
 
-    return *((float *) variable->location);
+    return *variable->location.f;
 }
 
 // Get the path to the default configuration dir to use, if NULL
--- a/src/m_config.h
+++ b/src/m_config.h
@@ -26,10 +26,12 @@
 void M_SaveDefaults(void);
 void M_SaveDefaultsAlternate(char *main, char *extra);
 void M_SetConfigDir(char *dir);
-void M_BindVariable(char *name, void *variable);
+void M_BindIntVariable(char *name, int *variable);
+void M_BindFloatVariable(char *name, float *variable);
+void M_BindStringVariable(char *name, char **variable);
 boolean M_SetVariable(char *name, char *value);
 int M_GetIntVariable(char *name);
-const char *M_GetStrVariable(char *name);
+const char *M_GetStringVariable(char *name);
 float M_GetFloatVariable(char *name);
 void M_SetConfigFilenames(char *main_config, char *extra_config);
 char *M_GetSaveGameDir(char *iwadname);
--- a/src/m_controls.c
+++ b/src/m_controls.c
@@ -204,70 +204,70 @@
 
 void M_BindBaseControls(void)
 {
-    M_BindVariable("key_right",          &key_right);
-    M_BindVariable("key_left",           &key_left);
-    M_BindVariable("key_up",             &key_up);
-    M_BindVariable("key_down",           &key_down);
-    M_BindVariable("key_strafeleft",     &key_strafeleft);
-    M_BindVariable("key_straferight",    &key_straferight);
-    M_BindVariable("key_fire",           &key_fire);
-    M_BindVariable("key_use",            &key_use);
-    M_BindVariable("key_strafe",         &key_strafe);
-    M_BindVariable("key_speed",          &key_speed);
+    M_BindIntVariable("key_right",          &key_right);
+    M_BindIntVariable("key_left",           &key_left);
+    M_BindIntVariable("key_up",             &key_up);
+    M_BindIntVariable("key_down",           &key_down);
+    M_BindIntVariable("key_strafeleft",     &key_strafeleft);
+    M_BindIntVariable("key_straferight",    &key_straferight);
+    M_BindIntVariable("key_fire",           &key_fire);
+    M_BindIntVariable("key_use",            &key_use);
+    M_BindIntVariable("key_strafe",         &key_strafe);
+    M_BindIntVariable("key_speed",          &key_speed);
 
-    M_BindVariable("mouseb_fire",        &mousebfire);
-    M_BindVariable("mouseb_strafe",      &mousebstrafe);
-    M_BindVariable("mouseb_forward",     &mousebforward);
+    M_BindIntVariable("mouseb_fire",        &mousebfire);
+    M_BindIntVariable("mouseb_strafe",      &mousebstrafe);
+    M_BindIntVariable("mouseb_forward",     &mousebforward);
 
-    M_BindVariable("joyb_fire",          &joybfire);
-    M_BindVariable("joyb_strafe",        &joybstrafe);
-    M_BindVariable("joyb_use",           &joybuse);
-    M_BindVariable("joyb_speed",         &joybspeed);
+    M_BindIntVariable("joyb_fire",          &joybfire);
+    M_BindIntVariable("joyb_strafe",        &joybstrafe);
+    M_BindIntVariable("joyb_use",           &joybuse);
+    M_BindIntVariable("joyb_speed",         &joybspeed);
 
-    M_BindVariable("joyb_menu_activate", &joybmenu);
+    M_BindIntVariable("joyb_menu_activate", &joybmenu);
 
     // Extra controls that are not in the Vanilla versions:
 
-    M_BindVariable("joyb_strafeleft",    &joybstrafeleft);
-    M_BindVariable("joyb_straferight",   &joybstraferight);
-    M_BindVariable("mouseb_strafeleft",  &mousebstrafeleft);
-    M_BindVariable("mouseb_straferight", &mousebstraferight);
-    M_BindVariable("mouseb_use",         &mousebuse);
-    M_BindVariable("mouseb_backward",    &mousebbackward);
-    M_BindVariable("dclick_use",         &dclick_use);
-    M_BindVariable("key_pause",          &key_pause);
-    M_BindVariable("key_message_refresh", &key_message_refresh);
+    M_BindIntVariable("joyb_strafeleft",     &joybstrafeleft);
+    M_BindIntVariable("joyb_straferight",    &joybstraferight);
+    M_BindIntVariable("mouseb_strafeleft",   &mousebstrafeleft);
+    M_BindIntVariable("mouseb_straferight",  &mousebstraferight);
+    M_BindIntVariable("mouseb_use",          &mousebuse);
+    M_BindIntVariable("mouseb_backward",     &mousebbackward);
+    M_BindIntVariable("dclick_use",          &dclick_use);
+    M_BindIntVariable("key_pause",           &key_pause);
+    M_BindIntVariable("key_message_refresh", &key_message_refresh);
 }
 
 void M_BindHereticControls(void)
 {
-    M_BindVariable("key_flyup",          &key_flyup);
-    M_BindVariable("key_flydown",        &key_flydown);
-    M_BindVariable("key_flycenter",      &key_flycenter);
+    M_BindIntVariable("key_flyup",          &key_flyup);
+    M_BindIntVariable("key_flydown",        &key_flydown);
+    M_BindIntVariable("key_flycenter",      &key_flycenter);
 
-    M_BindVariable("key_lookup",         &key_lookup);
-    M_BindVariable("key_lookdown",       &key_lookdown);
-    M_BindVariable("key_lookcenter",     &key_lookcenter);
+    M_BindIntVariable("key_lookup",         &key_lookup);
+    M_BindIntVariable("key_lookdown",       &key_lookdown);
+    M_BindIntVariable("key_lookcenter",     &key_lookcenter);
 
-    M_BindVariable("key_invleft",        &key_invleft);
-    M_BindVariable("key_invright",       &key_invright);
-    M_BindVariable("key_useartifact",    &key_useartifact);
+    M_BindIntVariable("key_invleft",        &key_invleft);
+    M_BindIntVariable("key_invright",       &key_invright);
+    M_BindIntVariable("key_useartifact",    &key_useartifact);
 }
 
 void M_BindHexenControls(void)
 {
-    M_BindVariable("key_jump",           &key_jump);
-    M_BindVariable("mouseb_jump",        &mousebjump);
-    M_BindVariable("joyb_jump",          &joybjump);
+    M_BindIntVariable("key_jump",           &key_jump);
+    M_BindIntVariable("mouseb_jump",        &mousebjump);
+    M_BindIntVariable("joyb_jump",          &joybjump);
 
-    M_BindVariable("key_arti_all",             &key_arti_all);
-    M_BindVariable("key_arti_health",          &key_arti_health);
-    M_BindVariable("key_arti_poisonbag",       &key_arti_poisonbag);
-    M_BindVariable("key_arti_blastradius",     &key_arti_blastradius);
-    M_BindVariable("key_arti_teleport",        &key_arti_teleport);
-    M_BindVariable("key_arti_teleportother",   &key_arti_teleportother);
-    M_BindVariable("key_arti_egg",             &key_arti_egg);
-    M_BindVariable("key_arti_invulnerability", &key_arti_invulnerability);
+    M_BindIntVariable("key_arti_all",             &key_arti_all);
+    M_BindIntVariable("key_arti_health",          &key_arti_health);
+    M_BindIntVariable("key_arti_poisonbag",       &key_arti_poisonbag);
+    M_BindIntVariable("key_arti_blastradius",     &key_arti_blastradius);
+    M_BindIntVariable("key_arti_teleport",        &key_arti_teleport);
+    M_BindIntVariable("key_arti_teleportother",   &key_arti_teleportother);
+    M_BindIntVariable("key_arti_egg",             &key_arti_egg);
+    M_BindIntVariable("key_arti_invulnerability", &key_arti_invulnerability);
 }
 
 void M_BindStrifeControls(void)
@@ -282,95 +282,95 @@
     key_invleft  = KEY_INS;
     key_invright = KEY_DEL;
 
-    M_BindVariable("key_jump",           &key_jump);
-    M_BindVariable("key_lookUp",         &key_lookup);
-    M_BindVariable("key_lookDown",       &key_lookdown);
-    M_BindVariable("key_invLeft",        &key_invleft);
-    M_BindVariable("key_invRight",       &key_invright);
+    M_BindIntVariable("key_jump",           &key_jump);
+    M_BindIntVariable("key_lookUp",         &key_lookup);
+    M_BindIntVariable("key_lookDown",       &key_lookdown);
+    M_BindIntVariable("key_invLeft",        &key_invleft);
+    M_BindIntVariable("key_invRight",       &key_invright);
 
     // Custom Strife-only Keys:
-    M_BindVariable("key_useHealth",      &key_usehealth);
-    M_BindVariable("key_invquery",       &key_invquery);
-    M_BindVariable("key_mission",        &key_mission);
-    M_BindVariable("key_invPop",         &key_invpop);
-    M_BindVariable("key_invKey",         &key_invkey);
-    M_BindVariable("key_invHome",        &key_invhome);
-    M_BindVariable("key_invEnd",         &key_invend);
-    M_BindVariable("key_invUse",         &key_invuse);
-    M_BindVariable("key_invDrop",        &key_invdrop);
+    M_BindIntVariable("key_useHealth",      &key_usehealth);
+    M_BindIntVariable("key_invquery",       &key_invquery);
+    M_BindIntVariable("key_mission",        &key_mission);
+    M_BindIntVariable("key_invPop",         &key_invpop);
+    M_BindIntVariable("key_invKey",         &key_invkey);
+    M_BindIntVariable("key_invHome",        &key_invhome);
+    M_BindIntVariable("key_invEnd",         &key_invend);
+    M_BindIntVariable("key_invUse",         &key_invuse);
+    M_BindIntVariable("key_invDrop",        &key_invdrop);
 
     // Strife also supports jump on mouse and joystick, and in the exact same
     // manner as Hexen!
-    M_BindVariable("mouseb_jump",        &mousebjump);
-    M_BindVariable("joyb_jump",          &joybjump);
+    M_BindIntVariable("mouseb_jump",        &mousebjump);
+    M_BindIntVariable("joyb_jump",          &joybjump);
 }
 
 void M_BindWeaponControls(void)
 {
-    M_BindVariable("key_weapon1",        &key_weapon1);
-    M_BindVariable("key_weapon2",        &key_weapon2);
-    M_BindVariable("key_weapon3",        &key_weapon3);
-    M_BindVariable("key_weapon4",        &key_weapon4);
-    M_BindVariable("key_weapon5",        &key_weapon5);
-    M_BindVariable("key_weapon6",        &key_weapon6);
-    M_BindVariable("key_weapon7",        &key_weapon7);
-    M_BindVariable("key_weapon8",        &key_weapon8);
+    M_BindIntVariable("key_weapon1",        &key_weapon1);
+    M_BindIntVariable("key_weapon2",        &key_weapon2);
+    M_BindIntVariable("key_weapon3",        &key_weapon3);
+    M_BindIntVariable("key_weapon4",        &key_weapon4);
+    M_BindIntVariable("key_weapon5",        &key_weapon5);
+    M_BindIntVariable("key_weapon6",        &key_weapon6);
+    M_BindIntVariable("key_weapon7",        &key_weapon7);
+    M_BindIntVariable("key_weapon8",        &key_weapon8);
 
-    M_BindVariable("key_prevweapon",     &key_prevweapon);
-    M_BindVariable("key_nextweapon",     &key_nextweapon);
+    M_BindIntVariable("key_prevweapon",     &key_prevweapon);
+    M_BindIntVariable("key_nextweapon",     &key_nextweapon);
 
-    M_BindVariable("joyb_prevweapon",    &joybprevweapon);
-    M_BindVariable("joyb_nextweapon",    &joybnextweapon);
+    M_BindIntVariable("joyb_prevweapon",    &joybprevweapon);
+    M_BindIntVariable("joyb_nextweapon",    &joybnextweapon);
 
-    M_BindVariable("mouseb_prevweapon",  &mousebprevweapon);
-    M_BindVariable("mouseb_nextweapon",  &mousebnextweapon);
+    M_BindIntVariable("mouseb_prevweapon",  &mousebprevweapon);
+    M_BindIntVariable("mouseb_nextweapon",  &mousebnextweapon);
 }
 
 void M_BindMapControls(void)
 {
-    M_BindVariable("key_map_north",      &key_map_north);
-    M_BindVariable("key_map_south",      &key_map_south);
-    M_BindVariable("key_map_east",       &key_map_east);
-    M_BindVariable("key_map_west",       &key_map_west);
-    M_BindVariable("key_map_zoomin",     &key_map_zoomin);
-    M_BindVariable("key_map_zoomout",    &key_map_zoomout);
-    M_BindVariable("key_map_toggle",     &key_map_toggle);
-    M_BindVariable("key_map_maxzoom",    &key_map_maxzoom);
-    M_BindVariable("key_map_follow",     &key_map_follow);
-    M_BindVariable("key_map_grid",       &key_map_grid);
-    M_BindVariable("key_map_mark",       &key_map_mark);
-    M_BindVariable("key_map_clearmark",  &key_map_clearmark);
+    M_BindIntVariable("key_map_north",      &key_map_north);
+    M_BindIntVariable("key_map_south",      &key_map_south);
+    M_BindIntVariable("key_map_east",       &key_map_east);
+    M_BindIntVariable("key_map_west",       &key_map_west);
+    M_BindIntVariable("key_map_zoomin",     &key_map_zoomin);
+    M_BindIntVariable("key_map_zoomout",    &key_map_zoomout);
+    M_BindIntVariable("key_map_toggle",     &key_map_toggle);
+    M_BindIntVariable("key_map_maxzoom",    &key_map_maxzoom);
+    M_BindIntVariable("key_map_follow",     &key_map_follow);
+    M_BindIntVariable("key_map_grid",       &key_map_grid);
+    M_BindIntVariable("key_map_mark",       &key_map_mark);
+    M_BindIntVariable("key_map_clearmark",  &key_map_clearmark);
 }
 
 void M_BindMenuControls(void)
 {
-    M_BindVariable("key_menu_activate",  &key_menu_activate);
-    M_BindVariable("key_menu_up",        &key_menu_up);
-    M_BindVariable("key_menu_down",      &key_menu_down);
-    M_BindVariable("key_menu_left",      &key_menu_left);
-    M_BindVariable("key_menu_right",     &key_menu_right);
-    M_BindVariable("key_menu_back",      &key_menu_back);
-    M_BindVariable("key_menu_forward",   &key_menu_forward);
-    M_BindVariable("key_menu_confirm",   &key_menu_confirm);
-    M_BindVariable("key_menu_abort",     &key_menu_abort);
+    M_BindIntVariable("key_menu_activate",  &key_menu_activate);
+    M_BindIntVariable("key_menu_up",        &key_menu_up);
+    M_BindIntVariable("key_menu_down",      &key_menu_down);
+    M_BindIntVariable("key_menu_left",      &key_menu_left);
+    M_BindIntVariable("key_menu_right",     &key_menu_right);
+    M_BindIntVariable("key_menu_back",      &key_menu_back);
+    M_BindIntVariable("key_menu_forward",   &key_menu_forward);
+    M_BindIntVariable("key_menu_confirm",   &key_menu_confirm);
+    M_BindIntVariable("key_menu_abort",     &key_menu_abort);
 
-    M_BindVariable("key_menu_help",      &key_menu_help);
-    M_BindVariable("key_menu_save",      &key_menu_save);
-    M_BindVariable("key_menu_load",      &key_menu_load);
-    M_BindVariable("key_menu_volume",    &key_menu_volume);
-    M_BindVariable("key_menu_detail",    &key_menu_detail);
-    M_BindVariable("key_menu_qsave",     &key_menu_qsave);
-    M_BindVariable("key_menu_endgame",   &key_menu_endgame);
-    M_BindVariable("key_menu_messages",  &key_menu_messages);
-    M_BindVariable("key_menu_qload",     &key_menu_qload);
-    M_BindVariable("key_menu_quit",      &key_menu_quit);
-    M_BindVariable("key_menu_gamma",     &key_menu_gamma);
+    M_BindIntVariable("key_menu_help",      &key_menu_help);
+    M_BindIntVariable("key_menu_save",      &key_menu_save);
+    M_BindIntVariable("key_menu_load",      &key_menu_load);
+    M_BindIntVariable("key_menu_volume",    &key_menu_volume);
+    M_BindIntVariable("key_menu_detail",    &key_menu_detail);
+    M_BindIntVariable("key_menu_qsave",     &key_menu_qsave);
+    M_BindIntVariable("key_menu_endgame",   &key_menu_endgame);
+    M_BindIntVariable("key_menu_messages",  &key_menu_messages);
+    M_BindIntVariable("key_menu_qload",     &key_menu_qload);
+    M_BindIntVariable("key_menu_quit",      &key_menu_quit);
+    M_BindIntVariable("key_menu_gamma",     &key_menu_gamma);
 
-    M_BindVariable("key_menu_incscreen", &key_menu_incscreen);
-    M_BindVariable("key_menu_decscreen", &key_menu_decscreen);
-    M_BindVariable("key_menu_screenshot",&key_menu_screenshot);
-    M_BindVariable("key_demo_quit",      &key_demo_quit);
-    M_BindVariable("key_spy",            &key_spy);
+    M_BindIntVariable("key_menu_incscreen", &key_menu_incscreen);
+    M_BindIntVariable("key_menu_decscreen", &key_menu_decscreen);
+    M_BindIntVariable("key_menu_screenshot",&key_menu_screenshot);
+    M_BindIntVariable("key_demo_quit",      &key_demo_quit);
+    M_BindIntVariable("key_spy",            &key_spy);
 }
 
 void M_BindChatControls(unsigned int num_players)
@@ -378,12 +378,12 @@
     char name[32];  // haleyjd: 20 not large enough - Thank you, come again!
     unsigned int i; // haleyjd: signedness conflict
 
-    M_BindVariable("key_multi_msg",     &key_multi_msg);
+    M_BindIntVariable("key_multi_msg",     &key_multi_msg);
 
     for (i=0; i<num_players; ++i)
     {
         M_snprintf(name, sizeof(name), "key_multi_msgplayer%i", i + 1);
-        M_BindVariable(name, &key_multi_msgplayer[i]);
+        M_BindIntVariable(name, &key_multi_msgplayer[i]);
     }
 }
 
--- a/src/net_client.c
+++ b/src/net_client.c
@@ -1102,5 +1102,5 @@
 
 void NET_BindVariables(void)
 {
-    M_BindVariable("player_name", &net_player_name);
+    M_BindStringVariable("player_name", &net_player_name);
 }
--- a/src/setup/compatibility.c
+++ b/src/setup/compatibility.c
@@ -43,8 +43,8 @@
 {
     if (gamemission == doom || gamemission == strife)
     {
-        M_BindVariable("vanilla_savegame_limit", &vanilla_savegame_limit);
-        M_BindVariable("vanilla_demo_limit",     &vanilla_demo_limit);
+        M_BindIntVariable("vanilla_savegame_limit", &vanilla_savegame_limit);
+        M_BindIntVariable("vanilla_demo_limit",     &vanilla_demo_limit);
     }
 }
 
--- a/src/setup/display.c
+++ b/src/setup/display.c
@@ -700,28 +700,28 @@
 
 void BindDisplayVariables(void)
 {
-    M_BindVariable("autoadjust_video_settings", &autoadjust_video_settings);
-    M_BindVariable("aspect_ratio_correct",      &aspect_ratio_correct);
-    M_BindVariable("fullscreen",                &fullscreen);
-    M_BindVariable("screen_width",              &screen_width);
-    M_BindVariable("screen_height",             &screen_height);
-    M_BindVariable("screen_bpp",                &screen_bpp);
-    M_BindVariable("startup_delay",             &startup_delay);
-    M_BindVariable("video_driver",              &video_driver);
-    M_BindVariable("window_position",           &window_position);
-    M_BindVariable("usegamma",                  &usegamma);
-    M_BindVariable("png_screenshots",           &png_screenshots);
+    M_BindIntVariable("autoadjust_video_settings", &autoadjust_video_settings);
+    M_BindIntVariable("aspect_ratio_correct",      &aspect_ratio_correct);
+    M_BindIntVariable("fullscreen",                &fullscreen);
+    M_BindIntVariable("screen_width",              &screen_width);
+    M_BindIntVariable("screen_height",             &screen_height);
+    M_BindIntVariable("screen_bpp",                &screen_bpp);
+    M_BindIntVariable("startup_delay",             &startup_delay);
+    M_BindStringVariable("video_driver",           &video_driver);
+    M_BindStringVariable("window_position",        &window_position);
+    M_BindIntVariable("usegamma",                  &usegamma);
+    M_BindIntVariable("png_screenshots",           &png_screenshots);
 
 
     if (gamemission == doom || gamemission == heretic
      || gamemission == strife)
     {
-        M_BindVariable("show_endoom",               &show_endoom);
+        M_BindIntVariable("show_endoom",               &show_endoom);
     }
 
     if (gamemission == heretic || gamemission == hexen || gamemission == strife)
     {
-        M_BindVariable("graphical_startup",        &graphical_startup);
+        M_BindIntVariable("graphical_startup",        &graphical_startup);
     }
 
     // Windows Vista or later?  Set screen color depth to
--- a/src/setup/joystick.c
+++ b/src/setup/joystick.c
@@ -757,20 +757,20 @@
 {
     int i;
 
-    M_BindVariable("use_joystick",          &usejoystick);
-    M_BindVariable("joystick_index",        &joystick_index);
-    M_BindVariable("joystick_x_axis",       &joystick_x_axis);
-    M_BindVariable("joystick_y_axis",       &joystick_y_axis);
-    M_BindVariable("joystick_strafe_axis",  &joystick_strafe_axis);
-    M_BindVariable("joystick_x_invert",     &joystick_x_invert);
-    M_BindVariable("joystick_y_invert",     &joystick_y_invert);
-    M_BindVariable("joystick_strafe_invert",&joystick_strafe_invert);
+    M_BindIntVariable("use_joystick",           &usejoystick);
+    M_BindIntVariable("joystick_index",         &joystick_index);
+    M_BindIntVariable("joystick_x_axis",        &joystick_x_axis);
+    M_BindIntVariable("joystick_y_axis",        &joystick_y_axis);
+    M_BindIntVariable("joystick_strafe_axis",   &joystick_strafe_axis);
+    M_BindIntVariable("joystick_x_invert",      &joystick_x_invert);
+    M_BindIntVariable("joystick_y_invert",      &joystick_y_invert);
+    M_BindIntVariable("joystick_strafe_invert", &joystick_strafe_invert);
 
     for (i = 0; i < NUM_VIRTUAL_BUTTONS; ++i)
     {
         char name[32];
         M_snprintf(name, sizeof(name), "joystick_physical_button%i", i);
-        M_BindVariable(name, &joystick_physical_buttons[i]);
+        M_BindIntVariable(name, &joystick_physical_buttons[i]);
     }
 }
 
--- a/src/setup/keyboard.c
+++ b/src/setup/keyboard.c
@@ -408,5 +408,5 @@
 
 void BindKeyboardVariables(void)
 {
-    M_BindVariable("vanilla_keyboard_mapping", &vanilla_keyboard_mapping);
+    M_BindIntVariable("vanilla_keyboard_mapping", &vanilla_keyboard_mapping);
 }
--- a/src/setup/mode.c
+++ b/src/setup/mode.c
@@ -115,14 +115,14 @@
 {
     if (gamemission == doom)
     {
-        M_BindVariable("detaillevel",       &detailLevel);
-        M_BindVariable("show_messages",     &showMessages);
+        M_BindIntVariable("detaillevel",   &detailLevel);
+        M_BindIntVariable("show_messages", &showMessages);
     }
 
     if (gamemission == hexen)
     {
-        M_BindVariable("savedir",           &savedir);
-        M_BindVariable("messageson",        &showMessages);
+        M_BindStringVariable("savedir", &savedir);
+        M_BindIntVariable("messageson", &showMessages);
 
         // Hexen has a variable to control the savegame directory
         // that is used.
@@ -140,14 +140,15 @@
 
     if (gamemission == strife)
     {
-        M_BindVariable("back_flat",         &back_flat);
-        M_BindVariable("screensize"  ,      &screenblocks);
-        M_BindVariable("comport",           &comport);
-        M_BindVariable("nickname",          &nickname);
+        M_BindStringVariable("back_flat",   &back_flat);
+        M_BindStringVariable("nickname",    &nickname);
+
+        M_BindIntVariable("screensize",     &screenblocks);
+        M_BindIntVariable("comport",        &comport);
     }
     else
     {
-        M_BindVariable("screenblocks",      &screenblocks);
+        M_BindIntVariable("screenblocks",   &screenblocks);
     }
 
 }
--- a/src/setup/mouse.c
+++ b/src/setup/mouse.c
@@ -153,10 +153,10 @@
 
 void BindMouseVariables(void)
 {
-    M_BindVariable("use_mouse",            &usemouse);
-    M_BindVariable("novert",               &novert);
-    M_BindVariable("mouse_sensitivity",    &mouseSensitivity);
-    M_BindVariable("mouse_acceleration",   &mouse_acceleration);
-    M_BindVariable("mouse_threshold",      &mouse_threshold);
-    M_BindVariable("grabmouse",            &grabmouse);
+    M_BindIntVariable("use_mouse",               &usemouse);
+    M_BindIntVariable("novert",                  &novert);
+    M_BindIntVariable("grabmouse",               &grabmouse);
+    M_BindIntVariable("mouse_sensitivity",       &mouseSensitivity);
+    M_BindIntVariable("mouse_threshold",         &mouse_threshold);
+    M_BindFloatVariable("mouse_acceleration",    &mouse_acceleration);
 }
--- a/src/setup/multiplayer.c
+++ b/src/setup/multiplayer.c
@@ -1127,13 +1127,13 @@
     int i;
 
 #ifdef FEATURE_MULTIPLAYER
-    M_BindVariable("player_name", &net_player_name);
+    M_BindStringVariable("player_name", &net_player_name);
 #endif
 
     for (i=0; i<10; ++i)
     {
         M_snprintf(buf, sizeof(buf), "chatmacro%i", i);
-        M_BindVariable(buf, &chat_macros[i]);
+        M_BindStringVariable(buf, &chat_macros[i]);
     }
 
     switch (gamemission)
--- a/src/setup/sound.c
+++ b/src/setup/sound.c
@@ -81,7 +81,7 @@
 
 static char *timidity_cfg_path = NULL;
 static char *gus_patch_path = NULL;
-static unsigned int gus_ram_kb = 1024;
+static int gus_ram_kb = 1024;
 
 // DOS specific variables: these are unused but should be maintained
 // so that the config file can be shared between chocolate
@@ -297,32 +297,34 @@
 
 void BindSoundVariables(void)
 {
-    M_BindVariable("snd_sfxdevice",       &snd_sfxdevice);
-    M_BindVariable("snd_musicdevice",     &snd_musicdevice);
-    M_BindVariable("snd_channels",        &numChannels);
-    M_BindVariable("sfx_volume",          &sfxVolume);
-    M_BindVariable("music_volume",        &musicVolume);
-    M_BindVariable("snd_samplerate",      &snd_samplerate);
-    M_BindVariable("use_libsamplerate",   &use_libsamplerate);
-    M_BindVariable("libsamplerate_scale", &libsamplerate_scale);
-    M_BindVariable("timidity_cfg_path",   &timidity_cfg_path);
-    M_BindVariable("gus_patch_path",      &gus_patch_path);
-    M_BindVariable("gus_ram_kb",          &gus_ram_kb);
+    M_BindIntVariable("snd_sfxdevice",            &snd_sfxdevice);
+    M_BindIntVariable("snd_musicdevice",          &snd_musicdevice);
+    M_BindIntVariable("snd_channels",             &numChannels);
+    M_BindIntVariable("snd_samplerate",           &snd_samplerate);
+    M_BindIntVariable("sfx_volume",               &sfxVolume);
+    M_BindIntVariable("music_volume",             &musicVolume);
 
-    M_BindVariable("snd_sbport",          &snd_sbport);
-    M_BindVariable("snd_sbirq",           &snd_sbirq);
-    M_BindVariable("snd_sbdma",           &snd_sbdma);
-    M_BindVariable("snd_mport",           &snd_mport);
-    M_BindVariable("snd_maxslicetime_ms", &snd_maxslicetime_ms);
-    M_BindVariable("snd_musiccmd",        &snd_musiccmd);
+    M_BindIntVariable("use_libsamplerate",        &use_libsamplerate);
+    M_BindFloatVariable("libsamplerate_scale",    &libsamplerate_scale);
 
-    M_BindVariable("snd_cachesize",       &snd_cachesize);
-    M_BindVariable("opl_io_port",         &opl_io_port);
+    M_BindIntVariable("gus_ram_kb",               &gus_ram_kb);
+    M_BindStringVariable("gus_patch_path",        &gus_patch_path);
+    M_BindStringVariable("timidity_cfg_path",     &timidity_cfg_path);
 
+    M_BindIntVariable("snd_sbport",               &snd_sbport);
+    M_BindIntVariable("snd_sbirq",                &snd_sbirq);
+    M_BindIntVariable("snd_sbdma",                &snd_sbdma);
+    M_BindIntVariable("snd_mport",                &snd_mport);
+    M_BindIntVariable("snd_maxslicetime_ms",      &snd_maxslicetime_ms);
+    M_BindStringVariable("snd_musiccmd",          &snd_musiccmd);
+
+    M_BindIntVariable("snd_cachesize",            &snd_cachesize);
+    M_BindIntVariable("opl_io_port",              &opl_io_port);
+
     if (gamemission == strife)
     {
-        M_BindVariable("voice_volume",    &voiceVolume);
-        M_BindVariable("show_talk",       &show_talk);
+        M_BindIntVariable("voice_volume",         &voiceVolume);
+        M_BindIntVariable("show_talk",            &show_talk);
     }
 
     timidity_cfg_path = M_StringDuplicate("");
--- a/src/strife/d_main.c
+++ b/src/strife/d_main.c
@@ -431,22 +431,23 @@
     // * screenblocks -> screensize
     // * Added nickname, comport
 
-    M_BindVariable("mouse_sensitivity",      &mouseSensitivity);
-    M_BindVariable("sfx_volume",             &sfxVolume);
-    M_BindVariable("music_volume",           &musicVolume);
-    M_BindVariable("voice_volume",           &voiceVolume); 
-    M_BindVariable("show_talk",              &dialogshowtext);
-    M_BindVariable("screensize",             &screenblocks);
-    M_BindVariable("snd_channels",           &snd_channels);
-    M_BindVariable("vanilla_savegame_limit", &vanilla_savegame_limit);
-    M_BindVariable("vanilla_demo_limit",     &vanilla_demo_limit);
-    M_BindVariable("show_endoom",            &show_endoom);
-    M_BindVariable("back_flat",              &back_flat);
-    M_BindVariable("graphical_startup",      &graphical_startup);
+    M_BindIntVariable("mouse_sensitivity",      &mouseSensitivity);
+    M_BindIntVariable("sfx_volume",             &sfxVolume);
+    M_BindIntVariable("music_volume",           &musicVolume);
+    M_BindIntVariable("voice_volume",           &voiceVolume); 
+    M_BindIntVariable("show_talk",              &dialogshowtext);
+    M_BindIntVariable("screensize",             &screenblocks);
+    M_BindIntVariable("snd_channels",           &snd_channels);
+    M_BindIntVariable("vanilla_savegame_limit", &vanilla_savegame_limit);
+    M_BindIntVariable("vanilla_demo_limit",     &vanilla_demo_limit);
+    M_BindIntVariable("show_endoom",            &show_endoom);
+    M_BindIntVariable("graphical_startup",      &graphical_startup);
 
-    M_BindVariable("nickname",               &nickname);
-    M_BindVariable("comport",                &comport);
+    M_BindStringVariable("back_flat",           &back_flat);
+    M_BindStringVariable("nickname",            &nickname);
 
+    M_BindIntVariable("comport",                &comport);
+
     // Multiplayer chat macros
 
     for (i=0; i<10; ++i)
@@ -454,7 +455,7 @@
         char buf[12];
 
         M_snprintf(buf, sizeof(buf), "chatmacro%i", i);
-        M_BindVariable(buf, &chat_macros[i]);
+        M_BindStringVariable(buf, &chat_macros[i]);
     }
 }