diff --git a/include/hack.h b/include/hack.h index dba6bcc1b..d9b59d402 100644 --- a/include/hack.h +++ b/include/hack.h @@ -291,10 +291,11 @@ typedef struct sortloot_item Loot; #define MM_NOTAIL 0x008000L /* if a long worm, don't give it a tail */ #define MM_MALE 0x010000L /* male variation */ #define MM_FEMALE 0x020000L /* female variation */ +#define MM_NOMSG 0x040000L /* no appear message */ /* if more MM_ flag masks are added, skip or renumber the GP_ one(s) */ -#define GP_ALLOW_XY 0x040000L /* [actually used by enexto() to decide whether +#define GP_ALLOW_XY 0x080000L /* [actually used by enexto() to decide whether * to make an extra call to goodpos()] */ -#define GP_ALLOW_U 0x080000L /* don't reject hero's location */ +#define GP_ALLOW_U 0x100000L /* don't reject hero's location */ /* flags for make_corpse() and mkcorpstat(); 0..7 are recorded in obj->spe */ #define CORPSTAT_NONE 0x00 diff --git a/src/apply.c b/src/apply.c index bca5a82e0..7ce9c6673 100644 --- a/src/apply.c +++ b/src/apply.c @@ -1051,7 +1051,7 @@ use_bell(struct obj **optr) && !(g.mvitals[PM_WOOD_NYMPH].mvflags & G_GONE) && !(g.mvitals[PM_WATER_NYMPH].mvflags & G_GONE) && !(g.mvitals[PM_MOUNTAIN_NYMPH].mvflags & G_GONE) - && (mtmp = makemon(mkclass(S_NYMPH, 0), u.ux, u.uy, NO_MINVENT)) + && (mtmp = makemon(mkclass(S_NYMPH, 0), u.ux, u.uy, NO_MINVENT|MM_NOMSG)) != 0) { You("summon %s!", a_monnam(mtmp)); if (!obj_resists(obj, 93, 100)) { diff --git a/src/cmd.c b/src/cmd.c index ec3f62544..9bb26fb2c 100644 --- a/src/cmd.c +++ b/src/cmd.c @@ -3015,7 +3015,7 @@ wiz_migrate_mons(void) else get_level(&tolevel, depth(&u.uz) + 1); ptr = rndmonst(); - mtmp = makemon(ptr, 0, 0, NO_MM_FLAGS); + mtmp = makemon(ptr, 0, 0, NO_MM_FLAGS|MM_NOMSG); if (mtmp) migrate_to_level(mtmp, ledger_no(&tolevel), MIGR_RANDOM, (coord *) 0); diff --git a/src/dig.c b/src/dig.c index 2f40f23a5..6e333382b 100644 --- a/src/dig.c +++ b/src/dig.c @@ -437,10 +437,10 @@ dig(void) switch (rn2(2)) { case 0: mtmp = makemon(&mons[PM_EARTH_ELEMENTAL], dpx, dpy, - NO_MM_FLAGS); + NO_MM_FLAGS|MM_NOMSG); break; default: - mtmp = makemon(&mons[PM_XORN], dpx, dpy, NO_MM_FLAGS); + mtmp = makemon(&mons[PM_XORN], dpx, dpy, NO_MM_FLAGS|MM_NOMSG); break; } if (mtmp) @@ -933,13 +933,13 @@ dig_up_grave(coord *cc) if (!Blind) pline(Hallucination ? "Dude! The living dead!" : "The grave's owner is very upset!"); - (void) makemon(mkclass(S_ZOMBIE, 0), dig_x, dig_y, NO_MM_FLAGS); + (void) makemon(mkclass(S_ZOMBIE, 0), dig_x, dig_y, MM_NOMSG); break; case 3: if (!Blind) pline(Hallucination ? "I want my mummy!" : "You've disturbed a tomb!"); - (void) makemon(mkclass(S_MUMMY, 0), dig_x, dig_y, NO_MM_FLAGS); + (void) makemon(mkclass(S_MUMMY, 0), dig_x, dig_y, MM_NOMSG); break; default: /* No corpse */ diff --git a/src/dog.c b/src/dog.c index d41f5987f..a3bed238d 100644 --- a/src/dog.c +++ b/src/dog.c @@ -99,7 +99,7 @@ make_familiar(struct obj *otmp, xchar x, xchar y, boolean quietly) } } - mmflags = MM_EDOG | MM_IGNOREWATER | NO_MINVENT; + mmflags = MM_EDOG | MM_IGNOREWATER | NO_MINVENT | MM_NOMSG; cgend = otmp ? (otmp->spe & CORPSTAT_GENDER) : 0; mmflags |= ((cgend == CORPSTAT_FEMALE) ? MM_FEMALE : (cgend == CORPSTAT_MALE) ? MM_MALE : 0L); diff --git a/src/dokick.c b/src/dokick.c index 4a4bd107c..a81d2441b 100644 --- a/src/dokick.c +++ b/src/dokick.c @@ -1133,7 +1133,7 @@ dokick(void) while (cnt--) { if (enexto(&mm, mm.x, mm.y, &mons[PM_KILLER_BEE]) && makemon(&mons[PM_KILLER_BEE], mm.x, mm.y, - MM_ANGRY)) + MM_ANGRY|MM_NOMSG)) made++; } if (made) @@ -1164,7 +1164,7 @@ dokick(void) else pline("A %s ooze gushes up from the drain!", hcolor(NH_BLACK)); - (void) makemon(&mons[PM_BLACK_PUDDING], x, y, NO_MM_FLAGS); + (void) makemon(&mons[PM_BLACK_PUDDING], x, y, MM_NOMSG); exercise(A_DEX, TRUE); newsym(x, y); g.maploc->looted |= S_LPUDDING; @@ -1174,8 +1174,8 @@ dokick(void) /* can't resist... */ pline("%s returns!", (Blind ? Something : "The dish washer")); if (makemon(&mons[PM_AMOROUS_DEMON], x, y, - (gend == 1 || (gend == 2 && rn2(2))) - ? MM_MALE : MM_FEMALE)) + MM_NOMSG | ((gend == 1 || (gend == 2 && rn2(2))) + ? MM_MALE : MM_FEMALE))) newsym(x, y); g.maploc->looted |= S_LDWASHER; exercise(A_DEX, TRUE); diff --git a/src/dothrow.c b/src/dothrow.c index c0682e77b..763a0a555 100644 --- a/src/dothrow.c +++ b/src/dothrow.c @@ -2109,7 +2109,7 @@ release_camera_demon(struct obj *obj, xchar x, xchar y) struct monst *mtmp; if (!rn2(3) && (mtmp = makemon(&mons[rn2(3) ? PM_HOMUNCULUS : PM_IMP], x, y, - NO_MM_FLAGS)) != 0) { + MM_NOMSG)) != 0) { if (canspotmon(mtmp)) pline("%s is released!", Hallucination ? An(rndmonnam(NULL)) diff --git a/src/fountain.c b/src/fountain.c index 1cf621606..fad5599d2 100644 --- a/src/fountain.c +++ b/src/fountain.c @@ -43,7 +43,7 @@ dowatersnakes(void) You_hear("%s hissing!", something); while (num-- > 0) if ((mtmp = makemon(&mons[PM_WATER_MOCCASIN], u.ux, u.uy, - NO_MM_FLAGS)) != 0 + MM_NOMSG)) != 0 && t_at(mtmp->mx, mtmp->my)) (void) mintrap(mtmp); } else @@ -58,7 +58,7 @@ dowaterdemon(void) if (!(g.mvitals[PM_WATER_DEMON].mvflags & G_GONE)) { if ((mtmp = makemon(&mons[PM_WATER_DEMON], u.ux, u.uy, - NO_MM_FLAGS)) != 0) { + MM_NOMSG)) != 0) { if (!Blind) You("unleash %s!", a_monnam(mtmp)); else @@ -86,7 +86,7 @@ dowaternymph(void) if (!(g.mvitals[PM_WATER_NYMPH].mvflags & G_GONE) && (mtmp = makemon(&mons[PM_WATER_NYMPH], u.ux, u.uy, - NO_MM_FLAGS)) != 0) { + MM_NOMSG)) != 0) { if (!Blind) You("attract %s!", a_monnam(mtmp)); else @@ -553,7 +553,7 @@ drinksink(void) if (g.mvitals[PM_SEWER_RAT].mvflags & G_GONE) pline_The("sink seems quite dirty."); else { - mtmp = makemon(&mons[PM_SEWER_RAT], u.ux, u.uy, NO_MM_FLAGS); + mtmp = makemon(&mons[PM_SEWER_RAT], u.ux, u.uy, MM_NOMSG); if (mtmp) pline("Eek! There's %s in the sink!", (Blind || !canspotmon(mtmp)) ? "something squirmy" @@ -593,7 +593,7 @@ drinksink(void) case 7: pline_The("%s moves as though of its own will!", hliquid("water")); if ((g.mvitals[PM_WATER_ELEMENTAL].mvflags & G_GONE) - || !makemon(&mons[PM_WATER_ELEMENTAL], u.ux, u.uy, NO_MM_FLAGS)) + || !makemon(&mons[PM_WATER_ELEMENTAL], u.ux, u.uy, MM_NOMSG)) pline("But it quiets down."); break; case 8: diff --git a/src/makemon.c b/src/makemon.c index d9769521e..d70fe1c28 100644 --- a/src/makemon.c +++ b/src/makemon.c @@ -1409,8 +1409,17 @@ makemon(register struct permonst *ptr, if (allow_minvent && g.migrating_objs) deliver_obj_to_mon(mtmp, 1, DF_NONE); /* in case of waiting items */ - if (!g.in_mklev) + if (!g.in_mklev) { newsym(mtmp->mx, mtmp->my); /* make sure the mon shows up */ + if (!(mmflags & MM_NOMSG) + && ((canseemon(mtmp) && (M_AP_TYPE(mtmp) == M_AP_NOTHING + || M_AP_TYPE(mtmp) == M_AP_MONSTER)) + || sensemon(mtmp))) + pline("%s suddenly appears%s!", Amonnam(mtmp), + distu(x, y) <= 2 ? " next to you" + : (distu(x, y) <= (BOLT_LIM * BOLT_LIM)) ? " close by" : ""); + /* TODO: unify with teleport appears msg */ + } return mtmp; } diff --git a/src/mcastu.c b/src/mcastu.c index 76a53fd2f..7d5dfaac6 100644 --- a/src/mcastu.c +++ b/src/mcastu.c @@ -613,7 +613,7 @@ cast_cleric_spell(struct monst *mtmp, int dmg, int spellnum) if (!enexto(&bypos, mtmp->mux, mtmp->muy, mtmp->data)) break; if ((pm = mkclass(let, 0)) != 0 - && (mtmp2 = makemon(pm, bypos.x, bypos.y, MM_ANGRY)) != 0) { + && (mtmp2 = makemon(pm, bypos.x, bypos.y, MM_ANGRY|MM_NOMSG)) != 0) { success = TRUE; mtmp2->msleeping = mtmp2->mpeaceful = mtmp2->mtame = 0; set_malign(mtmp2); diff --git a/src/mhitu.c b/src/mhitu.c index 99adda4a2..002712048 100644 --- a/src/mhitu.c +++ b/src/mhitu.c @@ -838,9 +838,10 @@ summonmu(struct monst *mtmp, boolean youseeit) char buf[BUFSZ], genericwere[BUFSZ]; Strcpy(genericwere, "creature"); + if (youseeit) + pline("%s summons help!", Monnam(mtmp)); numhelp = were_summon(mdat, FALSE, &numseen, genericwere); if (youseeit) { - pline("%s summons help!", Monnam(mtmp)); if (numhelp > 0) { if (numseen == 0) You_feel("hemmed in."); @@ -2300,7 +2301,8 @@ cloneu(void) return (struct monst *) 0; if (g.mvitals[mndx].mvflags & G_EXTINCT) return (struct monst *) 0; - mon = makemon(g.youmonst.data, u.ux, u.uy, NO_MINVENT | MM_EDOG); + mon = makemon(g.youmonst.data, u.ux, u.uy, + NO_MINVENT | MM_EDOG | MM_NOMSG); if (!mon) return NULL; mon->mcloned = 1; diff --git a/src/minion.c b/src/minion.c index 50885709b..70e281565 100644 --- a/src/minion.c +++ b/src/minion.c @@ -142,7 +142,7 @@ msummon(struct monst *mon) xlight = FALSE; while (cnt > 0) { - mtmp = makemon(&mons[dtype], u.ux, u.uy, MM_EMIN); + mtmp = makemon(&mons[dtype], u.ux, u.uy, MM_EMIN|MM_NOMSG); if (mtmp) { result++; /* an angel's alignment should match the summoner */ @@ -215,7 +215,7 @@ summon_minion(aligntyp alignment, boolean talk) if (mnum == NON_PM) { mon = 0; } else if (mnum == PM_ANGEL) { - mon = makemon(&mons[mnum], u.ux, u.uy, MM_EMIN); + mon = makemon(&mons[mnum], u.ux, u.uy, MM_EMIN|MM_NOMSG); if (mon) { mon->isminion = 1; EMIN(mon)->min_align = alignment; @@ -225,14 +225,14 @@ summon_minion(aligntyp alignment, boolean talk) && mnum != PM_ALIGNED_CLERIC && mnum != PM_HIGH_CLERIC) { /* This was mons[mnum].pxlth == 0 but is this restriction appropriate or necessary now that the structures are separate? */ - mon = makemon(&mons[mnum], u.ux, u.uy, MM_EMIN); + mon = makemon(&mons[mnum], u.ux, u.uy, MM_EMIN|MM_NOMSG); if (mon) { mon->isminion = 1; EMIN(mon)->min_align = alignment; EMIN(mon)->renegade = FALSE; } } else { - mon = makemon(&mons[mnum], u.ux, u.uy, NO_MM_FLAGS); + mon = makemon(&mons[mnum], u.ux, u.uy, MM_NOMSG); } if (mon) { if (talk) { diff --git a/src/muse.c b/src/muse.c index 5336d275f..f9026204e 100644 --- a/src/muse.c +++ b/src/muse.c @@ -65,7 +65,7 @@ precheck(struct monst* mon, struct obj* obj) return 0; mquaffmsg(mon, obj); m_useup(mon, obj); - mtmp = makemon(&mons[PM_GHOST], cc.x, cc.y, NO_MM_FLAGS); + mtmp = makemon(&mons[PM_GHOST], cc.x, cc.y, MM_NOMSG); if (!mtmp) { if (vis) pline1(empty); @@ -91,7 +91,7 @@ precheck(struct monst* mon, struct obj* obj) return 0; mquaffmsg(mon, obj); m_useup(mon, obj); - mtmp = makemon(&mons[PM_DJINNI], cc.x, cc.y, NO_MM_FLAGS); + mtmp = makemon(&mons[PM_DJINNI], cc.x, cc.y, MM_NOMSG); if (!mtmp) { if (vis) pline1(empty); diff --git a/src/pickup.c b/src/pickup.c index e0e62c98f..8539b2e8d 100644 --- a/src/pickup.c +++ b/src/pickup.c @@ -2586,7 +2586,7 @@ observe_quantum_cat(struct obj *box, boolean makecat, boolean givemsg) if (itsalive) { if (makecat) livecat = makemon(&mons[PM_HOUSECAT], box->ox, box->oy, - NO_MINVENT | MM_ADJACENTOK); + NO_MINVENT | MM_ADJACENTOK | MM_NOMSG); if (livecat) { livecat->mpeaceful = 1; set_malign(livecat); diff --git a/src/potion.c b/src/potion.c index a8bad0fa1..87c62d7d7 100644 --- a/src/potion.c +++ b/src/potion.c @@ -465,7 +465,7 @@ self_invis_message(void) static void ghost_from_bottle(void) { - struct monst *mtmp = makemon(&mons[PM_GHOST], u.ux, u.uy, NO_MM_FLAGS); + struct monst *mtmp = makemon(&mons[PM_GHOST], u.ux, u.uy, MM_NOMSG); if (!mtmp) { pline("This bottle turns out to be empty."); @@ -2567,7 +2567,7 @@ djinni_from_bottle(struct obj *obj) struct monst *mtmp; int chance; - if (!(mtmp = makemon(&mons[PM_DJINNI], u.ux, u.uy, NO_MM_FLAGS))) { + if (!(mtmp = makemon(&mons[PM_DJINNI], u.ux, u.uy, MM_NOMSG))) { pline("It turns out to be empty."); return; } diff --git a/src/pray.c b/src/pray.c index 75ca2941e..a6b57a5f6 100644 --- a/src/pray.c +++ b/src/pray.c @@ -1426,7 +1426,7 @@ dosacrifice(void) demonless_msg = "blood coagulates"; } if ((pm = dlord(altaralign)) != NON_PM - && (dmon = makemon(&mons[pm], u.ux, u.uy, NO_MM_FLAGS)) + && (dmon = makemon(&mons[pm], u.ux, u.uy, MM_NOMSG)) != 0) { char dbuf[BUFSZ]; diff --git a/src/priest.c b/src/priest.c index 63692de00..2b97fe130 100644 --- a/src/priest.c +++ b/src/priest.c @@ -514,7 +514,7 @@ intemple(int roomno) make sure we give one the first time */ } if (!rn2(5) - && (mtmp = makemon(&mons[PM_GHOST], u.ux, u.uy, NO_MM_FLAGS)) + && (mtmp = makemon(&mons[PM_GHOST], u.ux, u.uy, MM_NOMSG)) != 0) { int ngen = g.mvitals[PM_GHOST].born; if (canspotmon(mtmp)) @@ -678,7 +678,7 @@ mk_roamer(struct permonst *ptr, aligntyp alignment, xchar x, xchar y, if (MON_AT(x, y)) (void) rloc(m_at(x, y), RLOC_NOMSG); /* insurance */ - if (!(roamer = makemon(ptr, x, y, MM_ADJACENTOK | MM_EMIN))) + if (!(roamer = makemon(ptr, x, y, MM_ADJACENTOK | MM_EMIN | MM_NOMSG))) return (struct monst *) 0; EMIN(roamer)->min_align = alignment; diff --git a/src/read.c b/src/read.c index bd25f9c4c..e92baeb7f 100644 --- a/src/read.c +++ b/src/read.c @@ -1584,7 +1584,7 @@ seffect_light(struct obj **sobjp) for (i = 0; i < numlights; ++i) { struct monst * mon = makemon(&mons[pm], u.ux, u.uy, - MM_EDOG | NO_MINVENT); + MM_EDOG | NO_MINVENT | MM_NOMSG); initedog(mon); mon->msleeping = 0; mon->mcan = TRUE; @@ -2680,7 +2680,7 @@ do_genocide(int how) if (!(mons[mndx].geno & G_UNIQ) && !(g.mvitals[mndx].mvflags & (G_GENOD | G_EXTINCT))) for (i = rn1(3, 4); i > 0; i--) { - if (!makemon(ptr, u.ux, u.uy, NO_MINVENT)) + if (!makemon(ptr, u.ux, u.uy, NO_MINVENT|MM_NOMSG)) break; /* couldn't make one */ ++cnt; if (g.mvitals[mndx].mvflags & G_EXTINCT) diff --git a/src/shk.c b/src/shk.c index 8d5b72092..35578c23c 100644 --- a/src/shk.c +++ b/src/shk.c @@ -4108,7 +4108,7 @@ makekops(coord* mm) while (cnt--) if (enexto(mm, mm->x, mm->y, &mons[mndx])) - (void) makemon(&mons[mndx], mm->x, mm->y, NO_MM_FLAGS); + (void) makemon(&mons[mndx], mm->x, mm->y, MM_NOMSG); } } diff --git a/src/sp_lev.c b/src/sp_lev.c index a273c0189..5ec3ca445 100644 --- a/src/sp_lev.c +++ b/src/sp_lev.c @@ -2243,7 +2243,7 @@ create_object(object* o, struct mkroom* croom) */ for (wastyp = otmp->corpsenm; i < 1000; i++, wastyp = rndmonnum()) { /* makemon without rndmonst() might create a group */ - was = makemon(&mons[wastyp], 0, 0, MM_NOCOUNTBIRTH); + was = makemon(&mons[wastyp], 0, 0, MM_NOCOUNTBIRTH|MM_NOMSG); if (was) { if (!resists_ston(was) && !poly_when_stoned(&mons[wastyp])) { (void) propagate(wastyp, TRUE, FALSE); diff --git a/src/timeout.c b/src/timeout.c index b1ef4cbba..8b473e5ec 100644 --- a/src/timeout.c +++ b/src/timeout.c @@ -901,7 +901,8 @@ hatch_egg(anything *arg, long timeout) && !(g.mvitals[mnum].mvflags & (G_GENOD | G_EXTINCT))) { for (i = hatchcount; i > 0; i--) { if (!enexto(&cc, x, y, &mons[mnum]) - || !(mon = makemon(&mons[mnum], cc.x, cc.y, NO_MINVENT))) + || !(mon = makemon(&mons[mnum], cc.x, cc.y, + NO_MINVENT|MM_NOMSG))) break; /* tame if your own egg hatches while you're on the same dungeon level, or any dragon egg which hatches diff --git a/src/trap.c b/src/trap.c index a33b2b35f..e600b1871 100644 --- a/src/trap.c +++ b/src/trap.c @@ -410,7 +410,8 @@ maketrap(int x, int y, int typ) && sgn(u.ualign.type) == sgn(mptr->maligntyp)); statue = mkcorpstat(STATUE, (struct monst *) 0, mptr, x, y, CORPSTAT_NONE); - mtmp = makemon(&mons[statue->corpsenm], 0, 0, MM_NOCOUNTBIRTH); + mtmp = makemon(&mons[statue->corpsenm], 0, 0, + MM_NOCOUNTBIRTH|MM_NOMSG); if (!mtmp) break; /* should never happen */ while (mtmp->minvent) { @@ -637,7 +638,7 @@ animate_statue( wary_dog(mon, TRUE); } else { int sgend = (statue->spe & CORPSTAT_GENDER); - long mmflags = (NO_MINVENT + long mmflags = (NO_MINVENT | MM_NOMSG | ((sgend == CORPSTAT_MALE) ? MM_MALE : 0) | ((sgend == CORPSTAT_FEMALE) ? MM_FEMALE : 0)); diff --git a/src/wizard.c b/src/wizard.c index 5b33ca2b4..6de3a8fd4 100644 --- a/src/wizard.c +++ b/src/wizard.c @@ -629,7 +629,7 @@ nasty(struct monst *summoner) limit spellcasters to inhibit chain summoning */ if ((mtmp = makemon((struct permonst *) 0, bypos.x, bypos.y, - NO_MM_FLAGS)) != 0) { + NO_MM_FLAGS|MM_NOMSG)) != 0) { m_cls = mtmp->data->mlet; if ((difcap > 0 && mtmp->data->difficulty >= difcap && attacktype(mtmp->data, AT_MAGC)) diff --git a/src/zap.c b/src/zap.c index bb9434fdc..6396c8fef 100644 --- a/src/zap.c +++ b/src/zap.c @@ -618,7 +618,7 @@ montraits(struct obj *obj, coord *cc, give mtmp any; it will be given a new 'wormno' though (unless those are exhausted) so be able to grow new tail segments */ - | MM_NOTAIL + | MM_NOTAIL | MM_NOMSG | (adjacentok ? MM_ADJACENTOK : 0))); if (!mtmp) { /* mtmp2 is a copy of obj's object->oextra->omonst extension @@ -775,7 +775,7 @@ revive(struct obj *corpse, boolean by_hero) coord xy; xchar x, y; boolean one_of; - long mmflags = NO_MINVENT | MM_NOWAIT; + long mmflags = NO_MINVENT | MM_NOWAIT | MM_NOMSG; int montype, cgend, container_nesting = 0; boolean is_zomb = (mons[corpse->corpsenm].mlet == S_ZOMBIE); @@ -1482,7 +1482,7 @@ create_polymon(struct obj *obj, int okind) if (!(g.mvitals[pm_index].mvflags & G_GENOD)) mdat = &mons[pm_index]; - mtmp = makemon(mdat, obj->ox, obj->oy, NO_MM_FLAGS); + mtmp = makemon(mdat, obj->ox, obj->oy, MM_NOMSG); polyuse(obj, okind, (int) mons[pm_index].cwt); if (mtmp && cansee(mtmp->mx, mtmp->my)) { @@ -1867,7 +1867,7 @@ stone_to_flesh_obj(struct obj *obj) } else { /* (obj->otyp == FIGURINE) */ if (golem_xform) ptr = &mons[PM_FLESH_GOLEM]; - mon = makemon(ptr, oox, ooy, NO_MINVENT); + mon = makemon(ptr, oox, ooy, NO_MINVENT|MM_NOMSG); if (mon) { if (costly_spot(oox, ooy) && (carried(obj) ? obj->unpaid : !obj->no_charge)) {