+#define TOKEN_STR_FILE_IDENTIFIER "file_identifier"
+#define TOKEN_STR_LAST_LEVEL_SERIES "last_level_series"
+#define TOKEN_STR_PLAYER_PREFIX "player_"
+
+#define TOKEN_VALUE_POSITION 30
+
+#define SETUP_TOKEN_SOUND 0
+#define SETUP_TOKEN_SOUND_LOOPS 1
+#define SETUP_TOKEN_SOUND_MUSIC 2
+#define SETUP_TOKEN_SOUND_SIMPLE 3
+#define SETUP_TOKEN_TOONS 4
+#define SETUP_TOKEN_DOUBLE_BUFFERING 5
+#define SETUP_TOKEN_SCROLL_DELAY 6
+#define SETUP_TOKEN_SOFT_SCROLLING 7
+#define SETUP_TOKEN_FADING 8
+#define SETUP_TOKEN_AUTORECORD 9
+#define SETUP_TOKEN_QUICK_DOORS 10
+#define SETUP_TOKEN_TEAM_MODE 11
+#define SETUP_TOKEN_ALIAS_NAME 12
+
+#define SETUP_TOKEN_USE_JOYSTICK 13
+#define SETUP_TOKEN_JOY_DEVICE_NAME 14
+#define SETUP_TOKEN_JOY_XLEFT 15
+#define SETUP_TOKEN_JOY_XMIDDLE 16
+#define SETUP_TOKEN_JOY_XRIGHT 17
+#define SETUP_TOKEN_JOY_YUPPER 18
+#define SETUP_TOKEN_JOY_YMIDDLE 19
+#define SETUP_TOKEN_JOY_YLOWER 20
+#define SETUP_TOKEN_JOY_SNAP 21
+#define SETUP_TOKEN_JOY_BOMB 22
+#define SETUP_TOKEN_KEY_LEFT 23
+#define SETUP_TOKEN_KEY_RIGHT 24
+#define SETUP_TOKEN_KEY_UP 25
+#define SETUP_TOKEN_KEY_DOWN 26
+#define SETUP_TOKEN_KEY_SNAP 27
+#define SETUP_TOKEN_KEY_BOMB 28
+
+#define NUM_SETUP_TOKENS 29
+
+#define FIRST_GLOBAL_SETUP_TOKEN SETUP_TOKEN_SOUND
+#define LAST_GLOBAL_SETUP_TOKEN SETUP_TOKEN_ALIAS_NAME
+
+#define FIRST_PLAYER_SETUP_TOKEN SETUP_TOKEN_USE_JOYSTICK
+#define LAST_PLAYER_SETUP_TOKEN SETUP_TOKEN_KEY_BOMB
+
+#define TYPE_BOOLEAN 1
+#define TYPE_SWITCH 2
+#define TYPE_KEYSYM 3
+#define TYPE_INTEGER 4
+#define TYPE_STRING 5
+
+static struct SetupInfo si;
+static struct SetupInputInfo sii;
+static struct
+{
+ int type;
+ void *value;
+ char *text;
+} token_info[] =
+{
+ { TYPE_SWITCH, &si.sound, "sound" },
+ { TYPE_SWITCH, &si.sound_loops, "repeating_sound_loops" },
+ { TYPE_SWITCH, &si.sound_music, "background_music" },
+ { TYPE_SWITCH, &si.sound_simple, "simple_sound_effects" },
+ { TYPE_SWITCH, &si.toons, "toons" },
+ { TYPE_SWITCH, &si.double_buffering, "double_buffering" },
+ { TYPE_SWITCH, &si.scroll_delay, "scroll_delay" },
+ { TYPE_SWITCH, &si.soft_scrolling, "soft_scrolling" },
+ { TYPE_SWITCH, &si.fading, "screen_fading" },
+ { TYPE_SWITCH, &si.autorecord, "automatic_tape_recording" },
+ { TYPE_SWITCH, &si.quick_doors, "quick_doors" },
+ { TYPE_SWITCH, &si.team_mode, "team_mode" },
+ { TYPE_STRING, &si.alias_name, "alias_name" },
+
+ /* for each player: */
+ { TYPE_BOOLEAN, &sii.use_joystick, ".use_joystick" },
+ { TYPE_STRING, &sii.joy.device_name, ".joy.device_name" },
+ { TYPE_INTEGER, &sii.joy.xleft, ".joy.xleft" },
+ { TYPE_INTEGER, &sii.joy.xmiddle, ".joy.xmiddle" },
+ { TYPE_INTEGER, &sii.joy.xright, ".joy.xright" },
+ { TYPE_INTEGER, &sii.joy.yupper, ".joy.yupper" },
+ { TYPE_INTEGER, &sii.joy.ymiddle, ".joy.ymiddle" },
+ { TYPE_INTEGER, &sii.joy.ylower, ".joy.ylower" },
+ { TYPE_INTEGER, &sii.joy.snap, ".joy.snap_field" },
+ { TYPE_INTEGER, &sii.joy.bomb, ".joy.place_bomb" },
+ { TYPE_KEYSYM, &sii.key.left, ".key.move_left" },
+ { TYPE_KEYSYM, &sii.key.right, ".key.move_right" },
+ { TYPE_KEYSYM, &sii.key.up, ".key.move_up" },
+ { TYPE_KEYSYM, &sii.key.down, ".key.move_down" },
+ { TYPE_KEYSYM, &sii.key.snap, ".key.snap_field" },
+ { TYPE_KEYSYM, &sii.key.bomb, ".key.place_bomb" }
+};
+
+static char *string_tolower(char *s)