X-Git-Url: https://git.artsoft.org/?a=blobdiff_plain;f=src%2Ffiles.c;h=57368d34ceb73de23b0a82aa4ae49de96e23764b;hb=6d06ba238902736bb99714dc8122bb32a286577a;hp=aa9cdb4cc5558fd4122b90e53eb1fec18ab8f4a2;hpb=58514a5b4392fa9501fced41921157633927ea94;p=rocksndiamonds.git diff --git a/src/files.c b/src/files.c index aa9cdb4c..57368d34 100644 --- a/src/files.c +++ b/src/files.c @@ -1694,7 +1694,8 @@ static int getFileTypeFromBasename(char *basename) return LEVEL_FILE_TYPE_SP; /* check for typical filename of a Diamond Caves II level package file */ - if (strEqualSuffix(basename, ".dc2")) + if (strEqualSuffix(basename, ".dc") || + strEqualSuffix(basename, ".dc2")) return LEVEL_FILE_TYPE_DC; /* ---------- try to determine file type from filesize ---------- */ @@ -5758,12 +5759,10 @@ static void LoadLevelFromFileInfo_DC(struct LevelInfo *level, return; } + // fseek(file, 0x0000, SEEK_SET); + if (level_file_info->packed) { - int position_first_level = 0x00fa; - int extra_bytes = 4; - int skip_bytes; - /* read "magic bytes" from start of file */ fgets(magic_bytes, num_magic_bytes + 1, file); @@ -5772,38 +5771,56 @@ static void LoadLevelFromFileInfo_DC(struct LevelInfo *level, { level->no_valid_file = TRUE; - Error(ERR_WARN, "unknown level file '%s' -- using empty level", filename); + Error(ERR_WARN, "unknown DC level file '%s' -- using empty level", + filename); return; } - /* advance file stream to first level inside the level package */ - skip_bytes = position_first_level - num_magic_bytes - extra_bytes; + if (strEqualPrefix(magic_bytes, "DC2Win95") || + strEqualPrefix(magic_bytes, "DC2Win98")) + { + int position_first_level = 0x00fa; + int extra_bytes = 4; + int skip_bytes; - /* each block of level data is followed by block of non-level data */ - num_levels_to_skip *= 2; + /* advance file stream to first level inside the level package */ + skip_bytes = position_first_level - num_magic_bytes - extra_bytes; - /* at least skip header bytes, therefore use ">= 0" instead of "> 0" */ - while (num_levels_to_skip >= 0) - { - /* advance file stream to next level inside the level package */ - if (fseek(file, skip_bytes, SEEK_CUR) != 0) + /* each block of level data is followed by block of non-level data */ + num_levels_to_skip *= 2; + + /* at least skip header bytes, therefore use ">= 0" instead of "> 0" */ + while (num_levels_to_skip >= 0) { - level->no_valid_file = TRUE; + /* advance file stream to next level inside the level package */ + if (fseek(file, skip_bytes, SEEK_CUR) != 0) + { + level->no_valid_file = TRUE; - Error(ERR_WARN, "cannot fseek in file '%s' -- using empty level", - filename); + Error(ERR_WARN, "cannot fseek in file '%s' -- using empty level", + filename); - return; - } + return; + } - /* skip apparently unused extra bytes following each level */ - ReadUnusedBytesFromFile(file, extra_bytes); + /* skip apparently unused extra bytes following each level */ + ReadUnusedBytesFromFile(file, extra_bytes); - /* read size of next level in level package */ - skip_bytes = getFile32BitLE(file); + /* read size of next level in level package */ + skip_bytes = getFile32BitLE(file); - num_levels_to_skip--; + num_levels_to_skip--; + } + } + else + { + level->no_valid_file = TRUE; + + Error(ERR_WARN, "unknown DC2 level file '%s' -- using empty level", + filename); + + return; } } @@ -8747,7 +8764,7 @@ static void LoadSpecialMenuDesignSettingsFromFilename(char *filename) } /* special case: initialize with default values that may be overwritten */ - /* (eg, init "menu.draw_xoffset.INFO[MUSIC]" from "menu.draw_xoffset.INFO") */ + /* (eg, init "menu.draw_xoffset.INFO[XXX]" from "menu.draw_xoffset.INFO") */ for (i = 0; i < NUM_SPECIAL_GFX_INFO_ARGS; i++) { char *value_1 = getHashEntry(setup_file_hash, "menu.draw_xoffset.INFO"); @@ -8759,6 +8776,19 @@ static void LoadSpecialMenuDesignSettingsFromFilename(char *filename) menu.draw_yoffset_info[i] = get_integer_from_string(value_2); } + /* special case: initialize with default values that may be overwritten */ + /* (eg, init "menu.draw_xoffset.SETUP[XXX]" from "menu.draw_xoffset.SETUP") */ + for (i = 0; i < NUM_SPECIAL_GFX_SETUP_ARGS; i++) + { + char *value_1 = getHashEntry(setup_file_hash, "menu.draw_xoffset.SETUP"); + char *value_2 = getHashEntry(setup_file_hash, "menu.draw_yoffset.SETUP"); + + if (value_1 != NULL) + menu.draw_xoffset_setup[i] = get_integer_from_string(value_1); + if (value_2 != NULL) + menu.draw_yoffset_setup[i] = get_integer_from_string(value_2); + } + /* special case: initialize with default values that may be overwritten */ /* (eg, init "menu.enter_screen.SCORES.xyz" from "menu.enter_screen.xyz") */ for (i = 0; i < NUM_SPECIAL_GFX_ARGS; i++) @@ -8842,18 +8872,9 @@ static void LoadSpecialMenuDesignSettingsFromFilename(char *filename) freeSetupFileHash(setup_file_hash); } -void LoadSpecialMenuDesignSettings() +static void LoadSpecialMenuDesignSettings_SpecialPreProcessing() { - char *filename_base = UNDEFINED_FILENAME, *filename_local; - int i, j; - - /* always start with reliable default values from static default config */ - for (i = 0; image_config_vars[i].token != NULL; i++) - for (j = 0; image_config[j].token != NULL; j++) - if (strEqual(image_config_vars[i].token, image_config[j].token)) - *image_config_vars[i].value = - get_token_parameter_value(image_config_vars[i].token, - image_config[j].value); + int i; /* the following initializes hierarchical values from static configuration */ @@ -8883,6 +8904,29 @@ void LoadSpecialMenuDesignSettings() menu.enter_screen[i] = menu.enter_screen[GFX_SPECIAL_ARG_DEFAULT]; menu.leave_screen[i] = menu.leave_screen[GFX_SPECIAL_ARG_DEFAULT]; } +} + +static void LoadSpecialMenuDesignSettings_SpecialPostProcessing() +{ + /* special case: initialize later added SETUP list size from LEVELS value */ + if (menu.list_size[GAME_MODE_SETUP] == -1) + menu.list_size[GAME_MODE_SETUP] = menu.list_size[GAME_MODE_LEVELS]; +} + +void LoadSpecialMenuDesignSettings() +{ + char *filename_base = UNDEFINED_FILENAME, *filename_local; + int i, j; + + /* always start with reliable default values from static default config */ + for (i = 0; image_config_vars[i].token != NULL; i++) + for (j = 0; image_config[j].token != NULL; j++) + if (strEqual(image_config_vars[i].token, image_config[j].token)) + *image_config_vars[i].value = + get_token_parameter_value(image_config_vars[i].token, + image_config[j].value); + + LoadSpecialMenuDesignSettings_SpecialPreProcessing(); if (!SETUP_OVERRIDE_ARTWORK(setup, ARTWORK_TYPE_GRAPHICS)) { @@ -8897,6 +8941,8 @@ void LoadSpecialMenuDesignSettings() if (filename_local != NULL && !strEqual(filename_base, filename_local)) LoadSpecialMenuDesignSettingsFromFilename(filename_local); + + LoadSpecialMenuDesignSettings_SpecialPostProcessing(); } void LoadUserDefinedEditorElementList(int **elements, int *num_elements)