rocksndiamonds-3.1.2
[rocksndiamonds.git] / src / libgame / setup.c
index 4fc58a407b3933a9d6cdd23f69ad54fdf7f06a09..3b9438e6031316e9fec7ebb2fd295c038b5f05e9 100644 (file)
@@ -938,8 +938,13 @@ void dumpTreeInfo(TreeInfo *node, int depth)
     for (i = 0; i < (depth + 1) * 3; i++)
       printf(" ");
 
+#if 1
     printf("subdir == '%s' ['%s', '%s'] [%d])\n",
           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);
+#endif
 
     if (node->node_group != NULL)
       dumpTreeInfo(node->node_group, depth + 1);
@@ -1391,6 +1396,7 @@ char *removeHashEntry(SetupFileHash *hash, char *token)
 }
 
 #if 0
+#ifdef DEBUG
 static void printSetupFileHash(SetupFileHash *hash)
 {
   BEGIN_HASH_ITERATION(hash, itr)
@@ -1401,6 +1407,7 @@ static void printSetupFileHash(SetupFileHash *hash)
   END_HASH_ITERATION(hash, itr)
 }
 #endif
+#endif
 
 static void *loadSetupFileData(char *filename, boolean use_hash)
 {
@@ -1691,6 +1698,7 @@ static void setTreeInfoToDefaultsFromParent(TreeInfo *ldi, TreeInfo *parent)
     return;
   }
 
+#if 1
   /* copy all values from the parent structure */
 
   ldi->type = parent->type;
@@ -1743,6 +1751,47 @@ static void setTreeInfoToDefaultsFromParent(TreeInfo *ldi, TreeInfo *parent)
     ldi->handicap = TRUE;
     ldi->skip_levels = FALSE;
   }
+
+#else
+
+  /* first copy all values from the parent structure ... */
+  *ldi = *parent;
+
+  /* ... then set all fields to default that cannot be inherited from parent.
+     This is especially important for all those fields that can be set from
+     the 'levelinfo.conf' config file, because the function 'setSetupInfo()'
+     calls 'free()' for all already set token values which requires that no
+     other structure's pointer may point to them!
+  */
+
+  ldi->subdir = NULL;
+  ldi->fullpath = NULL;
+  ldi->basepath = NULL;
+  ldi->identifier = NULL;
+  ldi->name = getStringCopy(ANONYMOUS_NAME);
+  ldi->name_sorting = NULL;
+  ldi->author = getStringCopy(parent->author);
+
+  ldi->imported_from = getStringCopy(parent->imported_from);
+  ldi->imported_by = getStringCopy(parent->imported_by);
+  ldi->class_desc = getStringCopy(parent->class_desc);
+
+  ldi->graphics_set = NULL;
+  ldi->sounds_set = NULL;
+  ldi->music_set = NULL;
+  ldi->graphics_path = NULL;
+  ldi->sounds_path = NULL;
+  ldi->music_path = NULL;
+
+  ldi->level_group = FALSE;
+  ldi->parent_link = FALSE;
+
+  ldi->node_top = parent->node_top;
+  ldi->node_parent = parent;
+  ldi->node_group = NULL;
+  ldi->next = NULL;
+
+#endif
 }
 
 static void freeTreeInfo(TreeInfo *ldi)
@@ -1866,6 +1915,7 @@ static void createParentTreeInfoNode(TreeInfo *node_parent)
   ti_new->node_parent = node_parent;
   ti_new->parent_link = TRUE;
 
+#if 1
   setString(&ti_new->identifier, node_parent->identifier);
   setString(&ti_new->name, ".. (parent directory)");
   setString(&ti_new->name_sorting, ti_new->name);
@@ -1877,6 +1927,19 @@ static void createParentTreeInfoNode(TreeInfo *node_parent)
   ti_new->latest_engine = node_parent->latest_engine;
 
   setString(&ti_new->class_desc, getLevelClassDescription(ti_new));
+#else
+  ti_new->identifier = getStringCopy(node_parent->identifier);
+  ti_new->name = ".. (parent directory)";
+  ti_new->name_sorting = getStringCopy(ti_new->name);
+
+  ti_new->subdir = "..";
+  ti_new->fullpath = getStringCopy(node_parent->fullpath);
+
+  ti_new->sort_priority = node_parent->sort_priority;
+  ti_new->latest_engine = node_parent->latest_engine;
+
+  ti_new->class_desc = getLevelClassDescription(ti_new);
+#endif
 
   pushTreeInfo(&node_parent->node_group, ti_new);
 }
@@ -1934,8 +1997,16 @@ static boolean LoadLevelInfoFromLevelConf(TreeInfo **node_first,
                 getHashEntry(setup_file_hash, levelinfo_tokens[i].text));
   *leveldir_new = ldi;
 
+#if 1
   if (strcmp(leveldir_new->name, ANONYMOUS_NAME) == 0)
     setString(&leveldir_new->name, leveldir_new->subdir);
+#else
+  if (strcmp(leveldir_new->name, ANONYMOUS_NAME) == 0)
+  {
+    free(leveldir_new->name);
+    leveldir_new->name = getStringCopy(leveldir_new->subdir);
+  }
+#endif
 
   DrawInitText(leveldir_new->name, 150, FC_YELLOW);
 
@@ -1956,17 +2027,21 @@ static boolean LoadLevelInfoFromLevelConf(TreeInfo **node_first,
     leveldir_new->fullpath = getPath2(node_parent->fullpath, directory_name);
   }
 
-#if 0
   if (leveldir_new->levels < 1)
     leveldir_new->levels = 1;
-#endif
 
   leveldir_new->last_level =
     leveldir_new->first_level + leveldir_new->levels - 1;
 
+#if 1
   leveldir_new->in_user_dir =
     (strcmp(leveldir_new->basepath, options.level_directory) != 0);
+#else
+  leveldir_new->in_user_dir =
+    (leveldir_new->basepath == options.level_directory ? FALSE : TRUE);
+#endif
 
+#if 1
   /* adjust some settings if user's private level directory was detected */
   if (leveldir_new->sort_priority == LEVELCLASS_UNDEFINED &&
       leveldir_new->in_user_dir &&
@@ -1978,30 +2053,28 @@ static boolean LoadLevelInfoFromLevelConf(TreeInfo **node_first,
     leveldir_new->readonly = FALSE;
   }
 
+#else
+  /* 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));
+#else
+  leveldir_new->class_desc = getLevelClassDescription(leveldir_new);
+#endif
 
   leveldir_new->handicap_level =       /* set handicap to default value */
     (leveldir_new->user_defined || !leveldir_new->handicap ?
      leveldir_new->last_level : leveldir_new->first_level);
 
-#if 1
-  if (leveldir_new->levels < 1 && !leveldir_new->level_group)
-  {
-    /* skip level sets without levels (which are probably artwork base sets) */
-
-    freeSetupFileHash(setup_file_hash);
-    free(directory_path);
-    free(filename);
-
-    return FALSE;
-  }
-#endif
-
   pushTreeInfo(node_first, leveldir_new);
 
   freeSetupFileHash(setup_file_hash);
@@ -2176,8 +2249,16 @@ static boolean LoadArtworkInfoFromArtworkConf(TreeInfo **node_first,
                   getHashEntry(setup_file_hash, levelinfo_tokens[i].text));
     *artwork_new = ldi;
 
+#if 1
     if (strcmp(artwork_new->name, ANONYMOUS_NAME) == 0)
       setString(&artwork_new->name, artwork_new->subdir);
+#else
+    if (strcmp(artwork_new->name, ANONYMOUS_NAME) == 0)
+    {
+      free(artwork_new->name);
+      artwork_new->name = getStringCopy(artwork_new->subdir);
+    }
+#endif
 
 #if 0
     DrawInitText(artwork_new->name, 150, FC_YELLOW);
@@ -2201,42 +2282,86 @@ static boolean LoadArtworkInfoFromArtworkConf(TreeInfo **node_first,
     artwork_new->fullpath = getPath2(node_parent->fullpath, directory_name);
   }
 
+#if 1
   artwork_new->in_user_dir =
     (strcmp(artwork_new->basepath, OPTIONS_ARTWORK_DIRECTORY(type)) != 0);
+#else
+  artwork_new->in_user_dir =
+    (artwork_new->basepath == OPTIONS_ARTWORK_DIRECTORY(type) ? FALSE : TRUE);
+#endif
 
   /* (may use ".sort_priority" from "setup_file_hash" above) */
   artwork_new->color = ARTWORKCOLOR(artwork_new);
-
+#if 1
   setString(&artwork_new->class_desc, getLevelClassDescription(artwork_new));
+#else
+  artwork_new->class_desc = getLevelClassDescription(artwork_new);
+#endif
 
   if (setup_file_hash == NULL) /* (after determining ".user_defined") */
   {
+#if 0
+    if (artwork_new->name != NULL)
+    {
+      free(artwork_new->name);
+      artwork_new->name = NULL;
+    }
+#endif
+
+#if 0
+    if (artwork_new->identifier != NULL)
+    {
+      free(artwork_new->identifier);
+      artwork_new->identifier = NULL;
+    }
+#endif
+
     if (strcmp(artwork_new->subdir, ".") == 0)
     {
       if (artwork_new->user_defined)
       {
+#if 1
        setString(&artwork_new->identifier, "private");
+#else
+       artwork_new->identifier = getStringCopy("private");
+#endif
        artwork_new->sort_priority = ARTWORKCLASS_PRIVATE;
       }
       else
       {
+#if 1
        setString(&artwork_new->identifier, "classic");
+#else
+       artwork_new->identifier = getStringCopy("classic");
+#endif
        artwork_new->sort_priority = ARTWORKCLASS_CLASSICS;
       }
 
       /* set to new values after changing ".sort_priority" */
       artwork_new->color = ARTWORKCOLOR(artwork_new);
-
+#if 1
       setString(&artwork_new->class_desc,
                getLevelClassDescription(artwork_new));
+#else
+      artwork_new->class_desc = getLevelClassDescription(artwork_new);
+#endif
     }
     else
     {
+#if 1
       setString(&artwork_new->identifier, artwork_new->subdir);
+#else
+      artwork_new->identifier = getStringCopy(artwork_new->subdir);
+#endif
     }
 
+#if 1
     setString(&artwork_new->name, artwork_new->identifier);
     setString(&artwork_new->name_sorting, artwork_new->name);
+#else
+    artwork_new->name = getStringCopy(artwork_new->identifier);
+    artwork_new->name_sorting = getStringCopy(artwork_new->name);
+#endif
   }
 
   DrawInitText(artwork_new->name, 150, FC_YELLOW);
@@ -2314,6 +2439,7 @@ static TreeInfo *getDummyArtworkInfo(int type)
 
   setTreeInfoToDefaults(artwork_new, type);
 
+#if 1
   setString(&artwork_new->subdir,   UNDEFINED_FILENAME);
   setString(&artwork_new->fullpath, UNDEFINED_FILENAME);
   setString(&artwork_new->basepath, UNDEFINED_FILENAME);
@@ -2321,6 +2447,17 @@ static TreeInfo *getDummyArtworkInfo(int type)
   setString(&artwork_new->identifier,   UNDEFINED_FILENAME);
   setString(&artwork_new->name,         UNDEFINED_FILENAME);
   setString(&artwork_new->name_sorting, UNDEFINED_FILENAME);
+#else
+  artwork_new->subdir   = getStringCopy(UNDEFINED_FILENAME);
+  artwork_new->fullpath = getStringCopy(UNDEFINED_FILENAME);
+  artwork_new->basepath = getStringCopy(UNDEFINED_FILENAME);
+
+  checked_free(artwork_new->name);
+
+  artwork_new->identifier   = getStringCopy(UNDEFINED_FILENAME);
+  artwork_new->name         = getStringCopy(UNDEFINED_FILENAME);
+  artwork_new->name_sorting = getStringCopy(UNDEFINED_FILENAME);
+#endif
 
   return artwork_new;
 }
@@ -2413,6 +2550,12 @@ void LoadArtworkInfoFromLevelInfo(ArtworkDirTree **artwork_node,
     char *path = getPath2(getLevelDirFromTreeInfo(level_node),
                          ARTWORK_DIRECTORY((*artwork_node)->type));
 
+#if 0
+    if (!level_node->parent_link)
+      printf("CHECKING '%s' ['%s', '%s'] ...\n", path,
+            level_node->subdir, level_node->name);
+#endif
+
     if (!level_node->parent_link)
     {
       TreeInfo *topnode_last = *artwork_node;
@@ -2519,10 +2662,29 @@ static void SaveUserLevelInfo()
   /* always start with reliable default values */
   setTreeInfoToDefaults(level_info, TREE_TYPE_LEVEL_DIR);
 
+#if 1
   setString(&level_info->name, getLoginName());
   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());
+  ldi.levels = 100;
+  ldi.first_level = 1;
+  ldi.sort_priority = LEVELCLASS_PRIVATE_START;
+  ldi.readonly = FALSE;
+  ldi.graphics_set = getStringCopy(GFX_CLASSIC_SUBDIR);
+  ldi.sounds_set = getStringCopy(SND_CLASSIC_SUBDIR);
+  ldi.music_set = getStringCopy(MUS_CLASSIC_SUBDIR);
+#endif
 
   token_value_position = TOKEN_VALUE_POSITION_SHORT;
 
@@ -2532,6 +2694,7 @@ static void SaveUserLevelInfo()
   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 ||
@@ -2541,6 +2704,15 @@ static void SaveUserLevelInfo()
     /* 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 &&
+       i != LEVELINFO_TOKEN_IMPORTED_BY &&
+       i != LEVELINFO_TOKEN_FILENAME &&
+       i != LEVELINFO_TOKEN_FILETYPE)
+      fprintf(file, "%s\n", getSetupLine(levelinfo_tokens, "", i));
+#endif
   }
 
   token_value_position = TOKEN_VALUE_POSITION_DEFAULT;