1 /* NetHack 3.6 sounds.c $NHDT-Date: 1570844005 2019/10/12 01:33:25 $ $NHDT-Branch: NetHack-3.6 $:$NHDT-Revision: 1.83 $ */
2 /* Copyright (c) 1989 Janet Walz, Mike Threepoint */
3 /* NetHack may be freely redistributed. See license for details. */
5 /* JNetHack Copyright */
6 /* (c) Issei Numata, Naoki Hamada, Shigehiro Miyashita, 1994-2000 */
7 /* For 3.4-, Copyright (c) SHIRAKATA Kentaro, 2002-2020 */
8 /* JNetHack may be freely redistributed. See license for details. */
12 STATIC_DCL boolean FDECL(mon_is_gecko, (struct monst *));
13 STATIC_DCL int FDECL(domonnoise, (struct monst *));
14 STATIC_DCL int NDECL(dochat);
15 STATIC_DCL int FDECL(mon_in_room, (struct monst *, int));
17 /* this easily could be a macro, but it might overtax dumb compilers */
19 mon_in_room(mon, rmtyp)
23 int rno = levl[mon->mx][mon->my].roomno;
24 if (rno >= ROOMOFFSET)
25 return rooms[rno - ROOMOFFSET].rtype == rmtyp;
32 register struct mkroom *sroom;
33 register int hallu, vx, vy;
34 #if defined(AMIGA) && defined(AZTEC_C_WORKAROUND)
39 if (Deaf || !flags.acoustics || u.uswallow || Underwater)
42 hallu = Hallucination ? 1 : 0;
44 if (level.flags.nfountains && !rn2(400)) {
46 static const char *const fountain_msg[4] = {
47 "bubbling water.", "water falling on coins.",
48 "the splashing of a naiad.", "a soda fountain!",
50 static const char *const fountain_msg[4] = {
51 "
\83S
\83{
\83S
\83{
\82Æ
\82¢
\82¤
\89¹
\82ð
\95·
\82¢
\82½
\81D", "
\83s
\83`
\83\83\83s
\83`
\83\83\82Æ
\82¢
\82¤
\89¹
\82ð
\95·
\82¢
\82½
\81D",
52 "
\83o
\83V
\83\83\83o
\83V
\83\83\82Æ
\82¢
\82¤
\89¹
\82ð
\95·
\82¢
\82½
\81D", "
\92Y
\8e_
\88ù
\97¿
\82Ì
\83V
\83\85\81[
\82Æ
\82¢
\82¤
\89¹
\82ð
\95·
\82¢
\82½
\81I",
55 You_hear1(fountain_msg[rn2(3) + hallu]);
57 if (level.flags.nsinks && !rn2(300)) {
59 static const char *const sink_msg[3] = {
60 "a slow drip.", "a gurgling noise.", "dishes being washed!",
62 static const char *const sink_msg[3] = {
63 "
\90\85\82ª
\82Û
\82½
\82Û
\82½
\82Æ
\97\8e\82¿
\82é
\89¹
\82ð
\95·
\82¢
\82½
\81D",
64 "
\82ª
\82ç
\82ª
\82ç
\82Æ
\82¢
\82¤
\89¹
\82ð
\95·
\82¢
\82½
\81D",
65 "
\8eM
\82ð
\90ô
\82¤
\89¹
\82ð
\95·
\82¢
\82½
\81I",
68 You_hear1(sink_msg[rn2(2) + hallu]);
70 if (level.flags.has_court && !rn2(200)) {
72 static const char *const throne_msg[4] = {
73 "the tones of courtly conversation.",
74 "a sceptre pounded in judgment.",
75 "Someone shouts \"Off with %s head!\"", "Queen Beruthiel's cats!",
77 static const char *const throne_msg[4] = {
78 "
\8fã
\95i
\82È
\98b
\82µ
\90º
\82ð
\95·
\82¢
\82½
\81D",
79 "
\8dÙ
\94»
\82Åâ
\94\82ð
\93Ë
\82
\89¹
\82ð
\95·
\82¢
\82½
\81D",
80 "
\82¾
\82ê
\82©
\82ª
\81u
\82»
\82Ì
\82à
\82Ì
\82Ì
\8eñ
\82ð
\82Í
\82Ë
\82æ
\81I
\81v
\82Æ
\8b©
\82Ô
\90º
\82ð
\95·
\82¢
\82½
\81D",
81 "
\83x
\83\8b\83V
\83G
\83\8b\89¤
\94Ü
\82Ì
\94L
\82Ì
\90º
\82ð
\95·
\82¢
\82½
\81I",
84 for (mtmp = fmon; mtmp; mtmp = mtmp->nmon) {
85 if (DEADMONSTER(mtmp))
87 if ((mtmp->msleeping || is_lord(mtmp->data)
88 || is_prince(mtmp->data)) && !is_animal(mtmp->data)
89 && mon_in_room(mtmp, COURT)) {
90 /* finding one is enough, at least for now */
91 int which = rn2(3) + hallu;
94 You_hear1(throne_msg[which]);
96 pline(throne_msg[2], uhis());
101 if (level.flags.has_swamp && !rn2(200)) {
103 static const char *const swamp_msg[3] = {
104 "hear mosquitoes!", "smell marsh gas!", /* so it's a smell...*/
107 static const char *const swamp_msg[3] = {
108 "
\89á
\82Ì
\89H
\89¹
\82ð
\95·
\82¢
\82½
\81D",
109 "
\95\85\82Á
\82½
\93õ
\82¢
\82ª
\82µ
\82½
\81I", /* so it's a smell...*/
110 "
\83h
\83i
\83\8b\83h
\83_
\83b
\83N
\82Ì
\90º
\82ð
\95·
\82¢
\82½
\81I",
113 You1(swamp_msg[rn2(2) + hallu]);
116 if (level.flags.has_vault && !rn2(200)) {
117 if (!(sroom = search_special(VAULT))) {
119 level.flags.has_vault = 0;
123 switch (rn2(2) + hallu) {
125 boolean gold_in_vault = FALSE;
127 for (vx = sroom->lx; vx <= sroom->hx; vx++)
128 for (vy = sroom->ly; vy <= sroom->hy; vy++)
130 gold_in_vault = TRUE;
131 #if defined(AMIGA) && defined(AZTEC_C_WORKAROUND)
132 /* Bug in aztec assembler here. Workaround below */
133 xx = ROOM_INDEX(sroom) + ROOMOFFSET;
134 xx = (xx != vault_occupied(u.urooms));
137 if (vault_occupied(u.urooms)
138 != (ROOM_INDEX(sroom) + ROOMOFFSET))
139 #endif /* AZTEC_C_WORKAROUND */
144 ? "someone counting money."
145 : "the quarterback calling the play.");
148 ? "
\92N
\82©
\82ª
\82¨
\8bà
\82ð
\90\94\82¦
\82Ä
\82¢
\82é
\89¹
\82ð
\95·
\82¢
\82½
\81D"
149 : "
\83N
\83H
\81[
\83^
\83o
\83b
\83N
\82ª
\8ew
\8e¦
\82ð
\82·
\82é
\90º
\82ð
\95·
\82¢
\82½
\81D");
153 You_hear("someone searching.");
155 You_hear("
\92N
\82©
\82ª
\91{
\8dõ
\82µ
\82Ä
\82¢
\82é
\89¹
\82ð
\95·
\82¢
\82½
\81D");
162 You_hear("the footsteps of a guard on patrol.");
164 You_hear("
\8cx
\94õ
\88õ
\82Ì
\83p
\83g
\83\8d\81[
\83\8b\82·
\82é
\89¹
\82ð
\95·
\82¢
\82½
\81D");
168 You_hear("Ebenezer Scrooge!");
170 You_hear("
\82±
\82¿
\8bT
\82Ì
\97¼
\82³
\82ñ
\82Ì
\90º
\82ð
\95·
\82¢
\82½
\81I");
175 if (level.flags.has_beehive && !rn2(200)) {
176 for (mtmp = fmon; mtmp; mtmp = mtmp->nmon) {
177 if (DEADMONSTER(mtmp))
179 if ((mtmp->data->mlet == S_ANT && is_flyer(mtmp->data))
180 && mon_in_room(mtmp, BEEHIVE)) {
181 switch (rn2(2) + hallu) {
184 You_hear("a low buzzing.");
186 You_hear("
\82Ô
\81[
\82ñ
\82Æ
\82¢
\82¤
\89¹
\82ð
\95·
\82¢
\82½
\81D");
190 You_hear("an angry drone.");
192 You_hear("
\8b»
\95±
\82µ
\82½
\97Y
\83o
\83`
\82Ì
\89¹
\82ð
\95·
\82¢
\82½
\81D");
196 You_hear("bees in your %sbonnet!",
197 uarmh ? "" : "(nonexistent) ");
199 You_hear("
\83n
\83`
\82ª
\82 \82È
\82½
\82Ì
\96X
\8eq%s
\82Ì
\92\86\82É
\82¢
\82é
\89¹
\82ð
\95·
\82¢
\82½
\81I",
200 uarmh ? "" : "(
\94í
\82Á
\82Ä
\82È
\82¢
\82¯
\82Ç)");
208 if (level.flags.has_morgue && !rn2(200)) {
209 for (mtmp = fmon; mtmp; mtmp = mtmp->nmon) {
210 if (DEADMONSTER(mtmp))
212 if ((is_undead(mtmp->data) || is_vampshifter(mtmp))
213 && mon_in_room(mtmp, MORGUE)) {
215 const char *hair = body_part(HAIR); /* hair/fur/scales */
218 switch (rn2(2) + hallu) {
221 You("suddenly realize it is unnaturally quiet.");
223 You("
\95s
\8e©
\91R
\82È
\82
\82ç
\82¢
\90Ã
\82©
\82È
\82Ì
\82É
\8bC
\82Ã
\82¢
\82½
\81D");
227 pline_The("%s on the back of your %s %s up.", hair,
228 body_part(NECK), vtense(hair, "stand"));
230 pline("
\82 \82È
\82½
\82Ì%s
\82Ì
\82¤
\82µ
\82ë
\82Ì%s
\82ª
\8bt
\97§
\82Á
\82½
\81D",
231 body_part(NECK), body_part(HAIR));
236 pline_The("%s on your %s %s to stand up.", hair,
237 body_part(HEAD), vtense(hair, "seem"));
239 pline("
\82 \82È
\82½
\82Ì%s
\82Ì%s
\82Í
\8bt
\97§
\82Á
\82½
\81D",
240 body_part(HEAD), body_part(HAIR));
248 if (level.flags.has_barracks && !rn2(200)) {
249 static const char *const barracks_msg[4] = {
251 "blades being honed.", "loud snoring.", "dice being thrown.",
252 "General MacArthur!",
254 "
\90n
\95¨
\82ð
\8c¤
\82®
\89¹
\82ð
\95·
\82¢
\82½
\81D",
255 "
\91å
\82«
\82È
\82¢
\82Ñ
\82«
\82ð
\95·
\82¢
\82½
\81D",
256 "
\83_
\83C
\83X
\82ª
\90U
\82ç
\82ê
\82é
\89¹
\82ð
\95·
\82¢
\82½
\81D",
257 "
\83}
\83b
\83J
\81[
\83T
\81[
\8f«
\8cR
\82Ì
\90º
\82ð
\95·
\82¢
\82½
\81I",
262 for (mtmp = fmon; mtmp; mtmp = mtmp->nmon) {
263 if (DEADMONSTER(mtmp))
265 if (is_mercenary(mtmp->data)
266 #if 0 /* don't bother excluding these */
267 && !strstri(mtmp->data->mname, "watch")
268 && !strstri(mtmp->data->mname, "guard")
270 && mon_in_room(mtmp, BARRACKS)
271 /* sleeping implies not-yet-disturbed (usually) */
272 && (mtmp->msleeping || ++count > 5)) {
273 You_hear1(barracks_msg[rn2(3) + hallu]);
278 if (level.flags.has_zoo && !rn2(200)) {
279 static const char *const zoo_msg[3] = {
281 "a sound reminiscent of an elephant stepping on a peanut.",
282 "a sound reminiscent of a seal barking.", "Doctor Dolittle!",
284 "
\8fÛ
\82ª
\83s
\81[
\83i
\83b
\83c
\82Ì
\8fã
\82Å
\97x
\82é
\82æ
\82¤
\82È
\89¹
\82ð
\95·
\82¢
\82½
\81D",
285 "
\83A
\83V
\83J
\82ª
\96i
\82¦
\82é
\82æ
\82¤
\82È
\89¹
\82ð
\95·
\82¢
\82½
\81D",
286 "
\83h
\83\8a\83g
\83\8b\90æ
\90¶
\82Ì
\90º
\82ð
\95·
\82¢
\82½
\81I",
289 for (mtmp = fmon; mtmp; mtmp = mtmp->nmon) {
290 if (DEADMONSTER(mtmp))
292 if ((mtmp->msleeping || is_animal(mtmp->data))
293 && mon_in_room(mtmp, ZOO)) {
294 You_hear1(zoo_msg[rn2(2) + hallu]);
299 if (level.flags.has_shop && !rn2(200)) {
300 if (!(sroom = search_special(ANY_SHOP))) {
302 level.flags.has_shop = 0;
305 if (tended_shop(sroom)
306 && !index(u.ushops, (int) (ROOM_INDEX(sroom) + ROOMOFFSET))) {
307 static const char *const shop_msg[3] = {
309 "someone cursing shoplifters.",
310 "the chime of a cash register.", "Neiman and Marcus arguing!",
312 "
\92N
\82©
\82ª
\93D
\96_
\82ð
\82Ì
\82Ì
\82µ
\82é
\90º
\82ð
\95·
\82¢
\82½
\81D",
313 "
\83\8c\83W
\82Ì
\83`
\81[
\83\93\82Æ
\82¢
\82¤
\89¹
\82ð
\95·
\82¢
\82½
\81D",
314 "
\83C
\83g
\81[
\82Æ
\83\88\81[
\83J
\83h
\81[
\82Ì
\8bc
\98_
\82ð
\95·
\82¢
\82½
\81I",
317 You_hear1(shop_msg[rn2(2) + hallu]);
321 if (level.flags.has_temple && !rn2(200)
322 && !(Is_astralevel(&u.uz) || Is_sanctum(&u.uz))) {
323 for (mtmp = fmon; mtmp; mtmp = mtmp->nmon) {
324 if (DEADMONSTER(mtmp))
326 if (mtmp->ispriest && inhistemple(mtmp)
327 /* priest must be active */
328 && mtmp->mcanmove && !mtmp->msleeping
329 /* hero must be outside this temple */
330 && temple_occupied(u.urooms) != EPRI(mtmp)->shroom)
334 /* Generic temple messages; no attempt to match topic or tone
335 to the pantheon involved, let alone to the specific deity.
336 These are assumed to be coming from the attending priest;
337 asterisk means that the priest must be capable of speech;
338 pound sign (octathorpe,&c--don't go there) means that the
339 priest and the altar must not be directly visible (we don't
340 care if telepathy or extended detection reveals that the
341 priest is not currently standing on the altar; he's mobile). */
342 static const char *const temple_msg[] = {
344 "*someone praising %s.", "*someone beseeching %s.",
345 "#an animal carcass being offered in sacrifice.",
346 "*a strident plea for donations.",
348 "*
\92N
\82©
\82ª%s
\82ð
\8e^
\94ü
\82µ
\82Ä
\82¢
\82é
\82Ì
\82ð
\95·
\82¢
\82½
\81D",
349 "*
\92N
\82©
\82ª%s
\82ð
\94M
\96]
\82µ
\82Ä
\82¢
\82é
\82Ì
\82ð
\95·
\82¢
\82½
\81D",
350 "#
\93®
\95¨
\82Ì
\8e\80\91Ì
\82ð
\90¶
\82¯æÑ
\82É
\95ù
\82°
\82é
\90º
\82ð
\95·
\82¢
\82½
\81D",
351 "*
\8e·
\9dX
\82É
\8añ
\95t
\82ð
\97v
\8b\81\82µ
\82Ä
\82¢
\82é
\82Ì
\82ð
\95·
\82¢
\82½
\81D",
355 int trycount = 0, ax = EPRI(mtmp)->shrpos.x,
356 ay = EPRI(mtmp)->shrpos.y;
357 boolean speechless = (mtmp->data->msound <= MS_ANIMAL),
358 in_sight = canseemon(mtmp) || cansee(ax, ay);
361 msg = temple_msg[rn2(SIZE(temple_msg) - 1 + hallu)];
362 if (index(msg, '*') && speechless)
364 if (index(msg, '#') && in_sight)
366 break; /* msg is acceptable */
367 } while (++trycount < 50);
368 while (!letter(*msg))
369 ++msg; /* skip control flags */
371 You_hear(msg, halu_gname(EPRI(mtmp)->shralign));
377 if (Is_oracle_level(&u.uz) && !rn2(400)) {
378 /* make sure the Oracle is still here */
379 for (mtmp = fmon; mtmp; mtmp = mtmp->nmon) {
380 if (DEADMONSTER(mtmp))
382 if (mtmp->data == &mons[PM_ORACLE])
385 /* and don't produce silly effects when she's clearly visible */
386 if (mtmp && (hallu || !canseemon(mtmp))) {
387 static const char *const ora_msg[5] = {
389 "a strange wind.", /* Jupiter at Dodona */
390 "convulsive ravings.", /* Apollo at Delphi */
391 "snoring snakes.", /* AEsculapius at Epidaurus */
392 "someone say \"No more woodchucks!\"",
393 "a loud ZOT!" /* both rec.humor.oracle */
395 "
\8aï
\96
\82È
\95\97\82Ì
\89¹
\82ð
\95·
\82¢
\82½
\81D",
396 "
\94¼
\8b¶
\97\90\82Ì
\90º
\82ð
\95·
\82¢
\82½
\81D",
397 "
\8eÖ
\82Ì
\82¢
\82Ñ
\82«
\82ð
\95·
\82¢
\82½
\81D",
398 "
\92N
\82©
\82ª
\81u
\82à
\82¤
\83E
\83b
\83h
\83`
\83\83\83b
\83N
\82Í
\82¢
\82ç
\82È
\82¢
\81I
\81v
\82Æ
\8c¾
\82Á
\82Ä
\82¢
\82é
\90º
\82ð
\95·
\82¢
\82½
\81D",
399 "
\91å
\82«
\82È
\82y
\82n
\82s
\82ð
\95·
\82¢
\82½
\81I"
402 You_hear1(ora_msg[rn2(3) + hallu * 2]);
408 static const char *const h_sounds[] = {
410 "beep", "boing", "sing", "belche", "creak", "cough",
411 "rattle", "ululate", "pop", "jingle", "sniffle", "tinkle",
412 "eep", "clatter", "hum", "sizzle", "twitter", "wheeze",
413 "rustle", "honk", "lisp", "yodel", "coo", "burp",
414 "moo", "boom", "murmur", "oink", "quack", "rumble",
415 "twang", "bellow", "toot", "gargle", "hoot", "warble"
417 "
\83s
\81[
\83b
\82Æ
\96Â
\82¢
\82½",
418 "
\91\9b\82¬
\82½
\82Ä
\82½",
420 "
\82°
\82Á
\82Õ
\82ð
\82µ
\82½",
421 "
\83L
\81[
\83L
\81[
\82Æ
\96Â
\82¢
\82½",
422 "
\82¹
\82«
\8d\9e\82ñ
\82¾",
424 "
\83J
\83^
\83J
\83^
\96Â
\82Á
\82½",
425 "
\83E
\83H
\83\93\83E
\83H
\83\93\96Â
\82¢
\82½",
426 "
\83|
\83\93\82Æ
\96Â
\82Á
\82½",
427 "
\83`
\83\83\83\8a\83\93\82Æ
\96Â
\82Á
\82½",
428 "
\83N
\83\93\83N
\83\93\96Â
\82¢
\82½",
429 "
\83`
\83\8a\83\93\83`
\83\8a\83\93\82Æ
\96Â
\82Á
\82½",
431 "
\83C
\81[
\83b
\82Æ
\96Â
\82¢
\82½",
432 "
\83J
\83`
\83\83\83J
\83`
\83\83\89¹
\82ð
\97§
\82Ä
\82½",
433 "
\83n
\83~
\83\93\83O
\82µ
\82½",
434 "
\83W
\83\85\81[
\83b
\82Æ
\89¹
\82ð
\97§
\82Ä
\82½",
435 "
\83s
\83\88\83s
\83\88\96Â
\82¢
\82½",
436 "
\83[
\83C
\83[
\83C
\91§
\82ð
\82µ
\82½",
438 "
\83J
\83T
\83J
\83T
\89¹
\82ð
\97§
\82Ä
\82½",
439 "
\8cx
\93J
\82ð
\96Â
\82ç
\82µ
\82½",
440 "
\90ã
\91«
\82ç
\82¸
\82É
\82µ
\82á
\82×
\82Á
\82½",
441 "
\83\88\81[
\83f
\83\8b\82ð
\89Ì
\82Á
\82½",
442 "
\83N
\81[
\83N
\81[
\96Â
\82¢
\82½",
443 "
\82°
\82Á
\82Õ
\82ð
\82µ
\82½",
445 "
\83\82\81[
\82Æ
\96Â
\82¢
\82½",
446 "
\94\9a\94
\89¹
\82ð
\8b¿
\82©
\82¹
\82½",
447 "
\83u
\83c
\83u
\83c
\82Â
\82Ô
\82â
\82¢
\82½",
448 "
\83u
\81[
\83u
\81[
\96Â
\82¢
\82½",
449 "
\83N
\83\8f\83b
\83N
\83\8f\83b
\82Æ
\96Â
\82¢
\82½",
450 "
\83S
\83\8d\83S
\83\8d\96Â
\82Á
\82½",
452 "
\83|
\83\8d\83\8d\83\93\82Æ
\96Â
\82Á
\82½",
454 "
\83\89\83b
\83p
\82Ì
\89¹
\82ð
\96Â
\82ç
\82µ
\82½",
455 "
\83K
\83\89\83K
\83\89\90º
\82ð
\8fo
\82µ
\82½",
456 "
\83z
\81[
\83z
\81[
\96Â
\82¢
\82½",
457 "
\82³
\82¦
\82¸
\82Á
\82½"
463 register struct monst *mtmp;
467 switch (mtmp->data->msound) {
473 ret = "
\83V
\81[
\83b
\82Æ
\96Â
\82¢
\82½";
480 ret = "
\82Í
\82°
\82µ
\82
\96i
\82¦
\82½";
486 ret = "
\96i
\82¦
\82½";
492 ret = "
\83u
\81[
\83b
\82Æ
\96Â
\82¢
\82½";
498 ret = "
\83L
\81[
\83L
\81[
\96Â
\82¢
\82½";
504 ret = "
\8bà
\90Ø
\82è
\90º
\82ð
\97§
\82Ä
\82½";
510 ret = "
\82¢
\82È
\82È
\82¢
\82½";
516 ret = "
\94ß
\82µ
\82
\96Â
\82¢
\82½";
522 ret = "
\8b»
\95±
\82µ
\82½";
528 ret = "
\8bà
\90Ø
\82è
\90º
\82ð
\82 \82°
\82½";
533 /* the sounds of a seriously abused pet, including player attacking it */
536 register struct monst *mtmp;
538 register const char *growl_verb = 0;
540 if (mtmp->msleeping || !mtmp->mcanmove || !mtmp->data->msound)
543 /* presumably nearness and soundok checks have already been made */
545 growl_verb = h_sounds[rn2(SIZE(h_sounds))];
547 growl_verb = growl_sound(mtmp);
550 pline("%s %s!", Monnam(mtmp), vtense((char *) 0, growl_verb));
552 pline("%s
\82Í%s
\81I", Monnam(mtmp), growl_verb);
555 wake_nearto(mtmp->mx, mtmp->my, mtmp->data->mlevel * 18);
559 /* the sounds of mistreated pets */
562 register struct monst *mtmp;
564 register const char *yelp_verb = 0;
566 if (mtmp->msleeping || !mtmp->mcanmove || !mtmp->data->msound)
569 /* presumably nearness and soundok checks have already been made */
571 yelp_verb = h_sounds[rn2(SIZE(h_sounds))];
573 switch (mtmp->data->msound) {
576 yelp_verb = (!Deaf) ? "yowl" : "arch";
578 yelp_verb = (!Deaf) ? "
\94ß
\82µ
\82
\96Â
\82¢
\82½" : "
\8b|
\82È
\82è
\82É
\82È
\82Á
\82½";
583 yelp_verb = (!Deaf) ? "yelp" : "recoil";
585 yelp_verb = (!Deaf) ? "
\83L
\83\83\83\93\83L
\83\83\83\93\96Â
\82¢
\82½" : "
\90K
\8d\9e\82Ý
\82µ
\82½";
589 yelp_verb = (!Deaf) ? "snarl" : "bluff";
591 yelp_verb = (!Deaf) ? "
\82¤
\82È
\82Á
\82½" : "
\82â
\82¹
\89ä
\96\9d\82µ
\82½";
595 yelp_verb = (!Deaf) ? "squeal" : "quiver";
597 yelp_verb = (!Deaf) ? "
\83L
\81[
\83L
\81[
\96Â
\82¢
\82½" : "
\90k
\82¦
\82½";
601 yelp_verb = (!Deaf) ? "screak" : "thrash";
603 yelp_verb = (!Deaf) ? "
\8bà
\90Ø
\82è
\90º
\82ð
\97§
\82Ä
\82½" : "
\82Ì
\82½
\82¤
\82¿
\89ñ
\82Á
\82½";
607 yelp_verb = (!Deaf) ? "wail" : "cringe";
609 yelp_verb = (!Deaf) ? "
\94ß
\82µ
\82
\96Â
\82¢
\82½" : "
\90g
\82ð
\82·
\82
\82ß
\82½";
614 pline("%s %s!", Monnam(mtmp), vtense((char *) 0, yelp_verb));
616 pline("%s
\82Í%s
\81I", Monnam(mtmp), yelp_verb);
619 wake_nearto(mtmp->mx, mtmp->my, mtmp->data->mlevel * 12);
623 /* the sounds of distressed pets */
626 register struct monst *mtmp;
628 register const char *whimper_verb = 0;
630 if (mtmp->msleeping || !mtmp->mcanmove || !mtmp->data->msound)
633 /* presumably nearness and soundok checks have already been made */
635 whimper_verb = h_sounds[rn2(SIZE(h_sounds))];
637 switch (mtmp->data->msound) {
641 whimper_verb = "whimper";
643 whimper_verb = "
\83N
\83\93\83N
\83\93\96Â
\82¢
\82½";
647 whimper_verb = "whine";
649 whimper_verb = "
\83N
\81[
\83\93\82Æ
\96Â
\82¢
\82½";
653 whimper_verb = "squeal";
655 whimper_verb = "
\83L
\81[
\83L
\81[
\96Â
\82¢
\82½";
660 pline("%s %s.", Monnam(mtmp), vtense((char *) 0, whimper_verb));
662 pline("%s
\82Í%s
\81D", Monnam(mtmp), whimper_verb);
665 wake_nearto(mtmp->mx, mtmp->my, mtmp->data->mlevel * 6);
669 /* pet makes "I'm hungry" noises */
672 register struct monst *mtmp;
674 if (mtmp->msleeping || !mtmp->mcanmove
675 || !(carnivorous(mtmp->data) || herbivorous(mtmp->data)))
678 /* presumably nearness and soundok checks have already been made */
679 if (!is_silent(mtmp->data) && mtmp->data->msound <= MS_ANIMAL)
680 (void) domonnoise(mtmp);
681 else if (mtmp->data->msound >= MS_HUMANOID) {
682 if (!canspotmon(mtmp))
683 map_invisible(mtmp->mx, mtmp->my);
685 verbalize("I'm hungry.");
687 verbalize("
\82Í
\82ç
\82Ø
\82±
\82¾
\81D");
691 /* return True if mon is a gecko or seems to look like one (hallucination) */
698 /* return True if it is actually a gecko */
699 if (mon->data == &mons[PM_GECKO])
701 /* return False if it is a long worm; we might be chatting to its tail
702 (not strictly needed; long worms are MS_SILENT so won't get here) */
703 if (mon->data == &mons[PM_LONG_WORM])
705 /* result depends upon whether map spot shows a gecko, which will
706 be due to hallucination or to mimickery since mon isn't one */
707 glyph = glyph_at(mon->mx, mon->my);
708 return (boolean) (glyph_to_mon(glyph) == PM_GECKO);
713 register struct monst *mtmp;
716 register const char *pline_msg = 0, /* Monnam(mtmp) will be prepended */
717 *verbl_msg = 0, /* verbalize() */
718 *verbl_msg_mcan = 0; /* verbalize() if cancelled */
719 struct permonst *ptr = mtmp->data;
720 int msound = ptr->msound, gnomeplan = 0;
722 /* presumably nearness and sleep checks have already been made */
728 /* leader might be poly'd; if he can still speak, give leader speech */
729 if (mtmp->m_id == quest_status.leader_m_id && msound > MS_ANIMAL)
731 /* make sure it's your role's quest guardian; adjust if not */
732 else if (msound == MS_GUARDIAN && ptr != &mons[urole.guardnum])
733 msound = mons[genus(monsndx(ptr), 1)].msound;
734 /* some normally non-speaking types can/will speak if hero is similar */
735 else if (msound == MS_ORC /* note: MS_ORC is same as MS_GRUNT */
736 && ((same_race(ptr, youmonst.data) /* current form, */
737 || same_race(ptr, &mons[Race_switch])) /* unpoly'd form */
739 msound = MS_HUMANOID;
740 /* silliness, with slight chance to interfere with shopping */
741 else if (Hallucination && mon_is_gecko(mtmp))
744 /* be sure to do this before talking; the monster might teleport away, in
745 * which case we want to check its pre-teleport position
747 if (!canspotmon(mtmp))
748 map_invisible(mtmp->mx, mtmp->my);
752 return doconsult(mtmp);
761 case MS_SELL: /* pitch, pay, total */
762 if (!Hallucination || (mtmp->isshk && !rn2(2))) {
765 /* approximation of GEICO's advertising slogan (it actually
766 concludes with "save you 15% or more on car insurance.") */
768 Sprintf(verbuf, "15 minutes could save you 15 %s.",
770 Sprintf(verbuf, "15
\95ª
\92¸
\82¯
\82ê
\82Î15%s
\90ß
\96ñ
\82Å
\82«
\82Ü
\82·
\81D",
771 currency(15L)); /* "zorkmids" */
776 /* vampire messages are varied by tameness, peacefulness, and time of
778 boolean isnight = night();
779 boolean kindred = (Upolyd && (u.umonnum == PM_VAMPIRE
780 || u.umonnum == PM_VAMPIRE_LORD));
782 (Upolyd && (u.umonnum == PM_WOLF || u.umonnum == PM_WINTER_WOLF
783 || u.umonnum == PM_WINTER_WOLF_CUB));
785 const char *racenoun =
786 (flags.female && urace.individual.f)
788 : (urace.individual.m) ? urace.individual.m : urace.noun;
790 const char *racenoun = (flags.female) ? "
\82 \82È
\82½" : "
\82¨
\82Ü
\82¦" ;
796 Sprintf(verbuf, "Good %s to you Master%s",
797 isnight ? "evening" : "day",
798 isnight ? "!" : ". Why do we not rest?");
800 Sprintf(verbuf, "
\82²
\8eå
\90l
\97l
\81C%s%s",
801 isnight ? "
\82±
\82ñ
\82Î
\82ñ
\82Í" : "
\82±
\82ñ
\82É
\82¿
\82Í",
802 isnight ? "
\81I" : "
\81D
\82¨
\8bx
\82Ý
\82É
\82È
\82è
\82Ü
\82¹
\82ñ
\82©
\81H");
807 Sprintf(verbuf, "%s%s",
808 nightchild ? "Child of the night, " : "",
810 ? "I can stand this craving no longer!"
812 ? "I beg you, help me satisfy this growing craving!"
813 : "I find myself growing a little weary.");
815 Sprintf(verbuf,"%s%s",
816 nightchild ? "
\96é
\82Ì
\8ee
\82æ
\81C" : "",
818 ? "
\8e\84\82Í
\82±
\82ê
\88È
\8fã
\8a\89\96]
\82ð
\97}
\82¦
\82ç
\82ê
\82È
\82¢
\81I"
820 ? "
\82Ó
\82
\82ê
\82 \82ª
\82é
\8a\89\96]
\82ð
\96\9e\82½
\82·
\82Ì
\82ð
\8f\95\82¯
\82Ä
\82
\82ê
\82È
\82¢
\82©
\81H
\97\8a\82Þ
\81I"
821 : "
\8e\84\82Í
\8f
\81X
\94æ
\82ê
\82½
\82æ
\82¤
\82¾
\81D");
825 } else if (mtmp->mpeaceful) {
826 if (kindred && isnight) {
828 Sprintf(verbuf, "Good feeding %s!",
829 flags.female ? "sister" : "brother");
831 Sprintf(verbuf, "
\82æ
\82¤
\8cZ
\92í
\81I");
834 } else if (nightchild && isnight) {
836 Sprintf(verbuf, "How nice to hear you, child of the night!");
838 Sprintf(verbuf, "
\96é
\82Ì
\8ee
\82æ
\81C
\8c³
\8bC
\82»
\82¤
\82¾
\82È
\81I");
842 verbl_msg = "I only drink... potions.";
844 verbl_msg = "
\8e\84\82Í
\96ò
\81D
\81D
\82µ
\82©
\88ù
\82Ü
\82È
\82¢
\81D";
846 static const char *const vampmsg[] = {
847 /* These first two (0 and 1) are specially handled below */
849 "I vant to suck your %s!",
851 "
\82¨
\91O
\82Ì%s
\82ð
\82æ
\82±
\82¹
\81I",
853 "I vill come after %s without regret!",
855 "
\91¶
\95ª
\82É%s
\82ð
\92Ç
\8c\82\82³
\82¹
\82Ä
\82à
\82ç
\82¨
\82¤
\81I",
856 /* other famous vampire quotes can follow here if desired */
863 "This is my hunting ground that you dare to prowl!";
865 "
\82¨
\82Ü
\82¦
\82ª
\82¤
\82ë
\82Â
\82¢
\82Ä
\82¢
\82é
\82±
\82Ì
\82 \82½
\82è
\82Í
\8e\84\82Ì
\8eë
\8fê
\82¾
\81I";
866 else if (youmonst.data == &mons[PM_SILVER_DRAGON]
867 || youmonst.data == &mons[PM_BABY_SILVER_DRAGON]) {
868 /* Silver dragons are silver in color, not made of silver */
870 Sprintf(verbuf, "%s! Your silver sheen does not frighten me!",
871 youmonst.data == &mons[PM_SILVER_DRAGON]
876 verbl_msg = "
\82Î
\82©
\82ß
\81I
\82¨
\82Ü
\82¦
\82Ì
\8bâ
\82Ì
\8bP
\82«
\82È
\82Ç
\95|
\82
\82È
\82¢
\82¼
\81I";
879 vampindex = rn2(SIZE(vampmsg));
880 if (vampindex == 0) {
881 Sprintf(verbuf, vampmsg[vampindex], body_part(BLOOD));
883 } else if (vampindex == 1) {
884 Sprintf(verbuf, vampmsg[vampindex],
885 Upolyd ? an(mons[u.umonnum].mname)
889 verbl_msg = vampmsg[vampindex];
894 if (flags.moonphase == FULL_MOON && (night() ^ !rn2(13))) {
896 pline("%s throws back %s head and lets out a blood curdling %s!",
897 Monnam(mtmp), mhis(mtmp),
898 ptr == &mons[PM_HUMAN_WERERAT] ? "shriek" : "howl");
900 pline("%s
\82Í
\93ª
\82ð
\82Ì
\82¯
\82¼
\82ç
\82µ
\94w
\8bØ
\82ª
\93\80\82é
\82æ
\82¤
\82È%s
\82ð
\82 \82°
\82½
\81I",
902 ptr == &mons[PM_HUMAN_WERERAT] ? "
\8bà
\90Ø
\82è
\90º" : "
\99ô
\9aK");
904 wake_nearto(mtmp->mx, mtmp->my, 11 * 11);
908 "whispers inaudibly. All you can make out is \"moon\".";
910 "
\95·
\82«
\82Æ
\82ê
\82È
\82¢
\82æ
\82¤
\82È
\90º
\82Å
\82³
\82³
\82â
\82¢
\82½
\81D
\82©
\82ë
\82¤
\82¶
\82Ä
\81w
\8c\8e\81x
\82Æ
\82¢
\82¤
\8c¾
\97t
\82¾
\82¯
\82ª
\95·
\82«
\82Æ
\82ê
\82½
\81D";
913 if (flags.moonphase == FULL_MOON && night()) {
915 pline_msg = "howls.";
917 pline_msg = "
\96i
\82¦
\82½
\81D";
918 } else if (mtmp->mpeaceful) {
920 && (mtmp->mconf || mtmp->mflee || mtmp->mtrapped
921 || moves > EDOG(mtmp)->hungrytime || mtmp->mtame < 5))
923 pline_msg = "whines.";
925 pline_msg = "
\83N
\83\93\83N
\83\93\96Â
\82¢
\82½
\81D";
926 else if (mtmp->mtame && EDOG(mtmp)->hungrytime > moves + 1000)
930 pline_msg = "
\83L
\83\83\83\93\83L
\83\83\83\93\96Â
\82¢
\82½
\81D";
933 != &mons[PM_DINGO]) /* dingos do not actually bark */
935 pline_msg = "barks.";
937 pline_msg = "
\83\8f\83\93\83\8f\83\93\96i
\82¦
\82½
\81D";
941 pline_msg = "growls.";
943 pline_msg = "
\82¤
\82È
\82Á
\82½
\81D";
948 if (mtmp->mconf || mtmp->mflee || mtmp->mtrapped
951 pline_msg = "yowls.";
953 pline_msg = "
\94ß
\82µ
\82
\96Â
\82¢
\82½
\81D";
954 else if (moves > EDOG(mtmp)->hungrytime)
956 pline_msg = "meows.";
958 pline_msg = "
\83j
\83\83\81[
\83\93\82Æ
\96Â
\82¢
\82½
\81D";
959 else if (EDOG(mtmp)->hungrytime > moves + 1000)
961 pline_msg = "purrs.";
963 pline_msg = "
\83S
\83\8d\83S
\83\8d\82Æ
\96Â
\82¢
\82½
\81D";
968 pline_msg = "
\83j
\83\83\81[
\83j
\83\83\81[
\96Â
\82¢
\82½
\81D";
974 pline_msg = mtmp->mpeaceful ? "snarls." : "growls!";
976 pline_msg = mtmp->mpeaceful ? "
\82¤
\82È
\82Á
\82½
\81D" : "
\8c\83\82µ
\82
\82¤
\82È
\82Á
\82½
\81I";
980 pline_msg = mtmp->mpeaceful ? "snarls." : "roars!";
982 pline_msg = mtmp->mpeaceful ? "
\82¤
\82È
\82Á
\82½
\81D" : "
\82Æ
\82Ä
\82à
\8c\83\82µ
\82
\96i
\82¦
\82½
\81I";
986 pline_msg = "squeaks.";
988 pline_msg = "
\83L
\81[
\83L
\81[
\96Â
\82¢
\82½
\81D";
991 if (ptr == &mons[PM_RAVEN] && !mtmp->mpeaceful)
993 verbl_msg = "Nevermore!";
995 verbl_msg = "
\81u
\82à
\82¤
\93ñ
\93x
\82Æ
\81I
\81v";
998 pline_msg = "squawks.";
1000 pline_msg = "
\83L
\81[
\83L
\81[
\96Â
\82¢
\82½
\81D";
1003 if (!mtmp->mpeaceful)
1005 pline_msg = "hisses!";
1007 pline_msg = "
\83V
\81[
\83b
\82Æ
\96Â
\82¢
\82½
\81I";
1009 return 0; /* no sound */
1013 pline_msg = mtmp->mpeaceful ? "drones." : "buzzes angrily.";
1015 pline_msg = mtmp->mpeaceful ? "
\82Ô
\81[
\82ñ
\82Æ
\96Â
\82Á
\82½
\81D" : "
\82Ô
\82ñ
\82Ô
\82ñ
\96Â
\82Á
\82½
\81D";
1019 pline_msg = "grunts.";
1021 pline_msg = "
\82Ô
\81[
\82Ô
\81[
\96Â
\82¢
\82½
\81D";
1024 if (mtmp->mtame < 5)
1026 pline_msg = "neighs.";
1028 pline_msg = "
\82¢
\82È
\82È
\82¢
\82½
\81D";
1029 else if (moves > EDOG(mtmp)->hungrytime)
1031 pline_msg = "whinnies.";
1033 pline_msg = "
\83q
\83q
\81[
\83\93\82Æ
\96Â
\82¢
\82½
\81D";
1036 pline_msg = "whickers.";
1038 pline_msg = "
\83q
\83q
\83q
\81[
\83\93\82Æ
\96Â
\82¢
\82½
\81D";
1042 pline_msg = "wails mournfully.";
1044 pline_msg = "
\94ß
\82µ
\82°
\82É
\96Â
\82¢
\82½
\81D";
1048 pline_msg = "gurgles.";
1050 pline_msg = "
\82²
\82ë
\82²
\82ë
\8dA
\82ð
\96Â
\82ç
\82µ
\82½
\81D";
1054 pline_msg = "burbles.";
1056 pline_msg = "
\82Ø
\82¿
\82á
\82
\82¿
\82á
\82µ
\82á
\82×
\82Á
\82½
\81D";
1060 pline_msg = "shrieks.";
1062 pline_msg = "
\8bà
\90Ø
\82è
\90º
\82ð
\82 \82°
\82½
\81D";
1067 pline_msg = "imitates you.";
1069 pline_msg = "
\82 \82È
\82½
\82Ì
\90^
\8e\97\82ð
\82µ
\82½
\81D";
1073 pline("%s rattles noisily.", Monnam(mtmp));
1075 pline("%s
\82Í
\83P
\83^
\83P
\83^
\82Æ
\8fÎ
\82¢
\82¾
\82µ
\82½
\81D",Monnam(mtmp));
1077 You("freeze for a moment.");
1079 You("
\88ê
\8fu
\93\80\82è
\82Â
\82¢
\82½
\81D");
1082 multi_reason = "scared by rattling";
1084 multi_reason = "
\8d\9c\82Ì
\83J
\83^
\83J
\83^
\8c¾
\82¤
\89¹
\82É
\82¨
\82Ñ
\82¦
\82½
\8c\84\82É";
1088 static const char *const laugh_msg[4] = {
1090 "giggles.", "chuckles.", "snickers.", "laughs.",
1092 "
\82
\82·
\82
\82·
\8fÎ
\82Á
\82½
\81D", "
\82
\82·
\82Á
\82Æ
\8fÎ
\82Á
\82½
\81D", "
\82Î
\82©
\82É
\82µ
\82½
\82æ
\82¤
\82É
\8fÎ
\82Á
\82½
\81D", "
\8fÎ
\82Á
\82½
\81D",
1094 pline_msg = laugh_msg[rn2(4)];
1098 pline_msg = "mumbles incomprehensibly.";
1100 pline_msg = "
\95s
\89Â
\89ð
\82È
\8c¾
\97t
\82ð
\82Â
\82Ô
\82â
\82¢
\82½
\81D";
1105 verbl_msg = "Sorry, I'm all out of wishes.";
1107 verbl_msg = "
\8e\84\82ð
\8f\95\82¯
\82Ä
\82
\82ê
\82½
\82±
\82Æ
\82ð
\8a´
\8eÓ
\82·
\82é
\81I";
1108 } else if (mtmp->mpeaceful) {
1109 if (ptr == &mons[PM_WATER_DEMON])
1111 pline_msg = "gurgles.";
1113 pline_msg = "
\83S
\83{
\83S
\83{
\83S
\83{
\83S
\83{
\81D";
1116 verbl_msg = "I'm free!";
1118 verbl_msg = "
\82â
\82Á
\82Æ
\8e©
\97R
\82É
\82È
\82Á
\82½
\81I";
1120 if (ptr != &mons[PM_PRISONER])
1122 verbl_msg = "This will teach you not to disturb me!";
1124 verbl_msg = "
\82¶
\82á
\82Ü
\82ð
\82µ
\82È
\82¢
\82Å
\82
\82ê
\81I";
1127 verbl_msg = "??????????";
1131 case MS_BOAST: /* giants */
1132 if (!mtmp->mpeaceful) {
1136 pline("%s boasts about %s gem collection.", Monnam(mtmp),
1139 pline("%s
\82Í
\8e©
\95ª
\82Ì
\95ó
\90Î
\82Ì
\83R
\83\8c\83N
\83V
\83\87\83\93\82ð
\8e©
\96\9d\82µ
\82½
\81D", Monnam(mtmp));
1144 pline_msg = "complains about a diet of mutton.";
1146 pline_msg = "
\96\88\93ú
\97r
\82Î
\82©
\82è
\90H
\82×
\82Ä
\82¢
\82é
\8e\96\82ð
\8bð
\92s
\82Á
\82½
\81D";
1150 pline_msg = "shouts \"Fee Fie Foe Foo!\" and guffaws.";
1152 pline_msg = "
\81w
\82í
\82Á
\82Í
\82Á
\82Í
\82Á
\82Í
\81I
\81x
\82Æ
\82Î
\82©
\8fÎ
\82¢
\82µ
\82½
\81D";
1153 wake_nearto(mtmp->mx, mtmp->my, 7 * 7);
1160 if (!mtmp->mpeaceful) {
1161 if (In_endgame(&u.uz) && is_mplayer(ptr))
1165 pline_msg = "threatens you.";
1167 pline_msg = "
\82 \82È
\82½
\82ð
\88Ð
\8ad
\82µ
\82½
\81D";
1170 /* Generic peaceful humanoid behaviour. */
1173 pline_msg = "wants nothing to do with you.";
1175 pline_msg = "
\82 \82È
\82½
\82Æ
\8aÖ
\82í
\82è
\82½
\82
\82È
\82¢
\82æ
\82¤
\82¾
\81D";
1176 else if (mtmp->mhp < mtmp->mhpmax / 4)
1178 pline_msg = "moans.";
1180 pline_msg = "
\82¤
\82ß
\82«
\90º
\82ð
\82 \82°
\82½
\81D";
1181 else if (mtmp->mconf || mtmp->mstun)
1183 verbl_msg = !rn2(3) ? "Huh?" : rn2(2) ? "What?" : "Eh?";
1185 verbl_msg = !rn2(3) ? "
\82Ö
\81H" : rn2(2) ? "
\89½
\81H" : "
\82¦
\81H";
1186 else if (!mtmp->mcansee)
1188 verbl_msg = "I can't see!";
1190 verbl_msg = "
\89½
\82à
\8c©
\82¦
\82È
\82¢
\81I";
1191 else if (mtmp->mtrapped) {
1192 struct trap *t = t_at(mtmp->mx, mtmp->my);
1197 verbl_msg = "I'm trapped!";
1199 verbl_msg = "ã©
\82É
\82Í
\82Ü
\82Á
\82Ä
\82µ
\82Ü
\82Á
\82½
\81I";
1200 } else if (mtmp->mhp < mtmp->mhpmax / 2)
1202 pline_msg = "asks for a potion of healing.";
1204 pline_msg = "
\89ñ
\95\9c\82Ì
\96ò
\82ð
\8e\9d\82Á
\82Ä
\82È
\82¢
\82©
\90q
\82Ë
\82½
\81D";
1205 else if (mtmp->mtame && !mtmp->isminion
1206 && moves > EDOG(mtmp)->hungrytime)
1208 verbl_msg = "I'm hungry.";
1210 verbl_msg = "
\95 \82ª
\8c¸
\82Á
\82½
\82È
\81D";
1211 /* Specific monsters' interests */
1212 else if (is_elf(ptr))
1214 pline_msg = "curses orcs.";
1216 pline_msg = "
\83I
\81[
\83N
\82ð
\8eô
\82Á
\82½
\81D";
1217 else if (is_dwarf(ptr))
1219 pline_msg = "talks about mining.";
1221 pline_msg = "
\8dÌ
\8c@
\82É
\82Â
\82¢
\82Ä
\98b
\82µ
\82½
\81D";
1222 else if (likes_magic(ptr))
1224 pline_msg = "talks about spellcraft.";
1226 pline_msg = "
\96\82\8fp
\82Ì
\92b
\98B
\82É
\82Â
\82¢
\82Ä
\98b
\82µ
\82½
\81D";
1227 else if (ptr->mlet == S_CENTAUR)
1229 pline_msg = "discusses hunting.";
1231 pline_msg = "
\97Â
\82É
\82Â
\82¢
\82Ä
\8bc
\98_
\82µ
\82½
\81D";
1232 else if (is_gnome(ptr) && Hallucination && (gnomeplan = rn2(4)) % 2)
1233 /* skipped for rn2(4) result of 0 or 2;
1234 gag from an early episode of South Park called "Gnomes";
1235 initially, Tweek (introduced in that episode) is the only
1236 one aware of the tiny gnomes after spotting them sneaking
1237 about; they are embarked upon a three-step business plan;
1238 a diagram of the plan shows:
1239 Phase 1 Phase 2 Phase 3
1240 Collect underpants ? Profit
1241 and they never verbalize step 2 so we don't either */
1243 verbl_msg = (gnomeplan == 1) ? "Phase one, collect underpants."
1244 : "Phase three, profit!";
1246 verbl_msg = (gnomeplan == 1) ? "
\82»
\82Ì
\82P
\81C
\83p
\83\93\83c
\82ð
\8fW
\82ß
\82é
\81D"
1247 : "
\82»
\82Ì
\82R
\81C
\8eû
\89v
\89»
\81I";
1250 switch (monsndx(ptr)) {
1253 (mtmp->mhpmax - mtmp->mhp >= 10)
1255 ? "complains about unpleasant dungeon conditions."
1257 ? "
\95s
\96ù
\89õ
\82È
\96À
\8b{
\82Ì
\8fó
\91Ô
\82É
\82Â
\82¢
\82Ä
\95s
\96\9e\82ð
\8fq
\82×
\82½
\81D"
1259 : "asks you about the One Ring.";
1261 : "
\81u
\88ê
\82Â
\82Ì
\8ew
\97Ö
\81v
\82É
\82Â
\82¢
\82Ä
\90q
\82Ë
\82½
\81D";
1263 case PM_ARCHEOLOGIST:
1266 "describes a recent article in \"Spelunker Today\" magazine.";
1268 "
\81u
\93ú
\8a§
\93´
\8cA
\81v
\82Ì
\8dÅ
\90V
\82Ì
\8bL
\8e\96\82ð
\8e·
\95M
\82µ
\82Ä
\82¢
\82é
\81D";
1272 verbl_msg = "Aloha.";
1274 verbl_msg = "
\83A
\83\8d\81[
\83n
\81D";
1278 pline_msg = "discusses dungeon exploration.";
1280 pline_msg = "
\96À
\8b{
\92T
\8c\9f\82É
\82Â
\82¢
\82Ä
\8bc
\98_
\82µ
\82½
\81D";
1287 if (SYSOPT_SEDUCE) {
1288 if (ptr->mlet != S_NYMPH
1289 && could_seduce(mtmp, &youmonst, (struct attack *) 0) == 1) {
1290 (void) doseduce(mtmp);
1293 swval = ((poly_gender() != (int) mtmp->female) ? rn2(3) : 0);
1295 swval = ((poly_gender() == 0) ? rn2(3) : 0);
1299 verbl_msg = "Hello, sailor.";
1301 switch (poly_gender()) {
1303 verbl_msg = "
\82±
\82ñ
\82É
\82¿
\82Í
\81D
\82 \82ç
\82¢
\82¢
\92j
\82Ë
\81D";
1306 verbl_msg = "
\82±
\82ñ
\82É
\82¿
\82Í
\81C
\82¨
\8fì
\82³
\82ñ
\81D";
1309 verbl_msg = "
\82±
\82ñ
\82É
\82¿
\82Í
\81D";
1316 pline_msg = "comes on to you.";
1318 pline_msg = "
\82 \82È
\82½
\82Ì
\82Ù
\82¤
\82Ö
\82â
\82Á
\82Ä
\82«
\82½
\81D";
1322 pline_msg = "cajoles you.";
1324 pline_msg = "
\82 \82È
\82½
\82ð
\82¨
\82¾
\82Ä
\82½
\81D";
1328 if (mtmp->mpeaceful)
1330 verbalize("Just the facts, %s.", flags.female ? "Ma'am" : "Sir");
1332 verbalize("
\8e\96\8eÀ
\82¾
\82¯
\82ª
\92m
\82è
\82½
\82¢
\82ñ
\82Å
\82·
\82æ
\81C%s
\81D", flags.female ? "
\89\9c\82³
\82ñ" : "
\92U
\93ß");
1335 static const char *const arrest_msg[3] = {
1337 "Anything you say can be used against you.",
1338 "You're under arrest!", "Stop in the name of the Law!",
1340 "
\82¨
\82Ü
\82¦
\82Ì
\8c¾
\82¤
\82±
\82Æ
\82Í
\82¨
\82Ü
\82¦
\82É
\82Æ
\82Á
\82Ä
\95s
\97\98\82È
\8fØ
\8b\92\82Æ
\82È
\82é
\82±
\82Æ
\82ª
\82 \82é
\81I",
1341 "
\82¨
\82Ü
\82¦
\82ð
\91ß
\95ß
\82·
\82é
\81I",
1342 "
\96@
\82Ì
\96¼
\82Ì
\82à
\82Æ
\92¼
\82¿
\82É
\92\86\8e~
\82¹
\82æ
\81I",
1345 verbl_msg = arrest_msg[rn2(3)];
1349 if (mtmp->mpeaceful && !mtmp->mtame) {
1350 (void) demon_talk(mtmp);
1355 if (!mtmp->mpeaceful)
1357 else if (is_lminion(mtmp))
1359 verbl_msg = "It's not too late.";
1361 verbl_msg = "
\82Ü
\82¾
\92x
\82
\82Í
\82È
\82¢
\81D";
1364 verbl_msg = "We're all doomed.";
1366 verbl_msg = "
\82Ý
\82ñ
\82È
\82à
\82¤
\82¨
\82µ
\82Ü
\82¢
\82¾
\81D";
1369 /* deliberately vague, since it's not actually casting any spell */
1371 pline_msg = "seems to mutter a cantrip.";
1373 pline_msg = "
\82Ô
\82Â
\82Ô
\82Â
\82Æ
\82Â
\82Ô
\82â
\82¢
\82Ä
\82¢
\82é
\81D";
1377 verbl_msg_mcan = "I hate this job!";
1379 verbl_msg_mcan = "
\82±
\82ñ
\82È
\8ed
\8e\96\8c\99\82¢
\81I";
1380 if (uwep && (uwep->oclass == WEAPON_CLASS || is_weptool(uwep)))
1382 verbl_msg = "Put that weapon away before you hurt someone!";
1384 verbl_msg = "
\95\90\8aí
\82ð
\82¨
\82³
\82ß
\82È
\82³
\82¢
\81I
\82»
\82ê
\82Í
\90l
\82ð
\8f\9d\82Â
\82¯
\82é
\82à
\82Ì
\82æ
\81I";
1385 else if (uarmc || uarm || uarmh || uarms || uarmg || uarmf)
1386 verbl_msg = Role_if(PM_HEALER)
1388 ? "Doc, I can't help you unless you cooperate."
1390 ? "
\90æ
\90¶
\81C
\82 \82È
\82½
\82Ì
\8b¦
\97Í
\82È
\82µ
\82Å
\82Í
\82Ç
\82¤
\82µ
\82æ
\82¤
\82à
\82 \82è
\82Ü
\82¹
\82ñ
\82í
\81D"
1392 : "Please undress so I can examine you.";
1394 : "
\95\9e\82ð
\92E
\82¢
\82Å
\82
\82¾
\82³
\82¢
\81D
\82 \82È
\82½
\82ð
\90f
\8e@
\82µ
\82Ü
\82·
\82í
\81D";
1397 verbl_msg = "Take off your shirt, please.";
1399 verbl_msg = "
\83V
\83\83\83c
\82ð
\92E
\82¢
\82Å
\82
\82¾
\82³
\82¢
\81D";
1402 verbl_msg = "Relax, this won't hurt a bit.";
1404 verbl_msg = "
\82¨
\82¿
\82Â
\82¢
\82Ä
\81D
\82¿
\82Á
\82Æ
\82à
\92É
\82
\82È
\82¢
\82í
\82æ
\81D";
1407 if (money_cnt(invent))
1409 verbl_msg = "Please drop that gold and follow me.";
1411 verbl_msg = "
\8bà
\82ð
\92u
\82¢
\82Ä
\82Â
\82¢
\82Ä
\82«
\82Ä
\82
\82¾
\82³
\82¢
\81D";
1414 verbl_msg = "Please follow me.";
1416 verbl_msg = "
\82Â
\82¢
\82Ä
\82«
\82Ä
\82
\82¾
\82³
\82¢
\81D";
1420 *const soldier_foe_msg[3] =
1423 "Resistance is useless!", "You're dog meat!", "Surrender!",
1425 "
\92ï
\8dR
\82µ
\82Ä
\82à
\96³
\91Ê
\82¾
\81I",
1426 "
\8c¢
\82É
\8bò
\82í
\82ê
\82¿
\82Ü
\82¦
\81I",
1427 "
\8d~
\95\9a\82µ
\82ë
\81I",
1430 *const soldier_pax_msg[3] = {
1432 "What lousy pay we're getting here!",
1433 "The food's not fit for Orcs!",
1434 "My feet hurt, I've been on them all day!",
1436 "
\82È
\82ñ
\82Ä
\8bà
\95¥
\82¢
\82ª
\88«
\82¢
\82ñ
\82¾
\81I",
1437 "
\82È
\82ñ
\82¾
\82¢
\81H
\83I
\81[
\83N
\82Å
\82à
\8bò
\82¦
\82Ë
\82¥
\82º
\81I",
1438 "
\91«
\82ð
\89ö
\89ä
\82µ
\82½
\81C
\82¸
\82Á
\82Æ
\82±
\82Ì
\92²
\8eq
\82¾
\81I",
1441 verbl_msg = mtmp->mpeaceful ? soldier_pax_msg[rn2(3)]
1442 : soldier_foe_msg[rn2(3)];
1446 const char *tribtitle;
1447 struct obj *book = 0;
1448 boolean ms_Death = (ptr == &mons[PM_DEATH]);
1451 if (ms_Death && !context.tribute.Deathnotice
1452 && (book = u_have_novel()) != 0) {
1453 if ((tribtitle = noveltitle(&book->novelidx)) != 0) {
1455 Sprintf(verbuf, "Ah, so you have a copy of /%s/.", tribtitle);
1457 Sprintf(verbuf, "
\82 \82 \81A/%s/
\82ð
\8e\9d\82Á
\82Ä
\82¢
\82é
\82Ì
\82©
\81D", tribtitle);
1458 /* no Death featured in these two, so exclude them */
1459 if (strcmpi(tribtitle, "Snuff")
1460 && strcmpi(tribtitle, "The Wee Free Men"))
1462 Strcat(verbuf, " I may have been misquoted there.");
1464 Strcat(verbuf, "
\82±
\82±
\82Å
\82Í
\88ø
\97p
\82ª
\8aÔ
\88á
\82Á
\82Ä
\82¢
\82é
\82©
\82à
\82µ
\82ê
\82È
\82¢
\81D");
1467 context.tribute.Deathnotice = 1;
1468 } else if (ms_Death && rn2(3) && Death_quote(verbuf, sizeof verbuf)) {
1470 /* end of tribute addition */
1472 } else if (ms_Death && !rn2(10)) {
1474 pline_msg = "is busy reading a copy of Sandman #8.";
1476 pline_msg = "
\81u
\83T
\83\93\83h
\83}
\83\93\81v
\82Ì8
\8aª
\82ð
\93Ç
\82Þ
\82Ì
\82É
\96Z
\82µ
\82¢
\81D";
1479 verbl_msg = "Who do you think you are, War?";
1481 verbl_msg = "
\83E
\83H
\81[
\82æ
\81C
\8e©
\95ª
\82ª
\89½
\8eÒ
\82©
\8dl
\82¦
\82½
\82±
\82Æ
\82ª
\82 \82é
\82©
\81H";
1483 } /* case MS_RIDER */
1488 pline("%s %s", Monnam(mtmp), pline_msg);
1490 pline("%s
\82Í%s", Monnam(mtmp), pline_msg);
1491 } else if (mtmp->mcan && verbl_msg_mcan) {
1492 verbalize1(verbl_msg_mcan);
1493 } else if (verbl_msg) {
1494 #if 0 /*JP*//*
\83f
\83X
\82ð
\93Á
\95Ê
\88µ
\82¢
\82µ
\82È
\82¢*/
1495 /* more 3.6 tribute */
1496 if (ptr == &mons[PM_DEATH]) {
1497 /* Death talks in CAPITAL LETTERS
1498 and without quotation marks */
1501 pline1(ucase(strcpy(tmpbuf, verbl_msg)));
1503 verbalize1(verbl_msg);
1506 verbalize1(verbl_msg);
1529 if (is_silent(youmonst.data)) {
1531 pline("As %s, you cannot speak.", an(youmonst.data->mname));
1533 pline("
\82 \82È
\82½
\82Í%s
\82È
\82Ì
\82Å
\81C
\98b
\82·
\82±
\82Æ
\82ª
\82Å
\82«
\82È
\82¢
\81D", youmonst.data->mname);
1538 You_cant("speak. You're choking!");
1540 You("
\98b
\82¹
\82È
\82¢
\81D
\82 \82È
\82½
\82Í
\8eñ
\82ð
\8di
\82ß
\82ç
\82ê
\82Ä
\82¢
\82é
\81I");
1545 pline("They won't hear you out there.");
1547 You("
\8aO
\82Ö
\8cü
\82Á
\82Ä
\98b
\82ð
\82µ
\82½
\82ª
\81C
\92N
\82à
\95·
\82«
\82¢
\82ê
\82È
\82©
\82Á
\82½
\81D");
1552 Your("speech is unintelligible underwater.");
1554 pline("
\90\85\96Ê
\89º
\82Å
\82Í
\81C
\82 \82È
\82½
\82Ì
\98b
\82Í
\82ë
\82
\82É
\97\9d\89ð
\82³
\82ê
\82È
\82¢
\81D");
1559 pline("How can you hold a conversation when you cannot hear?");
1561 pline("
\95·
\82
\82±
\82Æ
\82ª
\82Å
\82«
\82È
\82¢
\82Ì
\82É
\82Ç
\82¤
\82â
\82Á
\82Ä
\89ï
\98b
\82·
\82é
\82Ì
\81H");
1565 if (!Blind && (otmp = shop_object(u.ux, u.uy)) != (struct obj *) 0) {
1566 /* standing on something in a shop and chatting causes the shopkeeper
1567 to describe the price(s). This can inhibit other chatting inside
1568 a shop, but that shouldn't matter much. shop_object() returns an
1569 object iff inside a shop and the shopkeeper is present and willing
1570 (not angry) and able (not asleep) to speak and the position
1571 contains any objects other than just gold.
1578 if (!getdir("Talk to whom? (in what direction)")) {
1580 if (!getdir("
\92N
\82Æ
\98b
\82µ
\82Ü
\82·
\82©
\81H[
\95û
\8cü
\82ð
\93ü
\82ê
\82Ä
\82Ë]")) {
1581 /* decided not to chat */
1585 if (u.usteed && u.dz > 0) {
1586 if (!u.usteed->mcanmove || u.usteed->msleeping) {
1588 pline("%s seems not to notice you.", Monnam(u.usteed));
1590 pline("%s
\82Í
\82 \82È
\82½
\82É
\8bC
\82ª
\82Â
\82¢
\82Ä
\82¢
\82È
\82¢
\82æ
\82¤
\82¾
\81D", Monnam(u.usteed));
1593 return domonnoise(u.usteed);
1598 pline("They won't hear you %s there.", u.dz < 0 ? "up" : "down");
1600 pline("%s
\8cü
\82©
\82Á
\82Ä
\98b
\82ð
\82µ
\82Ä
\82à
\88Ó
\96¡
\82ª
\82È
\82¢
\81D", u.dz < 0 ? "
\8fã
\82É" : "
\89º
\82É");
1604 if (u.dx == 0 && u.dy == 0) {
1606 * Let's not include this.
1607 * It raises all sorts of questions: can you wear
1608 * 2 helmets, 2 amulets, 3 pairs of gloves or 6 rings as a marilith,
1610 if (u.umonnum == PM_ETTIN) {
1611 You("discover that your other head makes boring conversation.");
1616 pline("Talking to yourself is a bad habit for a dungeoneer.");
1618 pline("
\88ê
\90l
\8c¾
\82Í
\96À
\8b{
\92T
\8c\9f\8eÒ
\82Ì
\88«
\82¢
\95È
\82¾
\81D");
1628 mtmp = m_at(tx, ty);
1630 if ((!mtmp || mtmp->mundetected)
1631 && (otmp = vobj_at(tx, ty)) != 0 && otmp->otyp == STATUE) {
1632 /* Talking to a statue */
1635 pline_The("%s seems not to notice you.",
1636 /* if hallucinating, you can't tell it's a statue */
1637 Hallucination ? rndmonnam((char *) 0) : "statue");
1639 pline_The("%s
\82Í
\82 \82È
\82½
\82É
\8bC
\82ª
\82Â
\82¢
\82Ä
\82¢
\82È
\82¢
\82æ
\82¤
\82¾
\81D",
1640 Hallucination ? rndmonnam((char *) 0) : "
\90Î
\91\9c");
1646 if (!mtmp || mtmp->mundetected || M_AP_TYPE(mtmp) == M_AP_FURNITURE
1647 || M_AP_TYPE(mtmp) == M_AP_OBJECT)
1650 /* sleeping monsters won't talk, except priests (who wake up) */
1651 if ((!mtmp->mcanmove || mtmp->msleeping) && !mtmp->ispriest) {
1652 /* If it is unseen, the player can't tell the difference between
1653 not noticing him and just not existing, so skip the message. */
1654 if (canspotmon(mtmp))
1656 pline("%s seems not to notice you.", Monnam(mtmp));
1658 pline("%s
\82Í
\82 \82È
\82½
\82É
\8bC
\82ª
\82Â
\82¢
\82Ä
\82¢
\82È
\82¢
\82æ
\82¤
\82¾
\81D", Monnam(mtmp));
1662 /* if this monster is waiting for something, prod it into action */
1663 mtmp->mstrategy &= ~STRAT_WAITMASK;
1665 if (mtmp->mtame && mtmp->meating) {
1666 if (!canspotmon(mtmp))
1667 map_invisible(mtmp->mx, mtmp->my);
1669 pline("%s is eating noisily.", Monnam(mtmp));
1671 pline("%s
\82Í
\83o
\83\8a\83o
\83\8a\82Æ
\95¨
\82ð
\90H
\82×
\82Ä
\82¢
\82é
\81D", Monnam(mtmp));
1675 return domonnoise(mtmp);
1680 extern void FDECL(play_usersound, (const char *, int));
1682 typedef struct audio_mapping_rec {
1683 struct nhregex *regex;
1686 struct audio_mapping_rec *next;
1689 static audio_mapping *soundmap = 0;
1691 char *sounddir = ".";
1693 /* adds a sound file mapping, returns 0 on failure, 1 on success */
1695 add_sound_mapping(mapping)
1696 const char *mapping;
1703 if (sscanf(mapping, "MESG \"%255[^\"]\"%*[\t ]\"%255[^\"]\" %d", text,
1704 filename, &volume) == 3) {
1705 audio_mapping *new_map;
1707 if (strlen(sounddir) + strlen(filename) > 254) {
1708 raw_print("sound file name too long");
1711 Sprintf(filespec, "%s/%s", sounddir, filename);
1713 if (can_read_file(filespec)) {
1714 new_map = (audio_mapping *) alloc(sizeof(audio_mapping));
1715 new_map->regex = regex_init();
1716 new_map->filename = dupstr(filespec);
1717 new_map->volume = volume;
1718 new_map->next = soundmap;
1720 if (!regex_compile(text, new_map->regex)) {
1721 raw_print(regex_error_desc(new_map->regex));
1722 regex_free(new_map->regex);
1723 free(new_map->filename);
1730 Sprintf(text, "cannot read %.243s", filespec);
1735 raw_print("syntax error in SOUND");
1743 play_sound_for_message(msg)
1746 audio_mapping *cursor = soundmap;
1749 if (regex_match(msg, cursor->regex)) {
1750 play_usersound(cursor->filename, cursor->volume);
1752 cursor = cursor->next;
1756 #endif /* USER_SOUNDS */