diff --git a/include/hack.h b/include/hack.h index 8cd0b0e17..7fb80fd24 100644 --- a/include/hack.h +++ b/include/hack.h @@ -1043,6 +1043,7 @@ typedef uint32_t mmflags_nht; /* makemon MM_ flags */ #define GP_CHECKSCARY 0x200000L /* check monster for onscary() */ #define MM_NOEXCLAM 0x400000L /* more sedate " appears." mesg for ^G */ #define MM_IGNORELAVA 0x800000L /* ignore lava when positioning */ +#define MM_MINVIS 0x01000000L /* for ^G/create_particular */ /* flags for make_corpse() and mkcorpstat(); 0..7 are recorded in obj->spe */ #define CORPSTAT_NONE 0x00 diff --git a/src/makemon.c b/src/makemon.c index e21986cf2..046290810 100644 --- a/src/makemon.c +++ b/src/makemon.c @@ -1270,6 +1270,8 @@ makemon( mtmp->mcansee = mtmp->mcanmove = TRUE; mtmp->seen_resistance = M_SEEN_NOTHING; mtmp->mpeaceful = (mmflags & MM_ANGRY) ? FALSE : peace_minded(ptr); + if ((mmflags & MM_MINVIS) != 0) /* for ^G */ + mon_set_minvis(mtmp); /* call after place_monster() */ switch (ptr->mlet) { case S_MIMIC: diff --git a/src/read.c b/src/read.c index cfa04c0d6..22eaef058 100644 --- a/src/read.c +++ b/src/read.c @@ -3160,6 +3160,9 @@ create_particular_creation( /* whichpm = rndmonst(); */ /* mmflags |= (d->fem == FEMALE) ? MM_FEMALE : MM_MALE; */ } + if (d->invisible) + mmflags |= MM_MINVIS; + mtmp = makemon(whichpm, u.ux, u.uy, mmflags); if (!mtmp) { /* quit trying if creation failed and is going to repeat */ @@ -3181,24 +3184,17 @@ create_particular_creation( put_saddle_on_mon(otmp, mtmp); } - if (d->invisible) { - mon_set_minvis(mtmp); - if (does_block(mx, my, &levl[mx][my])) - block_point(mx, my); - else - unblock_point(mx, my); - } - if (d->hidden + if (d->hidden && ((is_hider(mtmp->data) && mtmp->data->mlet != S_MIMIC) || (hides_under(mtmp->data) && OBJ_AT(mx, my)) || (mtmp->data->mlet == S_EEL && is_pool(mx, my)))) mtmp->mundetected = 1; if (d->sleeping) mtmp->msleeping = 1; - /* iff asking for 'hidden', show location of every created monster + /* if asking for 'hidden', show location of every created monster that can't be seen--whether that's due to successfully hiding or vision issues (line-of-sight, invisibility, blindness) */ - if (d->hidden && !canspotmon(mtmp)) { + if ((d->hidden || d->invisible) && !canspotmon(mtmp)) { int count = couldsee(mx, my) ? 8 : 4; char saveviz = gv.viz_array[my][mx];