diff --git a/src/do_wear.c b/src/do_wear.c index 72ecfd75d..e7cc1be64 100644 --- a/src/do_wear.c +++ b/src/do_wear.c @@ -1410,10 +1410,11 @@ Ring_off_or_gone(struct obj *obj, boolean gone) find_ac(); /* updates botl */ break; case RIN_PROTECTION_FROM_SHAPE_CHAN: - /* If you're no longer protected, let the chameleons - * change shape again -dgk - */ - restartcham(); + /* if you're no longer protected, let the chameleons change + shape again; however, might still be protected if wearing + 2nd ring of this type (or via #wizintrinsic) */ + if (!Protection_from_shape_changers) + restartcham(); break; } } diff --git a/src/dog.c b/src/dog.c index deade5f5e..9c4f85560 100644 --- a/src/dog.c +++ b/src/dog.c @@ -417,6 +417,12 @@ mon_arrive(struct monst *mtmp, int when) fromdlev.dnum = mtmp->mtrack[2].x; fromdlev.dlevel = mtmp->mtrack[2].y; mon_track_clear(mtmp); + /* in case Protection_from_shape_changers is different now from when + 'mtmp' went onto the migrating monsters list; that's handled in + getlev() when returning to a previously visited level and by the + special level code for monsters specified in the level, but needed + here for monsters migrating to a newly created level */ + restore_cham(mtmp); if (mtmp == u.usteed) return; /* don't place steed on the map */ diff --git a/src/mon.c b/src/mon.c index bbfe06f4a..1c2ecad07 100644 --- a/src/mon.c +++ b/src/mon.c @@ -4465,7 +4465,7 @@ get_iter_mons_xy( /* force all chameleons and mimics to become themselves and werecreatures to revert to human form; called when Protection_from_shape_changers gets - activated via wearing or eating ring or wizintrinsics */ + activated via wearing or eating ring or via #wizintrinsic */ void rescham(void) { diff --git a/src/timeout.c b/src/timeout.c index 8553320bb..cb9800994 100644 --- a/src/timeout.c +++ b/src/timeout.c @@ -930,6 +930,12 @@ nh_timeout(void) case GLIB: make_glib(0); /* might update persistent inventory */ break; + case PROT_FROM_SHAPE_CHANGERS: + /* timed Protection_from_shape_changers is via + #wizintrinsic only */ + if (!Protection_from_shape_changers) + restartcham(); + break; } }