summaryrefslogtreecommitdiffstats
path: root/crawl-ref/source/player.cc
diff options
context:
space:
mode:
authordshaligram <dshaligram@c06c8d41-db1a-0410-9941-cceddc491573>2008-07-29 14:34:27 +0000
committerdshaligram <dshaligram@c06c8d41-db1a-0410-9941-cceddc491573>2008-07-29 14:34:27 +0000
commite744cede0540585248737db8e27a8320e5476955 (patch)
tree481b0e4ae8e92332d0b43e3cee9aa3ad3e0d7e1d /crawl-ref/source/player.cc
parent5362837395aa1a82999c8c7096e2807f61e53c48 (diff)
downloadcrawl-ref-e744cede0540585248737db8e27a8320e5476955.tar.gz
crawl-ref-e744cede0540585248737db8e27a8320e5476955.zip
Don't lose level-up stat and hp gain if Crawl receives SIGHUP at the level-up prompt.
git-svn-id: https://crawl-ref.svn.sourceforge.net/svnroot/crawl-ref/trunk@6718 c06c8d41-db1a-0410-9941-cceddc491573
Diffstat (limited to 'crawl-ref/source/player.cc')
-rw-r--r--crawl-ref/source/player.cc44
1 files changed, 28 insertions, 16 deletions
diff --git a/crawl-ref/source/player.cc b/crawl-ref/source/player.cc
index 6db9866b82..23ca730271 100644
--- a/crawl-ref/source/player.cc
+++ b/crawl-ref/source/player.cc
@@ -2927,46 +2927,59 @@ void level_change(bool skip_attribute_increase)
int hp_adjust = 0;
int mp_adjust = 0;
- you.experience_level++;
+ // [ds] Make sure we increment you.experience_level and apply
+ // any stat/hp increases only after we've cleared all prompts
+ // for this experience level. If we do part of the work before
+ // the prompt, and a player on telnet gets disconnected, the
+ // SIGHUP will save Crawl in the in-between state and rob the
+ // player of their level-up perks.
- if (you.experience_level <= you.max_level)
+ const int new_exp = you.experience_level + 1;
+
+ if (new_exp <= you.max_level)
{
mprf(MSGCH_INTRINSIC_GAIN,
- "Welcome back to level %d!", you.experience_level );
+ "Welcome back to level %d!", new_exp );
if (!skip_more)
more();
+ // No more prompts for this XL past this point.
+
+ you.experience_level = new_exp;
// Gain back the hp and mp we lose in lose_level(). -- bwr
- inc_hp( 4, true );
- inc_mp( 1, true );
+ inc_hp(4, true);
+ inc_mp(1, true);
}
else // Character has gained a new level
{
- if (you.experience_level == 27)
- mprf(MSGCH_INTRINSIC_GAIN, "You have reached level 27, the final one!");
+ if (new_exp == 27)
+ mprf(MSGCH_INTRINSIC_GAIN,
+ "You have reached level 27, the final one!");
else
- {
mprf(MSGCH_INTRINSIC_GAIN, "You have reached level %d!",
- you.experience_level);
- }
+ new_exp);
+
if (!skip_more)
more();
+ if (!(new_exp % 3) && !skip_attribute_increase)
+ _attribute_increase();
+
+ // No more prompts for this XL past this point.
+
int brek = 0;
- if (you.experience_level > 21)
+ if (new_exp > 21)
brek = (coinflip() ? 3 : 2);
- else if (you.experience_level > 12)
+ else if (new_exp > 12)
brek = 3 + random2(3); // up from 2 + rand(3) -- bwr
else
brek = 4 + random2(4); // up from 3 + rand(4) -- bwr
+ you.experience_level = new_exp;
inc_hp( brek, true );
inc_mp( 1, true );
- if (!(you.experience_level % 3) && !skip_attribute_increase)
- _attribute_increase();
-
switch (you.species)
{
case SP_HUMAN:
@@ -3506,7 +3519,6 @@ void level_change(bool skip_attribute_increase)
xom_is_stimulated(16);
learned_something_new(TUT_NEW_LEVEL);
-
}
redraw_skill( you.your_name, player_title() );