Wikia

Wikihack

Source:Sounds.c

2,032pages on
this wiki
Talk0

Below is the full text to src/sounds.c from NetHack 3.4.3. To link to a particular line, write [[sounds.c#line123]], for example.

Top of file Edit

1.    /*	SCCS Id: @(#)sounds.c	3.4	2002/05/06	*/
2.    /*	Copyright (c) 1989 Janet Walz, Mike Threepoint */
3.    /* NetHack may be freely redistributed.  See license for details. */
4.    
The NetHack General Public License applies to screenshots, source code and other content from NetHack.
5.    #include "hack.h"
6.    #include "edog.h"
7.    #ifdef USER_SOUNDS
8.    # ifdef USER_SOUNDS_REGEX
9.    #include <regex.h>
10.   # endif
11.   #endif
12.   
13.   #ifdef OVLB
14.   
15.   static int FDECL(domonnoise,(struct monst *));
16.   static int NDECL(dochat);
17.   
18.   #endif /* OVLB */
19.   
20.   #ifdef OVL0
21.   

mon_in_room Edit

22.   static int FDECL(mon_in_room, (struct monst *,int));
23.   
24.   /* this easily could be a macro, but it might overtax dumb compilers */
25.   static int
26.   mon_in_room(mon, rmtyp)
27.   struct monst *mon;
28.   int rmtyp;
29.   {
30.       int rno = levl[mon->mx][mon->my].roomno;
31.   
32.       return rooms[rno - ROOMOFFSET].rtype == rmtyp;
33.   }
34.   

dosounds Edit

35.   void
36.   dosounds()
37.   {
38.       register struct mkroom *sroom;
39.       register int hallu, vx, vy;
40.   #if defined(AMIGA) && defined(AZTEC_C_WORKAROUND)
41.       int xx;
42.   #endif
43.       struct monst *mtmp;
44.   
45.       if (!flags.soundok || u.uswallow || Underwater) return;
46.   
47.       hallu = Hallucination ? 1 : 0;
48.   
49.       if (level.flags.nfountains && !rn2(400)) {
50.   	static const char * const fountain_msg[4] = {
51.   		"bubbling water.",
52.   		"water falling on coins.",
53.   		"the splashing of a naiad.",
54.   		"a soda fountain!",
55.   	};
56.   	You_hear(fountain_msg[rn2(3)+hallu]);
57.       }
58.   #ifdef SINK
59.       if (level.flags.nsinks && !rn2(300)) {
60.   	static const char * const sink_msg[3] = {
61.   		"a slow drip.",
62.   		"a gurgling noise.",
63.   		"dishes being washed!",
64.   	};
65.   	You_hear(sink_msg[rn2(2)+hallu]);
66.       }
67.   #endif
68.       if (level.flags.has_court && !rn2(200)) {
69.   	static const char * const throne_msg[4] = {
70.   		"the tones of courtly conversation.",
71.   		"a sceptre pounded in judgment.",
72.   		"Someone shouts \"Off with %s head!\"",
73.   		"Queen Beruthiel's cats!",
74.   	};
75.   	for (mtmp = fmon; mtmp; mtmp = mtmp->nmon) {
76.   	    if (DEADMONSTER(mtmp)) continue;
77.   	    if ((mtmp->msleeping ||
78.   			is_lord(mtmp->data) || is_prince(mtmp->data)) &&
79.   		!is_animal(mtmp->data) &&
80.   		mon_in_room(mtmp, COURT)) {
81.   		/* finding one is enough, at least for now */
82.   		int which = rn2(3)+hallu;
83.   
84.   		if (which != 2) You_hear(throne_msg[which]);
85.   		else		pline(throne_msg[2], uhis());
86.   		return;
87.   	    }
88.   	}
89.       }
90.       if (level.flags.has_swamp && !rn2(200)) {
91.   	static const char * const swamp_msg[3] = {
92.   		"hear mosquitoes!",
93.   		"smell marsh gas!",	/* so it's a smell...*/
94.   		"hear Donald Duck!",
95.   	};
96.   	You(swamp_msg[rn2(2)+hallu]);
97.   	return;
98.       }
99.       if (level.flags.has_vault && !rn2(200)) {
100.  	if (!(sroom = search_special(VAULT))) {
101.  	    /* strange ... */
102.  	    level.flags.has_vault = 0;
103.  	    return;
104.  	}
105.  	if(gd_sound())
106.  	    switch (rn2(2)+hallu) {
107.  		case 1: {
108.  		    boolean gold_in_vault = FALSE;
109.  
110.  		    for (vx = sroom->lx;vx <= sroom->hx; vx++)
111.  			for (vy = sroom->ly; vy <= sroom->hy; vy++)
112.  			    if (g_at(vx, vy))
113.  				gold_in_vault = TRUE;
114.  #if defined(AMIGA) && defined(AZTEC_C_WORKAROUND)
115.  		    /* Bug in aztec assembler here. Workaround below */
116.  		    xx = ROOM_INDEX(sroom) + ROOMOFFSET;
117.  		    xx = (xx != vault_occupied(u.urooms));
118.  		    if(xx)
119.  #else
120.  		    if (vault_occupied(u.urooms) !=
121.  			 (ROOM_INDEX(sroom) + ROOMOFFSET))
122.  #endif /* AZTEC_C_WORKAROUND */
123.  		    {
124.  			if (gold_in_vault)
125.  			    You_hear(!hallu ? "someone counting money." :
126.  				"the quarterback calling the play.");
127.  			else
128.  			    You_hear("someone searching.");
129.  			break;
130.  		    }
131.  		    /* fall into... (yes, even for hallucination) */
132.  		}
133.  		case 0:
134.  		    You_hear("the footsteps of a guard on patrol.");
135.  		    break;
136.  		case 2:
137.  		    You_hear("Ebenezer Scrooge!");
138.  		    break;
139.  	    }
140.  	return;
141.      }
142.      if (level.flags.has_beehive && !rn2(200)) {
143.  	for (mtmp = fmon; mtmp; mtmp = mtmp->nmon) {
144.  	    if (DEADMONSTER(mtmp)) continue;
145.  	    if ((mtmp->data->mlet == S_ANT && is_flyer(mtmp->data)) &&
146.  		mon_in_room(mtmp, BEEHIVE)) {
147.  		switch (rn2(2)+hallu) {
148.  		    case 0:
149.  			You_hear("a low buzzing.");
150.  			break;
151.  		    case 1:
152.  			You_hear("an angry drone.");
153.  			break;
154.  		    case 2:
155.  			You_hear("bees in your %sbonnet!",
156.  			    uarmh ? "" : "(nonexistent) ");
157.  			break;
158.  		}
159.  		return;
160.  	    }
161.  	}
162.      }
163.      if (level.flags.has_morgue && !rn2(200)) {
164.  	for (mtmp = fmon; mtmp; mtmp = mtmp->nmon) {
165.  	    if (DEADMONSTER(mtmp)) continue;
166.  	    if (is_undead(mtmp->data) &&
167.  		mon_in_room(mtmp, MORGUE)) {
168.  		switch (rn2(2)+hallu) {
169.  		    case 0:
170.  			You("suddenly realize it is unnaturally quiet.");
171.  			break;
172.  		    case 1:
173.  			pline_The("%s on the back of your %s stands up.",
174.  				body_part(HAIR), body_part(NECK));
175.  			break;
176.  		    case 2:
177.  			pline_The("%s on your %s seems to stand up.",
178.  				body_part(HAIR), body_part(HEAD));
179.  			break;
180.  		}
181.  		return;
182.  	    }
183.  	}
184.      }
185.      if (level.flags.has_barracks && !rn2(200)) {
186.  	static const char * const barracks_msg[4] = {
187.  		"blades being honed.",
188.  		"loud snoring.",
189.  		"dice being thrown.",
190.  		"General MacArthur!",
191.  	};
192.  	int count = 0;
193.  
194.  	for (mtmp = fmon; mtmp; mtmp = mtmp->nmon) {
195.  	    if (DEADMONSTER(mtmp)) continue;
196.  	    if (is_mercenary(mtmp->data) &&
197.  #if 0		/* don't bother excluding these */
198.  		!strstri(mtmp->data->mname, "watch") &&
199.  		!strstri(mtmp->data->mname, "guard") &&
200.  #endif
201.  		mon_in_room(mtmp, BARRACKS) &&
202.  		/* sleeping implies not-yet-disturbed (usually) */
203.  		(mtmp->msleeping || ++count > 5)) {
204.  		You_hear(barracks_msg[rn2(3)+hallu]);
205.  		return;
206.  	    }
207.  	}
208.      }
209.      if (level.flags.has_zoo && !rn2(200)) {
210.  	static const char * const zoo_msg[3] = {
211.  		"a sound reminiscent of an elephant stepping on a peanut.",
212.  		"a sound reminiscent of a seal barking.",
213.  		"Doctor Doolittle!",
214.  	};
215.  	for (mtmp = fmon; mtmp; mtmp = mtmp->nmon) {
216.  	    if (DEADMONSTER(mtmp)) continue;
217.  	    if ((mtmp->msleeping || is_animal(mtmp->data)) &&
218.  		    mon_in_room(mtmp, ZOO)) {
219.  		You_hear(zoo_msg[rn2(2)+hallu]);
220.  		return;
221.  	    }
222.  	}
223.      }
224.      if (level.flags.has_shop && !rn2(200)) {
225.  	if (!(sroom = search_special(ANY_SHOP))) {
226.  	    /* strange... */
227.  	    level.flags.has_shop = 0;
228.  	    return;
229.  	}
230.  	if (tended_shop(sroom) &&
231.  		!index(u.ushops, ROOM_INDEX(sroom) + ROOMOFFSET)) {
232.  	    static const char * const shop_msg[3] = {
233.  		    "someone cursing shoplifters.",
234.  		    "the chime of a cash register.",
235.  		    "Neiman and Marcus arguing!",
236.  	    };
237.  	    You_hear(shop_msg[rn2(2)+hallu]);
238.  	}
239.  	return;
240.      }
241.      if (Is_oracle_level(&u.uz) && !rn2(400)) {
242.  	/* make sure the Oracle is still here */
243.  	for (mtmp = fmon; mtmp; mtmp = mtmp->nmon)
244.  	    if (!DEADMONSTER(mtmp) && mtmp->data == &mons[PM_ORACLE])
245.  		break;
246.  	/* and don't produce silly effects when she's clearly visible */
247.  	if (mtmp && (hallu || !canseemon(mtmp))) {
248.  	    static const char * const ora_msg[5] = {
249.  		    "a strange wind.",		/* Jupiter at Dodona */
250.  		    "convulsive ravings.",	/* Apollo at Delphi */
251.  		    "snoring snakes.",		/* AEsculapius at Epidaurus */
252.  		    "someone say \"No more woodchucks!\"",
253.  		    "a loud ZOT!"		/* both rec.humor.oracle */
254.  	    };
255.  	    You_hear(ora_msg[rn2(3)+hallu*2]);
256.  	}
257.  	return;
258.      }
259.  }
260.  
261.  #endif /* OVL0 */

growl_sound Edit

262.  #ifdef OVLB
263.  
264.  static const char * const h_sounds[] = {
265.      "beep", "boing", "sing", "belche", "creak", "cough", "rattle",
266.      "ululate", "pop", "jingle", "sniffle", "tinkle", "eep"
267.  };
268.  
269.  const char *
270.  growl_sound(mtmp)
271.  register struct monst *mtmp;
272.  {
273.  	const char *ret;
274.  
275.  	switch (mtmp->data->msound) {
276.  	case MS_MEW:
277.  	case MS_HISS:
278.  	    ret = "hiss";
279.  	    break;
280.  	case MS_BARK:
281.  	case MS_GROWL:
282.  	    ret = "growl";
283.  	    break;
284.  	case MS_ROAR:
285.  	    ret = "roar";
286.  	    break;
287.  	case MS_BUZZ:
288.  	    ret = "buzz";
289.  	    break;
290.  	case MS_SQEEK:
291.  	    ret = "squeal";
292.  	    break;
293.  	case MS_SQAWK:
294.  	    ret = "screech";
295.  	    break;
296.  	case MS_NEIGH:
297.  	    ret = "neigh";
298.  	    break;
299.  	case MS_WAIL:
300.  	    ret = "wail";
301.  	    break;
302.  	case MS_SILENT:
303.  		ret = "commotion";
304.  		break;
305.  	default:
306.  		ret = "scream";
307.  	}
308.  	return ret;
309.  }
310.  

growl Edit

311.  /* the sounds of a seriously abused pet, including player attacking it */
312.  void
313.  growl(mtmp)
314.  register struct monst *mtmp;
315.  {
316.      register const char *growl_verb = 0;
317.  
318.      if (mtmp->msleeping || !mtmp->mcanmove || !mtmp->data->msound)
319.  	return;
320.  
321.      /* presumably nearness and soundok checks have already been made */
322.      if (Hallucination)
323.  	growl_verb = h_sounds[rn2(SIZE(h_sounds))];
324.      else
325.  	growl_verb = growl_sound(mtmp);
326.      if (growl_verb) {
327.  	pline("%s %s!", Monnam(mtmp), vtense((char *)0, growl_verb));
328.  	if(flags.run) nomul(0);
329.  	wake_nearto(mtmp->mx, mtmp->my, mtmp->data->mlevel * 18);
330.      }
331.  }
332.  

yelp Edit

333.  /* the sounds of mistreated pets */
334.  void
335.  yelp(mtmp)
336.  register struct monst *mtmp;
337.  {
338.      register const char *yelp_verb = 0;
339.  
340.      if (mtmp->msleeping || !mtmp->mcanmove || !mtmp->data->msound)
341.  	return;
342.  
343.      /* presumably nearness and soundok checks have already been made */
344.      if (Hallucination)
345.  	yelp_verb = h_sounds[rn2(SIZE(h_sounds))];
346.      else switch (mtmp->data->msound) {
347.  	case MS_MEW:
348.  	    yelp_verb = "yowl";
349.  	    break;
350.  	case MS_BARK:
351.  	case MS_GROWL:
352.  	    yelp_verb = "yelp";
353.  	    break;
354.  	case MS_ROAR:
355.  	    yelp_verb = "snarl";
356.  	    break;
357.  	case MS_SQEEK:
358.  	    yelp_verb = "squeal";
359.  	    break;
360.  	case MS_SQAWK:
361.  	    yelp_verb = "screak";
362.  	    break;
363.  	case MS_WAIL:
364.  	    yelp_verb = "wail";
365.  	    break;
366.      }
367.      if (yelp_verb) {
368.  	pline("%s %s!", Monnam(mtmp), vtense((char *)0, yelp_verb));
369.  	if(flags.run) nomul(0);
370.  	wake_nearto(mtmp->mx, mtmp->my, mtmp->data->mlevel * 12);
371.      }
372.  }
373.  

whimper Edit

374.  /* the sounds of distressed pets */
375.  void
376.  whimper(mtmp)
377.  register struct monst *mtmp;
378.  {
379.      register const char *whimper_verb = 0;
380.  
381.      if (mtmp->msleeping || !mtmp->mcanmove || !mtmp->data->msound)
382.  	return;
383.  
384.      /* presumably nearness and soundok checks have already been made */
385.      if (Hallucination)
386.  	whimper_verb = h_sounds[rn2(SIZE(h_sounds))];
387.      else switch (mtmp->data->msound) {
388.  	case MS_MEW:
389.  	case MS_GROWL:
390.  	    whimper_verb = "whimper";
391.  	    break;
392.  	case MS_BARK:
393.  	    whimper_verb = "whine";
394.  	    break;
395.  	case MS_SQEEK:
396.  	    whimper_verb = "squeal";
397.  	    break;
398.      }
399.      if (whimper_verb) {
400.  	pline("%s %s.", Monnam(mtmp), vtense((char *)0, whimper_verb));
401.  	if(flags.run) nomul(0);
402.  	wake_nearto(mtmp->mx, mtmp->my, mtmp->data->mlevel * 6);
403.      }
404.  }
405.  

beg Edit

406.  /* pet makes "I'm hungry" noises */
407.  void
408.  beg(mtmp)
409.  register struct monst *mtmp;
410.  {
411.      if (mtmp->msleeping || !mtmp->mcanmove ||
412.  	    !(carnivorous(mtmp->data) || herbivorous(mtmp->data)))
413.  	return;
414.  
415.      /* presumably nearness and soundok checks have already been made */
416.      if (!is_silent(mtmp->data) && mtmp->data->msound <= MS_ANIMAL)
417.  	(void) domonnoise(mtmp);
418.      else if (mtmp->data->msound >= MS_HUMANOID) {
419.  	if (!canspotmon(mtmp))
420.  	    map_invisible(mtmp->mx, mtmp->my);
421.  	verbalize("I'm hungry.");
422.      }
423.  }
424.  

domonnoise Edit

425.  static int
426.  domonnoise(mtmp)
427.  register struct monst *mtmp;
428.  {
429.      register const char *pline_msg = 0,	/* Monnam(mtmp) will be prepended */
430.  			*verbl_msg = 0;	/* verbalize() */
431.      struct permonst *ptr = mtmp->data;
432.      char verbuf[BUFSZ];
433.  
434.      /* presumably nearness and sleep checks have already been made */
435.      if (!flags.soundok) return(0);
436.      if (is_silent(ptr)) return(0);
437.  
438.      /* Make sure its your role's quest quardian; adjust if not */
439.      if (ptr->msound == MS_GUARDIAN && ptr != &mons[urole.guardnum]) {
440.      	int mndx = monsndx(ptr);
441.      	ptr = &mons[genus(mndx,1)];
442.      }
443.  
444.      /* be sure to do this before talking; the monster might teleport away, in
445.       * which case we want to check its pre-teleport position
446.       */
447.      if (!canspotmon(mtmp))
448.  	map_invisible(mtmp->mx, mtmp->my);
449.  
450.      switch (ptr->msound) {
451.  	case MS_ORACLE:
452.  	    return doconsult(mtmp);
453.  	case MS_PRIEST:
454.  	    priest_talk(mtmp);
455.  	    break;
456.  	case MS_LEADER:
457.  	case MS_NEMESIS:
458.  	case MS_GUARDIAN:
459.  	    quest_chat(mtmp);
460.  	    break;
461.  	case MS_SELL: /* pitch, pay, total */
462.  	    shk_chat(mtmp);
463.  	    break;
464.  	case MS_VAMPIRE:
465.  	    {
466.  	    /* vampire messages are varied by tameness, peacefulness, and time of night */
467.  		boolean isnight = night();
468.  		boolean kindred =    (Upolyd && (u.umonnum == PM_VAMPIRE ||
469.  				       u.umonnum == PM_VAMPIRE_LORD));
470.  		boolean nightchild = (Upolyd && (u.umonnum == PM_WOLF ||
471.  				       u.umonnum == PM_WINTER_WOLF ||
472.  	    			       u.umonnum == PM_WINTER_WOLF_CUB));
473.  		const char *racenoun = (flags.female && urace.individual.f) ?
474.  					urace.individual.f : (urace.individual.m) ?
475.  					urace.individual.m : urace.noun;
476.  
477.  		if (mtmp->mtame) {
478.  			if (kindred) {
479.  				Sprintf(verbuf, "Good %s to you Master%s",
480.  					isnight ? "evening" : "day",
481.  					isnight ? "!" : ".  Why do we not rest?");
482.  				verbl_msg = verbuf;
483.  		    	} else {
484.  		    	    Sprintf(verbuf,"%s%s",
485.  				nightchild ? "Child of the night, " : "",
486.  				midnight() ?
487.  					"I can stand this craving no longer!" :
488.  				isnight ?
489.  					"I beg you, help me satisfy this growing craving!" :
490.  					"I find myself growing a little weary.");
491.  				verbl_msg = verbuf;
492.  			}
493.  		} else if (mtmp->mpeaceful) {
494.  			if (kindred && isnight) {
495.  				Sprintf(verbuf, "Good feeding %s!",
496.  	    				flags.female ? "sister" : "brother");
497.  				verbl_msg = verbuf;
498.   			} else if (nightchild && isnight) {
499.  				Sprintf(verbuf,
500.  				    "How nice to hear you, child of the night!");
501.  				verbl_msg = verbuf;
502.  	    		} else
503.  		    		verbl_msg = "I only drink... potions.";
504.      	        } else {
505.  			int vampindex;
506.  	    		static const char * const vampmsg[] = {
507.  			       /* These first two (0 and 1) are specially handled below */
508.  	    			"I vant to suck your %s!",
509.  	    			"I vill come after %s without regret!",
510.  		    	       /* other famous vampire quotes can follow here if desired */
511.  	    		};
512.  			if (kindred)
513.  			    verbl_msg = "This is my hunting ground that you dare to prowl!";
514.  			else if (youmonst.data == &mons[PM_SILVER_DRAGON] ||
515.  				 youmonst.data == &mons[PM_BABY_SILVER_DRAGON]) {
516.  			    /* Silver dragons are silver in color, not made of silver */
517.  			    Sprintf(verbuf, "%s! Your silver sheen does not frighten me!",
518.  					youmonst.data == &mons[PM_SILVER_DRAGON] ?
519.  					"Fool" : "Young Fool");
520.  			    verbl_msg = verbuf; 
521.  			} else {
522.  			    vampindex = rn2(SIZE(vampmsg));
523.  			    if (vampindex == 0) {
524.  				Sprintf(verbuf, vampmsg[vampindex], body_part(BLOOD));
525.  	    			verbl_msg = verbuf;
526.  			    } else if (vampindex == 1) {
527.  				Sprintf(verbuf, vampmsg[vampindex],
528.  					Upolyd ? an(mons[u.umonnum].mname) : an(racenoun));
529.  	    			verbl_msg = verbuf;
530.  		    	    } else
531.  			    	verbl_msg = vampmsg[vampindex];
532.  			}
533.  	        }
534.  	    }
535.  	    break;
536.  	case MS_WERE:
537.  	    if (flags.moonphase == FULL_MOON && (night() ^ !rn2(13))) {
538.  		pline("%s throws back %s head and lets out a blood curdling %s!",
539.  		      Monnam(mtmp), mhis(mtmp),
540.  		      ptr == &mons[PM_HUMAN_WERERAT] ? "shriek" : "howl");
541.  		wake_nearto(mtmp->mx, mtmp->my, 11*11);
542.  	    } else
543.  		pline_msg =
544.  		     "whispers inaudibly.  All you can make out is \"moon\".";
545.  	    break;
546.  	case MS_BARK:
547.  	    if (flags.moonphase == FULL_MOON && night()) {
548.  		pline_msg = "howls.";
549.  	    } else if (mtmp->mpeaceful) {
550.  		if (mtmp->mtame &&
551.  			(mtmp->mconf || mtmp->mflee || mtmp->mtrapped ||
552.  			 moves > EDOG(mtmp)->hungrytime || mtmp->mtame < 5))
553.  		    pline_msg = "whines.";
554.  		else if (mtmp->mtame && EDOG(mtmp)->hungrytime > moves + 1000)
555.  		    pline_msg = "yips.";
556.  		else {
557.  		    if (mtmp->data != &mons[PM_DINGO])	/* dingos do not actually bark */
558.  			    pline_msg = "barks.";
559.  		}
560.  	    } else {
561.  		pline_msg = "growls.";
562.  	    }
563.  	    break;
564.  	case MS_MEW:
565.  	    if (mtmp->mtame) {
566.  		if (mtmp->mconf || mtmp->mflee || mtmp->mtrapped ||
567.  			mtmp->mtame < 5)
568.  		    pline_msg = "yowls.";
569.  		else if (moves > EDOG(mtmp)->hungrytime)
570.  		    pline_msg = "meows.";
571.  		else if (EDOG(mtmp)->hungrytime > moves + 1000)
572.  		    pline_msg = "purrs.";
573.  		else
574.  		    pline_msg = "mews.";
575.  		break;
576.  	    } /* else FALLTHRU */
577.  	case MS_GROWL:
578.  	    pline_msg = mtmp->mpeaceful ? "snarls." : "growls!";
579.  	    break;
580.  	case MS_ROAR:
581.  	    pline_msg = mtmp->mpeaceful ? "snarls." : "roars!";
582.  	    break;
583.  	case MS_SQEEK:
584.  	    pline_msg = "squeaks.";
585.  	    break;
586.  	case MS_SQAWK:
587.  	    if (ptr == &mons[PM_RAVEN] && !mtmp->mpeaceful)
588.  	    	verbl_msg = "Nevermore!";
589.  	    else
590.  	    	pline_msg = "squawks.";
591.  	    break;
592.  	case MS_HISS:
593.  	    if (!mtmp->mpeaceful)
594.  		pline_msg = "hisses!";
595.  	    else return 0;	/* no sound */
596.  	    break;
597.  	case MS_BUZZ:
598.  	    pline_msg = mtmp->mpeaceful ? "drones." : "buzzes angrily.";
599.  	    break;
600.  	case MS_GRUNT:
601.  	    pline_msg = "grunts.";
602.  	    break;
603.  	case MS_NEIGH:
604.  	    if (mtmp->mtame < 5)
605.  		pline_msg = "neighs.";
606.  	    else if (moves > EDOG(mtmp)->hungrytime)
607.  		pline_msg = "whinnies.";
608.  	    else
609.  		pline_msg = "whickers.";
610.  	    break;
611.  	case MS_WAIL:
612.  	    pline_msg = "wails mournfully.";
613.  	    break;
614.  	case MS_GURGLE:
615.  	    pline_msg = "gurgles.";
616.  	    break;
617.  	case MS_BURBLE:
618.  	    pline_msg = "burbles.";
619.  	    break;
620.  	case MS_SHRIEK:
621.  	    pline_msg = "shrieks.";
622.  	    aggravate();
623.  	    break;
624.  	case MS_IMITATE:
625.  	    pline_msg = "imitates you.";
626.  	    break;
627.  	case MS_BONES:
628.  	    pline("%s rattles noisily.", Monnam(mtmp));
629.  	    You("freeze for a moment.");
630.  	    nomul(-2);
631.  	    break;
632.  	case MS_LAUGH:
633.  	    {
634.  		static const char * const laugh_msg[4] = {
635.  		    "giggles.", "chuckles.", "snickers.", "laughs.",
636.  		};
637.  		pline_msg = laugh_msg[rn2(4)];
638.  	    }
639.  	    break;
640.  	case MS_MUMBLE:
641.  	    pline_msg = "mumbles incomprehensibly.";
642.  	    break;
643.  	case MS_DJINNI:
644.  	    if (mtmp->mtame) {
645.  		verbl_msg = "Sorry, I'm all out of wishes.";
646.  	    } else if (mtmp->mpeaceful) {
647.  		if (ptr == &mons[PM_WATER_DEMON])
648.  		    pline_msg = "gurgles.";
649.  		else
650.  		    verbl_msg = "I'm free!";
651.  	    } else verbl_msg = "This will teach you not to disturb me!";
652.  	    break;
653.  	case MS_BOAST:	/* giants */
654.  	    if (!mtmp->mpeaceful) {
655.  		switch (rn2(4)) {
656.  		case 0: pline("%s boasts about %s gem collection.",
657.  			      Monnam(mtmp), mhis(mtmp));
658.  			break;
659.  		case 1: pline_msg = "complains about a diet of mutton.";
660.  			break;
661.  	       default: pline_msg = "shouts \"Fee Fie Foe Foo!\" and guffaws.";
662.  			wake_nearto(mtmp->mx, mtmp->my, 7*7);
663.  			break;
664.  		}
665.  		break;
666.  	    }
667.  	    /* else FALLTHRU */
668.  	case MS_HUMANOID:
669.  	    if (!mtmp->mpeaceful) {
670.  		if (In_endgame(&u.uz) && is_mplayer(ptr)) {
671.  		    mplayer_talk(mtmp);
672.  		    break;
673.  		} else return 0;	/* no sound */
674.  	    }
675.  	    /* Generic peaceful humanoid behaviour. */
676.  	    if (mtmp->mflee)
677.  		pline_msg = "wants nothing to do with you.";
678.  	    else if (mtmp->mhp < mtmp->mhpmax/4)
679.  		pline_msg = "moans.";
680.  	    else if (mtmp->mconf || mtmp->mstun)
681.  		verbl_msg = !rn2(3) ? "Huh?" : rn2(2) ? "What?" : "Eh?";
682.  	    else if (!mtmp->mcansee)
683.  		verbl_msg = "I can't see!";
684.  	    else if (mtmp->mtrapped) {
685.  		struct trap *t = t_at(mtmp->mx, mtmp->my);
686.  
687.  		if (t) t->tseen = 1;
688.  		verbl_msg = "I'm trapped!";
689.  	    } else if (mtmp->mhp < mtmp->mhpmax/2)
690.  		pline_msg = "asks for a potion of healing.";
691.  	    else if (mtmp->mtame && !mtmp->isminion &&
692.  						moves > EDOG(mtmp)->hungrytime)
693.  		verbl_msg = "I'm hungry.";
694.  	    /* Specific monsters' interests */
695.  	    else if (is_elf(ptr))
696.  		pline_msg = "curses orcs.";
697.  	    else if (is_dwarf(ptr))
698.  		pline_msg = "talks about mining.";
699.  	    else if (likes_magic(ptr))
700.  		pline_msg = "talks about spellcraft.";
701.  	    else if (ptr->mlet == S_CENTAUR)
702.  		pline_msg = "discusses hunting.";
703.  	    else switch (monsndx(ptr)) {
704.  		case PM_HOBBIT:
705.  		    pline_msg = (mtmp->mhpmax - mtmp->mhp >= 10) ?
706.  				"complains about unpleasant dungeon conditions."
707.  				: "asks you about the One Ring.";
708.  		    break;
709.  		case PM_ARCHEOLOGIST:
710.      pline_msg = "describes a recent article in \"Spelunker Today\" magazine.";
711.  		    break;
712.  #ifdef TOURIST
713.  		case PM_TOURIST:
714.  		    verbl_msg = "Aloha.";
715.  		    break;
716.  #endif
717.  		default:
718.  		    pline_msg = "discusses dungeon exploration.";
719.  		    break;
720.  	    }
721.  	    break;
722.  	case MS_SEDUCE:
723.  #ifdef SEDUCE
724.  	    if (ptr->mlet != S_NYMPH &&
725.  		could_seduce(mtmp, &youmonst, (struct attack *)0) == 1) {
726.  			(void) doseduce(mtmp);
727.  			break;
728.  	    }
729.  	    switch ((poly_gender() != (int) mtmp->female) ? rn2(3) : 0)
730.  #else
731.  	    switch ((poly_gender() == 0) ? rn2(3) : 0)
732.  #endif
733.  	    {
734.  		case 2:
735.  			verbl_msg = "Hello, sailor.";
736.  			break;
737.  		case 1:
738.  			pline_msg = "comes on to you.";
739.  			break;
740.  		default:
741.  			pline_msg = "cajoles you.";
742.  	    }
743.  	    break;
744.  #ifdef KOPS
745.  	case MS_ARREST:
746.  	    if (mtmp->mpeaceful)
747.  		verbalize("Just the facts, %s.",
748.  		      flags.female ? "Ma'am" : "Sir");
749.  	    else {
750.  		static const char * const arrest_msg[3] = {
751.  		    "Anything you say can be used against you.",
752.  		    "You're under arrest!",
753.  		    "Stop in the name of the Law!",
754.  		};
755.  		verbl_msg = arrest_msg[rn2(3)];
756.  	    }
757.  	    break;
758.  #endif
759.  	case MS_BRIBE:
760.  	    if (mtmp->mpeaceful && !mtmp->mtame) {
761.  		(void) demon_talk(mtmp);
762.  		break;
763.  	    }
764.  	    /* fall through */
765.  	case MS_CUSS:
766.  	    if (!mtmp->mpeaceful)
767.  		cuss(mtmp);
768.  	    break;
769.  	case MS_SPELL:
770.  	    /* deliberately vague, since it's not actually casting any spell */
771.  	    pline_msg = "seems to mutter a cantrip.";
772.  	    break;
773.  	case MS_NURSE:
774.  	    if (uwep && (uwep->oclass == WEAPON_CLASS || is_weptool(uwep)))
775.  		verbl_msg = "Put that weapon away before you hurt someone!";
776.  	    else if (uarmc || uarm || uarmh || uarms || uarmg || uarmf)
777.  		verbl_msg = Role_if(PM_HEALER) ?
778.  			  "Doc, I can't help you unless you cooperate." :
779.  			  "Please undress so I can examine you.";
780.  #ifdef TOURIST
781.  	    else if (uarmu)
782.  		verbl_msg = "Take off your shirt, please.";
783.  #endif
784.  	    else verbl_msg = "Relax, this won't hurt a bit.";
785.  	    break;
786.  	case MS_GUARD:
787.  #ifndef GOLDOBJ
788.  	    if (u.ugold)
789.  #else
790.  	    if (money_cnt(invent))
791.  #endif
792.  		verbl_msg = "Please drop that gold and follow me.";
793.  	    else
794.  		verbl_msg = "Please follow me.";
795.  	    break;
796.  	case MS_SOLDIER:
797.  	    {
798.  		static const char * const soldier_foe_msg[3] = {
799.  		    "Resistance is useless!",
800.  		    "You're dog meat!",
801.  		    "Surrender!",
802.  		},		  * const soldier_pax_msg[3] = {
803.  		    "What lousy pay we're getting here!",
804.  		    "The food's not fit for Orcs!",
805.  		    "My feet hurt, I've been on them all day!",
806.  		};
807.  		verbl_msg = mtmp->mpeaceful ? soldier_pax_msg[rn2(3)]
808.  					    : soldier_foe_msg[rn2(3)];
809.  	    }
810.  	    break;
811.  	case MS_RIDER:
812.  	    if (ptr == &mons[PM_DEATH] && !rn2(10))
813.  		pline_msg = "is busy reading a copy of Sandman #8.";
814.  	    else verbl_msg = "Who do you think you are, War?";
815.  	    break;
816.      }
817.  
818.      if (pline_msg) pline("%s %s", Monnam(mtmp), pline_msg);
819.      else if (verbl_msg) verbalize(verbl_msg);
820.      return(1);
821.  }
822.  
823.  

dotalk Edit

824.  int
825.  dotalk()
826.  {
827.      int result;
828.      boolean save_soundok = flags.soundok;
829.      flags.soundok = 1;	/* always allow sounds while chatting */
830.      result = dochat();
831.      flags.soundok = save_soundok;
832.      return result;
833.  }
834.  

dochat Edit

835.  static int
836.  dochat()
837.  {
838.      register struct monst *mtmp;
839.      register int tx,ty;
840.      struct obj *otmp;
841.  
842.      if (is_silent(youmonst.data)) {
843.  	pline("As %s, you cannot speak.", an(youmonst.data->mname));
844.  	return(0);
845.      }
846.      if (Strangled) {
847.  	You_cant("speak.  You're choking!");
848.  	return(0);
849.      }
850.      if (u.uswallow) {
851.  	pline("They won't hear you out there.");
852.  	return(0);
853.      }
854.      if (Underwater) {
855.  	Your("speech is unintelligible underwater.");
856.  	return(0);
857.      }
858.  
859.      if (!Blind && (otmp = shop_object(u.ux, u.uy)) != (struct obj *)0) {
860.  	/* standing on something in a shop and chatting causes the shopkeeper
861.  	   to describe the price(s).  This can inhibit other chatting inside
862.  	   a shop, but that shouldn't matter much.  shop_object() returns an
863.  	   object iff inside a shop and the shopkeeper is present and willing
864.  	   (not angry) and able (not asleep) to speak and the position contains
865.  	   any objects other than just gold.
866.  	*/
867.  	price_quote(otmp);
868.  	return(1);
869.      }
870.  
871.      if (!getdir("Talk to whom? (in what direction)")) {
872.  	/* decided not to chat */
873.  	return(0);
874.      }
875.  
876.  #ifdef STEED
877.      if (u.usteed && u.dz > 0)
878.  	return (domonnoise(u.usteed));
879.  #endif
880.      if (u.dz) {
881.  	pline("They won't hear you %s there.", u.dz < 0 ? "up" : "down");
882.  	return(0);
883.      }
884.  
885.      if (u.dx == 0 && u.dy == 0) {
886.  /*
887.   * Let's not include this.  It raises all sorts of questions: can you wear
888.   * 2 helmets, 2 amulets, 3 pairs of gloves or 6 rings as a marilith,
889.   * etc...  --KAA
890.  	if (u.umonnum == PM_ETTIN) {
891.  	    You("discover that your other head makes boring conversation.");
892.  	    return(1);
893.  	}
894.  */
895.  	pline("Talking to yourself is a bad habit for a dungeoneer.");
896.  	return(0);
897.      }
898.  
899.      tx = u.ux+u.dx; ty = u.uy+u.dy;
900.      mtmp = m_at(tx, ty);
901.  
902.      if (!mtmp || mtmp->mundetected ||
903.  		mtmp->m_ap_type == M_AP_FURNITURE ||
904.  		mtmp->m_ap_type == M_AP_OBJECT)
905.  	return(0);
906.  
907.      /* sleeping monsters won't talk, except priests (who wake up) */
908.      if ((!mtmp->mcanmove || mtmp->msleeping) && !mtmp->ispriest) {
909.  	/* If it is unseen, the player can't tell the difference between
910.  	   not noticing him and just not existing, so skip the message. */
911.  	if (canspotmon(mtmp))
912.  	    pline("%s seems not to notice you.", Monnam(mtmp));
913.  	return(0);
914.      }
915.  
916.      /* if this monster is waiting for something, prod it into action */
917.      mtmp->mstrategy &= ~STRAT_WAITMASK;
918.  
919.      if (mtmp->mtame && mtmp->meating) {
920.  	if (!canspotmon(mtmp))
921.  	    map_invisible(mtmp->mx, mtmp->my);
922.  	pline("%s is eating noisily.", Monnam(mtmp));
923.  	return (0);
924.      }
925.  
926.      return domonnoise(mtmp);
927.  }
928.  
929.  #ifdef USER_SOUNDS
930.  
931.  extern void FDECL(play_usersound, (const char*, int));
932.  
933.  typedef struct audio_mapping_rec {
934.  #ifdef USER_SOUNDS_REGEX
935.  	struct re_pattern_buffer regex;
936.  #else
937.  	char *pattern;
938.  #endif
939.  	char *filename;
940.  	int volume;
941.  	struct audio_mapping_rec *next;
942.  } audio_mapping;
943.  
944.  static audio_mapping *soundmap = 0;
945.  
946.  char* sounddir = ".";
947.  

add_sound_mapping Edit

948.  /* adds a sound file mapping, returns 0 on failure, 1 on success */
949.  int
950.  add_sound_mapping(mapping)
951.  const char *mapping;
952.  {
953.  	char text[256];
954.  	char filename[256];
955.  	char filespec[256];
956.  	int volume;
957.  
958.  	if (sscanf(mapping, "MESG \"%255[^\"]\"%*[\t ]\"%255[^\"]\" %d",
959.  		   text, filename, &volume) == 3) {
960.  	    const char *err;
961.  	    audio_mapping *new_map;
962.  
963.  	    if (strlen(sounddir) + strlen(filename) > 254) {
964.  		raw_print("sound file name too long");
965.  		return 0;
966.  	    }
967.  	    Sprintf(filespec, "%s/%s", sounddir, filename);
968.  
969.  	    if (can_read_file(filespec)) {
970.  		new_map = (audio_mapping *)alloc(sizeof(audio_mapping));
971.  #ifdef USER_SOUNDS_REGEX
972.  		new_map->regex.translate = 0;
973.  		new_map->regex.fastmap = 0;
974.  		new_map->regex.buffer = 0;
975.  		new_map->regex.allocated = 0;
976.  		new_map->regex.regs_allocated = REGS_FIXED;
977.  #else
978.  		new_map->pattern = (char *)alloc(strlen(text) + 1);
979.  		Strcpy(new_map->pattern, text);
980.  #endif
981.  		new_map->filename = strdup(filespec);
982.  		new_map->volume = volume;
983.  		new_map->next = soundmap;
984.  
985.  #ifdef USER_SOUNDS_REGEX
986.  		err = re_compile_pattern(text, strlen(text), &new_map->regex);
987.  #else
988.  		err = 0;
989.  #endif
990.  		if (err) {
991.  		    raw_print(err);
992.  		    free(new_map->filename);
993.  		    free(new_map);
994.  		    return 0;
995.  		} else {
996.  		    soundmap = new_map;
997.  		}
998.  	    } else {
999.  		Sprintf(text, "cannot read %.243s", filespec);
1000. 		raw_print(text);
1001. 		return 0;
1002. 	    }
1003. 	} else {
1004. 	    raw_print("syntax error in SOUND");
1005. 	    return 0;
1006. 	}
1007. 
1008. 	return 1;
1009. }
1010. 

play_sound_for_message Edit

1011. void
1012. play_sound_for_message(msg)
1013. const char* msg;
1014. {
1015. 	audio_mapping* cursor = soundmap;
1016. 
1017. 	while (cursor) {
1018. #ifdef USER_SOUNDS_REGEX
1019. 	    if (re_search(&cursor->regex, msg, strlen(msg), 0, 9999, 0) >= 0) {
1020. #else
1021. 	    if (pmatch(cursor->pattern, msg)) {
1022. #endif
1023. 		play_usersound(cursor->filename, cursor->volume);
1024. 	    }
1025. 	    cursor = cursor->next;
1026. 	}
1027. }
1028. 
1029. #endif /* USER_SOUNDS */
1030. 
1031. #endif /* OVLB */
1032. 
1033. /*sounds.c*/

Around Wikia's network

Random Wiki