swapped x and y dimensions in EM engine cave arrays
[rocksndiamonds.git] / src / game_em / graphics.c
index 07a965dd1cba1f7457b0de9c6efe0611bbc9f7cf..1ba8c511eed1263cfbfad8da728d3c2b898a985b 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 = Draw[x][y];
   struct GraphicInfo_EM *g = &graphic_info_em_object[tile][frame];
 
   if (!game.use_native_emc_graphics_engine)
@@ -302,8 +302,8 @@ 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);
+       SetGfxAnimation_EM(&graphic_info_em_object[Draw[x][y]][frame],
+                          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 = Draw[x][y];
       struct GraphicInfo_EM *g = &graphic_info_em_object[tile][frame];
       int obj = g->unique_identifier;
       int crm = 0;
@@ -330,15 +330,15 @@ static void animscreen(void)
              yy < 0 || yy >= EM_MAX_CAVE_HEIGHT)
            continue;
 
-         tile_next = Draw[yy][xx];
+         tile_next = 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;
 
@@ -544,18 +544,14 @@ static boolean checkIfAllPlayersAreVisible(int center_x, int center_y)
 
 void RedrawPlayfield_EM(boolean force_redraw)
 {
-  // skip redrawing playfield in warp mode or when testing tapes with "autotest"
-  if (DrawingDeactivatedField())
-    return;
-
   boolean draw_new_player_location = FALSE;
   boolean quick_relocation = setup.quick_switch;
   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;
@@ -594,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);
     }
@@ -695,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;
       }
     }
   }
@@ -764,6 +760,10 @@ void RedrawPlayfield_EM(boolean force_redraw)
       screen_y = screen_y_old;
   }
 
+  // skip redrawing playfield in warp mode or when testing tapes with "autotest"
+  if (DrawingDeactivatedField())
+    return;
+
   animscreen();
 
   for (i = 0; i < MAX_PLAYERS; i++)