From: PatR Date: Sat, 7 May 2022 16:11:09 +0000 (-0700) Subject: dochugw(mon, X) X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=4fbda9ea34f4fa0a80238eb3542d49bb3b0c56dc;p=nethack dochugw(mon, X) Reverse the sense of dochugw()'s new 'X' argument. Use True for the usual case and False for the special case rather than the other way around. Call the special case variant when a monster teleports so that hero stops occupation if the monster jumps to a position where it becomes a threat. --- diff --git a/src/makemon.c b/src/makemon.c index 61f6ca255..dd6e3b439 100644 --- a/src/makemon.c +++ b/src/makemon.c @@ -1458,7 +1458,7 @@ makemon( } /* if discernable and a threat, stop fiddling while Rome burns */ if (g.occupation) - (void) dochugw(mtmp, TRUE); + (void) dochugw(mtmp, FALSE); /* TODO: unify with teleport appears msg */ } diff --git a/src/mon.c b/src/mon.c index 603cc4370..2686c3e98 100644 --- a/src/mon.c +++ b/src/mon.c @@ -1064,7 +1064,7 @@ movemon(void) && fightm(mtmp)) continue; /* mon might have died */ } - if (dochugw(mtmp, FALSE)) /* otherwise just move the monster */ + if (dochugw(mtmp, TRUE)) /* otherwise just move the monster */ continue; } diff --git a/src/monmove.c b/src/monmove.c index 722dfb7b5..aed2ab265 100644 --- a/src/monmove.c +++ b/src/monmove.c @@ -113,14 +113,15 @@ watch_on_duty(register struct monst* mtmp) int dochugw( register struct monst *mtmp, - boolean dontchug) /* True: monster was just created, or maybe it has - * teleported; perform stop-what-you're-doing-if-close- - * enough-to-be-a-threat check but don't move mtmp */ + boolean chug) /* True: monster is moving; + * False: monster was just created or has teleported + * so perform stop-what-you're-doing-if-close-enough- + * to-be-a-threat check but don't move mtmp */ { - int x = mtmp->mx, y = mtmp->my; - boolean already_saw_mon = ((dontchug || !g.occupation) ? 0 - : canspotmon(mtmp)); - int rd = dontchug ? 0 : dochug(mtmp); + int x = mtmp->mx, y = mtmp->my; /* 'mtmp's location before dochug() */ + /* skip canspotmon() if occupation is Null */ + boolean already_saw_mon = (chug && g.occupation) ? canspotmon(mtmp) : 0; + int rd = chug ? dochug(mtmp) : 0; /* * A similar check is in monster_nearby() in hack.c. diff --git a/src/teleport.c b/src/teleport.c index 82d49e425..71fd37777 100644 --- a/src/teleport.c +++ b/src/teleport.c @@ -1324,15 +1324,16 @@ rloc_to_core( Monnam(mtmp), next2u(x, y) ? " next to you" : (distu(x, y) <= (BOLT_LIM * BOLT_LIM)) ? " close by" - : (distu(x, y) < distu(oldx, oldy)) ? " closer to you" - : " further away"); + : (distu(x, y) < distu(oldx, oldy)) ? " closer to you" + : " further away"); } else { pline("%s %s%s%s!", appearmsg ? Amonnam(mtmp) : Monnam(mtmp), appearmsg ? "suddenly " : "", !Blind ? "appears" : "arrives", next2u(x, y) ? " next to you" - : (distu(x, y) <= (BOLT_LIM * BOLT_LIM)) ? " close by" : ""); + : (distu(x, y) <= (BOLT_LIM * BOLT_LIM)) ? " close by" + : ""); } } @@ -1342,6 +1343,10 @@ rloc_to_core( if (resident_shk && !inhishop(mtmp)) make_angry_shk(mtmp, oldx, oldy); + /* if hero is busy, maybe stop occupation */ + if (g.occupation) + (void) dochugw(mtmp, FALSE); + /* trapped monster teleported away */ if (mtmp->mtrapped && !mtmp->wormno) (void) mintrap(mtmp, NO_TRAP_FLAGS);