From 4496ca3d85763bf500760c360b778fa0a93908fc Mon Sep 17 00:00:00 2001 From: "nethack.rankin" Date: Fri, 14 Feb 2003 01:06:08 +0000 Subject: [PATCH] fix B18012 - Werebane Make wielding Werebane confer defense against catching lychanthropy from monster bites. It doesn't protect against catching that from eating lycanthrope corpses and might blast the character if wielded at such time. Also fix artifact handling to recognize the character as lycanthrope while in normal human/elf/whatever form--rather than only when in beast form--just like it does for monsters. --- doc/fixes34.1 | 4 ++++ include/artilist.h | 4 ++-- src/artifact.c | 5 +++-- src/eat.c | 14 +++++++++++++- 4 files changed, 22 insertions(+), 5 deletions(-) diff --git a/doc/fixes34.1 b/doc/fixes34.1 index 2c5f8e78f..36550d8f3 100644 --- a/doc/fixes34.1 +++ b/doc/fixes34.1 @@ -386,6 +386,10 @@ steed should remember traps encountered while mounted killing shopkeeper by throwing unpaid things would result in "item not on bill" impossible error choking pet to death with cursed leash incurs various pet-killing penalties +wielding Werebane prevents catching lycanthropy via monster attack (but not + via eating, nor does it cure an existing case) +character inflicted with lycanthropy is vulnerable to Werebane when in + human/elf/&c form as well as when in beast form Platform- and/or Interface-Specific Fixes diff --git a/include/artilist.h b/include/artilist.h index 78bc8af81..1682e39e6 100644 --- a/include/artilist.h +++ b/include/artilist.h @@ -1,4 +1,4 @@ -/* SCCS Id: @(#)artilist.h 3.4 2001/11/17 */ +/* SCCS Id: @(#)artilist.h 3.4 2003/02/12 */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* NetHack may be freely redistributed. See license for details. */ @@ -107,7 +107,7 @@ A("Demonbane", LONG_SWORD, A("Werebane", SILVER_SABER, (SPFX_RESTR|SPFX_DFLAG2), 0, M2_WERE, - PHYS(5,0), NO_DFNS, NO_CARY, 0, A_NONE, NON_PM, NON_PM, 1500L ), + PHYS(5,0), DFNS(AD_WERE), NO_CARY, 0, A_NONE, NON_PM, NON_PM, 1500L ), A("Grayswandir", SILVER_SABER, (SPFX_RESTR|SPFX_HALRES), 0, 0, diff --git a/src/artifact.c b/src/artifact.c index 32375114c..102a99d3a 100644 --- a/src/artifact.c +++ b/src/artifact.c @@ -579,8 +579,9 @@ struct monst *mtmp; } else if (weap->spfx & SPFX_DFLAG1) { return ((ptr->mflags1 & weap->mtype) != 0L); } else if (weap->spfx & SPFX_DFLAG2) { - return ((ptr->mflags2 & weap->mtype) || - (yours && !Upolyd && (urace.selfmask & weap->mtype))); + return ((ptr->mflags2 & weap->mtype) || (yours && + ((!Upolyd && (urace.selfmask & weap->mtype)) || + ((weap->mtype & M2_WERE) && u.ulycn >= LOW_PM)))); } else if (weap->spfx & SPFX_DALIGN) { return yours ? (u.ualign.type != weap->alignment) : (ptr->maligntyp == A_NONE || diff --git a/src/eat.c b/src/eat.c index 355597191..32227c647 100644 --- a/src/eat.c +++ b/src/eat.c @@ -1,4 +1,4 @@ -/* SCCS Id: @(#)eat.c 3.4 2002/09/25 */ +/* SCCS Id: @(#)eat.c 3.4 2003/02/13 */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* NetHack may be freely redistributed. See license for details. */ @@ -770,6 +770,7 @@ cpostfx(pm) /* called after completely consuming a corpse */ register int pm; { register int tmp = 0; + boolean catch_lycanthropy = FALSE; /* in case `afternmv' didn't get called for previously mimicking gold, clean up now to avoid `eatmbuf' memory leak */ @@ -795,12 +796,15 @@ register int pm; pluslvl(FALSE); break; case PM_HUMAN_WERERAT: + catch_lycanthropy = TRUE; u.ulycn = PM_WERERAT; break; case PM_HUMAN_WEREJACKAL: + catch_lycanthropy = TRUE; u.ulycn = PM_WEREJACKAL; break; case PM_HUMAN_WEREWOLF: + catch_lycanthropy = TRUE; u.ulycn = PM_WEREWOLF; break; case PM_NURSE: @@ -952,6 +956,14 @@ register int pm; } break; } + + if (catch_lycanthropy && defends(AD_WERE, uwep)) { + if (!touch_artifact(uwep, &youmonst)) { + dropx(uwep); + uwepgone(); + } + } + return; } -- 2.40.0