X-Git-Url: https://git.artsoft.org/?p=rocksndiamonds.git;a=blobdiff_plain;f=src%2Fgame.c;h=46bbbf21fe046ac1bdae9a8e52ec5b9b9ff95717;hp=8d88167b277ece9f7ddce9e0ebfcd0a030f523aa;hb=046d80f9a1b3fad9d4d3d3aa92dcb3689849aebf;hpb=c3d03cdffce070695ba0520d00667b42b8460087 diff --git a/src/game.c b/src/game.c index 8d88167b..46bbbf21 100644 --- a/src/game.c +++ b/src/game.c @@ -57,6 +57,7 @@ void InitGame() Dynamite = Score = 0; Gems = level.edelsteine; + DynaBombCount = DynaBombSize = DynaBombsLeft = 0; Key[0] = Key[1] = Key[2] = Key[3] = FALSE; MampferNr = 0; TimeLeft = level.time; @@ -82,6 +83,7 @@ void InitGame() Feld[x][y] = Ur[x][y]; MovPos[x][y] = MovDir[x][y] = MovDelay[x][y] = 0; Store[x][y] = Store2[x][y] = Frame[x][y] = AmoebaNr[x][y] = 0; + JustHit[x][y] = 0; switch(Feld[x][y]) { @@ -121,6 +123,7 @@ void InitGame() case EL_PACMAN_L: case EL_PACMAN_U: case EL_MAMPFER: + case EL_MAMPFER2: case EL_ZOMBIE: case EL_PACMAN: InitMovDir(x,y); @@ -313,7 +316,7 @@ void GameWon() CloseDoor(DOOR_CLOSE_1); if (level_nr==player.handicap && - level_nr=TILEX) /* Zielfeld erreicht */ { - Feld[x][y]=EL_LEERRAUM; - Feld[newx][newy]=element; + Feld[x][y] = EL_LEERRAUM; + Feld[newx][newy] = element; if (Store[x][y]==EL_MORAST_VOLL) { @@ -1225,6 +1322,17 @@ void ContinueMoving(int x, int y) Store[x][y] = Store2[x][y] = 0; Feld[x][y] = EL_SIEB_LEER; } + else if (Store[x][y]==EL_SIEB2_VOLL) + { + Store[x][y] = 0; + Feld[newx][newy] = EL_SIEB2_VOLL; + element = EL_SIEB2_VOLL; + } + else if (Store[x][y]==EL_SIEB2_LEER) + { + Store[x][y] = Store2[x][y] = 0; + Feld[x][y] = EL_SIEB2_LEER; + } else if (Store[x][y]==EL_SALZSAEURE) { Store[x][y] = 0; @@ -1245,8 +1353,9 @@ void ContinueMoving(int x, int y) DrawLevelField(x,y); DrawLevelField(newx,newy); - Stop[newx][newy]=TRUE; - CheckMoving=TRUE; + Stop[newx][newy] = TRUE; + JustHit[x][newy] = 3; + CheckMoving = TRUE; if (DONT_TOUCH(element)) /* Käfer oder Flieger */ { @@ -1261,7 +1370,7 @@ void ContinueMoving(int x, int y) else /* noch in Bewegung */ { DrawLevelField(x,y); - CheckMoving=TRUE; + CheckMoving = TRUE; } } @@ -1376,7 +1485,7 @@ void AmoebeWaechst(int x, int y) static long sound_delay = 0; static int sound_delay_value = 0; - CheckExploding=TRUE; + CheckExploding = TRUE; if (!MovDelay[x][y]) /* neue Phase / noch nicht gewartet */ { @@ -1417,7 +1526,7 @@ void AmoebeAbleger(int ax, int ay) 0,+1 }; - CheckExploding=TRUE; + CheckExploding = TRUE; if (!level.tempo_amoebe) { @@ -1529,7 +1638,7 @@ void Life(int ax, int ay) int life_time = 20; int element = Feld[ax][ay]; - CheckExploding=TRUE; + CheckExploding = TRUE; if (Stop[ax][ay]) return; @@ -1591,7 +1700,7 @@ void Life(int ax, int ay) void Ablenk(int x, int y) { - CheckExploding=TRUE; + CheckExploding = TRUE; if (!MovDelay[x][y]) /* neue Phase / noch nicht gewartet */ MovDelay[x][y] = 33*(level.dauer_ablenk/10); @@ -1616,7 +1725,7 @@ void Ablenk(int x, int y) void Birne(int x, int y) { - CheckExploding=TRUE; + CheckExploding = TRUE; if (!MovDelay[x][y]) /* neue Phase / noch nicht gewartet */ MovDelay[x][y] = 400; @@ -1647,7 +1756,7 @@ void Birne(int x, int y) void Blubber(int x, int y) { - CheckExploding=TRUE; + CheckExploding = TRUE; if (!MovDelay[x][y]) /* neue Phase / noch nicht gewartet */ MovDelay[x][y] = 20; @@ -1665,7 +1774,7 @@ void Blubber(int x, int y) void NussKnacken(int x, int y) { - CheckExploding=TRUE; + CheckExploding = TRUE; if (!MovDelay[x][y]) /* neue Phase / noch nicht gewartet */ MovDelay[x][y] = 4; @@ -1684,14 +1793,15 @@ void NussKnacken(int x, int y) } } -void SiebAktivieren(int x, int y) +void SiebAktivieren(int x, int y, int typ) { - CheckExploding=TRUE; + CheckExploding = TRUE; if (SiebAktiv>1) { if (SiebAktiv%2 && IN_SCR_FIELD(SCROLLX(x),SCROLLY(y))) - DrawGraphic(SCROLLX(x),SCROLLY(y),GFX_SIEB_VOLL+3-(SiebAktiv%8)/2); + DrawGraphic(SCROLLX(x),SCROLLY(y), + (typ==1 ? GFX_SIEB_VOLL : GFX_SIEB2_VOLL)+3-(SiebAktiv%8)/2); /* if (!(SiebAktiv%4)) @@ -1701,34 +1811,39 @@ void SiebAktivieren(int x, int y) } else { - Feld[x][y] = EL_SIEB_TOT; + Feld[x][y] = (typ==1 ? EL_SIEB_TOT : EL_SIEB2_TOT); DrawLevelField(x,y); } } void AusgangstuerPruefen(int x, int y) { - CheckExploding=TRUE; + CheckExploding = TRUE; if (!Gems) + { Feld[x][y] = EL_AUSGANG_ACT; + PlaySoundLevel(x,y,SND_OEFFNEN); + } } void AusgangstuerOeffnen(int x, int y) { - CheckExploding=TRUE; + int speed = 3; + + CheckExploding = TRUE; if (!MovDelay[x][y]) /* neue Phase / noch nicht gewartet */ - MovDelay[x][y] = 20; + MovDelay[x][y] = 5*speed; if (MovDelay[x][y]) /* neue Phase / in Wartezustand */ { int tuer; MovDelay[x][y]--; - tuer = MovDelay[x][y]/5; - if (!(MovDelay[x][y]%5) && IN_SCR_FIELD(SCROLLX(x),SCROLLY(y))) - DrawGraphic(SCROLLX(x),SCROLLY(y),GFX_AUSGANG_ZU+3-tuer); + tuer = MovDelay[x][y]/speed; + if (!(MovDelay[x][y]%speed) && IN_SCR_FIELD(SCROLLX(x),SCROLLY(y))) + DrawGraphic(SCROLLX(x),SCROLLY(y),GFX_AUSGANG_AUF-tuer); if (!MovDelay[x][y]) { @@ -1738,6 +1853,137 @@ void AusgangstuerOeffnen(int x, int y) } } +void AusgangstuerBlinken(int x, int y) +{ + CheckExploding = TRUE; + + if (!MovDelay[x][y]) /* neue Phase / noch nicht gewartet */ + MovDelay[x][y] = 16; + + if (MovDelay[x][y]) /* neue Phase / in Wartezustand */ + { + int phase; + + MovDelay[x][y]--; + phase = (MovDelay[x][y] % 16)/2; + if (phase>3) + phase = 7-phase; + if (!(MovDelay[x][y]%2) && IN_SCR_FIELD(SCROLLX(x),SCROLLY(y))) + DrawGraphic(SCROLLX(x),SCROLLY(y),GFX_AUSGANG_AUF+phase); + } +} + +void EdelsteinFunkeln(int x, int y) +{ + int speed = 2; + + CheckExploding = TRUE; + + if (IS_MOVING(x,y)) + return; + + if (!MovDelay[x][y]) /* neue Phase / noch nicht gewartet */ + MovDelay[x][y] = 4*speed; + + if (MovDelay[x][y]) /* neue Phase / in Wartezustand */ + { + int phase; + + MovDelay[x][y]--; + phase = MovDelay[x][y]/speed; + if (!(MovDelay[x][y]%speed) && IN_SCR_FIELD(SCROLLX(x),SCROLLY(y))) + DrawGraphic(SCROLLX(x),SCROLLY(y),GFX_EDELSTEIN2-phase); + } +} + +void MauerWaechst(int x, int y) +{ + int speed = 3; + + CheckExploding = TRUE; + + if (!MovDelay[x][y]) /* neue Phase / noch nicht gewartet */ + MovDelay[x][y] = 3*speed; + + 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))) + DrawGraphic(SCROLLX(x),SCROLLY(y), + (Store[x][y]==MV_LEFT ? GFX_MAUER_L1 : GFX_MAUER_R1)+phase); + + if (!MovDelay[x][y]) + { + if (Store[x][y]==MV_LEFT) + { + if (IN_LEV_FIELD(x-1,y) && IS_MAUER(Feld[x-1][y])) + DrawLevelField(x-1,y); + } + else + { + if (IN_LEV_FIELD(x+1,y) && IS_MAUER(Feld[x+1][y])) + DrawLevelField(x+1,y); + } + + Feld[x][y] = EL_MAUER_LEBT; + Store[x][y] = 0; + DrawLevelField(x,y); + } + } +} + +void MauerAbleger(int ax, int ay) +{ + BOOL links_frei = FALSE, rechts_frei = FALSE; + BOOL links_massiv = FALSE, rechts_massiv = FALSE; + + CheckExploding = TRUE; + + if (!MovDelay[ax][ay]) /* neue Mauer / noch nicht gewartet */ + MovDelay[ax][ay] = 3; + + if (MovDelay[ax][ay]) /* neue Mauer / in Wartezustand */ + { + MovDelay[ax][ay]--; + if (MovDelay[ax][ay]) + return; + } + + if (IN_LEV_FIELD(ax-1,ay) && IS_FREE(ax-1,ay)) + links_frei = TRUE; + if (IN_LEV_FIELD(ax+1,ay) && IS_FREE(ax+1,ay)) + rechts_frei = TRUE; + + if (links_frei) + { + Feld[ax-1][ay] = EL_MAUERND; + Store[ax-1][ay] = MV_LEFT; + if (IN_SCR_FIELD(SCROLLX(ax-1),SCROLLY(ay))) + DrawGraphic(SCROLLX(ax-1),SCROLLY(ay),GFX_MAUER_L1); + } + if (rechts_frei) + { + Feld[ax+1][ay] = EL_MAUERND; + Store[ax+1][ay] = MV_RIGHT; + if (IN_SCR_FIELD(SCROLLX(ax+1),SCROLLY(ay))) + DrawGraphic(SCROLLX(ax+1),SCROLLY(ay),GFX_MAUER_R1); + } + + if (links_frei || rechts_frei) + DrawLevelField(ax,ay); + + if (!IN_LEV_FIELD(ax-1,ay) || IS_MAUER(Feld[ax-1][ay])) + links_massiv = TRUE; + if (!IN_LEV_FIELD(ax+1,ay) || IS_MAUER(Feld[ax+1][ay])) + rechts_massiv = TRUE; + + if (links_massiv && rechts_massiv) + Feld[ax][ay] = EL_MAUERWERK; +} + int GameActions(int mx, int my, int button) { static long time_delay=0, action_delay=0; @@ -1777,7 +2023,11 @@ int GameActions(int mx, int my, int button) CheckMoving = CheckExploding = FALSE; for(y=0;y0) + JustHit[x][y]--; + } for(y=0;y0) Gems--; RaiseScore(level.score[SC_EDELSTEIN]); @@ -2093,8 +2360,8 @@ int DigField(int x, int y, int mode) PlaySoundLevel(x,y,SND_PONG); break; case EL_DIAMANT: - Feld[x][y]=EL_LEERRAUM; - CheckMoving=TRUE; + Feld[x][y] = EL_LEERRAUM; + CheckMoving = TRUE; Gems -= 3; if (Gems<0) Gems=0; @@ -2103,13 +2370,28 @@ int DigField(int x, int y, int mode) PlaySoundLevel(x,y,SND_PONG); break; case EL_DYNAMIT_AUS: - Feld[x][y]=EL_LEERRAUM; - CheckMoving=TRUE; + Feld[x][y] = EL_LEERRAUM; + CheckMoving = TRUE; Dynamite++; RaiseScore(level.score[SC_DYNAMIT]); DrawText(DX_DYNAMITE,DY_DYNAMITE,int2str(Dynamite,3),FS_SMALL,FC_YELLOW); PlaySoundLevel(x,y,SND_PONG); break; + case EL_DYNABOMB_NR: + Feld[x][y] = EL_LEERRAUM; + CheckMoving = TRUE; + DynaBombCount++; + DynaBombsLeft++; + RaiseScore(level.score[SC_DYNAMIT]); + PlaySoundLevel(x,y,SND_PONG); + break; + case EL_DYNABOMB_SZ: + Feld[x][y] = EL_LEERRAUM; + CheckMoving = TRUE; + DynaBombSize++; + RaiseScore(level.score[SC_DYNAMIT]); + PlaySoundLevel(x,y,SND_PONG); + break; case EL_SCHLUESSEL1: case EL_SCHLUESSEL2: case EL_SCHLUESSEL3: @@ -2132,7 +2414,7 @@ int DigField(int x, int y, int mode) } case EL_ABLENK_AUS: Feld[x][y] = EL_ABLENK_EIN; - CheckExploding=TRUE; + CheckExploding = TRUE; ZX=x; ZY=y; DrawLevelField(x,y); @@ -2184,8 +2466,12 @@ int DigField(int x, int y, int mode) return(MF_NO_ACTION); break; case EL_AUSGANG_AUF: +/* if (mode==DF_SNAP || Gems>0) return(MF_NO_ACTION); +*/ + if (mode==DF_SNAP) + return(MF_NO_ACTION); LevelSolved = GameOver = TRUE; PlaySoundLevel(x,y,SND_BUING); break; @@ -2238,16 +2524,32 @@ BOOL SnapField(int dx, int dy) BOOL PlaceBomb(void) { - if (Dynamite==0 || Feld[JX][JY]==EL_DYNAMIT) + if ((Dynamite==0 && DynaBombsLeft==0) || + Feld[JX][JY]==EL_DYNAMIT || Feld[JX][JY]==EL_DYNABOMB) return(FALSE); if (Feld[JX][JY]!=EL_LEERRAUM) Store[JX][JY] = Feld[JX][JY]; - Feld[JX][JY] = EL_DYNAMIT; - MovDelay[JX][JY] = 48; - Dynamite--; - DrawText(DX_DYNAMITE,DY_DYNAMITE,int2str(Dynamite,3),FS_SMALL,FC_YELLOW); - DrawGraphicThruMask(SCROLLX(JX),SCROLLY(JY),GFX_DYNAMIT); + + if (Dynamite) + { + Feld[JX][JY] = EL_DYNAMIT; + MovDelay[JX][JY] = 48; + Dynamite--; + DrawText(DX_DYNAMITE,DY_DYNAMITE,int2str(Dynamite,3),FS_SMALL,FC_YELLOW); + DrawGraphicThruMask(SCROLLX(JX),SCROLLY(JY),GFX_DYNAMIT); + } + else + { + Feld[JX][JY] = EL_DYNABOMB; + MovDelay[JX][JY] = 48; + DynaBombsLeft--; + + /* ändern, wenn Maske für DYNABOMB vorliegt! */ + + DrawGraphicThruMask(SCROLLX(JX),SCROLLY(JY),GFX_DYNAMIT); + } + CheckExploding = TRUE; return(TRUE); }