diff options
-rw-r--r-- | crawl-ref/source/delay.cc | 50 | ||||
-rw-r--r-- | crawl-ref/source/food.cc | 21 |
2 files changed, 46 insertions, 25 deletions
diff --git a/crawl-ref/source/delay.cc b/crawl-ref/source/delay.cc index 9de42ec70d..366ced7327 100644 --- a/crawl-ref/source/delay.cc +++ b/crawl-ref/source/delay.cc @@ -145,6 +145,11 @@ void stop_delay( void ) delay_queue_item delay = you.delay_queue.front(); + const bool butcher_swap_warn = + delay.type == DELAY_BUTCHER + && (you.delay_queue.size() >= 2 + && you.delay_queue[1].type == DELAY_WEAPON_SWAP); + // At the very least we can remove any queued delays, right // now there is no problem with doing this... note that // any queuing here can only happen from a single command, @@ -157,7 +162,12 @@ void stop_delay( void ) { case DELAY_BUTCHER: // Corpse keeps track of work in plus2 field, see handle_delay() -- bwr - mpr( "You stop butchering the corpse." ); + if (butcher_swap_warn) + mpr("You stop butchering the corpse; not switching back to " + "primary weapon.", + MSGCH_WARN); + else + mpr( "You stop butchering the corpse." ); pop_delay(); break; @@ -319,7 +329,8 @@ void handle_delay( void ) { // special < 100 is the rottenness check if ( (mitm[delay.parm1].special < 100) && - (delay.parm2 >= 100) ) { + (delay.parm2 >= 100) ) + { mpr("The corpse rots.", MSGCH_ROTTEN_MEAT); delay.parm2 = 99; // don't give the message twice } @@ -329,9 +340,10 @@ void handle_delay( void ) } else { - // corpse is no longer valid! - stop_delay(); - return; + // corpse is no longer valid! End the butchering normally + // instead of using stop_delay() so that the player switches + // back to their main weapon if necessary. + delay.duration = 0; } } if ( delay.type == DELAY_MULTIDROP ) @@ -536,18 +548,28 @@ static void finish_delay(const delay_queue_item &delay) } case DELAY_BUTCHER: - mprf("You finish %s the corpse into pieces.", - (you.species==SP_TROLL || you.species == SP_GHOUL) ? "ripping" - : "chopping"); + { + const item_def &item = mitm[delay.parm1]; + if (is_valid_item(item) && item.base_type == OBJ_CORPSES) + { + mprf("You finish %s the corpse into pieces.", + (you.species==SP_TROLL || you.species == SP_GHOUL) ? "ripping" + : "chopping"); - turn_corpse_into_chunks( mitm[ delay.parm1 ] ); + turn_corpse_into_chunks( mitm[ delay.parm1 ] ); - if (you.berserker && you.berserk_penalty != NO_BERSERK_PENALTY) + if (you.berserker && you.berserk_penalty != NO_BERSERK_PENALTY) + { + mpr("You enjoyed that."); + you.berserk_penalty = 0; + } + } + else { - mpr("You enjoyed that."); - you.berserk_penalty = 0; + mpr("You stop butchering the corpse."); } break; + } case DELAY_DROP_ITEM: // Note: checking if item is droppable is assumed to @@ -603,8 +625,10 @@ static void finish_delay(const delay_queue_item &delay) you.wield_change = true; print_stats(); // force redraw of the stats - you.turn_is_over = true; pop_delay(); + + // Chain onto the next delay. + handle_delay(); } static void armour_wear_effects(const int item_slot) diff --git a/crawl-ref/source/food.cc b/crawl-ref/source/food.cc index 0d2bc1e714..14020ec01f 100644 --- a/crawl-ref/source/food.cc +++ b/crawl-ref/source/food.cc @@ -162,14 +162,6 @@ static bool find_butchering_implement() { mpr("Switching to a butchering implement."); wield_weapon( true, i, false ); - - // Account for the weapon switch...we're doing this here - // since the above switch may reveal information about the - // weapon (curse status, ego type). So even if the - // character fails to or decides not to butcher past this - // point, they have achieved something and there should be - // a cost. - start_delay( DELAY_UNINTERRUPTIBLE, 1 ); return true; } } @@ -226,7 +218,8 @@ bool butchery(void) // It makes more sense that you first find out if there's anything // to butcher, *then* decide to actually butcher it. // The old code did it the other way. - if ( !can_butcher && you.berserker ) { + if ( !can_butcher && you.berserker ) + { mpr ("You are too berserk to search for a butchering knife!"); return (false); } @@ -309,7 +302,12 @@ bool butchery(void) } else { - int work_req = 4 - (++mitm[objl].plus2); + // If we didn't switch weapons, we get in one turn of butchery; + // otherwise the work has to happen in the delay. + if (!wpn_switch) + ++mitm[objl].plus2; + + int work_req = 4 - mitm[objl].plus2; if (work_req < 0) work_req = 0; @@ -327,8 +325,7 @@ bool butchery(void) if (!new_cursed && wpn_switch) start_delay( DELAY_WEAPON_SWAP, 1, old_weapon ); - you.turn_is_over = true; - + you.turn_is_over = true; return true; } |