rnd-20060226-1-src
[rocksndiamonds.git] / src / tools.c
index 3c6d53fe4c936acee54dc2d7d82f1f8560e5733f..e49e0937a4ca0d879c7f42e09719033e5ccd0882 100644 (file)
@@ -127,7 +127,11 @@ void RedrawPlayfield(boolean force_redraw, int x, int y, int width, int height)
   if (game_status == GAME_MODE_PLAYING &&
       level.game_engine_type == GAME_ENGINE_TYPE_EM)
   {
+#if 1
+    RedrawPlayfield_EM(force_redraw);
+#else
     BlitScreenToBitmap_EM(backbuffer);
+#endif
   }
   else if (game_status == GAME_MODE_PLAYING && !game.envelope_active)
   {
@@ -1827,6 +1831,13 @@ void DrawPlayer(struct PlayerInfo *player)
   int last_player_frame = player->Frame;
   int frame = 0;
 
+#if 1
+  /* GfxElement[][] is set to the element the player is digging or collecting;
+     remove also for off-screen player if the player is not moving anymore */
+  if (IN_LEV_FIELD(jx, jy) && !player_is_moving)
+    GfxElement[jx][jy] = EL_UNDEFINED;
+#endif
+
   if (!player->active || !IN_SCR_FIELD(SCREENX(last_jx), SCREENY(last_jy)))
     return;
 
@@ -1864,12 +1875,14 @@ void DrawPlayer(struct PlayerInfo *player)
       DrawLevelElement(last_jx, last_jy, Back[last_jx][last_jy]);
 
       if (last_element == EL_DYNAMITE_ACTIVE ||
+         last_element == EL_EM_DYNAMITE_ACTIVE ||
          last_element == EL_SP_DISK_RED_ACTIVE)
        DrawDynamite(last_jx, last_jy);
       else
        DrawLevelFieldThruMask(last_jx, last_jy);
     }
     else if (last_element == EL_DYNAMITE_ACTIVE ||
+            last_element == EL_EM_DYNAMITE_ACTIVE ||
             last_element == EL_SP_DISK_RED_ACTIVE)
       DrawDynamite(last_jx, last_jy);
     else
@@ -3440,19 +3453,19 @@ em_object_mapping_list[] =
   },
   {
     Yspring_kill_e,                    FALSE,  FALSE,
-    EL_SPRING,                         ACTION_SLURPING, MV_BIT_RIGHT
+    EL_SPRING,                         ACTION_EATING, MV_BIT_RIGHT
   },
   {
     Yspring_kill_eB,                   FALSE,  TRUE,
-    EL_SPRING,                         ACTION_SLURPING, MV_BIT_RIGHT
+    EL_SPRING,                         ACTION_EATING, MV_BIT_RIGHT
   },
   {
     Yspring_kill_w,                    FALSE,  FALSE,
-    EL_SPRING,                         ACTION_SLURPING, MV_BIT_LEFT
+    EL_SPRING,                         ACTION_EATING, MV_BIT_LEFT
   },
   {
     Yspring_kill_wB,                   FALSE,  TRUE,
-    EL_SPRING,                         ACTION_SLURPING, MV_BIT_LEFT
+    EL_SPRING,                         ACTION_EATING, MV_BIT_LEFT
   },
   {
     Xeater_n,                          TRUE,   FALSE,
@@ -4084,27 +4097,27 @@ em_object_mapping_list[] =
   },
   {
     Xdynamite,                         TRUE,   FALSE,
-    EL_DYNAMITE,                       -1, -1
+    EL_EM_DYNAMITE,                    -1, -1
   },
   {
     Ydynamite_eat,                     FALSE,  FALSE,
-    EL_DYNAMITE,                       ACTION_COLLECTING, -1
+    EL_EM_DYNAMITE,                    ACTION_COLLECTING, -1
   },
   {
     Xdynamite_1,                       TRUE,   FALSE,
-    EL_DYNAMITE_ACTIVE,                        -1, -1
+    EL_EM_DYNAMITE_ACTIVE,             -1, -1
   },
   {
     Xdynamite_2,                       FALSE,  FALSE,
-    EL_DYNAMITE_ACTIVE,                        -1, -1
+    EL_EM_DYNAMITE_ACTIVE,             -1, -1
   },
   {
     Xdynamite_3,                       FALSE,  FALSE,
-    EL_DYNAMITE_ACTIVE,                        -1, -1
+    EL_EM_DYNAMITE_ACTIVE,             -1, -1
   },
   {
     Xdynamite_4,                       FALSE,  FALSE,
-    EL_DYNAMITE_ACTIVE,                        -1, -1
+    EL_EM_DYNAMITE_ACTIVE,             -1, -1
   },
   {
     Xbumper,                           TRUE,   FALSE,
@@ -5116,6 +5129,33 @@ int getGameFrameDelay_EM(int native_em_game_frame_delay)
   return game_frame_delay_value;
 }
 
+int getCenteredPlayerNr_EM()
+{
+  if (game.centered_player_nr_next >= 0 &&
+      !native_em_level.ply[game.centered_player_nr_next]->alive)
+    game.centered_player_nr_next = game.centered_player_nr;
+
+  if (game.centered_player_nr != game.centered_player_nr_next)
+    game.centered_player_nr = game.centered_player_nr_next;
+
+  return game.centered_player_nr;
+}
+
+int getActivePlayers_EM()
+{
+  int num_players = 0;
+  int i;
+
+  if (!tape.playing)
+    return -1;
+
+  for (i = 0; i < MAX_PLAYERS; i++)
+    if (tape.player_participates[i])
+      num_players++;
+
+  return num_players;
+}
+
 unsigned int InitRND(long seed)
 {
   if (level.game_engine_type == GAME_ENGINE_TYPE_EM)
@@ -5335,9 +5375,9 @@ void InitGraphicInfo_EM(void)
                        i == Xexit_2 ? j + 8 :
                        i == Xexit_3 ? j + 16 :
                        i == Xdynamite_1 ? 0 :
-                       i == Xdynamite_2 ? 20 :
-                       i == Xdynamite_3 ? 40 :
-                       i == Xdynamite_4 ? 60 :
+                       i == Xdynamite_2 ? 8 :
+                       i == Xdynamite_3 ? 16 :
+                       i == Xdynamite_4 ? 24 :
                        i == Xsand_stonein_1 ? j + 1 :
                        i == Xsand_stonein_2 ? j + 9 :
                        i == Xsand_stonein_3 ? j + 17 :
@@ -5449,7 +5489,7 @@ void InitGraphicInfo_EM(void)
       if (!g->double_movement && (effective_action == ACTION_FALLING ||
                                  effective_action == ACTION_MOVING  ||
                                  effective_action == ACTION_PUSHING ||
-                                 effective_action == ACTION_SLURPING))
+                                 effective_action == ACTION_EATING))
       {
        int move_dir =
          (effective_action == ACTION_FALLING ? MV_DOWN : direction);
@@ -5608,7 +5648,7 @@ void InitGraphicInfo_EM(void)
 
       if ((action == ACTION_SMASHED_BY_ROCK ||
           action == ACTION_SMASHED_BY_SPRING ||
-          action == ACTION_SLURPING) &&
+          action == ACTION_EATING) &&
          graphic_action == graphic_default)
       {
        int e = (action == ACTION_SMASHED_BY_ROCK   ? Ystone_s  :