changed some initial cave elements for EM engine
[rocksndiamonds.git] / src / game_em / reademc.c
index 2036e5cb6af9029a670de68ad19bcb63dc82a825..f93e495b276d411bea86e66f7fcf5963d36d1494 100644 (file)
@@ -41,7 +41,6 @@
  */
 
 #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] =
 {
@@ -66,8 +65,8 @@ static const short map_emc[256] =
   Xdynamite_2,         Xdynamite_3,    Xdynamite_4,    Xacid_s,
 
   Xexit_1,             Xexit_2,        Xexit_3,        Xballoon,
-  Xplant,              Xspring,        Xspring_fall,   Xspring_w,
-  Xspring_e,           Xball_1,        Xball_2,        Xandroid,
+  Xplant,              Xspring,        Xspring,        Xpush_spring_w,
+  Xpush_spring_e,      Xball_1,        Xball_2,        Xandroid,
   Xblank,              Xandroid,       Xandroid,       Xandroid,
 
   Xandroid,            Xandroid,       Xandroid,       Xandroid,
@@ -98,7 +97,7 @@ static const short map_emc[256] =
   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,
+  Xalpha_comma,                Xalpha_apost,   Xalpha_minus,   Xdynamite,
 
   Xsteel_3,            Xdecor_6,       Xdecor_7,       Xsteel_2,
   Xroundwall_2,                Xdecor_2,       Xdecor_4,       Xdecor_3,
@@ -126,18 +125,196 @@ static const short map_emc[256] =
   Xblank,              Xblank,         Xalpha_copyr,   Xfake_acid_1
 };
 
-static int get_em_element(unsigned short em_element_raw, int file_version)
+static void init_android_clone_table(short android_clone_bits)
 {
-  int em_element = map_emc[em_element_raw];
+  boolean android_emerald      = (android_clone_bits & 1)      != 0;
+  boolean android_diamond      = (android_clone_bits & 2)      != 0;
+  boolean android_stone                = (android_clone_bits & 4)      != 0;
+  boolean android_bomb         = (android_clone_bits & 8)      != 0;
+  boolean android_nut          = (android_clone_bits & 16)     != 0;
+  boolean android_tank         = (android_clone_bits & 32)     != 0;
+  boolean android_eater                = (android_clone_bits & 64)     != 0;
+  boolean android_bug          = (android_clone_bits & 128)    != 0;
+  boolean android_alien                = (android_clone_bits & 256)    != 0;
+  boolean android_spring       = (android_clone_bits & 512)    != 0;
+  boolean android_balloon      = (android_clone_bits & 1024)   != 0;
+  boolean android_amoeba       = (android_clone_bits & 2048)   != 0;
+  boolean android_dynamite     = (android_clone_bits & 4096)   != 0;
+  int i;
+
+  for (i = 0; i < TILE_MAX; i++)
+    cav.android_array[i] = Xblank;
+
+  if (android_eater)
+  {
+    cav.android_array[Xeater_n]                = Xeater_n;
+    cav.android_array[Yeater_nB]       = Xeater_n;
+
+    cav.android_array[Xeater_e]                = Xeater_e;
+    cav.android_array[Yeater_eB]       = Xeater_e;
+
+    cav.android_array[Xeater_s]                = Xeater_s;
+    cav.android_array[Yeater_sB]       = Xeater_s;
+
+    cav.android_array[Xeater_w]                = Xeater_w;
+    cav.android_array[Yeater_wB]       = Xeater_w;
+  }
+
+  if (android_alien)
+  {
+    cav.android_array[Xalien]          = Xalien;
+    cav.android_array[Xalien_pause]    = Xalien;
+    cav.android_array[Yalien_nB]       = Xalien;
+    cav.android_array[Yalien_eB]       = Xalien;
+    cav.android_array[Yalien_sB]       = Xalien;
+    cav.android_array[Yalien_wB]       = Xalien;
+  }
+
+  if (android_bug)
+  {
+    cav.android_array[Xbug_1_n]                = Xbug_2_n;
+    cav.android_array[Xbug_2_n]                = Xbug_2_n;
+    cav.android_array[Ybug_nB]         = Xbug_2_n;
+    cav.android_array[Ybug_n_e]                = Xbug_2_n;
+    cav.android_array[Ybug_n_w]                = Xbug_2_n;
+
+    cav.android_array[Xbug_1_e]                = Xbug_2_e;
+    cav.android_array[Xbug_2_e]                = Xbug_2_e;
+    cav.android_array[Ybug_eB]         = Xbug_2_e;
+    cav.android_array[Ybug_e_s]                = Xbug_2_e;
+    cav.android_array[Ybug_e_n]                = Xbug_2_e;
+
+    cav.android_array[Xbug_1_s]                = Xbug_2_s;
+    cav.android_array[Xbug_2_s]                = Xbug_2_s;
+    cav.android_array[Ybug_sB]         = Xbug_2_s;
+    cav.android_array[Ybug_s_w]                = Xbug_2_s;
+    cav.android_array[Ybug_s_e]                = Xbug_2_s;
+
+    cav.android_array[Xbug_1_w]                = Xbug_2_w;
+    cav.android_array[Xbug_2_w]                = Xbug_2_w;
+    cav.android_array[Ybug_wB]         = Xbug_2_w;
+    cav.android_array[Ybug_w_n]                = Xbug_2_w;
+    cav.android_array[Ybug_w_s]                = Xbug_2_w;
+  }
+
+  if (android_tank)
+  {
+    cav.android_array[Xtank_1_n]       = Xtank_1_n;
+    cav.android_array[Xtank_2_n]       = Xtank_1_n;
+    cav.android_array[Ytank_nB]                = Xtank_1_n;
+    cav.android_array[Ytank_n_e]       = Xtank_1_n;
+    cav.android_array[Ytank_n_w]       = Xtank_1_n;
+
+    cav.android_array[Xtank_1_e]       = Xtank_1_e;
+    cav.android_array[Xtank_2_e]       = Xtank_1_e;
+    cav.android_array[Ytank_eB]                = Xtank_1_e;
+    cav.android_array[Ytank_e_s]       = Xtank_1_e;
+    cav.android_array[Ytank_e_n]       = Xtank_1_e;
+
+    cav.android_array[Xtank_1_s]       = Xtank_1_s;
+    cav.android_array[Xtank_2_s]       = Xtank_1_s;
+    cav.android_array[Ytank_sB]                = Xtank_1_s;
+    cav.android_array[Ytank_s_w]       = Xtank_1_s;
+    cav.android_array[Ytank_s_e]       = Xtank_1_s;
+
+    cav.android_array[Xtank_1_w]       = Xtank_1_w;
+    cav.android_array[Xtank_2_w]       = Xtank_1_w;
+    cav.android_array[Ytank_wB]                = Xtank_1_w;
+    cav.android_array[Ytank_w_n]       = Xtank_1_w;
+    cav.android_array[Ytank_w_s]       = Xtank_1_w;
+  }
+
+  if (android_emerald)
+  {
+    cav.android_array[Xemerald]                = Xemerald;
+    cav.android_array[Xemerald_pause]  = Xemerald;
+    cav.android_array[Xemerald_fall]   = Xemerald;
+    cav.android_array[Yemerald_sB]     = Xemerald;
+    cav.android_array[Yemerald_eB]     = Xemerald;
+    cav.android_array[Yemerald_wB]     = Xemerald;
+  }
+
+  if (android_diamond)
+  {
+    cav.android_array[Xdiamond]                = Xdiamond;
+    cav.android_array[Xdiamond_pause]  = Xdiamond;
+    cav.android_array[Xdiamond_fall]   = Xdiamond;
+    cav.android_array[Ydiamond_sB]     = Xdiamond;
+    cav.android_array[Ydiamond_eB]     = Xdiamond;
+    cav.android_array[Ydiamond_wB]     = Xdiamond;
+  }
+
+  if (android_stone)
+  {
+    cav.android_array[Xstone]          = Xstone;
+    cav.android_array[Xstone_pause]    = Xstone;
+    cav.android_array[Xstone_fall]     = Xstone;
+    cav.android_array[Ystone_sB]       = Xstone;
+    cav.android_array[Ystone_eB]       = Xstone;
+    cav.android_array[Ystone_wB]       = Xstone;
+  }
 
-  if (file_version < FILE_VERSION_EM_V5)
+  if (android_bomb)
   {
-    /* versions below V5 had no grass, but only sand/dirt */
-    if (em_element == Xgrass)
-      em_element = Xdirt;
+    cav.android_array[Xbomb]           = Xbomb;
+    cav.android_array[Xbomb_pause]     = Xbomb;
+    cav.android_array[Xbomb_fall]      = Xbomb;
+    cav.android_array[Ybomb_sB]                = Xbomb;
+    cav.android_array[Ybomb_eB]                = Xbomb;
+    cav.android_array[Ybomb_wB]                = Xbomb;
   }
 
-  return em_element;
+  if (android_nut)
+  {
+    cav.android_array[Xnut]            = Xnut;
+    cav.android_array[Xnut_pause]      = Xnut;
+    cav.android_array[Xnut_fall]       = Xnut;
+    cav.android_array[Ynut_sB]         = Xnut;
+    cav.android_array[Ynut_eB]         = Xnut;
+    cav.android_array[Ynut_wB]         = Xnut;
+  }
+
+  if (android_spring)
+  {
+    cav.android_array[Xspring]         = Xspring;
+    cav.android_array[Xspring_pause]   = Xspring;
+    cav.android_array[Xspring_fall]    = Xspring;
+    cav.android_array[Xspring_e]       = Xspring;
+    cav.android_array[Xspring_w]       = Xspring;
+    cav.android_array[Yspring_sB]      = Xspring;
+    cav.android_array[Yspring_eB]      = Xspring;
+    cav.android_array[Yspring_wB]      = Xspring;
+    cav.android_array[Yspring_alien_eB]        = Xspring;
+    cav.android_array[Yspring_alien_wB]        = Xspring;
+  }
+
+  if (android_dynamite)
+  {
+    cav.android_array[Xdynamite]       = Xdynamite;
+  }
+
+  if (android_balloon)
+  {
+    cav.android_array[Xballoon]                = Xballoon;
+    cav.android_array[Yballoon_nB]     = Xballoon;
+    cav.android_array[Yballoon_eB]     = Xballoon;
+    cav.android_array[Yballoon_sB]     = Xballoon;
+    cav.android_array[Yballoon_wB]     = Xballoon;
+  }
+
+  if (android_amoeba)
+  {
+    cav.android_array[Xfake_amoeba]    = Xdrip;
+    cav.android_array[Yfake_amoeba]    = Xdrip;
+    cav.android_array[Xamoeba_1]       = Xdrip;
+    cav.android_array[Xamoeba_2]       = Xdrip;
+    cav.android_array[Xamoeba_3]       = Xdrip;
+    cav.android_array[Xamoeba_4]       = Xdrip;
+    cav.android_array[Xamoeba_5]       = Xdrip;
+    cav.android_array[Xamoeba_6]       = Xdrip;
+    cav.android_array[Xamoeba_7]       = Xdrip;
+    cav.android_array[Xamoeba_8]       = Xdrip;
+  }
 }
 
 void convert_em_level(unsigned char *src, int file_version)
@@ -149,142 +326,139 @@ void convert_em_level(unsigned char *src, int file_version)
   };
   int i, x, y, temp;
 
-  lev.time_seconds = GET_BE16(src[2110]);
-  if (lev.time_seconds > 9999)
-    lev.time_seconds = 9999;
+  /* common to all emc caves */
 
-  lev.required_initial = src[2095];
+  cav.time_seconds = MIN(GET_BE16(src[2110]), 9999);
+  cav.gems_needed = src[2095];
 
-  for (i = 0; i < 2; i++)
-  {
-    temp = GET_BE16(src[2096 + i * 2]);
-    ply[i].x_initial = (temp & 63);
-    ply[i].y_initial = (temp >> 6 & 31);
-  }
+  /* scores */
 
-  temp = GET_BE16(src[2100]) * 28;
-  if (temp > 9999)
-    temp = 9999;
-  lev.amoeba_time = temp;
-
-  lev.android_move_time  = GET_BE16(src[2164]);
-  lev.android_clone_time = GET_BE16(src[2166]);
-
-  lev.ball_random       = src[2162] & 1   ? 1 : 0;
-  lev.ball_state_initial = src[2162] & 128 ? 1 : 0;
-  lev.ball_time                 = GET_BE16(src[2160]);
-
-  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;
-
-  lev.lenses_score     = src[2151];
-  lev.magnify_score    = src[2152];
-  lev.slurp_score      = src[2153];
-
-  lev.lenses_time      = GET_BE16(src[2154]);
-  lev.magnify_time     = GET_BE16(src[2156]);
-  lev.wheel_time       = GET_BE16(src[2104]);
-
-  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);
+  cav.emerald_score    = src[2084];
+  cav.diamond_score    = src[2085];
+  cav.alien_score      = src[2086];
+  cav.tank_score       = src[2087];
+  cav.bug_score                = src[2088];
+  cav.eater_score      = src[2089];
+  cav.nut_score                = src[2090];
+  cav.dynamite_score   = src[2091];
+  cav.key_score                = src[2092];
+  cav.exit_score       = src[2093] * 8 / 5;
 
-  lev.wonderwall_time_initial = GET_BE16(src[2102]);
+  cav.lenses_score     = src[2151];
+  cav.magnify_score    = src[2152];
+  cav.slurp_score      = src[2153];
 
-  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);
+  /* times */
 
-  temp = get_em_element(src[2159], file_version);
-  for (y = 0; y < 8; y++)
-  {
-    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 */
-    }
-  }
+  cav.android_move_time  = MIN(GET_BE16(src[2164]), 9999);
+  cav.android_clone_time = MIN(GET_BE16(src[2166]), 9999);
+  cav.ball_time                 = MIN(GET_BE16(src[2160]), 9999);
+
+  cav.lenses_time      = MIN(GET_BE16(src[2154]), 9999);
+  cav.magnify_time     = MIN(GET_BE16(src[2156]), 9999);
+  cav.wheel_time       = MIN(GET_BE16(src[2104]), 9999);
 
-  temp = GET_BE16(src[2168]);
-
-  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;
+  cav.amoeba_time      = MIN(GET_BE16(src[2100]) * 28, 9999);
+  cav.wonderwall_time  = MIN(GET_BE16(src[2102]), 9999);
+
+  cav.wind_cnt = src[2149] & 15 ? cav.wind_time : 0;
+  temp = src[2149];
+  cav.wind_direction = (temp & 8 ? 0 :
+                       temp & 1 ? 1 :
+                       temp & 2 ? 2 :
+                       temp & 4 ? 3 : 0);
+
+  /* global flags */
+
+  cav.ball_random = src[2162] & 1   ? 1 : 0;
+  cav.ball_state  = src[2162] & 128 ? 1 : 0;
 
   for (temp = 1; temp < 2047; temp++)
   {
     switch (src[temp])
     {
       case 36:                                 /* wonderwall */
-       lev.wonderwall_state_initial = 1;
-       lev.wonderwall_time_initial = 9999;
+       cav.wonderwall_state = 1;
+       cav.wonderwall_time = 9999;
        break;
 
       case 40:                                 /* wheel */
-       lev.wheel_x_initial = temp & 63;
-       lev.wheel_y_initial = temp >> 6;
-       lev.wheel_cnt_initial = lev.wheel_time;
+       cav.wheel_x = temp & 63;
+       cav.wheel_y = temp >> 6;
+       cav.wheel_cnt = cav.wheel_time;
        break;
 
       case 163:                                        /* fake blank */
-       lev.lenses_cnt_initial = 9999;
+       cav.lenses_cnt = 9999;
        break;
 
       case 164:                                        /* fake grass */
-       lev.magnify_cnt_initial = 9999;
+       cav.magnify_cnt = 9999;
        break;
     }
   }
 
+  /* android */
+
+  init_android_clone_table(GET_BE16(src[2168]));
+
+  /* eaters */
+
+  for (i = 0; i < 8; i++)
+    for (x = 0; x < 9; x++)
+      cav.eater_array[i][x] = map_emc[src[eater_offset[i] + x]];
+
+  /* ball */
+
+  temp = map_emc[src[2159]];
+
+  for (y = 0; y < 8; y++)
+  {
+    if (src[2162] & 1)
+    {
+      for (x = 0; x < 8; x++)
+       cav.ball_array[y][x] = temp;
+    }
+    else
+    {
+      cav.ball_array[y][1] = (src[2163] & 1)  ? temp : Xblank; /* north */
+      cav.ball_array[y][6] = (src[2163] & 2)  ? temp : Xblank; /* south */
+      cav.ball_array[y][3] = (src[2163] & 4)  ? temp : Xblank; /* west */
+      cav.ball_array[y][4] = (src[2163] & 8)  ? temp : Xblank; /* east */
+      cav.ball_array[y][7] = (src[2163] & 16) ? temp : Xblank; /* southeast */
+      cav.ball_array[y][5] = (src[2163] & 32) ? temp : Xblank; /* southwest */
+      cav.ball_array[y][2] = (src[2163] & 64) ? temp : Xblank; /* northeast */
+      cav.ball_array[y][0] = (src[2163] & 128)? temp : Xblank; /* northwest */
+    }
+  }
+
+  /* players */
+
+  for (i = 0; i < 2; i++)
+  {
+    temp = GET_BE16(src[2096 + i * 2]);
+
+    cav.player_x[i] = (temp & 63);
+    cav.player_y[i] = (temp >> 6 & 31);
+  }
+
+  /* cave */
+
   /* first fill the complete playfield with the default border element */
   for (y = 0; y < CAVE_HEIGHT; y++)
     for (x = 0; x < CAVE_WIDTH; x++)
-      native_em_level.cave[x][y] = Zborder;
+      cav.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][y] =
-       get_em_element(src[temp++], file_version);
+  for (y = 0; y < cav.height; y++)
+    for (x = 0; x < cav.width; x++)
+      cav.cave[x][y] = map_emc[src[temp++]];
 
   /* at last, set the two players at their positions in the playfield */
   /* (native EM[C] levels always have exactly two players in a level) */
   for (i = 0; i < 2; i++)
-    native_em_level.cave[ply[i].x_initial][ply[i].y_initial] = Zplayer;
+    cav.cave[cav.player_x[i]][cav.player_y[i]] = Zplayer;
 
   native_em_level.file_version = file_version;
 }
@@ -312,6 +486,14 @@ void convert_em_level(unsigned char *src, int file_version)
  * wrong bug(24 instead of 20) and tank(12 instead of 8).
  */
 
+/* changes for game engine integration in Rocks'n'Diamonds:
+ *
+ * cave versions below V5 had no grass, but only sand/dirt
+ * - 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
+ */
+
 static const unsigned char map_v6[256] =
 {
   /* filter for v6 */
@@ -376,7 +558,7 @@ static const unsigned char map_v4[256] =
   153,153,153,153, 153,153,153,153, 153,153,153,153, 153,153,153,153,
   153,118,114,115, 131,118,118,119, 120,121,122,118, 118,118,118,118,
 
-  128,129,130,131, 132,133,134,135, 136,137,138,139, 140,141,142,143,
+  128,129,189,131, 132,133,134,135, 136,137,138,139, 140,141,142,143,
   144,145,146,147, 148,149,150,151, 152,68,154,155,  156,157,158,160,
   160,160,160,160, 160,160,160,160, 160,160,160,160, 160,160,160,175,
   153,153,153,153, 153,153,153,153, 153,153,153,153, 153,153,68,153,
@@ -391,7 +573,7 @@ static const unsigned char map_v4_eater[32] =
 {
   /* filter for v4 eater */
 
-  128,18,2,0,      4,8,16,20,       28,37,41,45,     130,129,131,132,
+  128,18,2,0,      4,8,16,20,       28,37,41,45,     189,129,131,132,
   133,134,135,136, 146,147,175,65,  66,64,2,18,      128,128,128,128
 };
 
@@ -633,53 +815,21 @@ int cleanup_em_level(unsigned char *src, int length, char *filename)
   src[2098] &= 7;
   src[GET_BE16(src[2098])] = 128;
 
-  /* amoeba speed */
-  if (GET_BE16(src[2100]) > 9999)
-    PUT_BE16(src[2100], 9999);
-
-  /* time wonderwall */
-  if (GET_BE16(src[2102]) > 9999)
-    PUT_BE16(src[2102], 9999);
-
-  /* time */
-  if (GET_BE16(src[2110]) > 9999)
-    PUT_BE16(src[2110], 9999);
-
   /* wind direction */
   i = src[2149];
   i &= 15;
   i &= -i;
   src[2149] = i;
 
-  /* time lenses */
-  if (GET_BE16(src[2154]) > 9999)
-    PUT_BE16(src[2154], 9999);
-
-  /* time magnify */
-  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 (GET_BE16(src[2160]) > 9999)
-    PUT_BE16(src[2160], 9999);
-
   /* ball data */
   src[2162] &= 129;
   if (src[2162] & 1)
     src[2163] = 0;
 
-  /* android move pause */
-  if (GET_BE16(src[2164]) > 9999)
-    PUT_BE16(src[2164], 9999);
-
-  /* android clone pause */
-  if (GET_BE16(src[2166]) > 9999)
-    PUT_BE16(src[2166], 9999);
-
   /* android data */
   src[2168] &= 31;