added optional button to restart game (door, panel and touch variants)
[rocksndiamonds.git] / src / game_em / graphics.c
index 19000a7de764047c836a1e6b2e943ccab698cf8a..a3e941a56e7b5f77b0a75f0be73ddfabcceb39ed 100644 (file)
@@ -49,6 +49,14 @@ static int crumbled_state[MAX_PLAYFIELD_WIDTH + 2][MAX_PLAYFIELD_HEIGHT + 2];
 struct GraphicInfo_EM graphic_info_em_object[GAME_TILE_MAX][8];
 struct GraphicInfo_EM graphic_info_em_player[MAX_PLAYERS][PLY_MAX][8];
 
+static struct XY xy_topdown[] =
+{
+  {  0, -1 },
+  { -1,  0 },
+  { +1,  0 },
+  {  0, +1 }
+};
+
 static void setScreenCenteredToAllPlayers(int *, int *);
 
 int getFieldbufferOffsetX_EM(void)
@@ -301,13 +309,7 @@ static void animscreen(void)
   int x, y, i;
   int left = screen_x / TILEX;
   int top  = screen_y / TILEY;
-  static int xy[4][2] =
-  {
-    { 0, -1 },
-    { -1, 0 },
-    { +1, 0 },
-    { 0, +1 }
-  };
+  struct XY *xy = xy_topdown;
 
   if (!game.use_native_emc_graphics_engine)
     for (y = lev.top; y < lev.bottom; y++)
@@ -333,8 +335,8 @@ static void animscreen(void)
       {
        for (i = 0; i < 4; i++)
        {
-         int xx = x + xy[i][0];
-         int yy = y + xy[i][1];
+         int xx = x + xy[i].x;
+         int yy = y + xy[i].y;
          int tile_next;
 
          if (xx < 0 || xx >= CAVE_BUFFER_WIDTH ||
@@ -441,11 +443,20 @@ static void blitplayer(int nr)
       ply[nr].x > lev.right - 1)
   {
     struct PLAYER ply_last = ply[nr];
+    int direction = (ply[nr].x < lev.left ? -1 : 1);
     int dx = ply[nr].x - ply[nr].prev_x;
 
-    ply[nr].x = (ply[nr].x < lev.left ? lev.right - 1 : lev.left);
+    ply[nr].x += -direction * lev.width;
     ply[nr].prev_x = ply[nr].x - dx;
 
+    if (!lev.infinite_true)
+    {
+      int dy = ply[nr].y - ply[nr].prev_y;
+
+      ply[nr].y += direction;
+      ply[nr].prev_y = ply[nr].y - dy;
+    }
+
     /* draw player entering playfield from the opposite side */
     blitplayer_ext(nr);
 
@@ -544,11 +555,13 @@ static void setMinimalPlayerBoundaries(int *sx1, int *sy1, int *sx2, int *sy2)
 boolean checkIfAllPlayersFitToScreen(void)
 {
   int sx1 = 0, sy1 = 0, sx2 = 0, sy2 = 0;
+  int scr_fieldx = getScreenFieldSizeX();
+  int scr_fieldy = getScreenFieldSizeY();
 
   setMinimalPlayerBoundaries(&sx1, &sy1, &sx2, &sy2);
 
-  return (sx2 - sx1 <= SCR_FIELDX * TILEX &&
-         sy2 - sy1 <= SCR_FIELDY * TILEY);
+  return (sx2 - sx1 <= scr_fieldx * TILEX &&
+         sy2 - sy1 <= scr_fieldy * TILEY);
 }
 
 static void setScreenCenteredToAllPlayers(int *sx, int *sy)
@@ -666,8 +679,11 @@ void RedrawPlayfield_EM(boolean force_redraw)
 
     if (draw_new_player_location_wrap)
     {
-      // when wrapping around (horizontally), keep vertical player position
-      screen_yy = screen_y;
+      if (lev.infinite_true)
+      {
+       // when wrapping around (horizontally), keep vertical player position
+       screen_yy = screen_y;
+      }
 
       // scrolling for wrapping should be faster than for switching players
       wait_delay_value /= 4;