X-Git-Url: https://git.artsoft.org/?a=blobdiff_plain;f=src%2Fgame_em%2Fgraphics.c;h=19000a7de764047c836a1e6b2e943ccab698cf8a;hb=7ef23a490275f99c802131d747e07f2feb67f43c;hp=363cb9af7eb08f31f4a67361ce5d84c214cf0dd7;hpb=038fb64da88a05a91c974dc1e3b14cf4cdc69743;p=rocksndiamonds.git diff --git a/src/game_em/graphics.c b/src/game_em/graphics.c index 363cb9af..19000a7d 100644 --- a/src/game_em/graphics.c +++ b/src/game_em/graphics.c @@ -49,6 +49,8 @@ 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 void setScreenCenteredToAllPlayers(int *, int *); + int getFieldbufferOffsetX_EM(void) { return screen_x % TILEX; @@ -368,7 +370,7 @@ static void animscreen(void) * handles transparency and movement */ -static void blitplayer(int nr) +static void blitplayer_ext(int nr) { int x1, y1, x2, y2; @@ -430,17 +432,46 @@ static void blitplayer(int nr) } } +static void blitplayer(int nr) +{ + blitplayer_ext(nr); + + /* check for wrap-around movement ... */ + if (ply[nr].x < lev.left || + ply[nr].x > lev.right - 1) + { + struct PLAYER ply_last = ply[nr]; + int dx = ply[nr].x - ply[nr].prev_x; + + ply[nr].x = (ply[nr].x < lev.left ? lev.right - 1 : lev.left); + ply[nr].prev_x = ply[nr].x - dx; + + /* draw player entering playfield from the opposite side */ + blitplayer_ext(nr); + + /* ... but keep the old player position until game logic */ + ply[nr] = ply_last; + } +} + void game_initscreen(void) { - int player_nr; - int x,y; + int x, y, sx, sy; frame = 1; - player_nr = (game.centered_player_nr != -1 ? game.centered_player_nr : 0); + if (game.centered_player_nr == -1) + { + setScreenCenteredToAllPlayers(&sx, &sy); + } + else + { + sx = PLAYER_SCREEN_X(game.centered_player_nr); + sy = PLAYER_SCREEN_Y(game.centered_player_nr); + } - screen_x = VALID_SCREEN_X(PLAYER_SCREEN_X(player_nr)); - screen_y = VALID_SCREEN_Y(PLAYER_SCREEN_Y(player_nr)); + screen_x = VALID_SCREEN_X(sx); + screen_y = VALID_SCREEN_Y(sy); for (y = 0; y < MAX_BUF_YSIZE; y++) {