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

@@ -314,6 +314,8 @@ for #tip inside shop, credit was incorrectly given for spilled gold if that
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

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;