rnd-20050603-1-src
[rocksndiamonds.git] / src / libgame / setup.c
index 16cb1f0fbd88ad6667b9cd1aeedcce41a65e47f7..967fbcfacd60a10e9f36eacfdcd74b3fbd11a3a7 100644 (file)
@@ -73,10 +73,14 @@ static char *levelclass_desc[NUM_LEVELCLASS_DESC] =
                           IS_ARTWORKCLASS_PRIVATE(n) ?         3 :     \
                           9)
 
-#define TOKEN_VALUE_POSITION           40
-#define TOKEN_COMMENT_POSITION         60
+#define TOKEN_VALUE_POSITION_SHORT             32
+#define TOKEN_VALUE_POSITION_DEFAULT           40
+#define TOKEN_COMMENT_POSITION_DEFAULT         60
 
-#define MAX_COOKIE_LEN                 256
+#define MAX_COOKIE_LEN                         256
+
+static int token_value_position   = TOKEN_VALUE_POSITION_DEFAULT;
+static int token_comment_position = TOKEN_COMMENT_POSITION_DEFAULT;
 
 
 /* ------------------------------------------------------------------------- */
@@ -150,7 +154,7 @@ static char *getLevelDirFromTreeInfo(TreeInfo *node)
 
   checked_free(level_dir);
 
-  level_dir = getPath2((node->user_defined ? getUserLevelDir(NULL) :
+  level_dir = getPath2((node->in_user_dir ? getUserLevelDir(NULL) :
                        options.level_directory), node->fullpath);
 
   return level_dir;
@@ -776,7 +780,7 @@ static void SaveUserLevelInfo();
 
 void InitUserLevelDirectory(char *level_subdir)
 {
-  if (access(getUserLevelDir(level_subdir), F_OK) != 0)
+  if (!fileExists(getUserLevelDir(level_subdir)))
   {
     createDirectory(getUserDataDir(), "user data", PERMS_PRIVATE);
     createDirectory(getUserLevelDir(NULL), "main user level", PERMS_PRIVATE);
@@ -936,7 +940,7 @@ void dumpTreeInfo(TreeInfo *node, int depth)
 
 #if 1
     printf("subdir == '%s' ['%s', '%s'] [%d])\n",
-          node->subdir, node->fullpath, node->basepath, node->user_defined);
+          node->subdir, node->fullpath, node->basepath, node->in_user_dir);
 #else
     printf("subdir == '%s' (%s) [%s] (%d)\n",
           node->subdir, node->name, node->identifier, node->sort_priority);
@@ -1110,7 +1114,7 @@ void createDirectory(char *dir, char *text, int permission_class)
   mode_t group_umask = ~(dir_mode & S_IRWXG);
   posix_umask(normal_umask & group_umask);
 
-  if (access(dir, F_OK) != 0)
+  if (!fileExists(dir))
     if (posix_mkdir(dir, dir_mode) != 0)
       Error(ERR_WARN, "cannot create %s directory '%s'", text, dir);
 
@@ -1205,7 +1209,7 @@ char *getFormattedSetupEntry(char *token, char *value)
 
   /* start with the token and some spaces to format output line */
   sprintf(entry, "%s:", token);
-  for (i = strlen(entry); i < TOKEN_VALUE_POSITION; i++)
+  for (i = strlen(entry); i < token_value_position; i++)
     strcat(entry, " ");
 
   /* continue with the token's value */
@@ -1413,17 +1417,18 @@ static void *loadSetupFileData(char *filename, boolean use_hash)
   boolean read_continued_line = FALSE;
   FILE *file;
 
-  if (use_hash)
-    setup_file_data = newSetupFileHash();
-  else
-    insert_ptr = setup_file_data = newSetupFileList("", "");
-
   if (!(file = fopen(filename, MODE_READ)))
   {
     Error(ERR_WARN, "cannot open configuration file '%s'", filename);
+
     return NULL;
   }
 
+  if (use_hash)
+    setup_file_data = newSetupFileHash();
+  else
+    insert_ptr = setup_file_data = newSetupFileList("", "");
+
   while (!feof(file))
   {
     /* read next line of input file */
@@ -1593,8 +1598,9 @@ void checkSetupFileHashIdentifier(SetupFileHash *setup_file_hash,
 #define LEVELINFO_TOKEN_FILENAME       15
 #define LEVELINFO_TOKEN_FILETYPE       16
 #define LEVELINFO_TOKEN_HANDICAP       17
+#define LEVELINFO_TOKEN_SKIP_LEVELS    18
 
-#define NUM_LEVELINFO_TOKENS           18
+#define NUM_LEVELINFO_TOKENS           19
 
 static LevelDirTree ldi;
 
@@ -1618,7 +1624,8 @@ static struct TokenInfo levelinfo_tokens[] =
   { TYPE_STRING,       &ldi.music_set,         "music_set"     },
   { TYPE_STRING,       &ldi.level_filename,    "filename"      },
   { TYPE_STRING,       &ldi.level_filetype,    "filetype"      },
-  { TYPE_BOOLEAN,      &ldi.handicap,          "handicap"      }
+  { TYPE_BOOLEAN,      &ldi.handicap,          "handicap"      },
+  { TYPE_BOOLEAN,      &ldi.skip_levels,       "skip_levels"   }
 };
 
 static void setTreeInfoToDefaults(TreeInfo *ldi, int type)
@@ -1649,6 +1656,7 @@ static void setTreeInfoToDefaults(TreeInfo *ldi, int type)
   ldi->sort_priority = LEVELCLASS_UNDEFINED;   /* default: least priority */
   ldi->latest_engine = FALSE;                  /* default: get from level */
   ldi->parent_link = FALSE;
+  ldi->in_user_dir = FALSE;
   ldi->user_defined = FALSE;
   ldi->color = 0;
   ldi->class_desc = NULL;
@@ -1675,6 +1683,7 @@ static void setTreeInfoToDefaults(TreeInfo *ldi, int type)
     ldi->handicap_level = 0;
     ldi->readonly = TRUE;
     ldi->handicap = TRUE;
+    ldi->skip_levels = FALSE;
   }
 }
 
@@ -1713,6 +1722,7 @@ static void setTreeInfoToDefaultsFromParent(TreeInfo *ldi, TreeInfo *parent)
   ldi->sort_priority = parent->sort_priority;
   ldi->latest_engine = parent->latest_engine;
   ldi->parent_link = FALSE;
+  ldi->in_user_dir = parent->in_user_dir;
   ldi->user_defined = parent->user_defined;
   ldi->color = parent->color;
   ldi->class_desc = getStringCopy(parent->class_desc);
@@ -1739,6 +1749,7 @@ static void setTreeInfoToDefaultsFromParent(TreeInfo *ldi, TreeInfo *parent)
     ldi->handicap_level = 0;
     ldi->readonly = TRUE;
     ldi->handicap = TRUE;
+    ldi->skip_levels = FALSE;
   }
 
 #else
@@ -1943,10 +1954,21 @@ static boolean LoadLevelInfoFromLevelConf(TreeInfo **node_first,
 {
   char *directory_path = getPath2(level_directory, directory_name);
   char *filename = getPath2(directory_path, LEVELINFO_FILENAME);
-  SetupFileHash *setup_file_hash = loadSetupFileHash(filename);
+  SetupFileHash *setup_file_hash;
   LevelDirTree *leveldir_new = NULL;
   int i;
 
+  /* unless debugging, silently ignore directories without "levelinfo.conf" */
+  if (!options.debug && !fileExists(filename))
+  {
+    free(directory_path);
+    free(filename);
+
+    return FALSE;
+  }
+
+  setup_file_hash = loadSetupFileHash(filename);
+
   if (setup_file_hash == NULL)
   {
     Error(ERR_WARN, "ignoring level directory '%s'", directory_path);
@@ -2012,13 +2034,24 @@ static boolean LoadLevelInfoFromLevelConf(TreeInfo **node_first,
     leveldir_new->first_level + leveldir_new->levels - 1;
 
 #if 1
-  leveldir_new->user_defined =
+  leveldir_new->in_user_dir =
     (strcmp(leveldir_new->basepath, options.level_directory) != 0);
 #else
-  leveldir_new->user_defined =
+  leveldir_new->in_user_dir =
     (leveldir_new->basepath == options.level_directory ? FALSE : TRUE);
 #endif
 
+#if 1
+  /* adjust sort priority if user's private level directory was detected */
+  if (leveldir_new->sort_priority == LEVELCLASS_UNDEFINED &&
+      leveldir_new->in_user_dir &&
+      strcmp(leveldir_new->subdir, getLoginName()) == 0)
+    leveldir_new->sort_priority = LEVELCLASS_PRIVATE_START;
+#endif
+
+  leveldir_new->user_defined =
+    (leveldir_new->in_user_dir && IS_LEVELCLASS_PRIVATE(leveldir_new));
+
   leveldir_new->color = LEVELCOLOR(leveldir_new);
 #if 1
   setString(&leveldir_new->class_desc, getLevelClassDescription(leveldir_new));
@@ -2145,7 +2178,7 @@ static boolean LoadArtworkInfoFromArtworkConf(TreeInfo **node_first,
   TreeInfo *artwork_new = NULL;
   int i;
 
-  if (access(filename, F_OK) == 0)             /* file exists */
+  if (fileExists(filename))
     setup_file_hash = loadSetupFileHash(filename);
 
   if (setup_file_hash == NULL) /* no config file -- look for artwork files */
@@ -2238,10 +2271,10 @@ static boolean LoadArtworkInfoFromArtworkConf(TreeInfo **node_first,
   }
 
 #if 1
-  artwork_new->user_defined =
+  artwork_new->in_user_dir =
     (strcmp(artwork_new->basepath, OPTIONS_ARTWORK_DIRECTORY(type)) != 0);
 #else
-  artwork_new->user_defined =
+  artwork_new->in_user_dir =
     (artwork_new->basepath == OPTIONS_ARTWORK_DIRECTORY(type) ? FALSE : TRUE);
 #endif
 
@@ -2622,11 +2655,13 @@ static void SaveUserLevelInfo()
   setString(&level_info->author, getRealName());
   level_info->levels = 100;
   level_info->first_level = 1;
+#if 0
   level_info->sort_priority = LEVELCLASS_PRIVATE_START;
   level_info->readonly = FALSE;
   setString(&level_info->graphics_set, GFX_CLASSIC_SUBDIR);
   setString(&level_info->sounds_set,   SND_CLASSIC_SUBDIR);
   setString(&level_info->music_set,    MUS_CLASSIC_SUBDIR);
+#endif
 #else
   ldi.name = getStringCopy(getLoginName());
   ldi.author = getStringCopy(getRealName());
@@ -2639,11 +2674,25 @@ static void SaveUserLevelInfo()
   ldi.music_set = getStringCopy(MUS_CLASSIC_SUBDIR);
 #endif
 
+  token_value_position = TOKEN_VALUE_POSITION_SHORT;
+
   fprintf(file, "%s\n\n", getFormattedSetupEntry(TOKEN_STR_FILE_IDENTIFIER,
                                                 getCookie("LEVELINFO")));
 
   ldi = *level_info;
   for (i = 0; i < NUM_LEVELINFO_TOKENS; i++)
+  {
+#if 1
+    if (i == LEVELINFO_TOKEN_NAME ||
+       i == LEVELINFO_TOKEN_AUTHOR ||
+       i == LEVELINFO_TOKEN_LEVELS ||
+       i == LEVELINFO_TOKEN_FIRST_LEVEL)
+      fprintf(file, "%s\n", getSetupLine(levelinfo_tokens, "", i));
+
+    /* just to make things nicer :) */
+    if (i == LEVELINFO_TOKEN_AUTHOR)
+      fprintf(file, "\n");     
+#else
     if (i != LEVELINFO_TOKEN_IDENTIFIER &&
        i != LEVELINFO_TOKEN_NAME_SORTING &&
        i != LEVELINFO_TOKEN_IMPORTED_FROM &&
@@ -2651,6 +2700,10 @@ static void SaveUserLevelInfo()
        i != LEVELINFO_TOKEN_FILENAME &&
        i != LEVELINFO_TOKEN_FILETYPE)
       fprintf(file, "%s\n", getSetupLine(levelinfo_tokens, "", i));
+#endif
+  }
+
+  token_value_position = TOKEN_VALUE_POSITION_DEFAULT;
 
   fclose(file);
 
@@ -2732,7 +2785,7 @@ char *getSetupLine(struct TokenInfo *token_info, char *prefix, int token_nr)
     {
       /* add at least one whitespace */
       strcat(line, " ");
-      for (i = strlen(line); i < TOKEN_COMMENT_POSITION; i++)
+      for (i = strlen(line); i < token_comment_position; i++)
        strcat(line, " ");
 
       strcat(line, "# ");
@@ -2814,7 +2867,7 @@ static void checkSeriesInfo()
 
   /* check for more levels besides the 'levels' field of 'levelinfo.conf' */
 
-  level_directory = getPath2((leveldir_current->user_defined ?
+  level_directory = getPath2((leveldir_current->in_user_dir ?
                              getUserLevelDir(NULL) :
                              options.level_directory),
                             leveldir_current->fullpath);