X-Git-Url: https://git.artsoft.org/?a=blobdiff_plain;f=src%2Ffiles.c;h=135920b8ecbcb6c729eeb9fb51bd317e71d960a4;hb=7892cce9f39489a779f8fad4a3e756b0bb8dbee5;hp=d718224291c97d83ac523f4eec376f276e46ea21;hpb=ce64737e3650f38dc6c05fbd315308244297cc45;p=rocksndiamonds.git diff --git a/src/files.c b/src/files.c index d7182242..135920b8 100644 --- a/src/files.c +++ b/src/files.c @@ -41,6 +41,7 @@ #define LEVEL_CHUNK_CUS3_SIZE(x) (2 + (x) * LEVEL_CPART_CUS3_SIZE) #define LEVEL_CHUNK_CUS4_SIZE(x) (48 + 48 + (x) * 48) +#define LEVEL_CHUNK_GRP1_SIZE(x) (2 + 8 + (x) * 2) /* file identifier strings */ #define LEVEL_COOKIE_TMPL "ROCKSNDIAMONDS_LEVEL_FILE_VERSION_x.x" @@ -234,6 +235,20 @@ static void setLevelInfoToDefaults(struct LevelInfo *level) element_info[element].modified_settings = FALSE; } + for (i = 0; i < NUM_GROUP_ELEMENTS; i++) + { + int element = EL_GROUP_START + i; + + if (element_info[element].group == NULL) + element_info[element].group = + checked_malloc(sizeof(struct ElementGroupInfo)); + + for (j = 0; j < MAX_ELEMENTS_IN_GROUP; j++) + element_info[element].group->element[j] = EL_EMPTY_SPACE; + + element_info[element].group->num_elements = 1; + } + BorderElement = EL_STEELWALL; level->no_level_file = FALSE; @@ -904,6 +919,46 @@ static int LoadLevel_CUS4(FILE *file, int chunk_size, struct LevelInfo *level) return chunk_size; } +static int LoadLevel_GRP1(FILE *file, int chunk_size, struct LevelInfo *level) +{ + struct ElementGroupInfo *group; + int chunk_size_expected; + int element; + int i; + + element = getFile16BitBE(file); + + if (!IS_GROUP_ELEMENT(element)) + { + Error(ERR_WARN, "invalid group element number %d", element); + + ReadUnusedBytesFromFile(file, chunk_size - 2); + return chunk_size; + } + + group = element_info[element].group; + + group->num_elements = getFile8Bit(file); + + /* some free bytes for future values and padding */ + ReadUnusedBytesFromFile(file, 7); + + chunk_size_expected = LEVEL_CHUNK_GRP1_SIZE(group->num_elements); + if (chunk_size_expected != chunk_size) + { + ReadUnusedBytesFromFile(file, chunk_size - 10); + return chunk_size_expected; + } + + for (i = 0; i < group->num_elements; i++) + group->element[i] = checkLevelElement(getFile16BitBE(file)); + + /* mark this group element as modified */ + element_info[element].modified_settings = TRUE; + + return chunk_size; +} + static void LoadLevelFromFileInfo_RND(struct LevelInfo *level, struct LevelFileInfo *level_file_info) { @@ -991,6 +1046,7 @@ static void LoadLevelFromFileInfo_RND(struct LevelInfo *level, { "CUS2", -1, LoadLevel_CUS2 }, { "CUS3", -1, LoadLevel_CUS3 }, { "CUS4", -1, LoadLevel_CUS4 }, + { "GRP1", -1, LoadLevel_GRP1 }, { NULL, 0, NULL } }; @@ -2012,6 +2068,22 @@ static void SaveLevel_CUS4(FILE *file, struct LevelInfo *level, int element) } } +static void SaveLevel_GRP1(FILE *file, struct LevelInfo *level, int element) +{ + struct ElementGroupInfo *group = element_info[element].group; + int i; + + putFile16BitBE(file, element); + + putFile8Bit(file, group->num_elements); + + /* some free bytes for future values and padding */ + WriteUnusedBytesToFile(file, 7); + + for (i = 0; i < group->num_elements; i++) + putFile16BitBE(file, group->element[i]); +} + static void SaveLevelFromFilename(struct LevelInfo *level, char *filename) { int body_chunk_size; @@ -2108,6 +2180,23 @@ static void SaveLevelFromFilename(struct LevelInfo *level, char *filename) } } + /* check for non-default group elements (unless using template level) */ + if (!level->use_custom_template) + { + for (i = 0; i < NUM_GROUP_ELEMENTS; i++) + { + int element = EL_GROUP_START + i; + + if (element_info[element].modified_settings) + { + int num_elements = element_info[element].group->num_elements; + + putFileChunkBE(file, "GRP1", LEVEL_CHUNK_GRP1_SIZE(num_elements)); + SaveLevel_GRP1(file, level, element); + } + } + } + fclose(file); SetFilePermissions(filename, PERMS_PRIVATE);