X-Git-Url: https://git.artsoft.org/?a=blobdiff_plain;f=src%2Ffiles.c;h=4dac3c11d1c94aea0d67c9a1f63d284e85629607;hb=f4afcfc617fe36ce18d3509ef20d90b0db271bea;hp=64c1c632c95181be0514c5d5db37e07201ac634a;hpb=d8f48d3767794442340cb624ec866098766d4d92;p=rocksndiamonds.git diff --git a/src/files.c b/src/files.c index 64c1c632..4dac3c11 100644 --- a/src/files.c +++ b/src/files.c @@ -34,8 +34,6 @@ #define LEVEL_CHUNK_CNT3_UNUSED 10 /* unused CNT3 chunk bytes */ #define LEVEL_CPART_CUS3_SIZE 134 /* size of CUS3 chunk part */ #define LEVEL_CPART_CUS3_UNUSED 15 /* unused CUS3 bytes / part */ -#define LEVEL_CPART_CUS4_SIZE ??? /* size of CUS4 chunk part */ -#define LEVEL_CPART_CUS4_UNUSED ??? /* unused CUS4 bytes / part */ #define TAPE_HEADER_SIZE 20 /* size of tape file header */ #define TAPE_HEADER_UNUSED 3 /* unused tape header bytes */ @@ -80,7 +78,7 @@ void setElementChangeInfoToDefaults(struct ElementChangeInfo *change) change->delay_fixed = 0; change->delay_random = 0; - change->delay_frames = -1; /* later set to reliable default value */ + change->delay_frames = 1; change->trigger_element = EL_EMPTY_SPACE; @@ -88,7 +86,7 @@ void setElementChangeInfoToDefaults(struct ElementChangeInfo *change) change->use_content = FALSE; change->only_complete = FALSE; change->use_random_change = FALSE; - change->random = 0; + change->random = 100; change->power = CP_NON_DESTRUCTIVE; for(x=0; x<3; x++) @@ -143,9 +141,12 @@ static void setLevelInfoToDefaults(struct LevelInfo *level) strcpy(level->name, NAMELESS_LEVEL_NAME); strcpy(level->author, ANONYMOUS_NAME); - level->envelope[0] = '\0'; - level->envelope_xsize = MAX_ENVELOPE_XSIZE; - level->envelope_ysize = MAX_ENVELOPE_YSIZE; + for (i=0; i<4; i++) + { + level->envelope_text[i][0] = '\0'; + level->envelope_xsize[i] = MAX_ENVELOPE_XSIZE; + level->envelope_ysize[i] = MAX_ENVELOPE_YSIZE; + } for(i=0; iscore[i] = 10; @@ -274,15 +275,63 @@ boolean LevelFileExists(int level_nr) static int checkLevelElement(int element) { + /* map some (historic, now obsolete) elements */ + +#if 1 + switch (element) + { + case EL_PLAYER_OBSOLETE: + element = EL_PLAYER_1; + break; + + case EL_KEY_OBSOLETE: + element = EL_KEY_1; + + case EL_EM_KEY_1_FILE_OBSOLETE: + element = EL_EM_KEY_1; + break; + + case EL_EM_KEY_2_FILE_OBSOLETE: + element = EL_EM_KEY_2; + break; + + case EL_EM_KEY_3_FILE_OBSOLETE: + element = EL_EM_KEY_3; + break; + + case EL_EM_KEY_4_FILE_OBSOLETE: + element = EL_EM_KEY_4; + break; + + case EL_ENVELOPE_OBSOLETE: + element = EL_ENVELOPE_1; + break; + + case EL_SP_EMPTY: + element = EL_EMPTY; + break; + + default: + if (element >= NUM_FILE_ELEMENTS) + { + Error(ERR_WARN, "invalid level element %d", element); + + element = EL_CHAR_QUESTION; + } + break; + } +#else if (element >= NUM_FILE_ELEMENTS) { Error(ERR_WARN, "invalid level element %d", element); + element = EL_CHAR_QUESTION; } else if (element == EL_PLAYER_OBSOLETE) element = EL_PLAYER_1; else if (element == EL_KEY_OBSOLETE) element = EL_KEY_1; +#endif return element; } @@ -460,13 +509,20 @@ static int LoadLevel_CNT3(FILE *file, int chunk_size, struct LevelInfo *level) { int i; int element; + int envelope_nr; int envelope_len; int chunk_size_expected; element = checkLevelElement(getFile16BitBE(file)); + if (!IS_ENVELOPE(element)) + element = EL_ENVELOPE_1; + + envelope_nr = element - EL_ENVELOPE_1; + envelope_len = getFile16BitBE(file); - level->envelope_xsize = getFile8Bit(file); - level->envelope_ysize = getFile8Bit(file); + + level->envelope_xsize[envelope_nr] = getFile8Bit(file); + level->envelope_ysize[envelope_nr] = getFile8Bit(file); ReadUnusedBytesFromFile(file, LEVEL_CHUNK_CNT3_UNUSED); @@ -479,7 +535,7 @@ static int LoadLevel_CNT3(FILE *file, int chunk_size, struct LevelInfo *level) } for(i=0; i < envelope_len; i++) - level->envelope[i] = getFile8Bit(file); + level->envelope_text[envelope_nr][i] = getFile8Bit(file); return chunk_size; } @@ -724,8 +780,13 @@ static int LoadLevel_CUS4(FILE *file, int chunk_size, struct LevelInfo *level) change->can_change = getFile8Bit(file); + change->sides = getFile8Bit(file); + + if (change->sides == CH_SIDE_NONE) /* correct empty sides field */ + change->sides = CH_SIDE_ANY; + /* some free bytes for future change property values and padding */ - ReadUnusedBytesFromFile(file, 9); + ReadUnusedBytesFromFile(file, 8); } /* mark this custom element as modified */ @@ -1363,17 +1424,18 @@ static void SaveLevel_CNT2(FILE *file, struct LevelInfo *level, int element) static void SaveLevel_CNT3(FILE *file, struct LevelInfo *level, int element) { int i; - int envelope_len = strlen(level->envelope) + 1; + int envelope_nr = element - EL_ENVELOPE_1; + int envelope_len = strlen(level->envelope_text[envelope_nr]) + 1; putFile16BitBE(file, element); putFile16BitBE(file, envelope_len); - putFile8Bit(file, level->envelope_xsize); - putFile8Bit(file, level->envelope_ysize); + putFile8Bit(file, level->envelope_xsize[envelope_nr]); + putFile8Bit(file, level->envelope_ysize[envelope_nr]); WriteUnusedBytesToFile(file, LEVEL_CHUNK_CNT3_UNUSED); for(i=0; i < envelope_len; i++) - putFile8Bit(file, level->envelope[i]); + putFile8Bit(file, level->envelope_text[envelope_nr][i]); } #if 0 @@ -1590,8 +1652,10 @@ static void SaveLevel_CUS4(FILE *file, struct LevelInfo *level, int element) putFile8Bit(file, change->can_change); + putFile8Bit(file, change->sides); + /* some free bytes for future change property values and padding */ - WriteUnusedBytesToFile(file, 9); + WriteUnusedBytesToFile(file, 8); } } @@ -1663,12 +1727,15 @@ static void SaveLevelFromFilename(struct LevelInfo *level, char *filename) } /* check for envelope content */ - if (strlen(level->envelope) > 0) + for (i=0; i<4; i++) { - int envelope_len = strlen(level->envelope) + 1; + if (strlen(level->envelope_text[i]) > 0) + { + int envelope_len = strlen(level->envelope_text[i]) + 1; - putFileChunkBE(file, "CNT3", LEVEL_CHUNK_CNT3_HEADER + envelope_len); - SaveLevel_CNT3(file, level, EL_ENVELOPE); + putFileChunkBE(file, "CNT3", LEVEL_CHUNK_CNT3_HEADER + envelope_len); + SaveLevel_CNT3(file, level, EL_ENVELOPE_1 + i); + } } /* check for non-default custom elements (unless using template level) */ @@ -2760,7 +2827,8 @@ void LoadSpecialMenuDesignSettings() 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); + get_auto_parameter_value(image_config_vars[i].token, + image_config[j].value); if ((setup_file_hash = loadSetupFileHash(filename)) == NULL) return; @@ -2786,7 +2854,8 @@ void LoadSpecialMenuDesignSettings() char *value = getHashEntry(setup_file_hash, image_config_vars[i].token); if (value != NULL) - *image_config_vars[i].value = get_integer_from_string(value); + *image_config_vars[i].value = + get_auto_parameter_value(image_config_vars[i].token, value); } freeSetupFileHash(setup_file_hash);