added setup option to ask to play again after game is over but not solved
[rocksndiamonds.git] / src / files.c
index ac75c2afc8151a97e03cd7428bb08ab5265c8b59..75e691c36555fdd434af328a817ac5be0c482c99 100644 (file)
@@ -251,6 +251,12 @@ static struct LevelFileConfigInfo chunk_config_INFO[] =
     &li.auto_count_gems,               FALSE
   },
 
+  {
+    -1,                                        -1,
+    TYPE_BOOLEAN,                      CONF_VALUE_8_BIT(11),
+    &li.solved_by_one_player,          FALSE
+  },
+
   {
     -1,                                        -1,
     -1,                                        -1,
@@ -662,6 +668,11 @@ static struct LevelFileConfigInfo chunk_config_ELEM[] =
     TYPE_INTEGER,                      CONF_VALUE_8_BIT(4),
     &li.game_of_life[3],               3
   },
+  {
+    EL_GAME_OF_LIFE,                   -1,
+    TYPE_BOOLEAN,                      CONF_VALUE_8_BIT(5),
+    &li.use_life_bugs,                 FALSE
+  },
 
   {
     EL_BIOMAZE,                                -1,
@@ -1398,7 +1409,7 @@ static boolean check_special_flags(char *flag)
   return FALSE;
 }
 
-static struct DateInfo getCurrentDate()
+static struct DateInfo getCurrentDate(void)
 {
   time_t epoch_seconds = time(NULL);
   struct tm *now = localtime(&epoch_seconds);
@@ -1421,7 +1432,7 @@ static void resetEventFlags(struct ElementChangeInfo *change)
     change->has_event[i] = FALSE;
 }
 
-static void resetEventBits()
+static void resetEventBits(void)
 {
   int i;
 
@@ -1855,13 +1866,14 @@ 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);
 
-static void ActivateLevelTemplate()
+static void ActivateLevelTemplate(void)
 {
   int x, y;
 
@@ -1914,6 +1926,9 @@ static void ActivateLevelTemplate()
     /* overwrite all individual level settings from template level settings */
     level = level_template;
 
+    /* restore level file info */
+    level.file_info = level_backup.file_info;
+
     /* restore playfield size */
     level.fieldx = level_backup.fieldx;
     level.fieldy = level_backup.fieldy;
@@ -1934,14 +1949,13 @@ static void ActivateLevelTemplate()
 
 static char *getLevelFilenameFromBasename(char *basename)
 {
-  static char *filename[2] = { NULL, NULL };
-  int pos = (strEqual(basename, LEVELTEMPLATE_FILENAME) ? 0 : 1);
+  static char *filename = NULL;
 
-  checked_free(filename[pos]);
+  checked_free(filename);
 
-  filename[pos] = getPath2(getCurrentLevelDir(), basename);
+  filename = getPath2(getCurrentLevelDir(), basename);
 
-  return filename[pos];
+  return filename;
 }
 
 static int getFileTypeFromBasename(char *basename)
@@ -2088,8 +2102,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 +2120,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 +2130,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)
@@ -2147,12 +2164,12 @@ static int getFiletypeFromID(char *filetype_id)
   return filetype;
 }
 
-char *getLocalLevelTemplateFilename()
+char *getLocalLevelTemplateFilename(void)
 {
   return getDefaultLevelFilename(-1);
 }
 
-char *getGlobalLevelTemplateFilename()
+char *getGlobalLevelTemplateFilename(void)
 {
   /* global variable "leveldir_current" must be modified in the loop below */
   LevelDirTree *leveldir_current_last = leveldir_current;
@@ -2187,7 +2204,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;
@@ -2284,11 +2301,22 @@ static void setLevelFileInfo(struct LevelFileInfo *level_file_info, int nr)
   determineLevelFileInfo_Filetype(level_file_info);
 }
 
+static void copyLevelFileInfo(struct LevelFileInfo *lfi_from,
+                             struct LevelFileInfo *lfi_to)
+{
+  lfi_to->nr     = lfi_from->nr;
+  lfi_to->type   = lfi_from->type;
+  lfi_to->packed = lfi_from->packed;
+
+  setString(&lfi_to->basename, lfi_from->basename);
+  setString(&lfi_to->filename, lfi_from->filename);
+}
+
 /* ------------------------------------------------------------------------- */
 /* functions for loading R'n'D level                                         */
 /* ------------------------------------------------------------------------- */
 
-int getMappedElement(int element)
+static int getMappedElement(int element)
 {
   /* remap some (historic, now obsolete) elements */
 
@@ -2339,7 +2367,7 @@ int getMappedElement(int element)
   return element;
 }
 
-int getMappedElementByVersion(int element, int game_version)
+static int getMappedElementByVersion(int element, int game_version)
 {
   /* remap some elements due to certain game version */
 
@@ -3461,7 +3489,7 @@ static void LoadLevelFromFileInfo_RND(struct LevelInfo *level,
 /* functions for loading EM level                                            */
 /* ------------------------------------------------------------------------- */
 
-void CopyNativeLevel_RND_to_EM(struct LevelInfo *level)
+static void CopyNativeLevel_RND_to_EM(struct LevelInfo *level)
 {
   static int ball_xy[8][2] =
   {
@@ -3589,7 +3617,7 @@ void CopyNativeLevel_RND_to_EM(struct LevelInfo *level)
   }
 }
 
-void CopyNativeLevel_EM_to_RND(struct LevelInfo *level)
+static void CopyNativeLevel_EM_to_RND(struct LevelInfo *level)
 {
   static int ball_xy[8][2] =
   {
@@ -3690,7 +3718,7 @@ void CopyNativeLevel_EM_to_RND(struct LevelInfo *level)
 /* functions for loading SP level                                            */
 /* ------------------------------------------------------------------------- */
 
-void CopyNativeLevel_RND_to_SP(struct LevelInfo *level)
+static void CopyNativeLevel_RND_to_SP(struct LevelInfo *level)
 {
   struct LevelInfo_SP *level_sp = level->native_sp_level;
   LevelInfoType *header = &level_sp->header;
@@ -3774,7 +3802,7 @@ void CopyNativeLevel_RND_to_SP(struct LevelInfo *level)
   }
 }
 
-void CopyNativeLevel_SP_to_RND(struct LevelInfo *level)
+static void CopyNativeLevel_SP_to_RND(struct LevelInfo *level)
 {
   struct LevelInfo_SP *level_sp = level->native_sp_level;
   LevelInfoType *header = &level_sp->header;
@@ -3934,7 +3962,7 @@ static void CopyNativeTape_RND_to_SP(struct LevelInfo *level)
   demo->is_available = TRUE;
 }
 
-static void setTapeInfoToDefaults();
+static void setTapeInfoToDefaults(void);
 
 static void CopyNativeTape_SP_to_RND(struct LevelInfo *level)
 {
@@ -3987,7 +4015,7 @@ static void CopyNativeTape_SP_to_RND(struct LevelInfo *level)
 /* functions for loading MM level                                            */
 /* ------------------------------------------------------------------------- */
 
-void CopyNativeLevel_RND_to_MM(struct LevelInfo *level)
+static void CopyNativeLevel_RND_to_MM(struct LevelInfo *level)
 {
   struct LevelInfo_MM *level_mm = level->native_mm_level;
   int x, y;
@@ -4024,7 +4052,7 @@ void CopyNativeLevel_RND_to_MM(struct LevelInfo *level)
        level_mm->field[x][y] = map_element_RND_to_MM(level->field[x][y]);
 }
 
-void CopyNativeLevel_MM_to_RND(struct LevelInfo *level)
+static void CopyNativeLevel_MM_to_RND(struct LevelInfo *level)
 {
   struct LevelInfo_MM *level_mm = level->native_mm_level;
   int x, y;
@@ -4070,7 +4098,8 @@ void CopyNativeLevel_MM_to_RND(struct LevelInfo *level)
 
 #define DC_LEVEL_HEADER_SIZE           344
 
-unsigned short getDecodedWord_DC(unsigned short data_encoded, boolean init)
+static unsigned short getDecodedWord_DC(unsigned short data_encoded,
+                                       boolean init)
 {
   static int last_data_encoded;
   static int offset1;
@@ -4109,7 +4138,7 @@ unsigned short getDecodedWord_DC(unsigned short data_encoded, boolean init)
   return data_decoded;
 }
 
-int getMappedElement_DC(int element)
+static int getMappedElement_DC(int element)
 {
   switch (element)
   {
@@ -6201,12 +6230,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;
 
@@ -6284,6 +6314,10 @@ static void LoadLevel_InitVersion(struct LevelInfo *level, char *filename)
     level->extra_time_score = level->score[SC_TIME_BONUS];
   }
 
+  /* game logic of "game of life" and "biomaze" was buggy before 4.1.1.1 */
+  if (level->game_version < VERSION_IDENT(4,1,1,1))
+    level->use_life_bugs = TRUE;
+
   if (level->game_version < VERSION_IDENT(3,2,0,7))
   {
     /* default behaviour for snapping was "not continuous" before 3.2.0-7 */
@@ -6377,6 +6411,10 @@ static void LoadLevel_InitVersion(struct LevelInfo *level, char *filename)
   /* EM style elements always chain-exploded in R'n'D engine before 3.2.6 */
   if (level->game_version < VERSION_IDENT(3,2,6,0))
     level->em_explodes_by_fire = TRUE;
+
+  /* levels were solved by the first player entering an exit up to 4.1.0.0 */
+  if (level->game_version <= VERSION_IDENT(4,1,0,0))
+    level->solved_by_one_player = TRUE;
 }
 
 static void LoadLevel_InitStandardElements(struct LevelInfo *level)
@@ -6526,7 +6564,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 +6576,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 +6608,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;
 
@@ -6578,38 +6616,63 @@ static void LoadLevel_InitNativeEngines(struct LevelInfo *level,char *filename)
     CopyNativeLevel_RND_to_Native(level);
 }
 
-void LoadLevelTemplate(int nr)
+static void LoadLevelTemplate_LoadAndInit(void)
 {
-  char *filename;
-
-  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)
+void LoadLevelTemplate(int nr)
 {
-  char *filename;
+  if (!fileExists(getGlobalLevelTemplateFilename()))
+  {
+    Error(ERR_WARN, "no level template found for this level");
 
-  setLevelFileInfo(&level.file_info, nr);
-  filename = level.file_info.filename;
+    return;
+  }
+
+  setLevelFileInfo(&level_template.file_info, nr);
+
+  LoadLevelTemplate_LoadAndInit();
+}
+
+static void LoadNetworkLevelTemplate(struct NetworkLevelInfo *network_level)
+{
+  copyLevelFileInfo(&network_level->tmpl_info, &level_template.file_info);
 
+  LoadLevelTemplate_LoadAndInit();
+}
+
+static void LoadLevel_LoadAndInit(struct NetworkLevelInfo *network_level)
+{
   LoadLevelFromFileInfo(&level, &level.file_info, FALSE);
 
   if (level.use_custom_template)
-    LoadLevelTemplate(-1);
+  {
+    if (network_level != NULL)
+      LoadNetworkLevelTemplate(network_level);
+    else
+      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 LoadLevel(int nr)
+{
+  SetLevelSetInfo(leveldir_current->identifier, nr);
+
+  setLevelFileInfo(&level.file_info, nr);
+
+  LoadLevel_LoadAndInit(NULL);
 }
 
 void LoadLevelInfoOnly(int nr)
@@ -6619,6 +6682,16 @@ void LoadLevelInfoOnly(int nr)
   LoadLevelFromFileInfo(&level, &level.file_info, TRUE);
 }
 
+void LoadNetworkLevel(struct NetworkLevelInfo *network_level)
+{
+  SetLevelSetInfo(network_level->leveldir_identifier,
+                 network_level->file_info.nr);
+
+  copyLevelFileInfo(&network_level->file_info, &level.file_info);
+
+  LoadLevel_LoadAndInit(network_level);
+}
+
 static int SaveLevel_VERS(FILE *file, struct LevelInfo *level)
 {
   int chunk_size = 0;
@@ -7451,7 +7524,7 @@ void SaveLevel(int nr)
   SaveLevelFromFilename(&level, filename, FALSE);
 }
 
-void SaveLevelTemplate()
+void SaveLevelTemplate(void)
 {
   char *filename = getLocalLevelTemplateFilename();
 
@@ -7521,7 +7594,7 @@ void DumpLevel(struct LevelInfo *level)
 /* tape file functions                                                       */
 /* ========================================================================= */
 
-static void setTapeInfoToDefaults()
+static void setTapeInfoToDefaults(void)
 {
   int i;
 
@@ -7721,7 +7794,7 @@ static int LoadTape_BODY(File *file, int chunk_size, struct TapeInfo *tape)
   return chunk_size;
 }
 
-void LoadTape_SokobanSolution(char *filename)
+static void LoadTape_SokobanSolution(char *filename)
 {
   File *file;
   int move_delay = TILESIZE / level.initial_player_stepsize[0];
@@ -8235,7 +8308,8 @@ void SaveScore(int nr)
   char *filename = getScoreFilename(nr);
   FILE *file;
 
-  InitScoreDirectory(leveldir_current->subdir);
+  /* used instead of "leveldir_current->subdir" (for network games) */
+  InitScoreDirectory(levelset.identifier);
 
   if (!(file = fopen(filename, MODE_WRITE)))
   {
@@ -8261,200 +8335,238 @@ 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_DRAW_OUTLINED                45
-#define SETUP_TOKEN_TOUCH_DRAW_PRESSED         46
-#define SETUP_TOKEN_TOUCH_GRID_XSIZE_0         47
-#define SETUP_TOKEN_TOUCH_GRID_YSIZE_0         48
-#define SETUP_TOKEN_TOUCH_GRID_XSIZE_1         49
-#define SETUP_TOKEN_TOUCH_GRID_YSIZE_1         50
-
-#define NUM_GLOBAL_SETUP_TOKENS                        51
+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_VSYNC_MODE,
+  SETUP_TOKEN_ASK_ON_ESCAPE,
+  SETUP_TOKEN_ASK_ON_ESCAPE_EDITOR,
+  SETUP_TOKEN_ASK_ON_GAME_OVER,
+  SETUP_TOKEN_QUICK_SWITCH,
+  SETUP_TOKEN_INPUT_ON_FOCUS,
+  SETUP_TOKEN_PREFER_AGA_GRAPHICS,
+  SETUP_TOKEN_GAME_SPEED_EXTENDED,
+  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_NETWORK_SERVER_HOSTNAME,
+  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;
@@ -8488,16 +8600,21 @@ 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" },
   { TYPE_STRING, &si.window_scaling_quality,  "window_scaling_quality" },
   { TYPE_STRING, &si.screen_rendering_mode,   "screen_rendering_mode"  },
+  { TYPE_STRING, &si.vsync_mode,              "vsync_mode"             },
   { TYPE_SWITCH, &si.ask_on_escape,           "ask_on_escape"          },
   { TYPE_SWITCH, &si.ask_on_escape_editor,    "ask_on_escape_editor"   },
+  { TYPE_SWITCH, &si.ask_on_game_over,        "ask_on_game_over"       },
   { TYPE_SWITCH, &si.quick_switch,            "quick_player_switch"    },
   { TYPE_SWITCH, &si.input_on_focus,          "input_on_focus"         },
   { TYPE_SWITCH, &si.prefer_aga_graphics,     "prefer_aga_graphics"    },
+  { TYPE_SWITCH, &si.game_speed_extended,     "game_speed_extended"    },
   { TYPE_INTEGER,&si.game_frame_delay,        "game_frame_delay"       },
   { TYPE_SWITCH, &si.sp_show_border_elements, "sp_show_border_elements"        },
   { TYPE_SWITCH, &si.small_game_graphics,     "small_game_graphics"    },
@@ -8511,6 +8628,9 @@ 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.network_server_hostname, "network_server_hostname"        },
   { 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"    },
@@ -8704,16 +8824,21 @@ 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;
   si->window_scaling_quality = getStringCopy(SCALING_QUALITY_DEFAULT);
   si->screen_rendering_mode = getStringCopy(STR_SPECIAL_RENDERING_DEFAULT);
+  si->vsync_mode = getStringCopy(STR_VSYNC_MODE_DEFAULT);
   si->ask_on_escape = TRUE;
   si->ask_on_escape_editor = TRUE;
+  si->ask_on_game_over = TRUE;
   si->quick_switch = FALSE;
   si->input_on_focus = FALSE;
   si->prefer_aga_graphics = TRUE;
+  si->game_speed_extended = FALSE;
   si->game_frame_delay = GAME_FRAME_DELAY;
   si->sp_show_border_elements = FALSE;
   si->small_game_graphics = FALSE;
@@ -8731,6 +8856,10 @@ 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->network_server_hostname = getStringCopy(STR_NETWORK_AUTO_DETECT);
+
   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 */
@@ -9171,7 +9300,7 @@ void LoadSetupFromFilename(char *filename)
   }
 }
 
-static void LoadSetup_SpecialPostProcessing()
+static void LoadSetup_SpecialPostProcessing(void)
 {
   char *player_name_new;
 
@@ -9192,7 +9321,7 @@ static void LoadSetup_SpecialPostProcessing()
     MIN(MAX(MIN_SCROLL_DELAY, setup.scroll_delay_value), MAX_SCROLL_DELAY);
 }
 
-void LoadSetup()
+void LoadSetup(void)
 {
   char *filename;
 
@@ -9213,7 +9342,7 @@ void LoadSetup()
   LoadSetup_SpecialPostProcessing();
 }
 
-void LoadSetup_AutoSetup()
+void LoadSetup_AutoSetup(void)
 {
   char *filename = getPath2(getSetupDir(), AUTOSETUP_FILENAME);
   SetupFileHash *setup_file_hash = NULL;
@@ -9233,7 +9362,7 @@ void LoadSetup_AutoSetup()
   free(filename);
 }
 
-void LoadSetup_EditorCascade()
+void LoadSetup_EditorCascade(void)
 {
   char *filename = getPath2(getSetupDir(), EDITORCASCADE_FILENAME);
   SetupFileHash *setup_file_hash = NULL;
@@ -9302,7 +9431,7 @@ static void LoadSetup_ReadGameControllerMappings(SetupFileHash *mappings_hash,
   fclose(file);
 }
 
-void SaveSetup()
+void SaveSetup(void)
 {
   char *filename = getSetupFilename();
   FILE *file;
@@ -9326,6 +9455,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)
@@ -9414,7 +9544,7 @@ void SaveSetup()
   SetFilePermissions(filename, PERMS_PRIVATE);
 }
 
-void SaveSetup_AutoSetup()
+void SaveSetup_AutoSetup(void)
 {
   char *filename = getPath2(getSetupDir(), AUTOSETUP_FILENAME);
   FILE *file;
@@ -9442,7 +9572,7 @@ void SaveSetup_AutoSetup()
   free(filename);
 }
 
-void SaveSetup_EditorCascade()
+void SaveSetup_EditorCascade(void)
 {
   char *filename = getPath2(getSetupDir(), EDITORCASCADE_FILENAME);
   FILE *file;
@@ -9511,7 +9641,7 @@ void SaveSetup_AddGameControllerMapping(char *mapping)
   free(filename);
 }
 
-void LoadCustomElementDescriptions()
+void LoadCustomElementDescriptions(void)
 {
   char *filename = getCustomArtworkConfigFilename(ARTWORK_TYPE_GRAPHICS);
   SetupFileHash *setup_file_hash;
@@ -9573,7 +9703,7 @@ static int get_token_parameter_value(char *token, char *value_raw)
   return get_parameter_value(value_raw, suffix, TYPE_INTEGER);
 }
 
-void InitMenuDesignSettings_Static()
+void InitMenuDesignSettings_Static(void)
 {
   int i;
 
@@ -9588,7 +9718,7 @@ void InitMenuDesignSettings_Static()
   }
 }
 
-static void InitMenuDesignSettings_SpecialPreProcessing()
+static void InitMenuDesignSettings_SpecialPreProcessing(void)
 {
   int i;
 
@@ -9680,7 +9810,7 @@ static void InitMenuDesignSettings_SpecialPreProcessing()
   }
 }
 
-static void InitMenuDesignSettings_SpecialPostProcessing()
+static void InitMenuDesignSettings_SpecialPostProcessing(void)
 {
   static struct
   {
@@ -9709,7 +9839,7 @@ static void InitMenuDesignSettings_SpecialPostProcessing()
       *game_buttons_xy[i].dst = *game_buttons_xy[i].src;
 }
 
-static void InitMenuDesignSettings_SpecialPostProcessing_AfterGraphics()
+static void InitMenuDesignSettings_SpecialPostProcessing_AfterGraphics(void)
 {
   static struct
   {
@@ -10143,7 +10273,7 @@ static void LoadMenuDesignSettingsFromFilename(char *filename)
   freeSetupFileHash(setup_file_hash);
 }
 
-void LoadMenuDesignSettings()
+void LoadMenuDesignSettings(void)
 {
   char *filename_base = UNDEFINED_FILENAME, *filename_local;
 
@@ -10167,7 +10297,7 @@ void LoadMenuDesignSettings()
   InitMenuDesignSettings_SpecialPostProcessing();
 }
 
-void LoadMenuDesignSettings_AfterGraphics()
+void LoadMenuDesignSettings_AfterGraphics(void)
 {
   InitMenuDesignSettings_SpecialPostProcessing_AfterGraphics();
 }
@@ -10369,7 +10499,7 @@ static boolean sound_info_listed(struct MusicFileInfo *list, char *basename)
   return music_info_listed_ext(list, basename, TRUE);
 }
 
-void LoadMusicInfo()
+void LoadMusicInfo(void)
 {
   char *music_directory = getCustomMusicDirectory();
   int num_music = getMusicListSize();
@@ -10496,8 +10626,8 @@ void LoadMusicInfo()
   }
 }
 
-void add_helpanim_entry(int element, int action, int direction, int delay,
-                       int *num_list_entries)
+static void add_helpanim_entry(int element, int action, int direction,
+                              int delay, int *num_list_entries)
 {
   struct HelpAnimInfo *new_list_entry;
   (*num_list_entries)++;
@@ -10513,7 +10643,7 @@ void add_helpanim_entry(int element, int action, int direction, int delay,
   new_list_entry->delay = delay;
 }
 
-void print_unknown_token(char *filename, char *token, int token_nr)
+static void print_unknown_token(char *filename, char *token, int token_nr)
 {
   if (token_nr == 0)
   {
@@ -10525,13 +10655,13 @@ void print_unknown_token(char *filename, char *token, int token_nr)
   Error(ERR_INFO, "- token: '%s'", token);
 }
 
-void print_unknown_token_end(int token_nr)
+static void print_unknown_token_end(int token_nr)
 {
   if (token_nr > 0)
     Error(ERR_INFO_LINE, "-");
 }
 
-void LoadHelpAnimInfo()
+void LoadHelpAnimInfo(void)
 {
   char *filename = getHelpAnimFilename();
   SetupFileList *setup_file_list = NULL, *list;
@@ -10741,7 +10871,7 @@ void LoadHelpAnimInfo()
 #endif
 }
 
-void LoadHelpTextInfo()
+void LoadHelpTextInfo(void)
 {
   char *filename = getHelpTextFilename();
   int i;
@@ -10783,7 +10913,7 @@ void LoadHelpTextInfo()
 
 #define MAX_NUM_CONVERT_LEVELS         1000
 
-void ConvertLevels()
+void ConvertLevels(void)
 {
   static LevelDirTree *convert_leveldir = NULL;
   static int convert_level_nr = -1;
@@ -10895,7 +11025,7 @@ void ConvertLevels()
 /* create and save images for use in level sketches (raw BMP format)         */
 /* ------------------------------------------------------------------------- */
 
-void CreateLevelSketchImages()
+void CreateLevelSketchImages(void)
 {
 #if defined(TARGET_SDL)
   Bitmap *bitmap1;