changed order of switch cases in EM engine source file
[rocksndiamonds.git] / src / game_em / convert.c
index d8157a695b748d521fb34d5969d7fa8a6a5a6fdc..17f709853ebef7e9625058eeb1508e59ad963d7c 100644 (file)
@@ -11,8 +11,6 @@
 #include "main_em.h"
 
 
-#define ALLOW_ROLLING_SPRING
-
 static unsigned char remap_v6[256] =
 {
   /* filter crap for v6 */
@@ -22,11 +20,7 @@ static unsigned char remap_v6[256] =
   0,16,2,18,       36,37,37,37,     40,41,42,43,     44,45,128,128,
   128,148,148,     148,45,45,45,    148,0,57,58,     59,60,61,62,63,
 
-#ifdef ALLOW_ROLLING_SPRING
   64,65,66,67,     68,69,69,71,     72,73,74,75,     118,75,75,75,
-#else
-  64,65,66,67,     68,69,69,69,     69,73,74,75,     118,75,75,75,
-#endif
   75,75,75,75,     75,153,153,153,  153,153,153,153, 153,153,153,153,
   153,153,153,99,  100,68,68,68,    68,68,68,68,     68,118,118,118,
   118,118,114,115, 131,118,118,119, 120,121,122,118, 118,118,118,118,
@@ -517,6 +511,10 @@ int cleanup_em_level(unsigned char *src, int length, char *filename)
  * - introduced ALLOW_ROLLING_SPRING; if defined, do NOT turn rolling spring
  *   into regular spring, because this breaks at least E.M.C. Mine 3, level 79
  *   (see comment directly above)
+ *
+ * 2020-01-19
+ * - always use BAD_ROLL and ALLOW_ROLLING_SPRING code when converting caves
+ *   (that is, always allow initial rolling objects in caves now)
  */
 
 static unsigned short remap_emerald[256] =
@@ -538,28 +536,19 @@ static unsigned short remap_emerald[256] =
 
   Xblank,              Xsand,          Xsand,          Xsand,
   Xsand_stone,         Xsand_stone,    Xsand_stone,    Xsand,
-  Xstone,              Xslidewall_ew,  Xslidewall_ns,  Xdynamite_1,
+  Xstone,              Xslide_ew,      Xslide_ns,      Xdynamite_1,
   Xdynamite_2,         Xdynamite_3,    Xdynamite_4,    Xacid_s,
 
-#ifdef ALLOW_ROLLING_SPRING
   Xexit_1,             Xexit_2,        Xexit_3,        Xballoon,
   Xplant,              Xspring,        Xspring_fall,   Xspring_w,
   Xspring_e,           Xball_1,        Xball_2,        Xandroid,
   Xblank,              Xandroid,       Xandroid,       Xandroid,
-#else
-  Xexit_1,             Xexit_2,        Xexit_3,        Xballoon,
-  Xplant,              Xspring,        Xspring,        Xspring,
-  Xspring,             Xball_1,        Xball_2,        Xandroid,
-  Xblank,              Xandroid,       Xandroid,       Xandroid,
-#endif
 
   Xandroid,            Xandroid,       Xandroid,       Xandroid,
   Xandroid,            Xblank,         Xblank,         Xblank,
   Xblank,              Xblank,         Xblank,         Xblank,
   Xblank,              Xblank,         Xblank,         Xblank,
 
-#ifdef BAD_ROLL
-
   Xblank,              Xblank,         Xblank,         Xpush_spring_w,
   Xpush_spring_e,      Xacid_1,        Xacid_2,        Xacid_3,
   Xacid_4,             Xacid_5,        Xacid_6,        Xacid_7,
@@ -570,20 +559,6 @@ static unsigned short remap_emerald[256] =
   Xpush_bomb_e,                Xpush_stone_w,  Xpush_stone_e,  Xblank,
   Xblank,              Xblank,         Xblank,         Xblank,
 
-#else
-
-  Xblank,              Xblank,         Xblank,         Xspring,
-  Xspring,             Xacid_1,        Xacid_2,        Xacid_3,
-  Xacid_4,             Xacid_5,        Xacid_6,        Xacid_7,
-  Xacid_8,             Xblank,         Xblank,         Xblank,
-
-  Xblank,              Xblank,         Xnut,           Xnut,
-  Xsteel_1,            Xblank,         Xblank,         Xbomb,
-  Xbomb,               Xstone,         Xstone,         Xblank,
-  Xblank,              Xblank,         Xblank,         Xblank,
-
-#endif
-
   Xblank,              Xroundwall_1,   Xgrass,         Xsteel_1,
   Xwall_1,             Xkey_1,         Xkey_2,         Xkey_3,
   Xkey_4,              Xdoor_1,        Xdoor_2,        Xdoor_3,
@@ -668,8 +643,8 @@ void convert_em_level(unsigned char *src, int file_version)
   for (i = 0; i < 2; i++)
   {
     temp = src[0x830 + i * 2] << 8 | src[0x831 + i * 2];
-    ply[i].x_initial = (temp & 63) + 1;
-    ply[i].y_initial = (temp >> 6 & 31) + 1;
+    ply[i].x_initial = (temp & 63);
+    ply[i].y_initial = (temp >> 6 & 31);
   }
 
   temp = (src[0x834] << 8 | src[0x835]) * 28;
@@ -925,48 +900,6 @@ void convert_em_level(unsigned char *src, int file_version)
        lev.wheel_cnt_initial = lev.wheel_time;
        break;
 
-#ifndef BAD_ROLL
-      case 0x63:                               /* spring roll left */
-       src[temp - 1] = 0x45;
-       src[temp] = 0x80;
-       break;
-
-      case 0x64:                               /* spring roll right */
-       src[temp + 1] = 0x45;
-       src[temp] = 0x80;
-       break;
-
-      case 0x72:                               /* nut roll left */
-       src[temp - 1] = 0x25;
-       src[temp] = 0x80;
-       break;
-
-      case 0x73:                               /* nut roll right */
-       src[temp + 1] = 0x25;
-       src[temp] = 0x80;
-       break;
-
-      case 0x77:                               /* bomb roll left */
-       src[temp - 1] = 0x10;
-       src[temp] = 0x80;
-       break;
-
-      case 0x78:                               /* bomb roll right */
-       src[temp + 1] = 0x10;
-       src[temp] = 0x80;
-       break;
-
-      case 0x79:                               /* stone roll left */
-       src[temp - 1] = 0x00;
-       src[temp] = 0x80;
-       break;
-
-      case 0x7A:                               /* stone roll right */
-       src[temp + 1] = 0x00;
-       src[temp] = 0x80;
-       break;
-#endif
-
       case 0xA3:                               /* fake blank */
        lev.lenses_cnt_initial = 9999;
        break;
@@ -978,15 +911,15 @@ void convert_em_level(unsigned char *src, int file_version)
   }
 
   /* first fill the complete playfield with the default border element */
-  for (y = 0; y < HEIGHT; y++)
-    for (x = 0; x < WIDTH; x++)
+  for (y = 0; y < CAVE_HEIGHT; y++)
+    for (x = 0; x < CAVE_WIDTH; x++)
       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++)
-      native_em_level.cave[x + 1][y + 1] =
+      native_em_level.cave[x][y] =
        get_em_element(src[temp++], file_version);
 
   /* at last, set the two players at their positions in the playfield */
@@ -1005,17 +938,34 @@ void prepare_em_level(void)
 
   /* 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];
+  game_init_cave_buffers();
+
+  lev.left = CAVE_BUFFER_XOFFSET;
+  lev.top  = CAVE_BUFFER_YOFFSET;
+  lev.right = lev.left + lev.width;
+  lev.bottom = lev.top + lev.height;
+
+  /* add linked cave buffer columns for wrap-around movement */
+  for (x = 0; x < lev.left; x++)
+  {
+    lev.cavecol[x] = lev.cavecol[lev.width + x];
+    lev.nextcol[x] = lev.nextcol[lev.width + x];
+    lev.drawcol[x] = lev.drawcol[lev.width + x];
+    lev.boomcol[x] = lev.boomcol[lev.width + x];
+
+    lev.cavecol[lev.right + x] = lev.cavecol[lev.left + x];
+    lev.nextcol[lev.right + x] = lev.nextcol[lev.left + x];
+    lev.drawcol[lev.right + x] = lev.drawcol[lev.left + x];
+    lev.boomcol[lev.right + x] = lev.boomcol[lev.left + x];
+  }
 
-  for (y = 0; y < HEIGHT; y++)
-    for (x = 0; x < WIDTH; x++)
-      Next[y][x] = Cave[y][x];
+  for (x = 0; x < lev.width; x++)
+    for (y = 0; y < lev.height; y++)
+      lev.cave[lev.left + x][lev.top + y] = native_em_level.cave[x][y];
 
-  for (y = 0; y < HEIGHT; y++)
-    for (x = 0; x < WIDTH; x++)
-      Draw[y][x] = Cave[y][x];
+  for (x = lev.left; x < lev.right; x++)
+    for (y = lev.top; y < lev.bottom; y++)
+      lev.next[x][y] = lev.draw[x][y] = lev.cave[x][y];
 
   lev.time_initial = lev.time_seconds;
   lev.time = lev.time_initial;
@@ -1056,7 +1006,7 @@ void prepare_em_level(void)
     ply[i].exists = 0;
     ply[i].alive_initial = FALSE;
 
-    if (ply[i].x_initial > 0 && ply[i].y_initial > 0)
+    if (ply[i].x_initial != -1 && ply[i].y_initial != -1)
     {
       ply[i].exists = 1;
 
@@ -1088,7 +1038,9 @@ void prepare_em_level(void)
 
        native_em_level.cave[x][y] = Xblank;
 
-       Cave[y][x] = Next[y][x] = Draw[y][x] = Xblank;
+       lev.cave[lev.left + x][lev.top + y] = Xblank;
+       lev.next[lev.left + x][lev.top + y] = Xblank;
+       lev.draw[lev.left + x][lev.top + y] = Xblank;
       }
     }
   }
@@ -1101,8 +1053,8 @@ void prepare_em_level(void)
     ply[i].dynamite_cnt = 0;
     ply[i].keys = 0;
     ply[i].anim = 0;
-    ply[i].oldx = ply[i].x = ply[i].x_initial;
-    ply[i].oldy = ply[i].y = ply[i].y_initial;
+    ply[i].oldx = ply[i].x = ply[i].x_initial + lev.left;
+    ply[i].oldy = ply[i].y = ply[i].y_initial + lev.top;
     ply[i].last_move_dir = MV_NONE;
     ply[i].joy_n = ply[i].joy_e = ply[i].joy_s = ply[i].joy_w = 0;
     ply[i].joy_snap  = ply[i].joy_drop = 0;