X-Git-Url: https://git.artsoft.org/?a=blobdiff_plain;f=src%2Fgame.c;h=8c18d89ca64b71c9f1d92af961265137d20e4e37;hb=eae2f3467caaaf64a9370c1acd8cecf11fd58328;hp=e3fc38ba736906daf1b8440a5405bf9e6ee105d7;hpb=5b0dc92b2f5aba6cebec2c334728a4d17a3d75df;p=rocksndiamonds.git diff --git a/src/game.c b/src/game.c index e3fc38ba..8c18d89c 100644 --- a/src/game.c +++ b/src/game.c @@ -519,6 +519,7 @@ void InitGame() game.light_time_left = 0; game.timegate_time_left = 0; game.switchgate_pos = 0; + game.balloon_dir = MV_NO_MOVING; for (i=0; i<4; i++) { @@ -894,7 +895,7 @@ void InitAmoebaNr(int x, int y) void GameWon() { int hi_pos; - int bumplevel = FALSE; + boolean raise_level = FALSE; if (local_player->MovPos) return; @@ -965,17 +966,26 @@ void GameWon() SaveTape(tape.level_nr); /* Ask to save tape */ } + if (level_nr == leveldir[leveldir_nr].handicap_level) + { + leveldir[leveldir_nr].handicap_level++; + SaveLevelSetup_SeriesInfo(leveldir_nr); + + if (level_nr < leveldir[leveldir_nr].last_level) + raise_level = TRUE; + } + if ((hi_pos = NewHiScore()) >= 0) { game_status = HALLOFFAME; DrawHallOfFame(hi_pos); - if (bumplevel && TAPE_IS_EMPTY(tape)) + if (raise_level) level_nr++; } else { game_status = MAINMENU; - if (bumplevel && TAPE_IS_EMPTY(tape)) + if (raise_level) level_nr++; DrawMainMenu(); } @@ -2204,6 +2214,11 @@ void TurnRound(int x, int y) if (MovDir[x][y] != old_move_dir) MovDelay[x][y] = 9; } + else if (element == EL_BALLOON) + { + MovDir[x][y] = game.balloon_dir; + MovDelay[x][y] = 0; + } else if (element == EL_ROBOT || element == EL_SONDE || element == EL_PINGUIN) { int attr_x = -1, attr_y = -1; @@ -2508,7 +2523,8 @@ void StartMoving(int x, int y) { int newx, newy; - if (element == EL_SONDE && JustBeingPushed(x, y)) + if ((element == EL_SONDE || element == EL_BALLOON) + && JustBeingPushed(x, y)) return; if (!MovDelay[x][y]) /* start new movement phase */ @@ -2624,8 +2640,8 @@ void StartMoving(int x, int y) #endif } - else if ((element == EL_PINGUIN || - element == EL_ROBOT || element == EL_SONDE) && + else if ((element == EL_PINGUIN || element == EL_ROBOT || + element == EL_SONDE || element == EL_BALLOON) && IN_LEV_FIELD(newx, newy) && MovDir[x][y] == MV_DOWN && Feld[newx][newy] == EL_SALZSAEURE) { @@ -2803,6 +2819,9 @@ void StartMoving(int x, int y) else if (element == EL_SP_ELECTRON) DrawGraphicAnimation(x, y, GFX2_SP_ELECTRON, 8, 2, ANIM_NORMAL); + if (DONT_TOUCH(element)) + TestIfBadThingHitsHero(x, y); + return; } @@ -4050,7 +4069,8 @@ static void PlayerActions(struct PlayerInfo *player, byte player_action) if (IN_LEV_FIELD(jx+dx, jy) && IS_PUSHABLE(Feld[jx+dx][jy])) { int el = Feld[jx+dx][jy]; - int push_delay = (IS_SB_ELEMENT(el) || el == EL_SONDE ? 2 : 10); + int push_delay = (IS_SB_ELEMENT(el) || el == EL_SONDE ? 2 : + el == EL_BALLOON ? 0 : 10); if (tape.delay_played + push_delay >= tape.pos[tape.counter].delay) { @@ -4390,12 +4410,12 @@ void GameActions() { TimeLeft--; - if (TimeLeft <= 10) + if (TimeLeft <= 10 && setup.time_limit) PlaySoundStereo(SND_GONG, PSND_MAX_RIGHT); DrawText(DX_TIME, DY_TIME, int2str(TimeLeft, 3), FS_SMALL, FC_YELLOW); - if (!TimeLeft) + if (!TimeLeft && setup.time_limit) for (i=0; igems_still_needed > 0) return MF_NO_ACTION; @@ -5344,7 +5384,7 @@ int DigField(struct PlayerInfo *player, else if (IS_SP_ELEMENT(element)) PlaySoundLevel(x+dx, y+dy, SND_SP_ZONKPUSH); else - PlaySoundLevel(x+dx, y+dy, SND_KLOPF); + PlaySoundLevel(x+dx, y+dy, SND_PUSCH); /* better than "SND_KLOPF" */ break; case EL_PFORTE1: @@ -5491,6 +5531,7 @@ int DigField(struct PlayerInfo *player, case EL_SOKOBAN_OBJEKT: case EL_SONDE: case EL_SP_DISK_YELLOW: + case EL_BALLOON: if (mode == DF_SNAP) return MF_NO_ACTION; @@ -5516,7 +5557,7 @@ int DigField(struct PlayerInfo *player, if (player->push_delay == 0) player->push_delay = FrameCounter; if (!FrameReached(&player->push_delay, player->push_delay_value) && - !tape.playing) + !tape.playing && element != EL_BALLOON) return MF_NO_ACTION; if (IS_SB_ELEMENT(element)) @@ -5545,11 +5586,14 @@ int DigField(struct PlayerInfo *player, Feld[x+dx][y+dy] = element; } - player->push_delay_value = 2; + player->push_delay_value = (element == EL_BALLOON ? 0 : 2); DrawLevelField(x, y); DrawLevelField(x+dx, y+dy); - PlaySoundLevel(x+dx, y+dy, SND_PUSCH); + if (element == EL_BALLOON) + PlaySoundLevel(x+dx, y+dy, SND_SCHLURF); + else + PlaySoundLevel(x+dx, y+dy, SND_PUSCH); if (IS_SB_ELEMENT(element) && local_player->sokobanfields_still_needed == 0 &&