observing monster become invisible

Requested by one of the beta testers 13 months ago... when a visible
monster becomes invisible and vanishes, mark its map location with
the remembered, unseen monster glyph.  (When the player zaps a
monster with a wand of make invisible, that only happens if the wand
type is known.  I'm not sure that's right but didn't alter it....)

The request suggested also doing it for a monster who disappears by
teleporting away, but I haven't attempted to implement that.
This commit is contained in:
PatR
2016-07-09 15:03:03 -07:00
parent eb22f7f583
commit 617ab5968f
6 changed files with 23 additions and 12 deletions

View File

@@ -443,6 +443,8 @@ int spellnum;
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?");

View File

@@ -1207,8 +1207,8 @@ register struct monst *mtmp;
register struct obj *otmp;
{
int tmp;
boolean reveal_invis = FALSE;
if (mtmp != &youmonst) {
mtmp->msleeping = 0;
if (mtmp->m_ap_type)
@@ -1819,12 +1819,15 @@ struct monst *mtmp;
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);
}

View File

@@ -1379,10 +1379,15 @@ boolean your_fault;
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)) {

View File

@@ -956,11 +956,9 @@ struct monst *mtmp;
*
* 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)
@@ -974,15 +972,15 @@ register int 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);

View File

@@ -280,6 +280,7 @@ struct obj *otmp;
mon_set_minvis(mtmp);
if (!oldinvis && knowninvisible(mtmp)) {
pline("%s turns transparent!", nambuf);
reveal_invis = TRUE;
learn_it = TRUE;
}
break;