X-Git-Url: https://git.artsoft.org/?a=blobdiff_plain;f=src%2Ffiles.c;h=87a60c1cc6112ad8546d4c8ad7587471b357d5d6;hb=0c2b6a7610933f9098ec233f7b4c2b52eac3535c;hp=dfd9c85fd5f2c019e794011a0056d565b3703eb1;hpb=e6fa0d1ce485a8a23d282fa9fbbd61474044af2b;p=rocksndiamonds.git diff --git a/src/files.c b/src/files.c index dfd9c85f..87a60c1c 100644 --- a/src/files.c +++ b/src/files.c @@ -58,8 +58,9 @@ #define LEVELSETUP_FILENAME "lvlsetup.cnf" #define LEVELINFO_FILENAME "lvlinfo.cnf" #define LEVELFILE_EXTENSION "lvl" -#define TAPEFILE_EXTENSION "rec" +#define TAPEFILE_EXTENSION "tap" #define SCOREFILE_EXTENSION "sco" +#define ERROR_FILENAME "error.out" #endif /* file permissions for newly written files */ @@ -72,6 +73,17 @@ #define TAPE_PERMS LEVEL_PERMS #define SETUP_PERMS LEVEL_PERMS +/* sort priorities of level series (also used as level series classes) */ +#define LEVELCLASS_TUTORIAL_START 10 +#define LEVELCLASS_TUTORIAL_END 99 +#define LEVELCLASS_CLASSICS_START 100 +#define LEVELCLASS_CLASSICS_END 199 +#define LEVELCLASS_CONTRIBUTION_START 200 +#define LEVELCLASS_CONTRIBUTION_END 299 +#define LEVELCLASS_USER_START 300 +#define LEVELCLASS_USER_END 399 +#define LEVELCLASS_UNDEFINED 999 + static void SaveUserLevelInfo(); /* for 'InitUserLevelDir()' */ static char *getSetupLine(char *, int); /* for 'SaveUserLevelInfo()' */ @@ -80,7 +92,7 @@ static char *getGlobalDataDir() return GAME_DIR; } -static char *getUserDataDir() +char *getUserDataDir() { static char *userdata_dir = NULL; @@ -154,7 +166,7 @@ static char *getScoreDir(char *level_subdir) static char *getLevelFilename(int nr) { static char *filename = NULL; - char basename[20 + strlen(LEVELFILE_EXTENSION)]; + char basename[MAX_FILENAME_LEN]; if (filename != NULL) free(filename); @@ -172,7 +184,7 @@ static char *getLevelFilename(int nr) static char *getTapeFilename(int nr) { static char *filename = NULL; - char basename[20 + strlen(LEVELFILE_EXTENSION)]; + char basename[MAX_FILENAME_LEN]; if (filename != NULL) free(filename); @@ -186,7 +198,7 @@ static char *getTapeFilename(int nr) static char *getScoreFilename(int nr) { static char *filename = NULL; - char basename[20 + strlen(LEVELFILE_EXTENSION)]; + char basename[MAX_FILENAME_LEN]; if (filename != NULL) free(filename); @@ -241,8 +253,8 @@ static void setLevelInfoToDefaults() lev_fieldx = level.fieldx = STD_LEV_FIELDX; lev_fieldy = level.fieldy = STD_LEV_FIELDY; - for(x=0; x= FILE_VERSION_1_2) { - /* next check body chunk identifier and chunk length */ fgets(chunk, CHUNK_ID_LEN + 1, file); chunk_length = (fgetc(file)<<24) | (fgetc(file)<<16) | (fgetc(file)<<8) | fgetc(file); + + /* look for optional content chunk */ + if (strcmp(chunk, "CONT") == 0 && chunk_length == 4 + 8 * 3 * 3) + { + fgetc(file); + MampferMax = fgetc(file); + fgetc(file); + fgetc(file); + + for(i=0; i<8; i++) + for(y=0; y<3; y++) + for(x=0; x<3; x++) + level.mampfer_inhalt[i][x][y] = fgetc(file); + + fgets(chunk, CHUNK_ID_LEN + 1, file); + chunk_length = + (fgetc(file)<<24) | (fgetc(file)<<16) | (fgetc(file)<<8) | fgetc(file); + } + + /* next check body chunk identifier and chunk length */ if (strcmp(chunk, "BODY") || chunk_length != lev_fieldx * lev_fieldy) { Error(ERR_WARN, "wrong 'BODY' chunk of level file '%s'", filename); @@ -356,14 +402,25 @@ void LoadLevel(int level_nr) } } - for(y=0; y= LEVELCLASS_CONTRIBUTION_START && + leveldir[leveldir_nr].sort_priority <= LEVELCLASS_CONTRIBUTION_END) + { + Error(ERR_WARN, "level file '%s' has version number 1.0", filename); + Error(ERR_WARN, "using high speed movement for player"); + level.high_speed = TRUE; + } } void SaveLevel(int level_nr) @@ -414,6 +471,25 @@ void SaveLevel(int level_nr) for(i=0; i> 24) & 0xff, file); + fputc((chunk_length >> 16) & 0xff, file); + fputc((chunk_length >> 8) & 0xff, file); + fputc((chunk_length >> 0) & 0xff, file); + + fputc(EL_MAMPFER, file); + fputc(MampferMax, file); + fputc(0, file); + fputc(0, file); + + for(i=0; i<8; i++) + for(y=0; y<3; y++) + for(x=0; x<3; x++) + fputc(level.mampfer_inhalt[i][x][y], file); + fputs("BODY", file); /* chunk identifier for file body */ chunk_length = lev_fieldx * lev_fieldy; @@ -442,6 +518,17 @@ void LoadTape(int level_nr) int file_version = FILE_VERSION_1_2; /* last version of tape files */ int chunk_length; + /* always start with reliable default values (empty tape) */ + TapeErase(); + + /* default values (also for pre-1.2 tapes) with only the first player */ + tape.player_participates[0] = TRUE; + for(i=1; i 0) - continue; - if (tape.player_participates[j]) tape.pos[i].action[j] = fgetc(file); } @@ -698,7 +781,7 @@ void LoadScore(int level_nr) /* always start with reliable default values */ for(i=0; iname = getStringCopy("non-existing"); ldi->levels = 0; - ldi->sort_priority = 999; /* default: least priority */ + ldi->first_level = 0; + ldi->sort_priority = LEVELCLASS_UNDEFINED; /* default: least priority */ ldi->readonly = TRUE; } @@ -1143,16 +1229,16 @@ static void setSetupInfoToDefaults(struct SetupInfo *si) si->player_name = getStringCopy(getLoginName()); si->sound = TRUE; - si->sound_loops = FALSE; - si->sound_music = FALSE; - si->sound_simple = FALSE; + si->sound_loops = TRUE; + si->sound_music = TRUE; + si->sound_simple = TRUE; si->toons = TRUE; si->double_buffering = TRUE; si->direct_draw = !si->double_buffering; - si->scroll_delay = FALSE; + si->scroll_delay = TRUE; si->soft_scrolling = TRUE; si->fading = FALSE; - si->autorecord = FALSE; + si->autorecord = TRUE; si->quick_doors = FALSE; for (i=0; i highest_level_nr) - last_level_nr = highest_level_nr; + if (last_level_nr < leveldir[level_series_nr].first_level) + last_level_nr = leveldir[level_series_nr].first_level; + if (last_level_nr > leveldir[level_series_nr].last_level) + last_level_nr = leveldir[level_series_nr].last_level; } return last_level_nr; @@ -1354,6 +1438,9 @@ static int LoadLevelInfoFromLevelDir(char *level_directory, int start_entry) leveldir[current_entry] = ldi; leveldir[current_entry].filename = getStringCopy(dir_entry->d_name); + leveldir[current_entry].last_level = + leveldir[current_entry].first_level + + leveldir[current_entry].levels - 1; leveldir[current_entry].user_defined = (level_directory == options.level_directory ? FALSE : TRUE); @@ -1417,7 +1504,8 @@ static void SaveUserLevelInfo() ldi.name = getLoginName(); ldi.levels = 100; - ldi.sort_priority = 300; + ldi.first_level = 0; + ldi.sort_priority = LEVELCLASS_USER_START; ldi.readonly = FALSE; fprintf(file, "%s\n\n", @@ -1663,3 +1751,63 @@ void SaveLevelSetup() chmod(filename, SETUP_PERMS); } + +#ifdef MSDOS +static boolean initErrorFile() +{ + char *filename; + FILE *error_file; + + InitUserDataDirectory(); + + filename = getPath2(getUserDataDir(), ERROR_FILENAME); + error_file = fopen(filename, "w"); + free(filename); + + if (error_file == NULL) + return FALSE; + + fclose(error_file); + + return TRUE; +} + +FILE *openErrorFile() +{ + static boolean first_access = TRUE; + char *filename; + FILE *error_file; + + if (first_access) + { + if (!initErrorFile()) + return NULL; + + first_access = FALSE; + } + + filename = getPath2(getUserDataDir(), ERROR_FILENAME); + error_file = fopen(filename, "a"); + free(filename); + + return error_file; +} + +void dumpErrorFile() +{ + char *filename; + FILE *error_file; + + filename = getPath2(getUserDataDir(), ERROR_FILENAME); + error_file = fopen(filename, "r"); + free(filename); + + if (error_file != NULL) + { + while (!feof(error_file)) + fputc(fgetc(error_file), stderr); + + fclose(error_file); + } +} +#endif