changed filename string handling for level file info structure
[rocksndiamonds.git] / src / files.c
index c7408331e2fe1c04b9783780336023a6c7e686b1..b590641afc20b05848461be6327ae59081e52da5 100644 (file)
@@ -1855,8 +1855,9 @@ static void setFileInfoToDefaults(struct LevelFileInfo *level_file_info)
   level_file_info->nr = 0;
   level_file_info->type = LEVEL_FILE_TYPE_UNKNOWN;
   level_file_info->packed = FALSE;
-  level_file_info->basename = NULL;
-  level_file_info->filename = NULL;
+
+  setString(&level_file_info->basename, NULL);
+  setString(&level_file_info->filename, NULL);
 }
 
 int getMappedElement_SB(int, boolean);
@@ -2088,8 +2089,9 @@ static void setLevelFileInfo_SingleLevelFilename(struct LevelFileInfo *lfi,
 {
   lfi->type = type;
   lfi->packed = FALSE;
-  lfi->basename = getSingleLevelBasename(lfi->nr, lfi->type);
-  lfi->filename = getLevelFilenameFromBasename(lfi->basename);
+
+  setString(&lfi->basename, getSingleLevelBasename(lfi->nr, lfi->type));
+  setString(&lfi->filename, getLevelFilenameFromBasename(lfi->basename));
 }
 #endif
 
@@ -2105,8 +2107,9 @@ static void setLevelFileInfo_FormatLevelFilename(struct LevelFileInfo *lfi,
 
   lfi->type = type;
   lfi->packed = FALSE;
-  lfi->basename = basename;
-  lfi->filename = getLevelFilenameFromBasename(lfi->basename);
+
+  setString(&lfi->basename, basename);
+  setString(&lfi->filename, getLevelFilenameFromBasename(lfi->basename));
 }
 
 static void setLevelFileInfo_PackedLevelFilename(struct LevelFileInfo *lfi,
@@ -2114,8 +2117,9 @@ static void setLevelFileInfo_PackedLevelFilename(struct LevelFileInfo *lfi,
 {
   lfi->type = type;
   lfi->packed = TRUE;
-  lfi->basename = getPackedLevelBasename(lfi->type);
-  lfi->filename = getLevelFilenameFromBasename(lfi->basename);
+
+  setString(&lfi->basename, getPackedLevelBasename(lfi->type));
+  setString(&lfi->filename, getLevelFilenameFromBasename(lfi->basename));
 }
 
 static int getFiletypeFromID(char *filetype_id)
@@ -2187,7 +2191,7 @@ static void determineLevelFileInfo_Filename(struct LevelFileInfo *lfi)
                                         getSingleLevelBasename(-1));
 
     /* replace local level template filename with global template filename */
-    lfi->filename = getGlobalLevelTemplateFilename();
+    setString(&lfi->filename, getGlobalLevelTemplateFilename());
 
     /* no fallback if template file not existing */
     return;
@@ -6201,12 +6205,13 @@ void LoadLevelFromFilename(struct LevelInfo *level, char *filename)
 
   level_file_info.nr = 0;                      /* unknown level number */
   level_file_info.type = LEVEL_FILE_TYPE_RND;  /* no others supported yet */
-  level_file_info.filename = filename;
+
+  setString(&level_file_info.filename, filename);
 
   LoadLevelFromFileInfo(level, &level_file_info, FALSE);
 }
 
-static void LoadLevel_InitVersion(struct LevelInfo *level, char *filename)
+static void LoadLevel_InitVersion(struct LevelInfo *level)
 {
   int i, j;
 
@@ -6526,7 +6531,7 @@ static void LoadLevel_InitCustomElements(struct LevelInfo *level)
   }
 }
 
-static void LoadLevel_InitElements(struct LevelInfo *level, char *filename)
+static void LoadLevel_InitElements(struct LevelInfo *level)
 {
   LoadLevel_InitStandardElements(level);
 
@@ -6538,7 +6543,7 @@ static void LoadLevel_InitElements(struct LevelInfo *level, char *filename)
   InitElementPropertiesGfxElement();
 }
 
-static void LoadLevel_InitPlayfield(struct LevelInfo *level, char *filename)
+static void LoadLevel_InitPlayfield(struct LevelInfo *level)
 {
   int x, y;
 
@@ -6570,7 +6575,7 @@ static void LoadLevel_InitPlayfield(struct LevelInfo *level, char *filename)
     SetBorderElement();
 }
 
-static void LoadLevel_InitNativeEngines(struct LevelInfo *level,char *filename)
+static void LoadLevel_InitNativeEngines(struct LevelInfo *level)
 {
   struct LevelFileInfo *level_file_info = &level->file_info;
 
@@ -6580,36 +6585,37 @@ static void LoadLevel_InitNativeEngines(struct LevelInfo *level,char *filename)
 
 void LoadLevelTemplate(int nr)
 {
-  char *filename;
+  if (!fileExists(getGlobalLevelTemplateFilename()))
+  {
+    Error(ERR_WARN, "no level template found for this level");
+
+    return;
+  }
 
   setLevelFileInfo(&level_template.file_info, nr);
-  filename = level_template.file_info.filename;
 
   LoadLevelFromFileInfo(&level_template, &level_template.file_info, FALSE);
 
-  LoadLevel_InitVersion(&level_template, filename);
-  LoadLevel_InitElements(&level_template, filename);
+  LoadLevel_InitVersion(&level_template);
+  LoadLevel_InitElements(&level_template);
 
   ActivateLevelTemplate();
 }
 
 void LoadLevel(int nr)
 {
-  char *filename;
-
   setLevelFileInfo(&level.file_info, nr);
-  filename = level.file_info.filename;
 
   LoadLevelFromFileInfo(&level, &level.file_info, FALSE);
 
   if (level.use_custom_template)
     LoadLevelTemplate(-1);
 
-  LoadLevel_InitVersion(&level, filename);
-  LoadLevel_InitElements(&level, filename);
-  LoadLevel_InitPlayfield(&level, filename);
+  LoadLevel_InitVersion(&level);
+  LoadLevel_InitElements(&level);
+  LoadLevel_InitPlayfield(&level);
 
-  LoadLevel_InitNativeEngines(&level, filename);
+  LoadLevel_InitNativeEngines(&level);
 }
 
 void LoadLevelInfoOnly(int nr)
@@ -8261,198 +8267,234 @@ void SaveScore(int nr)
 #define TOKEN_STR_PLAYER_PREFIX                        "player_"
 
 /* global setup */
-#define SETUP_TOKEN_PLAYER_NAME                        0
-#define SETUP_TOKEN_SOUND                      1
-#define SETUP_TOKEN_SOUND_LOOPS                        2
-#define SETUP_TOKEN_SOUND_MUSIC                        3
-#define SETUP_TOKEN_SOUND_SIMPLE               4
-#define SETUP_TOKEN_TOONS                      5
-#define SETUP_TOKEN_SCROLL_DELAY               6
-#define SETUP_TOKEN_SCROLL_DELAY_VALUE         7
-#define SETUP_TOKEN_ENGINE_SNAPSHOT_MODE       8
-#define SETUP_TOKEN_ENGINE_SNAPSHOT_MEMORY     9
-#define SETUP_TOKEN_FADE_SCREENS               10
-#define SETUP_TOKEN_AUTORECORD                 11
-#define SETUP_TOKEN_SHOW_TITLESCREEN           12
-#define SETUP_TOKEN_QUICK_DOORS                        13
-#define SETUP_TOKEN_TEAM_MODE                  14
-#define SETUP_TOKEN_HANDICAP                   15
-#define SETUP_TOKEN_SKIP_LEVELS                        16
-#define SETUP_TOKEN_INCREMENT_LEVELS           17
-#define SETUP_TOKEN_TIME_LIMIT                 18
-#define SETUP_TOKEN_FULLSCREEN                 19
-#define SETUP_TOKEN_WINDOW_SCALING_PERCENT     20
-#define SETUP_TOKEN_WINDOW_SCALING_QUALITY     21
-#define SETUP_TOKEN_SCREEN_RENDERING_MODE      22
-#define SETUP_TOKEN_ASK_ON_ESCAPE              23
-#define SETUP_TOKEN_ASK_ON_ESCAPE_EDITOR       24
-#define SETUP_TOKEN_QUICK_SWITCH               25
-#define SETUP_TOKEN_INPUT_ON_FOCUS             26
-#define SETUP_TOKEN_PREFER_AGA_GRAPHICS                27
-#define SETUP_TOKEN_GAME_FRAME_DELAY           28
-#define SETUP_TOKEN_SP_SHOW_BORDER_ELEMENTS    29
-#define SETUP_TOKEN_SMALL_GAME_GRAPHICS                30
-#define SETUP_TOKEN_SHOW_SNAPSHOT_BUTTONS      31
-#define SETUP_TOKEN_GRAPHICS_SET               32
-#define SETUP_TOKEN_SOUNDS_SET                 33
-#define SETUP_TOKEN_MUSIC_SET                  34
-#define SETUP_TOKEN_OVERRIDE_LEVEL_GRAPHICS    35
-#define SETUP_TOKEN_OVERRIDE_LEVEL_SOUNDS      36
-#define SETUP_TOKEN_OVERRIDE_LEVEL_MUSIC       37
-#define SETUP_TOKEN_VOLUME_SIMPLE              38
-#define SETUP_TOKEN_VOLUME_LOOPS               39
-#define SETUP_TOKEN_VOLUME_MUSIC               40
-#define SETUP_TOKEN_TOUCH_CONTROL_TYPE         41
-#define SETUP_TOKEN_TOUCH_MOVE_DISTANCE                42
-#define SETUP_TOKEN_TOUCH_DROP_DISTANCE                43
-#define SETUP_TOKEN_TOUCH_TRANSPARENCY         44
-#define SETUP_TOKEN_TOUCH_GRID_XSIZE_0         45
-#define SETUP_TOKEN_TOUCH_GRID_YSIZE_0         46
-#define SETUP_TOKEN_TOUCH_GRID_XSIZE_1         47
-#define SETUP_TOKEN_TOUCH_GRID_YSIZE_1         48
-
-#define NUM_GLOBAL_SETUP_TOKENS                        49
+enum
+{
+  SETUP_TOKEN_PLAYER_NAME = 0,
+  SETUP_TOKEN_SOUND,
+  SETUP_TOKEN_SOUND_LOOPS,
+  SETUP_TOKEN_SOUND_MUSIC,
+  SETUP_TOKEN_SOUND_SIMPLE,
+  SETUP_TOKEN_TOONS,
+  SETUP_TOKEN_SCROLL_DELAY,
+  SETUP_TOKEN_SCROLL_DELAY_VALUE,
+  SETUP_TOKEN_ENGINE_SNAPSHOT_MODE,
+  SETUP_TOKEN_ENGINE_SNAPSHOT_MEMORY,
+  SETUP_TOKEN_FADE_SCREENS,
+  SETUP_TOKEN_AUTORECORD,
+  SETUP_TOKEN_SHOW_TITLESCREEN,
+  SETUP_TOKEN_QUICK_DOORS,
+  SETUP_TOKEN_TEAM_MODE,
+  SETUP_TOKEN_HANDICAP,
+  SETUP_TOKEN_SKIP_LEVELS,
+  SETUP_TOKEN_INCREMENT_LEVELS,
+  SETUP_TOKEN_AUTO_PLAY_NEXT_LEVEL,
+  SETUP_TOKEN_SKIP_SCORES_AFTER_GAME,
+  SETUP_TOKEN_TIME_LIMIT,
+  SETUP_TOKEN_FULLSCREEN,
+  SETUP_TOKEN_WINDOW_SCALING_PERCENT,
+  SETUP_TOKEN_WINDOW_SCALING_QUALITY,
+  SETUP_TOKEN_SCREEN_RENDERING_MODE,
+  SETUP_TOKEN_ASK_ON_ESCAPE,
+  SETUP_TOKEN_ASK_ON_ESCAPE_EDITOR,
+  SETUP_TOKEN_QUICK_SWITCH,
+  SETUP_TOKEN_INPUT_ON_FOCUS,
+  SETUP_TOKEN_PREFER_AGA_GRAPHICS,
+  SETUP_TOKEN_GAME_FRAME_DELAY,
+  SETUP_TOKEN_SP_SHOW_BORDER_ELEMENTS,
+  SETUP_TOKEN_SMALL_GAME_GRAPHICS,
+  SETUP_TOKEN_SHOW_SNAPSHOT_BUTTONS,
+  SETUP_TOKEN_GRAPHICS_SET,
+  SETUP_TOKEN_SOUNDS_SET,
+  SETUP_TOKEN_MUSIC_SET,
+  SETUP_TOKEN_OVERRIDE_LEVEL_GRAPHICS,
+  SETUP_TOKEN_OVERRIDE_LEVEL_SOUNDS,
+  SETUP_TOKEN_OVERRIDE_LEVEL_MUSIC,
+  SETUP_TOKEN_VOLUME_SIMPLE,
+  SETUP_TOKEN_VOLUME_LOOPS,
+  SETUP_TOKEN_VOLUME_MUSIC,
+  SETUP_TOKEN_NETWORK_MODE,
+  SETUP_TOKEN_NETWORK_PLAYER_NR,
+  SETUP_TOKEN_TOUCH_CONTROL_TYPE,
+  SETUP_TOKEN_TOUCH_MOVE_DISTANCE,
+  SETUP_TOKEN_TOUCH_DROP_DISTANCE,
+  SETUP_TOKEN_TOUCH_TRANSPARENCY,
+  SETUP_TOKEN_TOUCH_DRAW_OUTLINED,
+  SETUP_TOKEN_TOUCH_DRAW_PRESSED,
+  SETUP_TOKEN_TOUCH_GRID_XSIZE_0,
+  SETUP_TOKEN_TOUCH_GRID_YSIZE_0,
+  SETUP_TOKEN_TOUCH_GRID_XSIZE_1,
+  SETUP_TOKEN_TOUCH_GRID_YSIZE_1,
+
+  NUM_GLOBAL_SETUP_TOKENS
+};
 
 /* auto setup */
-#define SETUP_TOKEN_AUTO_EDITOR_ZOOM_TILESIZE  0
+enum
+{
+  SETUP_TOKEN_AUTO_EDITOR_ZOOM_TILESIZE = 0,
 
-#define NUM_AUTO_SETUP_TOKENS                  1
+  NUM_AUTO_SETUP_TOKENS
+};
 
 /* editor setup */
-#define SETUP_TOKEN_EDITOR_EL_CLASSIC          0
-#define SETUP_TOKEN_EDITOR_EL_CUSTOM           1
-#define SETUP_TOKEN_EDITOR_EL_USER_DEFINED     2
-#define SETUP_TOKEN_EDITOR_EL_DYNAMIC          3
-#define SETUP_TOKEN_EDITOR_EL_HEADLINES                4
-#define SETUP_TOKEN_EDITOR_SHOW_ELEMENT_TOKEN  5
+enum
+{
+  SETUP_TOKEN_EDITOR_EL_CLASSIC = 0,
+  SETUP_TOKEN_EDITOR_EL_CUSTOM,
+  SETUP_TOKEN_EDITOR_EL_USER_DEFINED,
+  SETUP_TOKEN_EDITOR_EL_DYNAMIC,
+  SETUP_TOKEN_EDITOR_EL_HEADLINES,
+  SETUP_TOKEN_EDITOR_SHOW_ELEMENT_TOKEN,
 
-#define NUM_EDITOR_SETUP_TOKENS                        6
+  NUM_EDITOR_SETUP_TOKENS
+};
 
 /* editor cascade setup */
-#define SETUP_TOKEN_EDITOR_CASCADE_BD          0
-#define SETUP_TOKEN_EDITOR_CASCADE_EM          1
-#define SETUP_TOKEN_EDITOR_CASCADE_EMC         2
-#define SETUP_TOKEN_EDITOR_CASCADE_RND         3
-#define SETUP_TOKEN_EDITOR_CASCADE_SB          4
-#define SETUP_TOKEN_EDITOR_CASCADE_SP          5
-#define SETUP_TOKEN_EDITOR_CASCADE_DC          6
-#define SETUP_TOKEN_EDITOR_CASCADE_DX          7
-#define SETUP_TOKEN_EDITOR_CASCADE_TEXT                8
-#define SETUP_TOKEN_EDITOR_CASCADE_STEELTEXT   9
-#define SETUP_TOKEN_EDITOR_CASCADE_CE          10
-#define SETUP_TOKEN_EDITOR_CASCADE_GE          11
-#define SETUP_TOKEN_EDITOR_CASCADE_REF         12
-#define SETUP_TOKEN_EDITOR_CASCADE_USER                13
-#define SETUP_TOKEN_EDITOR_CASCADE_DYNAMIC     14
-
-#define NUM_EDITOR_CASCADE_SETUP_TOKENS                15
+enum
+{
+  SETUP_TOKEN_EDITOR_CASCADE_BD = 0,
+  SETUP_TOKEN_EDITOR_CASCADE_EM,
+  SETUP_TOKEN_EDITOR_CASCADE_EMC,
+  SETUP_TOKEN_EDITOR_CASCADE_RND,
+  SETUP_TOKEN_EDITOR_CASCADE_SB,
+  SETUP_TOKEN_EDITOR_CASCADE_SP,
+  SETUP_TOKEN_EDITOR_CASCADE_DC,
+  SETUP_TOKEN_EDITOR_CASCADE_DX,
+  SETUP_TOKEN_EDITOR_CASCADE_TEXT,
+  SETUP_TOKEN_EDITOR_CASCADE_STEELTEXT,
+  SETUP_TOKEN_EDITOR_CASCADE_CE,
+  SETUP_TOKEN_EDITOR_CASCADE_GE,
+  SETUP_TOKEN_EDITOR_CASCADE_REF,
+  SETUP_TOKEN_EDITOR_CASCADE_USER,
+  SETUP_TOKEN_EDITOR_CASCADE_DYNAMIC,
+
+  NUM_EDITOR_CASCADE_SETUP_TOKENS
+};
 
 /* shortcut setup */
-#define SETUP_TOKEN_SHORTCUT_SAVE_GAME         0
-#define SETUP_TOKEN_SHORTCUT_LOAD_GAME         1
-#define SETUP_TOKEN_SHORTCUT_TOGGLE_PAUSE      2
-#define SETUP_TOKEN_SHORTCUT_FOCUS_PLAYER_1    3
-#define SETUP_TOKEN_SHORTCUT_FOCUS_PLAYER_2    4
-#define SETUP_TOKEN_SHORTCUT_FOCUS_PLAYER_3    5
-#define SETUP_TOKEN_SHORTCUT_FOCUS_PLAYER_4    6
-#define SETUP_TOKEN_SHORTCUT_FOCUS_PLAYER_ALL  7
-#define SETUP_TOKEN_SHORTCUT_TAPE_EJECT                8
-#define SETUP_TOKEN_SHORTCUT_TAPE_EXTRA                9
-#define SETUP_TOKEN_SHORTCUT_TAPE_STOP         10
-#define SETUP_TOKEN_SHORTCUT_TAPE_PAUSE                11
-#define SETUP_TOKEN_SHORTCUT_TAPE_RECORD       12
-#define SETUP_TOKEN_SHORTCUT_TAPE_PLAY         13
-#define SETUP_TOKEN_SHORTCUT_SOUND_SIMPLE      14
-#define SETUP_TOKEN_SHORTCUT_SOUND_LOOPS       15
-#define SETUP_TOKEN_SHORTCUT_SOUND_MUSIC       16
-#define SETUP_TOKEN_SHORTCUT_SNAP_LEFT         17
-#define SETUP_TOKEN_SHORTCUT_SNAP_RIGHT                18
-#define SETUP_TOKEN_SHORTCUT_SNAP_UP           19
-#define SETUP_TOKEN_SHORTCUT_SNAP_DOWN         20
-
-#define NUM_SHORTCUT_SETUP_TOKENS              21
+enum
+{
+  SETUP_TOKEN_SHORTCUT_SAVE_GAME = 0,
+  SETUP_TOKEN_SHORTCUT_LOAD_GAME,
+  SETUP_TOKEN_SHORTCUT_TOGGLE_PAUSE,
+  SETUP_TOKEN_SHORTCUT_FOCUS_PLAYER_1,
+  SETUP_TOKEN_SHORTCUT_FOCUS_PLAYER_2,
+  SETUP_TOKEN_SHORTCUT_FOCUS_PLAYER_3,
+  SETUP_TOKEN_SHORTCUT_FOCUS_PLAYER_4,
+  SETUP_TOKEN_SHORTCUT_FOCUS_PLAYER_ALL,
+  SETUP_TOKEN_SHORTCUT_TAPE_EJECT,
+  SETUP_TOKEN_SHORTCUT_TAPE_EXTRA,
+  SETUP_TOKEN_SHORTCUT_TAPE_STOP,
+  SETUP_TOKEN_SHORTCUT_TAPE_PAUSE,
+  SETUP_TOKEN_SHORTCUT_TAPE_RECORD,
+  SETUP_TOKEN_SHORTCUT_TAPE_PLAY,
+  SETUP_TOKEN_SHORTCUT_SOUND_SIMPLE,
+  SETUP_TOKEN_SHORTCUT_SOUND_LOOPS,
+  SETUP_TOKEN_SHORTCUT_SOUND_MUSIC,
+  SETUP_TOKEN_SHORTCUT_SNAP_LEFT,
+  SETUP_TOKEN_SHORTCUT_SNAP_RIGHT,
+  SETUP_TOKEN_SHORTCUT_SNAP_UP,
+  SETUP_TOKEN_SHORTCUT_SNAP_DOWN,
+
+  NUM_SHORTCUT_SETUP_TOKENS
+};
 
 /* player setup */
-#define SETUP_TOKEN_PLAYER_USE_JOYSTICK                0
-#define SETUP_TOKEN_PLAYER_JOY_DEVICE_NAME     1
-#define SETUP_TOKEN_PLAYER_JOY_XLEFT           2
-#define SETUP_TOKEN_PLAYER_JOY_XMIDDLE         3
-#define SETUP_TOKEN_PLAYER_JOY_XRIGHT          4
-#define SETUP_TOKEN_PLAYER_JOY_YUPPER          5
-#define SETUP_TOKEN_PLAYER_JOY_YMIDDLE         6
-#define SETUP_TOKEN_PLAYER_JOY_YLOWER          7
-#define SETUP_TOKEN_PLAYER_JOY_SNAP            8
-#define SETUP_TOKEN_PLAYER_JOY_DROP            9
-#define SETUP_TOKEN_PLAYER_KEY_LEFT            10
-#define SETUP_TOKEN_PLAYER_KEY_RIGHT           11
-#define SETUP_TOKEN_PLAYER_KEY_UP              12
-#define SETUP_TOKEN_PLAYER_KEY_DOWN            13
-#define SETUP_TOKEN_PLAYER_KEY_SNAP            14
-#define SETUP_TOKEN_PLAYER_KEY_DROP            15
-
-#define NUM_PLAYER_SETUP_TOKENS                        16
+enum
+{
+  SETUP_TOKEN_PLAYER_USE_JOYSTICK = 0,
+  SETUP_TOKEN_PLAYER_JOY_DEVICE_NAME,
+  SETUP_TOKEN_PLAYER_JOY_XLEFT,
+  SETUP_TOKEN_PLAYER_JOY_XMIDDLE,
+  SETUP_TOKEN_PLAYER_JOY_XRIGHT,
+  SETUP_TOKEN_PLAYER_JOY_YUPPER,
+  SETUP_TOKEN_PLAYER_JOY_YMIDDLE,
+  SETUP_TOKEN_PLAYER_JOY_YLOWER,
+  SETUP_TOKEN_PLAYER_JOY_SNAP,
+  SETUP_TOKEN_PLAYER_JOY_DROP,
+  SETUP_TOKEN_PLAYER_KEY_LEFT,
+  SETUP_TOKEN_PLAYER_KEY_RIGHT,
+  SETUP_TOKEN_PLAYER_KEY_UP,
+  SETUP_TOKEN_PLAYER_KEY_DOWN,
+  SETUP_TOKEN_PLAYER_KEY_SNAP,
+  SETUP_TOKEN_PLAYER_KEY_DROP,
+
+  NUM_PLAYER_SETUP_TOKENS
+};
 
 /* system setup */
-#define SETUP_TOKEN_SYSTEM_SDL_VIDEODRIVER     0
-#define SETUP_TOKEN_SYSTEM_SDL_AUDIODRIVER     1
-#define SETUP_TOKEN_SYSTEM_AUDIO_FRAGMENT_SIZE 2
+enum
+{
+  SETUP_TOKEN_SYSTEM_SDL_VIDEODRIVER = 0,
+  SETUP_TOKEN_SYSTEM_SDL_AUDIODRIVER,
+  SETUP_TOKEN_SYSTEM_AUDIO_FRAGMENT_SIZE,
 
-#define NUM_SYSTEM_SETUP_TOKENS                        3
+  NUM_SYSTEM_SETUP_TOKENS
+};
 
 /* internal setup */
-#define SETUP_TOKEN_INT_PROGRAM_TITLE          0
-#define SETUP_TOKEN_INT_PROGRAM_VERSION                1
-#define SETUP_TOKEN_INT_PROGRAM_AUTHOR         2
-#define SETUP_TOKEN_INT_PROGRAM_EMAIL          3
-#define SETUP_TOKEN_INT_PROGRAM_WEBSITE                4
-#define SETUP_TOKEN_INT_PROGRAM_COPYRIGHT      5
-#define SETUP_TOKEN_INT_PROGRAM_COMPANY                6
-#define SETUP_TOKEN_INT_PROGRAM_ICON_FILE      7
-#define SETUP_TOKEN_INT_DEFAULT_GRAPHICS_SET   8
-#define SETUP_TOKEN_INT_DEFAULT_SOUNDS_SET     9
-#define SETUP_TOKEN_INT_DEFAULT_MUSIC_SET      10
-#define SETUP_TOKEN_INT_FALLBACK_GRAPHICS_FILE 11
-#define SETUP_TOKEN_INT_FALLBACK_SOUNDS_FILE   12
-#define SETUP_TOKEN_INT_FALLBACK_MUSIC_FILE    13
-#define SETUP_TOKEN_INT_DEFAULT_LEVEL_SERIES   14
-#define SETUP_TOKEN_INT_CHOOSE_FROM_TOP_LEVELDIR 15
-#define SETUP_TOKEN_INT_SHOW_SCALING_IN_TITLE  16
-#define SETUP_TOKEN_INT_DEFAULT_WINDOW_WIDTH   17
-#define SETUP_TOKEN_INT_DEFAULT_WINDOW_HEIGHT  18
-
-#define NUM_INTERNAL_SETUP_TOKENS              19
+enum
+{
+  SETUP_TOKEN_INT_PROGRAM_TITLE = 0,
+  SETUP_TOKEN_INT_PROGRAM_VERSION,
+  SETUP_TOKEN_INT_PROGRAM_AUTHOR,
+  SETUP_TOKEN_INT_PROGRAM_EMAIL,
+  SETUP_TOKEN_INT_PROGRAM_WEBSITE,
+  SETUP_TOKEN_INT_PROGRAM_COPYRIGHT,
+  SETUP_TOKEN_INT_PROGRAM_COMPANY,
+  SETUP_TOKEN_INT_PROGRAM_ICON_FILE,
+  SETUP_TOKEN_INT_DEFAULT_GRAPHICS_SET,
+  SETUP_TOKEN_INT_DEFAULT_SOUNDS_SET,
+  SETUP_TOKEN_INT_DEFAULT_MUSIC_SET,
+  SETUP_TOKEN_INT_FALLBACK_GRAPHICS_FILE,
+  SETUP_TOKEN_INT_FALLBACK_SOUNDS_FILE,
+  SETUP_TOKEN_INT_FALLBACK_MUSIC_FILE,
+  SETUP_TOKEN_INT_DEFAULT_LEVEL_SERIES,
+  SETUP_TOKEN_INT_CHOOSE_FROM_TOP_LEVELDIR,
+  SETUP_TOKEN_INT_SHOW_SCALING_IN_TITLE,
+  SETUP_TOKEN_INT_DEFAULT_WINDOW_WIDTH,
+  SETUP_TOKEN_INT_DEFAULT_WINDOW_HEIGHT,
+
+  NUM_INTERNAL_SETUP_TOKENS
+};
 
 /* debug setup */
-#define SETUP_TOKEN_DEBUG_FRAME_DELAY_0                0
-#define SETUP_TOKEN_DEBUG_FRAME_DELAY_1                1
-#define SETUP_TOKEN_DEBUG_FRAME_DELAY_2                2
-#define SETUP_TOKEN_DEBUG_FRAME_DELAY_3                3
-#define SETUP_TOKEN_DEBUG_FRAME_DELAY_4                4
-#define SETUP_TOKEN_DEBUG_FRAME_DELAY_5                5
-#define SETUP_TOKEN_DEBUG_FRAME_DELAY_6                6
-#define SETUP_TOKEN_DEBUG_FRAME_DELAY_7                7
-#define SETUP_TOKEN_DEBUG_FRAME_DELAY_8                8
-#define SETUP_TOKEN_DEBUG_FRAME_DELAY_9                9
-#define SETUP_TOKEN_DEBUG_FRAME_DELAY_KEY_0    10
-#define SETUP_TOKEN_DEBUG_FRAME_DELAY_KEY_1    11
-#define SETUP_TOKEN_DEBUG_FRAME_DELAY_KEY_2    12
-#define SETUP_TOKEN_DEBUG_FRAME_DELAY_KEY_3    13
-#define SETUP_TOKEN_DEBUG_FRAME_DELAY_KEY_4    14
-#define SETUP_TOKEN_DEBUG_FRAME_DELAY_KEY_5    15
-#define SETUP_TOKEN_DEBUG_FRAME_DELAY_KEY_6    16
-#define SETUP_TOKEN_DEBUG_FRAME_DELAY_KEY_7    17
-#define SETUP_TOKEN_DEBUG_FRAME_DELAY_KEY_8    18
-#define SETUP_TOKEN_DEBUG_FRAME_DELAY_KEY_9    19
-#define SETUP_TOKEN_DEBUG_FRAME_DELAY_USE_MOD_KEY 20
-#define SETUP_TOKEN_DEBUG_FRAME_DELAY_GAME_ONLY        21
-#define SETUP_TOKEN_DEBUG_SHOW_FRAMES_PER_SECOND 22
-
-#define NUM_DEBUG_SETUP_TOKENS                 23
+enum
+{
+  SETUP_TOKEN_DEBUG_FRAME_DELAY_0 = 0,
+  SETUP_TOKEN_DEBUG_FRAME_DELAY_1,
+  SETUP_TOKEN_DEBUG_FRAME_DELAY_2,
+  SETUP_TOKEN_DEBUG_FRAME_DELAY_3,
+  SETUP_TOKEN_DEBUG_FRAME_DELAY_4,
+  SETUP_TOKEN_DEBUG_FRAME_DELAY_5,
+  SETUP_TOKEN_DEBUG_FRAME_DELAY_6,
+  SETUP_TOKEN_DEBUG_FRAME_DELAY_7,
+  SETUP_TOKEN_DEBUG_FRAME_DELAY_8,
+  SETUP_TOKEN_DEBUG_FRAME_DELAY_9,
+  SETUP_TOKEN_DEBUG_FRAME_DELAY_KEY_0,
+  SETUP_TOKEN_DEBUG_FRAME_DELAY_KEY_1,
+  SETUP_TOKEN_DEBUG_FRAME_DELAY_KEY_2,
+  SETUP_TOKEN_DEBUG_FRAME_DELAY_KEY_3,
+  SETUP_TOKEN_DEBUG_FRAME_DELAY_KEY_4,
+  SETUP_TOKEN_DEBUG_FRAME_DELAY_KEY_5,
+  SETUP_TOKEN_DEBUG_FRAME_DELAY_KEY_6,
+  SETUP_TOKEN_DEBUG_FRAME_DELAY_KEY_7,
+  SETUP_TOKEN_DEBUG_FRAME_DELAY_KEY_8,
+  SETUP_TOKEN_DEBUG_FRAME_DELAY_KEY_9,
+  SETUP_TOKEN_DEBUG_FRAME_DELAY_USE_MOD_KEY,
+  SETUP_TOKEN_DEBUG_FRAME_DELAY_GAME_ONLY,
+  SETUP_TOKEN_DEBUG_SHOW_FRAMES_PER_SECOND,
+
+  NUM_DEBUG_SETUP_TOKENS
+};
 
 /* options setup */
-#define SETUP_TOKEN_OPTIONS_VERBOSE            0
+enum
+{
+  SETUP_TOKEN_OPTIONS_VERBOSE = 0,
 
-#define NUM_OPTIONS_SETUP_TOKENS               1
+  NUM_OPTIONS_SETUP_TOKENS
+};
 
 
 static struct SetupInfo si;
@@ -8486,6 +8528,8 @@ static struct TokenInfo global_setup_tokens[] =
   { TYPE_SWITCH, &si.handicap,                "handicap"               },
   { TYPE_SWITCH, &si.skip_levels,             "skip_levels"            },
   { TYPE_SWITCH, &si.increment_levels,        "increment_levels"       },
+  { TYPE_SWITCH, &si.auto_play_next_level,    "auto_play_next_level"   },
+  { TYPE_SWITCH, &si.skip_scores_after_game,  "skip_scores_after_game" },
   { TYPE_SWITCH, &si.time_limit,              "time_limit"             },
   { TYPE_SWITCH, &si.fullscreen,              "fullscreen"             },
   { TYPE_INTEGER,&si.window_scaling_percent,  "window_scaling_percent" },
@@ -8509,10 +8553,14 @@ static struct TokenInfo global_setup_tokens[] =
   { TYPE_INTEGER,&si.volume_simple,           "volume_simple"          },
   { TYPE_INTEGER,&si.volume_loops,            "volume_loops"           },
   { TYPE_INTEGER,&si.volume_music,            "volume_music"           },
+  { TYPE_SWITCH, &si.network_mode,            "network_mode"           },
+  { TYPE_PLAYER, &si.network_player_nr,       "network_player"         },
   { TYPE_STRING, &si.touch.control_type,      "touch.control_type"     },
   { TYPE_INTEGER,&si.touch.move_distance,     "touch.move_distance"    },
   { TYPE_INTEGER,&si.touch.drop_distance,     "touch.drop_distance"    },
   { TYPE_INTEGER,&si.touch.transparency,      "touch.transparency"     },
+  { TYPE_INTEGER,&si.touch.draw_outlined,     "touch.draw_outlined"    },
+  { TYPE_INTEGER,&si.touch.draw_pressed,      "touch.draw_pressed"     },
   { TYPE_INTEGER,&si.touch.grid_xsize[0],     "touch.virtual_buttons.0.xsize" },
   { TYPE_INTEGER,&si.touch.grid_ysize[0],     "touch.virtual_buttons.0.ysize" },
   { TYPE_INTEGER,&si.touch.grid_xsize[1],     "touch.virtual_buttons.1.xsize" },
@@ -8700,6 +8748,8 @@ static void setSetupInfoToDefaults(struct SetupInfo *si)
   si->handicap = TRUE;
   si->skip_levels = TRUE;
   si->increment_levels = TRUE;
+  si->auto_play_next_level = TRUE;
+  si->skip_scores_after_game = FALSE;
   si->time_limit = TRUE;
   si->fullscreen = FALSE;
   si->window_scaling_percent = STD_WINDOW_SCALING_PERCENT;
@@ -8727,10 +8777,15 @@ static void setSetupInfoToDefaults(struct SetupInfo *si)
   si->volume_loops = 100;              /* percent */
   si->volume_music = 100;              /* percent */
 
+  si->network_mode = FALSE;
+  si->network_player_nr = 0;           /* first player */
+
   si->touch.control_type = getStringCopy(TOUCH_CONTROL_DEFAULT);
   si->touch.move_distance = TOUCH_MOVE_DISTANCE_DEFAULT;       /* percent */
   si->touch.drop_distance = TOUCH_DROP_DISTANCE_DEFAULT;       /* percent */
   si->touch.transparency = TOUCH_TRANSPARENCY_DEFAULT;         /* percent */
+  si->touch.draw_outlined = TRUE;
+  si->touch.draw_pressed = TRUE;
 
   for (i = 0; i < 2; i++)
   {
@@ -9320,6 +9375,7 @@ void SaveSetup()
     if (i == SETUP_TOKEN_PLAYER_NAME + 1 ||
        i == SETUP_TOKEN_GRAPHICS_SET ||
        i == SETUP_TOKEN_VOLUME_SIMPLE ||
+       i == SETUP_TOKEN_NETWORK_MODE ||
        i == SETUP_TOKEN_TOUCH_CONTROL_TYPE ||
        i == SETUP_TOKEN_TOUCH_GRID_XSIZE_0 ||
        i == SETUP_TOKEN_TOUCH_GRID_XSIZE_1)