From: nethack.rankin Date: Sat, 9 Apr 2011 00:05:06 +0000 (+0000) Subject: magic cancellation/Protection revamp (trunk only) X-Git-Tag: MOVE2GIT~223 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=6df18e20bea808d30818a6a158bc14351e7b8bfb;p=nethack magic cancellation/Protection revamp (trunk only) Optimize yesterday's new code. When calculating magic cancellation, avoid calling protects() for hero's inventory; the information it's providing is already available via u.uprops[PROTECTION]. That part of the inventory scan is only needed for monsters. --- diff --git a/src/mhitu.c b/src/mhitu.c index 204d8d7ad..aa70fbbcc 100644 --- a/src/mhitu.c +++ b/src/mhitu.c @@ -822,7 +822,10 @@ struct monst *mon; struct obj *o; long wearmask; int armpro, mc = 0; - boolean is_you = (mon == &youmonst), gotprot = FALSE; + boolean is_you = (mon == &youmonst), + gotprot = is_you ? (EProtection != 0L) : + /* high priests have innate protection */ + (mon->data == &mons[PM_HIGH_PRIEST]); for (o = is_you ? invent : mon->minvent; o; o = o->nobj) { /* a_can field is only applicable for armor (which must be worn) */ @@ -831,7 +834,7 @@ struct monst *mon; if (armpro > mc) mc = armpro; } /* if we've already confirmed Protection, skip additional checks */ - if (gotprot) continue; + if (is_you || gotprot) continue; /* omit W_SWAPWEP+W_QUIVER; W_ART+W_ARTI handled by protects() */ wearmask = W_ARMOR | W_RING | W_AMUL | W_TOOL; @@ -840,31 +843,17 @@ struct monst *mon; gotprot = TRUE; } - /* extrinsic Protection increases mc factor */ - if (!gotprot) { - /* in case hero has extrinsic protection from some other source */ - if (is_you && EProtection) gotprot = TRUE; - /* high priests have innate intrinsic protection which is as - strong as extrinsic protection */ - if (mon->data == &mons[PM_HIGH_PRIEST]) gotprot = TRUE; + if (gotprot) { + /* extrinsic Protection increases mc by 1 */ + if (mc < 3) mc += 1; + } else if (mc < 1) { + /* intrinsic Protection is weaker (play balance; obtaining divine + protection is too easy); it confers minimum mc 1 instead of 0 */ + if ((is_you && ((HProtection && u.ublessed) || u.uspellprot)) || + /* aligned priests and angels have innate intrinsic Protection */ + (mon->data == &mons[PM_ALIGNED_PRIEST] || is_minion(mon->data))) + mc = 1; } - /* extrinsic Protection increases mc by 1 */ - if (gotprot && mc < 3) - mc += 1; - - /* intrinsic Protection is weaker than Extrinsic (play balance; - obtaining divine protection is too easy) */ - if (!gotprot) { - if (is_you && ((HProtection && u.ublessed > 0) || u.uspellprot)) - gotprot = TRUE; - /* aligned priests and angels have innate intrinsic Protection */ - if (mon->data == &mons[PM_ALIGNED_PRIEST] || is_minion(mon->data)) - gotprot = TRUE; - } - /* intrinsic Protection confers minimum mc 1 instead of 0 */ - if (gotprot && mc < 1) - mc = 1; - return mc; }