rnd-20040512-1-src
[rocksndiamonds.git] / src / files.c
index f44c2ca39afcff12d64029235bc0f65cfabff2d5..ccea3f949f2f645f55ad17ff4d95bef93bb48982 100644 (file)
@@ -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    2       /* 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  */
@@ -163,6 +163,7 @@ static void setLevelInfoToDefaults(struct LevelInfo *level)
   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  */
@@ -227,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) ||
@@ -247,12 +250,14 @@ static void setLevelInfoToDefaults(struct LevelInfo *level)
       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;
 
@@ -266,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;
@@ -280,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) ||
@@ -705,6 +707,7 @@ static int LoadLevel_HEAD(FILE *file, int chunk_size, struct LevelInfo *level)
 
   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);
 
@@ -1084,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 */
 
@@ -2093,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)
     {
@@ -2102,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;
 
@@ -2261,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))
@@ -2444,6 +2470,7 @@ static void SaveLevel_HEAD(FILE *file, struct LevelInfo *level)
 
   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);
 }
@@ -2751,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 */