X-Git-Url: https://git.artsoft.org/?a=blobdiff_plain;f=src%2Ftools.c;h=a2b46c8604fd3b8ac0fed0743e0a96dde455701e;hb=40a487dcc5d3028343ff9123a72b8b3839a42861;hp=a705df5603bf498f82f15aa2c42246bd067a1eef;hpb=e557b2b5d9951a4e692fd4e32a5cf45c84252c64;p=rocksndiamonds.git diff --git a/src/tools.c b/src/tools.c index a705df56..a2b46c86 100644 --- a/src/tools.c +++ b/src/tools.c @@ -23,16 +23,17 @@ #include "buttons.h" #include "joystick.h" #include "cartoons.h" +#include "network.h" #include #ifdef MSDOS -extern BOOL wait_for_vsync; +extern boolean wait_for_vsync; #endif void SetDrawtoField(int mode) { - if (mode == DRAW_BUFFERED && soft_scrolling_on) + if (mode == DRAW_BUFFERED && setup.soft_scrolling) { FX = TILEX; FY = TILEY; @@ -63,16 +64,22 @@ void SetDrawtoField(int mode) void BackToFront() { int x,y; - Drawable buffer = (drawto_field != window ? drawto_field : backbuffer); + Drawable buffer = (drawto_field == window ? backbuffer : drawto_field); - if (direct_draw_on && game_status == PLAYING) + if (setup.direct_draw && game_status == PLAYING) redraw_mask &= ~REDRAW_MAIN; if (redraw_mask & REDRAW_TILES && redraw_tiles > REDRAWTILES_THRESHOLD) redraw_mask |= REDRAW_FIELD; - if (redraw_mask & REDRAW_FIELD || ScreenGfxPos) + if (redraw_mask & REDRAW_FIELD) + redraw_mask &= ~REDRAW_TILES; + + /* + if (redraw_mask & REDRAW_FIELD || + (ScreenGfxPos && setup.soft_scrolling && game_status == PLAYING)) redraw_mask &= ~REDRAW_TILES; + */ if (!redraw_mask) return; @@ -106,7 +113,7 @@ void BackToFront() { int fx = FX, fy = FY; - if (soft_scrolling_on) + if (setup.soft_scrolling) { fx += (ScreenMovDir & (MV_LEFT|MV_RIGHT) ? ScreenGfxPos : 0); fy += (ScreenMovDir & (MV_UP|MV_DOWN) ? ScreenGfxPos : 0); @@ -188,7 +195,7 @@ void FadeToFront() /* long fading_delay = 300; - if (fading_on && (redraw_mask & REDRAW_FIELD)) + if (setup.fading && (redraw_mask & REDRAW_FIELD)) { */ @@ -256,7 +263,7 @@ void ClearWindow() XFillRectangle(display,backbuffer,gc, REAL_SX,REAL_SY, FULL_SXSIZE,FULL_SYSIZE); - if (soft_scrolling_on && game_status==PLAYING) + if (setup.soft_scrolling && game_status==PLAYING) { XFillRectangle(display,fieldbuffer,gc, 0,0, FXSIZE,FYSIZE); @@ -265,7 +272,7 @@ void ClearWindow() else SetDrawtoField(DRAW_BACKBUFFER); - if (direct_draw_on && game_status==PLAYING) + if (setup.direct_draw && game_status==PLAYING) { XFillRectangle(display,window,gc, REAL_SX,REAL_SY, FULL_SXSIZE,FULL_SYSIZE); @@ -356,11 +363,12 @@ void DrawPlayer(struct PlayerInfo *player) int element = Feld[jx][jy]; int graphic, phase; - if (!player->active || player->gone || !IN_SCR_FIELD(sx,sy)) + 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); @@ -372,9 +380,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) @@ -389,7 +394,7 @@ void DrawPlayer(struct PlayerInfo *player) else DrawLevelField(last_jx,last_jy); - if (player->Pushing) + if (player->Pushing && IN_SCR_FIELD(SCREENX(next_jx),SCREENY(next_jy))) { if (player->GfxPos) { @@ -403,6 +408,12 @@ void DrawPlayer(struct PlayerInfo *player) } } + if (!IN_SCR_FIELD(sx,sy)) + return; + + if (setup.direct_draw) + SetDrawtoField(DRAW_BUFFERED); + /* draw things behind the player, if needed */ if (Store[jx][jy]) @@ -421,7 +432,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) @@ -432,7 +443,7 @@ void DrawPlayer(struct PlayerInfo *player) syy = player->GfxPos; } - if (!soft_scrolling_on && ScreenMovPos) + if (!setup.soft_scrolling && ScreenMovPos) sxx = syy = 0; DrawGraphicShiftedThruMask(sx,sy, sxx,syy, graphic, NO_CUTTING); @@ -493,7 +504,7 @@ void DrawPlayer(struct PlayerInfo *player) GFX_EXPLOSION + ((phase-1)/delay-1)); } - if (direct_draw_on) + if (setup.direct_draw) { int dest_x = SX + SCREENX(MIN(jx,last_jx))*TILEX; int dest_y = SY + SCREENY(MIN(jy,last_jy))*TILEY; @@ -555,7 +566,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)) { @@ -602,20 +612,26 @@ 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)) { - printf("DrawGraphicThruMask(): x = %d, y = %d\n",x,y); + printf("DrawGraphicThruMask(): x = %d,y = %d, graphic = %d\n",x,y,graphic); printf("DrawGraphicThruMask(): This should never happen!\n"); return; } #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]; @@ -634,13 +650,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]); @@ -658,8 +671,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) @@ -903,7 +914,7 @@ void DrawScreenElementExt(int x, int y, int dx, int dy, int element, } else if (element==EL_MAUER_LEBT) { - BOOL links_massiv = FALSE, rechts_massiv = FALSE; + boolean links_massiv = FALSE, rechts_massiv = FALSE; if (!IN_LEV_FIELD(ux-1,uy) || IS_MAUER(Feld[ux-1][uy])) links_massiv = TRUE; @@ -1094,7 +1105,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 = NO_CUTTING; + boolean cut_mode = NO_CUTTING; if (Store[ux][uy]==EL_MORAST_LEER || Store[ux][uy]==EL_SIEB_LEER || @@ -1124,7 +1135,7 @@ void DrawScreenField(int x, int y) int oldx,oldy; int sx, sy; int horiz_move; - BOOL cut_mode = NO_CUTTING; + boolean cut_mode = NO_CUTTING; Blocked2Moving(ux,uy,&oldx,&oldy); sx = SCREENX(oldx); @@ -1224,7 +1235,7 @@ void DrawLevel() for(y=BY1; y<=BY2; y++) DrawScreenField(x,y); - if (soft_scrolling_on) + if (setup.soft_scrolling) XCopyArea(display,fieldbuffer,backbuffer,gc, FX,FY, SXSIZE,SYSIZE, SX,SY); @@ -1281,7 +1292,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 && ystate)) @@ -1428,44 +1460,51 @@ BOOL AreYouSure(char *text, unsigned int ays_state) case XK_Return: result = 1; break; + case XK_Escape: result = 0; break; + + default: + break; } + if (req_state & REQ_PLAYER) + result = 0; break; + case KeyRelease: key_joystick_mapping = 0; break; - case FocusIn: - case FocusOut: - HandleFocusEvent((XFocusChangeEvent *) &event); - break; - case ClientMessage: - HandleClientMessageEvent((XClientMessageEvent *) &event); - break; + default: + HandleOtherEvents(&event); break; } } - else if (JoystickButton() == JOY_BUTTON_NEW_PRESSED) + else if (AnyJoystickButton() == JOY_BUTTON_NEW_PRESSED) { - int joy=Joystick(); + int joy = AnyJoystick(); if (joy & JOY_BUTTON_1) result = 1; else if (joy & JOY_BUTTON_2) result = 0; } + + DoAnimation(); + + /* don't eat all CPU time */ + Delay(10); } if (game_status != MAINMENU) StopAnimation(); - if (!(ays_state & AYS_STAY_OPEN)) + if (!(req_state & REQ_STAY_OPEN)) { CloseDoor(DOOR_CLOSE_1); - if (!(ays_state & AYS_STAY_CLOSED) && (old_door_state & DOOR_OPEN_1)) + if (!(req_state & REQ_STAY_CLOSED) && (old_door_state & DOOR_OPEN_1)) { XCopyArea(display,pix[PIX_DB_DOOR],pix[PIX_DB_DOOR],gc, DOOR_GFX_PAGEX2,DOOR_GFX_PAGEY1, DXSIZE,DYSIZE, @@ -1474,6 +1513,12 @@ BOOL AreYouSure(char *text, unsigned int ays_state) } } + /* continue network game after request */ + if (options.network && + game_status == PLAYING && + req_state & REQUEST_WAIT_FOR) + SendToServer_ContinuePlaying(); + return(result); } @@ -1533,7 +1578,7 @@ unsigned int MoveDoor(unsigned int door_state) else if (door2==DOOR_CLOSE_2 && door_state & DOOR_CLOSE_2) door_state &= ~DOOR_CLOSE_2; - if (quick_doors) + if (setup.quick_doors) { stepsize = 20; door_delay_value = 0; @@ -1632,6 +1677,9 @@ unsigned int MoveDoor(unsigned int door_state) } } + if (setup.quick_doors) + StopSound(SND_OEFFNEN); + if (door_state & DOOR_ACTION_1) door1 = door_state & DOOR_ACTION_1; if (door_state & DOOR_ACTION_2)