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(), HELPANIM_FILENAME);
+ filename = getPath2(getCurrentLevelDir(), basename);
+
+ if (fileExists(filename))
+ break;
+
+ 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;
- return filename;
+ free(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)
#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;
*(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:
strcpy(value_string, (*(boolean *)value ? "on" : "off"));
break;
- case TYPE_SWITCH3:
- strcpy(value_string, (*(int *)value == MODE_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:
break;
case TYPE_YES_NO_AUTO:
- strcpy(value_string, (*(int *)value == MODE_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: