From afcc2462852f4f44f50b303d60f02b3c15c15f28 Mon Sep 17 00:00:00 2001 From: Holger Schemel Date: Fri, 28 Aug 1998 11:49:05 +0200 Subject: [PATCH] rnd-19980828 --- src/events.c | 29 ++++++------- src/game.c | 116 ++++++++++++++++++++++++++------------------------- src/game.h | 2 +- src/main.c | 2 +- src/main.h | 3 +- src/tools.c | 45 ++++++++++++-------- 6 files changed, 103 insertions(+), 94 deletions(-) diff --git a/src/events.c b/src/events.c index b563a860..4fecf144 100644 --- a/src/events.c +++ b/src/events.c @@ -468,12 +468,6 @@ void HandleKey(KeySym key, int key_status) case XK_7: case XK_8: case XK_9: - /* - MoveSpeed = key - XK_0; - printf("speed == %d\n", MoveSpeed); - break; - */ - if (key == XK_0) GameSpeed = 50; else @@ -482,27 +476,28 @@ void HandleKey(KeySym key, int key_status) break; case XK_a: - if (ScrollSteps == TILEX/4) - ScrollSteps = TILEX/8; + if (ScrollStepSize == TILEX/8) + ScrollStepSize = TILEX/4; else - ScrollSteps = TILEX/4; + ScrollStepSize = TILEX/8; + printf("ScrollStepSize == %d\n", ScrollStepSize); break; case XK_f: - GameSpeed = 2; - printf("GameSpeed == %d\n", GameSpeed); + ScrollStepSize = TILEX/8; + printf("ScrollStepSize == %d (1/8)\n", ScrollStepSize); break; case XK_g: - GameSpeed = 3; - printf("GameSpeed == %d\n", GameSpeed); + ScrollStepSize = TILEX/4; + printf("ScrollStepSize == %d (1/4)\n", ScrollStepSize); break; case XK_h: - GameSpeed = 4; - printf("GameSpeed == %d\n", GameSpeed); + ScrollStepSize = TILEX/2; + printf("ScrollStepSize == %d (1/2)\n", ScrollStepSize); break; case XK_l: - GameSpeed = 50; - printf("GameSpeed == %d\n", GameSpeed); + ScrollStepSize = TILEX; + printf("ScrollStepSize == %d (1/1)\n", ScrollStepSize); break; case XK_Q: diff --git a/src/game.c b/src/game.c index 2ed29966..424ca530 100644 --- a/src/game.c +++ b/src/game.c @@ -174,7 +174,7 @@ void InitGame() } break; case EL_DYNAMIT: - MovDelay[x][y] = 48; + MovDelay[x][y] = 96; break; case EL_BIRNE_AUS: Lights++; @@ -597,12 +597,12 @@ void DrawDynamite(int x, int y) if (Feld[x][y]==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; } @@ -619,12 +619,12 @@ void CheckDynamite(int x, int y) MovDelay[x][y]--; if (MovDelay[x][y]) { - if (!(MovDelay[x][y] % 6)) + if (!(MovDelay[x][y] % 12)) PlaySoundLevel(x,y,SND_ZISCH); - if (Feld[x][y]==EL_DYNAMIT && !(MovDelay[x][y] % 6)) + if (Feld[x][y]==EL_DYNAMIT && !(MovDelay[x][y] % 12)) DrawDynamite(x,y); - else if (Feld[x][y]==EL_DYNABOMB && !(MovDelay[x][y] % 3)) + else if (Feld[x][y]==EL_DYNABOMB && !(MovDelay[x][y] % 6)) DrawDynamite(x,y); return; @@ -638,7 +638,7 @@ void CheckDynamite(int x, int y) void Explode(int ex, int ey, int phase, int mode) { int x,y; - int num_phase = 9, delay = 1; + int num_phase = 9, delay = 2; int last_phase = num_phase*delay; int half_phase = (num_phase/2)*delay; @@ -868,13 +868,13 @@ void Blurb(int x, int y) int graphic = (element==EL_BLURB_LEFT ? GFX_BLURB_LEFT : GFX_BLURB_RIGHT); if (!MovDelay[x][y]) /* neue Phase / noch nicht gewartet */ - MovDelay[x][y] = 5; + MovDelay[x][y] = 9; if (MovDelay[x][y]) /* neue Phase / in Wartezustand */ { MovDelay[x][y]--; if (MovDelay[x][y] && IN_SCR_FIELD(SCROLLX(x),SCROLLY(y))) - DrawGraphic(SCROLLX(x),SCROLLY(y),graphic+4-MovDelay[x][y]); + DrawGraphic(SCROLLX(x),SCROLLY(y),graphic+4-MovDelay[x][y]/2); if (!MovDelay[x][y]) { @@ -1093,7 +1093,7 @@ void TurnRound(int x, int y) MovDir[x][y] = left_dir; if (element==EL_KAEFER && MovDir[x][y] != old_move_dir) - MovDelay[x][y] = 5; + MovDelay[x][y] = 9; else if (element==EL_BUTTERFLY) /* && MovDir[x][y]==left_dir) */ MovDelay[x][y] = 1; } @@ -1109,7 +1109,7 @@ void TurnRound(int x, int y) MovDir[x][y] = right_dir; if (element==EL_FLIEGER && MovDir[x][y] != old_move_dir) - MovDelay[x][y] = 5; + MovDelay[x][y] = 9; else if (element==EL_FIREFLY) /* && MovDir[x][y]==right_dir) */ MovDelay[x][y] = 1; } @@ -1135,7 +1135,7 @@ void TurnRound(int x, int y) else MovDir[x][y] = back_dir; - MovDelay[x][y] = 8+8*RND(3); + MovDelay[x][y] = 16+16*RND(3); } else if (element==EL_MAMPFER2) { @@ -1159,7 +1159,7 @@ void TurnRound(int x, int y) else MovDir[x][y] = back_dir; - MovDelay[x][y] = 8+8*RND(3); + MovDelay[x][y] = 16+16*RND(3); } else if (element==EL_PACMAN) { @@ -1183,7 +1183,7 @@ void TurnRound(int x, int y) else MovDir[x][y] = back_dir; - MovDelay[x][y] = 3+RND(20); + MovDelay[x][y] = 6+RND(40); } else if (element==EL_SCHWEIN) { @@ -1346,9 +1346,9 @@ void TurnRound(int x, int y) Moving2Blocked(x,y,&newx,&newy); if (IN_LEV_FIELD(newx,newy) && IS_FREE_OR_PLAYER(newx,newy)) - MovDelay[x][y] = 4+4*!RND(3); + MovDelay[x][y] = 8+8*!RND(3); else - MovDelay[x][y] = 8; + MovDelay[x][y] = 16; } else { @@ -1419,7 +1419,7 @@ void StartMoving(int x, int y) else if (Feld[x][y+1]==EL_MORAST_LEER) { if (!MovDelay[x][y]) - MovDelay[x][y] = 16; + MovDelay[x][y] = TILEY + 1; if (MovDelay[x][y]) { @@ -1448,7 +1448,7 @@ void StartMoving(int x, int y) else if (Feld[x][y+1]==EL_SIEB_LEER) { if (!MovDelay[x][y]) - MovDelay[x][y] = 2; + MovDelay[x][y] = TILEY/4 + 1; if (MovDelay[x][y]) { @@ -1474,7 +1474,7 @@ void StartMoving(int x, int y) else if (Feld[x][y+1]==EL_SIEB2_LEER) { if (!MovDelay[x][y]) - MovDelay[x][y] = 2; + MovDelay[x][y] = TILEY/4 + 1; if (MovDelay[x][y]) { @@ -1728,7 +1728,7 @@ void StartMoving(int x, int y) else DrawLevelField(x,y); - MovDelay[x][y] = 25; + MovDelay[x][y] = 50; Feld[newx][newy] = EL_BURNING; if (IN_LEV_FIELD(newx1,newy1) && Feld[newx1][newy1] == EL_LEERRAUM) Feld[newx1][newy1] = EL_BURNING; @@ -1787,9 +1787,9 @@ void StartMoving(int x, int y) if (element == EL_KAEFER || element == EL_FLIEGER) DrawLevelField(x,y); else if (element == EL_BUTTERFLY || element == EL_FIREFLY) - DrawGraphicAnimation(x,y, el2gfx(element), 2, 2, ANIM_NORMAL); + DrawGraphicAnimation(x,y, el2gfx(element), 2, 4, ANIM_NORMAL); else if (element==EL_SONDE) - DrawGraphicAnimation(x,y, GFX_SONDE_START, 8, 1, ANIM_NORMAL); + DrawGraphicAnimation(x,y, GFX_SONDE_START, 8, 2, ANIM_NORMAL); return; } @@ -2041,7 +2041,7 @@ void AmoebeWaechst(int x, int y) if (!MovDelay[x][y]) /* neue Phase / noch nicht gewartet */ { - MovDelay[x][y] = 4; + MovDelay[x][y] = 7; if (DelayReached(&sound_delay,sound_delay_value)) { @@ -2054,7 +2054,7 @@ void AmoebeWaechst(int x, int y) { MovDelay[x][y]--; if (MovDelay[x][y] && IN_SCR_FIELD(SCROLLX(x),SCROLLY(y))) - DrawGraphic(SCROLLX(x),SCROLLY(y),GFX_AMOEBING+3-MovDelay[x][y]); + DrawGraphic(SCROLLX(x),SCROLLY(y),GFX_AMOEBING+3-MovDelay[x][y]/2); if (!MovDelay[x][y]) { @@ -2198,7 +2198,7 @@ void Life(int ax, int ay) { int x1,y1,x2,y2; static int life[4] = { 2,3,3,3 }; /* "Life"-Parameter */ - int life_time = 20; + int life_time = 40; int element = Feld[ax][ay]; if (Stop[ax][ay]) @@ -2286,7 +2286,7 @@ void Ablenk(int x, int y) void Birne(int x, int y) { if (!MovDelay[x][y]) /* neue Phase / noch nicht gewartet */ - MovDelay[x][y] = 400; + MovDelay[x][y] = 800; if (MovDelay[x][y]) /* neue Phase / in Wartezustand */ { @@ -2314,19 +2314,19 @@ void Birne(int x, int y) void Blubber(int x, int y) { - DrawGraphicAnimation(x,y, GFX_GEBLUBBER, 4, 5, ANIM_NORMAL); + DrawGraphicAnimation(x,y, GFX_GEBLUBBER, 4, 10, ANIM_NORMAL); } void NussKnacken(int x, int y) { if (!MovDelay[x][y]) /* neue Phase / noch nicht gewartet */ - MovDelay[x][y] = 4; + MovDelay[x][y] = 7; if (MovDelay[x][y]) /* neue Phase / in Wartezustand */ { MovDelay[x][y]--; if (MovDelay[x][y] && IN_SCR_FIELD(SCROLLX(x),SCROLLY(y))) - DrawGraphic(SCROLLX(x),SCROLLY(y),GFX_CRACKINGNUT+3-MovDelay[x][y]); + DrawGraphic(SCROLLX(x),SCROLLY(y),GFX_CRACKINGNUT+3-MovDelay[x][y]/2); if (!MovDelay[x][y]) { @@ -2358,18 +2358,18 @@ void AusgangstuerPruefen(int x, int y) void AusgangstuerOeffnen(int x, int y) { - int speed = 3; + int delay = 6; if (!MovDelay[x][y]) /* neue Phase / noch nicht gewartet */ - MovDelay[x][y] = 5*speed; + MovDelay[x][y] = 5*delay; if (MovDelay[x][y]) /* neue Phase / in Wartezustand */ { int tuer; MovDelay[x][y]--; - tuer = MovDelay[x][y]/speed; - if (!(MovDelay[x][y]%speed) && IN_SCR_FIELD(SCROLLX(x),SCROLLY(y))) + tuer = MovDelay[x][y]/delay; + if (!(MovDelay[x][y]%delay) && IN_SCR_FIELD(SCROLLX(x),SCROLLY(y))) DrawGraphic(SCROLLX(x),SCROLLY(y),GFX_AUSGANG_AUF-tuer); if (!MovDelay[x][y]) @@ -2382,7 +2382,7 @@ void AusgangstuerOeffnen(int x, int y) void AusgangstuerBlinken(int x, int y) { - DrawGraphicAnimation(x,y, GFX_AUSGANG_AUF, 4, 2, ANIM_OSCILLATE); + DrawGraphicAnimation(x,y, GFX_AUSGANG_AUF, 4, 4, ANIM_OSCILLATE); } void EdelsteinFunkeln(int x, int y) @@ -2391,18 +2391,11 @@ void EdelsteinFunkeln(int x, int y) return; if (Feld[x][y] == EL_EDELSTEIN_BD) - { - const int delay = 4; /* war: 2 */ - const int frames = 4; - int phase = (FrameCounter % (delay*frames)) / delay; - - if (!(FrameCounter % delay)) - DrawGraphic(SCROLLX(x),SCROLLY(y), GFX_EDELSTEIN_BD - phase); - } + DrawGraphicAnimation(x,y, GFX_EDELSTEIN_BD, 4, 4, ANIM_REVERSE); else { if (!MovDelay[x][y]) /* neue Phase / noch nicht gewartet */ - MovDelay[x][y] = 6*!SimpleRND(500); + MovDelay[x][y] = 11 * !SimpleRND(500); if (MovDelay[x][y]) /* neue Phase / in Wartezustand */ { @@ -2416,7 +2409,7 @@ void EdelsteinFunkeln(int x, int y) if (MovDelay[x][y]) { int src_x,src_y, dest_x,dest_y; - int phase = MovDelay[x][y]-1; + int phase = (MovDelay[x][y]-1)/2; src_x = SX+GFX_PER_LINE*TILEX; src_y = SY+(phase > 2 ? 4-phase : phase)*TILEY; @@ -2440,18 +2433,18 @@ void EdelsteinFunkeln(int x, int y) void MauerWaechst(int x, int y) { - int speed = 3; + int delay = 6; if (!MovDelay[x][y]) /* neue Phase / noch nicht gewartet */ - MovDelay[x][y] = 3*speed; + MovDelay[x][y] = 3*delay; if (MovDelay[x][y]) /* neue Phase / in Wartezustand */ { int phase; MovDelay[x][y]--; - phase = 2-MovDelay[x][y]/speed; - if (!(MovDelay[x][y]%speed) && IN_SCR_FIELD(SCROLLX(x),SCROLLY(y))) + phase = 2-MovDelay[x][y]/delay; + if (!(MovDelay[x][y]%delay) && IN_SCR_FIELD(SCROLLX(x),SCROLLY(y))) DrawGraphic(SCROLLX(x),SCROLLY(y), (Store[x][y]==MV_LEFT ? GFX_MAUER_L1 : GFX_MAUER_R1)+phase); @@ -2481,7 +2474,7 @@ void MauerAbleger(int ax, int ay) BOOL links_massiv = FALSE, rechts_massiv = FALSE; if (!MovDelay[ax][ay]) /* neue Mauer / noch nicht gewartet */ - MovDelay[ax][ay] = 3; + MovDelay[ax][ay] = 6; if (MovDelay[ax][ay]) /* neue Mauer / in Wartezustand */ { @@ -2995,8 +2988,16 @@ void ScrollFigure(int init) if (init) { - PlayerGfxPos = - (TILEX/ScrollSteps) * (PlayerMovPos / (TILEX/ScrollSteps)); + + + PlayerGfxPos = ScrollStepSize * (PlayerMovPos / ScrollStepSize); + + + + /* + ScreenMovPos = PlayerGfxPos; + redraw_mask |= REDRAW_FIELD; + */ @@ -3061,12 +3062,15 @@ void ScrollFigure(int init) return; PlayerMovPos += (PlayerMovPos > 0 ? -1 : 1) * TILEX/8; + PlayerGfxPos = ScrollStepSize * (PlayerMovPos / ScrollStepSize); - PlayerGfxPos = - (TILEX/ScrollSteps) * (PlayerMovPos / (TILEX/ScrollSteps)); + /* + printf("PlayerGfxPos = %d\n", PlayerGfxPos); + */ + - if (ScreenMovPos) + if (ScreenMovPos && ScreenMovPos != PlayerGfxPos) { ScreenMovPos = PlayerGfxPos; redraw_mask |= REDRAW_FIELD; @@ -3638,7 +3642,7 @@ BOOL PlaceBomb(void) if (Dynamite) { Feld[JX][JY] = EL_DYNAMIT; - MovDelay[JX][JY] = 48; + MovDelay[JX][JY] = 96; Dynamite--; DrawText(DX_DYNAMITE,DY_DYNAMITE,int2str(Dynamite,3),FS_SMALL,FC_YELLOW); DrawGraphicThruMask(SCROLLX(JX),SCROLLY(JY),GFX_DYNAMIT); @@ -3646,7 +3650,7 @@ BOOL PlaceBomb(void) else { Feld[JX][JY] = EL_DYNABOMB; - MovDelay[JX][JY] = 48; + MovDelay[JX][JY] = 96; DynaBombsLeft--; DrawGraphicThruMask(SCROLLX(JX),SCROLLY(JY),GFX_DYNABOMB); } diff --git a/src/game.h b/src/game.h index 3fdd4a52..54c3784f 100644 --- a/src/game.h +++ b/src/game.h @@ -31,7 +31,7 @@ #define EX_BORDER 2 /* fundamental game speed */ -#define GAME_FRAME_DELAY 4 +#define GAME_FRAME_DELAY 2 #define FFWD_FRAME_DELAY 1 #define FRAMES_PER_SECOND (100 / GAME_FRAME_DELAY) diff --git a/src/main.c b/src/main.c index 4f178700..eed56094 100644 --- a/src/main.c +++ b/src/main.c @@ -82,7 +82,7 @@ long Elementeigenschaften[MAX_ELEMENTS]; int level_nr, leveldir_nr, num_leveldirs; int lev_fieldx,lev_fieldy, scroll_x,scroll_y; -int FX = SX, FY = SY, ScreenMovPos = 0, ScrollSteps = TILEX/4; +int FX = SX, FY = SY, ScreenMovPos = 0, ScrollStepSize = TILEX/8; int BX1 = 0, BY1 = 0, BX2 = SCR_FIELDX-1, BY2 = SCR_FIELDY-1; int JX,JY, lastJX,lastJY, ZX,ZY, ExitX,ExitY; int PlayerMovDir, PlayerMovPos, PlayerPushing; diff --git a/src/main.h b/src/main.h index 92de9f79..aff6db83 100644 --- a/src/main.h +++ b/src/main.h @@ -306,7 +306,7 @@ extern long Elementeigenschaften[MAX_ELEMENTS]; extern int level_nr, leveldir_nr, num_leveldirs; extern int lev_fieldx,lev_fieldy, scroll_x,scroll_y; -extern int FX,FY, ScreenMovPos, ScrollSteps; +extern int FX,FY, ScreenMovPos, ScrollStepSize; extern int BX1,BY1, BX2,BY2; extern int JX,JY, lastJX,lastJY, ZX,ZY, ExitX,ExitY; extern int PlayerMovDir, PlayerMovPos, PlayerPushing; @@ -1052,5 +1052,6 @@ extern char *progname; /* für DrawGraphicAnimation (tools.c) und AnimateToon (cartoons.c) */ #define ANIM_NORMAL 0 #define ANIM_OSCILLATE 1 +#define ANIM_REVERSE 2 #endif diff --git a/src/tools.c b/src/tools.c index a17288a1..befacb27 100644 --- a/src/tools.c +++ b/src/tools.c @@ -68,7 +68,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) @@ -101,6 +101,15 @@ void BackToFront() XCopyArea(display,buffer,window,gc, fx,fy, SXSIZE,SYSIZE, SX,SY); + + + +#if 0 + printf("FULL SCREEN REDRAW [%d]\n", ScreenMovPos); +#endif + + + } redraw_mask &= ~REDRAW_MAIN; } @@ -407,6 +416,9 @@ void DrawPlayerField() + + + if (draw_thru_mask) DrawGraphicShiftedThruMask(sx,sy,sxx,syy,graphic,CUT_NO_CUTTING); /* @@ -442,12 +454,19 @@ void DrawPlayerField() if (element == EL_FELSBROCKEN && sxx) { - int phase = PlayerGfxPos / (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); @@ -464,12 +483,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; } @@ -510,6 +529,9 @@ static int getGraphicAnimationPhase(int frames, int delay, int mode) else phase = (FrameCounter % (delay * frames)) / delay; + if (mode == ANIM_REVERSE) + phase = -phase; + return(phase); } @@ -518,19 +540,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); } -- 2.34.1