X-Git-Url: https://git.artsoft.org/?a=blobdiff_plain;f=src%2Ffiles.c;h=76fd384a247ed9ad584f713221895da0f609a018;hb=dd8c2278ba26f777d147a011a4e23ebaab8091cd;hp=2a72397139931fb4d9c735428353d0925c65e1cb;hpb=2443a8a09966a9940e1420c91d24a297325c2a00;p=rocksndiamonds.git diff --git a/src/files.c b/src/files.c index 2a723971..76fd384a 100644 --- a/src/files.c +++ b/src/files.c @@ -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; } @@ -152,8 +153,8 @@ static int LoadLevel_HEAD(FILE *file, int chunk_size, struct LevelInfo *level) lev_fieldx = level->fieldx = fgetc(file); lev_fieldy = level->fieldy = fgetc(file); - level->time = getFile16BitInteger(file, BYTE_ORDER_BIG_ENDIAN); - level->gems_needed = getFile16BitInteger(file, BYTE_ORDER_BIG_ENDIAN); + level->time = getFile16BitBE(file); + level->gems_needed = getFile16BitBE(file); for(i=0; iname[i] = fgetc(file); @@ -229,8 +230,7 @@ static int LoadLevel_CONT(FILE *file, int chunk_size, struct LevelInfo *level) for(x=0; x<3; x++) level->yam_content[i][x][y] = checkLevelElement(level->encoding_16bit_field ? - getFile16BitInteger(file, BYTE_ORDER_BIG_ENDIAN) : - fgetc(file)); + getFile16BitBE(file) : fgetc(file)); return chunk_size; } @@ -257,8 +257,7 @@ static int LoadLevel_BODY(FILE *file, int chunk_size, struct LevelInfo *level) for(x=0; xfieldx; x++) Feld[x][y] = Ur[x][y] = checkLevelElement(level->encoding_16bit_field ? - getFile16BitInteger(file, BYTE_ORDER_BIG_ENDIAN) : - fgetc(file)); + getFile16BitBE(file) : fgetc(file)); return chunk_size; } @@ -269,7 +268,7 @@ static int LoadLevel_CNT2(FILE *file, int chunk_size, struct LevelInfo *level) int num_contents, content_xsize, content_ysize; int content_array[MAX_ELEMENT_CONTENTS][3][3]; - element = checkLevelElement(getFile16BitInteger(file,BYTE_ORDER_BIG_ENDIAN)); + element = checkLevelElement(getFile16BitBE(file)); num_contents = fgetc(file); content_xsize = fgetc(file); content_ysize = fgetc(file); @@ -278,8 +277,7 @@ static int LoadLevel_CNT2(FILE *file, int chunk_size, struct LevelInfo *level) for(i=0; i MAX_ELEMENT_CONTENTS) @@ -323,12 +321,12 @@ void LoadLevel(int level_nr) return; } - getFileChunk(file, chunk_name, NULL, BYTE_ORDER_BIG_ENDIAN); + getFileChunkBE(file, chunk_name, NULL); if (strcmp(chunk_name, "RND1") == 0) { - getFile32BitInteger(file, BYTE_ORDER_BIG_ENDIAN); /* not used */ + getFile32BitBE(file); /* not used */ - getFileChunk(file, chunk_name, NULL, BYTE_ORDER_BIG_ENDIAN); + getFileChunkBE(file, chunk_name, NULL); if (strcmp(chunk_name, "CAVE") != 0) { Error(ERR_WARN, "unknown format of level file '%s'", filename); @@ -386,7 +384,7 @@ void LoadLevel(int level_nr) { NULL, 0, NULL } }; - while (getFileChunk(file, chunk_name, &chunk_size, BYTE_ORDER_BIG_ENDIAN)) + while (getFileChunkBE(file, chunk_name, &chunk_size)) { int i = 0; @@ -447,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 { @@ -474,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; @@ -481,8 +489,8 @@ static void SaveLevel_HEAD(FILE *file, struct LevelInfo *level) fputc(level->fieldx, file); fputc(level->fieldy, file); - putFile16BitInteger(file, level->time, BYTE_ORDER_BIG_ENDIAN); - putFile16BitInteger(file, level->gems_needed, BYTE_ORDER_BIG_ENDIAN); + putFile16BitBE(file, level->time); + putFile16BitBE(file, level->gems_needed); for(i=0; iname[i], file); @@ -531,8 +539,7 @@ static void SaveLevel_CONT(FILE *file, struct LevelInfo *level) for(y=0; y<3; y++) for(x=0; x<3; x++) if (level->encoding_16bit_field) - putFile16BitInteger(file, level->yam_content[i][x][y], - BYTE_ORDER_BIG_ENDIAN); + putFile16BitBE(file, level->yam_content[i][x][y]); else fputc(level->yam_content[i][x][y], file); } @@ -545,7 +552,7 @@ static void SaveLevel_BODY(FILE *file, struct LevelInfo *level) for(y=0; yfieldy; y++) for(x=0; xfieldx; x++) if (level->encoding_16bit_field) - putFile16BitInteger(file, Ur[x][y], BYTE_ORDER_BIG_ENDIAN); + putFile16BitBE(file, Ur[x][y]); else fputc(Ur[x][y], file); } @@ -588,7 +595,7 @@ static void SaveLevel_CNT2(FILE *file, struct LevelInfo *level, int element) return; } - putFile16BitInteger(file, element, BYTE_ORDER_BIG_ENDIAN); + putFile16BitBE(file, element); fputc(num_contents, file); fputc(content_xsize, file); fputc(content_ysize, file); @@ -598,8 +605,7 @@ static void SaveLevel_CNT2(FILE *file, struct LevelInfo *level, int element) for(i=0; ifile_version), &(tape->game_version)); + tape->file_version = getFileVersion(file); + tape->game_version = getFileVersion(file); return chunk_size; } @@ -714,16 +721,15 @@ static int LoadTape_HEAD(FILE *file, int chunk_size, struct TapeInfo *tape) { int i; - tape->random_seed = getFile32BitInteger(file, BYTE_ORDER_BIG_ENDIAN); - tape->date = getFile32BitInteger(file, BYTE_ORDER_BIG_ENDIAN); - tape->length = getFile32BitInteger(file, BYTE_ORDER_BIG_ENDIAN); + tape->random_seed = getFile32BitBE(file); + tape->date = getFile32BitBE(file); + tape->length = getFile32BitBE(file); /* read header fields that are new since version 1.2 */ 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; @@ -737,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; @@ -840,12 +852,12 @@ void LoadTape(int level_nr) if (!(file = fopen(filename, MODE_READ))) return; - getFileChunk(file, chunk_name, NULL, BYTE_ORDER_BIG_ENDIAN); + getFileChunkBE(file, chunk_name, NULL); if (strcmp(chunk_name, "RND1") == 0) { - getFile32BitInteger(file, BYTE_ORDER_BIG_ENDIAN); /* not used */ + getFile32BitBE(file); /* not used */ - getFileChunk(file, chunk_name, NULL, BYTE_ORDER_BIG_ENDIAN); + getFileChunkBE(file, chunk_name, NULL); if (strcmp(chunk_name, "TAPE") != 0) { Error(ERR_WARN, "unknown format of tape file '%s'", filename); @@ -900,7 +912,7 @@ void LoadTape(int level_nr) { NULL, 0, NULL } }; - while (getFileChunk(file, chunk_name, &chunk_size, BYTE_ORDER_BIG_ENDIAN)) + while (getFileChunkBE(file, chunk_name, &chunk_size)) { int i = 0; @@ -944,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; @@ -954,13 +972,16 @@ static void SaveTape_HEAD(FILE *file, struct TapeInfo *tape) if (tape->player_participates[i]) store_participating_players |= (1 << i); - putFile32BitInteger(file, tape->random_seed, BYTE_ORDER_BIG_ENDIAN); - putFile32BitInteger(file, tape->date, BYTE_ORDER_BIG_ENDIAN); - putFile32BitInteger(file, tape->length, BYTE_ORDER_BIG_ENDIAN); + putFile32BitBE(file, tape->random_seed); + putFile32BitBE(file, tape->date); + putFile32BitBE(file, tape->length); 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) @@ -1002,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; ifullscreen = FALSE; si->ask_on_escape = TRUE; + si->graphics_set = getStringCopy(GRAPHICS_SUBDIR); + si->sounds_set = getStringCopy(SOUNDS_SUBDIR); + si->music_set = getStringCopy(MUSIC_SUBDIR); + si->override_level_graphics = FALSE; + si->override_level_sounds = FALSE; + si->override_level_music = FALSE; + si->shortcut.save_game = DEFAULT_KEY_SAVE_GAME; si->shortcut.load_game = DEFAULT_KEY_LOAD_GAME; + si->shortcut.toggle_pause = DEFAULT_KEY_TOGGLE_PAUSE; for (i=0; i