X-Git-Url: https://git.artsoft.org/?a=blobdiff_plain;f=src%2Fgame.c;h=506def33ce0682ae91f3903b2802715300dcba56;hb=88649b249ef0485f6c6233dfee03e3cae1eefa1f;hp=83b0c1f3cb94a98767c21573f527dcdaac6ee1c2;hpb=7a5e1469c7df6a9f07717f5a9c0e7b8d9a796a2c;p=rocksndiamonds.git diff --git a/src/game.c b/src/game.c index 83b0c1f3..506def33 100644 --- a/src/game.c +++ b/src/game.c @@ -3974,8 +3974,6 @@ void InitGame(void) game.explosions_delayed = TRUE; - game.envelope_active = FALSE; - // special case: set custom artwork setting to initial value game.use_masked_elements = game.use_masked_elements_initial; @@ -4622,6 +4620,8 @@ void InitGame(void) game.restart_level = FALSE; game.request_active = FALSE; + game.envelope_active = FALSE; + game.any_door_active = FALSE; if (level.game_engine_type == GAME_ENGINE_TYPE_MM) InitGameActions_MM(); @@ -4906,7 +4906,7 @@ static void LevelSolved(void) LevelSolved_SetFinalGameValues(); } -static void AdvanceToNextLevel(void) +static boolean AdvanceToNextLevel(void) { if (setup.increment_levels && level_nr < leveldir_current->last_level && @@ -4924,7 +4924,11 @@ static void AdvanceToNextLevel(void) SaveLevelSetup_SeriesInfo(); } + + return TRUE; } + + return FALSE; } void GameWon(void) @@ -5157,8 +5161,21 @@ void GameEnd(void) // used instead of "level_nr" (needed for network games) int last_level_nr = levelset.level_nr; boolean tape_saved = FALSE; + boolean game_over = checkGameFailed(); - game.LevelSolved_GameEnd = TRUE; + // Important note: This function is not only called after "GameWon()", but also after + // "game over" (if automatically asking for restarting the game is disabled in setup) + + // do not handle game end if game over and automatically asking for game restart + if (game_over && setup.ask_on_game_over) + return; + + // do not handle game end if request dialog is already active + if (checkRequestActive()) + return; + + if (game.LevelSolved) + game.LevelSolved_GameEnd = TRUE; if (game.LevelSolved_SaveTape && !score_info_tape_play) { @@ -5185,7 +5202,7 @@ void GameEnd(void) return; } - if (!game.LevelSolved_SaveScore) + if (!game.GamePlayed || (!game.LevelSolved_SaveScore && !level.bd_intermission)) { SetGameStatus(GAME_MODE_MAIN); @@ -5202,12 +5219,13 @@ void GameEnd(void) } // save score and score tape before potentially erasing tape below - NewHighScore(last_level_nr, tape_saved); + if (game.LevelSolved_SaveScore) + NewHighScore(last_level_nr, tape_saved); // increment and load next level (if possible and not configured otherwise) AdvanceToNextLevel(); - if (scores.last_added >= 0 && setup.show_scores_after_game) + if (game.LevelSolved_SaveScore && scores.last_added >= 0 && setup.show_scores_after_game) { SetGameStatus(GAME_MODE_SCORES); @@ -15854,7 +15872,7 @@ static int getSoundEffect_BD(int element_bd, int sample) void PlayLevelSound_BD(int xx, int yy, int element_bd, int sample) { - int element = (element_bd > -1 ? map_element_BD_to_RND(element_bd) : 0); + int element = (element_bd > -1 ? map_element_BD_to_RND_game(element_bd) : 0); int sound_effect = getSoundEffect_BD(element, sample); int sound_action = getSoundAction_BD(sample); boolean is_loop_sound = IS_LOOP_SOUND(sound_effect); @@ -15878,7 +15896,7 @@ void PlayLevelSound_BD(int xx, int yy, int element_bd, int sample) void StopSound_BD(int element_bd, int sample) { - int element = (element_bd > -1 ? map_element_BD_to_RND(element_bd) : 0); + int element = (element_bd > -1 ? map_element_BD_to_RND_game(element_bd) : 0); int sound_effect = getSoundEffect_BD(element, sample); if (sound_effect != SND_UNDEFINED) @@ -15887,7 +15905,7 @@ void StopSound_BD(int element_bd, int sample) boolean isSoundPlaying_BD(int element_bd, int sample) { - int element = (element_bd > -1 ? map_element_BD_to_RND(element_bd) : 0); + int element = (element_bd > -1 ? map_element_BD_to_RND_game(element_bd) : 0); int sound_effect = getSoundEffect_BD(element, sample); if (sound_effect != SND_UNDEFINED) @@ -16280,7 +16298,17 @@ static void RequestRestartGame(void) int request_mode = (has_started_game ? REQ_ASK : REQ_CONFIRM); int door_state = DOOR_CLOSE_1; - if (Request(message, request_mode | REQ_STAY_OPEN) && has_started_game) + boolean restart_wanted = (Request(message, request_mode | REQ_STAY_OPEN) && has_started_game); + + // if no restart wanted, continue with next level for BD style intermission levels + if (!restart_wanted && !level_editor_test_game && level.bd_intermission) + { + boolean success = AdvanceToNextLevel(); + + restart_wanted = (success && setup.auto_play_next_level); + } + + if (restart_wanted) { CloseDoor(door_state); @@ -16324,7 +16352,7 @@ boolean CheckRestartGame(void) } // do not ask to play again if request dialog is already active - if (game.request_active) + if (checkRequestActive()) return FALSE; // do not ask to play again if request dialog already handled @@ -16393,6 +16421,11 @@ boolean checkGameEnded(void) return (checkGameSolved() || checkGameFailed()); } +boolean checkRequestActive(void) +{ + return (game.request_active || game.envelope_active || game.any_door_active); +} + // ---------------------------------------------------------------------------- // random generator functions