+ boolean has_started_game = hasStartedNetworkGame();
+ int request_mode = (has_started_game ? REQ_ASK : REQ_CONFIRM);
+
+ if (Request(message, request_mode | REQ_STAY_CLOSED) && has_started_game)
+ {
+ StartGameActions(network.enabled, setup.autorecord, level.random_seed);
+ }
+ else
+ {
+ SetGameStatus(GAME_MODE_MAIN);
+
+ DrawMainMenu();
+ }
+}
+
+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;
+
+ // do not ask to play again if game was never actually played
+ if (!game.GamePlayed)
+ 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 = (hasStartedNetworkGame() ?
+ "Game over! Play it again?" :
+ "Game over!");
+
+ last_game_over = game_over;
+}
+
+boolean checkGameSolved(void)
+{
+ // set for all game engines if level was solved
+ return game.LevelSolved_GameEnd;
+}
+
+boolean checkGameFailed(void)
+{
+ if (level.game_engine_type == GAME_ENGINE_TYPE_EM)
+ return (game_em.game_over && !game_em.level_solved);
+ else if (level.game_engine_type == GAME_ENGINE_TYPE_SP)
+ return (game_sp.game_over && !game_sp.level_solved);
+ 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 (game.GameOver && !game.LevelSolved);
+}
+
+boolean checkGameEnded(void)
+{
+ return (checkGameSolved() || checkGameFailed());
+}
+
+
+// ----------------------------------------------------------------------------
+// random generator functions
+// ----------------------------------------------------------------------------