rnd-20051229-1-src
[rocksndiamonds.git] / src / files.c
index d8695d7a6f64fef32245ed68b24f630430697ad2..743624677e149c4aff94d472caa46c9f76568233 100644 (file)
 #define TAPE_HEADER_SIZE       20      /* size of tape file header   */
 #define TAPE_HEADER_UNUSED     3       /* unused tape header bytes   */
 
-#define LEVEL_CHUNK_CNT3_SIZE(x) (LEVEL_CHUNK_CNT3_HEADER + (x))
-#define LEVEL_CHUNK_CUS3_SIZE(x) (2 + (x) * LEVEL_CPART_CUS3_SIZE)
-#define LEVEL_CHUNK_CUS4_SIZE(x) (96 + (x) * 48)
+#define LEVEL_CHUNK_CNT3_SIZE(x)        (LEVEL_CHUNK_CNT3_HEADER + (x))
+#define LEVEL_CHUNK_CUS3_SIZE(x)        (2 + (x) * LEVEL_CPART_CUS3_SIZE)
+#define LEVEL_CHUNK_CUS4_SIZE(x)        (96 + (x) * 48)
 
 /* file identifier strings */
-#define LEVEL_COOKIE_TMPL      "ROCKSNDIAMONDS_LEVEL_FILE_VERSION_x.x"
-#define TAPE_COOKIE_TMPL       "ROCKSNDIAMONDS_TAPE_FILE_VERSION_x.x"
-#define SCORE_COOKIE           "ROCKSNDIAMONDS_SCORE_FILE_VERSION_1.2"
+#define LEVEL_COOKIE_TMPL              "ROCKSNDIAMONDS_LEVEL_FILE_VERSION_x.x"
+#define TAPE_COOKIE_TMPL               "ROCKSNDIAMONDS_TAPE_FILE_VERSION_x.x"
+#define SCORE_COOKIE                   "ROCKSNDIAMONDS_SCORE_FILE_VERSION_1.2"
 
 /* values for "CONF" chunk */
-#define CONF_MASK_1_BYTE       0x00
-#define CONF_MASK_2_BYTE       0x40
-#define CONF_MASK_4_BYTE       0x80
-#define CONF_MASK_MULTI_BYTES  0xc0
+#define CONF_MASK_1_BYTE               0x00
+#define CONF_MASK_2_BYTE               0x40
+#define CONF_MASK_4_BYTE               0x80
+#define CONF_MASK_MULTI_BYTES          0xc0
 
-#define CONF_MASK_BYTES                0xc0
-#define CONF_MASK_TOKEN                0x3f
+#define CONF_MASK_BYTES                        0xc0
+#define CONF_MASK_TOKEN                        0x3f
 
-#define CONF_LAST_ENTRY                (CONF_MASK_1_BYTE | 0)
+#define CONF_LAST_ENTRY                        (CONF_MASK_1_BYTE | 0)
 
-#define CONF_VALUE_INTEGER_1   (CONF_MASK_1_BYTE | 1)
-#define CONF_VALUE_INTEGER_2   (CONF_MASK_1_BYTE | 2)
-#define CONF_VALUE_INTEGER_3   (CONF_MASK_1_BYTE | 3)
-#define CONF_VALUE_INTEGER_4   (CONF_MASK_1_BYTE | 4)
-#define CONF_VALUE_BOOLEAN_1   (CONF_MASK_1_BYTE | 5)
-#define CONF_VALUE_BOOLEAN_2   (CONF_MASK_1_BYTE | 6)
-#define CONF_VALUE_BOOLEAN_3   (CONF_MASK_1_BYTE | 7)
-#define CONF_VALUE_BOOLEAN_4   (CONF_MASK_1_BYTE | 8)
+#define CONF_VALUE_INTEGER_1           (CONF_MASK_1_BYTE | 1)
+#define CONF_VALUE_INTEGER_2           (CONF_MASK_1_BYTE | 2)
+#define CONF_VALUE_INTEGER_3           (CONF_MASK_1_BYTE | 3)
+#define CONF_VALUE_INTEGER_4           (CONF_MASK_1_BYTE | 4)
+#define CONF_VALUE_BOOLEAN_1           (CONF_MASK_1_BYTE | 5)
+#define CONF_VALUE_BOOLEAN_2           (CONF_MASK_1_BYTE | 6)
+#define CONF_VALUE_BOOLEAN_3           (CONF_MASK_1_BYTE | 7)
+#define CONF_VALUE_BOOLEAN_4           (CONF_MASK_1_BYTE | 8)
 
-#define CONF_VALUE_ELEMENT_1   (CONF_MASK_2_BYTE | 1)
-#define CONF_VALUE_ELEMENT_2   (CONF_MASK_2_BYTE | 2)
-#define CONF_VALUE_ELEMENT_3   (CONF_MASK_2_BYTE | 3)
-#define CONF_VALUE_ELEMENT_4   (CONF_MASK_2_BYTE | 4)
+#define CONF_VALUE_ELEMENT_1           (CONF_MASK_2_BYTE | 1)
+#define CONF_VALUE_ELEMENT_2           (CONF_MASK_2_BYTE | 2)
+#define CONF_VALUE_ELEMENT_3           (CONF_MASK_2_BYTE | 3)
+#define CONF_VALUE_ELEMENT_4           (CONF_MASK_2_BYTE | 4)
 
-#define CONF_VALUE_CONTENT_1   (CONF_MASK_MULTI_BYTES | 1)
-#define CONF_VALUE_CONTENT_8   (CONF_MASK_MULTI_BYTES | 2)
+#define CONF_VALUE_CONTENT_1           (CONF_MASK_MULTI_BYTES | 1)
+#define CONF_VALUE_CONTENT_8           (CONF_MASK_MULTI_BYTES | 2)
 
-#define CONF_VALUE_INTEGER(x)  ((x) >= CONF_VALUE_INTEGER_1 &&         \
-                                (x) <= CONF_VALUE_INTEGER_4)
+#define CONF_VALUE_INTEGER(x)          ((x) >= CONF_VALUE_INTEGER_1 && \
+                                        (x) <= CONF_VALUE_INTEGER_4)
 
-#define CONF_VALUE_BOOLEAN(x)  ((x) >= CONF_VALUE_BOOLEAN_1 &&         \
-                                (x) <= CONF_VALUE_BOOLEAN_4)
+#define CONF_VALUE_BOOLEAN(x)          ((x) >= CONF_VALUE_BOOLEAN_1 && \
+                                        (x) <= CONF_VALUE_BOOLEAN_4)
 
-#define CONF_VALUE_NUM_BYTES(x)        ((x) == CONF_MASK_1_BYTE ? 1 :          \
-                                (x) == CONF_MASK_2_BYTE ? 2 :          \
-                                (x) == CONF_MASK_4_BYTE ? 4 : 0)
+#define CONF_VALUE_NUM_BYTES(x)                ((x) == CONF_MASK_1_BYTE ? 1 :  \
+                                        (x) == CONF_MASK_2_BYTE ? 2 :  \
+                                        (x) == CONF_MASK_4_BYTE ? 4 : 0)
 
 #define CONF_CONTENT_NUM_ELEMENTS      (3 * 3)
 #define CONF_CONTENT_NUM_BYTES         (CONF_CONTENT_NUM_ELEMENTS * 2)
@@ -115,10 +115,6 @@ static struct
     EL_EMC_ANDROID,                    CONF_VALUE_INTEGER_2,
     &li.android_clone_time,            10
   },
-  {
-    EL_EMC_MAGIC_BALL,                 CONF_VALUE_INTEGER_1,
-    &li.ball_time,                     10
-  },
   {
     EL_EMC_LENSES,                     CONF_VALUE_INTEGER_1,
     &li.lenses_score,                  10
@@ -227,6 +223,22 @@ static struct
     EL_PLAYER_4,                       CONF_VALUE_BOOLEAN_2,
     &li.use_start_element[3],          FALSE
   },
+  {
+    EL_EMC_MAGIC_BALL,                 CONF_VALUE_INTEGER_1,
+    &li.ball_time,                     10
+  },
+  {
+    EL_EMC_MAGIC_BALL,                 CONF_VALUE_INTEGER_2,
+    &li.num_ball_contents,             8
+  },
+  {
+    EL_EMC_MAGIC_BALL,                 CONF_VALUE_BOOLEAN_1,
+    &li.ball_random,                   FALSE
+  },
+  {
+    EL_EMC_MAGIC_BALL,                 CONF_VALUE_BOOLEAN_2,
+    &li.ball_state_initial,            FALSE
+  },
 
   /* ---------- 2-byte values ---------------------------------------------- */
   {
@@ -455,10 +467,8 @@ static void setLevelInfoToDefaults(struct LevelInfo *level)
   level->magnify_time = 10;
   level->slurp_score = 10;
   level->wind_direction_initial = MV_NONE;
-#endif
   level->ball_random = FALSE;
   level->ball_state_initial = FALSE;
-#if 0
   for (i = 0; i < MAX_ELEMENT_CONTENTS; i++)
     for (x = 0; x < 3; x++)
       for (y = 0; y < 3; y++)
@@ -2259,6 +2269,7 @@ void CopyNativeLevel_RND_to_EM(struct LevelInfo *level)
   lev->ball_random             = level->ball_random;
   lev->ball_state_initial      = level->ball_state_initial;
   lev->ball_time               = level->ball_time;
+  lev->num_ball_arrays         = level->num_ball_contents;
 
   lev->lenses_score            = level->lenses_score;
   lev->magnify_score           = level->magnify_score;
@@ -2266,7 +2277,11 @@ void CopyNativeLevel_RND_to_EM(struct LevelInfo *level)
 
   lev->lenses_time             = level->lenses_time;
   lev->magnify_time            = level->magnify_time;
-  lev->wind_direction_initial  = level->wind_direction_initial;
+
+  lev->wind_direction_initial =
+    map_direction_RND_to_EM(level->wind_direction_initial);
+  lev->wind_cnt_initial = (level->wind_direction_initial != MV_NONE ?
+                          lev->wind_time : 0);
 
   for (i = 0; i < MAX_ELEMENT_CONTENTS; i++)
     for (j = 0; j < 8; j++)
@@ -2372,6 +2387,7 @@ void CopyNativeLevel_EM_to_RND(struct LevelInfo *level)
   level->ball_random           = lev->ball_random;
   level->ball_state_initial    = lev->ball_state_initial;
   level->ball_time             = lev->ball_time;
+  level->num_ball_contents     = lev->num_ball_arrays;
 
   level->lenses_score          = lev->lenses_score;
   level->magnify_score         = lev->magnify_score;
@@ -2379,7 +2395,9 @@ void CopyNativeLevel_EM_to_RND(struct LevelInfo *level)
 
   level->lenses_time           = lev->lenses_time;
   level->magnify_time          = lev->magnify_time;
-  level->wind_direction_initial        = lev->wind_direction_initial;
+
+  level->wind_direction_initial =
+    map_direction_EM_to_RND(lev->wind_direction_initial);
 
   for (i = 0; i < MAX_ELEMENT_CONTENTS; i++)
     for (j = 0; j < 8; j++)