X-Git-Url: https://git.artsoft.org/?a=blobdiff_plain;f=src%2Ftools.c;h=f987d323a2f550c0b778f3eda9e4fd1ec268daa9;hb=2fe0fbc2a34fd4b50081f1829931dea3ca2c4c1c;hp=2ddafd70bb928f66464c0c565ffc7f20a3c03fb7;hpb=f45528c08776cd2c87a83bf3ec7e1f7fe7b18765;p=rocksndiamonds.git diff --git a/src/tools.c b/src/tools.c index 2ddafd70..f987d323 100644 --- a/src/tools.c +++ b/src/tools.c @@ -1,13 +1,12 @@ /*********************************************************** * Rocks'n'Diamonds -- McDuffin Strikes Back! * *----------------------------------------------------------* -* ©1995 Artsoft Development * -* Holger Schemel * -* 33659 Bielefeld-Senne * -* Telefon: (0521) 493245 * -* eMail: aeglos@valinor.owl.de * -* aeglos@uni-paderborn.de * -* q99492@pbhrzx.uni-paderborn.de * +* (c) 1995-98 Artsoft Entertainment * +* Holger Schemel * +* Oststrasse 11a * +* 33604 Bielefeld * +* phone: ++49 +521 290471 * +* email: aeglos@valinor.owl.de * *----------------------------------------------------------* * tools.c * ***********************************************************/ @@ -72,7 +71,7 @@ void BackToFront() if (redraw_mask & REDRAW_TILES && redraw_tiles > REDRAWTILES_THRESHOLD) redraw_mask |= REDRAW_FIELD; - if (redraw_mask & REDRAW_FIELD || ScreenMovPos) + if (redraw_mask & REDRAW_FIELD || ScreenGfxPos) redraw_mask &= ~REDRAW_TILES; if (!redraw_mask) @@ -109,8 +108,8 @@ void BackToFront() if (soft_scrolling_on) { - fx += (local_player->MovDir & (MV_LEFT|MV_RIGHT) ? ScreenMovPos : 0); - fy += (local_player->MovDir & (MV_UP|MV_DOWN) ? ScreenMovPos : 0); + fx += (ScreenMovDir & (MV_LEFT|MV_RIGHT) ? ScreenGfxPos : 0); + fy += (ScreenMovDir & (MV_UP|MV_DOWN) ? ScreenGfxPos : 0); } XCopyArea(display,buffer,window,gc, @@ -352,16 +351,22 @@ void DrawPlayer(struct PlayerInfo *player) int jx = player->jx, jy = player->jy; int last_jx = player->last_jx, last_jy = player->last_jy; int next_jx = jx + (jx - last_jx), next_jy = jy + (jy - last_jy); - int sx = SCROLLX(jx), sy = SCROLLY(jy); + int sx = SCREENX(jx), sy = SCREENY(jy); int sxx = 0, syy = 0; int element = Feld[jx][jy]; int graphic, phase; + /* if (!player->active || player->gone || !IN_SCR_FIELD(sx,sy)) return; + */ + + if (!player->active || player->gone || + !IN_SCR_FIELD(SCREENX(last_jx),SCREENY(last_jy))) + return; #if DEBUG - if (!IN_LEV_FIELD(jx,jy) || !IN_SCR_FIELD(sx,sy)) + if (!IN_LEV_FIELD(jx,jy)) { printf("DrawPlayerField(): x = %d, y = %d\n",jx,jy); printf("DrawPlayerField(): sx = %d, sy = %d\n",sx,sy); @@ -373,9 +378,6 @@ void DrawPlayer(struct PlayerInfo *player) if (element == EL_EXPLODING) return; - if (direct_draw_on) - SetDrawtoField(DRAW_BUFFERED); - /* draw things in the field the player is leaving, if needed */ if (last_jx != jx || last_jy != jy) @@ -383,14 +385,14 @@ void DrawPlayer(struct PlayerInfo *player) if (Store[last_jx][last_jy]) { DrawLevelElement(last_jx,last_jy, Store[last_jx][last_jy]); - DrawLevelElementThruMask(last_jx,last_jy, Feld[last_jx][last_jy]); + DrawLevelFieldThruMask(last_jx,last_jy); } else if (Feld[last_jx][last_jy] == EL_DYNAMIT) DrawDynamite(last_jx,last_jy); else DrawLevelField(last_jx,last_jy); - if (player->Pushing) + if (player->Pushing && IN_SCR_FIELD(SCREENX(next_jx),SCREENY(next_jy))) { if (player->GfxPos) { @@ -404,6 +406,12 @@ void DrawPlayer(struct PlayerInfo *player) } } + if (!IN_SCR_FIELD(sx,sy)) + return; + + if (direct_draw_on) + SetDrawtoField(DRAW_BUFFERED); + /* draw things behind the player, if needed */ if (Store[jx][jy]) @@ -422,7 +430,7 @@ void DrawPlayer(struct PlayerInfo *player) else /* MV_DOWN || MV_NO_MOVING */ graphic = GFX_SPIELER1_DOWN; - graphic += player->nr * 3*HEROES_PER_LINE; + graphic += player->index_nr * 3*HEROES_PER_LINE; graphic += player->Frame; if (player->GfxPos) @@ -440,7 +448,7 @@ void DrawPlayer(struct PlayerInfo *player) if (player->Pushing && player->GfxPos) { - int px = SCROLLX(next_jx), py = SCROLLY(next_jy); + int px = SCREENX(next_jx), py = SCREENY(next_jy); if (Feld[jx][jy] == EL_SOKOBAN_FELD_LEER || Feld[next_jx][next_jy] == EL_SOKOBAN_FELD_VOLL) @@ -484,20 +492,22 @@ void DrawPlayer(struct PlayerInfo *player) DrawGraphicThruMask(sx,sy, graphic + phase); } - if (direct_draw_on) + if ((last_jx != jx || last_jy != jy) && Feld[last_jx][last_jy]==EL_EXPLODING) { - int dest_x = SX + sx*TILEX; - int dest_y = SY + sy*TILEY; - int x_size = TILEX; - int y_size = TILEY; + int phase = Frame[last_jx][last_jy]; + int delay = 2; - if (!ScreenMovPos) - { - dest_x = SX + SCROLLX(MIN(jx,last_jx))*TILEX; - dest_y = SY + SCROLLY(MIN(jy,last_jy))*TILEY; - x_size = TILEX * (1 + ABS(jx - last_jx)); - y_size = TILEY * (1 + ABS(jy - last_jy)); - } + if (phase > 2) + DrawGraphicThruMask(SCREENX(last_jx),SCREENY(last_jy), + GFX_EXPLOSION + ((phase-1)/delay-1)); + } + + if (direct_draw_on) + { + int dest_x = SX + SCREENX(MIN(jx,last_jx))*TILEX; + int dest_y = SY + SCREENY(MIN(jy,last_jy))*TILEY; + int x_size = TILEX * (1 + ABS(jx - last_jx)); + int y_size = TILEY * (1 + ABS(jy - last_jy)); XCopyArea(display,drawto_field,window,gc, dest_x,dest_y, x_size,y_size, dest_x,dest_y); @@ -531,12 +541,12 @@ void DrawGraphicAnimationExt(int x, int y, int graphic, { int phase = getGraphicAnimationPhase(frames, delay, mode); - if (!(FrameCounter % delay) && IN_SCR_FIELD(SCROLLX(x),SCROLLY(y))) + if (!(FrameCounter % delay) && IN_SCR_FIELD(SCREENX(x),SCREENY(y))) { if (mask_mode == USE_MASKING) - DrawGraphicThruMask(SCROLLX(x),SCROLLY(y), graphic + phase); + DrawGraphicThruMask(SCREENX(x),SCREENY(y), graphic + phase); else - DrawGraphic(SCROLLX(x),SCROLLY(y), graphic + phase); + DrawGraphic(SCREENX(x),SCREENY(y), graphic + phase); } } @@ -554,7 +564,6 @@ void DrawGraphicAnimationThruMask(int x, int y, int graphic, void DrawGraphic(int x, int y, int graphic) { - #if DEBUG if (!IN_SCR_FIELD(x,y)) { @@ -601,11 +610,6 @@ void DrawGraphicExt(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)) { @@ -615,6 +619,17 @@ void DrawGraphicThruMask(int x, int y, int graphic) } #endif + DrawGraphicThruMaskExt(drawto_field, FX+x*TILEX, FY+y*TILEY, graphic); + MarkTileDirty(x,y); +} + +void DrawGraphicThruMaskExt(Drawable d, int dest_x, int dest_y, int graphic) +{ + int src_x, src_y; + int tile = graphic; + Pixmap src_pixmap; + GC drawing_gc; + if (graphic >= GFX_START_ROCKSSCREEN && graphic <= GFX_END_ROCKSSCREEN) { src_pixmap = pix[PIX_BACK]; @@ -633,13 +648,10 @@ void DrawGraphicThruMask(int x, int y, int graphic) } else { - DrawGraphic(x,y,graphic); + DrawGraphicExt(d, gc, dest_x,dest_y, graphic); return; } - dest_x = FX + x*TILEX; - dest_y = FY + y*TILEY; - if (tile_clipmask[tile] != None) { XSetClipMask(display, tile_clip_gc, tile_clipmask[tile]); @@ -657,8 +669,6 @@ void DrawGraphicThruMask(int x, int y, int graphic) 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) @@ -835,7 +845,7 @@ void DrawGraphicShiftedThruMask(int x,int y, int dx,int dy, int graphic, 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 ux = LEVELX(x), uy = LEVELY(y); int graphic = el2gfx(element); int phase4 = ABS(MovPos[ux][uy])/(TILEX/4); int phase = phase4 / 2; @@ -928,8 +938,8 @@ void DrawScreenElementExt(int x, int y, int dx, int dy, int element, 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, + if (IN_LEV_FIELD(x,y) && IN_SCR_FIELD(SCREENX(x),SCREENY(y))) + DrawScreenElementExt(SCREENX(x),SCREENY(y), dx,dy, element, cut_mode, mask_mode); } @@ -955,10 +965,15 @@ void DrawLevelElementThruMask(int x, int y, int element) DrawLevelElementExt(x,y, 0,0, element, NO_CUTTING, USE_MASKING); } +void DrawLevelFieldThruMask(int x, int y) +{ + DrawLevelElementExt(x,y, 0,0, Feld[x][y], NO_CUTTING, USE_MASKING); +} + void ErdreichAnbroeckeln(int x, int y) { int i, width, height, cx,cy; - int ux = UNSCROLLX(x), uy = UNSCROLLY(y); + int ux = LEVELX(x), uy = LEVELY(y); int element, graphic; int snip = 4; static int xy[4][2] = @@ -1068,13 +1083,13 @@ void DrawScreenElement(int x, int y, int element) void DrawLevelElement(int x, int y, int element) { - if (IN_LEV_FIELD(x,y) && IN_SCR_FIELD(SCROLLX(x),SCROLLY(y))) - DrawScreenElement(SCROLLX(x),SCROLLY(y),element); + if (IN_LEV_FIELD(x,y) && IN_SCR_FIELD(SCREENX(x),SCREENY(y))) + DrawScreenElement(SCREENX(x),SCREENY(y),element); } void DrawScreenField(int x, int y) { - int ux = UNSCROLLX(x), uy = UNSCROLLY(y); + int ux = LEVELX(x), uy = LEVELY(y); int element; if (!IN_LEV_FIELD(ux,uy)) @@ -1096,13 +1111,8 @@ 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_SIEB_VOLL || + Store[ux][uy]==EL_SIEB2_VOLL) cut_mode = CUT_BELOW; if (cut_mode==CUT_ABOVE) @@ -1115,11 +1125,8 @@ void DrawScreenField(int x, int y) else 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)) { @@ -1129,8 +1136,8 @@ void DrawScreenField(int x, int y) BOOL cut_mode = NO_CUTTING; Blocked2Moving(ux,uy,&oldx,&oldy); - sx = SCROLLX(oldx); - sy = SCROLLY(oldy); + sx = SCREENX(oldx); + sy = SCREENY(oldy); horiz_move = (MovDir[oldx][oldy]==MV_LEFT || MovDir[oldx][oldy]==MV_RIGHT); if (Store[oldx][oldy]==EL_MORAST_LEER || @@ -1155,23 +1162,23 @@ void DrawScreenField(int x, int y) void DrawLevelField(int x, int y) { - if (IN_SCR_FIELD(SCROLLX(x),SCROLLY(y))) - DrawScreenField(SCROLLX(x),SCROLLY(y)); + if (IN_SCR_FIELD(SCREENX(x),SCREENY(y))) + DrawScreenField(SCREENX(x),SCREENY(y)); else if (IS_MOVING(x,y)) { int newx,newy; Moving2Blocked(x,y,&newx,&newy); - if (IN_SCR_FIELD(SCROLLX(newx),SCROLLY(newy))) - DrawScreenField(SCROLLX(newx),SCROLLY(newy)); + if (IN_SCR_FIELD(SCREENX(newx),SCREENY(newy))) + DrawScreenField(SCREENX(newx),SCREENY(newy)); } else if (IS_BLOCKED(x,y)) { int oldx,oldy; Blocked2Moving(x,y,&oldx,&oldy); - if (IN_SCR_FIELD(SCROLLX(oldx),SCROLLY(oldy))) - DrawScreenField(SCROLLX(oldx),SCROLLY(oldy)); + if (IN_SCR_FIELD(SCREENX(oldx),SCREENY(oldy))) + DrawScreenField(SCREENX(oldx),SCREENY(oldy)); } } @@ -1189,16 +1196,16 @@ void DrawMiniElement(int x, int y, int element) DrawMiniGraphic(x,y,graphic); } -void DrawMiniElementOrWall(int x, int y, int scroll_x, int scroll_y) +void DrawMiniElementOrWall(int sx, int sy, int scroll_x, int scroll_y) { - if (x+scroll_x<-1 || x+scroll_x>lev_fieldx || - y+scroll_y<-1 || y+scroll_y>lev_fieldy) - DrawMiniElement(x,y,EL_LEERRAUM); - else if (x+scroll_x==-1 || x+scroll_x==lev_fieldx || - y+scroll_y==-1 || y+scroll_y==lev_fieldy) - DrawMiniElement(x,y,EL_BETON); + int x = sx + scroll_x, y = sy + scroll_y; + + if (x<-1 || x>lev_fieldx || y<-1 || y>lev_fieldy) + DrawMiniElement(sx,sy,EL_LEERRAUM); + else if (x==-1 || x==lev_fieldx || y==-1 || y==lev_fieldy) + DrawMiniElement(sx,sy,EL_BETON); else - DrawMiniElement(x,y,Feld[x+scroll_x][y+scroll_y]); + DrawMiniElement(sx,sy,Feld[x][y]); } void DrawMicroElement(int xpos, int ypos, int element) @@ -1283,7 +1290,7 @@ void DrawMicroLevel(int xpos, int ypos) redraw_mask |= REDRAW_MICROLEV; } -int AYS_in_range(int x, int y) +int REQ_in_range(int x, int y) { if (y>DY+249 && y