X-Git-Url: https://git.artsoft.org/?a=blobdiff_plain;f=src%2Ffiles.c;h=b3a37e6100dec8d9a7c15248834fbdab4551a5f2;hb=19004e830980892c3abc3021bd1b868861836bb8;hp=80a5e7cb82f256380e227888ea8621d8f84b3cdd;hpb=4f767d54c7ac468e9a42e22caf716111be1ceba9;p=rocksndiamonds.git diff --git a/src/files.c b/src/files.c index 80a5e7cb..b3a37e61 100644 --- a/src/files.c +++ b/src/files.c @@ -49,6 +49,7 @@ #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 @@ -56,6 +57,7 @@ #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 @@ -150,6 +152,52 @@ static char *getScoreDir(char *level_subdir) 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) @@ -221,7 +269,7 @@ static void setLevelInfoToDefaults() 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 */ @@ -231,13 +279,6 @@ void LoadLevel(int level_nr) /* 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); @@ -327,17 +368,10 @@ void LoadLevel(int level_nr) 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); @@ -399,19 +433,14 @@ void SaveLevel(int level_nr) 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; @@ -464,11 +493,11 @@ void LoadTape(int level_nr) num_participating_players = 0; for(i=0; i 0) continue; - if (player_participates[j]) + if (tape.player_participates[j]) tape.pos[i].action[j] = fgetc(file); } @@ -559,21 +588,16 @@ void LoadTape(int level_nr) 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"))) { @@ -584,21 +608,12 @@ void SaveTape(int level_nr) return; } - for(i=0; i 0 && cookie[strlen(cookie) - 1] == '\n') + cookie[strlen(cookie) - 1] = '\0'; if (strcmp(cookie, SCORE_COOKIE) != 0) { @@ -730,15 +743,11 @@ void LoadScore(int level_nr) 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);