diff --git a/doc/fixes34.4 b/doc/fixes34.4 index 83d7a4ee1..396d34dd5 100644 --- a/doc/fixes34.4 +++ b/doc/fixes34.4 @@ -384,6 +384,8 @@ hero poly'd into mimic and hiding as an object via #monster didn't unhide when polymorphing into non-mimic message "You hit the with all your might." could be issued if a boulder went away while it was being dug/broken with a pick-axe +prevent "object lost" panic if/when drinking a wielded potion of polymorph + causes hero's new form to drop weapon Platform- and/or Interface-Specific Fixes diff --git a/src/potion.c b/src/potion.c index bcfac72fb..e3130b2f3 100644 --- a/src/potion.c +++ b/src/potion.c @@ -1,5 +1,4 @@ /* NetHack 3.5 potion.c $Date$ $Revision$ */ -/* SCCS Id: @(#)potion.c 3.5 2009/01/22 */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* NetHack may be freely redistributed. See license for details. */ @@ -423,6 +422,21 @@ dodrink() otmp = getobj(beverages, "drink"); if(!otmp) return(0); + + /* quan > 1 used to be left to useup(), but we need to force + the current potion to be unworn, and don't want to do + that for the entire stack when starting with more than 1. + [Drinking a wielded potion of polymorph can trigger a shape + change which causes hero's weapon to be dropped. In 3.4.x, + that led to an "object lost" panic since subsequent useup() + was no longer dealing with an inventory item. Unwearing + the current potion is intended to keep it in inventory.] */ + if (otmp->quan > 1L) { + otmp = splitobj(otmp, 1L); + otmp->owornmask = 0L; /* rest of original stuck unaffected */ + } else if (otmp->owornmask) { + remove_worn_item(otmp, FALSE); + } otmp->in_use = TRUE; /* you've opened the stopper */ potion_descr = OBJ_DESCR(objects[otmp->otyp]);