- int i, x, y;
- char *filename = getLevelFilename(level_nr);
- char cookie[MAX_LINE_LEN];
- char chunk[CHUNK_ID_LEN + 1];
- boolean encoding_16bit = FALSE; /* default: maximal 256 elements */
- int file_version = FILE_VERSION_ACTUAL;
- int chunk_length;
- FILE *file;
-
- /* always start with reliable default values */
- setLevelInfoToDefaults();
-
- if (!(file = fopen(filename, MODE_READ)))
- {
- Error(ERR_WARN, "cannot read level '%s' - creating new level", filename);
- return;
- }
-
- /* check file identifier */
- fgets(cookie, MAX_LINE_LEN, file);
- if (strlen(cookie) > 0 && cookie[strlen(cookie) - 1] == '\n')
- cookie[strlen(cookie) - 1] = '\0';
-
-#if 0
- if (strcmp(cookie, LEVEL_COOKIE_10) == 0) /* old 1.0 level format */
- file_version = FILE_VERSION_1_0;
- else if (strcmp(cookie, LEVEL_COOKIE_12) == 0)/* 1.2 (8 bit) level format */
- file_version = FILE_VERSION_1_2;
- else if (strcmp(cookie, LEVEL_COOKIE) != 0) /* unknown level format */
- {
- Error(ERR_WARN, "wrong file identifier of level file '%s'", filename);
- fclose(file);
- return;
- }
-#else
- if (!checkCookieString(cookie, LEVEL_COOKIE)) /* unknown file format */
- {
- Error(ERR_WARN, "unknown format of level file '%s'", filename);
- fclose(file);
- return;
- }
-
- file_version = getFileVersionFromCookieString(cookie);
-#endif
-
- level.file_version = file_version;
-
- /* read chunk "HEAD" */
- if (file_version >= FILE_VERSION_1_2)
- {
- 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);
- fclose(file);
- return;
- }
- }
-
- 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);
-
- for(i=0; i<MAX_LEVEL_NAME_LEN; i++)
- level.name[i] = fgetc(file);
- level.name[MAX_LEVEL_NAME_LEN] = 0;
-
- for(i=0; i<LEVEL_SCORE_ELEMENTS; i++)
- level.score[i] = fgetc(file);
-
- level.num_yam_contents = STD_ELEMENT_CONTENTS;
- for(i=0; i<MAX_ELEMENT_CONTENTS; i++)
- {
- for(y=0; y<3; y++)
- {
- for(x=0; x<3; x++)
- {
- if (i < STD_ELEMENT_CONTENTS)
- level.yam_content[i][x][y] = checkLevelElement(fgetc(file));
- else
- level.yam_content[i][x][y] = EL_LEERRAUM;
- }
- }
- }
-
- level.amoeba_speed = fgetc(file);
- level.time_magic_wall = fgetc(file);
- level.time_wheel = fgetc(file);
- level.amoeba_content = checkLevelElement(fgetc(file));
- level.double_speed = (fgetc(file) == 1 ? TRUE : FALSE);
- level.gravity = (fgetc(file) == 1 ? TRUE : FALSE);
-
- encoding_16bit = (fgetc(file) == 1 ? TRUE : FALSE);
-
- for(i=0; i<LEVEL_HEADER_UNUSED; i++) /* skip unused header bytes */
- fgetc(file);
-
- if (file_version >= FILE_VERSION_1_2)
- {
- 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)
- {
- for(i=0; i<MAX_LEVEL_AUTHOR_LEN; i++)
- level.author[i] = fgetc(file);
- level.author[MAX_LEVEL_NAME_LEN] = 0;
-
- getFileChunk(file, chunk, &chunk_length, BYTE_ORDER_BIG_ENDIAN);
- }
-
- /* look for optional content chunk */
- if (strcmp(chunk, "CONT") == 0 &&
- chunk_length == 4 + MAX_ELEMENT_CONTENTS * 3 * 3)
- {
- fgetc(file);
- level.num_yam_contents = fgetc(file);
- fgetc(file);
- fgetc(file);
-
- if (level.num_yam_contents < 1 ||
- level.num_yam_contents > MAX_ELEMENT_CONTENTS)
- {
-#if DEBUG
- printf("WARNING: num_yam_contents == %d (corrected)\n",
- level.num_yam_contents);
-#endif
- level.num_yam_contents = STD_ELEMENT_CONTENTS;
- }