monster sound changes

MS_MOO was placed among the humanoid sounds, resulting in a minotaur
being able to articulate "I'm hungry".  Move it to the animal sounds,
which causes almost all the sounds to be renumbered.

Give MS_MOO to rothes.

Change mumak from MS_ROAR to new sound MS_TRUMPET and mastodon from
silent to that.

I changed MS_ORC from a synonym for MS_GRUNT into a distinct type
which also just grunts.  Grunt is in the animal group of sounds and
orc is now in the 'other' group (neither animal nor understandable
humanoid).  [There are a bunch of other humanoid monsters (gnomes and
ogres, for example) that still use MS_GRUNT.  They aren't animals so
that's not right.]

Have pets who beg for food but happen to have 'other' sounds between
animal and humanoid be described as looking hungry instead of being
skipped.

Hat tipped to a peaceful humanoid will behave as non-peaceful if
Conflict is active (without giving the monster a resistance check).

Despite mons[].msound getting new values, save files should be ok.
This commit is contained in:
PatR
2020-02-18 13:33:00 -08:00
parent 49069d6d62
commit 8659dcd7bc
3 changed files with 95 additions and 70 deletions

View File

@@ -1,4 +1,4 @@
/* NetHack 3.6 monst.c $NHDT-Date: 1577096800 2019/12/23 10:26:40 $ $NHDT-Branch: NetHack-3.7 $:$NHDT-Revision: 1.70 $ */
/* NetHack 3.6 monst.c $NHDT-Date: 1582061573 2020/02/18 21:32:53 $ $NHDT-Branch: NetHack-3.7 $:$NHDT-Revision: 1.72 $ */
/* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
/*-Copyright (c) Michael Allison, 2006. */
/* NetHack may be freely redistributed. See license for details. */
@@ -688,13 +688,13 @@ NEARDATA struct permonst mons_init[] = {
MON("rothe", S_QUADRUPED, LVL(2, 9, 7, 0, 0), (G_GENO | G_SGROUP | 4),
A(ATTK(AT_CLAW, AD_PHYS, 1, 3), ATTK(AT_BITE, AD_PHYS, 1, 3),
ATTK(AT_BITE, AD_PHYS, 1, 8), NO_ATTK, NO_ATTK, NO_ATTK),
SIZ(400, 100, MS_SILENT, MZ_LARGE), 0, 0,
SIZ(400, 100, MS_MOO, MZ_LARGE), 0, 0,
M1_ANIMAL | M1_NOHANDS | M1_OMNIVORE, M2_HOSTILE, M3_INFRAVISIBLE,
4, CLR_BROWN),
MON("mumak", S_QUADRUPED, LVL(5, 9, 0, 0, -2), (G_GENO | 1),
A(ATTK(AT_BUTT, AD_PHYS, 4, 12), ATTK(AT_BITE, AD_PHYS, 2, 6),
NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK),
SIZ(2500, 500, MS_ROAR, MZ_LARGE), 0, 0,
SIZ(2500, 500, MS_TRUMPET, MZ_LARGE), 0, 0,
M1_ANIMAL | M1_THICK_HIDE | M1_NOHANDS | M1_HERBIVORE,
M2_HOSTILE | M2_STRONG, M3_INFRAVISIBLE, 7, CLR_GRAY),
MON("leocrotta", S_QUADRUPED, LVL(6, 18, 4, 10, 0), (G_GENO | 2),
@@ -724,7 +724,7 @@ NEARDATA struct permonst mons_init[] = {
MON("mastodon", S_QUADRUPED, LVL(20, 12, 5, 0, 0), (G_GENO | 1),
A(ATTK(AT_BUTT, AD_PHYS, 4, 8), ATTK(AT_BUTT, AD_PHYS, 4, 8), NO_ATTK,
NO_ATTK, NO_ATTK, NO_ATTK),
SIZ(3800, 800, MS_SILENT, MZ_LARGE), 0, 0,
SIZ(3800, 800, MS_TRUMPET, MZ_LARGE), 0, 0,
M1_ANIMAL | M1_THICK_HIDE | M1_NOHANDS | M1_HERBIVORE,
M2_HOSTILE | M2_STRONG, M3_INFRAVISIBLE, 22, CLR_BLACK),
/*
@@ -1453,7 +1453,13 @@ struct permonst _mons2[] = {
M1_ANIMAL | M1_HUMANOID | M1_CARNIVORE,
M2_HOSTILE | M2_STRONG | M2_NASTY, M3_INFRAVISIBLE | M3_INFRAVISION,
17, CLR_BROWN),
/* 'I' is a visual marker for all invisible monsters and must be unused */
/*
* Invisible
* S_invisible=='I' is a visual marker for all invisible monsters
* and must be not be used for any specific monster types. Long
* time 'invisible stalker' was changed to 'stalker', an Elemental.
*/
/*
* Jabberwock
*/
@@ -1925,7 +1931,8 @@ struct permonst _mons2[] = {
A(ATTK(AT_CLAW, AD_SITM, 0, 0), ATTK(AT_BITE, AD_PHYS, 1, 3), NO_ATTK,
NO_ATTK, NO_ATTK, NO_ATTK),
SIZ(100, 50, MS_GROWL, MZ_SMALL), 0, 0,
M1_ANIMAL | M1_HUMANOID | M1_OMNIVORE, 0, M3_INFRAVISIBLE, 4, CLR_GRAY),
M1_ANIMAL | M1_HUMANOID | M1_OMNIVORE, 0, M3_INFRAVISIBLE,
4, CLR_GRAY),
MON("ape", S_YETI, LVL(4, 12, 6, 0, 0), (G_GENO | G_SGROUP | 2),
A(ATTK(AT_CLAW, AD_PHYS, 1, 3), ATTK(AT_CLAW, AD_PHYS, 1, 3),
ATTK(AT_BITE, AD_PHYS, 1, 6), NO_ATTK, NO_ATTK, NO_ATTK),

View File

@@ -1,4 +1,4 @@
/* NetHack 3.6 sounds.c $NHDT-Date: 1582024315 2020/02/18 11:11:55 $ $NHDT-Branch: NetHack-3.7 $:$NHDT-Revision: 1.95 $ */
/* NetHack 3.6 sounds.c $NHDT-Date: 1582061574 2020/02/18 21:32:54 $ $NHDT-Branch: NetHack-3.7 $:$NHDT-Revision: 1.96 $ */
/* Copyright (c) 1989 Janet Walz, Mike Threepoint */
/* NetHack may be freely redistributed. See license for details. */
@@ -462,12 +462,20 @@ register struct monst *mtmp;
return;
/* presumably nearness and soundok checks have already been made */
if (!is_silent(mtmp->data) && mtmp->data->msound <= MS_ANIMAL)
if (!is_silent(mtmp->data) && mtmp->data->msound <= MS_ANIMAL) {
(void) domonnoise(mtmp);
else if (mtmp->data->msound >= MS_HUMANOID) {
} else if (mtmp->data->msound >= MS_HUMANOID) {
if (!canspotmon(mtmp))
map_invisible(mtmp->mx, mtmp->my);
verbalize("I'm hungry.");
} else {
/* this is pretty lame but is better than leaving out the block
of speech types between animal and humanoid; this covers
MS_SILENT too (if caller lets that get this far) since it's
excluded by the first two cases */
if (canspotmon(mtmp))
pline("%s seems famished.", Monnam(mtmp));
/* looking famished will be a good trick for a tame skeleton... */
}
}
@@ -515,8 +523,8 @@ register struct monst *mtmp;
else if (msound == MS_GUARDIAN && ptr != &mons[g.urole.guardnum])
msound = mons[genus(monsndx(ptr), 1)].msound;
/* some normally non-speaking types can/will speak if hero is similar */
else if (msound == MS_ORC /* note: MS_ORC is same as MS_GRUNT */
&& ((same_race(ptr, g.youmonst.data) /* current form, */
else if (msound == MS_ORC
&& ((same_race(ptr, g.youmonst.data) /* current form, */
|| same_race(ptr, &mons[Race_switch])) /* unpoly'd form */
|| Hallucination))
msound = MS_HUMANOID;
@@ -626,12 +634,13 @@ register struct monst *mtmp;
verbl_msg = vampmsg[vampindex];
}
}
} break;
break;
}
case MS_WERE:
if (flags.moonphase == FULL_MOON && (night() ^ !rn2(13))) {
pline("%s throws back %s head and lets out a blood curdling %s!",
Monnam(mtmp), mhis(mtmp),
ptr == &mons[PM_HUMAN_WERERAT] ? "shriek" : "howl");
(ptr == &mons[PM_HUMAN_WERERAT]) ? "shriek" : "howl");
wake_nearto(mtmp->mx, mtmp->my, 11 * 11);
} else
pline_msg =
@@ -705,6 +714,9 @@ register struct monst *mtmp;
else
pline_msg = "whickers.";
break;
case MS_MOO:
pline_msg = mtmp->mpeaceful ? "moos." : "bellows!";
break;
case MS_WAIL:
pline_msg = "wails mournfully.";
break;
@@ -714,6 +726,10 @@ register struct monst *mtmp;
case MS_BURBLE:
pline_msg = "burbles.";
break;
case MS_TRUMPET:
pline_msg = "trumpets!";
wake_nearto(mtmp->mx, mtmp->my, 11 * 11);
break;
case MS_SHRIEK:
pline_msg = "shrieks.";
aggravate();
@@ -733,10 +749,14 @@ register struct monst *mtmp;
"giggles.", "chuckles.", "snickers.", "laughs.",
};
pline_msg = laugh_msg[rn2(4)];
} break;
break;
}
case MS_MUMBLE:
pline_msg = "mumbles incomprehensibly.";
break;
case MS_ORC: /* this used to be an alias for grunt, now it is distinct */
pline_msg = "grunts.";
break;
case MS_DJINNI:
if (mtmp->mtame) {
verbl_msg = "Sorry, I'm all out of wishes.";
@@ -748,18 +768,10 @@ register struct monst *mtmp;
} else {
if (ptr != &mons[PM_PRISONER])
verbl_msg = "This will teach you not to disturb me!";
#if 0
else
verbl_msg = "??????????";
#endif
else /* vague because prisoner might already be out of cell */
verbl_msg = "Get me out of here.";
}
break;
case MS_MOO:
if (!mtmp->mpeaceful)
pline_msg = "bellows!";
else
pline_msg = "moos.";
break;
case MS_BOAST: /* giants */
if (!mtmp->mpeaceful) {
switch (rn2(4)) {
@@ -831,7 +843,7 @@ register struct monst *mtmp;
}
else {
verbl_msg =
"Many enter the dungeon, and few return to the sunlit lands.";
"Many enter the dungeon, and few return to the sunlit lands.";
}
}
else
@@ -1193,7 +1205,7 @@ tiphat()
if (vismon || unseen || (statue && Hallucination)
/* unseen adjacent monster will respond if able */
|| (range == 1 && mtmp && responsive_mon_at(x, y)
&& mtmp->data->msound != MS_SILENT)
&& !is_silent(mtmp->data))
/* we check accessible() after m_at() in case there's a
visible monster phazing through a wall here */
|| !(accessible(x, y) || levl[x][y].typ == IRONBARS))
@@ -1211,7 +1223,7 @@ tiphat()
/* if this monster is waiting for something, prod it into action */
mtmp->mstrategy &= ~STRAT_WAITMASK;
if (vismon && mtmp->mpeaceful && humanoid(mtmp->data)) {
if (vismon && humanoid(mtmp->data) && mtmp->mpeaceful && !Conflict) {
if ((otmp = which_armor(mtmp, W_ARMH)) == 0) {
pline("%s waves.", Monnam(mtmp));
} else if (otmp->cursed) {