X-Git-Url: https://git.artsoft.org/?p=rocksndiamonds.git;a=blobdiff_plain;f=src%2Ftools.c;h=08c6dc68d3a63e814933be8b4a285e60dbc89549;hp=bbf81e33053eeda7654a7ab8b7020b01a196f332;hb=c4baa69cc8d5e8398425e67498b49f4b77f8e477;hpb=19b6c35938826bfd71478d7ddaf1a4729420d3b2 diff --git a/src/tools.c b/src/tools.c index bbf81e33..08c6dc68 100644 --- a/src/tools.c +++ b/src/tools.c @@ -27,6 +27,10 @@ #include +#ifdef MSDOS +extern BOOL wait_for_vsync; +#endif + void SetDrawtoField(int mode) { if (mode == DRAW_BUFFERED && soft_scrolling_on) @@ -65,70 +69,25 @@ 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) + if (redraw_mask & REDRAW_FIELD || ScreenMovPos) redraw_mask &= ~REDRAW_TILES; - /* - { - static int lastFrame = 0; - - printf("FrameCounter: %d\n", FrameCounter); - - if (FrameCounter != lastFrame + 1) - { - printf("SYNC LOST! <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<\n"); + if (!redraw_mask) + return; - if (FrameCounter > 100) - *((int *)NULL) = 0; - } + /* synchronize X11 graphics at this point; if we would synchronize the + display immediately after the buffer switching (after the XFlush), + this could mean that we have to wait for the graphics to complete, + although we could go on doing calculations for the next frame */ - lastFrame = FrameCounter; - } - */ + XSync(display,FALSE); - if (!redraw_mask) - return; +#ifdef MSDOS + wait_for_vsync = TRUE; +#endif if (redraw_mask & REDRAW_ALL) { @@ -140,24 +99,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,9 +186,8 @@ void BackToFront() void FadeToFront() { - /* - long fading_delay = 300000; + long fading_delay = 300; if (fading_on && (redraw_mask & REDRAW_FIELD)) { @@ -250,7 +208,7 @@ void FadeToFront() REAL_SX,REAL_SY+i, FULL_SXSIZE,1, REAL_SX,REAL_SY+i); } XFlush(display); - Delay(10000); + Delay(10); } */ @@ -381,16 +339,10 @@ void DrawPlayerField() int element = Feld[x][y]; int graphic, phase; - BOOL draw_thru_mask = FALSE; 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)) { @@ -407,18 +359,43 @@ void DrawPlayerField() if (direct_draw_on) SetDrawtoField(DRAW_BUFFERED); - /* draw things behind the player (EL_PFORTE* || mole/penguin/pig/dragon) */ + /* draw things in the field the player is leaving, if needed */ - if (Store[x][y]) + if (lastJX != JX || lastJY != JY) { - DrawGraphic(sx,sy, el2gfx(Store[x][y])); - draw_thru_mask = TRUE; + if (Store[lastJX][lastJY]) + { + DrawLevelElement(lastJX,lastJY, Store[lastJX][lastJY]); + DrawLevelElementThruMask(lastJX,lastJY, Feld[lastJX][lastJY]); + } + else if (Feld[lastJX][lastJY] == EL_DYNAMIT) + DrawDynamite(lastJX,lastJY); + else + DrawLevelField(lastJX,lastJY); + + if (PlayerPushing) + { + int nextJX = JX + (JX - lastJX); + int nextJY = JY + (JY - lastJY); + + if (PlayerGfxPos) + { + if (Feld[nextJX][nextJY] == EL_SOKOBAN_FELD_VOLL) + DrawLevelElement(nextJX,nextJY, EL_SOKOBAN_FELD_LEER); + else + DrawLevelElement(nextJX,nextJY, EL_LEERRAUM); + } + else + DrawLevelField(nextJX,nextJY); + } } - else if (element!=EL_LEERRAUM && element!=EL_DYNAMIT && element!=EL_DYNABOMB) - { + + /* draw things behind the player, if needed */ + + if (Store[x][y]) + DrawLevelElement(x,y, Store[x][y]); + else if (element != EL_DYNAMIT && element != EL_DYNABOMB) DrawLevelField(x,y); - draw_thru_mask = TRUE; - } /* draw player himself */ @@ -433,24 +410,46 @@ void DrawPlayerField() graphic += PlayerFrame; - - if (PlayerMovPos) + if (PlayerGfxPos) { if (PlayerMovDir == MV_LEFT || PlayerMovDir == MV_RIGHT) - sxx = PlayerMovPos; + sxx = PlayerGfxPos; else - syy = PlayerMovPos; + syy = PlayerGfxPos; } + if (!soft_scrolling_on && ScreenMovPos) + sxx = syy = 0; - if (draw_thru_mask) - DrawGraphicThruMask(sx, sy, graphic); - else - DrawGraphicShifted(sx,sy,sxx,syy,graphic,CUT_NO_CUTTING); - /* - DrawGraphic(sx + sxx, sy + syy, graphic); - */ + DrawGraphicShiftedThruMask(sx,sy, sxx,syy, graphic, NO_CUTTING); + + if (PlayerPushing && PlayerGfxPos) + { + 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,NO_CUTTING); + else + { + int element = Feld[nextJX][nextJY]; + int graphic = el2gfx(element); + + if (element == EL_FELSBROCKEN && sxx) + { + int phase = (PlayerGfxPos / (TILEX/4)); + if (PlayerMovDir == MV_LEFT) + graphic += phase; + else + graphic += (phase+4)%4; + } + + DrawGraphicShifted(px,py, sxx,syy, graphic, NO_CUTTING, NO_MASKING); + } + } /* draw things in front of player (EL_DYNAMIT || EL_DYNABOMB) */ @@ -460,12 +459,12 @@ void DrawPlayerField() if (element == EL_DYNAMIT) { - if ((phase = (48-MovDelay[x][y])/6) > 6) + if ((phase = (96-MovDelay[x][y])/12) > 6) phase = 6; } else { - if ((phase = ((48-MovDelay[x][y])/3) % 8) > 3) + if ((phase = ((96-MovDelay[x][y])/6) % 8) > 3) phase = 7-phase; } @@ -476,11 +475,23 @@ 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); } + + MarkTileDirty(sx,sy); } static int getGraphicAnimationPhase(int frames, int delay, int mode) @@ -496,29 +507,36 @@ static int getGraphicAnimationPhase(int frames, int delay, int mode) else phase = (FrameCounter % (delay * frames)) / delay; + if (mode == ANIM_REVERSE) + phase = -phase; + return(phase); } -void DrawGraphicAnimation(int x, int y, int graphic, - int frames, int delay, int mode) +void DrawGraphicAnimationExt(int x, int y, int graphic, + int frames, int delay, int mode, int mask_mode) { int phase = getGraphicAnimationPhase(frames, delay, mode); -/* - int phase; - - if (mode == ANIM_OSCILLATE) + if (!(FrameCounter % delay) && IN_SCR_FIELD(SCROLLX(x),SCROLLY(y))) { - int max_anim_frames = frames*2 - 2; - phase = (FrameCounter % (delay * max_anim_frames)) / delay; - phase = (phase < frames ? phase : max_anim_frames - phase); + if (mask_mode == USE_MASKING) + DrawGraphicThruMask(SCROLLX(x),SCROLLY(y), graphic + phase); + else + DrawGraphic(SCROLLX(x),SCROLLY(y), graphic + phase); } - else - phase = (FrameCounter % (delay * frames)) / delay; -*/ +} - if (!(FrameCounter % delay) && IN_SCR_FIELD(SCROLLX(x),SCROLLY(y))) - DrawGraphic(SCROLLX(x),SCROLLY(y), graphic + phase); +void DrawGraphicAnimation(int x, int y, int graphic, + int frames, int delay, int mode) +{ + DrawGraphicAnimationExt(x,y, graphic, frames,delay,mode, NO_MASKING); +} + +void DrawGraphicAnimationThruMask(int x, int y, int graphic, + int frames, int delay, int mode) +{ + DrawGraphicAnimationExt(x,y, graphic, frames,delay,mode, USE_MASKING); } void DrawGraphic(int x, int y, int graphic) @@ -533,42 +551,35 @@ void DrawGraphic(int x, int y, int graphic) } #endif - DrawGraphicExt(drawto_field, gc, x, y, graphic); - redraw_tiles++; - redraw[redraw_x1 + x][redraw_y1 + y] = TRUE; - redraw_mask |= REDRAW_TILES; + DrawGraphicExt(drawto_field, gc, FX+x*TILEX, FY+y*TILEY, graphic); + MarkTileDirty(x,y); } void DrawGraphicExt(Drawable d, GC gc, int x, int y, int graphic) -{ - DrawGraphicExtHiRes(d, gc, FX+x*TILEX, FY+y*TILEY, graphic); -} - -void DrawGraphicExtHiRes(Drawable d, GC gc, int x, int y, int graphic) { if (graphic >= GFX_START_ROCKSSCREEN && graphic <= GFX_END_ROCKSSCREEN) { graphic -= GFX_START_ROCKSSCREEN; XCopyArea(display,pix[PIX_BACK],d,gc, - SX+(graphic % GFX_PER_LINE)*TILEX, - SY+(graphic / GFX_PER_LINE)*TILEY, + SX + (graphic % GFX_PER_LINE) * TILEX, + SY + (graphic / GFX_PER_LINE) * TILEY, TILEX,TILEY, x,y); } else if (graphic >= GFX_START_ROCKSHEROES && graphic <= GFX_END_ROCKSHEROES) { graphic -= GFX_START_ROCKSHEROES; XCopyArea(display,pix[PIX_HEROES],d,gc, - (graphic % HEROES_PER_LINE)*TILEX, - (graphic / HEROES_PER_LINE)*TILEY, + (graphic % HEROES_PER_LINE) * TILEX, + (graphic / HEROES_PER_LINE) * TILEY, TILEX,TILEY, x,y); } else if (graphic >= GFX_START_ROCKSFONT && graphic <= GFX_END_ROCKSFONT) { graphic -= GFX_START_ROCKSFONT; XCopyArea(display,pix[PIX_BIGFONT],d,gc, - (graphic % FONT_CHARS_PER_LINE)*TILEX, - (graphic / FONT_CHARS_PER_LINE)*TILEY + - FC_SPECIAL1*TILEY*FONT_LINES_PER_FONT, + (graphic % FONT_CHARS_PER_LINE) * TILEX, + (graphic / FONT_CHARS_PER_LINE) * TILEY + + FC_SPECIAL1 * FONT_LINES_PER_FONT * TILEY, TILEX,TILEY, x,y); } else @@ -578,6 +589,9 @@ void DrawGraphicExtHiRes(Drawable d, GC gc, int x, int y, int graphic) void DrawGraphicThruMask(int x, int y, int graphic) { int src_x,src_y, dest_x,dest_y; + int tile = graphic; + Pixmap src_pixmap; + GC drawing_gc; #if DEBUG if (!IN_SCR_FIELD(x,y)) @@ -590,27 +604,19 @@ void DrawGraphicThruMask(int x, int y, int graphic) if (graphic >= GFX_START_ROCKSSCREEN && graphic <= GFX_END_ROCKSSCREEN) { + src_pixmap = pix[PIX_BACK]; + drawing_gc = clip_gc[PIX_BACK]; graphic -= GFX_START_ROCKSSCREEN; src_x = SX+(graphic % GFX_PER_LINE)*TILEX; src_y = SY+(graphic / GFX_PER_LINE)*TILEY; - dest_x = FX+x*TILEX; - dest_y = FY+y*TILEY; - - 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, TILEX,TILEY, dest_x,dest_y); } else if (graphic >= GFX_START_ROCKSHEROES && graphic <= GFX_END_ROCKSHEROES) { + src_pixmap = pix[PIX_HEROES]; + drawing_gc = clip_gc[PIX_HEROES]; graphic -= GFX_START_ROCKSHEROES; src_x = (graphic % HEROES_PER_LINE)*TILEX; src_y = (graphic / HEROES_PER_LINE)*TILEY; - dest_x = FX+x*TILEX; - dest_y = FY+y*TILEY; - - 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, TILEX,TILEY, dest_x,dest_y); } else { @@ -618,30 +624,37 @@ void DrawGraphicThruMask(int x, int y, int graphic) return; } - redraw_tiles++; - redraw[redraw_x1 + x][redraw_y1 + y]=TRUE; - redraw_mask|=REDRAW_TILES; -} + dest_x = FX + x*TILEX; + dest_y = FY + y*TILEY; -void DrawElementThruMask(int x, int y, int element) -{ - DrawGraphicThruMask(x,y,el2gfx(element)); + if (tile_clipmask[tile] != None) + { + XSetClipMask(display, tile_clip_gc, tile_clipmask[tile]); + XSetClipOrigin(display, tile_clip_gc, dest_x,dest_y); + XCopyArea(display, src_pixmap, drawto_field, tile_clip_gc, + src_x,src_y, TILEX,TILEY, dest_x,dest_y); + } + else + { +#if DEBUG + printf("DrawGraphicThruMask(): tile '%d' needs clipping!\n", tile); +#endif + + XSetClipOrigin(display, drawing_gc, dest_x-src_x, dest_y-src_y); + XCopyArea(display, src_pixmap, drawto_field, drawing_gc, + src_x,src_y, TILEX,TILEY, dest_x,dest_y); + } + + MarkTileDirty(x,y); } void DrawMiniGraphic(int x, int y, int graphic) { - DrawMiniGraphicExt(drawto, gc, x, y, graphic); - redraw_tiles++; - redraw[x/2][y/2]=TRUE; - redraw_mask|=REDRAW_TILES; + DrawMiniGraphicExt(drawto,gc, SX+x*MINI_TILEX,SY+y*MINI_TILEY, graphic); + MarkTileDirty(x/2, y/2); } void DrawMiniGraphicExt(Drawable d, GC gc, int x, int y, int graphic) -{ - DrawMiniGraphicExtHiRes(d,gc, SX+x*MINI_TILEX,SY+y*MINI_TILEY, graphic); -} - -void DrawMiniGraphicExtHiRes(Drawable d, GC gc, int x, int y, int graphic) { if (graphic >= GFX_START_ROCKSSCREEN && graphic <= GFX_END_ROCKSSCREEN) { @@ -664,10 +677,15 @@ void DrawMiniGraphicExtHiRes(Drawable d, GC gc, int x, int y, int graphic) XFillRectangle(display,d,gc, x,y, MINI_TILEX,MINI_TILEY); } -void DrawGraphicShifted(int x,int y, int dx,int dy, int graphic, int cut_mode) +void DrawGraphicShifted(int x,int y, int dx,int dy, int graphic, + int cut_mode, int mask_mode) { int width = TILEX, height = TILEY; int cx = 0, cy = 0; + int src_x,src_y, dest_x,dest_y; + int tile = graphic; + Pixmap src_pixmap; + GC drawing_gc; if (graphic < 0) { @@ -699,7 +717,7 @@ void DrawGraphicShifted(int x,int y, int dx,int dy, int graphic, int cut_mode) 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; + MarkTileDirty(x + SIGN(dx), y); if (y < BY1) /* Element kommt von oben ins Bild */ { @@ -731,31 +749,34 @@ void DrawGraphicShifted(int x,int y, int dx,int dy, int graphic, int cut_mode) height = dy; cy = TILEY-dy; dy = TILEY; - redraw[redraw_x1 + x][redraw_y1 + y + 1] = TRUE; + MarkTileDirty(x, y + 1); } /* 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; + MarkTileDirty(x, y + SIGN(dy)); } if (graphic >= GFX_START_ROCKSSCREEN && graphic <= GFX_END_ROCKSSCREEN) { + src_pixmap = pix[PIX_BACK]; + drawing_gc = clip_gc[PIX_BACK]; graphic -= GFX_START_ROCKSSCREEN; - XCopyArea(display,pix[PIX_BACK],drawto_field,gc, - SX+(graphic % GFX_PER_LINE)*TILEX+cx, - SY+(graphic / GFX_PER_LINE)*TILEY+cy, - width,height, FX+x*TILEX+dx,FY+y*TILEY+dy); + src_x = SX+(graphic % GFX_PER_LINE)*TILEX+cx; + src_y = SY+(graphic / GFX_PER_LINE)*TILEY+cy; } else if (graphic >= GFX_START_ROCKSHEROES && graphic <= GFX_END_ROCKSHEROES) { + src_pixmap = pix[PIX_HEROES]; + drawing_gc = clip_gc[PIX_HEROES]; graphic -= GFX_START_ROCKSHEROES; - XCopyArea(display,pix[PIX_HEROES],drawto_field,gc, - (graphic % HEROES_PER_LINE)*TILEX+cx, - (graphic / HEROES_PER_LINE)*TILEY+cy, - width,height, FX+x*TILEX+dx,FY+y*TILEY+dy); + 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; + #if DEBUG if (!IN_SCR_FIELD(x,y)) { @@ -765,12 +786,41 @@ void DrawGraphicShifted(int x,int y, int dx,int dy, int graphic, int cut_mode) } #endif - redraw_tiles++; - redraw[redraw_x1 + x][redraw_y1 + y] = TRUE; - redraw_mask |= REDRAW_TILES; + if (mask_mode == USE_MASKING) + { + if (tile_clipmask[tile] != None) + { + XSetClipMask(display, tile_clip_gc, tile_clipmask[tile]); + XSetClipOrigin(display, tile_clip_gc, dest_x,dest_y); + XCopyArea(display, src_pixmap, drawto_field, tile_clip_gc, + src_x,src_y, TILEX,TILEY, dest_x,dest_y); + } + else + { +#if DEBUG + printf("DrawGraphicShifted(): tile '%d' needs clipping!\n", tile); +#endif + + XSetClipOrigin(display, drawing_gc, dest_x-src_x, dest_y-src_y); + XCopyArea(display, src_pixmap, drawto_field, drawing_gc, + src_x,src_y, width,height, dest_x,dest_y); + } + } + else + XCopyArea(display, src_pixmap, drawto_field, gc, + src_x,src_y, width,height, dest_x,dest_y); + + MarkTileDirty(x,y); +} + +void DrawGraphicShiftedThruMask(int x,int y, int dx,int dy, int graphic, + int cut_mode) +{ + DrawGraphicShifted(x,y, dx,dy, graphic, cut_mode, USE_MASKING); } -void DrawElementShifted(int x, int y, int dx, int dy, int element,int cut_mode) +void DrawScreenElementExt(int x, int y, int dx, int dy, int element, + int cut_mode, int mask_mode) { int ux = UNSCROLLX(x), uy = UNSCROLLY(y); int graphic = el2gfx(element); @@ -815,6 +865,10 @@ void DrawElementShifted(int x, int y, int dx, int dy, int element,int cut_mode) { graphic = GFX_SONDE_START + getGraphicAnimationPhase(8, 2, ANIM_NORMAL); } + else if (element==EL_SALZSAEURE) + { + graphic = GFX_GEBLUBBER + getGraphicAnimationPhase(4, 10, ANIM_NORMAL); + } else if (element==EL_BUTTERFLY || element==EL_FIREFLY) { graphic += !phase; @@ -851,11 +905,43 @@ void DrawElementShifted(int x, int y, int dx, int dy, int element,int cut_mode) } if (dx || dy) - DrawGraphicShifted(x,y, dx,dy, graphic, cut_mode); + DrawGraphicShifted(x,y, dx,dy, graphic, cut_mode, mask_mode); + else if (mask_mode == USE_MASKING) + DrawGraphicThruMask(x,y, graphic); else DrawGraphic(x,y, graphic); } +void DrawLevelElementExt(int x, int y, int dx, int dy, int element, + int cut_mode, int mask_mode) +{ + if (IN_LEV_FIELD(x,y) && IN_SCR_FIELD(SCROLLX(x),SCROLLY(y))) + DrawScreenElementExt(SCROLLX(x),SCROLLY(y), dx,dy, element, + cut_mode, mask_mode); +} + +void DrawScreenElementShifted(int x, int y, int dx, int dy, int element, + int cut_mode) +{ + DrawScreenElementExt(x,y, dx,dy, element, cut_mode, NO_MASKING); +} + +void DrawLevelElementShifted(int x, int y, int dx, int dy, int element, + int cut_mode) +{ + DrawLevelElementExt(x,y, dx,dy, element, cut_mode, NO_MASKING); +} + +void DrawScreenElementThruMask(int x, int y, int element) +{ + DrawScreenElementExt(x,y, 0,0, element, NO_CUTTING, USE_MASKING); +} + +void DrawLevelElementThruMask(int x, int y, int element) +{ + DrawLevelElementExt(x,y, 0,0, element, NO_CUTTING, USE_MASKING); +} + void ErdreichAnbroeckeln(int x, int y) { int i, width, height, cx,cy; @@ -893,10 +979,6 @@ void ErdreichAnbroeckeln(int x, int y) else element = Feld[uxx][uyy]; -/* - if (element==EL_ERDREICH || IS_SOLID(element)) - continue; -*/ if (element==EL_ERDREICH) continue; @@ -921,8 +1003,7 @@ void ErdreichAnbroeckeln(int x, int y) width,height, FX+x*TILEX+cx,FY+y*TILEY+cy); } - redraw_tiles++; - redraw[redraw_x1 + x][redraw_y1 + y] = TRUE; + MarkTileDirty(x,y); } else { @@ -936,11 +1017,6 @@ void ErdreichAnbroeckeln(int x, int y) yy = y+xy[i][1]; uxx = ux+xy[i][0]; uyy = uy+xy[i][1]; -/* - if (!IN_LEV_FIELD(uxx,uyy) || Feld[uxx][uyy]!=EL_ERDREICH || - !IN_SCR_FIELD(xx,yy) || IS_SOLID(element)) - continue; -*/ if (!IN_LEV_FIELD(uxx,uyy) || Feld[uxx][uyy]!=EL_ERDREICH || !IN_SCR_FIELD(xx,yy)) @@ -966,15 +1042,14 @@ void ErdreichAnbroeckeln(int x, int y) SY+(graphic / GFX_PER_LINE)*TILEY+cy, width,height, FX+xx*TILEX+cx,FY+yy*TILEY+cy); - redraw_tiles++; - redraw[redraw_x1 + xx][redraw_y1 + yy] = TRUE; + MarkTileDirty(xx,yy); } } } void DrawScreenElement(int x, int y, int element) { - DrawElementShifted(x,y,0,0,element,CUT_NO_CUTTING); + DrawScreenElementExt(x,y, 0,0, element, NO_CUTTING, NO_MASKING); ErdreichAnbroeckeln(x,y); } @@ -1000,7 +1075,7 @@ void DrawScreenField(int x, int y) if (IS_MOVING(ux,uy)) { int horiz_move = (MovDir[ux][uy]==MV_LEFT || MovDir[ux][uy]==MV_RIGHT); - BOOL cut_mode = CUT_NO_CUTTING; + BOOL cut_mode = NO_CUTTING; if (Store[ux][uy]==EL_MORAST_LEER || Store[ux][uy]==EL_SIEB_LEER || @@ -1008,27 +1083,37 @@ void DrawScreenField(int x, int y) Store[ux][uy]==EL_AMOEBE_NASS) cut_mode = CUT_ABOVE; else if (Store[ux][uy]==EL_MORAST_VOLL || + +#if 0 + Store[ux][uy]==EL_SALZSAEURE || +#endif + Store[ux][uy]==EL_SIEB_VOLL || - Store[ux][uy]==EL_SIEB2_VOLL || - Store[ux][uy]==EL_SALZSAEURE) + Store[ux][uy]==EL_SIEB2_VOLL) cut_mode = CUT_BELOW; if (cut_mode==CUT_ABOVE) - DrawElementShifted(x,y,0,0,Store[ux][uy],CUT_NO_CUTTING); + DrawScreenElementShifted(x,y, 0,0, Store[ux][uy], NO_CUTTING); else DrawScreenElement(x,y,EL_LEERRAUM); if (horiz_move) - DrawElementShifted(x,y,MovPos[ux][uy],0,element,CUT_NO_CUTTING); + DrawScreenElementShifted(x,y, MovPos[ux][uy],0, element, NO_CUTTING); else - DrawElementShifted(x,y,0,MovPos[ux][uy],element,cut_mode); + DrawScreenElementShifted(x,y, 0,MovPos[ux][uy], element, cut_mode); + +#if 1 + if (Store[ux][uy] == EL_SALZSAEURE) + DrawLevelElementThruMask(ux,uy+1, EL_SALZSAEURE); +#endif + } else if (IS_BLOCKED(ux,uy)) { int oldx,oldy; int sx, sy; int horiz_move; - BOOL cut_mode = CUT_NO_CUTTING; + BOOL cut_mode = NO_CUTTING; Blocked2Moving(ux,uy,&oldx,&oldy); sx = SCROLLX(oldx); @@ -1045,9 +1130,9 @@ void DrawScreenField(int x, int y) element = Feld[oldx][oldy]; if (horiz_move) - DrawElementShifted(sx,sy,MovPos[oldx][oldy],0,element,CUT_NO_CUTTING); + DrawScreenElementShifted(sx,sy, MovPos[oldx][oldy],0,element,NO_CUTTING); else - DrawElementShifted(sx,sy,0,MovPos[oldx][oldy],element,cut_mode); + DrawScreenElementShifted(sx,sy, 0,MovPos[oldx][oldy],element,cut_mode); } else if (IS_DRAWABLE(element)) DrawScreenElement(x,y,element); @@ -1089,10 +1174,6 @@ void DrawMiniElement(int x, int y, int element) graphic = el2gfx(element); DrawMiniGraphic(x,y,graphic); - - redraw_tiles++; - redraw[x/2][y/2]=TRUE; - redraw_mask|=REDRAW_TILES; } void DrawMiniElementOrWall(int x, int y, int scroll_x, int scroll_y) @@ -1270,7 +1351,7 @@ BOOL AreYouSure(char *text, unsigned int ays_state) while(result<0) { DoAnimation(); - Delay(10000); + Delay(10); if (XPending(display)) { @@ -1341,10 +1422,16 @@ BOOL AreYouSure(char *text, unsigned int ays_state) break; } break; + case KeyRelease: + key_joystick_mapping = 0; + break; case FocusIn: case FocusOut: HandleFocusEvent((XFocusChangeEvent *) &event); break; + case ClientMessage: + HandleClientMessageEvent((XClientMessageEvent *) &event); + break; default: break; } @@ -1393,10 +1480,6 @@ unsigned int OpenDoor(unsigned int door_state) new_door_state = MoveDoor(door_state); -/* - ClearEventQueue(); -*/ - return(new_door_state); } @@ -1411,10 +1494,6 @@ unsigned int CloseDoor(unsigned int door_state) new_door_state = MoveDoor(door_state); -/* - ClearEventQueue(); -*/ - return(new_door_state); } @@ -1427,7 +1506,9 @@ unsigned int MoveDoor(unsigned int door_state) { static unsigned int door1 = DOOR_OPEN_1; static unsigned int door2 = DOOR_CLOSE_2; - int x, start, stepsize = 4, door_anim_delay = stepsize*5000; + static long door_delay = 0; + int x, start, stepsize = 2; + long door_delay_value = stepsize * 5; if (door_state == DOOR_GET_STATE) return(door1 | door2); @@ -1444,7 +1525,7 @@ unsigned int MoveDoor(unsigned int door_state) if (quick_doors) { stepsize = 20; - door_anim_delay = 0; + door_delay_value = 0; StopSound(SND_OEFFNEN); } @@ -1455,8 +1536,10 @@ unsigned int MoveDoor(unsigned int door_state) start = ((door_state & DOOR_NO_DELAY) ? DXSIZE : 0); - for(x=start;x<=DXSIZE;x+=stepsize) + for(x=start; x<=DXSIZE; x+=stepsize) { + WaitUntilDelayReached(&door_delay, door_delay_value); + if (door_state & DOOR_ACTION_1) { int i = (door_state & DOOR_OPEN_1 ? DXSIZE-x : x); @@ -1532,9 +1615,8 @@ unsigned int MoveDoor(unsigned int door_state) } BackToFront(); - Delay(door_anim_delay); - if (game_status==MAINMENU) + if (game_status == MAINMENU) DoAnimation(); } }