From 1ad1e07d7a1ffa38ea0eccf046ea0ec3ed3c9b40 Mon Sep 17 00:00:00 2001 From: "nethack.rankin" Date: Sat, 22 Aug 2009 01:14:48 +0000 Subject: [PATCH] fix #H2010 - quaffing wielded potion of polymorph From a bug report, drinking a potion of polymorph which is wielded would trigger an "object lost" panic if hero took on a form that was forced to drop its weapon. Once weapon/potion got dropped, subsequent useup() of the potion was no longer operating on an inventory object. Unwield the potion at start of drinking, so that dropping doesn't come into play. (If we ever introduce a monster form incapable of holding inventory so drops everything, this will have to be revisited.) --- doc/fixes34.4 | 2 ++ src/potion.c | 16 +++++++++++++++- 2 files changed, 17 insertions(+), 1 deletion(-) 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]);