* setup.c *
***********************************************************/
-#include <dirent.h>
+#include <sys/types.h>
#include <sys/stat.h>
+#include <dirent.h>
#include <string.h>
#include <unistd.h>
IS_LEVELCLASS_USER(n) ? 7 : \
9)
+#define ARTWORKCOLOR(n) (IS_ARTWORKCLASS_CLASSICS(n) ? FC_RED : \
+ IS_ARTWORKCLASS_CONTRIBUTION(n) ? FC_YELLOW : \
+ IS_ARTWORKCLASS_LEVEL(n) ? FC_GREEN : \
+ IS_ARTWORKCLASS_USER(n) ? FC_RED : \
+ FC_BLUE)
+
+#define ARTWORKSORTING(n) (IS_ARTWORKCLASS_CLASSICS(n) ? 0 : \
+ IS_ARTWORKCLASS_CONTRIBUTION(n) ? 1 : \
+ IS_ARTWORKCLASS_LEVEL(n) ? 2 : \
+ IS_ARTWORKCLASS_USER(n) ? 3 : \
+ 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;
return usermusic_dir;
}
+static char *getSetupArtworkDir(TreeInfo *ti)
+{
+ static char *artwork_dir = NULL;
+
+ if (artwork_dir != NULL)
+ free(artwork_dir);
+
+ artwork_dir = getPath2(ti->basepath, ti->fullpath);
+
+ return artwork_dir;
+}
+
+void setLevelArtworkDir(TreeInfo *ti)
+{
+ char **artwork_path_ptr, *artwork_set;
+ TreeInfo *level_artwork;
+
+ if (ti == NULL || leveldir_current == NULL)
+ return;
+
+ artwork_path_ptr =
+ (ti->type == TREE_TYPE_GRAPHICS_DIR ? &leveldir_current->graphics_path :
+ ti->type == TREE_TYPE_SOUNDS_DIR ? &leveldir_current->sounds_path :
+ &leveldir_current->music_path);
+
+ artwork_set =
+ (ti->type == TREE_TYPE_GRAPHICS_DIR ? leveldir_current->graphics_set :
+ ti->type == TREE_TYPE_SOUNDS_DIR ? leveldir_current->sounds_set :
+ leveldir_current->music_set);
+
+ if ((level_artwork = getTreeInfoFromIdentifier(ti, artwork_set)) == NULL)
+ return;
+
+ if (*artwork_path_ptr != NULL)
+ free(*artwork_path_ptr);
+
+ *artwork_path_ptr = getStringCopy(getSetupArtworkDir(level_artwork));
+}
+
+static char *getLevelArtworkDir(int type)
+{
+ char *artwork_path;
+
+ if (leveldir_current == NULL)
+ return UNDEFINED_FILENAME;
+
+ artwork_path =
+ (type == TREE_TYPE_GRAPHICS_DIR ? leveldir_current->graphics_path :
+ type == TREE_TYPE_SOUNDS_DIR ? leveldir_current->sounds_path :
+ type == TREE_TYPE_MUSIC_DIR ? leveldir_current->music_path :
+ UNDEFINED_FILENAME);
+
+ return artwork_path;
+}
+
char *getLevelFilename(int nr)
{
static char *filename = NULL;
return filename;
}
-static char *getSetupArtworkDir(TreeInfo *ti)
-{
- static char *artwork_dir = NULL;
-
- if (artwork_dir != NULL)
- free(artwork_dir);
-
- artwork_dir = getPath2(ti->basepath, ti->fullpath);
-
- return artwork_dir;
-}
-
static char *getCorrectedImageBasename(char *basename)
{
- char *result = basename;
+ char *basename_corrected = basename;
#if defined(PLATFORM_MSDOS)
if (program.filename_prefix != NULL)
int prefix_len = strlen(program.filename_prefix);
if (strncmp(basename, program.filename_prefix, prefix_len) == 0)
- result = &basename[prefix_len];
+ basename_corrected = &basename[prefix_len];
+
+ /* if corrected filename is still longer than standard MS-DOS filename
+ size (8 characters + 1 dot + 3 characters file extension), shorten
+ filename by writing file extension after 8th basename character */
+ if (strlen(basename_corrected) > 8+1+3)
+ {
+ static char *msdos_filename = NULL;
+
+ if (filename != NULL)
+ free(filename);
+
+ filename = getStringCopy(basename_corrected);
+ strncpy(&filename[8], &basename[strlen(basename) - 1+3], 1+3 + 1);
+ }
}
#endif
- return result;
+ return basename_corrected;
}
static boolean fileExists(char *filename)
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;
+ if (!setup.override_level_graphics)
+ {
+ /* 1st try: look for special artwork configured in level series config */
+ filename = getPath2(getLevelArtworkDir(TREE_TYPE_GRAPHICS_DIR), 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;
+ free(filename);
+
+ /* 2nd try: look for special artwork in current level series directory */
+ filename = getPath3(getCurrentLevelDir(), GRAPHICS_DIRECTORY, basename);
+ if (fileExists(filename))
+ return filename;
+
+ free(filename);
+ }
/* 3rd try: look for special artwork in configured artwork directory */
filename = getPath2(getSetupArtworkDir(artwork.gfx_current), basename);
if (fileExists(filename))
return filename;
+ free(filename);
+
/* 4th try: look for default artwork in new default artwork directory */
filename = getPath2(getDefaultGraphicsDir(GRAPHICS_SUBDIR), basename);
if (fileExists(filename))
return filename;
+ free(filename);
+
/* 5th 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;
+ if (!setup.override_level_sounds)
+ {
+ /* 1st try: look for special artwork configured in level series config */
+ filename = getPath2(getLevelArtworkDir(TREE_TYPE_SOUNDS_DIR), 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;
+ free(filename);
+
+ /* 2nd try: look for special artwork in current level series directory */
+ filename = getPath3(getCurrentLevelDir(), SOUNDS_DIRECTORY, basename);
+ if (fileExists(filename))
+ return filename;
+
+ free(filename);
+ }
/* 3rd try: look for special artwork in configured artwork directory */
filename = getPath2(getSetupArtworkDir(artwork.snd_current), basename);
if (fileExists(filename))
return filename;
+ free(filename);
+
/* 4th try: look for default artwork in new default artwork directory */
filename = getPath2(getDefaultSoundsDir(SOUNDS_SUBDIR), basename);
if (fileExists(filename))
return filename;
+ free(filename);
+
/* 5th 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 *getCustomArtworkFilename(char *basename, int type)
+{
+ if (type == ARTWORK_TYPE_GRAPHICS)
+ return getCustomImageFilename(basename);
+ else if (type == ARTWORK_TYPE_SOUNDS)
+ return getCustomSoundFilename(basename);
+ else
+ return UNDEFINED_FILENAME;
}
-char *getCustomSoundConfigFilename()
+char *getCustomArtworkConfigFilename(int type)
{
- return getCustomSoundFilename(SOUNDSINFO_FILENAME);
+ return getCustomArtworkFilename(ARTWORKINFO_FILENAME(type), type);
}
char *getCustomMusicDirectory(void)
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;
+ if (!setup.override_level_music)
+ {
+ /* 1st try: look for special artwork configured in level series config */
+ directory = getStringCopy(getLevelArtworkDir(TREE_TYPE_MUSIC_DIR));
+ if (fileExists(directory))
+ return directory;
- /* 2nd try: look for special artwork in private artwork directory */
- directory = getStringCopy(getUserMusicDir());
- if (fileExists(directory))
- return directory;
+ free(directory);
+
+ /* 2nd try: look for special artwork in current level series directory */
+ directory = getPath2(getCurrentLevelDir(), MUSIC_DIRECTORY);
+ if (fileExists(directory))
+ return directory;
+
+ free(directory);
+ }
/* 3rd try: look for special artwork in configured artwork directory */
directory = getStringCopy(getSetupArtworkDir(artwork.mus_current));
if (fileExists(directory))
return directory;
+ free(directory);
+
/* 4th try: look for default artwork in new default artwork directory */
directory = getStringCopy(getDefaultMusicDir(MUSIC_SUBDIR));
if (fileExists(directory))
return directory;
+ free(directory);
+
/* 5th 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 */
TreeInfo *getFirstValidTreeInfoEntry(TreeInfo *node)
{
if (node == NULL)
- {
- if (node->node_top) /* start with first tree entry */
- return getFirstValidTreeInfoEntry(*node->node_top);
- else
- return NULL;
- }
- else if (node->node_group) /* enter level group (step down into tree) */
+ return NULL;
+
+ if (node->node_group) /* enter level group (step down into tree) */
return getFirstValidTreeInfoEntry(node->node_group);
else if (node->parent_link) /* skip start entry of level group */
{
return node_default;
}
-TreeInfo *getTreeInfoFromFilenameExt(TreeInfo *node, char *filename)
+TreeInfo *getTreeInfoFromIdentifier(TreeInfo *node, char *identifier)
{
- if (filename == NULL)
+ if (identifier == NULL)
return NULL;
while (node)
{
TreeInfo *node_group;
- node_group = getTreeInfoFromFilenameExt(node->node_group, filename);
+ node_group = getTreeInfoFromIdentifier(node->node_group, identifier);
if (node_group)
return node_group;
}
else if (!node->parent_link)
{
- if (strcmp(filename, node->filename) == 0)
+ if (strcmp(identifier, node->identifier) == 0)
return node;
}
return NULL;
}
-TreeInfo *getTreeInfoFromFilename(TreeInfo *ti, char *filename)
-{
- return getTreeInfoFromFilenameExt(ti, filename);
-}
-
void dumpTreeInfo(TreeInfo *node, int depth)
{
int i;
for (i=0; i<(depth + 1) * 3; i++)
printf(" ");
- printf("filename == '%s' [%s]\n", node->filename, node->name);
+ printf("filename == '%s' (%s) [%s] (%d)\n",
+ node->filename, node->name, node->identifier, node->sort_priority);
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;
#define TOKEN_STR_HANDICAP_LEVEL "handicap_level"
/* level directory info */
-#define LEVELINFO_TOKEN_NAME 0
-#define LEVELINFO_TOKEN_NAME_SHORT 1
+#define LEVELINFO_TOKEN_IDENTIFIER 0
+#define LEVELINFO_TOKEN_NAME 1
#define LEVELINFO_TOKEN_NAME_SORTING 2
#define LEVELINFO_TOKEN_AUTHOR 3
#define LEVELINFO_TOKEN_IMPORTED_FROM 4
#define LEVELINFO_TOKEN_SORT_PRIORITY 7
#define LEVELINFO_TOKEN_LEVEL_GROUP 8
#define LEVELINFO_TOKEN_READONLY 9
+#define LEVELINFO_TOKEN_GRAPHICS_SET 10
+#define LEVELINFO_TOKEN_SOUNDS_SET 11
+#define LEVELINFO_TOKEN_MUSIC_SET 12
-#define NUM_LEVELINFO_TOKENS 10
+#define NUM_LEVELINFO_TOKENS 13
static LevelDirTree ldi;
static struct TokenInfo levelinfo_tokens[] =
{
/* level directory info */
+ { TYPE_STRING, &ldi.identifier, "identifier" },
{ TYPE_STRING, &ldi.name, "name" },
- { TYPE_STRING, &ldi.name_short, "name_short" },
{ TYPE_STRING, &ldi.name_sorting, "name_sorting" },
{ TYPE_STRING, &ldi.author, "author" },
{ TYPE_STRING, &ldi.imported_from, "imported_from" },
{ TYPE_INTEGER, &ldi.first_level, "first_level" },
{ TYPE_INTEGER, &ldi.sort_priority, "sort_priority" },
{ TYPE_BOOLEAN, &ldi.level_group, "level_group" },
- { TYPE_BOOLEAN, &ldi.readonly, "readonly" }
+ { TYPE_BOOLEAN, &ldi.readonly, "readonly" },
+ { TYPE_STRING, &ldi.graphics_set, "graphics_set" },
+ { TYPE_STRING, &ldi.sounds_set, "sounds_set" },
+ { TYPE_STRING, &ldi.music_set, "music_set" }
};
static void setTreeInfoToDefaults(TreeInfo *ldi, int type)
ldi->filename = NULL;
ldi->fullpath = NULL;
ldi->basepath = NULL;
+ ldi->identifier = NULL;
ldi->name = getStringCopy(ANONYMOUS_NAME);
- ldi->name_short = NULL;
ldi->name_sorting = NULL;
ldi->author = getStringCopy(ANONYMOUS_NAME);
if (ldi->type == TREE_TYPE_LEVEL_DIR)
{
ldi->imported_from = NULL;
+ ldi->graphics_set = NULL;
+ ldi->sounds_set = NULL;
+ ldi->music_set = NULL;
+ ldi->graphics_path = getStringCopy(UNDEFINED_FILENAME);
+ ldi->sounds_path = getStringCopy(UNDEFINED_FILENAME);
+ ldi->music_path = getStringCopy(UNDEFINED_FILENAME);
ldi->levels = 0;
ldi->first_level = 0;
ldi->last_level = 0;
ldi->filename = NULL;
ldi->fullpath = NULL;
ldi->basepath = NULL;
+ ldi->identifier = NULL;
ldi->name = getStringCopy(ANONYMOUS_NAME);
- ldi->name_short = NULL;
ldi->name_sorting = NULL;
ldi->author = getStringCopy(parent->author);
ldi->imported_from = getStringCopy(parent->imported_from);
{
const TreeInfo *entry1 = *((TreeInfo **)object1);
const TreeInfo *entry2 = *((TreeInfo **)object2);
+ int class_sorting1, class_sorting2;
int compare_result;
+ if (entry1->type == TREE_TYPE_LEVEL_DIR)
+ {
+ class_sorting1 = LEVELSORTING(entry1);
+ class_sorting2 = LEVELSORTING(entry2);
+ }
+ else
+ {
+ class_sorting1 = ARTWORKSORTING(entry1);
+ class_sorting2 = ARTWORKSORTING(entry2);
+ }
+
if (entry1->parent_link || entry2->parent_link)
compare_result = (entry1->parent_link ? -1 : +1);
else if (entry1->sort_priority == entry2->sort_priority)
free(name1);
free(name2);
}
- else if (LEVELSORTING(entry1) == LEVELSORTING(entry2))
+ else if (class_sorting1 == class_sorting2)
compare_result = entry1->sort_priority - entry2->sort_priority;
else
- compare_result = LEVELSORTING(entry1) - LEVELSORTING(entry2);
+ compare_result = class_sorting1 - class_sorting2;
return compare_result;
}
ti_new->node_parent = node_parent;
ti_new->parent_link = TRUE;
+ ti_new->identifier = getStringCopy(node_parent->identifier);
ti_new->name = ".. (parent directory)";
- ti_new->name_short = getStringCopy(ti_new->name);
ti_new->name_sorting = getStringCopy(ti_new->name);
ti_new->filename = "..";
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)
- leveldir_new->name_short = getStringCopy(leveldir_new->name);
+ if (leveldir_new->identifier == NULL)
+ leveldir_new->identifier = getStringCopy(leveldir_new->filename);
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);
+ }
+
+#if 0
DrawInitText(artwork_new->name, 150, FC_YELLOW);
+#endif
- if (artwork_new->name_short == NULL)
- artwork_new->name_short = getStringCopy(artwork_new->name);
+ if (artwork_new->identifier == NULL)
+ artwork_new->identifier = getStringCopy(artwork_new->filename);
if (artwork_new->name_sorting == NULL)
artwork_new->name_sorting = getStringCopy(artwork_new->name);
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);
+ artwork_new->color = ARTWORKCOLOR(artwork_new);
artwork_new->class_desc = getLevelClassDescription(artwork_new);
if (setup_file_list == NULL) /* (after determining ".user_defined") */
if (strcmp(artwork_new->filename, ".") == 0)
{
if (artwork_new->user_defined)
- artwork_new->name = getStringCopy("private");
+ {
+ artwork_new->identifier = getStringCopy("private");
+ artwork_new->sort_priority = ARTWORKCLASS_USER;
+ }
else
- artwork_new->name = getStringCopy("default");
+ {
+ artwork_new->identifier = getStringCopy("classic");
+ artwork_new->sort_priority = ARTWORKCLASS_CLASSICS;
+ }
+
+ /* set to new values after changing ".sort_priority" */
+ artwork_new->color = ARTWORKCOLOR(artwork_new);
+ artwork_new->class_desc = getLevelClassDescription(artwork_new);
}
else
- artwork_new->name = getStringCopy(artwork_new->filename);
+ {
+ artwork_new->identifier = getStringCopy(artwork_new->filename);
+ }
- artwork_new->name_short = getStringCopy(artwork_new->name);
+ artwork_new->name = getStringCopy(artwork_new->identifier);
artwork_new->name_sorting = getStringCopy(artwork_new->name);
}
+ DrawInitText(artwork_new->name, 150, FC_YELLOW);
+
pushTreeInfo(node_first, artwork_new);
freeSetupFileList(setup_file_list);
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;
}
base_directory);
}
+static TreeInfo *getDummyArtworkInfo(int type)
+{
+ /* this is only needed when there is completely no artwork available */
+ TreeInfo *artwork_new = newTreeInfo();
+
+ setTreeInfoToDefaults(artwork_new, type);
+
+ artwork_new->filename = getStringCopy(UNDEFINED_FILENAME);
+ artwork_new->fullpath = getStringCopy(UNDEFINED_FILENAME);
+ artwork_new->basepath = getStringCopy(UNDEFINED_FILENAME);
+
+ if (artwork_new->name != NULL)
+ free(artwork_new->name);
+
+ artwork_new->identifier = getStringCopy(UNDEFINED_FILENAME);
+ artwork_new->name = getStringCopy(UNDEFINED_FILENAME);
+ artwork_new->name_sorting = getStringCopy(UNDEFINED_FILENAME);
+
+ return artwork_new;
+}
+
void LoadArtworkInfo()
{
DrawInitText("Looking for custom artwork:", 120, FC_GREEN);
getUserMusicDir(),
TREE_TYPE_MUSIC_DIR);
+ if (artwork.gfx_first == NULL)
+ artwork.gfx_first = getDummyArtworkInfo(TREE_TYPE_GRAPHICS_DIR);
+ if (artwork.snd_first == NULL)
+ artwork.snd_first = getDummyArtworkInfo(TREE_TYPE_SOUNDS_DIR);
+ if (artwork.mus_first == NULL)
+ artwork.mus_first = getDummyArtworkInfo(TREE_TYPE_MUSIC_DIR);
+
/* before sorting, the first entries will be from the user directory */
artwork.gfx_current =
- getTreeInfoFromFilename(artwork.gfx_first, setup.graphics_set);
+ getTreeInfoFromIdentifier(artwork.gfx_first, setup.graphics_set);
if (artwork.gfx_current == NULL)
artwork.gfx_current = getFirstValidTreeInfoEntry(artwork.gfx_first);
artwork.snd_current =
- getTreeInfoFromFilename(artwork.snd_first, setup.sounds_set);
+ getTreeInfoFromIdentifier(artwork.snd_first, setup.sounds_set);
if (artwork.snd_current == NULL)
- artwork.snd_current = getFirstValidTreeInfoEntry(artwork.snd_first);
+ artwork.snd_current = getFirstValidTreeInfoEntry(artwork.snd_first);
artwork.mus_current =
- getTreeInfoFromFilename(artwork.mus_first, setup.music_set);
+ getTreeInfoFromIdentifier(artwork.mus_first, setup.music_set);
if (artwork.mus_current == NULL)
- artwork.mus_current = getFirstValidTreeInfoEntry(artwork.mus_first);
+ artwork.mus_current = getFirstValidTreeInfoEntry(artwork.mus_first);
+
+ artwork.gfx_current_identifier = artwork.gfx_current->identifier;
+ artwork.snd_current_identifier = artwork.snd_current->identifier;
+ artwork.mus_current_identifier = artwork.mus_current->identifier;
+
+#if 0
+ printf("graphics set == %s\n\n", artwork.gfx_current_identifier);
+ printf("sounds set == %s\n\n", artwork.snd_current_identifier);
+ printf("music set == %s\n\n", artwork.mus_current_identifier);
+#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);
- artwork.graphics_set_current = artwork.gfx_current->name;
- artwork.sounds_set_current = artwork.snd_current->name;
- artwork.music_set_current = artwork.mus_current->name;
+ if (topnode_last != *artwork_node)
+ {
+ free((*artwork_node)->identifier);
+ free((*artwork_node)->name);
+ free((*artwork_node)->name_sorting);
+
+ (*artwork_node)->identifier = getStringCopy(level_node->filename);
+ (*artwork_node)->name = getStringCopy(level_node->name);
+ (*artwork_node)->name_sorting = getStringCopy(level_node->name);
+
+ (*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);
+
+ /* needed for reloading level artwork not known at ealier stage */
+ if (strcmp(artwork.gfx_current_identifier, setup.graphics_set) != 0)
+ {
+ artwork.gfx_current =
+ getTreeInfoFromIdentifier(artwork.gfx_first, setup.graphics_set);
+ if (artwork.gfx_current == NULL)
+ artwork.gfx_current = getFirstValidTreeInfoEntry(artwork.gfx_first);
+ }
+
+ if (strcmp(artwork.snd_current_identifier, setup.sounds_set) != 0)
+ {
+ artwork.snd_current =
+ getTreeInfoFromIdentifier(artwork.snd_first, setup.sounds_set);
+ if (artwork.snd_current == NULL)
+ artwork.snd_current = getFirstValidTreeInfoEntry(artwork.snd_first);
+ }
+
+ if (strcmp(artwork.mus_current_identifier, setup.music_set) != 0)
+ {
+ artwork.mus_current =
+ getTreeInfoFromIdentifier(artwork.mus_first, setup.music_set);
+ if (artwork.mus_current == NULL)
+ artwork.mus_current = getFirstValidTreeInfoEntry(artwork.mus_first);
+ }
sortTreeInfo(&artwork.gfx_first, compareTreeInfoEntries);
sortTreeInfo(&artwork.snd_first, compareTreeInfoEntries);
/* always start with reliable default values */
setTreeInfoToDefaults(&ldi, TREE_TYPE_LEVEL_DIR);
- ldi.name = getLoginName();
- ldi.author = getRealName();
+ ldi.name = getStringCopy(getLoginName());
+ ldi.author = getStringCopy(getRealName());
ldi.levels = 100;
ldi.first_level = 1;
ldi.sort_priority = LEVELCLASS_USER_START;
getCookie("LEVELINFO")));
for (i=0; i<NUM_LEVELINFO_TOKENS; i++)
- if (i != LEVELINFO_TOKEN_NAME_SHORT &&
+ if (i != LEVELINFO_TOKEN_IDENTIFIER &&
i != LEVELINFO_TOKEN_NAME_SORTING &&
i != LEVELINFO_TOKEN_IMPORTED_FROM)
fprintf(file, "%s\n", getSetupLine(levelinfo_tokens, "", i));
{
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)
{
strcmp(keyname, "(unknown)") != 0)
{
/* add at least one whitespace */
- strcat(entry, " ");
- for (i=strlen(entry); i<TOKEN_COMMENT_POSITION; i++)
- strcat(entry, " ");
+ 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()
char *last_level_series =
getTokenValue(level_setup_list, TOKEN_STR_LAST_LEVEL_SERIES);
- leveldir_current = getTreeInfoFromFilename(leveldir_first,
- last_level_series);
+ leveldir_current = getTreeInfoFromIdentifier(leveldir_first,
+ last_level_series);
if (leveldir_current == NULL)
leveldir_current = getFirstValidTreeInfoEntry(leveldir_first);