From e744cede0540585248737db8e27a8320e5476955 Mon Sep 17 00:00:00 2001 From: dshaligram Date: Tue, 29 Jul 2008 14:34:27 +0000 Subject: 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 --- crawl-ref/source/player.cc | 44 ++++++++++++++++++++++++++++---------------- 1 file changed, 28 insertions(+), 16 deletions(-) (limited to 'crawl-ref/source/player.cc') 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() ); -- cgit v1.2.3-54-g00ecf