X-Git-Url: https://git.artsoft.org/?p=rocksndiamonds.git;a=blobdiff_plain;f=src%2Fgame.c;h=8d1954dab05e888ce586d6eb4463233f4e2eb475;hp=c0fa1680b8c8ada252f5abe538d633499756930a;hb=298cffce2845fea10a2f0420a26db13ea9179e57;hpb=ef4236ac56bedd0e83777505c4ed63fbf4a74698 diff --git a/src/game.c b/src/game.c index c0fa1680..8d1954da 100644 --- a/src/game.c +++ b/src/game.c @@ -11346,7 +11346,8 @@ static void GameActionsExt(void) if (game_status != GAME_MODE_PLAYING) return; - if (!network_player_action_received) + /* check if network player actions still missing and game still running */ + if (!network_player_action_received && !checkGameEnded()) return; /* failed to get network player actions in time */ /* do not yet reset "network_player_action_received" (for tape.pausing) */ @@ -11386,7 +11387,7 @@ static void GameActionsExt(void) stored_player[i].effective_action = stored_player[i].action; } - if (network_playing) + if (network_playing && !checkGameEnded()) SendToServer_MovePlayer(summarized_player_action); // summarize all actions at local players mapped input device position @@ -14949,6 +14950,64 @@ void RequestRestartGame(char *message) } } +void CheckGameOver(void) +{ + static boolean last_game_over = FALSE; + static int game_over_delay = 0; + int game_over_delay_value = 50; + boolean game_over = checkGameFailed(); + + /* do not handle game over if request dialog is already active */ + if (game.request_active) + return; + + if (!game_over) + { + last_game_over = FALSE; + game_over_delay = game_over_delay_value; + + return; + } + + if (game_over_delay > 0) + { + game_over_delay--; + + return; + } + + if (last_game_over != game_over) + game.restart_game_message = "Game over! Play it again?"; + + last_game_over = game_over; +} + +boolean checkGameSolved(void) +{ + /* set for all game engines if level was solved */ + return local_player->LevelSolved_GameEnd; +} + +boolean checkGameFailed(void) +{ + if (!AllPlayersGone) + return FALSE; + + if (level.game_engine_type == GAME_ENGINE_TYPE_EM) + return (level.native_em_level->lev->home > 0); + else if (level.game_engine_type == GAME_ENGINE_TYPE_SP) + return (game_sp.GameOver && !game_sp.LevelSolved); + else if (level.game_engine_type == GAME_ENGINE_TYPE_MM) + return (game_mm.game_over && !game_mm.level_solved); + else /* GAME_ENGINE_TYPE_RND */ + return (local_player->GameOver && !local_player->LevelSolved); +} + +boolean checkGameEnded(void) +{ + return (checkGameSolved() || checkGameFailed()); +} + /* ------------------------------------------------------------------------- */ /* random generator functions */