From: Alex Smith Date: Mon, 17 Oct 2016 17:15:57 +0000 (+0100) Subject: Differentiate between monster anger from attacks and from other causes X-Git-Tag: NetHack-3.6.1_RC01~558^2~3 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=ee5b4885148d08d390b075a2a11cd4fe8cdcb131;p=nethack Differentiate between monster anger from attacks and from other causes setmangry() and wakeup() were being used for multiple purposes. Add an extra parameter to track which. This fixes several minor bugs (e.g. whether monsters with no eyes were angered by (useless) gaze attacks against them previously depended on the state of a UI option, and the Minetown guards would be annoyed if you used a cursed scroll of tame monster on a shopkeeper). It's also a prerequisite for the Elbereth changes I'm working on. --- 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)