diff --git a/src/cmd.c b/src/cmd.c index 420be4efb..823f7490a 100644 --- a/src/cmd.c +++ b/src/cmd.c @@ -1916,14 +1916,14 @@ DISABLE_WARNING_CONDEXPR_IS_CONSTANT static int wiz_smell(void) { - int ans = 0; - int mndx; /* monster index */ - coord cc; /* screen pos of unknown glyph */ - int glyph; /* glyph at selected position */ + struct monst *mtmp; /* monster being smelled */ + struct permonst *mptr; + int ans, glyph; + coord cc; /* screen pos to sniff */ + boolean is_you; cc.x = u.ux; cc.y = u.uy; - mndx = 0; /* gcc -Wall lint */ if (!olfaction(gy.youmonst.data)) { You("are incapable of detecting odors in your present form."); return ECMD_OK; @@ -1936,18 +1936,36 @@ wiz_smell(void) if (ans < 0 || cc.x < 0) { return ECMD_CANCEL; /* done */ } - /* Convert the glyph at the selected position to a mndxbol. */ + is_you = FALSE; + if (u_at(cc.x, cc.y)) { + if (u.usteed) { + mptr = u.usteed->data; + } else { + mptr = gy.youmonst.data; + is_you = TRUE; + } + } else if ((mtmp = m_at(cc.x, cc.y)) != (struct monst *) 0) { + mptr = mtmp->data; + } else { + mptr = (struct permonst *) 0; + } + /* Buglet: mapping or unmapping "remembered, unseen monster" should + cause time to elapse; since we're in wizmode, don't bother */ glyph = glyph_at(cc.x, cc.y); - if (glyph_is_monster(glyph)) - mndx = glyph_to_mon(glyph); - else - mndx = 0; /* Is it a monster? */ - if (mndx) { - if (!usmellmon(&mons[mndx])) - pline("That monster seems to give off no smell."); - } else - pline("That is not a monster."); + if (mptr) { + if (is_you) + You("surreptitiously sniff under your %s.", body_part(ARM)); + if (!usmellmon(mptr)) + pline("%s to not give off any smell.", + is_you ? "You seem" : "That monster seems"); + if (!glyph_is_monster(glyph)) + map_invisible(cc.x, cc.y); + } else { + You("don't smell any monster there."); + if (glyph_is_invisible(glyph)) + unmap_invisible(cc.x, cc.y); + } } while (TRUE); return ECMD_OK; }