added optional button to restart game (door, panel and touch variants)
[rocksndiamonds.git] / src / game_em / convert.c
index d8a202d6166883b03cc5fbcdbd8987c407a248c8..f8059b539e26169688a04c398952872597188d41 100644 (file)
@@ -53,6 +53,8 @@ static const short map[CAVE_TILE_MAX] =
   [Cbomb]              = Xbomb,
   [Cnut]               = Xnut,
   [Cspring]            = Xspring,
+  [Cspring_e]          = Xspring_e,
+  [Cspring_w]          = Xspring_w,
   [Cpush_emerald_e]    = Xpush_emerald_e,
   [Cpush_emerald_w]    = Xpush_emerald_w,
   [Cpush_diamond_e]    = Xpush_diamond_e,
@@ -215,7 +217,7 @@ int map_em_element_C_to_X(int element_em_cave)
 {
   if (element_em_cave < 0 || element_em_cave >= CAVE_TILE_MAX)
   {
-    Error(ERR_WARN, "invalid EM cave element %d", element_em_cave);
+    Warn("invalid EM cave element %d", element_em_cave);
 
     return Xblank;
   }
@@ -244,7 +246,7 @@ int map_em_element_X_to_C(int element_em_game)
 
   if (element_em_game < 0 || element_em_game >= GAME_TILE_MAX)
   {
-    Error(ERR_WARN, "invalid EM game element %d", element_em_game);
+    Warn("invalid EM game element %d", element_em_game);
 
     return Cblank;
   }
@@ -252,7 +254,7 @@ int map_em_element_X_to_C(int element_em_game)
   int element_em_cave = map_reverse[element_em_game];
 
   if (element_em_cave == Cblank && element_em_game != Xblank)
-    Error(ERR_WARN, "unknown EM game element %d", element_em_game);
+    Warn("unknown EM game element %d", element_em_game);
 
   return element_em_cave;
 }
@@ -275,20 +277,25 @@ void prepare_em_level(void)
   lev.right = lev.left + lev.width;
   lev.bottom = lev.top + lev.height;
 
-  if (cav.infinite)
+  lev.infinite = game_em.use_wrap_around;
+  lev.infinite_true = cav.infinite_true;
+
+  if (lev.infinite)
   {
     /* 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];
+      int offset = (lev.infinite_true ? 0 : 1);
+
+      lev.cavecol[x] = &lev.cavecol[lev.width + x][-offset];
+      lev.nextcol[x] = &lev.nextcol[lev.width + x][-offset];
+      lev.drawcol[x] = &lev.drawcol[lev.width + x][-offset];
+      lev.boomcol[x] = &lev.boomcol[lev.width + x][-offset];
+
+      lev.cavecol[lev.right + x] = &lev.cavecol[lev.left + x][offset];
+      lev.nextcol[lev.right + x] = &lev.nextcol[lev.left + x][offset];
+      lev.drawcol[lev.right + x] = &lev.drawcol[lev.left + x][offset];
+      lev.boomcol[lev.right + x] = &lev.boomcol[lev.left + x][offset];
     }
   }
 
@@ -351,8 +358,8 @@ void prepare_em_level(void)
 
   lev.wheel_time = cav.wheel_time;
   lev.wheel_cnt  = cav.wheel_active ? cav.wheel_time : 0;
-  lev.wheel_x    = cav.wheel_x;
-  lev.wheel_y    = cav.wheel_y;
+  lev.wheel_x    = cav.wheel_x + lev.left;
+  lev.wheel_y    = cav.wheel_y + lev.top;
 
   lev.wind_time      = cav.wind_time;
   lev.wind_cnt       = cav.wind_time;
@@ -363,7 +370,8 @@ void prepare_em_level(void)
 
   lev.killed_out_of_time = FALSE;
 
-  lev.num_ball_arrays = cav.num_ball_arrays;
+  lev.num_eater_arrays = cav.num_eater_arrays;
+  lev.num_ball_arrays  = cav.num_ball_arrays;
 
   for (i = 0; i < 8; i++)
     for (j = 0; j < 9; j++)
@@ -404,7 +412,7 @@ void prepare_em_level(void)
   /* assign active players */
   for (i = 0; i < MAX_PLAYERS; i++)
   {
-    if (ply[i].exists)
+    if (ply[i].exists && isActivePlayer_EM(i))
     {
       if (players_left)
       {
@@ -458,7 +466,16 @@ void prepare_em_level(void)
   //
   // - game_em.use_single_button (default: TRUE)
   // - game_em.use_snap_key_bug (default: FALSE)
+  // - game_em.use_random_bug (default: FALSE)
   // - game_em.use_old_explosions (default: FALSE)
+  // - game_em.use_old_android (default: FALSE)
+  // - game_em.use_old_push_elements (default: FALSE)
+  // - game_em.use_old_push_into_acid (default: FALSE)
+  // - game_em.use_wrap_around (default: TRUE)
+  // - game_em.use_push_delay (default: TRUE)
+
+  if (native_em_level.file_version > FILE_VERSION_EM_V5)
+    game_em.use_push_delay = FALSE;
 
   game_em.level_solved = FALSE;
   game_em.game_over = FALSE;