gold's stale location coordinates didn't happen to be inside the shop
when confused scroll of light summoned lights, player would be asked what to
call the scroll even if scroll of light was already identified
+if a visible monster becomes invisible, mark its spot with the 'remembered,
+ unseen monster' glyph ('I' character or '?' tile)
Fixes to Post-3.6.0 Problems that Were Exposed Via git Repository
pline("%s suddenly %s!", Monnam(mtmp),
!See_invisible ? "disappears" : "becomes transparent");
mon_set_minvis(mtmp);
+ if (cansee(mtmp->mx, mtmp->my) && !canspotmon(mtmp))
+ map_invisible(mtmp->mx, mtmp->my);
dmg = 0;
} else
impossible("no reason for monster to cast disappear spell?");
register struct obj *otmp;
{
int tmp;
-
boolean reveal_invis = FALSE;
+
if (mtmp != &youmonst) {
mtmp->msleeping = 0;
if (mtmp->m_ap_type)
Strcpy(nambuf, mon_nam(mtmp));
mon_set_minvis(mtmp);
if (vismon && mtmp->minvis) { /* was seen, now invisible */
- if (canspotmon(mtmp))
+ if (canspotmon(mtmp)) {
pline("%s body takes on a %s transparency.",
upstart(s_suffix(nambuf)),
Hallucination ? "normal" : "strange");
- else
+ } else {
pline("Suddenly you cannot see %s.", nambuf);
+ if (vis)
+ map_invisible(mtmp->mx, mtmp->my);
+ }
if (oseen)
makeknown(otmp->otyp);
}
if (!resist(mon, POTION_CLASS, 0, NOTELL))
mon->mconf = TRUE;
break;
- case POT_INVISIBILITY:
+ case POT_INVISIBILITY: {
+ boolean sawit = canspotmon(mon);
+
angermon = FALSE;
mon_set_minvis(mon);
+ if (sawit && !canspotmon(mon) && cansee(mon->mx, mon->my))
+ map_invisible(mon->mx, mon->my);
break;
+ }
case POT_SLEEPING:
/* wakeup() doesn't rouse victims of temporary sleep */
if (sleep_monst(mon, rnd(12), POTION_CLASS)) {
*
* Pulls a monster from its current position and places a monster at
* a new x and y. If oldx is 0, then the monster was not in the
- * levels.monsters
- * array. However, if oldx is 0, oldy may still have a value because mtmp is
- * a
- * migrating_mon. Worm tails are always placed randomly around the head of
- * the worm.
+ * levels.monsters array. However, if oldx is 0, oldy may still have
+ * a value because mtmp is a migrating_mon. Worm tails are always
+ * placed randomly around the head of the worm.
*/
void
rloc_to(mtmp, x, y)
return;
if (oldx) { /* "pick up" monster */
- if (mtmp->wormno)
+ if (mtmp->wormno) {
remove_worm(mtmp);
- else {
+ } else {
remove_monster(oldx, oldy);
newsym(oldx, oldy); /* update old location */
}
}
- memset(mtmp->mtrack, 0, sizeof(mtmp->mtrack));
+ memset(mtmp->mtrack, 0, sizeof mtmp->mtrack);
place_monster(mtmp, x, y); /* put monster down */
update_monster_region(mtmp);
mon_set_minvis(mtmp);
if (!oldinvis && knowninvisible(mtmp)) {
pline("%s turns transparent!", nambuf);
+ reveal_invis = TRUE;
learn_it = TRUE;
}
break;