#include "misc.h"
#include "hash.h"
-/* file names and filename extensions */
-#if !defined(PLATFORM_MSDOS)
-#define LEVELSETUP_DIRECTORY "levelsetup"
-#define SETUP_FILENAME "setup.conf"
-#define LEVELSETUP_FILENAME "levelsetup.conf"
-#define LEVELINFO_FILENAME "levelinfo.conf"
-#define GRAPHICSINFO_FILENAME "graphicsinfo.conf"
-#define SOUNDSINFO_FILENAME "soundsinfo.conf"
-#define MUSICINFO_FILENAME "musicinfo.conf"
-#define LEVELFILE_EXTENSION "level"
-#define TAPEFILE_EXTENSION "tape"
-#define SCOREFILE_EXTENSION "score"
-#else
-#define LEVELSETUP_DIRECTORY "lvlsetup"
-#define SETUP_FILENAME "setup.cnf"
-#define LEVELSETUP_FILENAME "lvlsetup.cnf"
-#define LEVELINFO_FILENAME "lvlinfo.cnf"
-#define GRAPHICSINFO_FILENAME "gfxinfo.cnf"
-#define SOUNDSINFO_FILENAME "sndinfo.cnf"
-#define MUSICINFO_FILENAME "musinfo.cnf"
-#define LEVELFILE_EXTENSION "lvl"
-#define TAPEFILE_EXTENSION "tap"
-#define SCOREFILE_EXTENSION "sco"
-#endif
#define NUM_LEVELCLASS_DESC 8
+
static char *levelclass_desc[NUM_LEVELCLASS_DESC] =
{
"Tutorial Levels",
"DX Boulderdash"
};
-#define LEVELCOLOR(n) (IS_LEVELCLASS_TUTORIAL(n) ? FC_BLUE : \
- IS_LEVELCLASS_CLASSICS(n) ? FC_RED : \
- IS_LEVELCLASS_BD(n) ? FC_GREEN : \
- IS_LEVELCLASS_EM(n) ? FC_YELLOW : \
- IS_LEVELCLASS_SP(n) ? FC_GREEN : \
- IS_LEVELCLASS_DX(n) ? FC_YELLOW : \
- IS_LEVELCLASS_CONTRIBUTION(n) ? FC_GREEN : \
- IS_LEVELCLASS_USER(n) ? FC_RED : \
+
+#define LEVELCOLOR(n) (IS_LEVELCLASS_TUTORIAL(n) ? FC_BLUE : \
+ IS_LEVELCLASS_CLASSICS(n) ? FC_RED : \
+ IS_LEVELCLASS_BD(n) ? FC_GREEN : \
+ IS_LEVELCLASS_EM(n) ? FC_YELLOW : \
+ IS_LEVELCLASS_SP(n) ? FC_GREEN : \
+ IS_LEVELCLASS_DX(n) ? FC_YELLOW : \
+ IS_LEVELCLASS_CONTRIB(n) ? FC_GREEN : \
+ IS_LEVELCLASS_PRIVATE(n) ? FC_RED : \
FC_BLUE)
-#define LEVELSORTING(n) (IS_LEVELCLASS_TUTORIAL(n) ? 0 : \
- IS_LEVELCLASS_CLASSICS(n) ? 1 : \
- IS_LEVELCLASS_BD(n) ? 2 : \
- IS_LEVELCLASS_EM(n) ? 3 : \
- IS_LEVELCLASS_SP(n) ? 4 : \
- IS_LEVELCLASS_DX(n) ? 5 : \
- IS_LEVELCLASS_CONTRIBUTION(n) ? 6 : \
- IS_LEVELCLASS_USER(n) ? 7 : \
+#define LEVELSORTING(n) (IS_LEVELCLASS_TUTORIAL(n) ? 0 : \
+ IS_LEVELCLASS_CLASSICS(n) ? 1 : \
+ IS_LEVELCLASS_BD(n) ? 2 : \
+ IS_LEVELCLASS_EM(n) ? 3 : \
+ IS_LEVELCLASS_SP(n) ? 4 : \
+ IS_LEVELCLASS_DX(n) ? 5 : \
+ IS_LEVELCLASS_CONTRIB(n) ? 6 : \
+ IS_LEVELCLASS_PRIVATE(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 : \
+#define ARTWORKCOLOR(n) (IS_ARTWORKCLASS_CLASSICS(n) ? FC_RED : \
+ IS_ARTWORKCLASS_CONTRIB(n) ? FC_YELLOW : \
+ IS_ARTWORKCLASS_PRIVATE(n) ? FC_RED : \
+ IS_ARTWORKCLASS_LEVEL(n) ? FC_GREEN : \
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 ARTWORKSORTING(n) (IS_ARTWORKCLASS_CLASSICS(n) ? 0 : \
+ IS_ARTWORKCLASS_LEVEL(n) ? 1 : \
+ IS_ARTWORKCLASS_CONTRIB(n) ? 2 : \
+ IS_ARTWORKCLASS_PRIVATE(n) ? 3 : \
+ 9)
#define TOKEN_VALUE_POSITION 40
#define TOKEN_COMMENT_POSITION 60
#define MAX_COOKIE_LEN 256
-#define ARTWORKINFO_FILENAME(type) ((type) == ARTWORK_TYPE_GRAPHICS ? \
- GRAPHICSINFO_FILENAME : \
- (type) == ARTWORK_TYPE_SOUNDS ? \
- SOUNDSINFO_FILENAME : \
- (type) == ARTWORK_TYPE_MUSIC ? \
- MUSICINFO_FILENAME : "")
-
-#define ARTWORK_DIRECTORY(type) ((type) == ARTWORK_TYPE_GRAPHICS ? \
- GRAPHICS_DIRECTORY : \
- (type) == ARTWORK_TYPE_SOUNDS ? \
- SOUNDS_DIRECTORY : \
- (type) == ARTWORK_TYPE_MUSIC ? \
- MUSIC_DIRECTORY : "")
-
-#define OPTIONS_ARTWORK_DIRECTORY(type) ((type) == ARTWORK_TYPE_GRAPHICS ? \
- options.graphics_directory : \
- (type) == ARTWORK_TYPE_SOUNDS ? \
- options.sounds_directory : \
- (type) == ARTWORK_TYPE_MUSIC ? \
- options.music_directory : "")
-
/* ------------------------------------------------------------------------- */
/* file functions */
return userlevel_dir;
}
-static char *getTapeDir(char *level_subdir)
-{
- static char *tape_dir = NULL;
- char *data_dir = getUserDataDir();
- char *tape_subdir = TAPES_DIRECTORY;
-
- if (tape_dir)
- free(tape_dir);
-
- if (level_subdir != NULL)
- tape_dir = getPath3(data_dir, tape_subdir, level_subdir);
- else
- tape_dir = getPath2(data_dir, tape_subdir);
-
- return tape_dir;
-}
-
static char *getScoreDir(char *level_subdir)
{
static char *score_dir = NULL;
return getLevelDirFromTreeInfo(leveldir_current);
}
+static char *getTapeDir(char *level_subdir)
+{
+ static char *tape_dir = NULL;
+ char *data_dir = getUserDataDir();
+ char *tape_subdir = TAPES_DIRECTORY;
+
+ if (tape_dir)
+ free(tape_dir);
+
+ if (level_subdir != NULL)
+ tape_dir = getPath3(data_dir, tape_subdir, level_subdir);
+ else
+ tape_dir = getPath2(data_dir, tape_subdir);
+
+ return tape_dir;
+}
+
+static char *getSolutionTapeDir()
+{
+ static char *tape_dir = NULL;
+ char *data_dir = getCurrentLevelDir();
+ char *tape_subdir = TAPES_DIRECTORY;
+
+ if (tape_dir)
+ free(tape_dir);
+
+ tape_dir = getPath2(data_dir, tape_subdir);
+
+ return tape_dir;
+}
+
static char *getDefaultGraphicsDir(char *graphics_subdir)
{
static char *graphics_dir = NULL;
return filename;
}
+char *getSolutionTapeFilename(int nr)
+{
+ static char *filename = NULL;
+ char basename[MAX_FILENAME_LEN];
+
+ if (filename != NULL)
+ free(filename);
+
+ sprintf(basename, "%03d.%s", nr, TAPEFILE_EXTENSION);
+ filename = getPath2(getSolutionTapeDir(), basename);
+
+ return filename;
+}
+
char *getScoreFilename(int nr)
{
static char *filename = NULL;
return filename;
}
+char *getEditorSetupFilename()
+{
+ static char *filename = NULL;
+
+ if (filename != NULL)
+ free(filename);
+
+ filename = getPath2(getSetupDir(), EDITORSETUP_FILENAME);
+
+ return filename;
+}
+
+char *getHelpAnimFilename()
+{
+ static char *filename = NULL;
+
+ if (filename != NULL)
+ free(filename);
+
+ filename = getPath2(getCurrentLevelDir(), HELPANIM_FILENAME);
+
+ return filename;
+}
+
+char *getHelpTextFilename()
+{
+ static char *filename = NULL;
+
+ if (filename != NULL)
+ free(filename);
+
+ filename = getPath2(getCurrentLevelDir(), HELPTEXT_FILENAME);
+
+ return filename;
+}
+
+char *getLevelSetInfoFilename()
+{
+ static char *filename = NULL;
+ char *basenames[] =
+ {
+ "readme",
+ "readme.txt",
+ "README",
+ "README.txt",
+ "README.TXT",
+
+ NULL
+ };
+ int i;
+
+ for (i = 0; basenames[i] != NULL; i++)
+ {
+ if (filename != NULL)
+ free(filename);
+
+ filename = getPath2(getCurrentLevelDir(), basenames[i]);
+ if (fileExists(filename))
+ return filename;
+ }
+
+ return NULL;
+}
+
static char *getCorrectedArtworkBasename(char *basename)
{
char *basename_corrected = basename;
return NULL; /* cannot find specified artwork file anywhere */
}
+char *getCustomMusicFilename(char *basename)
+{
+ static char *filename = NULL;
+ boolean skip_setup_artwork = FALSE;
+
+ if (filename != NULL)
+ free(filename);
+
+ basename = getCorrectedArtworkBasename(basename);
+
+ if (!setup.override_level_music)
+ {
+ /* 1st try: look for special artwork in current level series directory */
+ filename = getPath3(getCurrentLevelDir(), MUSIC_DIRECTORY, basename);
+ if (fileExists(filename))
+ return filename;
+
+ free(filename);
+
+ /* check if there is special artwork configured in level series config */
+ if (getLevelArtworkSet(ARTWORK_TYPE_MUSIC) != NULL)
+ {
+ /* 2nd try: look for special artwork configured in level series config */
+ filename = getPath2(getLevelArtworkDir(TREE_TYPE_MUSIC_DIR), basename);
+ if (fileExists(filename))
+ return filename;
+
+ free(filename);
+
+ /* take missing artwork configured in level set config from default */
+ skip_setup_artwork = TRUE;
+ }
+ }
+
+ if (!skip_setup_artwork)
+ {
+ /* 3rd try: look for special artwork in configured artwork directory */
+ filename = getPath2(getSetupArtworkDir(artwork.mus_current), basename);
+ if (fileExists(filename))
+ return filename;
+
+ free(filename);
+ }
+
+ /* 4th try: look for default artwork in new default artwork directory */
+ filename = getPath2(getDefaultMusicDir(MUS_CLASSIC_SUBDIR), basename);
+ if (fileExists(filename))
+ return filename;
+
+ free(filename);
+
+ /* 5th try: look for default artwork in old default artwork directory */
+ filename = getPath2(options.music_directory, basename);
+ if (fileExists(filename))
+ return filename;
+
+ 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 if (type == ARTWORK_TYPE_MUSIC)
+ return getCustomMusicFilename(basename);
else
return UNDEFINED_FILENAME;
}
while (node)
{
- for (i=0; i<(depth + 1) * 3; i++)
+ for (i = 0; i < (depth + 1) * 3; i++)
printf(" ");
#if 1
compare_function);
/* update the linkage of list elements with the sorted node array */
- for (i=0; i<num_nodes - 1; i++)
+ for (i = 0; i < num_nodes - 1; i++)
sort_array[i]->next = sort_array[i + 1];
sort_array[num_nodes - 1]->next = NULL;
version_major = ptr_cookie2[0] - '0';
version_minor = ptr_cookie2[2] - '0';
- return VERSION_IDENT(version_major, version_minor, 0);
+ return VERSION_IDENT(version_major, version_minor, 0, 0);
}
boolean checkCookieString(const char *cookie, const char *template)
int i;
static char entry[MAX_LINE_LEN];
+ /* if value is an empty string, just return token without value */
+ if (*value == '\0')
+ return token;
+
/* start with the token and some spaces to format output line */
sprintf(entry, "%s:", token);
- for (i=strlen(entry); i<TOKEN_VALUE_POSITION; i++)
+ for (i = strlen(entry); i < TOKEN_VALUE_POSITION; i++)
strcat(entry, " ");
/* continue with the token's value */
return getListEntry(list->next, token);
}
-void setListEntry(SetupFileList *list, char *token, char *value)
+SetupFileList *setListEntry(SetupFileList *list, char *token, char *value)
{
if (list == NULL)
- return;
+ return NULL;
if (strcmp(list->token, token) == 0)
{
free(list->value);
list->value = getStringCopy(value);
+
+ return list;
}
else if (list->next == NULL)
- list->next = newSetupFileList(token, value);
+ return (list->next = newSetupFileList(token, value));
else
- setListEntry(list->next, token, value);
+ return setListEntry(list->next, token, value);
+}
+
+SetupFileList *addListEntry(SetupFileList *list, char *token, char *value)
+{
+ if (list == NULL)
+ return NULL;
+
+ if (list->next == NULL)
+ return (list->next = newSetupFileList(token, value));
+ else
+ return addListEntry(list->next, token, value);
}
#ifdef DEBUG
SetupFileHash *new_hash =
create_hashtable(16, 0.75, get_hash_from_key, keys_are_equal);
+ if (new_hash == NULL)
+ Error(ERR_EXIT, "create_hashtable() failed -- out of memory");
+
return new_hash;
}
Error(ERR_EXIT, "cannot insert into hash -- aborting");
}
+char *removeHashEntry(SetupFileHash *hash, char *token)
+{
+ if (hash == NULL)
+ return NULL;
+
+ return remove_hash_entry(hash, token);
+}
+
#if 0
#ifdef DEBUG
static void printSetupFileHash(SetupFileHash *hash)
static void *loadSetupFileData(char *filename, boolean use_hash)
{
- int line_len;
- char line[MAX_LINE_LEN];
+ char line[MAX_LINE_LEN], previous_line[MAX_LINE_LEN];
char *token, *value, *line_ptr;
- void *setup_file_data;
+ void *setup_file_data, *insert_ptr = NULL;
+ boolean read_continued_line = FALSE;
FILE *file;
if (use_hash)
setup_file_data = newSetupFileHash();
else
- setup_file_data = newSetupFileList("", "");
+ insert_ptr = setup_file_data = newSetupFileList("", "");
if (!(file = fopen(filename, MODE_READ)))
{
return NULL;
}
- while(!feof(file))
+ while (!feof(file))
{
/* read next line of input file */
if (!fgets(line, MAX_LINE_LEN, file))
break;
- /* cut trailing comment or whitespace from input line */
+ /* cut trailing newline or carriage return */
+ for (line_ptr = &line[strlen(line)]; line_ptr >= line; line_ptr--)
+ if ((*line_ptr == '\n' || *line_ptr == '\r') && *(line_ptr + 1) == '\0')
+ *line_ptr = '\0';
+
+ if (read_continued_line)
+ {
+ /* cut leading whitespaces from input line */
+ for (line_ptr = line; *line_ptr; line_ptr++)
+ if (*line_ptr != ' ' && *line_ptr != '\t')
+ break;
+
+ /* append new line to existing line, if there is enough space */
+ if (strlen(previous_line) + strlen(line_ptr) < MAX_LINE_LEN)
+ strcat(previous_line, line_ptr);
+
+ strcpy(line, previous_line); /* copy storage buffer to line */
+
+ read_continued_line = FALSE;
+ }
+
+ /* if the last character is '\', continue at next line */
+ if (strlen(line) > 0 && line[strlen(line) - 1] == '\\')
+ {
+ line[strlen(line) - 1] = '\0'; /* cut off trailing backslash */
+ strcpy(previous_line, line); /* copy line to storage buffer */
+
+ read_continued_line = TRUE;
+
+ continue;
+ }
+
+ /* cut trailing comment from input line */
for (line_ptr = line; *line_ptr; line_ptr++)
{
- if (*line_ptr == '#' || *line_ptr == '\n' || *line_ptr == '\r')
+ if (*line_ptr == '#')
{
*line_ptr = '\0';
break;
}
/* cut trailing whitespaces from input line */
- for (line_ptr = &line[strlen(line)]; line_ptr > line; line_ptr--)
- if ((*line_ptr == ' ' || *line_ptr == '\t') && line_ptr[1] == '\0')
+ for (line_ptr = &line[strlen(line)]; line_ptr >= line; line_ptr--)
+ if ((*line_ptr == ' ' || *line_ptr == '\t') && *(line_ptr + 1) == '\0')
*line_ptr = '\0';
/* ignore empty lines */
if (*line == '\0')
continue;
- line_len = strlen(line);
-
/* cut leading whitespaces from token */
for (token = line; *token; token++)
if (*token != ' ' && *token != '\t')
break;
- /* find end of token */
+ /* start with empty value as reliable default */
+ value = "";
+
+ /* find end of token to determine start of value */
for (line_ptr = token; *line_ptr; line_ptr++)
{
if (*line_ptr == ' ' || *line_ptr == '\t' || *line_ptr == ':')
{
- *line_ptr = '\0';
+ *line_ptr = '\0'; /* terminate token string */
+ value = line_ptr + 1; /* set beginning of value */
+
break;
}
}
- if (line_ptr < line + line_len)
- value = line_ptr + 1;
- else
- value = "\0";
-
/* cut leading whitespaces from value */
for (; *value; value++)
if (*value != ' ' && *value != '\t')
break;
- if (*token && *value)
+#if 0
+ if (*value == '\0')
+ value = "true"; /* treat tokens without value as "true" */
+#endif
+
+ if (*token)
{
if (use_hash)
setHashEntry((SetupFileHash *)setup_file_data, token, value);
else
- setListEntry((SetupFileList *)setup_file_data, token, value);
+ insert_ptr = addListEntry((SetupFileList *)insert_ptr, token, value);
}
}
#define LEVELINFO_TOKEN_LEVELS 5
#define LEVELINFO_TOKEN_FIRST_LEVEL 6
#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 LEVELINFO_TOKEN_LATEST_ENGINE 8
+#define LEVELINFO_TOKEN_LEVEL_GROUP 9
+#define LEVELINFO_TOKEN_READONLY 10
+#define LEVELINFO_TOKEN_GRAPHICS_SET 11
+#define LEVELINFO_TOKEN_SOUNDS_SET 12
+#define LEVELINFO_TOKEN_MUSIC_SET 13
-#define NUM_LEVELINFO_TOKENS 13
+#define NUM_LEVELINFO_TOKENS 14
static LevelDirTree ldi;
{ TYPE_INTEGER, &ldi.levels, "levels" },
{ TYPE_INTEGER, &ldi.first_level, "first_level" },
{ TYPE_INTEGER, &ldi.sort_priority, "sort_priority" },
+ { TYPE_BOOLEAN, &ldi.latest_engine, "latest_engine" },
{ TYPE_BOOLEAN, &ldi.level_group, "level_group" },
{ TYPE_BOOLEAN, &ldi.readonly, "readonly" },
{ TYPE_STRING, &ldi.graphics_set, "graphics_set" },
ldi->author = getStringCopy(ANONYMOUS_NAME);
ldi->sort_priority = LEVELCLASS_UNDEFINED; /* default: least priority */
+ ldi->latest_engine = FALSE; /* default: get from level */
ldi->parent_link = FALSE;
ldi->user_defined = FALSE;
ldi->color = 0;
ldi->author = getStringCopy(parent->author);
ldi->sort_priority = parent->sort_priority;
+ ldi->latest_engine = parent->latest_engine;
ldi->parent_link = FALSE;
ldi->user_defined = parent->user_defined;
ldi->color = parent->color;
setString(&ti_new->fullpath, node_parent->fullpath);
ti_new->sort_priority = node_parent->sort_priority;
+ ti_new->latest_engine = node_parent->latest_engine;
setString(&ti_new->class_desc, getLevelClassDescription(ti_new));
#else
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
/* set all structure fields according to the token/value pairs */
ldi = *leveldir_new;
- for (i=0; i<NUM_LEVELINFO_TOKENS; i++)
+ for (i = 0; i < NUM_LEVELINFO_TOKENS; i++)
setSetupInfo(levelinfo_tokens, i,
getHashEntry(setup_file_hash, levelinfo_tokens[i].text));
*leveldir_new = ldi;
/* set all structure fields according to the token/value pairs */
ldi = *artwork_new;
- for (i=0; i<NUM_LEVELINFO_TOKENS; i++)
+ for (i = 0; i < NUM_LEVELINFO_TOKENS; i++)
setSetupInfo(levelinfo_tokens, i,
getHashEntry(setup_file_hash, levelinfo_tokens[i].text));
*artwork_new = ldi;
#else
artwork_new->identifier = getStringCopy("private");
#endif
- artwork_new->sort_priority = ARTWORKCLASS_USER;
+ artwork_new->sort_priority = ARTWORKCLASS_PRIVATE;
}
else
{
setString(&level_info->author, getRealName());
level_info->levels = 100;
level_info->first_level = 1;
- level_info->sort_priority = LEVELCLASS_USER_START;
+ 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);
ldi.author = getStringCopy(getRealName());
ldi.levels = 100;
ldi.first_level = 1;
- ldi.sort_priority = LEVELCLASS_USER_START;
+ ldi.sort_priority = LEVELCLASS_PRIVATE_START;
ldi.readonly = FALSE;
ldi.graphics_set = getStringCopy(GFX_CLASSIC_SUBDIR);
ldi.sounds_set = getStringCopy(SND_CLASSIC_SUBDIR);
getCookie("LEVELINFO")));
ldi = *level_info;
- for (i=0; i<NUM_LEVELINFO_TOKENS; i++)
+ for (i = 0; i < NUM_LEVELINFO_TOKENS; i++)
if (i != LEVELINFO_TOKEN_IDENTIFIER &&
i != LEVELINFO_TOKEN_NAME_SORTING &&
i != LEVELINFO_TOKEN_IMPORTED_FROM)
{
/* add at least one whitespace */
strcat(line, " ");
- for (i=strlen(line); i<TOKEN_COMMENT_POSITION; i++)
+ for (i = strlen(line); i < TOKEN_COMMENT_POSITION; i++)
strcat(line, " ");
strcat(line, "# ");
void LoadLevelSetup_LastSeries()
{
- char *filename;
- SetupFileHash *level_setup_hash = NULL;
-
- /* always start with reliable default values */
- leveldir_current = getFirstValidTreeInfoEntry(leveldir_first);
-
/* ----------------------------------------------------------------------- */
/* ~/.<program>/levelsetup.conf */
/* ----------------------------------------------------------------------- */
- filename = getPath2(getSetupDir(), LEVELSETUP_FILENAME);
+ char *filename = getPath2(getSetupDir(), LEVELSETUP_FILENAME);
+ SetupFileHash *level_setup_hash = NULL;
+
+ /* always start with reliable default values */
+ leveldir_current = getFirstValidTreeInfoEntry(leveldir_first);
if ((level_setup_hash = loadSetupFileHash(filename)))
{
void SaveLevelSetup_LastSeries()
{
- char *filename;
- char *level_subdir = leveldir_current->filename;
- FILE *file;
-
/* ----------------------------------------------------------------------- */
/* ~/.<program>/levelsetup.conf */
/* ----------------------------------------------------------------------- */
- InitUserDataDirectory();
+ char *filename = getPath2(getSetupDir(), LEVELSETUP_FILENAME);
+ char *level_subdir = leveldir_current->filename;
+ FILE *file;
- filename = getPath2(getSetupDir(), LEVELSETUP_FILENAME);
+ InitUserDataDirectory();
if (!(file = fopen(filename, MODE_WRITE)))
{