fix github issue #1220 - shattering unseen weapon

Reported by NetSysFire:  if hero dealt a weapon-shattering melee
blow to an unseen target, the weapon was accurately described in
the accompanying message
|Its <formatted-weapon-description> is shattered from the force...!

If the hero can't see or sense the monster, report
|Its weapon is shattered from the force of your blow!

If the monster isn't seen but is sensed, then
|<Monster>'s weapon is shattered from the force of your blow!

Fixes #1220
This commit is contained in:
PatR
2024-03-26 13:29:29 -07:00
parent fddc966a3e
commit 18baf188ea
2 changed files with 20 additions and 4 deletions

View File

@@ -1,4 +1,4 @@
/* NetHack 3.7 uhitm.c $NHDT-Date: 1699813308 2023/11/12 18:21:48 $ $NHDT-Branch: NetHack-3.7 $:$NHDT-Revision: 1.419 $ */
/* NetHack 3.7 uhitm.c $NHDT-Date: 1711484961 2024/03/26 20:29:21 $ $NHDT-Branch: NetHack-3.7 $:$NHDT-Revision: 1.443 $ */
/* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
/*-Copyright (c) Robert Patrick Rankin, 2012. */
/* NetHack may be freely redistributed. See license for details. */
@@ -951,6 +951,8 @@ hmon_hitmon_weapon_melee(
50 + 15 * (greatest_erosion(obj)
- greatest_erosion(monwep)),
100))) {
static const char from_your_blow[] = " from the force of your blow!";
char buf[BUFSZ];
/*
* 2.5% chance of shattering defender's weapon when
* using a two-handed weapon; less if uwep is rusted.
@@ -963,8 +965,20 @@ hmon_hitmon_weapon_melee(
*/
setmnotwielded(mon, monwep);
mon->weapon_check = NEED_WEAPON;
pline("%s from the force of your blow!",
Yobjnam2(monwep, "shatter"));
if (canseemon(mon))
/* Yobjnam2(X,"shatter") yields "Shk's X shatters" if X is owned
by a shop or "Mon's X shatters" if X is carried by a monster
(or "{Your|The} X shatters" if {carried by hero|last resort})*/
Strcpy(buf, Yobjnam2(monwep, "shatter"));
else /* hero is blind or can't see invisible mon */
/* construct "Its weapon shatters"; not an exact replacement
for Yobjnam2() if an unseen mon other than the shopkeeper
is wielding a shop-owned weapon; telepathy or extended
monster detection will name mon but not its weapon */
Sprintf(buf, "%s weapon%s %s", s_suffix(Monnam(mon)),
plur(monwep->quan), otense(monwep, "shatter"));
buf[sizeof buf - sizeof from_your_blow] = '\0';
pline("%s%s", buf, from_your_blow);
m_useupall(mon, monwep);
/* If someone just shattered MY weapon, I'd flee! */
if (rn2(4)) {