already done for vaults.
Modify monster speech to make the beast only use some selected shouts (i.e. not "You hear an irritating whine") and NEVER do the demon taunts since it cannot speak. Demon lords can use almost the whole array of speaking verbs except for "buzz" and "whine".
git-svn-id: https://crawl-ref.svn.sourceforge.net/svnroot/crawl-ref/trunk@5400 c06c8d41-db1a-0410-9941-cceddc491573
R2DQBWKIW7YUJB5SOQ7J274JIYRVX4H3ISFRPAL5RG2RVVP4G2KAC
6U42DGWHCNLYUJMIL7S4RJ65JTRDMH4Z2ZAU3NZLPZZHPDLM4FIAC
3UKFCWWS5BLFQWZRB5FUA46CE2XGX5VRCEWC3K3XH5RCGQK64N2AC
DHXIQXK5VTL5JDDEERAVLZK4KBQLXFTBN5TQ6MH3PRBLG5ULOS4AC
MICCXRO7MWRW7RXNA4BGSJPUFZHJMWFP5OM3OTQCH7ORCGOAQPAQC
RX6575DZOHRUXQUZH34YZGPZJF4STUPLBQDIVTINA2L6LVCKRIGQC
PFEJ4LMDNEKLMGRCMWQ7EIRVU4JMYGICI4G7X4WVWOROVXQCBZ7QC
J6APXOT4QOGQFONWB7G546VTVF6QG42HVOROMHF7YBDJPR4K26OAC
K2CS6TCX2NDVL2ASEHGP4J4K4IJ6FP3ANNKTSIWVG43HPYSBX6ZQC
2O3C3MTT2ZBYIFGPJ4MF5R4AXBYUHOEN62KAUWFWF6JWHIIVLRNQC
7K5P2GRF6QUXTMERG2R3BB6DZFQYJQ6V2KNPMBPFDLOP36NQILPAC
N5XD5IAOMEDF37AXEBALHFINB4H527T6YNTCHN5KKO6YHXAP5PNQC
JESCEQPAFC23D6BUZMBOB4M54XT3GQZJYT7NCJ556LEUCHRER3SQC
AIIVH43Z5X3GTPFY4FXQRZPG6Y7QPH2KJ47VM2Q43PCGGD5MTMOAC
VQZEJTCSRZ5RVLCCKUCIS3IVZPFYRC26I74X4WIJAPEY7NYID2UQC
2TECJQA3PK7OYSSTOWZSQFWMTATJRHHA6JV3IGRHFGS3R7U27RZAC
WDEFQ6YABDQIGJXW5KT3OGR3EO6FZHXZELIRVIXQ4XDYTVOV5V6AC
45EMD3KLQPMERNMIKU5G76H6556XOMIW352TSBP7VLWJX2YYGS7AC
NVSFIV2ZKP44XHCSCXG6OZVGL67OIFINC34J2EMKTA4KULCERUEAC
3QLM46S44Z7GDLWPH3VHBMW2RSWZAOLGJMG2BDKNGUOZIM4IX6WAC
72GIZBEMQLEF3TITOHABWHRLL5TE7KOUSVWOUEHFMO2OZQ4EIB7AC
IE3INS4WUXZOBVXB5VWRBYPVPXADD2U2W5H3TBTOYNWJ3EGRSGQQC
GPEJOT73KMACP33IPAKFR5ROGHCOIP22VXZMQNYTGLEA2OSZUM2AC
AVCMVFA3MKCXHO6H44UK5KJNIHTGQV7UA7GYXM26VI6TXXU5ZN6QC
QUFPPRIIRXHUFEDH3EFES7CSHTA7GG2DAXTRHUAUQBYMSWK4BP6AC
RTNOP7F7GOYLE4V7R5JP5PJJDSMMOAPRTPDCSZOJVEPK6PO6SIWQC
22MF6OUN62WDBJR5QFNJTKU7Q5TIQ76XWCEIRBFWAZDMZUSKJGCAC
FEAW5HX4TFYOEGUNSESIV5IB2Z65XEJ2EALW6PYNTPRLTPT7APUAC
RPOZZWKG5GLPHVZZ7ZKMKS64ZMV2LDCQSARBJFJ6FZOTOKCQO7FAC
2DORUQ4B574MDOOMRYWGU5I72AKHMCSTZ6B3VSHQBUQOZYHRC7FAC
SVY2PTCLXR3KNPQAWXVXTTGCC5DR334HOAKHYO3VDDRWM2BWMALAC
ZCPJIAG7SEY2TUBAGOFWCEJYXSBT36CZU5VO7BWEGSLJ4K24B4TAC
B3FDHXVBFR7YQF56JLQT2EYWRTWV6Y4N44GI6EWVWUU2KBNMZDCAC
WQLOHSNCA3VOMDJF6IINJYKSYVYZEBPJJWBB33QSNE4RP5HEXPMAC
47NSOFQMBZCDIBHEAZSENFUGDSQCX3GJHFBUZ65ARDKCYIZ435LAC
S7KC3IFKCUNBO3XO4TV3KEQEIDZWSRJSKXY65DPONKMG54VHU3UQC
UWI3ZNJDRQRL7CXFNFEG46TA6SAK24XUFY5YOKVOTJA3VG3OBNFAC
G7CTMQ3VNTAB73ZI3LNZHKTAJ5LEQEGG772MVFQQ5XXLCMJVORTQC
6GSGCC5JQJ5NOKX36UHRNOCXNHDBS2A2TDMAR34UBOGWE2DORXIQC
3WHI3KM43ZCN4ITJLFQQBQBC4OJPRS7QTBPIQ6QBCUVKRSK476SAC
7Y5HSDFKA5TPLS2TWTRFMQVX6UXUDHXU5MUMXQSDFAIY4THQ3BIQC
GQL5SIGBHLU3FMCE54XVGLRY5AZHRM6DUEB722REA2DPLGJSN6EQC
A3CO4KBFTFU3ZSHWRY2OPPX3MMTFV7OUCZGL7Q4Y2FU7JO4AP7MAC
EH4VJW3I5Y4V6DT3YMLNDA3NW2DEAV4LRE4T5IEXAVB4WB3JJMGAC
APGCKU4AFOV7Z7XIEO5A27H4IFUGDU227I3Z7OIRROYSLOFFBJ5AC
WW6THKR7JN447YC23YYHYYNH7ABMCFFSECNUFTIJBZX6JHX6W7TAC
FSD7GIK3YLZXWLEH37BU6KV3IUCFGXPQL6IZ7H65YWNRBEKDBX5AC
ZJU5Z2WDMI7HN4XJ3NVTVRHIZO2CGFUQ2FSKIRJVTQG47XHNCZFQC
34C4U6EQWERY75GZJKUCM5KVGU2OUICETS5LGZF6RMKMZT4R5SQAC
P5TRGRH7XMQSPCZKM5IEEO34TY6WMLGHHX7BU6Y453JFRXLUR2VQC
JDM27QE4HR52AYFSQE763BFF57ANOTF5MXKMO377PP5EXMN7SAOAC
2TTHWHQ3ZDD3DLB3KRULTBMS3ZREJG472IBVZXIGTP7MBZWAU52QC
WMHFDQKUDCUGM3R245LLVZ5NNEZSCXFDSTNMVS2O5EFUHHO7HU3AC
RBAGQ2PB7V5YAM5KSHSZR2E3MLKDSRVM5XYGI2TIXP5QMVBOQHDQC
3C2VE43SHCSBY4LTRTFYFLIPRWFUN6DXU6D34QVWDQTSNRBUFG7AC
6O5667Y65C5GTP4V3NBKWUN22IRGCAXEELJ6MCANMYPBOKDUO75QC
EO4FXWNFJRHPOSDHWH2Y6QNUP7KB5ANLX43GA3TJLXR3QOOJZ7VQC
if (!force
&& (!you.turn_is_over || random2(30) < you.skills[SK_STEALTH]))
{
if (!force && (!you.turn_is_over || random2(30) < you.skills[SK_STEALTH]))
return;
// Friendly or neutral monsters don't shout.
if (!force && (mons_friendly(monster) || mons_neutral(monster)))
if (!force && (mons_friendly(monster) || mons_neutral(monster))
|| (type == S_SILENT && !player_monster_visible(monster))
|| (type != S_SILENT && (silenced(you.x_pos, you.y_pos)
|| silenced(monster->x, monster->y))))
if (s_type == S_SILENT && !player_monster_visible(monster)
|| s_type != S_SILENT && (silenced(you.x_pos, you.y_pos)
|| silenced(monster->x, monster->y)))
// Use get_monster_data(monster->type) to bypass mon_shouts()
// replacing S_RANDOM with a random value.
if (mons_is_demon( monster->type ) && coinflip()
&& (type != S_SILENT ||
get_monster_data(monster->type)->shouts == S_RANDOM))
{
noise_level = 8;
default_msg_key = "__DEMON_TAUNT";
}
// Now that we have the message key, get a random verb and noise level
// for pandemonium lords.
if (s_type == S_DEMON_TAUNT)
s_type = mons_shouts(monster->type, true);
// returns 0 if the point is not near stairs
// returns 1 if the point is near unoccupied stairs
// returns 2 if the point is near player-occupied stairs
// Returns 0 if the point is not near stairs.
// Returns 1 if the point is near unoccupied stairs.
// Returns 2 if the point is near player-occupied stairs.
// check whether there's a stair
// and whether it leads to another branch
pval = near_stairs(pos, 1,
*stair_type, place.branch);
// Check whether there's a stair
// and whether it leads to another branch.
pval = near_stairs(pos, 1, *stair_type, place.branch);
// A short function to check the results of near_stairs().
// Returns 0 if the point is not near stairs.
// Returns 1 if the point is near unoccupied stairs.
// Returns 2 if the point is near player-occupied stairs.
static int _is_near_stairs(coord_def &p)
{
int result = 0;
for (int i = -1; i <= 1; i++)
for (int j = -1; j <= 1; j++)
{
if (!in_bounds(p))
continue;
const dungeon_feature_type feat = grd(p);
if (is_stair(feat))
{
// Shouldn't matter for escape hatches.
if (grid_is_escape_hatch(feat))
continue;
// Should there be several stairs, don't overwrite the
// player on stairs info.
if (result < 2)
result = (p == you.pos()? 2 : 1);
}
}
return result;
}
// now, forget about banding if the first placement failed, or there's too
// many monsters already, or we successfully placed by stairs
// Now, forget about banding if the first placement failed, or there are
// too many monsters already, or we successfully placed by stairs.
if (!(mg.force_place()
&& in_bounds(mg.pos)
&& mons_class_can_pass(mg.cls, grd(mg.pos))
&& mgrd(mg.pos) == NON_MONSTER
&& mg.pos != you.pos()))
int type = (mons_class_is_zombified(mg.cls) ? mg.base_type
: mg.cls);
if (!mg.force_place()
|| !in_bounds(mg.pos)
|| mgrd(mg.pos) != NON_MONSTER
|| mg.pos == you.pos()
|| !mons_class_can_pass(type, grd(mg.pos)))
// the return value is either -1 (failure of some sort)
// or the index of the monster placed (if I read things right) {dlb}
// The return value is either -1 (failure of some sort)
// or the index of the monster placed (if I read things right). {dlb}
shout_type mons_shouts(int mc)
// For demon lords almost everything is fair game.
// It's only used for the shouting verb ("say", "whine", "roar", ...)
// anyway.
if (type != MONS_BEAST)
return (shout != S_BUZZ && shout != S_WHINE);
switch (shout)
{
// 2-headed ogres, bees or mosquitos never fit.
case S_SHOUT2:
case S_BUZZ:
case S_WHINE:
// The beast cannot speak.
case S_DEMON_TAUNT:
// Silent is boring.
case S_SILENT:
return (false);
default:
return (true);
}
}
// If demon_shout is true, we're trying to find a random loudness for
// a pandemonium lord trying to shout.
shout_type mons_shouts(int mc, bool demon_shout)
if (u == S_RANDOM)
u = static_cast<shout_type>(random2(NUM_SHOUTS));
// Pandemonium lords use this to get the noises.
if (u == S_RANDOM || demon_shout && u == S_DEMON_TAUNT)
{
const int max_shout = (u == S_RANDOM ? NUM_SHOUTS : NUM_LOUDNESS);
do
{
u = static_cast<shout_type>(random2(max_shout));
}
while (!_shout_fits_monster(mc, u));
}
"breathes", // S_VERY_SOFT
"whispers", // S_SOFT
"says", // S_NORMAL
"shouts", // S_LOUD
"screams" // S_VERY_LOUD
"sneers", // S_DEMON_TAUNT
"buggily says", // NUM_SHOUTS
"breathes", // S_VERY_SOFT
"whispers", // S_SOFT
"says", // S_NORMAL
"shouts", // S_LOUD
"screams" // S_VERY_LOUD
{
{ MONS_PROGRAM_BUG, MONS_PROGRAM_BUG },
{ MONS_ZOMBIE_SMALL, MONS_ZOMBIE_LARGE },
{ MONS_SKELETON_SMALL, MONS_SKELETON_LARGE },
{ // small // large
{ MONS_PROGRAM_BUG, MONS_PROGRAM_BUG },
{ MONS_ZOMBIE_SMALL, MONS_ZOMBIE_LARGE },
{ MONS_SKELETON_SMALL, MONS_SKELETON_LARGE },