X-Git-Url: https://git.artsoft.org/?a=blobdiff_plain;f=src%2Ffiles.c;h=e0446de5604e47c9569087d904856e86b508b3d8;hb=08ad905f20de863e1f86eb772ecc2fbf7721529d;hp=4de97c6c89736aeba2381600806ef3fae9fe8d85;hpb=b81f28710057e7d84528b65b92e9b4d1aaadab6c;p=rocksndiamonds.git diff --git a/src/files.c b/src/files.c index 4de97c6c..e0446de5 100644 --- a/src/files.c +++ b/src/files.c @@ -1,7 +1,7 @@ /*********************************************************** * Rocks'n'Diamonds -- McDuffin Strikes Back! * *----------------------------------------------------------* -* (c) 1995-2001 Artsoft Entertainment * +* (c) 1995-2002 Artsoft Entertainment * * Holger Schemel * * Detmolder Strasse 189 * * 33604 Bielefeld * @@ -30,7 +30,7 @@ #define LEVEL_CHUNK_CNT2_SIZE 160 /* size of level CNT2 chunk */ #define LEVEL_CHUNK_CNT2_UNUSED 11 /* unused CNT2 chunk bytes */ #define TAPE_HEADER_SIZE 20 /* size of tape file header */ -#define TAPE_HEADER_UNUSED 7 /* unused tape header bytes */ +#define TAPE_HEADER_UNUSED 3 /* unused tape header bytes */ /* file identifier strings */ #define LEVEL_COOKIE_TMPL "ROCKSNDIAMONDS_LEVEL_FILE_VERSION_x.x" @@ -58,7 +58,7 @@ static void setLevelInfoToDefaults() for(x=0; xauthor, ANONYMOUS_NAME) != 0) @@ -129,18 +129,23 @@ static void setLevelInfoToDefaults() static int checkLevelElement(int element) { - if (element >= EL_FIRST_RUNTIME_EL) + if (element >= NUM_FILE_ELEMENTS) { Error(ERR_WARN, "invalid level element %d", element); - element = EL_CHAR_FRAGE; + element = EL_CHAR_QUESTION; } + else if (element == EL_PLAYER_OBSOLETE) + element = EL_PLAYER1; + else if (element == EL_KEY_OBSOLETE) + element = EL_KEY1; return element; } static int LoadLevel_VERS(FILE *file, int chunk_size, struct LevelInfo *level) { - ReadChunk_VERS(file, &(level->file_version), &(level->game_version)); + level->file_version = getFileVersion(file); + level->game_version = getFileVersion(file); return chunk_size; } @@ -282,7 +287,7 @@ static int LoadLevel_CNT2(FILE *file, int chunk_size, struct LevelInfo *level) if (num_contents < 1 || num_contents > MAX_ELEMENT_CONTENTS) num_contents = STD_ELEMENT_CONTENTS; - if (element == EL_MAMPFER) + if (element == EL_YAMYAM) { level->num_yam_contents = num_contents; @@ -291,7 +296,7 @@ static int LoadLevel_CNT2(FILE *file, int chunk_size, struct LevelInfo *level) for(x=0; x<3; x++) level->yam_content[i][x][y] = content_array[i][x][y]; } - else if (element == EL_AMOEBE_BD) + else if (element == EL_BD_AMOEBA) { level->amoeba_content = content_array[0][0][0]; } @@ -444,6 +449,10 @@ void LoadLevel(int level_nr) /* player was faster than monsters in (pre-)1.0 levels */ level.double_speed = TRUE; } + + /* Default behaviour for EM style gems was "slippery" only in 2.0.1 */ + if (level.game_version == VERSION_IDENT(2,0,1)) + level.em_slippery_gems = TRUE; } else { @@ -471,6 +480,12 @@ void LoadLevel(int level_nr) SetBorderElement(); } +static void SaveLevel_VERS(FILE *file, struct LevelInfo *level) +{ + putFileVersion(file, level->file_version); + putFileVersion(file, level->game_version); +} + static void SaveLevel_HEAD(FILE *file, struct LevelInfo *level) { int i, x, y; @@ -490,13 +505,13 @@ static void SaveLevel_HEAD(FILE *file, struct LevelInfo *level) for(i=0; iencoding_16bit_yamyam ? EL_LEERRAUM : + fputc((level->encoding_16bit_yamyam ? EL_EMPTY : level->yam_content[i][x][y]), file); fputc(level->amoeba_speed, file); fputc(level->time_magic_wall, file); fputc(level->time_wheel, file); - fputc((level->encoding_16bit_amoeba ? EL_LEERRAUM : level->amoeba_content), + fputc((level->encoding_16bit_amoeba ? EL_EMPTY : level->amoeba_content), file); fputc((level->double_speed ? 1 : 0), file); fputc((level->gravity ? 1 : 0), file); @@ -519,7 +534,7 @@ static void SaveLevel_CONT(FILE *file, struct LevelInfo *level) { int i, x, y; - fputc(EL_MAMPFER, file); + fputc(EL_YAMYAM, file); fputc(level->num_yam_contents, file); fputc(0, file); fputc(0, file); @@ -552,7 +567,7 @@ static void SaveLevel_CNT2(FILE *file, struct LevelInfo *level, int element) int num_contents, content_xsize, content_ysize; int content_array[MAX_ELEMENT_CONTENTS][3][3]; - if (element == EL_MAMPFER) + if (element == EL_YAMYAM) { num_contents = level->num_yam_contents; content_xsize = 3; @@ -563,7 +578,7 @@ static void SaveLevel_CNT2(FILE *file, struct LevelInfo *level, int element) for(x=0; x<3; x++) content_array[i][x][y] = level->yam_content[i][x][y]; } - else if (element == EL_AMOEBE_BD) + else if (element == EL_BD_AMOEBA) { num_contents = 1; content_xsize = 1; @@ -572,7 +587,7 @@ static void SaveLevel_CNT2(FILE *file, struct LevelInfo *level, int element) for(i=0; iamoeba_content; } else @@ -610,6 +625,8 @@ void SaveLevel(int level_nr) return; } + level.file_version = FILE_VERSION_ACTUAL; + level.game_version = GAME_VERSION_ACTUAL; /* check level field for 16-bit elements */ level.encoding_16bit_field = FALSE; @@ -638,7 +655,7 @@ void SaveLevel(int level_nr) putFileChunkBE(file, "CAVE", CHUNK_SIZE_NONE); putFileChunkBE(file, "VERS", FILE_VERS_CHUNK_SIZE); - WriteChunk_VERS(file, FILE_VERSION_ACTUAL, GAME_VERSION_ACTUAL); + SaveLevel_VERS(file, &level); putFileChunkBE(file, "HEAD", LEVEL_HEADER_SIZE); SaveLevel_HEAD(file, &level); @@ -653,13 +670,13 @@ void SaveLevel(int level_nr) level.num_yam_contents != STD_ELEMENT_CONTENTS) { putFileChunkBE(file, "CNT2", LEVEL_CHUNK_CNT2_SIZE); - SaveLevel_CNT2(file, &level, EL_MAMPFER); + SaveLevel_CNT2(file, &level, EL_YAMYAM); } if (level.encoding_16bit_amoeba) { putFileChunkBE(file, "CNT2", LEVEL_CHUNK_CNT2_SIZE); - SaveLevel_CNT2(file, &level, EL_AMOEBE_BD); + SaveLevel_CNT2(file, &level, EL_BD_AMOEBA); } fclose(file); @@ -677,8 +694,6 @@ static void setTapeInfoToDefaults() int i; /* always start with reliable default values (empty tape) */ - tape.file_version = FILE_VERSION_ACTUAL; - tape.game_version = GAME_VERSION_ACTUAL; TapeErase(); /* default values (also for pre-1.2 tapes) with only the first player */ @@ -700,7 +715,8 @@ static void setTapeInfoToDefaults() static int LoadTape_VERS(FILE *file, int chunk_size, struct TapeInfo *tape) { - ReadChunk_VERS(file, &(tape->file_version), &(tape->game_version)); + tape->file_version = getFileVersion(file); + tape->game_version = getFileVersion(file); return chunk_size; } @@ -717,8 +733,7 @@ static int LoadTape_HEAD(FILE *file, int chunk_size, struct TapeInfo *tape) if (tape->file_version >= FILE_VERSION_1_2) { byte store_participating_players = fgetc(file); - - ReadUnusedBytesFromFile(file, TAPE_HEADER_UNUSED); + int engine_version; /* since version 1.2, tapes store which players participate in the tape */ tape->num_participating_players = 0; @@ -732,6 +747,12 @@ static int LoadTape_HEAD(FILE *file, int chunk_size, struct TapeInfo *tape) tape->num_participating_players++; } } + + ReadUnusedBytesFromFile(file, TAPE_HEADER_UNUSED); + + engine_version = getFileVersion(file); + if (engine_version > 0) + tape->engine_version = engine_version; } return chunk_size; @@ -939,6 +960,12 @@ void LoadTape(int level_nr) tape.length_seconds = GetTapeLength(); } +static void SaveTape_VERS(FILE *file, struct TapeInfo *tape) +{ + putFileVersion(file, tape->file_version); + putFileVersion(file, tape->game_version); +} + static void SaveTape_HEAD(FILE *file, struct TapeInfo *tape) { int i; @@ -955,7 +982,10 @@ static void SaveTape_HEAD(FILE *file, struct TapeInfo *tape) fputc(store_participating_players, file); + /* unused bytes not at the end here for 4-byte alignment of engine_version */ WriteUnusedBytesToFile(file, TAPE_HEADER_UNUSED); + + putFileVersion(file, tape->engine_version); } static void SaveTape_BODY(FILE *file, struct TapeInfo *tape) @@ -997,6 +1027,9 @@ void SaveTape(int level_nr) return; } + tape.file_version = FILE_VERSION_ACTUAL; + tape.game_version = GAME_VERSION_ACTUAL; + /* count number of participating players */ for(i=0; ilevel_nr, tape->file_version, tape->game_version); printf("-------------------------------------------------------------------------------\n");