From: Holger Schemel Date: Tue, 15 Aug 2006 20:16:47 +0000 (+0200) Subject: rnd-20060815-2-src X-Git-Tag: 3.2.1^2~13 X-Git-Url: https://git.artsoft.org/?a=commitdiff_plain;h=06234ebe7668425f2bc05b3323fae921ac3fecff;p=rocksndiamonds.git rnd-20060815-2-src * changed behaviour after solved game -- do not immediately stop engine --- diff --git a/ChangeLog b/ChangeLog index 8a1c2b9b..6fd0529f 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,6 @@ +2006-08-15 + * changed behaviour after solved game -- do not immediately stop engine + 2006-08-14 * fixed bug with displaying pushed CE with value/score/delay anim_mode diff --git a/src/conftime.h b/src/conftime.h index de4cb82e..4e32acc8 100644 --- a/src/conftime.h +++ b/src/conftime.h @@ -1 +1 @@ -#define COMPILE_DATE_STRING "[2006-08-15 01:20]" +#define COMPILE_DATE_STRING "[2006-08-15 22:10]" diff --git a/src/events.c b/src/events.c index e6946958..3e159dc4 100644 --- a/src/events.c +++ b/src/events.c @@ -700,9 +700,13 @@ void HandleKey(Key key, int key_status) if (game_status == GAME_MODE_PLAYING && AllPlayersGone && (key == KSYM_Return || key == setup.shortcut.toggle_pause)) { +#if 1 + GameEnd(); +#else CloseDoor(DOOR_CLOSE_1); game_status = GAME_MODE_MAIN; DrawMainMenu(); +#endif return; } @@ -1065,9 +1069,14 @@ void HandleJoystick() if (AllPlayersGone && newbutton) { +#if 1 + GameEnd(); +#else CloseDoor(DOOR_CLOSE_1); game_status = GAME_MODE_MAIN; DrawMainMenu(); +#endif + return; } diff --git a/src/game.c b/src/game.c index 40cffd8f..914661d1 100644 --- a/src/game.c +++ b/src/game.c @@ -51,6 +51,9 @@ #define USE_CODE_THAT_BREAKS_SNAKE_BITE (USE_NEW_STUFF * 1) +#define USE_UFAST_PLAYER_EXIT_BUGFIX (USE_NEW_STUFF * 1) +#define USE_NEW_GAME_WON (USE_NEW_STUFF * 1) + /* for DigField() */ #define DF_NO_PUSH 0 @@ -2177,6 +2180,10 @@ void InitGame() player->LevelSolved = FALSE; player->GameOver = FALSE; + + player->LevelSolved_GameEnd = FALSE; + player->LevelSolved_SaveTape = FALSE; + player->LevelSolved_SaveScore = FALSE; } network_player_action_received = FALSE; @@ -2902,6 +2909,190 @@ void InitAmoebaNr(int x, int y) AmoebaCnt2[group_nr]++; } +#if USE_NEW_GAME_WON + +void GameWon() +{ + static boolean score_done = FALSE; + static boolean player_done = FALSE; + static int game_over_delay = 0; + int game_over_delay_value = 50; + + /* do not start end game actions before the player stops moving (to exit) */ + if (local_player->MovPos) + return; + + if (tape.auto_play) /* tape might already be stopped here */ + tape.auto_play_level_solved = TRUE; + + if (!local_player->LevelSolved_GameEnd) + { + local_player->LevelSolved_GameEnd = TRUE; + local_player->LevelSolved_SaveTape = tape.recording; + local_player->LevelSolved_SaveScore = !tape.playing; + + score_done = FALSE; + player_done = FALSE; + game_over_delay = 0; + } + + PlaySoundStereo(SND_GAME_WINNING, SOUND_MIDDLE); + + if (TimeLeft > 0) + { + if (!tape.playing) + { + if (setup.sound_loops) + PlaySoundExt(SND_GAME_LEVELTIME_BONUS, SOUND_MAX_VOLUME, SOUND_MIDDLE, + SND_CTRL_PLAY_LOOP); + else + PlaySoundStereo(SND_GAME_LEVELTIME_BONUS, SOUND_MIDDLE); + } + + if (TimeLeft > 100 && TimeLeft % 10 == 0) + { + TimeLeft -= 10; + RaiseScore(level.score[SC_TIME_BONUS] * 10); + } + else + { + TimeLeft--; + RaiseScore(level.score[SC_TIME_BONUS]); + } + + DrawGameValue_Time(TimeLeft); + +#if 0 + if (!tape.playing) + Delay(10); +#endif + + if (TimeLeft <= 0 && !tape.playing && setup.sound_loops) + StopSound(SND_GAME_LEVELTIME_BONUS); + } + else if (level.time == 0 && TimePlayed < 999) /* level without time limit */ + { + if (!tape.playing) + { + if (setup.sound_loops) + PlaySoundExt(SND_GAME_LEVELTIME_BONUS, SOUND_MAX_VOLUME, SOUND_MIDDLE, + SND_CTRL_PLAY_LOOP); + else + PlaySoundStereo(SND_GAME_LEVELTIME_BONUS, SOUND_MIDDLE); + } + + if (TimePlayed < 900 && TimePlayed % 10 == 0) + { + TimePlayed += 10; + RaiseScore(level.score[SC_TIME_BONUS] * 10); + } + else + { + TimePlayed++; + RaiseScore(level.score[SC_TIME_BONUS]); + } + + DrawGameValue_Time(TimePlayed); + + if (TimePlayed >= 999 && !tape.playing && setup.sound_loops) + StopSound(SND_GAME_LEVELTIME_BONUS); + } + else + { + score_done = TRUE; + } + + /* close exit door after last player */ + if (AllPlayersGone && ExitX >= 0 && ExitY >= 0 && + (Feld[ExitX][ExitY] == EL_EXIT_OPEN || + Feld[ExitX][ExitY] == EL_SP_EXIT_OPEN)) + { + int element = Feld[ExitX][ExitY]; + + Feld[ExitX][ExitY] = (element == EL_EXIT_OPEN ? EL_EXIT_CLOSING : + EL_SP_EXIT_CLOSING); + + PlayLevelSoundElementAction(ExitX, ExitY, element, ACTION_CLOSING); + } + + /* player disappears */ + if (ExitX >= 0 && ExitY >= 0 && !player_done) + { + DrawLevelField(ExitX, ExitY); + + player_done = TRUE; + } + + game_over_delay++; + + if (game_over_delay < game_over_delay_value || !score_done) + return; +} + +void GameEnd() +{ + int hi_pos; + boolean raise_level = FALSE; + + CloseDoor(DOOR_CLOSE_1); + + if (local_player->LevelSolved_SaveTape) + { + TapeStop(); + + SaveTape(tape.level_nr); /* Ask to save tape */ + } + + if (!local_player->LevelSolved_SaveScore) + { + game_status = GAME_MODE_MAIN; + + DrawMainMenu(); + + return; + } + + if (level_nr == leveldir_current->handicap_level) + { + leveldir_current->handicap_level++; + SaveLevelSetup_SeriesInfo(); + } + + if (level_editor_test_game) + local_player->score = -1; /* no highscore when playing from editor */ + else if (level_nr < leveldir_current->last_level) + raise_level = TRUE; /* advance to next level */ + + if ((hi_pos = NewHiScore()) >= 0) + { + game_status = GAME_MODE_SCORES; + + DrawHallOfFame(hi_pos); + + if (raise_level) + { + level_nr++; + TapeErase(); + } + } + else + { + game_status = GAME_MODE_MAIN; + + if (raise_level) + { + level_nr++; + TapeErase(); + } + + DrawMainMenu(); + } + + local_player->LevelSolved_SaveScore = FALSE; +} + +#else + void GameWon() { int hi_pos; @@ -3056,6 +3247,8 @@ void GameWon() BackToFront(); } +#endif + int NewHiScore() { int k, l; @@ -10667,7 +10860,14 @@ boolean MovePlayerOneStep(struct PlayerInfo *player, PlayerVisit[jx][jy] = FrameCounter; +#if USE_UFAST_PLAYER_EXIT_BUGFIX + player->is_moving = TRUE; +#endif + +#if 1 + /* should better be called in MovePlayer(), but this breaks some tapes */ ScrollPlayer(player, SCROLL_INIT); +#endif return MP_MOVING; } @@ -10865,6 +11065,11 @@ boolean MovePlayer(struct PlayerInfo *player, int dx, int dy) player->is_dropping = FALSE; player->is_dropping_pressed = FALSE; player->drop_pressed_delay = 0; + +#if 0 + /* should better be called here than above, but this breaks some tapes */ + ScrollPlayer(player, SCROLL_INIT); +#endif } else { diff --git a/src/game.h b/src/game.h index 1718f835..aff4cd5f 100644 --- a/src/game.h +++ b/src/game.h @@ -126,6 +126,10 @@ struct PlayerInfo boolean LevelSolved, GameOver; + boolean LevelSolved_GameEnd; + boolean LevelSolved_SaveTape; + boolean LevelSolved_SaveScore; + int last_move_dir; boolean is_active; @@ -214,6 +218,7 @@ void InitGame(void); void UpdateEngineValues(int, int); void GameWon(void); +void GameEnd(void); void InitPlayerGfxAnimation(struct PlayerInfo *, int, int); void Moving2Blocked(int, int, int *, int *); diff --git a/src/screens.c b/src/screens.c index aa03e16a..690c27b1 100644 --- a/src/screens.c +++ b/src/screens.c @@ -115,6 +115,8 @@ #define SC_BORDER_SIZE 14 +#define TITLE_SCREEN_FADE_DELAY 250 + /* forward declarations of internal functions */ static void HandleScreenGadgets(struct GadgetInfo *); @@ -589,7 +591,7 @@ void HandleTitleScreen(int mx, int my, int dx, int dy, int button) boolean return_to_main_menu = FALSE; boolean use_fading_main_menu = TRUE; boolean use_cross_fading = TRUE; - int fade_delay = 500; + int fade_delay = TITLE_SCREEN_FADE_DELAY; int post_delay = fade_delay / 2; if (button == MB_MENU_INITIALIZE)