X-Git-Url: https://git.artsoft.org/?a=blobdiff_plain;f=src%2Ffiles.c;h=83e7b0bbc5e561e50ee0a1b2f89c8f2f5bf3967b;hb=c145af8280c5ad22978e42621bbe5c0f3a8ada3c;hp=87c4204f67cf7d573db4ebfb726e1338dc1f5a83;hpb=6945f3749927053ee70b47133b2998557a452f75;p=rocksndiamonds.git diff --git a/src/files.c b/src/files.c index 87c4204f..83e7b0bb 100644 --- a/src/files.c +++ b/src/files.c @@ -45,7 +45,7 @@ static void setLevelInfoToDefaults() { - int i, x, y; + int i, j, x, y; level.file_version = FILE_VERSION_ACTUAL; level.game_version = GAME_VERSION_ACTUAL; @@ -84,11 +84,11 @@ static void setLevelInfoToDefaults() for(i=0; iscore[i] = fgetc(file); - level->num_yam_contents = STD_ELEMENT_CONTENTS; + level->num_yamyam_contents = STD_ELEMENT_CONTENTS; for(i=0; iyam_content[i][x][y] = checkLevelElement(fgetc(file)); + level->yamyam_content[i][x][y] = checkLevelElement(fgetc(file)); level->amoeba_speed = fgetc(file); level->time_magic_wall = fgetc(file); @@ -259,19 +277,19 @@ static int LoadLevel_CONT(FILE *file, int chunk_size, struct LevelInfo *level) } fgetc(file); - level->num_yam_contents = fgetc(file); + level->num_yamyam_contents = fgetc(file); fgetc(file); fgetc(file); /* correct invalid number of content fields -- should never happen */ - if (level->num_yam_contents < 1 || - level->num_yam_contents > MAX_ELEMENT_CONTENTS) - level->num_yam_contents = STD_ELEMENT_CONTENTS; + if (level->num_yamyam_contents < 1 || + level->num_yamyam_contents > MAX_ELEMENT_CONTENTS) + level->num_yamyam_contents = STD_ELEMENT_CONTENTS; for(i=0; iyam_content[i][x][y] = + level->yamyam_content[i][x][y] = checkLevelElement(level->encoding_16bit_field ? getFile16BitBE(file) : fgetc(file)); return chunk_size; @@ -301,12 +319,12 @@ static int LoadLevel_CNT2(FILE *file, int chunk_size, struct LevelInfo *level) if (element == EL_YAMYAM) { - level->num_yam_contents = num_contents; + level->num_yamyam_contents = num_contents; for(i=0; iyam_content[i][x][y] = content_array[i][x][y]; + level->yamyam_content[i][x][y] = content_array[i][x][y]; } else if (element == EL_BD_AMOEBA) { @@ -362,10 +380,9 @@ static int LoadLevel_CUS2(FILE *file, int chunk_size, struct LevelInfo *level) { int element = getFile16BitBE(file); int custom_element_successor = getFile16BitBE(file); - int i = element - EL_CUSTOM_START; if (IS_CUSTOM_ELEMENT(element)) - level->custom_element_successor[i] = custom_element_successor; + element_info[element].change.successor = custom_element_successor; else Error(ERR_WARN, "invalid custom element number %d", element); } @@ -611,7 +628,7 @@ static void SaveLevel_HEAD(FILE *file, struct LevelInfo *level) for(y=0; y<3; y++) for(x=0; x<3; x++) fputc((level->encoding_16bit_yamyam ? EL_EMPTY : - level->yam_content[i][x][y]), + level->yamyam_content[i][x][y]), file); fputc(level->amoeba_speed, file); fputc(level->time_magic_wall, file); @@ -652,7 +669,7 @@ static void SaveLevel_CONT(FILE *file, struct LevelInfo *level) int i, x, y; fputc(EL_YAMYAM, file); - fputc(level->num_yam_contents, file); + fputc(level->num_yamyam_contents, file); fputc(0, file); fputc(0, file); @@ -660,9 +677,9 @@ static void SaveLevel_CONT(FILE *file, struct LevelInfo *level) for(y=0; y<3; y++) for(x=0; x<3; x++) if (level->encoding_16bit_field) - putFile16BitBE(file, level->yam_content[i][x][y]); + putFile16BitBE(file, level->yamyam_content[i][x][y]); else - fputc(level->yam_content[i][x][y], file); + fputc(level->yamyam_content[i][x][y], file); } #endif @@ -674,14 +691,14 @@ static void SaveLevel_CNT2(FILE *file, struct LevelInfo *level, int element) if (element == EL_YAMYAM) { - num_contents = level->num_yam_contents; + num_contents = level->num_yamyam_contents; content_xsize = 3; content_ysize = 3; for(i=0; iyam_content[i][x][y]; + content_array[i][x][y] = level->yamyam_content[i][x][y]; } else if (element == EL_BD_AMOEBA) { @@ -755,12 +772,12 @@ static void SaveLevel_CUS2(FILE *file, struct LevelInfo *level, { int element = EL_CUSTOM_START + i; - if (level->custom_element_successor[i] != EL_EMPTY_SPACE) + if (element_info[element].change.successor != EL_EMPTY_SPACE) { if (check < num_changed_custom_elements) { putFile16BitBE(file, element); - putFile16BitBE(file, level->custom_element_successor[i]); + putFile16BitBE(file, element_info[element].change.successor); } check++; @@ -798,10 +815,10 @@ void SaveLevel(int level_nr) /* check yamyam content for 16-bit elements */ level.encoding_16bit_yamyam = FALSE; - for(i=0; i 255) + if (level.yamyam_content[i][x][y] > 255) level.encoding_16bit_yamyam = TRUE; /* check amoeba content for 16-bit elements */ @@ -820,7 +837,7 @@ void SaveLevel(int level_nr) /* check for non-standard custom elements and calculate "CUS2" chunk size */ for (i=0; i < NUM_CUSTOM_ELEMENTS; i++) - if (level.custom_element_successor[i] != EL_EMPTY_SPACE) + if (element_info[EL_CUSTOM_START + i].change.successor != EL_EMPTY_SPACE) num_changed_custom_elements2++; putFileChunkBE(file, "RND1", CHUNK_SIZE_UNDEFINED); @@ -839,7 +856,7 @@ void SaveLevel(int level_nr) SaveLevel_BODY(file, &level); if (level.encoding_16bit_yamyam || - level.num_yam_contents != STD_ELEMENT_CONTENTS) + level.num_yamyam_contents != STD_ELEMENT_CONTENTS) { putFileChunkBE(file, "CNT2", LEVEL_CHUNK_CNT2_SIZE); SaveLevel_CNT2(file, &level, EL_YAMYAM); @@ -871,7 +888,7 @@ void SaveLevel(int level_nr) void DumpLevel(struct LevelInfo *level) { printf_line("-", 79); - printf("Level xxx (file version %06d, game version %06d)\n", + printf("Level xxx (file version %08d, game version %08d)\n", level->file_version, level->game_version); printf_line("-", 79); @@ -1328,7 +1345,7 @@ void DumpTape(struct TapeInfo *tape) } printf_line("-", 79); - printf("Tape of Level %03d (file version %06d, game version %06d)\n", + printf("Tape of Level %03d (file version %08d, game version %08d)\n", tape->level_nr, tape->file_version, tape->game_version); printf("Level series identifier: '%s'\n", tape->level_identifier); printf_line("-", 79); @@ -1900,47 +1917,41 @@ void LoadSpecialMenuDesignSettings() { char *filename = getCustomArtworkConfigFilename(ARTWORK_TYPE_GRAPHICS); SetupFileHash *setup_file_hash; - char *value; + int i, j; - /* !!! CHANGE THIS !!! (redundant initialization) !!! */ - global.num_toons = 20; - global.menu_draw_xoffset = 0; - global.menu_draw_yoffset = 0; - global.menu_draw_xoffset_MAIN = 0; - global.menu_draw_yoffset_MAIN = 0; - global.door_step_offset = 2; - global.door_step_delay = 10; + /* always start with reliable default values from default config */ + for (i=0; image_config_vars[i].token != NULL; i++) + for (j=0; image_config[j].token != NULL; j++) + if (strcmp(image_config_vars[i].token, image_config[j].token) == 0) + *image_config_vars[i].value = + get_integer_from_string(image_config[j].value); if ((setup_file_hash = loadSetupFileHash(filename)) == NULL) return; - value = getHashEntry(setup_file_hash, "global.num_toons"); - if (value != NULL) - global.num_toons = get_integer_from_string(value); - - value = getHashEntry(setup_file_hash, "menu.draw_xoffset"); - if (value != NULL) - global.menu_draw_xoffset = get_integer_from_string(value); - - value = getHashEntry(setup_file_hash, "menu.draw_yoffset"); - if (value != NULL) - global.menu_draw_yoffset = get_integer_from_string(value); - - value = getHashEntry(setup_file_hash, "menu.draw_xoffset.MAIN"); - if (value != NULL) - global.menu_draw_xoffset_MAIN = get_integer_from_string(value); - - value = getHashEntry(setup_file_hash, "menu.draw_yoffset.MAIN"); - if (value != NULL) - global.menu_draw_yoffset_MAIN = get_integer_from_string(value); + /* special case: initialize with default values that may be overwritten */ + for (i=0; i < NUM_SPECIAL_GFX_ARGS; i++) + { + char *value_x = getHashEntry(setup_file_hash, "menu.draw_xoffset"); + char *value_y = getHashEntry(setup_file_hash, "menu.draw_yoffset"); + char *list_size = getHashEntry(setup_file_hash, "menu.list_size"); + + if (value_x != NULL) + menu.draw_xoffset[i] = get_integer_from_string(value_x); + if (value_y != NULL) + menu.draw_yoffset[i] = get_integer_from_string(value_y); + if (list_size != NULL) + menu.list_size[i] = get_integer_from_string(list_size); + } - value = getHashEntry(setup_file_hash, "door.step_offset"); - if (value != NULL) - global.door_step_offset = get_integer_from_string(value); + /* read (and overwrite with) values that may be specified in config file */ + for (i=0; image_config_vars[i].token != NULL; i++) + { + char *value = getHashEntry(setup_file_hash, image_config_vars[i].token); - value = getHashEntry(setup_file_hash, "door.step_delay"); - if (value != NULL) - global.door_step_delay = get_integer_from_string(value); + if (value != NULL) + *image_config_vars[i].value = get_integer_from_string(value); + } freeSetupFileHash(setup_file_hash); }