X-Git-Url: https://git.artsoft.org/?a=blobdiff_plain;f=src%2Ffiles.c;h=58cc705c9c1c6f227ca7df73e3ad9065d5cda033;hb=c9433eab5c4317ed4f89164b386a7d33562e29be;hp=4de97c6c89736aeba2381600806ef3fae9fe8d85;hpb=b81f28710057e7d84528b65b92e9b4d1aaadab6c;p=rocksndiamonds.git diff --git a/src/files.c b/src/files.c index 4de97c6c..58cc705c 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" @@ -140,7 +140,8 @@ static int checkLevelElement(int 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; } @@ -444,6 +445,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 +476,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; @@ -610,6 +621,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 +651,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); @@ -677,8 +690,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 +711,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 +729,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 +743,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 +956,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 +978,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 +1023,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");