added separate playfield and buffer sizes for EM engine caves
[rocksndiamonds.git] / src / game_em / graphics.c
index fee2a181d70aaf8cf42808d3f444beee21328bb8..548b24db1c7e29680e687fa64fa1b9673665e04d 100644 (file)
@@ -34,15 +34,15 @@ int frame;                          /* current screen frame */
 int screen_x, screen_y;                        /* current scroll position */
 
 /* tiles currently on screen */
-static int screentiles[MAX_PLAYFIELD_HEIGHT + 2][MAX_PLAYFIELD_WIDTH + 2];
-static int crumbled_state[MAX_PLAYFIELD_HEIGHT + 2][MAX_PLAYFIELD_WIDTH + 2];
+static int screentiles[MAX_PLAYFIELD_WIDTH + 2][MAX_PLAYFIELD_HEIGHT + 2];
+static int crumbled_state[MAX_PLAYFIELD_WIDTH + 2][MAX_PLAYFIELD_HEIGHT + 2];
 
-int getFieldbufferOffsetX_EM()
+int getFieldbufferOffsetX_EM(void)
 {
   return screen_x % TILEX;
 }
 
-int getFieldbufferOffsetY_EM()
+int getFieldbufferOffsetY_EM(void)
 {
   return screen_y % TILEY;
 }
@@ -109,7 +109,7 @@ void BackToFront_EM(void)
 
 static struct GraphicInfo_EM *getObjectGraphic(int x, int y)
 {
-  int tile = Draw[y][x];
+  int tile = lev.draw[x][y];
   struct GraphicInfo_EM *g = &graphic_info_em_object[tile][frame];
 
   if (!game.use_native_emc_graphics_engine)
@@ -300,10 +300,10 @@ static void animscreen(void)
   };
 
   if (!game.use_native_emc_graphics_engine)
-    for (y = 2; y < EM_MAX_CAVE_HEIGHT - 2; y++)
-      for (x = 2; x < EM_MAX_CAVE_WIDTH - 2; x++)
-       SetGfxAnimation_EM(&graphic_info_em_object[Draw[y][x]][frame],
-                          Draw[y][x], 7 - frame, x - 2, y - 2);
+    for (y = 2; y < CAVE_BUFFER_HEIGHT - 2; y++)
+      for (x = 2; x < CAVE_BUFFER_WIDTH - 2; x++)
+       SetGfxAnimation_EM(&graphic_info_em_object[lev.draw[x][y]][frame],
+                          lev.draw[x][y], 7 - frame, x - 2, y - 2);
 
   for (y = top; y < top + MAX_BUF_YSIZE; y++)
   {
@@ -311,7 +311,7 @@ static void animscreen(void)
     {
       int sx = x % MAX_BUF_XSIZE;
       int sy = y % MAX_BUF_YSIZE;    
-      int tile = Draw[y][x];
+      int tile = lev.draw[x][y];
       struct GraphicInfo_EM *g = &graphic_info_em_object[tile][frame];
       int obj = g->unique_identifier;
       int crm = 0;
@@ -326,19 +326,19 @@ static void animscreen(void)
          int yy = y + xy[i][1];
          int tile_next;
 
-         if (xx < 0 || xx >= EM_MAX_CAVE_WIDTH ||
-             yy < 0 || yy >= EM_MAX_CAVE_HEIGHT)
+         if (xx < 0 || xx >= CAVE_BUFFER_WIDTH ||
+             yy < 0 || yy >= CAVE_BUFFER_HEIGHT)
            continue;
 
-         tile_next = Draw[yy][xx];
+         tile_next = lev.draw[xx][yy];
 
          if (!graphic_info_em_object[tile_next][frame].has_crumbled_graphics)
            crm |= (1 << i);
        }
       }
 
-      redraw_screen_tile = (screentiles[sy][sx]    != obj ||
-                           crumbled_state[sy][sx] != crm);
+      redraw_screen_tile = (screentiles[sx][sy]    != obj ||
+                           crumbled_state[sx][sy] != crm);
 
       /* only redraw screen tiles if they (or their crumbled state) changed */
       if (redraw_screen_tile)
@@ -346,8 +346,8 @@ static void animscreen(void)
        DrawLevelField_EM(x, y, sx, sy, FALSE);
        DrawLevelFieldCrumbled_EM(x, y, sx, sy, crm, FALSE);
 
-       screentiles[sy][sx] = obj;
-       crumbled_state[sy][sx] = crm;
+       screentiles[sx][sy] = obj;
+       crumbled_state[sx][sy] = crm;
       }
     }
   }
@@ -386,7 +386,7 @@ static void blitplayer(struct PLAYER *ply)
     int old_sy = old_y % MAX_BUF_YSIZE;
     int new_sx = new_x % MAX_BUF_XSIZE;
     int new_sy = new_y % MAX_BUF_YSIZE;
-    int new_crm = crumbled_state[new_sy][new_sx];
+    int new_crm = crumbled_state[new_sx][new_sy];
 
     /* only diggable elements can be crumbled in the classic EM engine */
     boolean player_is_digging = (new_crm != 0);
@@ -416,8 +416,8 @@ static void blitplayer(struct PLAYER *ply)
     }
 
     /* redraw screen tiles in the next frame (player may have left the tiles) */
-    screentiles[old_sy][old_sx] = -1;
-    screentiles[new_sy][new_sx] = -1;
+    screentiles[old_sx][old_sy] = -1;
+    screentiles[new_sx][new_sy] = -1;
   }
 }
 
@@ -437,8 +437,8 @@ void game_initscreen(void)
   {
     for (x = 0; x < MAX_BUF_XSIZE; x++)
     {
-      screentiles[y][x] = -1;
-      crumbled_state[y][x] = 0;
+      screentiles[x][y] = -1;
+      crumbled_state[x][y] = 0;
     }
   }
 }
@@ -501,7 +501,7 @@ static void setMinimalPlayerBoundaries(int *sx1, int *sy1, int *sx2, int *sy2)
   }
 }
 
-boolean checkIfAllPlayersFitToScreen()
+boolean checkIfAllPlayersFitToScreen(void)
 {
   int sx1 = 0, sy1 = 0, sx2 = 0, sy2 = 0;
 
@@ -549,9 +549,9 @@ void RedrawPlayfield_EM(boolean force_redraw)
   int max_center_distance_player_nr =
     getMaxCenterDistancePlayerNr(screen_x, screen_y);
   int stepsize = TILEX / 8;
-  int offset = game.scroll_delay_value * TILEX;
-  int offset_x = offset;
-  int offset_y = offset;
+  int offset_raw = game.scroll_delay_value;
+  int offset_x = MIN(offset_raw, (SCR_FIELDX - 2) / 2) * TILEX;
+  int offset_y = MIN(offset_raw, (SCR_FIELDY - 2) / 2) * TILEY;
   int screen_x_old = screen_x;
   int screen_y_old = screen_y;
   int x, y, sx, sy;
@@ -590,7 +590,7 @@ void RedrawPlayfield_EM(boolean force_redraw)
 
   if (game.centered_player_nr == -1)
   {
-    if (draw_new_player_location || offset == 0)
+    if (draw_new_player_location || offset_raw == 0)
     {
       setScreenCenteredToAllPlayers(&sx, &sy);
     }
@@ -691,8 +691,8 @@ void RedrawPlayfield_EM(boolean force_redraw)
     {
       for (x = 0; x < MAX_BUF_XSIZE; x++)
       {
-       screentiles[y][x] = -1;
-       crumbled_state[y][x] = 0;
+       screentiles[x][y] = -1;
+       crumbled_state[x][y] = 0;
       }
     }
   }