diff --git a/include/extern.h b/include/extern.h index 0129b888f..300af5e06 100644 --- a/include/extern.h +++ b/include/extern.h @@ -1355,8 +1355,8 @@ E void FDECL(mnexto, (struct monst *)); E void FDECL(maybe_mnexto, (struct monst *)); E boolean FDECL(mnearto, (struct monst *, XCHAR_P, XCHAR_P, BOOLEAN_P)); E void FDECL(m_respond, (struct monst *)); -E void FDECL(setmangry, (struct monst *)); -E void FDECL(wakeup, (struct monst *)); +E void FDECL(setmangry, (struct monst *, boolean)); +E void FDECL(wakeup, (struct monst *, boolean)); E void NDECL(wake_nearby); E void FDECL(wake_nearto, (int, int, int)); E void FDECL(seemimic, (struct monst *)); diff --git a/src/apply.c b/src/apply.c index 8d64620a8..2e1fb0cf1 100644 --- a/src/apply.c +++ b/src/apply.c @@ -2695,7 +2695,7 @@ struct obj *obj; pline1(msg_slipsfree); } if (mtmp) - wakeup(mtmp); + wakeup(mtmp, TRUE); } else pline1(msg_snap); @@ -2789,7 +2789,7 @@ struct obj *obj; } else { pline1(msg_slipsfree); } - wakeup(mtmp); + wakeup(mtmp, TRUE); } else { if (mtmp->m_ap_type && !Protection_from_shape_changers && !sensemon(mtmp)) diff --git a/src/dig.c b/src/dig.c index 5f45e117e..4407c4c15 100644 --- a/src/dig.c +++ b/src/dig.c @@ -2008,7 +2008,7 @@ struct monst *mtmp; } mtmp->mburied = TRUE; - wakeup(mtmp); /* at least give it a chance :-) */ + wakeup(mtmp, FALSE); /* at least give it a chance :-) */ newsym(mtmp->mx, mtmp->my); } diff --git a/src/dokick.c b/src/dokick.c index f1e0dcddf..2cb485472 100644 --- a/src/dokick.c +++ b/src/dokick.c @@ -156,7 +156,7 @@ xchar x, y; int i, j; /* anger target even if wild miss will occur */ - setmangry(mon); + setmangry(mon, TRUE); if (Levitation && !rn2(3) && verysmall(mon->data) && !is_flyer(mon->data)) { @@ -298,7 +298,7 @@ register struct obj *gold; if (!likes_gold(mtmp->data) && !mtmp->isshk && !mtmp->ispriest && !mtmp->isgd && !is_mercenary(mtmp->data)) { - wakeup(mtmp); + wakeup(mtmp, TRUE); } else if (!mtmp->mcanmove) { /* too light to do real damage */ if (canseemon(mtmp)) { @@ -312,7 +312,7 @@ register struct obj *gold; mtmp->msleeping = 0; finish_meating(mtmp); if (!mtmp->isgd && !rn2(4)) /* not always pleasing */ - setmangry(mtmp); + setmangry(mtmp, TRUE); /* greedy monsters catch gold */ if (cansee(mtmp->mx, mtmp->my)) pline("%s catches the gold.", Monnam(mtmp)); diff --git a/src/dothrow.c b/src/dothrow.c index 70496ef7a..98d41de9e 100644 --- a/src/dothrow.c +++ b/src/dothrow.c @@ -608,7 +608,8 @@ int x, y; if ((mon = m_at(x, y)) != 0) { You("bump into %s.", a_monnam(mon)); - wakeup(mon); + wakeup(mon, FALSE); + setmangry(mon, FALSE); wake_nearto(x,y, 10); return FALSE; } @@ -1346,7 +1347,7 @@ boolean maybe_wakeup; else miss(missile, mon); if (maybe_wakeup && !rn2(3)) - wakeup(mon); + wakeup(mon, TRUE); return; } @@ -1448,7 +1449,8 @@ register struct obj *obj; /* thrownobj or kickedobj or uwep */ at leader... (kicked artifact is ok too; HMON_APPLIED could occur if quest artifact polearm or grapnel ever gets added) */ if (hmode != HMON_APPLIED && quest_arti_hits_leader(obj, mon)) { - /* not wakeup(), which angers non-tame monsters */ + /* AIS: changes to wakeup() means that it's now less inappropriate here + than it used to be, but the manual version works just as well */ mon->msleeping = 0; mon->mstrategy &= ~STRAT_WAITMASK; @@ -1562,7 +1564,7 @@ register struct obj *obj; /* thrownobj or kickedobj or uwep */ } else { tmiss(obj, mon, TRUE); if (hmode == HMON_APPLIED) - wakeup(mon); + wakeup(mon, TRUE); } } else if (otyp == HEAVY_IRON_BALL) { @@ -1610,7 +1612,7 @@ register struct obj *obj; /* thrownobj or kickedobj or uwep */ } } else if (guaranteed_hit) { /* this assumes that guaranteed_hit is due to swallowing */ - wakeup(mon); + wakeup(mon, TRUE); if (obj->otyp == CORPSE && touch_petrifies(&mons[obj->corpsenm])) { if (is_animal(u.ustuck->data)) { minstapetrify(u.ustuck, TRUE); diff --git a/src/explode.c b/src/explode.c index e6f85866b..e26e58d8a 100644 --- a/src/explode.c +++ b/src/explode.c @@ -433,7 +433,7 @@ int expltype; monkilled(mtmp, "", (int) adtyp); } else if (!context.mon_moving) { /* all affected monsters, even if mdef is set */ - setmangry(mtmp); + setmangry(mtmp, TRUE); } } diff --git a/src/mon.c b/src/mon.c index e31ecb27b..d0586b200 100644 --- a/src/mon.c +++ b/src/mon.c @@ -2583,10 +2583,18 @@ struct monst *mtmp; } } +/* Called whenever the player attacks mtmp; also called in other situations + where mtmp gets annoyed at the player. Handles mtmp getting annoyed at the + attack and any ramifications that might have. Useful also in situations where + mtmp was already hostile; it checks for situations where the player shouldn't + be attacking and any ramifications /that/ might have. */ void -setmangry(mtmp) +setmangry(mtmp, via_attack) struct monst *mtmp; +boolean via_attack; { + (void) via_attack; /* AIS: not used yet */ + /* AIS: Should this be in both places, or just in wakeup()? */ mtmp->mstrategy &= ~STRAT_WAITMASK; if (!mtmp->mpeaceful) return; @@ -2681,14 +2689,16 @@ struct monst *mtmp; } -/* wake up a monster, usually making it angry in the process */ +/* wake up a monster, possibly making it angry in the process */ void -wakeup(mtmp) +wakeup(mtmp, via_attack) register struct monst *mtmp; +boolean via_attack; { mtmp->msleeping = 0; finish_meating(mtmp); - setmangry(mtmp); + if (via_attack) + setmangry(mtmp, TRUE); if (mtmp->m_ap_type) { seemimic(mtmp); } else if (context.forcefight && !context.mon_moving diff --git a/src/music.c b/src/music.c index 58cc4b0f0..75ab39d4d 100644 --- a/src/music.c +++ b/src/music.c @@ -263,7 +263,7 @@ int force; for (x = start_x; x <= end_x; x++) for (y = start_y; y <= end_y; y++) { if ((mtmp = m_at(x, y)) != 0) { - wakeup(mtmp); /* peaceful monster will become hostile */ + wakeup(mtmp, TRUE); /* peaceful monster will become hostile */ if (mtmp->mundetected && is_hider(mtmp->data)) { mtmp->mundetected = 0; if (cansee(x, y)) diff --git a/src/polyself.c b/src/polyself.c index 71f9ce8ba..869a37a07 100644 --- a/src/polyself.c +++ b/src/polyself.c @@ -1310,8 +1310,8 @@ dogaze() mon_nam(mtmp)); if (yn(qbuf) != 'y') continue; - setmangry(mtmp); } + setmangry(mtmp, TRUE); if (!mtmp->mcanmove || mtmp->mstun || mtmp->msleeping || !mtmp->mcansee || !haseyes(mtmp->data)) { looked--; diff --git a/src/potion.c b/src/potion.c index b5971dd79..38f5c6553 100644 --- a/src/potion.c +++ b/src/potion.c @@ -1488,7 +1488,7 @@ boolean your_fault; /* target might have been killed */ if (mon->mhp > 0) { if (angermon) - wakeup(mon); + wakeup(mon, TRUE); else mon->msleeping = 0; } diff --git a/src/priest.c b/src/priest.c index ec76c91bb..0cce5cf36 100644 --- a/src/priest.c +++ b/src/priest.c @@ -795,7 +795,8 @@ angry_priest() if ((priest = findpriest(temple_occupied(u.urooms))) != 0) { struct epri *eprip = EPRI(priest); - wakeup(priest); + wakeup(priest, FALSE); + setmangry(priest, FALSE); /* * If the altar has been destroyed or converted, let the * priest run loose. diff --git a/src/read.c b/src/read.c index 12e3cc002..efc36e3cb 100644 --- a/src/read.c +++ b/src/read.c @@ -901,7 +901,7 @@ struct obj *sobj; unsigned was_peaceful = mtmp->mpeaceful; if (sobj->cursed) { - setmangry(mtmp); + setmangry(mtmp, FALSE); if (was_peaceful && !mtmp->mpeaceful) return -1; } else { diff --git a/src/region.c b/src/region.c index 240f7270c..3ab0317b2 100644 --- a/src/region.c +++ b/src/region.c @@ -974,7 +974,7 @@ genericptr_t p2; if (cansee(mtmp->mx, mtmp->my)) pline("%s coughs!", Monnam(mtmp)); if (heros_fault(reg)) - setmangry(mtmp); + setmangry(mtmp, TRUE); if (haseyes(mtmp->data) && mtmp->mcansee) { mtmp->mblinded = 1; mtmp->mcansee = 0; diff --git a/src/trap.c b/src/trap.c index 9e5b2f500..23e26dec3 100644 --- a/src/trap.c +++ b/src/trap.c @@ -2119,7 +2119,7 @@ register struct monst *mtmp; Recognizing who made the trap isn't completely unreasonable; everybody has their own style. */ if (trap->madeby_u && rnl(5)) - setmangry(mtmp); + setmangry(mtmp, TRUE); in_sight = canseemon(mtmp); see_it = cansee(mtmp->mx, mtmp->my); @@ -4541,7 +4541,7 @@ boolean *noticed; /* set to true iff hero notices the effect; */ or if you sense the monster who becomes trapped */ *noticed = cansee(t->tx, t->ty) || canspotmon(mon); /* monster will be angered; mintrap doesn't handle that */ - wakeup(mon); + wakeup(mon, TRUE); ++force_mintrap; result = (mintrap(mon) != 0); --force_mintrap; diff --git a/src/uhitm.c b/src/uhitm.c index 832390694..a4a31cde0 100644 --- a/src/uhitm.c +++ b/src/uhitm.c @@ -145,7 +145,7 @@ struct obj *wep; /* uwep for attack(), null for kick_monster() */ if (!u.ustuck && !mtmp->mflee && dmgtype(mtmp->data, AD_STCK)) u.ustuck = mtmp; } - wakeup(mtmp); /* always necessary; also un-mimics mimics */ + wakeup(mtmp, TRUE); /* always necessary; also un-mimics mimics */ return TRUE; } @@ -190,7 +190,7 @@ struct obj *wep; /* uwep for attack(), null for kick_monster() */ */ if ((mtmp->mundetected || mtmp->m_ap_type) && sensemon(mtmp)) { mtmp->mundetected = 0; - wakeup(mtmp); + wakeup(mtmp, TRUE); } if (flags.confirm && mtmp->mpeaceful && !Confusion && !Hallucination @@ -573,7 +573,7 @@ int thrown; /* HMON_xxx (0 => hand-to-hand, other => ranged) */ unconventional[0] = '\0'; saved_oname[0] = '\0'; - wakeup(mon); + wakeup(mon, TRUE); if (!obj) { /* attack with bare hands */ if (mdat == &mons[PM_SHADE]) tmp = 0; @@ -894,7 +894,7 @@ int thrown; /* HMON_xxx (0 => hand-to-hand, other => ranged) */ pline("%s %s over %s!", what, vtense(what, "splash"), whom); } - setmangry(mon); + setmangry(mon, TRUE); mon->mcansee = 0; tmp = rn1(25, 21); if (((int) mon->mblinded + tmp) > 127) @@ -903,7 +903,7 @@ int thrown; /* HMON_xxx (0 => hand-to-hand, other => ranged) */ mon->mblinded += tmp; } else { pline(obj->otyp == CREAM_PIE ? "Splat!" : "Splash!"); - setmangry(mon); + setmangry(mon, TRUE); } if (thrown) obfree(obj, (struct obj *) 0); @@ -2097,7 +2097,7 @@ boolean wouldhavehit; else You("miss it."); if (!mdef->msleeping && mdef->mcanmove) - wakeup(mdef); + wakeup(mdef, TRUE); } /* attack monster as a monster. */ @@ -2178,7 +2178,7 @@ register struct monst *mon; sum[i] = damageum(mon, mattk); break; } - wakeup(mon); + wakeup(mon, TRUE); /* maybe this check should be in damageum()? */ if (mon->data == &mons[PM_SHADE] && !(mattk->aatyp == AT_KICK && uarmf @@ -2212,7 +2212,7 @@ register struct monst *mon; * already grabbed in a previous attack */ dhit = 1; - wakeup(mon); + wakeup(mon, TRUE); if (mon->data == &mons[PM_SHADE]) Your("hug passes harmlessly through %s.", mon_nam(mon)); else if (!sticks(mon->data) && !u.uswallow) { @@ -2230,7 +2230,7 @@ register struct monst *mon; case AT_EXPL: /* automatic hit if next to */ dhit = -1; - wakeup(mon); + wakeup(mon, TRUE); sum[i] = explum(mon, mattk); break; @@ -2238,7 +2238,7 @@ register struct monst *mon; tmp = find_roll_to_hit(mon, mattk->aatyp, (struct obj *) 0, &attknum, &armorpenalty); if ((dhit = (tmp > rnd(20 + i)))) { - wakeup(mon); + wakeup(mon, TRUE); if (mon->data == &mons[PM_SHADE]) Your("attempt to surround %s is harmless.", mon_nam(mon)); else { @@ -2637,7 +2637,7 @@ struct monst *mtmp; if (what) pline(fmt, what); - wakeup(mtmp); /* clears mimicking */ + wakeup(mtmp, FALSE); /* clears mimicking */ /* if hero is blind, wakeup() won't display the monster even though it's no longer concealed */ if (!canspotmon(mtmp) @@ -2695,7 +2695,7 @@ struct obj *otmp; /* source of flash */ } if (mtmp->mhp > 0) { if (!context.mon_moving) - setmangry(mtmp); + setmangry(mtmp, TRUE); if (tmp < 9 && !mtmp->isshk && rn2(4)) monflee(mtmp, rn2(4) ? rnd(100) : 0, FALSE, TRUE); mtmp->mcansee = 0; diff --git a/src/vault.c b/src/vault.c index 909cc3872..f076986f5 100644 --- a/src/vault.c +++ b/src/vault.c @@ -400,7 +400,7 @@ invault() } mongone(guard); } else { - setmangry(guard); + setmangry(guard, FALSE); if (Deaf) { if (!Blind) pline("%s mouths something and looks very angry!", diff --git a/src/zap.c b/src/zap.c index b2df5212f..9cf38e030 100644 --- a/src/zap.c +++ b/src/zap.c @@ -426,7 +426,7 @@ struct obj *otmp; } if (wake) { if (mtmp->mhp > 0) { - wakeup(mtmp); + wakeup(mtmp, TRUE); m_respond(mtmp); if (mtmp->isshk && !*u.ushops) hot_pursuit(mtmp); @@ -4535,12 +4535,9 @@ short exploding_wand_typ; You("%s of smoke.", !Blind ? "see a puff" : "smell a whiff"); } if ((mon = m_at(x, y)) != 0) { - /* Cannot use wakeup() which also angers the monster */ - mon->msleeping = 0; - if (mon->m_ap_type) - seemimic(mon); + wakeup(mon, FALSE); if (type >= 0) { - setmangry(mon); + setmangry(mon, TRUE); if (mon->ispriest && *in_rooms(mon->mx, mon->my, TEMPLE)) ghod_hitsu(mon); if (mon->isshk && !*u.ushops)