X-Git-Url: https://git.artsoft.org/?a=blobdiff_plain;f=src%2Fgame_em%2Fgraphics.c;h=5682a24ea9d5e2eba4c18766ec470a6bf05bc7c1;hb=e0585a1afaf681692e593d3d25535f21b8f301d2;hp=cc746c0c399fd44da79edc8d44e5bc458ce7b453;hpb=88c9b68c44a16e7df62557b63cc7e86731e028c9;p=rocksndiamonds.git diff --git a/src/game_em/graphics.c b/src/game_em/graphics.c index cc746c0c..5682a24e 100644 --- a/src/game_em/graphics.c +++ b/src/game_em/graphics.c @@ -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();