#define SETUP_FILENAME "setup.conf"
#define LEVELSETUP_FILENAME "levelsetup.conf"
#define LEVELINFO_FILENAME "levelinfo.conf"
+#define LEVELFILE_EXTENSION "level"
#define TAPEFILE_EXTENSION "tape"
#define SCOREFILE_EXTENSION "score"
#else
#define SETUP_FILENAME "setup.cnf"
#define LEVELSETUP_FILENAME "lvlsetup.cnf"
#define LEVELINFO_FILENAME "lvlinfo.cnf"
+#define LEVELFILE_EXTENSION "lvl"
#define TAPEFILE_EXTENSION "rec"
#define SCOREFILE_EXTENSION "sco"
#endif
return score_dir;
}
+static char *getLevelFilename(int nr)
+{
+ static char *filename = NULL;
+ char basename[20 + strlen(LEVELFILE_EXTENSION)];
+
+ if (filename != NULL)
+ free(filename);
+
+ sprintf(basename, "%03d.%s", nr, LEVELFILE_EXTENSION);
+ filename = getPath3((leveldir[leveldir_nr].user_defined ?
+ getUserLevelDir("") :
+ options.level_directory),
+ leveldir[leveldir_nr].filename,
+ basename);
+
+ return filename;
+}
+
+static char *getTapeFilename(int nr)
+{
+ static char *filename = NULL;
+ char basename[20 + strlen(LEVELFILE_EXTENSION)];
+
+ if (filename != NULL)
+ free(filename);
+
+ sprintf(basename, "%03d.%s", nr, TAPEFILE_EXTENSION);
+ filename = getPath2(getTapeDir(leveldir[leveldir_nr].filename), basename);
+
+ return filename;
+}
+
+static char *getScoreFilename(int nr)
+{
+ static char *filename = NULL;
+ char basename[20 + strlen(LEVELFILE_EXTENSION)];
+
+ if (filename != NULL)
+ free(filename);
+
+ sprintf(basename, "%03d.%s", nr, SCOREFILE_EXTENSION);
+ filename = getPath2(getScoreDir(leveldir[leveldir_nr].filename), basename);
+
+ return filename;
+}
+
static void createDirectory(char *dir, char *text)
{
if (access(dir, F_OK) != 0)
static void InitTapeDirectory(char *level_subdir)
{
+ createDirectory(getUserDataDir(), "user data");
createDirectory(getTapeDir(""), "main tape");
createDirectory(getTapeDir(level_subdir), "level tape");
}
{
if (access(getUserLevelDir(level_subdir), F_OK) != 0)
{
+ createDirectory(getUserDataDir(), "user data");
createDirectory(getUserLevelDir(""), "main user level");
createDirectory(getUserLevelDir(level_subdir), "user level");
void LoadLevel(int level_nr)
{
int i, x, y;
- char filename[MAX_FILENAME_LEN];
+ char *filename = getLevelFilename(level_nr);
char cookie[MAX_LINE_LEN];
char chunk[CHUNK_ID_LEN + 1];
int file_version = FILE_VERSION_1_2; /* last version of level files */
/* always start with reliable default values */
setLevelInfoToDefaults();
- if (leveldir[leveldir_nr].user_defined)
- sprintf(filename, "%s/%s/%d",
- getUserLevelDir(""), leveldir[leveldir_nr].filename, level_nr);
- else
- sprintf(filename, "%s/%s/%d",
- options.level_directory, leveldir[leveldir_nr].filename, level_nr);
-
if (!(file = fopen(filename, "r")))
{
Error(ERR_WARN, "cannot read level '%s' - creating new level", filename);
void SaveLevel(int level_nr)
{
int i, x, y;
- char filename[MAX_FILENAME_LEN];
+ char *filename = getLevelFilename(level_nr);
FILE *file;
int chunk_length;
- if (leveldir[leveldir_nr].user_defined)
- sprintf(filename, "%s/%s/%d",
- getUserLevelDir(""), leveldir[leveldir_nr].filename, level_nr);
- else
- sprintf(filename, "%s/%s/%d",
- options.level_directory, leveldir[leveldir_nr].filename, level_nr);
-
if (!(file = fopen(filename, "w")))
{
Error(ERR_WARN, "cannot save level file '%s'", filename);
void LoadTape(int level_nr)
{
int i, j;
- char filename[MAX_FILENAME_LEN];
+ char *filename = getTapeFilename(level_nr);
char cookie[MAX_LINE_LEN];
char chunk[CHUNK_ID_LEN + 1];
FILE *file;
- boolean player_participates[MAX_PLAYERS];
int num_participating_players;
int file_version = FILE_VERSION_1_2; /* last version of tape files */
int chunk_length;
- sprintf(filename, "%s/%d.%s",
- getTapeDir(leveldir[leveldir_nr].filename),
- level_nr, TAPEFILE_EXTENSION);
-
if (!(file = fopen(filename, "r")))
return;
num_participating_players = 0;
for(i=0; i<MAX_PLAYERS; i++)
{
- player_participates[i] = FALSE;
+ tape.player_participates[i] = FALSE;
if (store_participating_players & (1 << i))
{
- player_participates[i] = TRUE;
+ tape.player_participates[i] = TRUE;
num_participating_players++;
}
}
if (file_version == FILE_VERSION_1_0 && j > 0)
continue;
- if (player_participates[j])
+ if (tape.player_participates[j])
tape.pos[i].action[j] = fgetc(file);
}
void SaveTape(int level_nr)
{
- int i, j;
- char filename[MAX_FILENAME_LEN];
+ int i;
+ char *filename = getTapeFilename(level_nr);
FILE *file;
boolean new_tape = TRUE;
- boolean player_participates[MAX_PLAYERS];
byte store_participating_players;
int num_participating_players;
int chunk_length;
InitTapeDirectory(leveldir[leveldir_nr].filename);
- sprintf(filename, "%s/%d.%s",
- getTapeDir(leveldir[leveldir_nr].filename),
- level_nr, TAPEFILE_EXTENSION);
-
/* if a tape still exists, ask to overwrite it */
- if ((file = fopen(filename, "r")))
+ if (access(filename, F_OK) == 0)
{
new_tape = FALSE;
- fclose(file);
-
if (!Request("Replace old tape ?", REQ_ASK))
return;
}
- for(i=0; i<MAX_PLAYERS; i++)
- player_participates[i] = FALSE;
-
- /* check which players participate in this tape recording */
- for(i=0; i<tape.length; i++)
- for(j=0; j<MAX_PLAYERS; j++)
- if (tape.pos[i].action[j] != 0)
- player_participates[j] = TRUE;
-
/* count number of players and set corresponding bits for compact storage */
store_participating_players = 0;
num_participating_players = 0;
for(i=0; i<MAX_PLAYERS; i++)
{
- if (player_participates[i])
+ if (tape.player_participates[i])
{
num_participating_players++;
store_participating_players |= (1 << i);
int j;
for(j=0; j<MAX_PLAYERS; j++)
- if (player_participates[j])
+ if (tape.player_participates[j])
fputc(tape.pos[i].action[j], file);
fputc(tape.pos[i].delay, file);
void LoadScore(int level_nr)
{
int i;
- char filename[MAX_FILENAME_LEN];
+ char *filename = getScoreFilename(level_nr);
char cookie[MAX_LINE_LEN];
char line[MAX_LINE_LEN];
char *line_ptr;
FILE *file;
- /* start with empty score table */
+ /* always start with reliable default values */
for(i=0; i<MAX_SCORE_ENTRIES; i++)
{
strcpy(highscore[i].Name, EMPTY_ALIAS);
highscore[i].Score = 0;
}
- sprintf(filename, "%s/%d.%s",
- getScoreDir(leveldir[leveldir_nr].filename),
- level_nr, SCOREFILE_EXTENSION);
-
if (!(file = fopen(filename, "r")))
return;
/* check file identifier */
fgets(cookie, MAX_LINE_LEN, file);
+ if (strlen(cookie) > 0 && cookie[strlen(cookie) - 1] == '\n')
+ cookie[strlen(cookie) - 1] = '\0';
if (strcmp(cookie, SCORE_COOKIE) != 0)
{
void SaveScore(int level_nr)
{
int i;
- char filename[MAX_FILENAME_LEN];
+ char *filename = getScoreFilename(level_nr);
FILE *file;
InitScoreDirectory(leveldir[leveldir_nr].filename);
- sprintf(filename, "%s/%d.%s",
- getScoreDir(leveldir[leveldir_nr].filename),
- level_nr, SCOREFILE_EXTENSION);
-
if (!(file = fopen(filename, "w")))
{
Error(ERR_WARN, "cannot save score for level %d", level_nr);
if (!(file = fopen(filename, "r")))
{
- Error(ERR_WARN, "cannot open setup/info file '%s'", filename);
+ Error(ERR_WARN, "cannot open configuration file '%s'", filename);
return NULL;
}
freeSetupFileList(setup_file_list);
if (first_valid_list_entry == NULL)
- Error(ERR_WARN, "setup/info file '%s' is empty", filename);
+ Error(ERR_WARN, "configuration file '%s' is empty", filename);
return first_valid_list_entry;
}
{
if (strcmp(setup_file_list->value, identifier) != 0)
{
- Error(ERR_WARN, "setup/info file has wrong version");
+ Error(ERR_WARN, "configuration file has wrong version");
return;
}
else
checkSetupFileListIdentifier(setup_file_list->next, identifier);
else
{
- Error(ERR_WARN, "setup/info file has no version information");
+ Error(ERR_WARN, "configuration file has no version information");
return;
}
}
int i, current_entry = start_entry;
if ((dir = opendir(level_directory)) == NULL)
- Error(ERR_EXIT, "cannot read level directory '%s'", level_directory);
+ {
+ Error(ERR_WARN, "cannot read level directory '%s'", level_directory);
+ return current_entry;
+ }
while (current_entry < MAX_LEVDIR_ENTRIES)
{
closedir(dir);
- if (current_entry == start_entry && start_entry != -1)
- Error(ERR_EXIT, "cannot find any valid level series in directory '%s'",
+ if (current_entry == start_entry)
+ Error(ERR_WARN, "cannot find any valid level series in directory '%s'",
level_directory);
return current_entry;
num_leveldirs);
num_leveldirs = LoadLevelInfoFromLevelDir(getUserLevelDir(""),
num_leveldirs);
+
+ if (num_leveldirs == 0)
+ Error(ERR_EXIT, "cannot find any valid level series in any directory");
+
if (num_leveldirs > 1)
qsort(leveldir, num_leveldirs, sizeof(struct LevelDirInfo),
compareLevelDirInfoEntries);