rnd-20060207-3-src
[rocksndiamonds.git] / src / game_em / graphics.c
index cc746c0c399fd44da79edc8d44e5bc458ce7b453..5682a24ea9d5e2eba4c18766ec470a6bf05bc7c1 100644 (file)
@@ -8,9 +8,32 @@
 #include "level.h"
 
 
+#define MIN_SCREEN_X           (TILEX)
+#define MIN_SCREEN_Y           (TILEY)
+#define MAX_SCREEN_X           ((lev.width  - (SCR_FIELDX - 1)) * TILEX)
+#define MAX_SCREEN_Y           ((lev.height - (SCR_FIELDY - 1)) * TILEY)
+
+#define VALID_SCREEN_X(x)      ((x) < MIN_SCREEN_X ? MIN_SCREEN_X :    \
+                                (x) > MAX_SCREEN_X ? MAX_SCREEN_X : (x))
+#define VALID_SCREEN_Y(y)      ((y) < MIN_SCREEN_Y ? MIN_SCREEN_Y :    \
+                                (y) > MAX_SCREEN_Y ? MAX_SCREEN_Y : (y))
+
+#define PLAYER_SCREEN_X(p)     (((    frame) * ply[p].oldx +           \
+                                 (8 - frame) * ply[p].x) * TILEX / 8   \
+                                - ((SCR_FIELDX - 1) * TILEX) / 2)
+#define PLAYER_SCREEN_Y(p)     (((    frame) * ply[p].oldy +           \
+                                 (8 - frame) * ply[p].y) * TILEY / 8   \
+                                - ((SCR_FIELDY - 1) * TILEY) / 2)
+
+
 unsigned int frame;            /* current screen frame */
+#if 0
 unsigned int screen_x;         /* current scroll position */
 unsigned int screen_y;
+#else
+int screen_x;                  /* current scroll position */
+int screen_y;
+#endif
 
 /* tiles currently on screen */
 static unsigned int screentiles[MAX_BUF_YSIZE][MAX_BUF_XSIZE];
@@ -419,10 +442,16 @@ void game_initscreen(void)
   unsigned int x,y;
   int dynamite_state = ply[0].dynamite;                /* !!! ONLY PLAYER 1 !!! */
   int all_keys_state = ply[0].keys | ply[1].keys | ply[2].keys | ply[3].keys;
+  int player_nr = 0;           /* !!! FIX THIS (CENTERED TO PLAYER 1) !!! */
 
   frame = 6;
+#if 1
+  screen_x = VALID_SCREEN_X(PLAYER_SCREEN_X(player_nr));
+  screen_y = VALID_SCREEN_Y(PLAYER_SCREEN_Y(player_nr));
+#else
   screen_x = 0;
   screen_y = 0;
+#endif
 
   for (y = 0; y < MAX_BUF_YSIZE; y++)
   {
@@ -444,26 +473,37 @@ void game_initscreen(void)
 
 void RedrawPlayfield_EM()
 {
-  unsigned int i, x, y;
-
-  /* !!! FIX THIS (CENTERED TO PLAYER 1) !!! */
-  x = (frame * ply[0].oldx + (8 - frame) * ply[0].x) * TILEX / 8
-    + ((SCR_FIELDX - 1) * TILEX) / 2;
-  y = (frame * ply[0].oldy + (8 - frame) * ply[0].y) * TILEY / 8
-    + ((SCR_FIELDY - 1) * TILEY) / 2;
-
-  if (x > lev.width * TILEX)
-    x = lev.width * TILEX;
-  if (y > lev.height * TILEY)
-    y = lev.height * TILEY;
-
-  if (x < SCR_FIELDX * TILEX)
-    x = SCR_FIELDX * TILEY;
-  if (y < SCR_FIELDY * TILEY)
-    y = SCR_FIELDY * TILEY;
-
-  screen_x = x - (SCR_FIELDX - 1) * TILEX;
-  screen_y = y - (SCR_FIELDY - 1) * TILEY;
+  int player_nr = 0;           /* !!! FIX THIS (CENTERED TO PLAYER 1) !!! */
+  int sx = PLAYER_SCREEN_X(player_nr);
+  int sy = PLAYER_SCREEN_Y(player_nr);
+  int i;
+
+#if 1
+
+  int offset = (setup.scroll_delay ? 3 : 0) * TILEX;
+
+  /* calculate new screen scrolling position, with regard to scroll delay */
+  screen_x = VALID_SCREEN_X(sx < screen_x - offset ? sx + offset :
+                           sx > screen_x + offset ? sx - offset : screen_x);
+  screen_y = VALID_SCREEN_Y(sy < screen_y - offset ? sy + offset :
+                           sy > screen_y + offset ? sy - offset : screen_y);
+
+#else
+
+  if (sx > lev.width * TILEX)
+    sx = lev.width * TILEX;
+  if (sy > lev.height * TILEY)
+    sy = lev.height * TILEY;
+
+  if (sx < SCR_FIELDX * TILEX)
+    sx = SCR_FIELDX * TILEY;
+  if (sy < SCR_FIELDY * TILEY)
+    sy = SCR_FIELDY * TILEY;
+
+  screen_x = sx - (SCR_FIELDX - 1) * TILEX;
+  screen_y = sy - (SCR_FIELDY - 1) * TILEY;
+
+#endif
 
   animscreen();