X-Git-Url: https://git.artsoft.org/?a=blobdiff_plain;f=src%2Fgame.c;h=f70257edee6f852965988d0bfef6e18313b0a2a8;hb=898bbdbe51b5212cd25588c04c3a6a771fbc79f6;hp=e170331debf8e5d7f306e301144b6e8e56910b94;hpb=b7d31643c9c84104fb3ebef778e545928610ff65;p=rocksndiamonds.git diff --git a/src/game.c b/src/game.c index e170331d..f70257ed 100644 --- a/src/game.c +++ b/src/game.c @@ -49,6 +49,7 @@ void GetPlayerConfig() joystick_nr = SETUP_2ND_JOYSTICK_ON(player.setup); quick_doors = SETUP_QUICK_DOORS_ON(player.setup); scroll_delay_on = SETUP_SCROLL_DELAY_ON(player.setup); + soft_scrolling_on = SETUP_SOFT_SCROLL_ON(player.setup); if (joystick_nr != old_joystick_nr) { @@ -74,7 +75,9 @@ void InitGame() FrameCounter = 0; TimeFrames = 0; TimeLeft = level.time; + ScreenMovPos = 0; PlayerMovDir = MV_NO_MOVING; + PlayerMovPos = 0; PlayerFrame = 0; PlayerPushing = FALSE; PlayerGone = LevelSolved = GameOver = SiebAktiv = FALSE; @@ -1389,6 +1392,15 @@ void StartMoving(int x, int y) if (CAN_FALL(element) && y 2 ? 4-phase : phase)*TILEY; - dest_x = SX+SCROLLX(x)*TILEX; - dest_y = SY+SCROLLY(y)*TILEY; + dest_x = FX+SCROLLX(x)*TILEX; + dest_y = FY+SCROLLY(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], @@ -2406,9 +2418,9 @@ void EdelsteinFunkeln(int x, int y) if (direct_draw_on) { - XCopyArea(display,backbuffer,window,gc, + XCopyArea(display,drawto_field,window,gc, dest_x,dest_y, TILEX,TILEY, dest_x,dest_y); - drawto_field = window; + SetDrawtoField(DRAW_DIRECT); } } } @@ -2564,7 +2576,23 @@ void GameActions() action_delay_value = (tape.playing && tape.fast_forward ? FFWD_FRAME_DELAY : Gamespeed); + /* if (DelayReached(&action_delay, action_delay_value)) + */ + + + + if (PlayerMovPos) + ScrollFigure(0); + + DrawPlayerField(); + + + + + if (!DelayReached(&action_delay, action_delay_value)) + return; + { int x,y,element; int sieb_x = 0, sieb_y = 0; @@ -2696,6 +2724,14 @@ void GameActions() } } } + + /* + if (PlayerMovPos) + ScrollFigure(0); + + DrawPlayerField(); + */ + } if (TimeLeft>0 && TimeFrames>=25 && !tape.pausing) @@ -2715,32 +2751,66 @@ void GameActions() KillHero(); } + /* + if (PlayerMovPos) + ScrollFigure(0); + */ + + + /* + DrawPlayerField(); + */ + + + DrawPlayerField(); + + BackToFront(); } void ScrollLevel(int dx, int dy) { int x,y; + int softscroll_offset = (FX == TILEX ? TILEX : 0); + + /* + if (soft_scrolling_on) + { + ScreenMovPos = PlayerMovPos; + redraw_mask |= REDRAW_FIELD; + } + */ + + + ScreenMovPos = PlayerMovPos; + if (soft_scrolling_on) + { + redraw_mask |= REDRAW_FIELD; + } + XCopyArea(display,drawto_field,drawto_field,gc, - SX+TILEX*(dx==-1),SY+TILEY*(dy==-1), - SXSIZE-TILEX*(dx!=0),SYSIZE-TILEY*(dy!=0), - SX+TILEX*(dx==1),SY+TILEY*(dy==1)); + FX + TILEX*(dx==-1) - softscroll_offset, + FY + TILEY*(dy==-1) - softscroll_offset, + SXSIZE - TILEX*(dx!=0) + 2*softscroll_offset, + SYSIZE - TILEY*(dy!=0) + 2*softscroll_offset, + FX + TILEX*(dx==1) - softscroll_offset, + FY + TILEY*(dy==1) - softscroll_offset); if (dx) { - x = (dx==1 ? 0 : SCR_FIELDX-1); - for(y=0;y 0 || dy > 0 ? -1 : 1) * 3*TILEX/4; + + ScrollFigure(-1); + if (Store[oldJX][oldJY]) { DrawGraphic(SCROLLX(oldJX),SCROLLY(oldJY),el2gfx(Store[oldJX][oldJY])); @@ -2815,6 +2893,7 @@ BOOL MoveFigureOneStep(int dx, int dy, int real_dx, int real_dy) BOOL MoveFigure(int dx, int dy) { static long move_delay = 0; + static int last_move_dir = MV_NO_MOVING; int moved = MF_NO_ACTION; int oldJX = JX, oldJY = JY; @@ -2847,6 +2926,22 @@ BOOL MoveFigure(int dx, int dy) return(FALSE); } + + if (last_move_dir & (MV_LEFT | MV_RIGHT)) + { + if (!(moved |= MoveFigureOneStep(0,dy, dx,dy))) + moved |= MoveFigureOneStep(dx,0, dx,dy); + } + else + { + if (!(moved |= MoveFigureOneStep(dx,0, dx,dy))) + moved |= MoveFigureOneStep(0,dy, dx,dy); + } + + last_move_dir = MV_NO_MOVING; + + + /* if (moved |= MoveFigureOneStep(dx,0, dx,dy)) moved |= MoveFigureOneStep(0,dy, dx,dy); else @@ -2854,6 +2949,7 @@ BOOL MoveFigure(int dx, int dy) moved |= MoveFigureOneStep(0,dy, dx,dy); moved |= MoveFigureOneStep(dx,0, dx,dy); } + */ if (moved & MF_MOVING) { @@ -2884,11 +2980,15 @@ BOOL MoveFigure(int dx, int dy) PlayerMovDir = (oldJY < JY ? MV_DOWN : MV_UP); DrawLevelField(JX,JY); /* für "ErdreichAnbroeckeln()" */ + + last_move_dir = PlayerMovDir; } TestIfHeroHitsBadThing(); + /* BackToFront(); + */ if (PlayerGone) RemoveHero(); @@ -2896,6 +2996,126 @@ BOOL MoveFigure(int dx, int dy) return(moved); } +void ScrollFigure(int init) +{ + static long actual_frame_counter; + static int oldJX = -1, oldJY = -1; + + if (init) + { + /* + if (PlayerMovPos && oldJX != -1 && oldJY != -1) + { + if (Feld[lastJX][lastJY] == EL_LEERRAUM) + Feld[lastJX][lastJY] = EL_PLAYER_IS_LEAVING; + DrawLevelElement(oldJX,oldJY, Feld[oldJX][oldJY]); + DrawPlayerField(); + } + */ + + if (oldJX != -1 && oldJY != -1) + { + /* + if (Feld[lastJX][lastJY] == EL_LEERRAUM) + Feld[lastJX][lastJY] = EL_PLAYER_IS_LEAVING; + */ + DrawLevelElement(oldJX,oldJY, Feld[oldJX][oldJY]); + /* + DrawLevelElement(lastJX,lastJY, Feld[lastJX][lastJY]); + DrawPlayerField(); + */ + } + + if (Feld[lastJX][lastJY] == EL_LEERRAUM) + Feld[lastJX][lastJY] = EL_PLAYER_IS_LEAVING; + DrawLevelElement(lastJX,lastJY, Feld[lastJX][lastJY]); + DrawPlayerField(); + + oldJX = lastJX; + oldJY = lastJY; + actual_frame_counter = FrameCounter; + + /* + redraw[redraw_x1 + oldJX][redraw_y1 + oldJY] = 1; + redraw_tiles++; + */ + + /* + DrawLevelElement(oldJX,oldJY, Feld[oldJX][oldJY]); + */ + + + if (PlayerPushing) + { + int nextJX = JX + (JX - lastJX); + int nextJY = JY + (JY - lastJY); + + if (Feld[nextJX][nextJY] == EL_SOKOBAN_FELD_VOLL) + DrawLevelElement(nextJX,nextJY, EL_SOKOBAN_FELD_LEER); + else + DrawLevelElement(nextJX,nextJY, EL_LEERRAUM); + } + + + DrawPlayerField(); + + return; + } + else if (!FrameReached(&actual_frame_counter,1)) + return; + + PlayerMovPos += (PlayerMovPos > 0 ? -1 : 1) * TILEX/4; + + if (ScreenMovPos) + { + ScreenMovPos = PlayerMovPos; + redraw_mask |= REDRAW_FIELD; + } + + if (Feld[oldJX][oldJY] == EL_PLAYER_IS_LEAVING) + Feld[oldJX][oldJY] = EL_LEERRAUM; + + DrawLevelElement(oldJX,oldJY, Feld[oldJX][oldJY]); + DrawPlayerField(); + + + + if (Store[oldJX][oldJY]) + { + DrawGraphic(SCROLLX(oldJX),SCROLLY(oldJY),el2gfx(Store[oldJX][oldJY])); + DrawGraphicThruMask(SCROLLX(oldJX),SCROLLY(oldJY), + el2gfx(Feld[oldJX][oldJY])); + } + else if (Feld[oldJX][oldJY]==EL_DYNAMIT) + DrawDynamite(oldJX,oldJY); + else + DrawLevelField(oldJX,oldJY); + + if (PlayerPushing) + { + int nextJX = JX + (JX - lastJX); + int nextJY = JY + (JY - lastJY); + + if (PlayerMovPos) + { + if (Feld[nextJX][nextJY] == EL_SOKOBAN_FELD_VOLL) + DrawLevelElement(nextJX,nextJY, EL_SOKOBAN_FELD_LEER); + else + DrawLevelElement(nextJX,nextJY, EL_LEERRAUM); + } + else + DrawLevelElement(nextJX,nextJY, Feld[nextJX][nextJY]); + } + + if (!PlayerMovPos) + { + lastJX = JX; + lastJY = JY; + + oldJX = oldJY = -1; + } +} + void TestIfGoodThingHitsBadThing(int goodx, int goody) { int i, killx = goodx, killy = goody; @@ -3084,7 +3304,8 @@ int DigField(int x, int y, int real_dx, int real_dy, int mode) static long push_delay = 0; static int push_delay_value = 5; - PlayerPushing = FALSE; + if (!PlayerMovPos) + PlayerPushing = FALSE; if (mode == DF_NO_PUSH) { @@ -3402,7 +3623,7 @@ BOOL PlaceBomb(void) { int element; - if (PlayerGone) + if (PlayerGone || PlayerMovPos) return(FALSE); element = Feld[JX][JY]; @@ -3466,7 +3687,6 @@ void RaiseScore(int value) { Score += value; DrawText(DX_SCORE,DY_SCORE,int2str(Score,5),FS_SMALL,FC_YELLOW); - BackToFront(); } void RaiseScoreElement(int element)