From 9ce3949248e40302b8474b49a42f778e933b0627 Mon Sep 17 00:00:00 2001 From: zelgadis Date: Tue, 28 Jul 2009 05:40:26 +0000 Subject: Generalized solution to the "disconnect at --more--" problem (e.g., disconnect at the more after "You have lost your religion!" to avoid the negative consequences of excommunication): when a HUP signal is received, instead of immediately saving the game, close the stdin stream, which will cause all of the Curses calls which normal block on key-presses to unblock, so that the code after a more() call will execute before the disconnected game is saved (which will happen in _input() in acr.cc). This only affects Curses (non-tiles/console) UNIX builds which have both USE_UNIX_SIGNALS and SIGHUP_SAVE defined. Exceptions to the above: * If HUP is received during a call to yesno() with safeanswer == 0, then the game will be saved immediately, since there's no way for the function to tell which answer is safe to give automatically. * If HUP is received while selecting the target for a controlled teleport then the teleport will be canceled, since otherwise a target other than the intended one might be the one under the cursor when the disconnect happened. git-svn-id: https://crawl-ref.svn.sourceforge.net/svnroot/crawl-ref/trunk@10443 c06c8d41-db1a-0410-9941-cceddc491573 --- crawl-ref/source/spells3.cc | 12 ++++++++++++ 1 file changed, 12 insertions(+) (limited to 'crawl-ref/source/spells3.cc') diff --git a/crawl-ref/source/spells3.cc b/crawl-ref/source/spells3.cc index 6499232913..df14c46325 100644 --- a/crawl-ref/source/spells3.cc +++ b/crawl-ref/source/spells3.cc @@ -1320,6 +1320,18 @@ static bool _teleport_player( bool allow_control, bool new_abyss_area ) show_map(pos, false); redraw_screen(); +#if defined(USE_UNIX_SIGNALS) && defined(SIGHUP_SAVE) && defined(USE_CURSES) + // If we've received a HUP signal then the user can't choose a + // location, so cancel the teleport. + if (crawl_state.seen_hups) + { + mpr("Controlled teleport interrupted by HUP signal, " + "cancelling teleport.", MSGCH_ERROR); + you.turn_is_over = false; + return (false); + } +#endif + #if DEBUG_DIAGNOSTICS mprf(MSGCH_DIAGNOSTICS, "Target square (%d,%d)", pos.x, pos.y ); #endif -- cgit v1.2.3-54-g00ecf