fixed time score for native Emerald Mine and Diamond Caves levels
[rocksndiamonds.git] / src / game_em / reademc.c
index 46f7b45e0bf85d82eed0faebc35b0fe903ebe8e9..dfa293a6ebe1eeee4d905142e7af8a0618bb9db0 100644 (file)
  * behaviour.
  */
 
+/* changes for game engine integration in Rocks'n'Diamonds:
+ *
+ * added support for rolling spring (not mapped to pushed spring)
+ * - required for Elvis Mine 8, levels 3, 23, 48 and 73
+ */
+
 #define GET_BE16(x)            ((&x)[0] << 8 | (&x)[1])
 
-static const short map_emc[256] =
+static const short map_emc_raw[256] =
 {
   Cstone,              Cstone,         Cdiamond,       Cdiamond,       //   0
-  Calien,              Calien,         Cblank,         Cblank,         //   4
+  Calien,              Calien,         Cpause,         Cpause,         //   4
   Ctank_1_n,           Ctank_1_e,      Ctank_1_s,      Ctank_1_w,      //   8
   Ctank_2_n,           Ctank_2_e,      Ctank_2_s,      Ctank_2_w,      //  12
-
   Cbomb,               Cbomb,          Cemerald,       Cemerald,       //  16
   Cbug_1_n,            Cbug_1_e,       Cbug_1_s,       Cbug_1_w,       //  20
   Cbug_2_n,            Cbug_2_e,       Cbug_2_s,       Cbug_2_w,       //  24
-  Cdrip,               Cdrip,          Cdrip,          Cdrip,          //  28
-
+  Cdrip,               Cdrip,          Cblank,         Cdrip,          //  28
   Cstone,              Cbomb,          Cdiamond,       Cemerald,       //  32
   Cwonderwall,         Cnut,           Cnut,           Cnut,           //  36
   Cwheel,              Ceater_n,       Ceater_s,       Ceater_w,       //  40
   Ceater_e,            Csand_stone,    Cblank,         Cblank,         //  44
-
   Cblank,              Csand,          Csand,          Csand,          //  48
   Csand_stone,         Csand_stone,    Csand_stone,    Csand,          //  52
   Cstone,              Cslide_ew,      Cslide_ns,      Cdynamite_1,    //  56
   Cdynamite_2,         Cdynamite_3,    Cdynamite_4,    Cacid_s,        //  60
 
   Cexit_1,             Cexit_2,        Cexit_3,        Cballoon,       //  64
-  Cplant,              Cspring,        Cspring,        Cpush_spring_w, //  68
-  Cpush_spring_e,      Cball_1,        Cball_2,        Candroid,       //  72
-  Cblank,              Candroid,       Candroid,       Candroid,       //  76
-
+  Cplant,              Cspring,        Cspring,        Cspring_w,      //  68
+  Cspring_e,           Cball_1,        Cball_2,        Candroid,       //  72
+  Cpause,              Candroid,       Candroid,       Candroid,       //  76
   Candroid,            Candroid,       Candroid,       Candroid,       //  80
   Candroid,            Cblank,         Cblank,         Cblank,         //  84
   Cblank,              Cblank,         Cblank,         Cblank,         //  88
   Cblank,              Cblank,         Cblank,         Cblank,         //  92
-
   Cblank,              Cblank,         Cblank,         Cpush_spring_w, //  96
   Cpush_spring_e,      Cacid_1,        Cacid_2,        Cacid_3,        // 100
   Cacid_4,             Cacid_5,        Cacid_6,        Cacid_7,        // 104
-  Cacid_8,             Cblank,         Cblank,         Cblank,         // 108
-
-  Cblank,              Cblank,         Cpush_nut_w,    Cpush_nut_e,    // 112
-  Csteel_1,            Cblank,         Cblank,         Cpush_bomb_w,   // 116
-  Cpush_bomb_e,                Cpush_stone_w,  Cpush_stone_e,  Cblank,         // 120
-  Cblank,              Cblank,         Cblank,         Cblank,         // 124
-
-  Cblank,              Croundwall_1,   Cgrass,         Csteel_1,       // 128
-  Cwall_1,             Ckey_1,         Ckey_2,         Ckey_3,         // 132
+  Cacid_8,             Cpause,         Cpause,         Cpause,         // 108
+  Cpause,              Cpause,         Cpush_nut_w,    Cpush_nut_e,    // 112
+  Csteel_1,            Cdynamite_4,    Cblank,         Cpush_bomb_w,   // 116
+  Cpush_bomb_e,                Cpush_stone_w,  Cpush_stone_e,  Cpause,         // 120
+  Cpause,              Cpause,         Cpause,         Cpause,         // 124
+
+  Cblank,              Croundwall_2,   Cgrass,         Csteel_2,       // 128
+  Cwall_2,             Ckey_1,         Ckey_2,         Ckey_3,         // 132
   Ckey_4,              Cdoor_1,        Cdoor_2,        Cdoor_3,        // 136
   Cdoor_4,             Cfake_amoeba,   Cfake_door_1,   Cfake_door_2,   // 140
-
   Cfake_door_3,                Cfake_door_4,   Cwonderwall,    Cwheel,         // 144
   Csand,               Cacid_nw,       Cacid_ne,       Cacid_sw,       // 148
   Cacid_se,            Cfake_blank,    Camoeba_1,      Camoeba_2,      // 152
   Camoeba_3,           Camoeba_4,      Cexit,          Calpha_arrow_w, // 156
-
   Cfake_grass,         Clenses,        Cmagnify,       Cfake_blank,    // 160
-  Cfake_grass,         Cswitch,        Cswitch,        Cblank,         // 164
+  Cfake_grass,         Cswitch,        Cswitch,        Cpause,         // 164
   Cdecor_8,            Cdecor_9,       Cdecor_10,      Cdecor_5,       // 168
   Calpha_comma,                Calpha_apost,   Calpha_minus,   Cdynamite,      // 172
-
-  Csteel_3,            Cdecor_6,       Cdecor_7,       Csteel_2,       // 176
-  Croundwall_2,                Cdecor_2,       Cdecor_4,       Cdecor_3,       // 180
+  Csteel_3,            Cdecor_6,       Cdecor_7,       Csteel_1,       // 176
+  Croundwall_1,                Cdecor_2,       Cdecor_4,       Cdecor_3,       // 180
   Cwind_any,           Cwind_e,        Cwind_s,        Cwind_w,        // 184
   Cwind_n,             Cdirt,          Cplant,         Ckey_5,         // 188
 
@@ -108,21 +105,33 @@ static const short map_emc[256] =
   Cdoor_6,             Cdoor_7,        Cdoor_8,        Cbumper,        // 196
   Calpha_a,            Calpha_b,       Calpha_c,       Calpha_d,       // 200
   Calpha_e,            Calpha_f,       Calpha_g,       Calpha_h,       // 204
-
   Calpha_i,            Calpha_j,       Calpha_k,       Calpha_l,       // 208
   Calpha_m,            Calpha_n,       Calpha_o,       Calpha_p,       // 212
   Calpha_q,            Calpha_r,       Calpha_s,       Calpha_t,       // 216
   Calpha_u,            Calpha_v,       Calpha_w,       Calpha_x,       // 220
-
   Calpha_y,            Calpha_z,       Calpha_0,       Calpha_1,       // 224
   Calpha_2,            Calpha_3,       Calpha_4,       Calpha_5,       // 228
   Calpha_6,            Calpha_7,       Calpha_8,       Calpha_9,       // 232
   Calpha_perio,                Calpha_excla,   Calpha_colon,   Calpha_quest,   // 236
-
   Calpha_arrow_e,      Cdecor_1,       Cfake_door_5,   Cfake_door_6,   // 240
   Cfake_door_7,                Cfake_door_8,   Cblank,         Cblank,         // 244
-  Cblank,              Cblank,         Cblank,         Cblank,         // 248
-  Cblank,              Cblank,         Calpha_copyr,   Cfake_acid_1    // 252
+  Camoeba_5,           Camoeba_6,      Camoeba_7,      Camoeba_8,      // 248
+  Cwall_1,             Cblank,         Calpha_copyr,   Cfake_acid_1    // 252
+};
+
+static const short swap_emc[CAVE_TILE_MAX] =
+{
+  [Cdirt]              = Cgrass,
+  [Cgrass]             = Cdirt,
+
+  [Csteel_1]           = Csteel_2,
+  [Csteel_2]           = Csteel_1,
+
+  [Cwall_1]            = Cwall_2,
+  [Cwall_2]            = Cwall_1,
+
+  [Croundwall_1]       = Croundwall_2,
+  [Croundwall_2]       = Croundwall_1
 };
 
 static struct
@@ -268,6 +277,19 @@ static int eater_offset[8] =
 void convert_em_level(unsigned char *src, int file_version)
 {
   int i, x, y, temp;
+  short map_emc[256];
+
+  /* initialize element mapping */
+
+  for (i = 0; i < 256; i++)
+    map_emc[i] = map_emc_raw[i];
+
+  /* swap tiles for pre-EMC caves (older than V5/V6), if needed */
+
+  if (swapTiles_EM(file_version < FILE_VERSION_EM_V5))
+    for (i = 0; i < 256; i++)
+      if (swap_emc[map_emc[i]] != 0)
+       map_emc[i] = swap_emc[map_emc[i]];
 
   /* common to all emc caves */
 
@@ -277,8 +299,6 @@ void convert_em_level(unsigned char *src, int file_version)
   cav.time_seconds = MIN(GET_BE16(src[2110]), 9999);
   cav.gems_needed = src[2095];
 
-  cav.infinite = TRUE;
-  cav.testmode = FALSE;
   cav.teamwork = (src[2150] & 128) != 0;
 
   /* scores */
@@ -292,7 +312,7 @@ void convert_em_level(unsigned char *src, int file_version)
   cav.nut_score                = src[2090];
   cav.dynamite_score   = src[2091];
   cav.key_score                = src[2092];
-  cav.exit_score       = src[2093] * 8 / 5;
+  cav.exit_score       = src[2093];
 
   cav.lenses_score     = src[2151];
   cav.magnify_score    = src[2152];
@@ -371,6 +391,9 @@ void convert_em_level(unsigned char *src, int file_version)
     for (x = 0; x < 9; x++)
       cav.eater_array[i][x] = map_emc[src[eater_offset[i] + x]];
 
+  if (file_version < FILE_VERSION_EM_V6)
+    cav.num_eater_arrays = 4;
+
   /* ball */
 
   temp = map_emc[src[2159]];
@@ -446,10 +469,13 @@ void convert_em_level(unsigned char *src, int file_version)
 
 /* changes for game engine integration in Rocks'n'Diamonds:
  *
- * cave versions below V5 had no grass, but only sand/dirt
+ * cave versions below V5 used different objects than later versions
+ * - steel/wall/roundwall of type 1 was used instead of type 2
+ * - dirt was used instead of grass
+ * - wall codes 129, 131 and 132 are changed to 180, 179 and 252
  * - object code 130 (V6 grass) is changed to 189 (V6 dirt)
  * - object codes are changed in both cave and eater arrays
- * - only graphical change, as both objects behave the same
+ * - only graphical change, as changed objects behave the same
  *
  * acid with no base beneath it is converted to fake acid
  * - required for downunder mine 16, level 0 (and others)
@@ -460,9 +486,9 @@ static const unsigned char map_v6[256] =
   /* filter for v6 */
 
   0,0,2,2,         4,4,118,118,     8,9,10,11,       12,13,14,15,      //   0
-  16,16,18,18,     20,21,22,23,     24,25,26,27,     28,28,118,28,     //  16
+  16,16,18,18,     20,21,22,23,     24,25,26,27,     28,28,128,28,     //  16
   0,16,2,18,       36,37,37,37,     40,41,42,43,     44,45,128,128,    //  32
-  128,148,148,     148,45,45,45,    148,0,57,58,     59,60,61,62,63,   //  48
+  128,148,148,148, 45,45,45,148,    0,57,58,59,      60,61,62,63,      //  48
 
   64,65,66,67,     68,69,69,71,     72,73,74,75,     118,75,75,75,     //  64
   75,75,75,75,     75,153,153,153,  153,153,153,153, 153,153,153,153,  //  80
@@ -485,14 +511,14 @@ static const unsigned char map_v5[256] =
   /* filter for v5 */
 
   0,0,2,2,         4,4,118,118,     8,9,10,11,       12,13,14,15,      //   0
-  16,16,18,18,     20,21,22,23,     24,25,26,27,     28,28,118,28,     //  16
+  16,16,18,18,     20,21,22,23,     24,25,26,27,     28,28,128,28,     //  16
   0,16,2,18,       36,37,37,37,     147,41,42,43,    44,45,128,128,    //  32
   128,148,148,148, 45,45,45,148,    0,57,58,59,      60,61,62,63,      //  48
 
   64,65,66,67,     68,153,153,153,  153,153,153,153, 153,153,153,153,  //  64
   153,153,153,153, 153,153,153,153, 153,153,153,153, 153,153,153,153,  //  80
   153,153,153,153, 153,68,68,68,    68,68,68,68,     68,118,118,118,   //  96
-  118,118,114,115, 131,118,118,119, 120,121,122,118, 118,118,118,118,  // 112
+  118,118,114,115, 131,62,118,119,  120,121,122,118, 118,118,118,118,  // 112
 
   128,129,130,131, 132,133,134,135, 136,137,138,139, 140,141,142,143,  // 128
   144,145,146,147, 148,149,150,151, 152,153,154,155, 156,157,158,159,  // 144
@@ -510,17 +536,17 @@ static const unsigned char map_v4[256] =
   /* filter for v4 */
 
   0,0,2,2,         4,4,118,118,     8,9,10,11,       12,13,14,15,      //   0
-  16,16,18,18,     20,21,22,23,     24,25,26,27,     28,28,118,28,     //  16
+  16,16,18,18,     20,21,22,23,     24,25,26,27,     28,28,128,28,     //  16
   0,16,2,18,       36,37,37,37,     147,41,42,43,    44,45,128,128,    //  32
   128,148,148,148, 45,45,45,148,    0,153,153,59,    60,61,62,63,      //  48
 
   64,65,66,153,    153,153,153,153, 153,153,153,153, 153,153,153,153,  //  64
   153,153,153,153, 153,153,153,153, 153,153,153,153, 153,153,153,153,  //  80
   153,153,153,153, 153,153,153,153, 153,153,153,153, 153,153,153,153,  //  96
-  153,118,114,115, 131,118,118,119, 120,121,122,118, 118,118,118,118,  // 112
+  153,118,114,115, 179,62,118,119,  120,121,122,118, 118,118,118,118,  // 112
 
-  128,129,189,131, 132,133,134,135, 136,137,138,139, 140,141,142,143,  // 128
-  144,145,146,147, 148,149,150,151, 152,68,154,155,  156,157,158,160,  // 144
+  128,180,189,179, 252,133,134,135, 136,137,138,139, 140,141,142,143,  // 128
+  144,145,146,147, 148,149,150,151, 152,68,248,249,  250,251,158,160,  // 144
   160,160,160,160, 160,160,160,160, 160,160,160,160, 160,160,160,175,  // 160
   153,153,153,153, 153,153,153,153, 153,153,153,153, 153,153,68,153,   // 176
 
@@ -530,12 +556,12 @@ static const unsigned char map_v4[256] =
   240,241,153,153, 153,153,153,153, 153,153,153,153, 153,153,153,153   // 240
 };
 
-static const unsigned char map_v4_eater[32] =
+static const unsigned char map_v4_eater[28] =
 {
   /* filter for v4 eater */
 
-  128,18,2,0,      4,8,16,20,       28,37,41,45,     189,129,131,132,  //   0
-  133,134,135,136, 146,147,175,65,  66,64,2,18,      128,128,128,128   //  16
+  128,18,2,0,      4,8,16,20,       28,37,41,45,     189,180,179,252,  //   0
+  133,134,135,136, 146,147,175,65,  66,64,2,18                         //  16
 };
 
 static boolean filename_has_v1_format(char *filename)
@@ -648,7 +674,7 @@ int cleanup_em_level(unsigned char *src, int length, char *filename)
     for (i = 0; i < 2048; i++)         /* cave */
       src[i] = map_v4[src[i]];
     for (i = 2048; i < 2084; i++)      /* eaters */
-      src[i] = map_v4_eater[src[i] % 32];
+      src[i] = map_v4_eater[src[i] < 28 ? src[i] : 0];
     for (i = 2112; i < 2148; i++)      /* eaters */
       src[i] = src[i - 64];
 
@@ -665,8 +691,7 @@ int cleanup_em_level(unsigned char *src, int length, char *filename)
 
     /* if file has length of old-style level file, print (wrong) magic byte */
     if (length < 2110)
-      Error(ERR_WARN, "unknown magic byte 0x%02x at position 0x%04x",
-           src[1983], 1983);
+      Warn("unknown magic byte 0x%02x at position 0x%04x", src[1983], 1983);
 
     return FILE_VERSION_EM_UNKNOWN;
   }
@@ -759,8 +784,7 @@ int cleanup_em_level(unsigned char *src, int length, char *filename)
   /* size of v6 cave */
   length = 2172;
 
-  if (options.debug)
-    Error(ERR_DEBUG, "EM level file version: %d", file_version);
+  Debug("level:native:EM", "EM level file version: %d", file_version);
 
   return file_version;
 }