diff --git a/doc/fixes35.0 b/doc/fixes35.0 index db4774e97..d1b142194 100644 --- a/doc/fixes35.0 +++ b/doc/fixes35.0 @@ -231,6 +231,8 @@ override non-silver vs shades for artifacts which deal extra damage to undead assorted mirror fixes--mainly visibility issues some monsters can't be strangled; self-polymorph can stop/restart strangulation re-adjust gem generation probabilities when revisiting existing dungeon levels +kick evasion shouldn't move monsters through walls +kick evasion and jousting/staggering blows shouldn't move grid bugs diagonally Platform- and/or Interface-Specific Fixes diff --git a/include/extern.h b/include/extern.h index fbbaea8ee..d31578afe 100644 --- a/include/extern.h +++ b/include/extern.h @@ -1289,6 +1289,7 @@ E void FDECL(killed, (struct monst *)); E void FDECL(xkilled, (struct monst *,int)); E void FDECL(mon_to_stone, (struct monst*)); 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 *)); diff --git a/src/dokick.c b/src/dokick.c index 057798b0b..4bc983443 100644 --- a/src/dokick.c +++ b/src/dokick.c @@ -206,7 +206,7 @@ doit: (void) passive(mon, FALSE, 1, AT_KICK, FALSE); return; } else { - mnexto(mon); + maybe_mnexto(mon); if(mon->mx != x || mon->my != y) { if(glyph_is_invisible(levl[x][y].glyph)) { unmap_object(x, y); diff --git a/src/dothrow.c b/src/dothrow.c index fd3748564..3941e218e 100644 --- a/src/dothrow.c +++ b/src/dothrow.c @@ -724,6 +724,8 @@ mhurtle(mon, dx, dy, range) dx = sgn(dx); dy = sgn(dy); if(!range || (!dx && !dy)) return; /* paranoia */ + /* don't let grid bugs be hurtled diagonally */ + if (dx && dy && NODIAG(monsndx(mon->data))) return; /* Send the monster along the path */ mc.x = mon->mx; diff --git a/src/mon.c b/src/mon.c index 027ccb51f..25ceed878 100644 --- a/src/mon.c +++ b/src/mon.c @@ -2121,6 +2121,7 @@ mon_to_stone(mtmp) impossible("Can't polystone %s!", a_monnam(mtmp)); } +/* might place monst on far side of a wall or boulder */ void mnexto(mtmp) /* Make monster mtmp next to you (if possible) */ struct monst *mtmp; @@ -2148,6 +2149,27 @@ mnexto(mtmp) /* Make monster mtmp next to you (if possible) */ return; } +/* like mnexto() but requires destination to be directly accessible */ +void +maybe_mnexto(mtmp) +struct monst *mtmp; +{ + coord mm; + struct permonst *ptr = mtmp->data; + boolean diagok = !NODIAG(ptr - mons); + int tryct = 20; + + do { + if (!enexto(&mm, u.ux, u.uy, ptr)) return; + if (couldsee(mm.x, mm.y) && + /* don't move grid bugs diagonally */ + (diagok || mm.x == mtmp->mx || mm.y == mtmp->my)) { + rloc_to(mtmp, mm.x, mm.y); + return; + } + } while (--tryct > 0); +} + /* mnearto() * Put monster near (or at) location if possible. * Returns: