X-Git-Url: https://git.artsoft.org/?a=blobdiff_plain;f=src%2Ftools.c;h=fe7f0e5cdb8375626d60258ab799893705b83fea;hb=aaef409525599bb87a6dc8c099fbc0e11a455bae;hp=bbf81e33053eeda7654a7ab8b7020b01a196f332;hpb=19b6c35938826bfd71478d7ddaf1a4729420d3b2;p=rocksndiamonds.git diff --git a/src/tools.c b/src/tools.c index bbf81e33..fe7f0e5c 100644 --- a/src/tools.c +++ b/src/tools.c @@ -65,68 +65,12 @@ void BackToFront() if (direct_draw_on && game_status == PLAYING) redraw_mask &= ~REDRAW_MAIN; - - - /* - if (ScreenMovPos && redraw_mask & REDRAW_FIELD) - { - redraw_mask |= REDRAW_FIELD; - - printf("FULL SCREEN REDRAW FORCED by ScreenMovPos == %d\n", ScreenMovPos); - } - */ - - - - /* - if (ScreenMovPos && redraw_mask & REDRAW_TILES) - { - redraw_mask |= REDRAW_FIELD; - - printf("FULL SCREEN REDRAW FORCED by ScreenMovPos == %d\n", ScreenMovPos); - } - */ - - - /* - if (ScreenMovPos && !(redraw_mask & REDRAW_FIELD)) - { - printf("OOPS!\n"); - - *((int *)NULL) = 0; - } - */ - - /* - if (IN_SCR_FIELD(JX2,JY2)) - redraw[redraw_x1 + JX2][redraw_y1 + JY2] = 0; - */ - - if (redraw_mask & REDRAW_TILES && redraw_tiles > REDRAWTILES_THRESHOLD) redraw_mask |= REDRAW_FIELD; if (redraw_mask & REDRAW_FIELD) redraw_mask &= ~REDRAW_TILES; - /* - { - static int lastFrame = 0; - - printf("FrameCounter: %d\n", FrameCounter); - - if (FrameCounter != lastFrame + 1) - { - printf("SYNC LOST! <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<\n"); - - if (FrameCounter > 100) - *((int *)NULL) = 0; - } - - lastFrame = FrameCounter; - } - */ - if (!redraw_mask) return; @@ -140,24 +84,24 @@ void BackToFront() if (redraw_mask & REDRAW_FIELD) { - int fx = FX + (PlayerMovDir & (MV_LEFT|MV_RIGHT) ? ScreenMovPos : 0); - int fy = FY + (PlayerMovDir & (MV_UP|MV_DOWN) ? ScreenMovPos : 0); - - if (game_status == PLAYING && !(redraw_mask & REDRAW_FROM_BACKBUFFER)) + if (game_status != PLAYING || redraw_mask & REDRAW_FROM_BACKBUFFER) + XCopyArea(display,backbuffer,window,gc, + REAL_SX,REAL_SY, FULL_SXSIZE,FULL_SYSIZE, + REAL_SX,REAL_SY); + else { + int fx = FX, fy = FY; + + if (soft_scrolling_on) + { + fx += (PlayerMovDir & (MV_LEFT|MV_RIGHT) ? ScreenMovPos : 0); + fy += (PlayerMovDir & (MV_UP|MV_DOWN) ? ScreenMovPos : 0); + } + XCopyArea(display,buffer,window,gc, fx,fy, SXSIZE,SYSIZE, SX,SY); - - /* - printf("FULL SCREEN REDRAW / ScreenMovPos == %d\n", ScreenMovPos); - */ - } - else - XCopyArea(display,backbuffer,window,gc, - REAL_SX,REAL_SY, FULL_SXSIZE,FULL_SYSIZE, - REAL_SX,REAL_SY); redraw_mask &= ~REDRAW_MAIN; } @@ -227,7 +171,6 @@ void BackToFront() void FadeToFront() { - /* long fading_delay = 300000; @@ -386,11 +329,6 @@ void DrawPlayerField() if (PlayerGone) return; - /* - printf("INFO: DrawPlayerField(): x = %d, y = %d\n",x,y); - */ - - #if DEBUG if (!IN_LEV_FIELD(x,y) || !IN_SCR_FIELD(sx,sy)) { @@ -409,16 +347,37 @@ void DrawPlayerField() /* draw things behind the player (EL_PFORTE* || mole/penguin/pig/dragon) */ + + + + DrawLevelField(x,y); + + + if (Store[x][y]) { DrawGraphic(sx,sy, el2gfx(Store[x][y])); draw_thru_mask = TRUE; } + else if (element!=EL_DYNAMIT && element!=EL_DYNABOMB) + { + DrawLevelField(x,y); + draw_thru_mask = TRUE; + } + + /* else if (element!=EL_LEERRAUM && element!=EL_DYNAMIT && element!=EL_DYNABOMB) { DrawLevelField(x,y); draw_thru_mask = TRUE; } + */ + + + draw_thru_mask = TRUE; + + + /* draw player himself */ @@ -443,15 +402,56 @@ void DrawPlayerField() } + if (!soft_scrolling_on && ScreenMovPos) + sxx = syy = 0; + + + if (draw_thru_mask) + DrawGraphicShiftedThruMask(sx,sy,sxx,syy,graphic,CUT_NO_CUTTING); + /* DrawGraphicThruMask(sx, sy, graphic); + */ else DrawGraphicShifted(sx,sy,sxx,syy,graphic,CUT_NO_CUTTING); /* - DrawGraphic(sx + sxx, sy + syy, graphic); + DrawGraphic(sx, sy, graphic); */ + + if (PlayerPushing && PlayerMovPos) + { + int nextJX = JX + (JX - lastJX); + int nextJY = JY + (JY - lastJY); + int px = SCROLLX(nextJX), py = SCROLLY(nextJY); + + if (Feld[JX][JY] == EL_SOKOBAN_FELD_LEER || + Feld[nextJX][nextJY] == EL_SOKOBAN_FELD_VOLL) + DrawGraphicShiftedThruMask(px,py,sxx,syy, + GFX_SOKOBAN_OBJEKT, + CUT_NO_CUTTING); + else + { + int element = Feld[nextJX][nextJY]; + int graphic = el2gfx(element); + + if (element == EL_FELSBROCKEN && sxx) + { + int phase = PlayerMovPos / (TILEX/4); + + if (PlayerMovDir == MV_LEFT) + graphic += phase; + else + graphic += phase+4; + } + + DrawGraphicShifted(px,py, sxx,syy, graphic, CUT_NO_CUTTING); + } + } + + + /* draw things in front of player (EL_DYNAMIT || EL_DYNABOMB) */ if (element == EL_DYNAMIT || element == EL_DYNABOMB) @@ -476,9 +476,19 @@ void DrawPlayerField() { int dest_x = SX+SCROLLX(x)*TILEX; int dest_y = SY+SCROLLY(y)*TILEY; + int x_size = TILEX; + int y_size = TILEY; + + if (!ScreenMovPos) + { + dest_x = SX + SCROLLX(MIN(JX,lastJX))*TILEX; + dest_y = SY + SCROLLY(MIN(JY,lastJY))*TILEY; + x_size = TILEX * (1 + ABS(JX - lastJX)); + y_size = TILEY * (1 + ABS(JY - lastJY)); + } XCopyArea(display,drawto_field,window,gc, - dest_x,dest_y, TILEX,TILEY, dest_x,dest_y); + dest_x,dest_y, x_size,y_size, dest_x,dest_y); SetDrawtoField(DRAW_DIRECT); } } @@ -856,6 +866,123 @@ void DrawElementShifted(int x, int y, int dx, int dy, int element,int cut_mode) DrawGraphic(x,y, graphic); } +void DrawGraphicShiftedThruMask(int x,int y, int dx,int dy, int graphic, + int cut_mode) +{ + int width = TILEX, height = TILEY; + int cx = 0, cy = 0; + int src_x,src_y, dest_x,dest_y; + + if (graphic < 0) + { + DrawGraphic(x,y,graphic); + return; + } + + if (dx || dy) /* Verschiebung der Grafik? */ + { + if (x < BX1) /* Element kommt von links ins Bild */ + { + x = BX1; + width = dx; + cx = TILEX - dx; + dx = 0; + } + else if (x > BX2) /* Element kommt von rechts ins Bild */ + { + x = BX2; + width = -dx; + dx = TILEX + dx; + } + else if (x==BX1 && dx<0) /* Element verläßt links das Bild */ + { + width += dx; + cx = -dx; + dx = 0; + } + else if (x==BX2 && dx>0) /* Element verläßt rechts das Bild */ + width -= dx; + else if (dx) /* allg. Bewegung in x-Richtung */ + redraw[redraw_x1 + x + SIGN(dx)][redraw_y1 + y] = TRUE; + + if (y < BY1) /* Element kommt von oben ins Bild */ + { + if (cut_mode==CUT_BELOW) /* Element oberhalb des Bildes */ + return; + + y = BY1; + height = dy; + cy = TILEY - dy; + dy = 0; + } + else if (y > BY2) /* Element kommt von unten ins Bild */ + { + y = BY2; + height = -dy; + dy = TILEY + dy; + } + else if (y==BY1 && dy<0) /* Element verläßt oben das Bild */ + { + height += dy; + cy = -dy; + dy = 0; + } + else if (dy > 0 && cut_mode==CUT_ABOVE) + { + if (y == BY2) /* Element unterhalb des Bildes */ + return; + + height = dy; + cy = TILEY-dy; + dy = TILEY; + redraw[redraw_x1 + x][redraw_y1 + y + 1] = TRUE; + } /* Element verläßt unten das Bild */ + else if (dy > 0 && (y == BY2 || cut_mode==CUT_BELOW)) + height -= dy; + else if (dy) /* allg. Bewegung in y-Richtung */ + redraw[redraw_x1 + x][redraw_y1 + y + SIGN(dy)] = TRUE; + } + + if (graphic >= GFX_START_ROCKSSCREEN && graphic <= GFX_END_ROCKSSCREEN) + { + graphic -= GFX_START_ROCKSSCREEN; + src_x = SX+(graphic % GFX_PER_LINE)*TILEX+cx; + src_y = SY+(graphic / GFX_PER_LINE)*TILEY+cy; + dest_x = FX+x*TILEX+dx; + dest_y = FY+y*TILEY+dy; + + XSetClipOrigin(display,clip_gc[PIX_BACK],dest_x-src_x,dest_y-src_y); + XCopyArea(display,pix[PIX_BACK],drawto_field,clip_gc[PIX_BACK], + src_x,src_y, width,height, dest_x,dest_y); + } + else if (graphic >= GFX_START_ROCKSHEROES && graphic <= GFX_END_ROCKSHEROES) + { + graphic -= GFX_START_ROCKSHEROES; + src_x = (graphic % HEROES_PER_LINE)*TILEX+cx; + src_y = (graphic / HEROES_PER_LINE)*TILEY+cy; + dest_x = FX+x*TILEX+dx; + dest_y = FY+y*TILEY+dy; + + XSetClipOrigin(display,clip_gc[PIX_HEROES],dest_x-src_x,dest_y-src_y); + XCopyArea(display,pix[PIX_HEROES],drawto_field,clip_gc[PIX_HEROES], + src_x,src_y, width,height, dest_x,dest_y); + } + +#if DEBUG + if (!IN_SCR_FIELD(x,y)) + { + printf("DrawGraphicShiftedThruMask(): x = %d, y = %d, graphic = %d\n", + x,y,graphic); + printf("DrawGraphicShifted(): This should never happen!\n"); + return; + } +#endif + + redraw_tiles++; + redraw[redraw_x1 + x][redraw_y1 + y] = TRUE; + redraw_mask |= REDRAW_TILES; +} + void ErdreichAnbroeckeln(int x, int y) { int i, width, height, cx,cy;