changed order of cave parameter initializations in EM engine
[rocksndiamonds.git] / src / game_em / reademc.c
index 3bb920ab2286dec72514f3f0356ad88d1fa2a1b3..bad2bfbb1b4d00acb5f599c78f0683eba48fd616 100644 (file)
@@ -40,6 +40,9 @@
  * behaviour.
  */
 
+#define GET_BE16(x)            ((&x)[0] << 8 | (&x)[1])
+#define PUT_BE16(x, y)         {(&x)[0] = (y) >> 8; (&x)[1] = (y) & 0xff;}
+
 static const short map_emc[256] =
 {
   Xstone,              Xstone,         Xdiamond,       Xdiamond,
@@ -141,285 +144,149 @@ void convert_em_level(unsigned char *src, int file_version)
 {
   static int eater_offset[8] =
   {
-    0x800, 0x809, 0x812, 0x81B, 0x840, 0x849, 0x852, 0x85B
+    2048, 2057, 2066, 2075,
+    2112, 2121, 2130, 2139
   };
   int i, x, y, temp;
 
-  lev.time_seconds = src[0x83E] << 8 | src[0x83F];
+  /* common to all emc caves */
+
+  lev.time_seconds = GET_BE16(src[2110]);
   if (lev.time_seconds > 9999)
     lev.time_seconds = 9999;
 
-  lev.required_initial = src[0x82F];
+  lev.required_initial = src[2095];
 
-  for (i = 0; i < 2; i++)
-  {
-    temp = src[0x830 + i * 2] << 8 | src[0x831 + i * 2];
-    ply[i].x_initial = (temp & 63);
-    ply[i].y_initial = (temp >> 6 & 31);
-  }
+  /* scores */
+
+  lev.emerald_score    = src[2084];
+  lev.diamond_score    = src[2085];
+  lev.alien_score      = src[2086];
+  lev.tank_score       = src[2087];
+  lev.bug_score                = src[2088];
+  lev.eater_score      = src[2089];
+  lev.nut_score                = src[2090];
+  lev.dynamite_score   = src[2091];
+  lev.key_score                = src[2092];
+  lev.exit_score       = src[2093] * 8 / 5;
 
-  temp = (src[0x834] << 8 | src[0x835]) * 28;
+  lev.lenses_score     = src[2151];
+  lev.magnify_score    = src[2152];
+  lev.slurp_score      = src[2153];
+
+  /* times */
+
+  lev.android_move_time  = GET_BE16(src[2164]);
+  lev.android_clone_time = GET_BE16(src[2166]);
+  lev.ball_time                 = GET_BE16(src[2160]);
+
+  lev.lenses_time      = GET_BE16(src[2154]);
+  lev.magnify_time     = GET_BE16(src[2156]);
+  lev.wheel_time       = GET_BE16(src[2104]);
+
+  temp = GET_BE16(src[2100]) * 28;
   if (temp > 9999)
     temp = 9999;
   lev.amoeba_time = temp;
 
-  lev.android_move_time = src[0x874] << 8 | src[0x875];
-  lev.android_clone_time = src[0x876] << 8 | src[0x877];
-
-  lev.ball_random = src[0x872] & 1 ? 1 : 0;
-  lev.ball_state_initial = src[0x872] & 128 ? 1 : 0;
-  lev.ball_time = src[0x870] << 8 | src[0x871];
-
-  lev.emerald_score = src[0x824];
-  lev.diamond_score = src[0x825];
-  lev.alien_score = src[0x826];
-  lev.tank_score = src[0x827];
-  lev.bug_score = src[0x828];
-  lev.eater_score = src[0x829];
-  lev.nut_score = src[0x82A];
-  lev.dynamite_score = src[0x82B];
-  lev.key_score = src[0x82C];
-  lev.exit_score = src[0x82D] * 8 / 5;
-  lev.lenses_score = src[0x867];
-  lev.magnify_score = src[0x868];
-  lev.slurp_score = src[0x869];
-
-  lev.lenses_time = src[0x86A] << 8 | src[0x86B];
-  lev.magnify_time = src[0x86C] << 8 | src[0x86D];
-  lev.wheel_time = src[0x838] << 8 | src[0x839];
-
-  lev.wind_cnt_initial = src[0x865] & 15 ? lev.wind_time : 0;
-  temp = src[0x865];
+  lev.wonderwall_time_initial = GET_BE16(src[2102]);
+
+  lev.wind_cnt_initial = src[2149] & 15 ? lev.wind_time : 0;
+  temp = src[2149];
   lev.wind_direction_initial = (temp & 8 ? 0 :
                                temp & 1 ? 1 :
                                temp & 2 ? 2 :
                                temp & 4 ? 3 : 0);
+  /* global flags */
 
-  lev.wonderwall_time_initial = src[0x836] << 8 | src[0x837];
+  lev.ball_random       = src[2162] & 1   ? 1 : 0;
+  lev.ball_state_initial = src[2162] & 128 ? 1 : 0;
 
-  for (i = 0; i < 8; i++)
-    for (x = 0; x < 9; x++)
-      lev.eater_array[i][x] =
-       get_em_element(src[eater_offset[i] + x], file_version);
-
-  temp = get_em_element(src[0x86F], file_version);
-  for (y = 0; y < 8; y++)
+  for (temp = 1; temp < 2047; temp++)
   {
-    if (src[0x872] & 1)
-    {
-      for (x = 0; x < 8; x++)
-       lev.ball_array[y][x] = temp;
-    }
-    else
+    switch (src[temp])
     {
-      lev.ball_array[y][1] = (src[0x873] & 1)  ? temp : Xblank; /* north */
-      lev.ball_array[y][6] = (src[0x873] & 2)  ? temp : Xblank; /* south */
-      lev.ball_array[y][3] = (src[0x873] & 4)  ? temp : Xblank; /* west */
-      lev.ball_array[y][4] = (src[0x873] & 8)  ? temp : Xblank; /* east */
-      lev.ball_array[y][7] = (src[0x873] & 16) ? temp : Xblank; /* southeast */
-      lev.ball_array[y][5] = (src[0x873] & 32) ? temp : Xblank; /* southwest */
-      lev.ball_array[y][2] = (src[0x873] & 64) ? temp : Xblank; /* northeast */
-      lev.ball_array[y][0] = (src[0x873] & 128)? temp : Xblank; /* northwest */
-    }
-  }
-
-  temp = src[0x878] << 8 | src[0x879];
-
-  if (temp & 1)
-  {
-    lev.android_array[Xemerald]                = Xemerald;
-    lev.android_array[Xemerald_pause]  = Xemerald;
-    lev.android_array[Xemerald_fall]   = Xemerald;
-    lev.android_array[Yemerald_sB]     = Xemerald;
-    lev.android_array[Yemerald_eB]     = Xemerald;
-    lev.android_array[Yemerald_wB]     = Xemerald;
-  }
-
-  if (temp & 2)
-  {
-    lev.android_array[Xdiamond]                = Xdiamond;
-    lev.android_array[Xdiamond_pause]  = Xdiamond;
-    lev.android_array[Xdiamond_fall]   = Xdiamond;
-    lev.android_array[Ydiamond_sB]     = Xdiamond;
-    lev.android_array[Ydiamond_eB]     = Xdiamond;
-    lev.android_array[Ydiamond_wB]     = Xdiamond;
-  }
+      case 36:                                 /* wonderwall */
+       lev.wonderwall_state_initial = 1;
+       lev.wonderwall_time_initial = 9999;
+       break;
 
-  if (temp & 4)
-  {
-    lev.android_array[Xstone]          = Xstone;
-    lev.android_array[Xstone_pause]    = Xstone;
-    lev.android_array[Xstone_fall]     = Xstone;
-    lev.android_array[Ystone_sB]       = Xstone;
-    lev.android_array[Ystone_eB]       = Xstone;
-    lev.android_array[Ystone_wB]       = Xstone;
-  }
+      case 40:                                 /* wheel */
+       lev.wheel_x_initial = temp & 63;
+       lev.wheel_y_initial = temp >> 6;
+       lev.wheel_cnt_initial = lev.wheel_time;
+       break;
 
-  if (temp & 8)
-  {
-    lev.android_array[Xbomb]           = Xbomb;
-    lev.android_array[Xbomb_pause]     = Xbomb;
-    lev.android_array[Xbomb_fall]      = Xbomb;
-    lev.android_array[Ybomb_sB]                = Xbomb;
-    lev.android_array[Ybomb_eB]                = Xbomb;
-    lev.android_array[Ybomb_wB]                = Xbomb;
-  }
+      case 163:                                        /* fake blank */
+       lev.lenses_cnt_initial = 9999;
+       break;
 
-  if (temp & 16)
-  {
-    lev.android_array[Xnut]            = Xnut;
-    lev.android_array[Xnut_pause]      = Xnut;
-    lev.android_array[Xnut_fall]       = Xnut;
-    lev.android_array[Ynut_sB]         = Xnut;
-    lev.android_array[Ynut_eB]         = Xnut;
-    lev.android_array[Ynut_wB]         = Xnut;
+      case 164:                                        /* fake grass */
+       lev.magnify_cnt_initial = 9999;
+       break;
+    }
   }
 
-  if (temp & 32)
-  {
-    lev.android_array[Xtank_1_n]       = Xtank_1_n;
-    lev.android_array[Xtank_2_n]       = Xtank_1_n;
-    lev.android_array[Ytank_nB]                = Xtank_1_n;
-    lev.android_array[Ytank_n_e]       = Xtank_1_n;
-    lev.android_array[Ytank_n_w]       = Xtank_1_n;
-
-    lev.android_array[Xtank_1_e]       = Xtank_1_e;
-    lev.android_array[Xtank_2_e]       = Xtank_1_e;
-    lev.android_array[Ytank_eB]                = Xtank_1_e;
-    lev.android_array[Ytank_e_s]       = Xtank_1_e;
-    lev.android_array[Ytank_e_n]       = Xtank_1_e;
-
-    lev.android_array[Xtank_1_s]       = Xtank_1_s;
-    lev.android_array[Xtank_2_s]       = Xtank_1_s;
-    lev.android_array[Ytank_sB]                = Xtank_1_s;
-    lev.android_array[Ytank_s_w]       = Xtank_1_s;
-    lev.android_array[Ytank_s_e]       = Xtank_1_s;
-
-    lev.android_array[Xtank_1_w]       = Xtank_1_w;
-    lev.android_array[Xtank_2_w]       = Xtank_1_w;
-    lev.android_array[Ytank_wB]                = Xtank_1_w;
-    lev.android_array[Ytank_w_n]       = Xtank_1_w;
-    lev.android_array[Ytank_w_s]       = Xtank_1_w;
-  }
+  /* android */
 
-  if (temp & 64)
-  {
-    lev.android_array[Xeater_n]                = Xeater_n;
-    lev.android_array[Yeater_nB]       = Xeater_n;
+  temp = GET_BE16(src[2168]);
 
-    lev.android_array[Xeater_e]                = Xeater_e;
-    lev.android_array[Yeater_eB]       = Xeater_e;
+  lev.android_emerald  = (temp & 1)    != 0;
+  lev.android_diamond  = (temp & 2)    != 0;
+  lev.android_stone    = (temp & 4)    != 0;
+  lev.android_bomb     = (temp & 8)    != 0;
+  lev.android_nut      = (temp & 16)   != 0;
+  lev.android_tank     = (temp & 32)   != 0;
+  lev.android_eater    = (temp & 64)   != 0;
+  lev.android_bug      = (temp & 128)  != 0;
+  lev.android_alien    = (temp & 256)  != 0;
+  lev.android_spring   = (temp & 512)  != 0;
+  lev.android_balloon  = (temp & 1024) != 0;
+  lev.android_amoeba   = (temp & 2048) != 0;
+  lev.android_dynamite = (temp & 4096) != 0;
 
-    lev.android_array[Xeater_s]                = Xeater_s;
-    lev.android_array[Yeater_sB]       = Xeater_s;
+  /* eaters */
 
-    lev.android_array[Xeater_w]                = Xeater_w;
-    lev.android_array[Yeater_wB]       = Xeater_w;
-  }
+  for (i = 0; i < 8; i++)
+    for (x = 0; x < 9; x++)
+      lev.eater_array[i][x] =
+       get_em_element(src[eater_offset[i] + x], file_version);
 
-  if (temp & 128)
-  {
-    lev.android_array[Xbug_1_n]                = Xbug_2_n;
-    lev.android_array[Xbug_2_n]                = Xbug_2_n;
-    lev.android_array[Ybug_nB]         = Xbug_2_n;
-    lev.android_array[Ybug_n_e]                = Xbug_2_n;
-    lev.android_array[Ybug_n_w]                = Xbug_2_n;
-
-    lev.android_array[Xbug_1_e]                = Xbug_2_e;
-    lev.android_array[Xbug_2_e]                = Xbug_2_e;
-    lev.android_array[Ybug_eB]         = Xbug_2_e;
-    lev.android_array[Ybug_e_s]                = Xbug_2_e;
-    lev.android_array[Ybug_e_n]                = Xbug_2_e;
-
-    lev.android_array[Xbug_1_s]                = Xbug_2_s;
-    lev.android_array[Xbug_2_s]                = Xbug_2_s;
-    lev.android_array[Ybug_sB]         = Xbug_2_s;
-    lev.android_array[Ybug_s_w]                = Xbug_2_s;
-    lev.android_array[Ybug_s_e]                = Xbug_2_s;
-
-    lev.android_array[Xbug_1_w]                = Xbug_2_w;
-    lev.android_array[Xbug_2_w]                = Xbug_2_w;
-    lev.android_array[Ybug_wB]         = Xbug_2_w;
-    lev.android_array[Ybug_w_n]                = Xbug_2_w;
-    lev.android_array[Ybug_w_s]                = Xbug_2_w;
-  }
+  /* ball */
 
-  if (temp & 256)
-  {
-    lev.android_array[Xalien]          = Xalien;
-    lev.android_array[Xalien_pause]    = Xalien;
-    lev.android_array[Yalien_nB]       = Xalien;
-    lev.android_array[Yalien_eB]       = Xalien;
-    lev.android_array[Yalien_sB]       = Xalien;
-    lev.android_array[Yalien_wB]       = Xalien;
-  }
+  temp = get_em_element(src[2159], file_version);
 
-  if (temp & 512)
+  for (y = 0; y < 8; y++)
   {
-    lev.android_array[Xspring]         = Xspring;
-    lev.android_array[Xspring_pause]   = Xspring;
-    lev.android_array[Xspring_e]       = Xspring;
-    lev.android_array[Yspring_eB]      = Xspring;
-    lev.android_array[Yspring_alien_eB]        = Xspring;
-    lev.android_array[Xspring_w]       = Xspring;
-    lev.android_array[Yspring_wB]      = Xspring;
-    lev.android_array[Yspring_alien_wB]        = Xspring;
-    lev.android_array[Xspring_fall]    = Xspring;
-    lev.android_array[Yspring_sB]      = Xspring;
+    if (src[2162] & 1)
+    {
+      for (x = 0; x < 8; x++)
+       lev.ball_array[y][x] = temp;
+    }
+    else
+    {
+      lev.ball_array[y][1] = (src[2163] & 1)  ? temp : Xblank; /* north */
+      lev.ball_array[y][6] = (src[2163] & 2)  ? temp : Xblank; /* south */
+      lev.ball_array[y][3] = (src[2163] & 4)  ? temp : Xblank; /* west */
+      lev.ball_array[y][4] = (src[2163] & 8)  ? temp : Xblank; /* east */
+      lev.ball_array[y][7] = (src[2163] & 16) ? temp : Xblank; /* southeast */
+      lev.ball_array[y][5] = (src[2163] & 32) ? temp : Xblank; /* southwest */
+      lev.ball_array[y][2] = (src[2163] & 64) ? temp : Xblank; /* northeast */
+      lev.ball_array[y][0] = (src[2163] & 128)? temp : Xblank; /* northwest */
+    }
   }
 
-  if (temp & 1024)
-  {
-    lev.android_array[Yballoon_nB]     = Xballoon;
-    lev.android_array[Yballoon_eB]     = Xballoon;
-    lev.android_array[Yballoon_sB]     = Xballoon;
-    lev.android_array[Yballoon_wB]     = Xballoon;
-    lev.android_array[Xballoon]                = Xballoon;
-  }
+  /* players */
 
-  if (temp & 2048)
+  for (i = 0; i < 2; i++)
   {
-    lev.android_array[Xfake_amoeba]    = Xdrip;
-    lev.android_array[Yfake_amoeba]    = Xdrip;
-    lev.android_array[Xamoeba_1]       = Xdrip;
-    lev.android_array[Xamoeba_2]       = Xdrip;
-    lev.android_array[Xamoeba_3]       = Xdrip;
-    lev.android_array[Xamoeba_4]       = Xdrip;
-    lev.android_array[Xamoeba_5]       = Xdrip;
-    lev.android_array[Xamoeba_6]       = Xdrip;
-    lev.android_array[Xamoeba_7]       = Xdrip;
-    lev.android_array[Xamoeba_8]       = Xdrip;
-  }
+    temp = GET_BE16(src[2096 + i * 2]);
 
-  if (temp & 4096)
-  {
-    lev.android_array[Xdynamite]       = Xdynamite;
+    ply[i].x_initial = (temp & 63);
+    ply[i].y_initial = (temp >> 6 & 31);
   }
 
-  for (temp = 1; temp < 2047; temp++)
-  {
-    switch (src[temp])
-    {
-      case 0x24:                               /* wonderwall */
-       lev.wonderwall_state_initial = 1;
-       lev.wonderwall_time_initial = 9999;
-       break;
-
-      case 0x28:                               /* wheel */
-       lev.wheel_x_initial = temp & 63;
-       lev.wheel_y_initial = temp >> 6;
-       lev.wheel_cnt_initial = lev.wheel_time;
-       break;
-
-      case 0xA3:                               /* fake blank */
-       lev.lenses_cnt_initial = 9999;
-       break;
-
-      case 0xA4:                               /* fake grass */
-       lev.magnify_cnt_initial = 9999;
-       break;
-    }
-  }
+  /* cave */
 
   /* first fill the complete playfield with the default border element */
   for (y = 0; y < CAVE_HEIGHT; y++)
@@ -779,32 +646,23 @@ int cleanup_em_level(unsigned char *src, int length, char *filename)
 
   /* player 1 pos */
   src[2096] &= 7;
-  src[src[2096] << 8 | src[2097]] = 128;
+  src[GET_BE16(src[2096])] = 128;
 
   /* player 2 pos */
   src[2098] &= 7;
-  src[src[2098] << 8 | src[2099]] = 128;
+  src[GET_BE16(src[2098])] = 128;
 
   /* amoeba speed */
-  if ((src[2100] << 8 | src[2101]) > 9999)
-  {
-    src[2100] = 39;
-    src[2101] = 15;
-  }
+  if (GET_BE16(src[2100]) > 9999)
+    PUT_BE16(src[2100], 9999);
 
   /* time wonderwall */
-  if ((src[2102] << 8 | src[2103]) > 9999)
-  {
-    src[2102] = 39;
-    src[2103] = 15;
-  }
+  if (GET_BE16(src[2102]) > 9999)
+    PUT_BE16(src[2102], 9999);
 
   /* time */
-  if ((src[2110] << 8 | src[2111]) > 9999)
-  {
-    src[2110] = 39;
-    src[2111] = 15;
-  }
+  if (GET_BE16(src[2110]) > 9999)
+    PUT_BE16(src[2110], 9999);
 
   /* wind direction */
   i = src[2149];
@@ -813,29 +671,20 @@ int cleanup_em_level(unsigned char *src, int length, char *filename)
   src[2149] = i;
 
   /* time lenses */
-  if ((src[2154] << 8 | src[2155]) > 9999)
-  {
-    src[2154] = 39;
-    src[2155] = 15;
-  }
+  if (GET_BE16(src[2154]) > 9999)
+    PUT_BE16(src[2154], 9999);
 
   /* time magnify */
-  if ((src[2156] << 8 | src[2157]) > 9999)
-  {
-    src[2156] = 39;
-    src[2157] = 15;
-  }
+  if (GET_BE16(src[2156]) > 9999)
+    PUT_BE16(src[2156], 9999);
 
   /* ball object */
   src[2158] = 0;
   src[2159] = map_v6[src[2159]];
 
   /* ball pause */
-  if ((src[2160] << 8 | src[2161]) > 9999)
-  {
-    src[2160] = 39;
-    src[2161] = 15;
-  }
+  if (GET_BE16(src[2160]) > 9999)
+    PUT_BE16(src[2160], 9999);
 
   /* ball data */
   src[2162] &= 129;
@@ -843,18 +692,12 @@ int cleanup_em_level(unsigned char *src, int length, char *filename)
     src[2163] = 0;
 
   /* android move pause */
-  if ((src[2164] << 8 | src[2165]) > 9999)
-  {
-    src[2164] = 39;
-    src[2165] = 15;
-  }
+  if (GET_BE16(src[2164]) > 9999)
+    PUT_BE16(src[2164], 9999);
 
   /* android clone pause */
-  if ((src[2166] << 8 | src[2167]) > 9999)
-  {
-    src[2166] = 39;
-    src[2167] = 15;
-  }
+  if (GET_BE16(src[2166]) > 9999)
+    PUT_BE16(src[2166], 9999);
 
   /* android data */
   src[2168] &= 31;