X-Git-Url: https://git.artsoft.org/?a=blobdiff_plain;f=src%2Ffiles.c;h=8fe110f24254cece6bd2d43f606229d665c35da3;hb=4096fcbae692bfbf2f6506786659872a60b31693;hp=6a9cb746b8b30e05de07b06957190e84f65f1b5a;hpb=5f9fbeb32ecd4c70ed6d6df8809719af619b40c0;p=rocksndiamonds.git diff --git a/src/files.c b/src/files.c index 6a9cb746..8fe110f2 100644 --- a/src/files.c +++ b/src/files.c @@ -27,12 +27,16 @@ #define CHUNK_SIZE_NONE -1 /* do not write chunk size */ #define FILE_VERS_CHUNK_SIZE 8 /* size of file version chunk */ #define LEVEL_HEADER_SIZE 80 /* size of level file header */ -#define LEVEL_HEADER_UNUSED 14 /* unused level header bytes */ +#define LEVEL_HEADER_UNUSED 13 /* unused level header bytes */ #define LEVEL_CHUNK_CNT2_SIZE 160 /* size of level CNT2 chunk */ #define LEVEL_CHUNK_CNT2_UNUSED 11 /* unused CNT2 chunk bytes */ +#define LEVEL_CPART_CUS3_SIZE 134 /* size of CUS3 chunk part */ +#define LEVEL_CPART_CUS3_UNUSED 15 /* unused CUS3 bytes / part */ #define TAPE_HEADER_SIZE 20 /* size of tape file header */ #define TAPE_HEADER_UNUSED 3 /* unused tape header bytes */ +#define LEVEL_CHUNK_CUS3_SIZE(x) (2 + x * LEVEL_CPART_CUS3_SIZE) + /* file identifier strings */ #define LEVEL_COOKIE_TMPL "ROCKSNDIAMONDS_LEVEL_FILE_VERSION_x.x" #define TAPE_COOKIE_TMPL "ROCKSNDIAMONDS_TAPE_FILE_VERSION_x.x" @@ -73,6 +77,8 @@ static void setLevelInfoToDefaults() level.gravity = FALSE; level.em_slippery_gems = FALSE; + level.use_custom_template = FALSE; + for(i=0; iencoding_16bit_field = (fgetc(file) == 1 ? TRUE : FALSE); level->em_slippery_gems = (fgetc(file) == 1 ? TRUE : FALSE); + level->use_custom_template = (fgetc(file) == 1 ? TRUE : FALSE); + ReadUnusedBytesFromFile(file, LEVEL_HEADER_UNUSED); return chunk_size; @@ -377,11 +436,10 @@ static int LoadLevel_CUS2(FILE *file, int chunk_size, struct LevelInfo *level) for (i=0; i < num_changed_custom_elements; i++) { int element = getFile16BitBE(file); - int custom_element_successor = getFile16BitBE(file); - int i = element - EL_CUSTOM_START; + int custom_target_element = getFile16BitBE(file); if (IS_CUSTOM_ELEMENT(element)) - level->custom_element[i].change.successor = custom_element_successor; + element_info[element].change.target_element = custom_target_element; else Error(ERR_WARN, "invalid custom element number %d", element); } @@ -389,6 +447,93 @@ static int LoadLevel_CUS2(FILE *file, int chunk_size, struct LevelInfo *level) return chunk_size; } +static int LoadLevel_CUS3(FILE *file, int chunk_size, struct LevelInfo *level) +{ + int num_changed_custom_elements = getFile16BitBE(file); + int chunk_size_expected = LEVEL_CHUNK_CUS3_SIZE(num_changed_custom_elements); + int i, j, x, y; + + if (chunk_size_expected != chunk_size) + { + ReadUnusedBytesFromFile(file, chunk_size - 2); + return chunk_size_expected; + } + + for (i=0; i < num_changed_custom_elements; i++) + { + int element = getFile16BitBE(file); + + if (!IS_CUSTOM_ELEMENT(element)) + { + Error(ERR_WARN, "invalid custom element number %d", element); + + element = EL_DEFAULT; /* dummy element used for artwork config */ + } + + for(j=0; jencoding_16bit_field ? 1 : 0), file); fputc((level->em_slippery_gems ? 1 : 0), file); + fputc((level->use_custom_template ? 1 : 0), file); + WriteUnusedBytesToFile(file, LEVEL_HEADER_UNUSED); } @@ -733,6 +881,7 @@ static void SaveLevel_CNT2(FILE *file, struct LevelInfo *level, int element) putFile16BitBE(file, content_array[i][x][y]); } +#if 0 static void SaveLevel_CUS1(FILE *file, struct LevelInfo *level, int num_changed_custom_elements) { @@ -759,7 +908,9 @@ static void SaveLevel_CUS1(FILE *file, struct LevelInfo *level, if (check != num_changed_custom_elements) /* should not happen */ Error(ERR_WARN, "inconsistent number of custom element properties"); } +#endif +#if 0 static void SaveLevel_CUS2(FILE *file, struct LevelInfo *level, int num_changed_custom_elements) { @@ -771,12 +922,12 @@ static void SaveLevel_CUS2(FILE *file, struct LevelInfo *level, { int element = EL_CUSTOM_START + i; - if (level->custom_element[i].change.successor != EL_EMPTY_SPACE) + if (element_info[element].change.target_element != EL_EMPTY_SPACE) { if (check < num_changed_custom_elements) { putFile16BitBE(file, element); - putFile16BitBE(file, level->custom_element[i].change.successor); + putFile16BitBE(file, element_info[element].change.target_element); } check++; @@ -784,15 +935,96 @@ static void SaveLevel_CUS2(FILE *file, struct LevelInfo *level, } if (check != num_changed_custom_elements) /* should not happen */ - Error(ERR_WARN, "inconsistent number of custom element successors"); + Error(ERR_WARN, "inconsistent number of custom target elements"); +} +#endif + +static void SaveLevel_CUS3(FILE *file, struct LevelInfo *level, + int num_changed_custom_elements) +{ + int i, j, x, y, check = 0; + + putFile16BitBE(file, num_changed_custom_elements); + + for (i=0; i < NUM_CUSTOM_ELEMENTS; i++) + { + int element = EL_CUSTOM_START + i; + + if (Properties[element][EP_BITFIELD_BASE] != EP_BITMASK_DEFAULT) + { + if (check < num_changed_custom_elements) + { + putFile16BitBE(file, element); + + for(j=0; j 0) - { - putFileChunkBE(file, "CUS1", 2 + num_changed_custom_elements1 * 6); - SaveLevel_CUS1(file, &level, num_changed_custom_elements1); - } - - if (num_changed_custom_elements2 > 0) + if (num_changed_custom_elements > 0) { - putFileChunkBE(file, "CUS2", 2 + num_changed_custom_elements2 * 4); - SaveLevel_CUS2(file, &level, num_changed_custom_elements2); + putFileChunkBE(file, "CUS3", level_chunk_CUS3_size); + SaveLevel_CUS3(file, &level, num_changed_custom_elements); } fclose(file); @@ -887,7 +1109,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); @@ -1207,6 +1429,10 @@ void LoadTapeFromFilename(char *filename) fclose(file); tape.length_seconds = GetTapeLength(); + +#if 0 + printf("tape version: %d\n", tape.game_version); +#endif } void LoadTape(int level_nr) @@ -1344,7 +1570,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); @@ -1928,16 +2154,19 @@ void LoadSpecialMenuDesignSettings() if ((setup_file_hash = loadSetupFileHash(filename)) == NULL) return; - /* special case: initialize with default values that may be overwrittem */ + /* 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); } /* read (and overwrite with) values that may be specified in config file */