X-Git-Url: https://git.artsoft.org/?p=rocksndiamonds.git;a=blobdiff_plain;f=src%2Fgame_sp%2Ffile.c;h=8467cbf03877ab770470259a6519c8841571e89c;hp=27cb452a08136c6e8a8a0934a4bac64efb35f19c;hb=30eb586d06bc4d1ee7388dced1c20e530292aa93;hpb=c60227514289cd7d512539785bb2fe47d30db51a diff --git a/src/game_sp/file.c b/src/game_sp/file.c index 27cb452a..8467cbf0 100644 --- a/src/game_sp/file.c +++ b/src/game_sp/file.c @@ -7,13 +7,13 @@ /* functions for loading Supaplex level */ /* ------------------------------------------------------------------------- */ -void setTapeInfoToDefaults_SP() +static void setTapeInfoToDefaults_SP(void) { native_sp_level.demo.is_available = FALSE; native_sp_level.demo.length = 0; } -void setLevelInfoToDefaults_SP() +void setLevelInfoToDefaults_SP(void) { LevelInfoType *header = &native_sp_level.header; char *empty_title = "-------- EMPTY --------"; @@ -58,7 +58,7 @@ void setLevelInfoToDefaults_SP() setTapeInfoToDefaults_SP(); } -void copyInternalEngineVars_SP() +void copyInternalEngineVars_SP(void) { int count; int i, x, y; @@ -72,17 +72,6 @@ void copyInternalEngineVars_SP() FieldMax = (FieldWidth * FieldHeight) + HeaderSize - 1; LevelMax = (FieldWidth * FieldHeight) - 1; -#if 0 - /* (add one byte for the level number stored as first byte of demo data) */ - FileMax = FieldMax + native_sp_level.demo.length + 1; -#endif - -#if 0 - PlayField8 = REDIM_1D(sizeof(byte), 0, FileMax); - DisPlayField = REDIM_1D(sizeof(byte), 0, FieldMax); - PlayField16 = REDIM_1D(sizeof(int), -game_sp.preceding_buffer_size, FieldMax); -#endif - /* initialize preceding playfield buffer */ for (i = -game_sp.preceding_buffer_size; i < 0; i++) PlayField16[i] = 0; @@ -137,38 +126,17 @@ void copyInternalEngineVars_SP() } if (native_sp_level.demo.is_available) - { DemoAvailable = True; -#if 0 - /* !!! NEVER USED !!! */ - PlayField8[FieldMax + 1] = native_sp_level.demo.level_nr; - - /* !!! NEVER USED !!! */ - for (i = 0; i < native_sp_level.demo.length; i++) - PlayField8[FieldMax + 2 + i] = native_sp_level.demo.data[i]; -#endif - } - -#if 0 - AnimationPosTable = REDIM_1D(sizeof(int), 0, LevelMax - 2 * FieldWidth); - AnimationSubTable = REDIM_1D(sizeof(byte), 0, LevelMax - 2 * FieldWidth); - TerminalState = REDIM_1D(sizeof(byte), 0, FieldMax); -#endif - GravityFlag = LInfo.InitialGravity; FreezeZonks = LInfo.InitialFreezeZonks; -#if 1 - /* this is set by main game tape code to native random generator directly */ -#else - RandomSeed = LInfo.DemoRandomSeed; -#endif - LevelLoaded = True; + + /* random seed set by main game tape code to native random generator seed */ } -static void LoadNativeLevelFromFileStream_SP(FILE *file, int width, int height, +static void LoadNativeLevelFromFileStream_SP(File *file, int width, int height, boolean demo_available) { LevelInfoType *header = &native_sp_level.header; @@ -265,9 +233,9 @@ static void LoadNativeLevelFromFileStream_SP(FILE *file, int width, int height, /* read raw level header bytes (96 bytes) */ - fseek(file, -(SP_HEADER_SIZE), SEEK_CUR); /* rewind file */ + seekFile(file, -(SP_HEADER_SIZE), SEEK_CUR); /* rewind file */ for (i = 0; i < SP_HEADER_SIZE; i++) - native_sp_level.header_raw_bytes[i] = fgetc(file); + native_sp_level.header_raw_bytes[i] = getByteFromFile(file); /* also load demo tape, if available (only in single level files) */ @@ -281,26 +249,27 @@ static void LoadNativeLevelFromFileStream_SP(FILE *file, int width, int height, native_sp_level.demo.level_nr = level_nr; - for (i = 0; i < SP_MAX_TAPE_LEN && !feof(file); i++) + for (i = 0; i < SP_MAX_TAPE_LEN && !checkEndOfFile(file); i++) { native_sp_level.demo.data[i] = getFile8Bit(file); if (native_sp_level.demo.data[i] == 0xff) /* "end of demo" byte */ - { - i++; - break; - } } + if (i >= SP_MAX_TAPE_LEN) + Error(ERR_WARN, "SP demo truncated: size exceeds maximum SP demo size %d", + SP_MAX_TAPE_LEN); + native_sp_level.demo.length = i; native_sp_level.demo.is_available = (native_sp_level.demo.length > 0); } } -boolean LoadNativeLevel_SP(char *filename, int level_pos) +boolean LoadNativeLevel_SP(char *filename, int level_pos, + boolean level_info_only) { - FILE *file; + File *file; int i, l, x, y; char name_first, name_last; struct LevelInfo_SP multipart_level; @@ -322,9 +291,10 @@ boolean LoadNativeLevel_SP(char *filename, int level_pos) setLevelInfoToDefaults_SP(); copyInternalEngineVars_SP(); - if (!(file = fopen(filename, MODE_READ))) + if (!(file = openFile(filename, MODE_READ))) { - Error(ERR_WARN, "cannot open file '%s' -- using empty level", filename); + if (!level_info_only) + Error(ERR_WARN, "cannot open file '%s' -- using empty level", filename); return FALSE; } @@ -393,7 +363,7 @@ boolean LoadNativeLevel_SP(char *filename, int level_pos) } /* position file stream to the requested level (in case of level package) */ - if (fseek(file, file_seek_pos, SEEK_SET) != 0) + if (seekFile(file, file_seek_pos, SEEK_SET) != 0) { Error(ERR_WARN, "cannot fseek in file '%s' -- using empty level", filename); @@ -504,11 +474,6 @@ boolean LoadNativeLevel_SP(char *filename, int level_pos) multipart_xpos = (int)(name_first - '0'); multipart_ypos = (int)(name_last - '0'); -#if 0 - printf("----------> part (%d/%d) of multi-part level '%s'\n", - multipart_xpos, multipart_ypos, multipart_level.header.LevelTitle); -#endif - if (multipart_xpos * SP_STD_PLAYFIELD_WIDTH > SP_MAX_PLAYFIELD_WIDTH || multipart_ypos * SP_STD_PLAYFIELD_HEIGHT > SP_MAX_PLAYFIELD_HEIGHT) { @@ -536,7 +501,7 @@ boolean LoadNativeLevel_SP(char *filename, int level_pos) } } - fclose(file); + closeFile(file); if (use_empty_level) { @@ -609,6 +574,8 @@ void SaveNativeLevel_SP(char *filename) for (i = 0; i < native_sp_level.demo.length; i++) putFile8Bit(file, native_sp_level.demo.data[i]); + + putFile8Bit(file, 0xff); /* "end of demo" byte */ } fclose(file);