Accessibility: give message for created monsters

Always give a message when creating a detected monster
during gameplay (as opposed to during level creation).
To prevent the message, use the MM_NOMSG flag for makemon.

Most places already handled their own messaging, but there
were some, such as bag of tricks, create monster magic
and random monsters created during gameplay that didn't.
This commit is contained in:
Pasi Kallinen
2022-01-06 14:06:49 +02:00
parent f4b30e872e
commit 48bca11d67
24 changed files with 61 additions and 47 deletions
+3 -2
View File
@@ -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
+1 -1
View File
@@ -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)) {
+1 -1
View File
@@ -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);
+4 -4
View File
@@ -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 */
+1 -1
View File
@@ -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);
+4 -4
View File
@@ -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);
+1 -1
View File
@@ -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))
+5 -5
View File
@@ -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:
+10 -1
View File
@@ -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;
}
+1 -1
View File
@@ -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);
+4 -2
View File
@@ -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;
+4 -4
View File
@@ -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) {
+2 -2
View File
@@ -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);
+1 -1
View File
@@ -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);
+2 -2
View File
@@ -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;
}
+1 -1
View File
@@ -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];
+2 -2
View File
@@ -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;
+2 -2
View File
@@ -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)
+1 -1
View File
@@ -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);
}
}
+1 -1
View File
@@ -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);
+2 -1
View File
@@ -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
+3 -2
View File
@@ -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));
+1 -1
View File
@@ -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))
+4 -4
View File
@@ -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)) {