-void OLD_LoadLevel(int level_nr)
-{
- int i, x, y;
- char *filename = getLevelFilename(level_nr);
- char cookie[MAX_LINE_LEN];
- char chunk_name[CHUNK_ID_LEN + 1];
- boolean encoding_16bit = FALSE; /* default: maximal 256 elements */
- int file_version = FILE_VERSION_ACTUAL;
- int chunk_size;
- 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_name, &chunk_size, BYTE_ORDER_BIG_ENDIAN);
- if (strcmp(chunk_name, "HEAD") || chunk_size != 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_name, &chunk_size, BYTE_ORDER_BIG_ENDIAN);
-
- /* look for optional author chunk */
- if (strcmp(chunk_name, "AUTH") == 0 && chunk_size == 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_name, &chunk_size, BYTE_ORDER_BIG_ENDIAN);
- }
-
- /* look for optional content chunk */
- if (strcmp(chunk_name, "CONT") == 0 &&
- chunk_size == 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;
- }
-
- for(i=0; i<MAX_ELEMENT_CONTENTS; i++)
- for(y=0; y<3; y++)
- for(x=0; x<3; x++)
- level.yam_content[i][x][y] =
- checkLevelElement(encoding_16bit ?
- getFile16BitInteger(file,
- BYTE_ORDER_BIG_ENDIAN) :
- fgetc(file));
-
- getFileChunk(file, chunk_name, &chunk_size, BYTE_ORDER_BIG_ENDIAN);
- }
-
- /* next check body chunk identifier and chunk size */
- if (strcmp(chunk_name, "BODY") != 0 ||
- chunk_size != lev_fieldx * lev_fieldy)
- {
- Error(ERR_WARN, "wrong 'BODY' chunk of level file '%s'", filename);
- fclose(file);
- return;
- }
- }
-
- /* clear all other level fields (needed if resized in level editor later) */
- for(x=0; x<MAX_LEV_FIELDX; x++)
- for(y=0; y<MAX_LEV_FIELDY; y++)
- Feld[x][y] = Ur[x][y] = EL_LEERRAUM;
-
- /* now read in the valid level fields from level file */
- for(y=0; y<lev_fieldy; y++)
- for(x=0; x<lev_fieldx; x++)
- Feld[x][y] = Ur[x][y] =
- checkLevelElement(encoding_16bit ?
- getFile16BitInteger(file, BYTE_ORDER_BIG_ENDIAN) :
- fgetc(file));
-
- fclose(file);
-
- if (IS_LEVELCLASS_CONTRIBUTION(leveldir_current) ||
- IS_LEVELCLASS_USER(leveldir_current))
- {
- /* for user contributed and private levels, use the version of
- the game engine the levels were created for */
- level.game_version = file_version;
-
- /* player was faster than monsters in pre-1.0 levels */
- if (file_version == FILE_VERSION_1_0)
- {
- Error(ERR_WARN, "level file '%s' has version number 1.0", filename);
- Error(ERR_WARN, "using high speed movement for player");
- level.double_speed = TRUE;
- }
- }
- else
- {
- /* always use the latest version of the game engine for all but
- user contributed and private levels */
- level.game_version = GAME_VERSION_ACTUAL;
- }
-
- /* determine border element for this level */
- SetBorderElement();
-}
-