diff --git a/doc/fixes3-7-0.txt b/doc/fixes3-7-0.txt index 68feecfc7..d3540e931 100644 --- a/doc/fixes3-7-0.txt +++ b/doc/fixes3-7-0.txt @@ -975,6 +975,7 @@ some large monsters can knock back smaller monsters with a hit change Demonbane to a mace, make it the first sac gift for priests, and give it an invoke ability to banish demons wielding Giantslayer prevents knockback from larger monsters +scared hostile monster which cannot move away will attack Fixes to 3.7.0-x Problems that Were Exposed Via git Repository diff --git a/include/hack.h b/include/hack.h index f8d252e23..60f280c6e 100644 --- a/include/hack.h +++ b/include/hack.h @@ -440,6 +440,7 @@ typedef uint32_t mmflags_nht; /* makemon MM_ flags */ #define MMOVE_MOVED 1 /* monster moved */ #define MMOVE_DIED 2 /* monster died */ #define MMOVE_DONE 3 /* monster used up all actions */ +#define MMOVE_NOMOVES 4 /* monster has no valid locations to move to */ /*** some utility macros ***/ #define yn(query) yn_function(query, ynchars, 'n') diff --git a/src/monmove.c b/src/monmove.c index 23cf6455e..4b855997c 100644 --- a/src/monmove.c +++ b/src/monmove.c @@ -473,6 +473,7 @@ dochug(register struct monst* mtmp) register int tmp = MMOVE_NOTHING; int inrange, nearby, scared, res; struct obj *otmp; + boolean panicattk = FALSE; /* Pre-movement adjustments */ @@ -734,6 +735,10 @@ dochug(register struct monst* mtmp) distfleeck(mtmp, &inrange, &nearby, &scared); /* recalc */ switch (tmp) { /* for pets, cases 0 and 3 are equivalent */ + case MMOVE_NOMOVES: + if (scared) + panicattk = TRUE; + /*FALLTHRU*/ case MMOVE_NOTHING: /* no movement, but it can still attack you */ case MMOVE_DONE: /* absolutely no movement */ /* vault guard might have vanished */ @@ -775,7 +780,7 @@ dochug(register struct monst* mtmp) if (tmp != MMOVE_DONE && (!mtmp->mpeaceful || (Conflict && !resist_conflict(mtmp)))) { - if (inrange && !scared && !noattacks(mdat) + if (((inrange && !scared) || panicattk) && !noattacks(mdat) /* [is this hp check really needed?] */ && (Upolyd ? u.mh : u.uhp) > 0) { if (mattacku(mtmp)) @@ -1342,6 +1347,8 @@ m_move(register struct monst* mtmp, register int after) coord poss[9]; cnt = mfndpos(mtmp, poss, info, flag); + if (cnt == 0) + return MMOVE_NOMOVES; chcnt = 0; jcnt = min(MTSZ, cnt - 1); chi = -1; @@ -1378,7 +1385,7 @@ m_move(register struct monst* mtmp, register int after) nearer = ((ndist = dist2(nx, ny, gx, gy)) < nidist); if ((appr == 1 && nearer) || (appr == -1 && !nearer) - || (!appr && !rn2(++chcnt)) || !mmoved) { + || (!appr && !rn2(++chcnt)) || (mmoved == MMOVE_NOTHING)) { nix = nx; niy = ny; nidist = ndist; @@ -1390,7 +1397,7 @@ m_move(register struct monst* mtmp, register int after) } } - if (mmoved) { + if (mmoved != MMOVE_NOTHING) { if (mmoved == MMOVE_MOVED && (u.ux != nix || u.uy != niy) && itsstuck(mtmp)) return MMOVE_DONE;