9)
#define TOKEN_VALUE_POSITION 40
+#define TOKEN_COMMENT_POSITION 60
#define MAX_COOKIE_LEN 256
+#define ARTWORKINFO_FILENAME(type) ((type) == TREE_TYPE_GRAPHICS_DIR ? \
+ GRAPHICSINFO_FILENAME : \
+ (type) == TREE_TYPE_SOUNDS_DIR ? \
+ SOUNDSINFO_FILENAME : \
+ (type) == TREE_TYPE_MUSIC_DIR ? \
+ MUSICINFO_FILENAME : "")
+
+#define ARTWORK_DIRECTORY(type) ((type) == TREE_TYPE_GRAPHICS_DIR ? \
+ GRAPHICS_DIRECTORY : \
+ (type) == TREE_TYPE_SOUNDS_DIR ? \
+ SOUNDS_DIRECTORY : \
+ (type) == TREE_TYPE_MUSIC_DIR ? \
+ MUSIC_DIRECTORY : "")
+
+#define OPTIONS_ARTWORK_DIRECTORY(type) ((type) == TREE_TYPE_GRAPHICS_DIR ? \
+ options.graphics_directory : \
+ (type) == TREE_TYPE_SOUNDS_DIR ? \
+ options.sounds_directory : \
+ (type) == TREE_TYPE_MUSIC_DIR ? \
+ options.music_directory : "")
+
/* ------------------------------------------------------------------------- */
/* file functions */
return levelsetup_dir;
}
-static char *getCurrentLevelDir()
+static char *getLevelDirFromTreeInfo(TreeInfo *node)
{
static char *level_dir = NULL;
+ if (node == NULL)
+ return options.level_directory;
+
if (level_dir)
free(level_dir);
- if (leveldir_current == NULL)
- return options.level_directory;
-
- level_dir = getPath2((leveldir_current->user_defined ?
- getUserLevelDir(NULL) : options.level_directory),
- leveldir_current->fullpath);
+ level_dir = getPath2((node->user_defined ? getUserLevelDir(NULL) :
+ options.level_directory), node->fullpath);
return level_dir;
}
+static char *getCurrentLevelDir()
+{
+ return getLevelDirFromTreeInfo(leveldir_current);
+}
+
static char *getDefaultGraphicsDir(char *graphics_subdir)
{
static char *graphics_dir = NULL;
basename = getCorrectedImageBasename(basename);
- /* 1st try: look for special artwork in current level series directory */
- filename = getPath3(getCurrentLevelDir(), GRAPHICS_DIRECTORY, basename);
- if (fileExists(filename))
- return filename;
-
- /* 2nd try: look for special artwork in private artwork directory */
- filename = getPath2(getUserGraphicsDir(), basename);
- if (fileExists(filename))
- return filename;
+ if (!setup.override_level_graphics)
+ {
+ /* 1st try: look for special artwork in current level series directory */
+ filename = getPath3(getCurrentLevelDir(), GRAPHICS_DIRECTORY, basename);
+ if (fileExists(filename))
+ return filename;
+ }
- /* 3rd try: look for special artwork in configured artwork directory */
+ /* 2nd try: look for special artwork in configured artwork directory */
filename = getPath2(getSetupArtworkDir(artwork.gfx_current), basename);
if (fileExists(filename))
return filename;
- /* 4th try: look for default artwork in new default artwork directory */
+ /* 3rd try: look for default artwork in new default artwork directory */
filename = getPath2(getDefaultGraphicsDir(GRAPHICS_SUBDIR), basename);
if (fileExists(filename))
return filename;
- /* 5th try: look for default artwork in old default artwork directory */
+ /* 4th try: look for default artwork in old default artwork directory */
filename = getPath2(options.graphics_directory, basename);
if (fileExists(filename))
return filename;
- return NULL; /* cannot find image file */
+ return NULL; /* cannot find specified artwork file anywhere */
}
char *getCustomSoundFilename(char *basename)
if (filename != NULL)
free(filename);
- /* 1st try: look for special artwork in current level series directory */
- filename = getPath3(getCurrentLevelDir(), SOUNDS_DIRECTORY, basename);
- if (fileExists(filename))
- return filename;
-
- /* 2nd try: look for special artwork in private artwork directory */
- filename = getPath2(getUserSoundsDir(), basename);
- if (fileExists(filename))
- return filename;
+ if (!setup.override_level_sounds)
+ {
+ /* 1st try: look for special artwork in current level series directory */
+ filename = getPath3(getCurrentLevelDir(), SOUNDS_DIRECTORY, basename);
+ if (fileExists(filename))
+ return filename;
+ }
- /* 3rd try: look for special artwork in configured artwork directory */
+ /* 2nd try: look for special artwork in configured artwork directory */
filename = getPath2(getSetupArtworkDir(artwork.snd_current), basename);
if (fileExists(filename))
return filename;
- /* 4th try: look for default artwork in new default artwork directory */
+ /* 3rd try: look for default artwork in new default artwork directory */
filename = getPath2(getDefaultSoundsDir(SOUNDS_SUBDIR), basename);
if (fileExists(filename))
return filename;
- /* 5th try: look for default artwork in old default artwork directory */
+ /* 4th try: look for default artwork in old default artwork directory */
filename = getPath2(options.sounds_directory, basename);
if (fileExists(filename))
return filename;
- return NULL; /* cannot find image file */
+ return NULL; /* cannot find specified artwork file anywhere */
}
char *getCustomSoundConfigFilename()
if (directory != NULL)
free(directory);
- /* 1st try: look for special artwork in current level series directory */
- directory = getPath2(getCurrentLevelDir(), MUSIC_DIRECTORY);
- if (fileExists(directory))
- return directory;
-
- /* 2nd try: look for special artwork in private artwork directory */
- directory = getStringCopy(getUserMusicDir());
- if (fileExists(directory))
- return directory;
+ if (!setup.override_level_music)
+ {
+ /* 1st try: look for special artwork in current level series directory */
+ directory = getPath2(getCurrentLevelDir(), MUSIC_DIRECTORY);
+ if (fileExists(directory))
+ return directory;
+ }
- /* 3rd try: look for special artwork in configured artwork directory */
+ /* 2nd try: look for special artwork in configured artwork directory */
directory = getStringCopy(getSetupArtworkDir(artwork.mus_current));
if (fileExists(directory))
return directory;
- /* 4th try: look for default artwork in new default artwork directory */
+ /* 3rd try: look for default artwork in new default artwork directory */
directory = getStringCopy(getDefaultMusicDir(MUSIC_SUBDIR));
if (fileExists(directory))
return directory;
- /* 5th try: look for default artwork in old default artwork directory */
+ /* 4th try: look for default artwork in old default artwork directory */
directory = getStringCopy(options.music_directory);
if (fileExists(directory))
return directory;
- return NULL; /* cannot find image file */
+ return NULL; /* cannot find specified artwork file anywhere */
}
void InitTapeDirectory(char *level_subdir)
createDirectory(getLevelSetupDir(level_subdir), "level setup",PERMS_PRIVATE);
}
-void ReadChunk_VERS(FILE *file, int *file_version, int *game_version)
-{
- int file_version_major, file_version_minor, file_version_patch;
- int game_version_major, game_version_minor, game_version_patch;
-
- file_version_major = fgetc(file);
- file_version_minor = fgetc(file);
- file_version_patch = fgetc(file);
- fgetc(file); /* not used */
-
- game_version_major = fgetc(file);
- game_version_minor = fgetc(file);
- game_version_patch = fgetc(file);
- fgetc(file); /* not used */
-
- *file_version = VERSION_IDENT(file_version_major,
- file_version_minor,
- file_version_patch);
-
- *game_version = VERSION_IDENT(game_version_major,
- game_version_minor,
- game_version_patch);
-}
-
-void WriteChunk_VERS(FILE *file, int file_version, int game_version)
-{
- int file_version_major = VERSION_MAJOR(file_version);
- int file_version_minor = VERSION_MINOR(file_version);
- int file_version_patch = VERSION_PATCH(file_version);
- int game_version_major = VERSION_MAJOR(game_version);
- int game_version_minor = VERSION_MINOR(game_version);
- int game_version_patch = VERSION_PATCH(game_version);
-
- fputc(file_version_major, file);
- fputc(file_version_minor, file);
- fputc(file_version_patch, file);
- fputc(0, file); /* not used */
-
- fputc(game_version_major, file);
- fputc(game_version_minor, file);
- fputc(game_version_patch, file);
- fputc(0, file); /* not used */
-}
-
/* ------------------------------------------------------------------------- */
/* some functions to handle lists of level directories */
for (i=0; i<(depth + 1) * 3; i++)
printf(" ");
- printf("filename == '%s' [%s]\n", node->filename, node->name);
+ printf("filename == '%s' (%s) [%s]\n",
+ node->filename, node->name, node->name_short);
if (node->node_group != NULL)
dumpTreeInfo(node->node_group, depth + 1);
int i;
static char entry[MAX_LINE_LEN];
+ /* start with the token and some spaces to format output line */
sprintf(entry, "%s:", token);
for (i=strlen(entry); i<TOKEN_VALUE_POSITION; i++)
- entry[i] = ' ';
- entry[i] = '\0';
+ strcat(entry, " ");
+ /* continue with the token's value */
strcat(entry, value);
return entry;
if (setup_file_list == NULL)
{
- Error(ERR_WARN, "ignoring level directory '%s'", level_directory);
+ Error(ERR_WARN, "ignoring level directory '%s'", directory_path);
free(directory_path);
free(filename);
else
setTreeInfoToDefaults(leveldir_new, TREE_TYPE_LEVEL_DIR);
+ leveldir_new->filename = getStringCopy(directory_name);
+
checkSetupFileListIdentifier(setup_file_list, getCookie("LEVELINFO"));
/* set all structure fields according to the token/value pairs */
getTokenValue(setup_file_list, levelinfo_tokens[i].text));
*leveldir_new = ldi;
+ if (strcmp(leveldir_new->name, ANONYMOUS_NAME) == 0)
+ {
+ free(leveldir_new->name);
+ leveldir_new->name = getStringCopy(leveldir_new->filename);
+ }
+
DrawInitText(leveldir_new->name, 150, FC_YELLOW);
if (leveldir_new->name_short == NULL)
if (leveldir_new->name_sorting == NULL)
leveldir_new->name_sorting = getStringCopy(leveldir_new->name);
- leveldir_new->filename = getStringCopy(directory_name);
-
if (node_parent == NULL) /* top level group */
{
leveldir_new->basepath = level_directory;
free(directory_path);
+ if (strcmp(directory_name, GRAPHICS_DIRECTORY) == 0 ||
+ strcmp(directory_name, SOUNDS_DIRECTORY) == 0 ||
+ strcmp(directory_name, MUSIC_DIRECTORY) == 0)
+ continue;
+
valid_entry_found |= LoadLevelInfoFromLevelConf(node_first, node_parent,
level_directory,
directory_name);
char *directory_name, int type)
{
char *directory_path = getPath2(base_directory, directory_name);
- char *filename =
- getPath2(directory_path,
- (type == TREE_TYPE_GRAPHICS_DIR ? GRAPHICSINFO_FILENAME :
- type == TREE_TYPE_SOUNDS_DIR ? SOUNDSINFO_FILENAME :
- type == TREE_TYPE_MUSIC_DIR ? MUSICINFO_FILENAME : ""));
+ char *filename = getPath2(directory_path, ARTWORKINFO_FILENAME(type));
struct SetupFileList *setup_file_list = NULL;
TreeInfo *artwork_new = NULL;
- char *check_dir = NULL;
int i;
if (access(filename, F_OK) == 0) /* file exists */
- loadSetupFileList(filename);
+ setup_file_list = loadSetupFileList(filename);
if (setup_file_list == NULL) /* no config file -- look for artwork files */
{
{
char *entry_name = dir_entry->d_name;
- if ((type == TREE_TYPE_GRAPHICS_DIR && FileIsGraphic(entry_name)) ||
- (type == TREE_TYPE_SOUNDS_DIR && FileIsSound(entry_name)) ||
- (type == TREE_TYPE_MUSIC_DIR && FileIsMusic(entry_name)))
+ if (FileIsArtworkType(entry_name, type))
{
valid_file_found = TRUE;
break;
if (!valid_file_found)
{
- if (options.debug)
- Error(ERR_WARN, "ignoring artwork directory '%s'", base_directory);
+ if (strcmp(directory_name, ".") != 0)
+ Error(ERR_WARN, "ignoring artwork directory '%s'", directory_path);
free(directory_path);
free(filename);
getTokenValue(setup_file_list, levelinfo_tokens[i].text));
*artwork_new = ldi;
+ if (strcmp(artwork_new->name, ANONYMOUS_NAME) == 0)
+ {
+ free(artwork_new->name);
+ artwork_new->name = getStringCopy(artwork_new->filename);
+ }
+
DrawInitText(artwork_new->name, 150, FC_YELLOW);
if (artwork_new->name_short == NULL)
artwork_new->fullpath = getPath2(node_parent->fullpath, directory_name);
}
- check_dir = (type == TREE_TYPE_GRAPHICS_DIR ? options.graphics_directory :
- type == TREE_TYPE_SOUNDS_DIR ? options.sounds_directory :
- type == TREE_TYPE_MUSIC_DIR ? options.music_directory : "");
artwork_new->user_defined =
- (artwork_new->basepath == check_dir ? FALSE : TRUE);
+ (artwork_new->basepath == OPTIONS_ARTWORK_DIRECTORY(type) ? FALSE : TRUE);
/* (may use ".sort_priority" from "setup_file_list" above) */
artwork_new->color = LEVELCOLOR(artwork_new);
if (strcmp(artwork_new->filename, ".") == 0)
{
if (artwork_new->user_defined)
+ {
artwork_new->name = getStringCopy("private");
+ artwork_new->sort_priority = LEVELCLASS_USER;
+ }
else
- artwork_new->name = getStringCopy("default");
+ {
+ artwork_new->name = getStringCopy("classic");
+ artwork_new->sort_priority = LEVELCLASS_CLASSICS;
+ }
+
+ artwork_new->color = LEVELCOLOR(artwork_new);
+ artwork_new->class_desc = getLevelClassDescription(artwork_new);
}
else
artwork_new->name = getStringCopy(artwork_new->filename);
if ((dir = opendir(base_directory)) == NULL)
{
- if ((type == TREE_TYPE_GRAPHICS_DIR &&
- base_directory == options.graphics_directory) ||
- (type == TREE_TYPE_SOUNDS_DIR &&
- base_directory == options.sounds_directory) ||
- (type == TREE_TYPE_MUSIC_DIR &&
- base_directory == options.music_directory))
+ if (base_directory == OPTIONS_ARTWORK_DIRECTORY(type))
Error(ERR_WARN, "cannot read directory '%s'", base_directory);
return;
}
if (artwork.mus_current == NULL)
artwork.mus_current = getFirstValidTreeInfoEntry(artwork.mus_first);
- artwork.graphics_set_current = artwork.gfx_current->name;
- artwork.sounds_set_current = artwork.snd_current->name;
- artwork.music_set_current = artwork.mus_current->name;
+ artwork.graphics_set_current_name = artwork.gfx_current->name;
+ artwork.sounds_set_current_name = artwork.snd_current->name;
+ artwork.music_set_current_name = artwork.mus_current->name;
+
+#if 0
+ printf("graphics set == %s\n\n", artwork.graphics_set_current_name);
+ printf("sounds set == %s\n\n", artwork.sounds_set_current_name);
+ printf("music set == %s\n\n", artwork.music_set_current_name);
+#endif
+
+ sortTreeInfo(&artwork.gfx_first, compareTreeInfoEntries);
+ sortTreeInfo(&artwork.snd_first, compareTreeInfoEntries);
+ sortTreeInfo(&artwork.mus_first, compareTreeInfoEntries);
+
+#if 0
+ dumpTreeInfo(artwork.gfx_first, 0);
+ dumpTreeInfo(artwork.snd_first, 0);
+ dumpTreeInfo(artwork.mus_first, 0);
+#endif
+}
+
+void LoadArtworkInfoFromLevelInfo(ArtworkDirTree **artwork_node,
+ LevelDirTree *level_node)
+{
+ /* recursively check all level directories for artwork sub-directories */
+
+ while (level_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->filename, level_node->name);
+#endif
+
+ if (!level_node->parent_link)
+ {
+ TreeInfo *topnode_last = *artwork_node;
+
+ LoadArtworkInfoFromArtworkDir(artwork_node, NULL, path,
+ (*artwork_node)->type);
+
+ if (topnode_last != *artwork_node)
+ {
+ free((*artwork_node)->name);
+ free((*artwork_node)->name_sorting);
+ free((*artwork_node)->name_short);
+
+ (*artwork_node)->name = getStringCopy(level_node->name);
+ (*artwork_node)->name_sorting = getStringCopy(level_node->name);
+ (*artwork_node)->name_short = getStringCopy(level_node->filename);
+
+ (*artwork_node)->sort_priority = level_node->sort_priority;
+ (*artwork_node)->color = LEVELCOLOR((*artwork_node));
+ }
+ }
+
+ free(path);
+
+ if (level_node->node_group != NULL)
+ LoadArtworkInfoFromLevelInfo(artwork_node, level_node->node_group);
+
+ level_node = level_node->next;
+ }
+}
+
+void LoadLevelArtworkInfo()
+{
+ DrawInitText("Looking for custom level artwork:", 120, FC_GREEN);
+
+ LoadArtworkInfoFromLevelInfo(&artwork.gfx_first, leveldir_first);
+ LoadArtworkInfoFromLevelInfo(&artwork.snd_first, leveldir_first);
+ LoadArtworkInfoFromLevelInfo(&artwork.mus_first, leveldir_first);
sortTreeInfo(&artwork.gfx_first, compareTreeInfoEntries);
sortTreeInfo(&artwork.snd_first, compareTreeInfoEntries);
{
static char value_string[MAX_LINE_LEN];
+ if (value == NULL)
+ return NULL;
+
switch (type)
{
case TYPE_BOOLEAN:
char *getSetupLine(struct TokenInfo *token_info, char *prefix, int token_nr)
{
int i;
- static char entry[MAX_LINE_LEN];
+ char *line;
+ static char token_string[MAX_LINE_LEN];
int token_type = token_info[token_nr].type;
void *setup_value = token_info[token_nr].value;
char *token_text = token_info[token_nr].text;
char *value_string = getSetupValue(token_type, setup_value);
- /* start with the prefix, token and some spaces to format output line */
- sprintf(entry, "%s%s:", prefix, token_text);
- for (i=strlen(entry); i<TOKEN_VALUE_POSITION; i++)
- strcat(entry, " ");
+ /* build complete token string */
+ sprintf(token_string, "%s%s", prefix, token_text);
- /* continue with the token's value (which can have different types) */
- strcat(entry, value_string);
+ /* build setup entry line */
+ line = getFormattedSetupEntry(token_string, value_string);
if (token_type == TYPE_KEY_X11)
{
if (strcmp(keyname, "(undefined)") != 0 &&
strcmp(keyname, "(unknown)") != 0)
{
- for (i=strlen(entry); i<50; i++)
- strcat(entry, " ");
+ /* add at least one whitespace */
+ strcat(line, " ");
+ for (i=strlen(line); i<TOKEN_COMMENT_POSITION; i++)
+ strcat(line, " ");
- strcat(entry, "# ");
- strcat(entry, keyname);
+ strcat(line, "# ");
+ strcat(line, keyname);
}
}
- return entry;
+ return line;
}
void LoadLevelSetup_LastSeries()