X-Git-Url: https://git.artsoft.org/?a=blobdiff_plain;f=src%2Ftools.c;h=53290c195d93d05deb93c5ba8f24387e6cedbddc;hb=4b0f1eb4220d2dbe4cffb288f745661b32c96a5b;hp=35adb43553ae3d245f63530e5efcc19541585585;hpb=e1e1f0e96140865d39f667f6af11ebec5e8c9cad;p=rocksndiamonds.git diff --git a/src/tools.c b/src/tools.c index 35adb435..53290c19 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) @@ -68,7 +72,7 @@ void BackToFront() 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; if (!redraw_mask) @@ -84,6 +88,9 @@ void BackToFront() if (redraw_mask & REDRAW_FIELD) { +#ifdef MSDOS + wait_for_vsync = TRUE; +#endif if (game_status != PLAYING || redraw_mask & REDRAW_FROM_BACKBUFFER) XCopyArea(display,backbuffer,window,gc, REAL_SX,REAL_SY, FULL_SXSIZE,FULL_SYSIZE, @@ -104,9 +111,9 @@ void BackToFront() - printf("Full screen redraw (%d) (%ld)\n", - ScreenMovPos, - Counter()); +#if 0 + printf("FULL SCREEN REDRAW [%d]\n", ScreenMovPos); +#endif @@ -116,6 +123,9 @@ void BackToFront() if (redraw_mask & REDRAW_DOORS) { +#ifdef MSDOS + wait_for_vsync = TRUE; +#endif if (redraw_mask & REDRAW_DOOR_1) XCopyArea(display,backbuffer,window,gc, DX,DY, DXSIZE,DYSIZE, @@ -402,12 +412,12 @@ void DrawPlayerField() graphic += PlayerFrame; - if (PlayerMovPos) + if (PlayerGfxPos) { if (PlayerMovDir == MV_LEFT || PlayerMovDir == MV_RIGHT) - sxx = PlayerMovPos; + sxx = PlayerGfxPos; else - syy = PlayerMovPos; + syy = PlayerGfxPos; } @@ -416,6 +426,9 @@ void DrawPlayerField() + + + if (draw_thru_mask) DrawGraphicShiftedThruMask(sx,sy,sxx,syy,graphic,CUT_NO_CUTTING); /* @@ -433,7 +446,7 @@ void DrawPlayerField() - if (PlayerPushing && PlayerMovPos) + if (PlayerPushing && PlayerGfxPos) { int nextJX = JX + (JX - lastJX); int nextJY = JY + (JY - lastJY); @@ -451,12 +464,19 @@ void DrawPlayerField() if (element == EL_FELSBROCKEN && sxx) { - int phase = PlayerMovPos / (TILEX/4); + int phase = (PlayerGfxPos / (TILEX/4)); if (PlayerMovDir == MV_LEFT) graphic += phase; else - graphic += phase+4; + graphic += (phase+4)%4; + + + /* + printf("----> (%d, %d, %d)\n", + PlayerGfxPos, phase, graphic); + */ + } DrawGraphicShifted(px,py, sxx,syy, graphic, CUT_NO_CUTTING); @@ -473,12 +493,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; } @@ -519,6 +539,9 @@ static int getGraphicAnimationPhase(int frames, int delay, int mode) else phase = (FrameCounter % (delay * frames)) / delay; + if (mode == ANIM_REVERSE) + phase = -phase; + return(phase); } @@ -527,19 +550,6 @@ void DrawGraphicAnimation(int x, int y, int graphic, { int phase = getGraphicAnimationPhase(frames, delay, mode); -/* - int phase; - - if (mode == ANIM_OSCILLATE) - { - int max_anim_frames = frames*2 - 2; - phase = (FrameCounter % (delay * max_anim_frames)) / delay; - phase = (phase < frames ? phase : max_anim_frames - phase); - } - else - phase = (FrameCounter % (delay * frames)) / delay; -*/ - if (!(FrameCounter % delay) && IN_SCR_FIELD(SCROLLX(x),SCROLLY(y))) DrawGraphic(SCROLLX(x),SCROLLY(y), graphic + phase); } @@ -1469,6 +1479,9 @@ BOOL AreYouSure(char *text, unsigned int ays_state) case FocusOut: HandleFocusEvent((XFocusChangeEvent *) &event); break; + case ClientMessage: + HandleClientMessageEvent((XClientMessageEvent *) &event); + break; default: break; } @@ -1553,6 +1566,10 @@ unsigned int MoveDoor(unsigned int door_state) static unsigned int door2 = DOOR_CLOSE_2; int x, start, stepsize = 4, door_anim_delay = stepsize*5000; +#ifdef MSDOS + stepsize = 2; +#endif + if (door_state == DOOR_GET_STATE) return(door1 | door2); @@ -1656,7 +1673,9 @@ unsigned int MoveDoor(unsigned int door_state) } BackToFront(); +#ifndef MSDOS Delay(door_anim_delay); +#endif if (game_status==MAINMENU) DoAnimation();