shattering monster's weapon stack

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.
This commit is contained in:
nethack.rankin
2006-03-30 05:52:28 +00:00
parent 08e9280201
commit f94b832fc9
4 changed files with 24 additions and 13 deletions
+1
View 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" cancelled nurses shouldn't say "Relax, this won't hurt a bit"
check for hero location in digactualhole() before clearing u.utrap check for hero location in digactualhole() before clearing u.utrap
clear any pits that the hero digs in the vault guard's temporary corridor 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 Platform- and/or Interface-Specific Fixes
+1
View 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(linedup, (XCHAR_P,XCHAR_P,XCHAR_P,XCHAR_P));
E boolean FDECL(lined_up, (struct monst *)); E boolean FDECL(lined_up, (struct monst *));
E struct obj *FDECL(m_carrying, (struct monst *,int)); 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_useup, (struct monst *,struct obj *));
E void FDECL(m_throw, (struct monst *,int,int,int,int,int,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)); E boolean FDECL(hits_bars, (struct obj **,int,int,int,int));
+20 -11
View 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. */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
/* NetHack may be freely redistributed. See license for details. */ /* 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 void
m_useup(mon, obj) m_useup(mon, obj)
struct monst *mon; struct monst *mon;
struct obj *obj; struct obj *obj;
{ {
if (obj->quan > 1L) { if (obj->quan > 1L) {
obj->quan--; obj->quan--;
obj->owt = weight(obj); obj->owt = weight(obj);
} else { } else {
obj_extract_self(obj); m_useupall(mon, 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);
} }
} }
+2 -2
View 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. */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
/* NetHack may be freely redistributed. See license for details. */ /* NetHack may be freely redistributed. See license for details. */
@@ -662,7 +662,7 @@ int thrown;
mon->weapon_check = NEED_WEAPON; mon->weapon_check = NEED_WEAPON;
pline("%s from the force of your blow!", pline("%s from the force of your blow!",
Yobjnam2(monwep, "shatter")); Yobjnam2(monwep, "shatter"));
m_useup(mon, monwep); m_useupall(mon, monwep);
/* If someone just shattered MY weapon, I'd flee! */ /* If someone just shattered MY weapon, I'd flee! */
if (rn2(4)) { if (rn2(4)) {
monflee(mon, d(2,3), TRUE, TRUE); monflee(mon, d(2,3), TRUE, TRUE);