fix #H8215 - monster intrinsics from worn gear
Fixes #177 The monst struct has 'mintrinsics' field which attempts to handle both mon->data->mresists and extrinsics supplied by worn armor, but polymorph/shape-change was clobbering the extrinsics side of things. Potentially fixing that by changing newcham() to use set_mon_data(...,1) instead of (...,0) solved that but exposed two other bugs. Intrinsics from the old form carried over to the new form along with extrinsics from worn armor, and update_mon_intrinsics() for armor being destroyed or dropped only worked as intended if the armor->owornmask was cleared beforehand--some places were clearing it after, so extrinsics from worn gear could persist even after that gear was gone. So, fixing the set_mon_data() call in newcham() was a no go. This fixes update_mon_intrinsics() and adopts the suggested code from github pull request #177 to have mon->mintrinsics only handle worn gear instead of trying to overload innate intrinsics with that. This is a superset of that; the flag argument to set_mon_data() is gone and mon->mintrinsics has been renamed mon->mextrinsics. (The routine update_mon_intrinsics() ought to be renamed too, but I didn't do that.)
This commit is contained in:
12
src/mon.c
12
src/mon.c
@@ -1,4 +1,4 @@
|
||||
/* NetHack 3.6 mon.c $NHDT-Date: 1548937318 2019/01/31 12:21:58 $ $NHDT-Branch: NetHack-3.6.2-beta01 $:$NHDT-Revision: 1.278 $ */
|
||||
/* NetHack 3.6 mon.c $NHDT-Date: 1550524562 2019/02/18 21:16:02 $ $NHDT-Branch: NetHack-3.6.2-beta01 $:$NHDT-Revision: 1.279 $ */
|
||||
/* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
|
||||
/*-Copyright (c) Derek S. Ray, 2015. */
|
||||
/* NetHack may be freely redistributed. See license for details. */
|
||||
@@ -1991,14 +1991,14 @@ register struct monst *mtmp;
|
||||
mptr = mtmp->data; /* save this for m_detach() */
|
||||
/* restore chameleon, lycanthropes to true form at death */
|
||||
if (mtmp->cham >= LOW_PM) {
|
||||
set_mon_data(mtmp, &mons[mtmp->cham], -1);
|
||||
set_mon_data(mtmp, &mons[mtmp->cham]);
|
||||
mtmp->cham = NON_PM;
|
||||
} else if (mtmp->data == &mons[PM_WEREJACKAL])
|
||||
set_mon_data(mtmp, &mons[PM_HUMAN_WEREJACKAL], -1);
|
||||
set_mon_data(mtmp, &mons[PM_HUMAN_WEREJACKAL]);
|
||||
else if (mtmp->data == &mons[PM_WEREWOLF])
|
||||
set_mon_data(mtmp, &mons[PM_HUMAN_WEREWOLF], -1);
|
||||
set_mon_data(mtmp, &mons[PM_HUMAN_WEREWOLF]);
|
||||
else if (mtmp->data == &mons[PM_WERERAT])
|
||||
set_mon_data(mtmp, &mons[PM_HUMAN_WERERAT], -1);
|
||||
set_mon_data(mtmp, &mons[PM_HUMAN_WERERAT]);
|
||||
|
||||
/*
|
||||
* mvitals[].died does double duty as total number of dead monsters
|
||||
@@ -3573,7 +3573,7 @@ boolean msg; /* "The oldmon turns into a newmon!" */
|
||||
mtmp->mhp = 1;
|
||||
|
||||
/* take on the new form... */
|
||||
set_mon_data(mtmp, mdat, 0);
|
||||
set_mon_data(mtmp, mdat);
|
||||
|
||||
if (emits_light(olddata) != emits_light(mtmp->data)) {
|
||||
/* used to give light, now doesn't, or vice versa,
|
||||
|
||||
Reference in New Issue
Block a user