X-Git-Url: https://git.artsoft.org/?a=blobdiff_plain;f=src%2Ffiles.c;h=ccea3f949f2f645f55ad17ff4d95bef93bb48982;hb=1442f47fb19411923cba74dd8a7c17fef1fe5e0d;hp=56427a0a75d7c1a04b86eb1d3dd4f915759e2c97;hpb=7344cb1d0c4fb6c05604d93fc7e99bc678c1937e;p=rocksndiamonds.git diff --git a/src/files.c b/src/files.c index 56427a0a..ccea3f94 100644 --- a/src/files.c +++ b/src/files.c @@ -29,7 +29,7 @@ #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 4 /* unused level header bytes */ +#define LEVEL_HEADER_UNUSED 1 /* 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_CHUNK_CNT3_HEADER 16 /* size of level CNT3 header */ @@ -126,6 +126,8 @@ void setElementChangeInfoToDefaults(struct ElementChangeInfo *change) static void setLevelInfoToDefaults(struct LevelInfo *level) { + static boolean clipboard_elements_initialized = FALSE; + int i, j, x, y; level->file_version = FILE_VERSION_ACTUAL; @@ -159,6 +161,9 @@ static void setLevelInfoToDefaults(struct LevelInfo *level) level->em_slippery_gems = FALSE; level->block_last_field = FALSE; level->sp_block_last_field = TRUE; + level->instant_relocation = FALSE; + level->can_pass_to_walkable = FALSE; + level->grow_into_diggable = TRUE; level->can_move_into_acid_bits = ~0; /* everything can move into acid */ level->dont_collide_with_bits = ~0; /* always deadly when colliding */ @@ -200,6 +205,10 @@ static void setLevelInfoToDefaults(struct LevelInfo *level) { int element = i; + /* never initialize clipboard elements after the very first time */ + if (IS_CLIPBOARD_ELEMENT(element) && clipboard_elements_initialized) + continue; + setElementChangePages(&element_info[element], 1); setElementChangeInfoToDefaults(element_info[element].change); @@ -219,6 +228,8 @@ static void setLevelInfoToDefaults(struct LevelInfo *level) element_info[element].use_gfx_element = FALSE; element_info[element].gfx_element = EL_EMPTY_SPACE; + + element_info[element].modified_settings = FALSE; } if (IS_CUSTOM_ELEMENT(element) || @@ -231,18 +242,22 @@ static void setLevelInfoToDefaults(struct LevelInfo *level) element_info[element].push_delay_fixed = -1; /* initialize later */ element_info[element].push_delay_random = -1; /* initialize later */ + element_info[element].drop_delay_fixed = 0; + element_info[element].drop_delay_random = 0; element_info[element].move_delay_fixed = 0; element_info[element].move_delay_random = 0; element_info[element].move_pattern = MV_ALL_DIRECTIONS; element_info[element].move_direction_initial = MV_START_AUTOMATIC; element_info[element].move_stepsize = TILEX / 8; + element_info[element].move_enter_element = EL_EMPTY_SPACE; element_info[element].move_leave_element = EL_EMPTY_SPACE; element_info[element].move_leave_type = LEAVE_TYPE_UNLIMITED; element_info[element].slippery_type = SLIPPERY_ANY_RANDOM; + element_info[element].explosion_type = EXPLODES_3X3; element_info[element].explosion_delay = 16; element_info[element].ignition_delay = 8; @@ -256,7 +271,6 @@ static void setLevelInfoToDefaults(struct LevelInfo *level) element_info[element].walk_to_action = 0; element_info[element].smash_targets = 0; element_info[element].deadliness = 0; - element_info[element].consistency = 0; element_info[element].can_explode_by_fire = FALSE; element_info[element].can_explode_smashed = FALSE; @@ -270,8 +284,6 @@ static void setLevelInfoToDefaults(struct LevelInfo *level) /* now set default properties */ SET_PROPERTY(element, EP_CAN_MOVE_INTO_ACID, TRUE); - - element_info[element].modified_settings = FALSE; } if (IS_GROUP_ELEMENT(element) || @@ -292,6 +304,8 @@ static void setLevelInfoToDefaults(struct LevelInfo *level) } } + clipboard_elements_initialized = TRUE; + BorderElement = EL_STEELWALL; level->no_valid_file = FALSE; @@ -691,6 +705,10 @@ static int LoadLevel_HEAD(FILE *file, int chunk_size, struct LevelInfo *level) level->use_spring_bug = (getFile8Bit(file) == 1 ? TRUE : FALSE); level->use_step_counter = (getFile8Bit(file) == 1 ? TRUE : FALSE); + level->instant_relocation = (getFile8Bit(file) == 1 ? TRUE : FALSE); + level->can_pass_to_walkable = (getFile8Bit(file) == 1 ? TRUE : FALSE); + level->grow_into_diggable = (getFile8Bit(file) == 1 ? TRUE : FALSE); + ReadUnusedBytesFromFile(file, LEVEL_HEADER_UNUSED); return chunk_size; @@ -1040,8 +1058,10 @@ static int LoadLevel_CUS4(FILE *file, int chunk_size, struct LevelInfo *level) ei->collect_score = getFile8Bit(file); ei->collect_count = getFile8Bit(file); - ei->push_delay_fixed = getFile16BitBE(file); - ei->push_delay_random = getFile16BitBE(file); + ei->drop_delay_fixed = getFile8Bit(file); + ei->push_delay_fixed = getFile8Bit(file); + ei->drop_delay_random = getFile8Bit(file); + ei->push_delay_random = getFile8Bit(file); ei->move_delay_fixed = getFile16BitBE(file); ei->move_delay_random = getFile16BitBE(file); @@ -1067,9 +1087,10 @@ static int LoadLevel_CUS4(FILE *file, int chunk_size, struct LevelInfo *level) ei->explosion_delay = getFile8Bit(file); ei->ignition_delay = getFile8Bit(file); + ei->explosion_type = getFile8Bit(file); /* some free bytes for future custom property values and padding */ - ReadUnusedBytesFromFile(file, 2); + ReadUnusedBytesFromFile(file, 1); /* read change property values */ @@ -2076,6 +2097,11 @@ static void LoadLevel_InitVersion(struct LevelInfo *level, char *filename) pre-2.0 levels, where the game version is still taken from the file format version used to store the level -- see above). */ +#if 1 + /* player was faster than enemies in 1.0.0 and before */ + if (level->file_version == FILE_VERSION_1_0) + level->double_speed = TRUE; +#else /* do some special adjustments to support older level versions */ if (level->file_version == FILE_VERSION_1_0) { @@ -2085,8 +2111,9 @@ static void LoadLevel_InitVersion(struct LevelInfo *level, char *filename) /* player was faster than monsters in (pre-)1.0 levels */ level->double_speed = TRUE; } +#endif - /* Default behaviour for EM style gems was "slippery" only in 2.0.1 */ + /* default behaviour for EM style gems was "slippery" only in 2.0.1 */ if (level->game_version == VERSION_IDENT(2,0,1,0)) level->em_slippery_gems = TRUE; @@ -2244,6 +2271,22 @@ static void LoadLevel_InitElements(struct LevelInfo *level, char *filename) } } + /* initialize "can_explode" field for old levels which did not store this */ + if (level->game_version <= VERSION_IDENT(3,1,0,0)) + { + for (i = 0; i < NUM_CUSTOM_ELEMENTS; i++) + { + int element = EL_CUSTOM_START + i; + + if (EXPLODES_1X1_OLD(element)) + element_info[element].explosion_type = EXPLODES_1X1; + + SET_PROPERTY(element, EP_CAN_EXPLODE, (EXPLODES_BY_FIRE(element) || + EXPLODES_SMASHED(element) || + EXPLODES_IMPACT(element))); + } + } + #if 0 /* set default push delay values (corrected since version 3.0.7-1) */ if (level->game_version < VERSION_IDENT(3,0,7,1)) @@ -2425,6 +2468,10 @@ static void SaveLevel_HEAD(FILE *file, struct LevelInfo *level) putFile8Bit(file, (level->use_spring_bug ? 1 : 0)); putFile8Bit(file, (level->use_step_counter ? 1 : 0)); + putFile8Bit(file, (level->instant_relocation ? 1 : 0)); + putFile8Bit(file, (level->can_pass_to_walkable ? 1 : 0)); + putFile8Bit(file, (level->grow_into_diggable ? 1 : 0)); + WriteUnusedBytesToFile(file, LEVEL_HEADER_UNUSED); } @@ -2702,8 +2749,10 @@ static void SaveLevel_CUS4(FILE *file, struct LevelInfo *level, int element) putFile8Bit(file, ei->collect_score); putFile8Bit(file, ei->collect_count); - putFile16BitBE(file, ei->push_delay_fixed); - putFile16BitBE(file, ei->push_delay_random); + putFile8Bit(file, ei->drop_delay_fixed); + putFile8Bit(file, ei->push_delay_fixed); + putFile8Bit(file, ei->drop_delay_random); + putFile8Bit(file, ei->push_delay_random); putFile16BitBE(file, ei->move_delay_fixed); putFile16BitBE(file, ei->move_delay_random); @@ -2729,9 +2778,10 @@ static void SaveLevel_CUS4(FILE *file, struct LevelInfo *level, int element) putFile8Bit(file, ei->explosion_delay); putFile8Bit(file, ei->ignition_delay); + putFile8Bit(file, ei->explosion_type); /* some free bytes for future custom property values and padding */ - WriteUnusedBytesToFile(file, 2); + WriteUnusedBytesToFile(file, 1); /* write change property values */