]> granicus.if.org Git - nethack/commitdiff
shattering monster's weapon stack
authornethack.rankin <nethack.rankin>
Thu, 30 Mar 2006 05:52:28 +0000 (05:52 +0000)
committernethack.rankin <nethack.rankin>
Thu, 30 Mar 2006 05:52:28 +0000 (05:52 +0000)
     Something I encountered while playing slash'em a while back, but
relevant to nethack:  "Its orcish spears shatter from the force of your
blow!".  I was using a two-handed weapon (at skilled or expert level) to
fight an invisible monster which was wielding a stack of multiple spears
(slash'em gives them out in groups of 3 for monsters' starting inventory).
After killing it, I found 2 orcish spears along with an invisible corpse
of somebody-or-other the Kobold King.  The message suggested that the
whole spear stack had been destroyed (and the weapon shattering code in
hmon_hitmon() clearly expects that to be the case), but only one of them
had actually gotten used up.

     I can't recall whether "shatter" was actually given as singular or
plural at the time; nethack handles that aspect correctly.  Only object
destruction needed tweaking.

doc/fixes34.4
include/extern.h
src/mthrowu.c
src/uhitm.c

index ba3bf3b952cb1d2889688f3985ede37f52b922e9..47e0d69806d2e4d011694a3f223d007ccfcc0fa9 100644 (file)
@@ -203,6 +203,7 @@ handle antholes more sensibly when ants aren't available
 cancelled nurses shouldn't say "Relax, this won't hurt a bit"
 check for hero location in digactualhole() before clearing u.utrap
 clear any pits that the hero digs in the vault guard's temporary corridor
+shattering a monster's weapon didn't work as intended for stack of N>1
 
 
 Platform- and/or Interface-Specific Fixes
index f7bc8d88762547334796f47bc67c5fd93c5b3ecc..393be35d5e17010ff249e132f9ea412bfddda9fc 100644 (file)
@@ -1358,6 +1358,7 @@ E int FDECL(breamu, (struct monst *,struct attack *));
 E boolean FDECL(linedup, (XCHAR_P,XCHAR_P,XCHAR_P,XCHAR_P));
 E boolean FDECL(lined_up, (struct monst *));
 E struct obj *FDECL(m_carrying, (struct monst *,int));
+E void FDECL(m_useupall, (struct monst *,struct obj *));
 E void FDECL(m_useup, (struct monst *,struct obj *));
 E void FDECL(m_throw, (struct monst *,int,int,int,int,int,struct obj *));
 E boolean FDECL(hits_bars, (struct obj **,int,int,int,int));
index c9b635ded4fcb6231470b7d919c409bba9d2643d..63b387a77b2afb7c77c8a49b225e5b153c28dc6b 100644 (file)
@@ -1,4 +1,4 @@
-/*     SCCS Id: @(#)mthrowu.c  3.5     2005/06/21      */
+/*     SCCS Id: @(#)mthrowu.c  3.5     2006/03/29      */
 /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
 /* NetHack may be freely redistributed.  See license for details. */
 
@@ -445,23 +445,32 @@ struct obj *obj;          /* missile (or stack providing it) */
        }
 }
 
-/* Remove an item from the monster's inventory and destroy it. */
+/* remove an entire item from a monster's inventory; destroy that item */
+void
+m_useupall(mon, obj)
+struct monst *mon;
+struct obj *obj;
+{
+       obj_extract_self(obj);
+       possibly_unwield(mon, FALSE);
+       if (obj->owornmask) {
+           mon->misc_worn_check &= ~obj->owornmask;
+           update_mon_intrinsics(mon, obj, FALSE, FALSE);
+       }
+       obfree(obj, (struct obj*) 0);
+}
+
+/* remove one instance of an item from a monster's inventory */
 void
 m_useup(mon, obj)
 struct monst *mon;
 struct obj *obj;
 {
        if (obj->quan > 1L) {
-               obj->quan--;
-               obj->owt = weight(obj);
+           obj->quan--;
+           obj->owt = weight(obj);
        } else {
-               obj_extract_self(obj);
-               possibly_unwield(mon, FALSE);
-               if (obj->owornmask) {
-                   mon->misc_worn_check &= ~obj->owornmask;
-                   update_mon_intrinsics(mon, obj, FALSE, FALSE);
-               }
-               obfree(obj, (struct obj*) 0);
+           m_useupall(mon, obj);
        }
 }
 
index a237e6668de9380c0045240ad6f385826ca919e5..6c5245accacde6163e8ac4d567f55f03d814be97 100644 (file)
@@ -1,4 +1,4 @@
-/*     SCCS Id: @(#)uhitm.c    3.5     2005/11/30      */
+/*     SCCS Id: @(#)uhitm.c    3.5     2006/03/29      */
 /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
 /* NetHack may be freely redistributed.  See license for details. */
 
@@ -662,7 +662,7 @@ int thrown;
                        mon->weapon_check = NEED_WEAPON;
                        pline("%s from the force of your blow!",
                              Yobjnam2(monwep, "shatter"));
-                       m_useup(mon, monwep);
+                       m_useupall(mon, monwep);
                        /* If someone just shattered MY weapon, I'd flee! */
                        if (rn2(4)) {
                            monflee(mon, d(2,3), TRUE, TRUE);