cleanup of unnecessarily convoluted function call
[rocksndiamonds.git] / src / libgame / setup.c
index e34ed89adcf198497e92c2f8ca948982f1f793c0..fb63321bd2499bebec9a95c4dc63055f9bd6e30f 100644 (file)
@@ -797,26 +797,68 @@ char *getEditorSetupFilename(void)
   return filename;
 }
 
-char *getHelpAnimFilename(void)
+char *getFilenameFromCurrentLevelDirUpward(char *basename)
 {
+  // global variable "leveldir_current" must be modified in the loop below
+  LevelDirTree *leveldir_current_last = leveldir_current;
   static char *filename = NULL;
 
-  checked_free(filename);
+  // check for filename in path from current to topmost tree node
+
+  while (leveldir_current != NULL)
+  {
+    checked_free(filename);
+
+    filename = getPath2(getCurrentLevelDir(), basename);
+
+    if (fileExists(filename))
+      break;
 
-  filename = getPath2(getCurrentLevelDir(), HELPANIM_FILENAME);
+    leveldir_current = leveldir_current->node_parent;
+  }
+
+  // restore global variable "leveldir_current" modified in above loop
+  leveldir_current = leveldir_current_last;
 
   return filename;
 }
 
-char *getHelpTextFilename(void)
+static char *getHelpFilename(char *basename)
 {
   static char *filename = NULL;
 
   checked_free(filename);
 
-  filename = getPath2(getCurrentLevelDir(), HELPTEXT_FILENAME);
+  // 1st try: look for help filename in current level set directory
+  filename = getPath2(getCurrentLevelDir(), basename);
+  if (fileExists(filename))
+    return filename;
+
+  free(filename);
 
-  return filename;
+  // 2nd try: look for help filename in configured graphics set directory
+  filename = getPath2(getLevelArtworkDir(ARTWORK_TYPE_GRAPHICS), basename);
+  if (fileExists(filename))
+    return filename;
+
+  free(filename);
+
+  // 3rd try: look for help filename in path from current to topmost level set directory
+  filename = getStringCopy(getFilenameFromCurrentLevelDirUpward(basename));
+  if (fileExists(filename))
+    return filename;
+
+  return NULL;
+}
+
+char *getHelpAnimFilename(void)
+{
+  return getHelpFilename(HELPANIM_FILENAME);
+}
+
+char *getHelpTextFilename(void)
+{
+  return getHelpFilename(HELPTEXT_FILENAME);
 }
 
 static char *getLevelSetInfoBasename(int nr)
@@ -2331,7 +2373,7 @@ int hash_key_integers_are_equal(void *key1, void *key2)
 SetupFileHash *newSetupFileHash(void)
 {
   SetupFileHash *new_hash =
-    create_hashtable(16, 0.75, get_hash_from_string, hash_key_strings_are_equal);
+    create_hashtable(get_hash_from_string, hash_key_strings_are_equal, free, free);
 
   if (new_hash == NULL)
     Fail("create_hashtable() failed -- out of memory");
@@ -2344,7 +2386,7 @@ void freeSetupFileHash(SetupFileHash *hash)
   if (hash == NULL)
     return;
 
-  hashtable_destroy(hash, 1);  // 1 == also free values stored in hash
+  hashtable_destroy(hash);
 }
 
 char *getHashEntry(SetupFileHash *hash, char *token)
@@ -2370,12 +2412,12 @@ void setHashEntry(SetupFileHash *hash, char *token, char *value)
       Fail("cannot insert into hash -- aborting");
 }
 
-char *removeHashEntry(SetupFileHash *hash, char *token)
+void removeHashEntry(SetupFileHash *hash, char *token)
 {
   if (hash == NULL)
-    return NULL;
+    return;
 
-  return remove_hash_entry(hash, token);
+  remove_hash_entry(hash, token);
 }
 
 #if ENABLE_UNUSED_CODE
@@ -2831,10 +2873,11 @@ SetupFileHash *loadSetupFileHash(char *filename)
 #define LEVELINFO_TOKEN_HANDICAP               29
 #define LEVELINFO_TOKEN_TIME_LIMIT             30
 #define LEVELINFO_TOKEN_SKIP_LEVELS            31
-#define LEVELINFO_TOKEN_USE_EMC_TILES          32
-#define LEVELINFO_TOKEN_INFO_SCREENS_FROM_MAIN 33
+#define LEVELINFO_TOKEN_ALLOW_SKIPPING_LEVELS  32
+#define LEVELINFO_TOKEN_USE_EMC_TILES          33
+#define LEVELINFO_TOKEN_INFO_SCREENS_FROM_MAIN 34
 
-#define NUM_LEVELINFO_TOKENS                   34
+#define NUM_LEVELINFO_TOKENS                   35
 
 static LevelDirTree ldi;
 
@@ -2858,6 +2901,8 @@ static struct TokenInfo levelinfo_tokens[] =
   { TYPE_BOOLEAN,      &ldi.latest_engine,     "latest_engine"         },
   { TYPE_BOOLEAN,      &ldi.level_group,       "level_group"           },
   { TYPE_BOOLEAN,      &ldi.readonly,          "readonly"              },
+  { TYPE_STRING,       &ldi.graphics_set_ecs,  "graphics_set.old"      },
+  { TYPE_STRING,       &ldi.graphics_set_aga,  "graphics_set.new"      },
   { TYPE_STRING,       &ldi.graphics_set_ecs,  "graphics_set.ecs"      },
   { TYPE_STRING,       &ldi.graphics_set_aga,  "graphics_set.aga"      },
   { TYPE_STRING,       &ldi.graphics_set,      "graphics_set"          },
@@ -3230,8 +3275,8 @@ void setSetupInfo(struct TokenInfo *token_info,
       *(boolean *)setup_value = get_boolean_from_string(token_value);
       break;
 
-    case TYPE_SWITCH3:
-      *(int *)setup_value = get_switch3_from_string(token_value);
+    case TYPE_SWITCH_3_STATES:
+      *(int *)setup_value = get_switch_3_state_from_string(token_value);
       break;
 
     case TYPE_KEY:
@@ -4859,9 +4904,10 @@ char *getSetupValue(int type, void *value)
       strcpy(value_string, (*(boolean *)value ? "on" : "off"));
       break;
 
-    case TYPE_SWITCH3:
-      strcpy(value_string, (*(int *)value == AUTO  ? "auto" :
-                           *(int *)value == FALSE ? "off" : "on"));
+    case TYPE_SWITCH_3_STATES:
+      strcpy(value_string, (*(int *)value == STATE_AUTO  ? "auto" :
+                           *(int *)value == STATE_ASK   ? "ask" :
+                           *(int *)value == STATE_FALSE ? "off" : "on"));
       break;
 
     case TYPE_YES_NO:
@@ -4869,12 +4915,17 @@ char *getSetupValue(int type, void *value)
       break;
 
     case TYPE_YES_NO_AUTO:
-      strcpy(value_string, (*(int *)value == AUTO  ? "auto" :
-                           *(int *)value == FALSE ? "no" : "yes"));
+      strcpy(value_string, (*(int *)value == STATE_AUTO  ? "auto" :
+                           *(int *)value == STATE_FALSE ? "no" : "yes"));
+      break;
+
+    case TYPE_YES_NO_ASK:
+      strcpy(value_string, (*(int *)value == STATE_ASK   ? "ask" :
+                           *(int *)value == STATE_FALSE ? "no" : "yes"));
       break;
 
     case TYPE_ECS_AGA:
-      strcpy(value_string, (*(boolean *)value ? "AGA" : "ECS"));
+      strcpy(value_string, (*(boolean *)value ? "new" : "old"));
       break;
 
     case TYPE_KEY: