X-Git-Url: https://git.artsoft.org/?a=blobdiff_plain;f=src%2Ffiles.c;h=e48a0991454ac44c69d30eca4fb4d957a91222db;hb=56fed90e3cabb9ef3052a15e6d49b47eead2cd09;hp=fb9f9603c192c90b29adbe91fb141106250acea8;hpb=63ee0a61e7a4b4ec02c93d9647488f70784a6516;p=rocksndiamonds.git diff --git a/src/files.c b/src/files.c index fb9f9603..e48a0991 100644 --- a/src/files.c +++ b/src/files.c @@ -26,7 +26,7 @@ #define MAX_LINE_LEN 1000 /* maximal input line length */ #define CHUNK_ID_LEN 4 /* IFF style chunk id length */ #define LEVEL_HEADER_SIZE 80 /* size of level file header */ -#define LEVEL_HEADER_UNUSED 18 /* unused level header bytes */ +#define LEVEL_HEADER_UNUSED 16 /* unused level header bytes */ #define TAPE_HEADER_SIZE 20 /* size of tape file header */ #define TAPE_HEADER_UNUSED 7 /* unused tape header bytes */ #define FILE_VERSION_1_0 10 /* old 1.0 file version */ @@ -108,6 +108,11 @@ IS_LEVELCLASS_USER(n) ? LEVELCLASS_USER : \ LEVELCLASS_UNDEFINED) +#define LEVELCOLOR(n) (IS_LEVELCLASS_TUTORIAL(n) ? FC_BLUE : \ + IS_LEVELCLASS_CLASSICS(n) ? FC_YELLOW : \ + IS_LEVELCLASS_CONTRIBUTION(n) ? FC_GREEN : \ + IS_LEVELCLASS_USER(n) ? FC_RED : FC_BLUE) + static void SaveUserLevelInfo(); /* for 'InitUserLevelDir()' */ static char *getSetupLine(char *, int); /* for 'SaveUserLevelInfo()' */ @@ -270,27 +275,6 @@ static void InitUserLevelDirectory(char *level_subdir) } } -static void getFileChunk(FILE *file, char *chunk_buffer, int *chunk_length) -{ - fgets(chunk_buffer, CHUNK_ID_LEN + 1, file); - - *chunk_length = - (fgetc(file) << 24) | - (fgetc(file) << 16) | - (fgetc(file) << 8) | - (fgetc(file) << 0); -} - -static void putFileChunk(FILE *file, char *chunk_name, int chunk_length) -{ - fputs(chunk_name, file); - - fputc((chunk_length >> 24) & 0xff, file); - fputc((chunk_length >> 16) & 0xff, file); - fputc((chunk_length >> 8) & 0xff, file); - fputc((chunk_length >> 0) & 0xff, file); -} - static void setLevelInfoToDefaults() { int i, x, y; @@ -308,8 +292,8 @@ static void setLevelInfoToDefaults() level.dauer_sieb = 10; level.dauer_ablenk = 10; level.amoebe_inhalt = EL_DIAMANT; - - level.high_speed = FALSE; + level.double_speed = FALSE; + level.gravity = FALSE; for(i=0; i= FILE_VERSION_1_2) { - getFileChunk(file, chunk, &chunk_length); + getFileChunk(file, chunk, &chunk_length, BYTE_ORDER_BIG_ENDIAN); if (strcmp(chunk, "HEAD") || chunk_length != LEVEL_HEADER_SIZE) { Error(ERR_WARN, "wrong 'HEAD' chunk of level file '%s'", filename); @@ -441,7 +425,9 @@ void LoadLevel(int level_nr) level.tempo_amoebe = fgetc(file); level.dauer_sieb = fgetc(file); level.dauer_ablenk = fgetc(file); - level.amoebe_inhalt = fgetc(file); + level.amoebe_inhalt = fgetc(file); + level.double_speed = (fgetc(file) == 1 ? TRUE : FALSE); + level.gravity = (fgetc(file) == 1 ? TRUE : FALSE); for(i=0; i= FILE_VERSION_1_2) { - getFileChunk(file, chunk, &chunk_length); + getFileChunk(file, chunk, &chunk_length, BYTE_ORDER_BIG_ENDIAN); /* look for optional author chunk */ if (strcmp(chunk, "AUTH") == 0 && chunk_length == MAX_LEVEL_AUTHOR_LEN) @@ -458,7 +444,7 @@ void LoadLevel(int level_nr) level.author[i] = fgetc(file); level.author[MAX_LEVEL_NAME_LEN] = 0; - getFileChunk(file, chunk, &chunk_length); + getFileChunk(file, chunk, &chunk_length, BYTE_ORDER_BIG_ENDIAN); } /* look for optional content chunk */ @@ -474,7 +460,7 @@ void LoadLevel(int level_nr) for(x=0; x<3; x++) level.mampfer_inhalt[i][x][y] = fgetc(file); - getFileChunk(file, chunk, &chunk_length); + getFileChunk(file, chunk, &chunk_length, BYTE_ORDER_BIG_ENDIAN); } /* next check body chunk identifier and chunk length */ @@ -504,7 +490,7 @@ void LoadLevel(int level_nr) { 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; + level.double_speed = TRUE; } } @@ -523,7 +509,7 @@ void SaveLevel(int level_nr) fputs(LEVEL_COOKIE, file); /* file identifier */ fputc('\n', file); - putFileChunk(file, "HEAD", LEVEL_HEADER_SIZE); + putFileChunk(file, "HEAD", LEVEL_HEADER_SIZE, BYTE_ORDER_BIG_ENDIAN); fputc(level.fieldx, file); fputc(level.fieldy, file); @@ -544,16 +530,18 @@ void SaveLevel(int level_nr) fputc(level.dauer_sieb, file); fputc(level.dauer_ablenk, file); fputc(level.amoebe_inhalt, file); + fputc((level.double_speed ? 1 : 0), file); + fputc((level.gravity ? 1 : 0), file); for(i=0; i