waking waiting monsters after non-damaging attacks

- From a bug report, there are ways to, for example, steal items
from Medusa without waking her, by clever use of Conflict.
Avoid this by removing STRAT_WAITFORU when such an attack succeeds
- it was theoretically possible to use a similar approach to steal from a
STRAT_WAITFORU monster without it noticing while polymorphed and very fast,
so bulletproof this case as well.  Simpler because failed attacks wake too.
This commit is contained in:
cohrs
2002-04-15 07:00:00 +00:00
parent 86f961ba3f
commit d3078778eb
3 changed files with 17 additions and 0 deletions

View File

@@ -73,6 +73,8 @@ non-altar prayer should limit god action, not maximize it
potions of acid explode, not dilute, so make water_damage behave this way
lookat monster notes if you see monster is trapped
don't crash when angry shopkeeper re-enters the shop and you pick up something
monsters with WAITFORU strategy should act if successfully attacked by
non-damaging attacks (e.g. seduction, rust damage)
Platform- and/or Interface-Specific Fixes

View File

@@ -765,10 +765,12 @@ mdamagem(magr, mdef, mattk)
0 : MM_AGR_DIED));
}
hurtmarmor(mdef, AD_RUST);
mdef->mstrategy &= ~STRAT_WAITFORU;
tmp = 0;
break;
case AD_CORR:
hurtmarmor(mdef, AD_CORR);
mdef->mstrategy &= ~STRAT_WAITFORU;
tmp = 0;
break;
case AD_DCAY:
@@ -783,6 +785,7 @@ mdamagem(magr, mdef, mattk)
0 : MM_AGR_DIED));
}
hurtmarmor(mdef, AD_DCAY);
mdef->mstrategy &= ~STRAT_WAITFORU;
tmp = 0;
break;
case AD_STON:
@@ -811,6 +814,7 @@ label2: if (mdef->mhp > 0) return 0;
/* save the name before monster teleports, otherwise
we'll get "it" in the suddenly disappears message */
if (vis) Strcpy(mdef_Monnam, Monnam(mdef));
mdef->mstrategy &= ~STRAT_WAITFORU;
rloc(mdef);
if (vis && !canspotmon(mdef)
#ifdef STEED
@@ -827,6 +831,7 @@ label2: if (mdef->mhp > 0) return 0;
Strcpy(buf, Monnam(mdef));
pline("%s is put to sleep by %s.", buf, mon_nam(magr));
}
mdef->mstrategy &= ~STRAT_WAITFORU;
slept_monst(mdef);
}
break;
@@ -838,6 +843,7 @@ label2: if (mdef->mhp > 0) return 0;
}
mdef->mcanmove = 0;
mdef->mfrozen = rnd(10);
mdef->mstrategy &= ~STRAT_WAITFORU;
}
break;
case AD_SLOW:
@@ -845,6 +851,7 @@ label2: if (mdef->mhp > 0) return 0;
unsigned int oldspeed = mdef->mspeed;
mon_adjust_speed(mdef, -1, (struct obj *)0);
mdef->mstrategy &= ~STRAT_WAITFORU;
if (mdef->mspeed != oldspeed && vis)
pline("%s slows down.", Monnam(mdef));
}
@@ -857,6 +864,7 @@ label2: if (mdef->mhp > 0) return 0;
if (!magr->mcan && !mdef->mconf && !magr->mspec_used) {
if (vis) pline("%s looks confused.", Monnam(mdef));
mdef->mconf = 1;
mdef->mstrategy &= ~STRAT_WAITFORU;
}
break;
case AD_BLND:
@@ -869,6 +877,7 @@ label2: if (mdef->mhp > 0) return 0;
if ((rnd_tmp += mdef->mblinded) > 127) rnd_tmp = 127;
mdef->mblinded = rnd_tmp;
mdef->mcansee = 0;
mdef->mstrategy &= ~STRAT_WAITFORU;
}
tmp = 0;
break;
@@ -877,6 +886,7 @@ label2: if (mdef->mhp > 0) return 0;
if (vis) pline("%s looks %sconfused.",
Monnam(mdef), mdef->mconf ? "more " : "");
mdef->mconf = 1;
mdef->mstrategy &= ~STRAT_WAITFORU;
}
tmp = 0;
break;
@@ -884,6 +894,7 @@ label2: if (mdef->mhp > 0) return 0;
if (!night() && (pa == &mons[PM_GREMLIN])) break;
if (!magr->mcan && !rn2(10)) {
mdef->mcan = 1; /* cancelled regardless of lifesave */
mdef->mstrategy &= ~STRAT_WAITFORU;
if (is_were(pd) && pd->mlet != S_HUMAN)
were_change(mdef);
if (pd == &mons[PM_CLAY_GOLEM]) {
@@ -926,6 +937,7 @@ label2: if (mdef->mhp > 0) return 0;
add_to_minv(magr, gold);
}
#endif
mdef->mstrategy &= ~STRAT_WAITFORU;
if (vis) {
Strcpy(buf, Monnam(magr));
pline("%s steals some gold from %s.", buf, mon_nam(mdef));
@@ -991,6 +1003,7 @@ label2: if (mdef->mhp > 0) return 0;
onambuf, mdefnambuf);
}
possibly_unwield(mdef);
mdef->mstrategy &= ~STRAT_WAITFORU;
mselftouch(mdef, (const char *)0, FALSE);
if (mdef->mhp <= 0)
return (MM_DEF_DIED | (grow_up(magr,mdef) ?
@@ -1061,6 +1074,7 @@ label2: if (mdef->mhp > 0) return 0;
mdef->data != &mons[PM_GREEN_SLIME]) {
if (vis) pline("%s turns into slime.", Monnam(mdef));
(void) newcham(mdef, &mons[PM_GREEN_SLIME], FALSE);
mdef->mstrategy &= ~STRAT_WAITFORU;
tmp = 0;
}
break;

View File

@@ -1464,6 +1464,7 @@ register struct attack *mattk;
break;
}
mdef->mstrategy &= ~STRAT_WAITFORU; /* in case player is very fast */
if((mdef->mhp -= tmp) < 1) {
if (mdef->mtame && !cansee(mdef->mx,mdef->my)) {
You_feel("embarrassed for a moment.");