rnd-20040927-2-src
[rocksndiamonds.git] / src / game_em / convert.c
index 8fd194a90c069c9c6186a7353e0b34447244d817..2672054fb4388034e83e52bec6e0bd6108e552d1 100644 (file)
@@ -8,12 +8,11 @@
  * inconsequential, but no doubt it will break some caves.
  */
 
+#include "global.h"
 #include "tile.h"
 #include "level.h"
 
 
-#if defined(TARGET_X11)
-
 static unsigned char remap_v6[256] =
 {
   /* filter crap for v6 */
@@ -89,7 +88,7 @@ static unsigned char remap_v4eater[28] =
   146,147,175,65,66,64,2,18
 };
 
-int clean_emerald(unsigned char *src, unsigned long *length)
+boolean cleanup_em_level(unsigned char *src, int *length)
 {
   unsigned int i;
 
@@ -156,7 +155,7 @@ int clean_emerald(unsigned char *src, unsigned long *length)
     goto v3;
   }
 
-  return 1;            /* unrecognized cave */
+  return FALSE;                /* unrecognized cave */
 
  v3:
  v4:
@@ -185,7 +184,6 @@ int clean_emerald(unsigned char *src, unsigned long *length)
   for (i = 0; i < 2048; i++)
     if (src[i] == 40)
       break;
-
   for (i++; i < 2048; i++)
     if (src[i] == 40)
       src[i] = 147;
@@ -246,7 +244,7 @@ int clean_emerald(unsigned char *src, unsigned long *length)
   src[2098] &= 7;
   src[src[2098] << 8 | src[2099]] = 128;
 
-  /* ameuba speed */
+  /* amoeba speed */
   if ((src[2100] << 8 | src[2101]) > 9999)
   {
     src[2100] = 39;
@@ -323,7 +321,7 @@ int clean_emerald(unsigned char *src, unsigned long *length)
   /* size of v6 cave */
   *length = 2172;
 
-  return 0;
+  return TRUE;
 }
 
 /* 2000-07-30T00:26:00Z
@@ -408,7 +406,7 @@ static unsigned short remap_emerald[256] =
   Xblank, Xround_wall_1, Xgrass, Xsteel_1, Xwall_1, Xkey_1, Xkey_2, Xkey_3,
   Xkey_4, Xdoor_1, Xdoor_2, Xdoor_3, Xdoor_4, Xdripper, Xfake_door_1, Xfake_door_2,
   Xfake_door_3, Xfake_door_4, Xwonderwall, Xwheel, Xsand, Xacid_nw, Xacid_ne, Xacid_sw,
-  Xacid_se, Xfake_blank, Xameuba_1, Xameuba_2, Xameuba_3, Xameuba_4, Xexit, Xalpha_arrow_w,
+  Xacid_se, Xfake_blank, Xamoeba_1, Xamoeba_2, Xamoeba_3, Xamoeba_4, Xexit, Xalpha_arrow_w,
   Xfake_grass, Xlenses, Xmagnify, Xfake_blank, Xfake_grass, Xswitch, Xswitch, Xblank,
   Xdecor_8, Xdecor_9, Xdecor_10, Xdecor_5, Xalpha_comma, Xalpha_quote, Xalpha_minus, Xdynamite,
   Xsteel_3, Xdecor_6, Xdecor_7, Xsteel_2, Xround_wall_2, Xdecor_2, Xdecor_4, Xdecor_3,
@@ -423,69 +421,70 @@ static unsigned short remap_emerald[256] =
   Xblank, Xblank, Xblank, Xblank, Xblank, Xblank, Xblank, Xblank,
 };
 
-void convert_emerald(unsigned char *src)
+void convert_em_level(unsigned char *src)
 {
   unsigned int x, y, temp;
 
-  lev.width = 64;
-  lev.height = 32;
-
   temp = ((src[0x83E] << 8 | src[0x83F]) * 25 + 3) / 4;
   if (temp == 0 || temp > 9999)
     temp = 9999;
-  lev.time = temp;
-  lev.required = src[0x82F];
+  lev.time_initial = temp;
+  lev.required_initial = src[0x82F];
 
   temp = src[0x830] << 8 | src[0x831];
-  ply1.oldx = ply1.x = (temp & 63) + 1;
-  ply1.oldy = ply1.y = (temp >> 6 & 31) + 1;
+  ply1.x_initial = (temp & 63) + 1;
+  ply1.y_initial = (temp >> 6 & 31) + 1;
   temp = src[0x832] << 8 | src[0x833];
-  ply2.oldx = ply2.x = (temp & 63) + 1;
-  ply2.oldy = ply2.y = (temp >> 6 & 31) + 1;
-
-  lev.alien_score = src[0x826];
+  ply2.x_initial = (temp & 63) + 1;
+  ply2.y_initial = (temp >> 6 & 31) + 1;
 
   temp = (src[0x834] << 8 | src[0x835]) * 28;
   if (temp > 9999)
     temp = 9999;
-  lev.ameuba_time = temp;
-  lev.android_move_cnt = lev.android_move_time = src[0x874] << 8 | src[0x875];
-  lev.android_clone_cnt= lev.android_clone_time = src[0x876] << 8 | src[0x877];
-  lev.ball_pos = 0;
+  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 = src[0x872] & 128 ? 1 : 0;
-  lev.ball_cnt = lev.ball_time = src[0x870] << 8 | src[0x871];
-  lev.bug_score = src[0x828];
+  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.dynamite_score = src[0x82B];
-  lev.eater_pos = 0;
+  lev.alien_score = src[0x826];
+  lev.tank_score = src[0x827];
+  lev.bug_score = src[0x828];
   lev.eater_score = src[0x829];
-  lev.emerald_score = src[0x824];
-  lev.exit_score = src[0x82D] * 8 / 5;
+  lev.nut_score = src[0x82A];
+  lev.dynamite_score = src[0x82B];
   lev.key_score = src[0x82C];
-  lev.lenses_cnt = 0;
+  lev.exit_score = src[0x82D] * 8 / 5;
   lev.lenses_score = src[0x867];
-  lev.lenses_time = src[0x86A] << 8 | src[0x86B];
-  lev.magnify_cnt = 0;
   lev.magnify_score = src[0x868];
-  lev.magnify_time = src[0x86C] << 8 | src[0x86D];
-  lev.nut_score = src[0x82A];
-  lev.shine_cnt = 0;
   lev.slurp_score = src[0x869];
-  lev.tank_score = src[0x827];
-  lev.wheel_cnt = 0;
-  lev.wheel_x = 1;
-  lev.wheel_y = 1;
+
+  lev.lenses_time = src[0x86A] << 8 | src[0x86B];
+  lev.lenses_cnt_initial = 0;
+
+  lev.magnify_time = src[0x86C] << 8 | src[0x86D];
+  lev.magnify_cnt_initial = 0;
+
   lev.wheel_time = src[0x838] << 8 | src[0x839];
-  lev.wind_cnt = src[0x865] & 15 ? 9999 : 0;
-  temp = src[0x865];
-  lev.wind_direction = (temp & 8 ? 0 :
-                       temp & 1 ? 1 :
-                       temp & 2 ? 2 :
-                       temp & 4 ? 3 : 0);
+  lev.wheel_cnt_initial = 0;
+  lev.wheel_x_initial = 1;
+  lev.wheel_y_initial = 1;
+
   lev.wind_time = 9999;
-  lev.wonderwall_state = 0;
-  lev.wonderwall_time = src[0x836] << 8 | src[0x837];
+  lev.wind_cnt_initial = src[0x865] & 15 ? lev.wind_time : 0;
+  temp = src[0x865];
+  lev.wind_direction_initial = (temp & 8 ? 0 :
+                               temp & 1 ? 1 :
+                               temp & 2 ? 2 :
+                               temp & 4 ? 3 : 0);
+
+  lev.wonderwall_state_initial = 0;
+  lev.wonderwall_time_initial = src[0x836] << 8 | src[0x837];
 
   for (x = 0; x < 9; x++)
     lev.eater_array[0][x] = remap_emerald[src[0x800 + x]];
@@ -676,14 +675,14 @@ void convert_emerald(unsigned char *src)
   {
     lev.android_array[Xdripper] =
       lev.android_array[XdripperB] =
-      lev.android_array[Xameuba_1] =
-      lev.android_array[Xameuba_2] =
-      lev.android_array[Xameuba_3] =
-      lev.android_array[Xameuba_4] =
-      lev.android_array[Xameuba_5] =
-      lev.android_array[Xameuba_6] =
-      lev.android_array[Xameuba_7] =
-      lev.android_array[Xameuba_8] = Xdrip_eat;
+      lev.android_array[Xamoeba_1] =
+      lev.android_array[Xamoeba_2] =
+      lev.android_array[Xamoeba_3] =
+      lev.android_array[Xamoeba_4] =
+      lev.android_array[Xamoeba_5] =
+      lev.android_array[Xamoeba_6] =
+      lev.android_array[Xamoeba_7] =
+      lev.android_array[Xamoeba_8] = Xdrip_eat;
   }
 
   if (temp & 4096)
@@ -696,14 +695,14 @@ void convert_emerald(unsigned char *src)
     switch (src[temp])
     {
       case 0x24:                               /* wonderwall */
-       lev.wonderwall_state = 1;
-       lev.wonderwall_time = 9999;
+       lev.wonderwall_state_initial = 1;
+       lev.wonderwall_time_initial = 9999;
        break;
 
       case 0x28:                               /* wheel */
-       lev.wheel_x = temp & 63;
-       lev.wheel_y = temp >> 6;
-       lev.wheel_cnt = lev.wheel_time;
+       lev.wheel_x_initial = temp & 63;
+       lev.wheel_y_initial = temp >> 6;
+       lev.wheel_cnt_initial = lev.wheel_time;
        break;
 
 #ifndef BAD_ROLL
@@ -749,28 +748,47 @@ void convert_emerald(unsigned char *src)
 #endif
 
       case 0xA3:                               /* fake blank */
-       lev.lenses_cnt = 9999;
+       lev.lenses_cnt_initial = 9999;
        break;
 
       case 0xA4:                               /* fake grass */
-       lev.magnify_cnt = 9999;
+       lev.magnify_cnt_initial = 9999;
        break;
     }
   }
 
+  lev.home_initial = 1;                /* initial number of players in this level */
+
+  ply1.alive_initial = (lev.home_initial >= 1);
+  ply2.alive_initial = (lev.home_initial >= 2);
+
+  /* first fill the complete playfield with the default border element */
   for (y = 0; y < HEIGHT; y++)
     for (x = 0; x < WIDTH; x++)
-      Cave[y][x] = ZBORDER;
+      native_em_level.cave[x][y] = ZBORDER;
 
+  /* then copy the real level contents from level file into the playfield */
   temp = 0;
   for (y = 0; y < lev.height; y++)
     for (x = 0; x < lev.width; x++)
-      Cave[y+1][x+1] = remap_emerald[src[temp++]];
+      native_em_level.cave[x + 1][y + 1] = remap_emerald[src[temp++]];
+
+  /* at last, set the two players at their positions in the playfield */
+  if (ply1.alive_initial)
+    native_em_level.cave[ply1.x_initial][ply1.y_initial] = Zplayer;
+  if (ply2.alive_initial)
+    native_em_level.cave[ply2.x_initial][ply2.y_initial] = Zplayer;
+}
+
+void prepare_em_level(void)
+{
+  unsigned int x, y;
 
-  if (ply1.alive)
-    Cave[ply1.y][ply1.x] = Zplayer;
-  if (ply2.alive)
-    Cave[ply2.y][ply2.x] = Zplayer;
+  /* reset all runtime variables to their initial values */
+
+  for (y = 0; y < HEIGHT; y++)
+    for (x = 0; x < WIDTH; x++)
+      Cave[y][x] = native_em_level.cave[x][y];
 
   for (y = 0; y < HEIGHT; y++)
     for (x = 0; x < WIDTH; x++)
@@ -779,6 +797,55 @@ void convert_emerald(unsigned char *src)
   for (y = 0; y < HEIGHT; y++)
     for (x = 0; x < WIDTH; x++)
       Draw[y][x] = Cave[y][x];
-}
 
-#endif
+  lev.time = lev.time_initial;
+  lev.required = lev.required_initial;
+  lev.score = 0;
+
+  lev.android_move_cnt  = lev.android_move_time;
+  lev.android_clone_cnt = lev.android_clone_time;
+
+  lev.ball_pos = 0;
+  lev.ball_state = lev.ball_state_initial;
+  lev.ball_cnt = lev.ball_time;
+
+  lev.eater_pos = 0;
+  lev.shine_cnt = 0;
+
+  lev.lenses_cnt = lev.lenses_cnt_initial;
+  lev.magnify_cnt = lev.magnify_cnt_initial;
+
+  lev.wheel_cnt = lev.wheel_cnt_initial;
+  lev.wheel_x   = lev.wheel_x_initial;
+  lev.wheel_y   = lev.wheel_y_initial;
+
+  lev.wind_cnt       = lev.wind_cnt_initial;
+  lev.wind_direction = lev.wind_direction_initial;
+
+  lev.wonderwall_state = lev.wonderwall_state_initial;
+  lev.wonderwall_time  = lev.wonderwall_time_initial;
+
+  lev.home = lev.home_initial;
+
+  ply1.num = 0;
+  ply1.alive = ply1.alive_initial;
+  ply1.dynamite = 0;
+  ply1.dynamite_cnt = 0;
+  ply1.keys = 0;
+  ply1.anim = 0;
+  ply1.oldx = ply1.x = ply1.x_initial;
+  ply1.oldy = ply1.y = ply1.y_initial;
+  ply1.joy_n = ply1.joy_e = ply1.joy_s = ply1.joy_w = ply1.joy_fire = 0;
+  ply1.joy_stick = ply1.joy_spin = 0;
+
+  ply2.num = 1;
+  ply2.alive = ply2.alive_initial;
+  ply2.dynamite = 0;
+  ply2.dynamite_cnt = 0;
+  ply2.keys = 0;
+  ply2.anim = 0;
+  ply2.oldx = ply2.x = ply2.x_initial;
+  ply2.oldy = ply2.y = ply2.y_initial;
+  ply2.joy_n = ply2.joy_e = ply2.joy_s = ply2.joy_w = ply2.joy_fire = 0;
+  ply2.joy_stick = ply2.joy_spin = 0;
+}