Blindfold removal fix
[slashemextended.git] / src / sounds.c
blob1522840b16420d6e411a0168df2ed8a999642114
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. */
5 #include "hack.h"
6 #include "edog.h"
7 #include "time.h"
8 #ifdef USER_SOUNDS
9 # ifdef USER_SOUNDS_REGEX
10 #include <regex.h>
11 # endif
12 #endif
14 /* Hmm.... in working on SHOUT I started thinking about things.
15 * I think something like this should be set up:
16 * You_hear_mon(mon,loud, msg) - You_hear(msg); monnoise(mon,loud);
17 * monnoise(mon,loud) - wake_nearto(mon->mx,mon->my,mon->data->mlevel*loud)
18 * and stuff like that
19 * mon_say(mon,loud,msg) - verbalize(msg); sayeffects(mon,loud,msg);
20 * sayeffects(mon,loud,msg) - monnoise(mon,loud); + the pet stuff et al
21 * In fact, I think will set this up, but as a diff, not actually modifying the
22 * files.
23 * If I knew something about branches I might do that.
24 * But anyway, I should be working on petcommands now... maybe later...
25 * -- JRN
28 #ifdef OVLB
30 static int domonnoise(struct monst *);
31 static int dochat(void);
32 static const char *yelp_sound(struct monst *);
33 static const char *whimper_sound(struct monst *);
35 #endif /* OVLB */
37 #ifdef OVL0
39 #ifdef DUMB
40 static int mon_in_room(struct monst *,int);
42 /* this easily could be a macro, but it might overtax dumb compilers */
43 static int
44 mon_in_room(mon, rmtyp)
45 struct monst *mon;
46 int rmtyp;
48 int rno = levl[mon->mx][mon->my].roomno;
50 return rooms[rno - ROOMOFFSET].rtype == rmtyp;
52 #else
53 /* JRN: converted above to macro */
54 # define mon_in_room(mon,rmtype) (rooms[ levl[(mon)->mx][(mon)->my].roomno \
55 - ROOMOFFSET].rtype == (rmtype))
56 #endif
58 static const char all_count[] = { ALLOW_COUNT, ALL_CLASSES, 0 };
59 static const char allnoncount[] = { ALL_CLASSES, 0 };
60 STATIC_OVL NEARDATA const char pawnables[] = { ALLOW_COUNT, GEM_CLASS, 0 };
62 void
63 dosounds()
65 register struct mkroom *sroom;
66 register int hallu, vx, vy;
67 #if defined(AMIGA) && defined(AZTEC_C_WORKAROUND)
68 int xx;
69 #endif
70 struct monst *mtmp;
72 if (!flags.soundok || u.uswallow || Underwater) return;
74 hallu = FunnyHallu ? 1 : 0;
76 if (level.flags.nfountains && !rn2(400)) {
77 static const char * const fountain_msg[] = {
78 "bubbling water.",
79 "water falling on coins.",
80 "the splashing of a naiad.",
81 "flowing water.",
82 "a nether voice.", /* the water demon */
83 "muffled hissing.", /* the water mocassins */
84 "a soda fountain!",
85 "a vampire complaining about the architecture!", /* they don't like running water */
86 "someone offering three wishes to a lucky person!", /* water demon being generous */
87 "the moaning noises of an adventurer caught in hot sexual pleasure with a nymph!",
88 "Indiana Jones screaming for help!", /* he's terribly afraid of snakes */
91 You_hear("%s", fountain_msg[rn2(6+hallu*5)]);
93 #ifdef SINK
94 if (level.flags.nsinks && !rn2(300)) {
95 static const char * const sink_msg[] = {
96 "a slow drip.",
97 "a gurgling noise.",
98 "a metallic plinking sound.",
99 "a toilet flush!",
100 "a dripping tap.",
101 "dripping water.",
102 "dishes being washed!",
103 "a neverending dripping sound that is driving you crazy!",
104 "someone getting in on the action with a hot foocubus!",
105 "something that gives you a sinking feeling.",
106 "something that gives you a sinking feeling, because sounds.c uses 'You_hear' instead of 'pline' and therefore all of the sink-related sounds have to be messages that start with 'You hear', annoyingly enough.",
108 You_hear("%s", sink_msg[rn2(6+hallu*5)]);
110 #endif
111 if (level.flags.has_court && !rn2(200)) {
112 static const char * const throne_msg[] = {
113 "the tones of courtly conversation.",
114 "a sceptre pounded in judgment.",
115 "Someone shouts \"Off with %s head!\"",
116 "royal trumpets.",
117 "what sounds like a royal ceremony.",
118 "Queen Beruthiel's cats!",
120 for (mtmp = fmon; mtmp; mtmp = mtmp->nmon) {
121 if (DEADMONSTER(mtmp)) continue;
122 if ((mtmp->msleeping ||
123 is_lord(mtmp->data) || is_prince(mtmp->data)) &&
124 !is_animal(mtmp->data) &&
125 mon_in_room(mtmp, COURT)) {
126 /* finding one is enough, at least for now */
127 int which = rn2(5+hallu);
129 if (which != 2) You_hear("%s", throne_msg[which]);
130 else pline(throne_msg[2], uhis());
131 return;
135 if (level.flags.has_swamp && !rn2(200)) {
136 static const char * const swamp_msg[] = {
137 "hear mosquitoes!",
138 "smell marsh gas!", /* so it's a smell...*/
139 "hear a muffled splash.",
140 "are frightened by the calm atmosphere for some reason.",
141 "hear Donald Duck!",
142 "inhale a vile stench that reminds you of what kissing a frog is probably like!",
143 "hear someone falling in the water and losing a life.",
144 "suddenly encounter the hamming fish, which can devour and instakill you!", /* Big Bill from Super Mario Bros 3 */
146 You("%s", swamp_msg[rn2(4+hallu*4)]);
147 return;
149 if (level.flags.spooky && !rn2(200)) {
150 static const char *spooky_msg[] = {
151 "hear screaming in the distance!",
152 "hear a faint whisper: \"Please leave your measurements for your custom-made coffin.\"",
153 "hear a door creak ominously.",
154 "hear hard breathing just a few steps behind you!",
155 "hear dragging footsteps coming closer!",
156 "hear anguished moaning and groaning coming out of the walls!",
157 "hear mad giggling directly behind you!",
158 "smell rotting corpses.",
159 "smell chloroform!",
160 "feel ice cold fingers stroking your neck.",
161 "feel a ghostly touch caressing your face.",
162 "feel somebody dancing on your grave.",
163 "feel something breathing down your neck.",
164 "feel as if the walls were closing in on you.",
165 "just stepped on something squishy.",
166 "hear a strong voice pronouncing: \"There can only be one!\"",
167 "hear a voice booming all around you: \"Warning: self-destruction sequence activated!\"",
168 "smell your mother-in-law's cooking!",
169 "smell horse dung.",
170 "hear someone shouting: \"Who ordered the burger?\"",
171 "can faintly hear the Twilight Zone theme.",
172 "hear an outraged customer complaining: \"I'll be back!\"",
173 "hear someone praising your valor!",
174 "hear someone singing: \"Jingle bells, jingle bells...\"",
176 You("%s", spooky_msg[rn2(15+hallu*9)]);
177 return;
179 if (level.flags.has_vault && !rn2(200)) {
180 if (!(sroom = search_special(VAULT))) {
181 /* strange ... */
182 level.flags.has_vault = 0;
183 return;
185 if(gd_sound())
186 switch (rn2(2+hallu)) {
187 case 1: {
188 boolean gold_in_vault = FALSE;
190 for (vx = sroom->lx;vx <= sroom->hx; vx++)
191 for (vy = sroom->ly; vy <= sroom->hy; vy++)
192 if (g_at(vx, vy))
193 gold_in_vault = TRUE;
194 #if defined(AMIGA) && defined(AZTEC_C_WORKAROUND)
195 /* Bug in aztec assembler here. Workaround below */
196 xx = ROOM_INDEX(sroom) + ROOMOFFSET;
197 xx = (xx != vault_occupied(u.urooms));
198 if(xx)
199 #else
200 if (vault_occupied(u.urooms) !=
201 (ROOM_INDEX(sroom) + ROOMOFFSET))
202 #endif /* AZTEC_C_WORKAROUND */
204 if (gold_in_vault && !level.flags.vault_is_aquarium && !level.flags.vault_is_cursed)
205 You_hear(!hallu ? "someone counting money." :
206 "the quarterback calling the play.");
207 else if (gold_in_vault && level.flags.vault_is_aquarium)
208 You_hear(!hallu ? "soft splashing." :
209 "a swimmer divebomb into the water.");
210 else if (gold_in_vault && level.flags.vault_is_cursed)
211 You_hear(!hallu ? "gutteral voices chanting." :
212 "drums beating ominously!");
213 else
214 You_hear(level.flags.vault_is_aquarium ? "frenzied splashing." : level.flags.vault_is_cursed ? "someone scream: 'No! Stop! The Knife! Aaaaaahhhh!'" : "someone searching.");
215 break;
217 /* fall into... (yes, even for hallucination) */
219 case 0:
220 You_hear(level.flags.vault_is_aquarium ? "gently lapping water." : level.flags.vault_is_cursed ? "somebody screaming for help!" : "the footsteps of a guard on patrol.");
221 break;
222 case 2:
223 You_hear(level.flags.vault_is_aquarium ? "the bubbling of an oxygen filter." : level.flags.vault_is_cursed ? "somebody whisper: 'You've been detected by a security camera! Har har har!'" : "Ebenezer Scrooge!");
224 break;
226 return;
228 if (level.flags.has_beehive && !rn2(200)) {
229 for (mtmp = fmon; mtmp; mtmp = mtmp->nmon) {
230 if (DEADMONSTER(mtmp)) continue;
231 if ((mtmp->data->mlet == S_ANT && is_flyer(mtmp->data)) &&
232 mon_in_room(mtmp, BEEHIVE)) {
233 switch (rn2(3+hallu*3)) {
234 case 0:
235 You_hear("a low buzzing.");
236 break;
237 case 1:
238 You_hear("an angry drone.");
239 break;
240 case 2:
241 You_hear("a repeating monotonous melody."); /* rambi rumble melody before you meet King Zing */
242 break;
243 case 3:
244 You_hear("bees in your %sbonnet!",
245 uarmh ? "" : "(nonexistent) ");
246 break;
247 case 4:
248 pline("You suddenly see King Zing chasing after you! RUN, Rambi, RUN!!!");
249 break;
250 case 5:
251 You("smell stale honey.");
252 break;
254 return;
258 if (level.flags.has_morgue && !rn2(200)) {
259 for (mtmp = fmon; mtmp; mtmp = mtmp->nmon) {
260 if (DEADMONSTER(mtmp)) continue;
261 if (is_undead(mtmp->data) &&
262 mon_in_room(mtmp, MORGUE)) {
263 switch (rn2(4+hallu*2)) {
264 case 0:
265 You("suddenly realize it is unnaturally quiet.");
266 break;
267 case 1:
268 pline_The("%s on the back of your %s stands up.",
269 body_part(HAIR), body_part(NECK));
270 break;
271 case 2:
272 if (midnight()) pline("Suddenly you have a severe shivering fit!");
273 else pline("This place seems haunted.");
274 break;
275 case 3:
276 pline("There is an eerie feeling about this place.");
277 break;
278 case 4:
279 pline_The("%s on your %s seems to stand up.",
280 body_part(HAIR), body_part(HEAD));
281 break;
282 case 5:
283 pline("An enormous ghost suddenly appears before you!");
284 break;
286 return;
290 if (level.flags.has_barracks && !rn2(200)) {
291 static const char * const barracks_msg[5] = {
292 "blades being honed.",
293 "loud snoring.",
294 "dice being thrown.",
295 "General MacArthur!",
296 "the senior drill instructor shouting at you for being a lazy fatass!",
298 int count = 0;
300 for (mtmp = fmon; mtmp; mtmp = mtmp->nmon) {
301 if (DEADMONSTER(mtmp)) continue;
302 if (is_mercenary(mtmp->data) &&
303 #if 0 /* don't bother excluding these */
304 !strstri(mtmp->data->mname, "watch") &&
305 !strstri(mtmp->data->mname, "guard") &&
306 #endif
307 mon_in_room(mtmp, BARRACKS) &&
308 /* sleeping implies not-yet-disturbed (usually) */
309 (mtmp->msleeping || ++count > 5)) {
310 You_hear("%s", barracks_msg[rn2(3+hallu*2)]);
311 return;
315 if (level.flags.has_clinic && !rn2(200)) {
316 static const char *hospital_msg[] = {
317 "hear something about streptococus.",
318 "smell chloroform nearby.",
319 "hear someone cursing viruses.",
320 "listen to patients screaming while the doctor is conducting the sectio.",
321 "seem to hear Doctor Frankenstein.",
322 "hear someone scream 'NOOOOOO! Get away from my teeth! Dentists are TERRIBLE people!!!'",
323 "suddenly have a flashback to your last OP!",
325 You("%s", hospital_msg[rn2(4+hallu*3)]);
326 return;
328 if (level.flags.has_nymphhall && !rn2(200)) {
329 static const char *nymphhall_msg[] = {
330 "hear leaves rustling.",
331 "hear a female voice singing a song.",
332 "catch a glimpse of sunlight.",
333 "hear crickets chirping loudly!",
334 "hear birds singing!",
335 "hear grass growing!",
336 "hear wind in the willows!",
337 "seem mesmerized.",
338 "feel like giving all your possessions to a beautiful woman.",
339 "want to pull down your pants.",
341 You("%s", nymphhall_msg[rn2(5+hallu*5)]);
342 return;
344 if (level.flags.has_lemurepit && !rn2(2000)) { /* from unnethack, deliberately made rare */
345 static const char *lemurepit_msg[] = {
346 "the crack of a barbed whip!",
347 "the screams of tortured souls!",
348 "a wail of eternal anguish!",
349 "diabolical laughter!",
350 "cries of repentance!",
351 "futile pleas for mercy!",
352 "screams of lust!",
353 "the crack of your mistress's whip!",
354 "a weeping willow!",
355 "wonderful scratching noises!",
356 "erotic rubbing noises!",
357 "cheerful squeaking noises!",
358 "sexy licking noises!",
360 You_hear("%s", lemurepit_msg[rn2(6+hallu*7)]);
361 return;
363 if (level.flags.has_spiderhall && !rn2(200)) {
364 static const char *spiderhall_msg[] = {
365 "hear mandibles clicking.",
366 "notice webs everywhere.",
367 "notice little openings in the floor.",
368 "trip over a broken spider egg.",
369 "see a giant tarantula squittering around!",
370 "have to fight Arich, the old cheater, while listening to a dramatic music that is unfortunately too quiet.",
371 "must get past Barbos' Barrier!",
373 You("%s", spiderhall_msg[rn2(3+hallu*4)]);
374 return;
376 if (level.flags.has_trollhall && !rn2(200)) {
377 static const char *trollhall_msg[] = {
378 "hear a grunting noise.",
379 "notice a horrible smell.",
380 "hear loud footsteps going up and down the halls.",
381 "trip over a stinking pile of shit!",
382 "suddenly see a huge monster appearing right in front of you!",
383 "hear some usenetter spouting radical bullshit!",
384 "can't seem to find the plonking switch!",
386 You("%s", trollhall_msg[rn2(3+hallu*4)]);
387 return;
389 if (level.flags.has_humanhall && !rn2(200)) {
390 static const char *humanhall_msg[] = {
391 "listen to a conversation.",
392 "hear people talking.",
393 "hear someone drawing a weapon.",
394 "chime in on some people celebrating a party.",
395 "overhear plans for a raid.",
396 "sense that you are not alone...",
397 "hear a glass of wine breaking!",
398 "listen to a radio broadcast: For the next five days, the dungeon's estimated temperature high is 96 degrees. Now, is that in Fahrenheit or Kelvin?",
399 "know that there's a celebration being held for YOU! Where do you get this party started?",
401 You("%s", humanhall_msg[rn2(5+hallu*4)]);
402 return;
404 if (level.flags.has_golemhall && !rn2(200)) {
405 static const char *golemhall_msg[] = {
406 "hear rattling noises.",
407 "think you saw an object move on its own.", /* golems = animate objects */
408 "feel that something weird may be just around the corner.",
409 "hear a mechanical noise.",
410 "hear the deafening noise of a metal object breaking apart!",
411 "see a warmech appearing before you! If this were a Pokemon game, it would say: A wild WARMECH appeared!",
412 "will certainly never catch a Regigigas, because your pokeball isn't good enough!",
413 "listen to the Diablo sorceror casting a summoning spell!", /* one of the spells is called "golem" */
415 You("%s", golemhall_msg[rn2(4+hallu*4)]);
416 return;
419 if (level.flags.has_cryptroom && !rn2(200)) {
420 static const char *cryptroom_msg[] = {
421 "smell rotting flesh.",
422 "hear shuffling noises.", /* grunthack zombie inspired */
423 "hear a loud moan.",
424 "inhale the stench of charnel and the things that should be dead, but aren't.",
425 "feel that you're near death!",
426 "don't have much longer to live...",
427 "listen to a tune that gets ever more dissonant...", /* crypt music from Robin Hood, Prince of Thieves */
428 "hear your ancestors laughing at you!",
430 You("%s", cryptroom_msg[rn2(4+hallu*4)]);
431 return;
434 if (level.flags.has_troublezone && !rn2(200)) {
435 static const char *troublezone_msg[] = {
436 "smell trouble.",
437 "feel that something's gonna happen.",
438 "sense several evil presences.",
439 "sense high tension.",
440 "notice an electrical feeling in the air.",
441 "are afraid of something.",
442 "hear the voices of vaguely humanoid beings.",
443 "feel vexed.",
444 "have to count to three, and if you fail, you can forget about your game!", /* this and the next few are from the obscure Trouble Zone game for the Nintendo Gameboy */
445 "are way in over your head!",
446 "must sort the blocks according to the numbers, and pronto!",
447 "fall asleep while the line very slowly dissolves.",
448 "listen to the military music broadcast from Radio Enclave.", /* Fallout 3 */
449 "are being fully gouged by the type!",
450 "collected too many speed increasing pickups and your speed wrapped over so you're super slow now!",
451 "realize that the game has resetted itself, so you'll have to start over at dungeon level 1.",
453 You("%s", troublezone_msg[rn2(8+hallu*8)]);
454 return;
457 if (level.flags.has_weaponchamber && !rn2(200)) {
458 static const char *weaponchamber_msg[] = {
459 "hear metallic clashes.",
460 "are listening to someone practicing their sword skill.",
461 "hear a trumpet, followed by attack orders.",
462 "hear a knight discussing strategy with his subordinates.",
463 "feel that the enemies' main base camp is on this floor.",
464 "are ambushed by shadowy figures with gleaming swords!",
465 "should impale yourself on your weapon while you still can...",
466 "absolutely want a polearm, because you love polearms.",
467 "want to look for a replacement lance because your last one broke when you jousted a monster.",
468 "listen to an asian woman announcing that she'll hunt down and kill you!", /* a reference that no one will get because it's about a certain scene in one of Amy's fanfics */
470 You("%s", weaponchamber_msg[rn2(5+hallu*5)]);
471 return;
474 if (level.flags.has_hellpit && !rn2(200)) {
475 static const char *hellpit_msg[] = {
476 "smell brimstone.",
477 "hear the bubbling of lava.",
478 "smell sulfur.",
479 "chime in on a pack of demons performing a satanic ritual.",
480 "sense the presence of hellish beings.",
481 "see that the ceiling has turned red-hot!", /* Oblivion gate, but you're presumably in a dungeon and not the outskirts, so instead of the sky changing colors, the ceiling does so */
482 "feel that Mehrunes Dagon will open the Great Gate of Oblivion soon!",
483 "realize that the hellspawn invasion has already begun...",
484 "sense the presence of a gate to Oblivion.",
485 "suddenly encounter the giant siege caterpillar and have 10 minutes to destroy it or everything is lost.",
486 "need to protect Annoying Head Martin from the 200 storm atronachs and dremora valkynaz.",
488 You("%s", hellpit_msg[rn2(6+hallu*5)]);
489 return;
492 if (level.flags.has_robbercave && !rn2(200)) {
493 static const char *robbercave_msg[] = {
494 "feel that this floor is home to the robbers.", /* these are all based on Amy's FO3 fanfic */
495 "know that you must watch your purse.",
496 "get the feeling that somebody is after your valuables.",
497 "hear someone screaming that their money got stolen!",
498 "listen to people drinking beer.",
499 "hear a male voice announce: 'Hundred one hundred!'", /* robbers playing cards */
500 "want to watch when the robbers assault the motherfuckers' ship, because it will be like a second Pearl Harbor!",
501 "know that the bitches are not the rulers of the world, even if they want to view themselves as such just because they have money.",
502 "fully endorse racketeering, as long as the super-smart women are the target.", /* and also the quick learners */
503 "feel like being sucked into one of Amy's terrible fanfics!",
505 You("%s", robbercave_msg[rn2(5+hallu*5)]);
506 return;
509 if (level.flags.has_casinoroom && !rn2(200)) {
510 static const char *casinoroom_msg[] = {
511 "hear the clinging of jetons.",
512 "hear someone announce 'Place your bets please!'",
513 "see a passerby holding a casino chip.",
514 "can hear a roulette wheel spinning.",
515 "are feeling like gambling away a couple thousand zorkmids.",
516 "are looking for the entrance to Caligula's Casino.",
517 "hear someone complaining about the Forelli and Sindacco competitors.",
518 "feel like playing some cards.",
519 "hear someone using the video poker machine.",
520 "hear someone announce 'FISHING! FISHING! WIN! WIN!'",
521 "see someone passing by who definitely has to be a high roller!",
522 "suddenly realize that there are ever more security full refuges coming, and they'll whittle down your health if you don't manage to escape!",
523 "feel that the right way to address Don Salvatore is by saying 'Greetings, Mr. Don', even though Don is actually Italian for Mister.", /* GTA San Andreas mafia boss */
524 "know that one of the two chips is a fake without even looking at them.",
525 "hear a cat singing 'Vrei sa pleci dar, numa numa yay. Numa numa yay, numa numa numa yay!", /* "Dragostea Din Tei", which is quoted by cats in Elona */
526 "hear a cat singing 'Mai-Ya-Hi, Mai-Ya-Hu, Mai-Ya-Ho, Mai-Ya-Ho-Ho!'",
527 "have to chase the assassins, who are travelling as a string quartet, and their airplane is too damn fast!", /* "Free Fall" mission in GTA San Andreas */
528 "wonder why the beanpole englishman is constantly wanking off. Like who is that monkey?", /* Maccer, obviously */
530 You("%s", casinoroom_msg[rn2(9+hallu*9)]);
531 return;
534 if (level.flags.has_sanitationcentral && !rn2(200)) {
535 static const char *sanitationcentral_msg[] = {
536 "hear heavy breathing.",
537 "feel that there's something that wants to drain you of your sanity.",
538 "seem more focused on your mental health than usual.",
539 "have to wonder whether you're seeing things.",
540 "sense an eldritch abomination lurking somewhere on this floor.",
541 "start perceiving the world as the terrible place it really is, and go mad from the revelation!",
542 "suddenly have over 9000 sanity! Oh no! Now every sanity increase will paralyze you!",
543 "have to ask Amy what in-game sanity does, because you have no idea!",
544 "feel more sane than before, which is a BAD thing!",
545 "hear a horrible call that rings in your head, which periodically increases your sanity!",
547 You("%s", sanitationcentral_msg[rn2(5+hallu*5)]);
548 return;
551 if (level.flags.has_feminismroom && !rn2(200)) {
552 static const char *feminismroom_msg[] = {
553 "hear a female voice shouting angrily.",
554 "listen to a long, squeaking sound.", /* farting noise */
555 "can hear the clacking noises of high heels walking on a hard floor.",
556 "hear woman noises.",
557 "overhear women discussing makeup and perfume.",
558 "hear the voice of a model asking whether her dress is looking good enough.",
559 "hear strange rumbling noises.", /* farting noise */
560 "think you just heard very faint air current noises.", /* farting noise */
561 "fear that some stupid woman is gonna slap you silly!",
562 "can't resist thinking of a pair of brown leather boots with black block heels, and start wanking off to the thought.",
563 "hear very beautiful farting noises!",
564 "hear your wife complaining that you're still not home yet!",
565 "suddenly hear a commercial announcement: 'Buy a 5 liter bottle of the newest drum stint reluctance perfume for only 10 euros now!'",
566 "hear a sales pitcher praising a new branded costume.",
567 "hear a seemingly neverending, disgusting sound.", /* crapping noise */
568 "listen to very tender female noises.",
569 "hear a librarian yelling at someone to be SILENT!",
571 You("%s", feminismroom_msg[rn2(8+hallu*9)]);
572 return;
575 if (level.flags.has_playercentral && !rn2(200)) {
576 static const char *playercentral_msg[] = {
577 "overhear some hectic talk.",
578 "catch earshot of your fellow adventurers.",
579 "feel that they're coming for you.",
580 "don't think you're alone here...",
581 "are highly alert for some reason.",
582 "are afraid that everyone on this dungeon level is infected with covid-19!",
583 "just know that there's someone around who should be quarantined, but isn't!",
584 "hear someone sneezing constantly! Why isn't that corona-infected fucker staying at home?!",
585 "overhear a loudspeaker announcement: 'Protect yourself and others! Keep your distance to other people and wear your face mask at all times. Help us stop the spread of coronavirus and stay healthy.'",
586 "think you just saw a bunch of cops passing you by! Good thing they didn't realize that you weren't wearing your mask properly!",
588 You("%s", playercentral_msg[rn2(5+hallu*5)]);
589 return;
592 if (level.flags.has_meadowroom && !rn2(200)) {
593 static const char *meadowroom_msg[] = {
594 "feel a slight breeze.",
595 "hear crickets chirping.",
596 "can hear the cattle bellowing.",
597 "hear the cooing of the nightingale.",
598 "hear the 'baaaaa' sound of a sheep.",
599 "hear someone sing 'Old Mac Donald had a farm...'",
600 "can't help it but feel that something that looks normal is terribly amiss.",
601 "listen to the palomita, which is Spanish for parrot.", /* or at least the Amy always thought that's what it meant */
602 "wonder what's the color of the giant red ant.",
603 "feel that the one grass tile is greener than the rest for some reason.",
605 You("%s", meadowroom_msg[rn2(5+hallu*5)]);
606 return;
609 if (level.flags.has_coolingchamber && !rn2(200)) {
610 static const char *coolingchamber_msg[] = {
611 "are chilled by cold air.",
612 "shiver for a moment.",
613 "feel that someone forgot to close the door to the freezer.",
614 "feel that this is a cold place.",
615 "regret not bringing along your winter clothes for this cold atmosphere.",
616 "fear that you're gonna develop a lung inflammation.",
617 "hear someone calling you to the iceblock shooting.", /* reference to GNTM, where the models had to do a photo shooting in an ice chamber once */
618 "can smell the mildew on the walls.",
619 "listen to the type of ice block laughing all the time. Harharharharharharhar!",
620 "know that if you're walking on ice all the time, you'll unlearn the ability to walk on a non-slippery floor.",
621 "hear an ice cream van!",
623 You("%s", coolingchamber_msg[rn2(5+hallu*6)]);
624 return;
627 if (level.flags.has_voidroom && !rn2(200)) {
628 static const char *voidroom_msg[] = {
629 "are struck by a sense of emptiness.",
630 "sense a black hole in the fabric of reality.",
631 "feel that a special challenge awaits you.", /* ToME */
632 "feel the presence of spirits from the netherworld.",
633 "hear a sucking sound.",
634 "hear audible silence.",
635 "notice that this area is disturbingly quiet.",
636 "hear the absence of nosie.", /* sic by AntiGulp, and deemed too funny to fix */
637 "hear Galadriel whispering 'It is very likely that you die on your journey, but you must go anyway...'",
638 "realize that the atmosphere does not contain oxygen! If you stay around you'll suffocate!",
639 "hear Melkor laughing at your puny attempts to reach him.",
640 "have failed to defeat Maeglin, and he reached the stairs! Everything is lost now. Gondolin will go down in a rain of fire and smoke, and all the humans are killed by blarogs and ringwraiths.",
641 "feel a ghostly touch on your nosie and inhale the scent of a rosie!",
642 "hear the sounds of the gene splicing machine!", /* Elona */
643 "listen to someone complaining about a splintered nail.", /* Harry Potter disappearing (or whatever it's called, it's actually magical teleportation) mishap */
644 "neither hear nor see the words, yet somehow they're still there.",
646 You("%s", voidroom_msg[rn2(8+hallu*8)]);
647 return;
650 if (level.flags.has_armory && !rn2(5000)) { /* from dnethack, intentionally VERY rare --Amy */
651 static const char *library_msg[] = {
652 "hear water dripping onto metal.",
653 "hear a loud crunching sound.",
654 "hear a ceiling tile fall.",
655 "the scraping of metal on metal.",
656 "chains clinking.",
657 "smell a lot of rust.",
658 "hear a gun clank.",
659 "hear iron oxidize.",
660 "hear a military contractor making out like a bandit.",
661 "fear that your +7 artifact weapon might get eaten!",
662 "hear the sound of a toilet latch.",
663 "wonder why the hell this set of messages is called 'library_msg' in the game's source.",
664 "feel that parts of the floor have been washed away.",
665 "the nearby ACME building!",
667 You("%s", library_msg[rn2(7)+hallu*7]);
668 return;
671 if (level.flags.has_hamletroom && !rn2(200)) {
672 static const char *hamletroom_msg[] = {
673 "have a sense of familiarity.",
674 "feel relaxed.",
675 "hear a storeclerk making a transaction.", /* but there's not actually a shopkeeper around */
676 "hear the cackle of poultry.",
677 "listen to the joyful cries of playing children.",
678 "feel like returning to your burned home... wait, is there really a reason for doing so?", /* the hallu sounds in particular are inspired by the storyline of Castle of the Winds */
679 "hope that you don't have to master the fleeing mine...",
680 "gaze once more at the ruins of what used to be your father's farm.",
681 "suddenly feel a sharp smoky smell fill your nostrils.",
682 "hear the heavy flapping sound of a vulture's wings.",
684 You("%s", hamletroom_msg[rn2(5+hallu*5)]);
685 return;
688 if (level.flags.has_kopstation && !rn2(200)) {
689 static const char *kopstation_msg[] = {
690 "hear a loud siren.",
691 "can hear a police officer requesting reinforcement.",
692 "hear the whipping sound of a rubber hose.", /* default keystone kop weapon */
693 "overhear the police radio and find out to your shock that you're wanted.",
694 "hear an officer giving commands hectically.",
695 "realize that your cop wanted level is 6, and the forces of law are coming to bust you!",
696 "are chased by a speeding police car!",
697 "feel that the safest place in existence is right in the middle of the enemies' base camp.", /* a joke from one of Amy's fanfics where the robbers were discussing where to hide and one of them sarcastically suggested hiding in the cop station */
698 "hear the sound of a fucking army helicopter!", /* in GTA games, the army comes for you if your cop wanted level is maxed */
700 if (rn2(5)) You("%s", kopstation_msg[rn2(5+hallu*4)]);
701 else verbalize("Alert! All units, apprehend %s immediately!", playeraliasname);
702 return;
705 if (level.flags.has_bossroom && !rn2(200)) {
706 static const char *bossroom_msg[] = {
707 "feel that you're in a hopeless situation.", /* this and most of the others are inspired by Pokemon */
708 "are left hanging in suspense.",
709 "feel that the future is dark, and it gets even darker.",
710 "realize that the challenge of your life awaits you.",
711 "get the feeling that a true champion is going to challenge you soon.",
712 "just know that you'll be having a legendary battle.",
713 "will not be able to defeat Whitney's Miltank, because the fleecy Whitney will mop the floor with you wimp!",
714 "are not going to get past Pryce, since his ice pokemon can crash the game at will.",
715 "have to fight Lance and his Dragonite, but with your uselessly weak pokemon you don't stand a chance.",
716 "loser will never beat Gary, whose Meganium always uses 'Contro' and defeats each of your pokemon in one hit, hahaha!",
717 "are challenged by Clair, the dragon pokemon trainer, whose name in the German version is 'Schwaermelbueschelsandra' and who will kick your butt with her unbeatable Kingdra!",
718 "encounter a wild Suicune, which is even a *legendary* pokemon and since you don't have a master ball, catching it comes all down to luck!",
720 You("%s", bossroom_msg[rn2(6+hallu*6)]);
721 return;
724 if (level.flags.has_rngcenter && !rn2(200)) {
725 static const char *rngcenter_msg[] = {
726 "sense the shuffling of random numbers.",
727 "hear the dungeon master testing a set of dice.",
728 "feel that this particular floor is especially random.",
729 "have an unknown feeling.",
730 "just know that the monsters on this level have the most evil and unbalanced attacks possible.",
731 "test your d20 several times, only to realize in shock that it always rolls 1!",
732 "are invited to a game of Dungeons & Dragons by the game master!",
733 "listen to some gamers rolling dice.",
735 You("%s", rngcenter_msg[rn2(4+hallu*4)]);
736 return;
739 if (level.flags.has_wizardsdorm && !rn2(200)) {
740 static const char *wizardsdorm_msg[] = {
741 "hear a grating, annoying snore.", /* the sleeping wizard */
742 "smell dragonbreath in the air.",
743 "hear a 'Klieau!' sound.", /* sound that the manticore's tailspike attack supposedly makes */
744 "feel the presence of arcane energies.",
745 "listen to a spellcasting chant.",
746 "are hit by the 1st tailspike! You are hit by the 2nd tailspike! Warning: HP low! You are hit by the 3rd tailspike! You die. Do you want your possessions identified? DYWYPI? [ynq] (n) _",
747 "want to do wizard farming like in the old days, since it's more profitable than pudding farming.", /* in Castle of the Winds, that was actually one of the easiest ways to get lots of items */
748 "listen to someone ushering his pets to attack you!", /* the wizard ordering his manticores to kill you */
749 "suddenly see nightmare figures invading your village and murdering the townsfolk! You gotta stop them!",
750 "forgot to renew your detect monsters spell and the manticore shoots you with tailspikes from outside your line of sight.",
752 You("%s", wizardsdorm_msg[rn2(5+hallu*5)]);
753 return;
756 if (level.flags.has_doomedbarracks && !rn2(200)) {
757 static const char *doomedbarracks_msg[] = {
758 "hear a sound reminiscent of a frog.", /* Doom 2, if there's monsters nearby you can often hear an ultra-annoying "Krr-kro-krrg!" sound that used to drive me fucking nuts */
759 "feel that the gate to Hell has to be closed from the other side.",
760 "realize that the aliens have built a base here.",
761 "hear someone announce 'Wonnen.'", /* yeah I know it's supposed to be 'warning'... sue me :P --Amy */
762 "hear the teleportation sound.",
763 "hear an elevator sound.",
764 "hear a deep voice chanting the name 'Jason'...", /* from a Doom 2 wad */
765 "hear someone shout 'Neau!'", /* from a different Doom 2 wad */
766 "are no longer invulnerable even though you used the IDDQD code!",
767 "fell into a poisonous pit and the IDCLIP cheat doesn't seem to work! Now you'll die very slowly and painfully, you poor bastard.",
768 "encounter a little child that makes an 'Aloe!' sound! He looks deceptively similar to Commander Keen...",
769 "must run past the cyberdemon to fish the red key map out of the river while dodging the rockets. Good luck, you'll need it.", /* yet another Doom 2 wad */
771 You("%s", doomedbarracks_msg[rn2(6+hallu*6)]);
772 return;
775 if (level.flags.has_sleepingroom && !rn2(200)) {
776 static const char *sleepingroom_msg[] = {
777 "felt like you heard a faint noise, but can't make out what it is.", /* the moan of a sleeping monster */
778 "hear a loud yawn.",
779 "get the impression that the current atmosphere is quiet... too quiet.",
780 "feel that it's time to take revenge.", /* inspired by Castle of the Winds, and also some of the others */
781 "know that some fell creatures are encamped in this dungeon level.",
782 "wonder where the denizens of the dungeon came from.",
783 "listen to a soothing melody and a chant that sounds like 'Sleep-bundle-wing!'", /* Elona sleeping music */
784 "suddenly fall asleep. (Hopefully no monster decides to feast on your exposed flesh before you wake up.)",
785 "decide to stop at nothing until the threat is removed.",
786 "overhear the patrol's orders. To your shock, they're talking about plans to KILL you!",
787 "wonder where the clothes and shield hanging over the blacksmith's forge have gone.",
788 "suddenly realize that when your hometown was destroyed, the evil overlord did so because he specifically wanted to kill YOU!",
790 You("%s", sleepingroom_msg[rn2(6+hallu*6)]);
791 return;
794 if (level.flags.has_diverparadise && !rn2(200)) {
795 static const char *diverparadise_msg[] = {
796 "inhale the scent of seawater.",
797 "listen to fishes splashing water around.",
798 "listen to the sound of gentle waves.",
799 "hear children having fun on the water slide.",
800 "hear the rushing noise of water.",
801 "hear a 'splash splash' noise!",
802 "hear someone announce 'The entrance to Diver's Paradise is free today! Come on over and enjoy the most beautiful terrain in this dungeon - water!'",
803 "suddenly see a swimmer in bathing shorts run past you, and my god, does he have an absolutely UGLY tattoo on his leg!",
804 "wonder why fat people are always wearing tight bathing shorts. Having to see that makes you really uncomfortable...",
805 "encounter a guy who wears almost no clothes, and as he approaches you, he suddenly pulls down his pants and starts wanking off... ewwwwwwww...",
807 You("%s", diverparadise_msg[rn2(5+hallu*5)]);
808 return;
811 if (level.flags.has_menagerie && !rn2(200)) {
812 static const char *menagerie_msg[] = {
813 "can hear animal sounds.",
814 "hear the sound of a caged animal knocking at the lattice.",
815 "hear the roar of hungry zoo animals.",
816 "hear an animalistic moan.",
817 "hear a hissing sound, and it's right behind you!",
818 "look behind you and see a three-headed monkey!",
819 "hear an announcement: 'WARNING: The tiger's cage has been broken! There might be a tiger on the loose!'",
820 "feel like getting a pet spidermonkey or gorilla.",
822 You("%s", menagerie_msg[rn2(4+hallu*4)]);
823 return;
826 if (level.flags.has_emptydesert && !rn2(200)) {
827 static const char *emptydesert_msg[] = {
828 "feel that the air is hot around here.",
829 "feel a lack of humidity.",
830 "hear the roaring of a tornado.",
831 "hear the flapping noises of a condor's wings.",
832 "seem to sink into the floor!",
833 "encounter a sweet asian girl, but as you move to greet her, she suddenly thrusts you into quicksand! You die. Do you want your possessions identified? DYWYPI? [ynq] (n) _",
834 "hear the top of the pyramid crackling and breaking off!", /* Super Mario 64 */
835 "must stand tall on all four columns without falling into the shifting sand!",
837 You("%s", emptydesert_msg[rn2(4+hallu*4)]);
838 return;
841 if (level.flags.has_rarityroom && !rn2(200)) {
842 static const char *rarityroom_msg[] = {
843 "hear uncommon noises.", /* the monsters in the room are rare, so the noises they make aren't heard often */
844 "can feel the earth shaking.", /* monster stomping the ground */
845 "sense a supernatural presence.",
846 "feel a conventional weirdness.", /* the monsters are actually rather mundane, but rare, so that's why it's weird that there are so many of them */
847 "know that you'll see something not meant for mortal eyes.",
848 "hear Pale Night tempting you to remove her veil and look at what's underneath...",
849 "know that you can beat the impossible odds!",
850 "listen to someone scream 'YES! I won in the lottery! I'm a millionaire now!!!'",
852 You("%s", rarityroom_msg[rn2(4+hallu*4)]);
853 return;
856 if (level.flags.has_prisonchamber && !rn2(200)) {
857 static const char *prisonchamber_msg[] = {
858 "feel that you must free someone who's being held captive.", /* Castle of the Winds, level 4 of the castle where you have to free the prisoner */
859 "hear someone calling for you.",
860 "must free the prisoner unless you want him to be executed.",
861 "have a limited amount of time to save the prisoner or else he gets killed.",
862 "are already hearing drums.",
863 "were too slow and now the prisoner is dead. You failure!",
864 "really have to hurry - if you don't free the prisoner in 10 turns, he will be killed!",
865 "were so stupid and accidentally attacked the prisoner, causing him to die! Now you'll never get the reward for freeing him!",
866 "procrastinated for too long and now the prisoner is history. You failure!",
867 "noticed that the drums are beating faster!",
869 You("%s", prisonchamber_msg[rn2(5+hallu*5)]);
870 return;
873 if (level.flags.has_nuclearchamber && !rn2(200)) {
874 static const char *nuclearchamber_msg[] = {
875 "realize that your Geiger counter has started ticking like mad.",
876 "smell the stench of contamination in the air.",
877 "listen to scientists talking about their experiments.",
878 "hear the sounds of a nuclear facility.",
879 "detect gamma radiation.",
880 "feel the presence of the ether generator!",
881 "can overhear the president saying 'That was the last straw! I'll bomb that fucking country now! I just need to get the code and press the big red button!'",
882 "are in the extended hazardous course and will have to beat it without cheats, which is very difficult!", /* Hazardous Course 2, also known as Super Kaizo Half-Life */
883 "fear that the politicians will abolish their nuclear peace treaties!",
884 "are glad that you have a HEV suit, which must be very HEVvy.",
886 You("%s", nuclearchamber_msg[rn2(5+hallu*5)]);
887 return;
890 if (level.flags.has_variantroom && !rn2(200)) {
891 static const char *variantroom_msg[] = {
892 "sense the presence of beings from another universe.",
893 "hear the elder priest fiercely lashing his tentacles around.", /* dnethack */
894 "feel an earthquake-like trembling, probably caused by a migmatite horror...", /* steamband */
895 "hear Morgoth muttering a chant.", /* angband */
896 "hear the scream of Lina Inverse's high-pitched voice.", /* animeband */
897 "receive a stamped scroll from the mail demon! It reads: 'Muahahahaha, I kidnapped Princess Peach again. Sincerely, Bowser.'",
898 "start eating the hill giant corpse. Ulch - that meat was tainted! You die from your illness. Do you want your possessions identified? DYWYPI? [ynq] (n) _", /* Grunthack */
899 "suddenly realize that the elder priest stands right before you, and unfortunately, it's his turn now. Say goodbye to your cloak of magic resistance!",
900 "allowed your speed spell to wear off, and as a result Morgoth gets a double turn and casts mana storm twice in a row. You die.",
901 "are lucky, because you encountered Animeband's instakill monster, and it kills you! Game over!",
903 You("%s", variantroom_msg[rn2(5+hallu*5)]);
904 return;
907 if (level.flags.has_coinhall && !rn2(200)) {
908 static const char *coinhall_msg[] = {
909 "notice the sound of clinging coins.",
910 "feel that, somewhere down here, there might be a whole lot of gold.",
911 "hear metal banging against a wall.", /* the metal is the gold, of course */
912 "hear a tingling-clinging sound.",
913 "hear Scrooge McDuck taking a bath in his money!",
914 "hear the sound of a shower and then... coins???", /* Scrooge's gold coin shower */
915 "don't know why purple rain is so popular, because gold rain is much better...",
916 "feel extremely bored! Why does the dungeon master keep sending boring chaff monsters instead of something more dangerous?", /* players have complained that coin halls are one of the most boring special rooms */
918 You("%s", coinhall_msg[rn2(4+hallu*4)]);
919 return;
921 if (level.flags.has_angelhall && !rn2(200)) {
922 static const char *angelhall_msg[] = {
923 "hear the sound of wispy wings.",
924 "can barely hear a whispering voice.",
925 "sense a glow of radiance.",
926 "listen to someone announcing that you need penance.",
927 "feel like you are in the presence of a god.",
928 "suddenly feel an itching sensation inside your brain.",
929 "think you just heard God speaking to you!",
930 "notice that the stupid little angel is always flying in a circle.",
931 "forgot your golden spirit gel that you could use to clip the angel's wings.",
932 "see the angel flap its wings. One of them brings destruction while the other brings prosperity.",
933 "begin to shed tears of joy without even realizing it.",
934 "feel the angel's beauty taking your breath away...",
936 You("%s", angelhall_msg[rn2(6+hallu*6)]);
937 return;
939 if (level.flags.has_elemhall && !rn2(200)) {
940 static const char *elemhall_msg[] = {
941 "suddenly feel a wave of heat.",
942 "notice some heaps of earth.",
943 "sense a strong gust of wind.",
944 "hear a wave of water.",
945 "feel the presence of astral beings.",
946 "hear distant thunder.",
947 "get the impression that the laws of Nature itself are conspiring against you!",
948 "suffer from severe inundation!",
949 "realize that you're on a hot plate that was just turned on! Step off or you'll get the tip of your toes burned!",
950 "are sitting in an electric chair and have to survive a current of 20 watt for half an hour!",
951 "realize that a tornado has engulfed the entire dungeon and the ceiling starts to collapse...",
952 "wonder why 'astral' elementals exist, because astral is not an element.",
953 "can hear Laura chanting spells.", /* she's supposed to be a master of elemental spells */
955 You("%s", elemhall_msg[rn2(6+hallu*7)]);
956 return;
959 if (level.flags.has_evilroom && !rn2(200)) {
960 static const char *evilroom_msg[] = {
961 "are very afraid for some reason.",
962 "listen to a really evil sound.",
963 "hear a very deep grunt.", /* grunthack :D */
964 "sense a great danger.",
965 "hear measurers and forks.", /* Nethack Fourk */
966 "hear someone sharpening the spoon fork.", /* Sporkhack */
967 "somehow feel that the default rules are not valid here.",
968 "are afraid that this place will be rather unfair to you.",
969 "can tell from the sounds that the monsters on this level are spectacularly unforgiving.",
970 "know that you won't make it through this level alive...",
971 "will die, but not before you've witnessed the evil perpetrators taking your beloved toys and breaking them into pieces.",
972 "are going to get disintegrated even if you are resistant.", /* Nethack Fourk */
973 "will never be able to kill a bugbear in less than 5 hits, and woe to you if an actually difficult monster comes, e.g. a stone golem.", /* Sporkhack */
974 "don't look forward to encountering the elder priest at all.", /* dnethack */
975 "just love it when intrinsically obtained resistances time out.", /* ditto */
976 "have to eat hundreds of corpses to obtain full resistance.", /* sporkhack */
977 "feel that magic resistance will not protect you from the destroy armor spell.", /* ditto */
978 "finally understand that interface screws are not fake difficulty.",
980 You("%s", evilroom_msg[rn2(9+hallu*9)]);
981 return;
983 if (level.flags.has_religioncenter && !rn2(200)) {
984 static const char *religioncenter_msg[] = {
985 "hear religious chants.",
986 "hear the sound of a preacher.",
987 "listen to some gibberish talk.",
988 "hear voices chanting a prayer.",
989 "sense an evil, awful stench.",
990 "sense a cultural clash.", /* sadly, some religions do not get along very well with each other */
991 "hear someone call for the elimination of infidels.",
992 "hear a frightening 'Hola-hola!' call!",
993 "hear someone shout 'Allahu Akbar!'",
994 "have to resist the urge to vomit from the terrible smell.",
995 "must prevent the hostile overtaking or everything you hold dear will be lost.",
996 "suddenly meet someone who accuses you of being an intolerant asshole.",
997 "know that the statistics don't lie and the alien infestation is a real threat!",
998 "overhear plans for a destructive bomb notice!",
1000 You("%s", religioncenter_msg[rn2(7+hallu*7)]);
1001 return;
1003 if (level.flags.has_cursedmummyroom && !rn2(200)) {
1004 static const char *cursedmummyroom_msg[] = {
1005 "sense the eerie silence.",
1006 "feel the presence of ancient beings.",
1007 "have a primordial feeling.", /* the lich in that room is a really ancient being */
1008 "are struck with awe at the sight of these structures.", /* refers to the architecture to the mummies' tomb */
1009 "hear the frightening sounds of something you do NOT, EVER, want to anger.", /* Elona big daddy */
1010 "realize that you've trespassed in the tomb of an ancient pharao.",
1011 "are afraid of accidentally equipping cursed items.",
1012 "hear the dead walking.",
1013 "hear the dead potatoes walking. And the dissolved undead potatoes, returned potatoes and whatever other kind of potatoes as well.",
1015 You("%s", cursedmummyroom_msg[rn2(4+hallu*5)]);
1016 return;
1018 if (level.flags.has_arduousmountain && !rn2(200)) {
1019 static const char *arduousmountain_msg[] = {
1020 "feel that this will be rather difficult.",
1021 "know that until the very end, you have to give it your best.",
1022 "sense a great deal of variety.",
1023 "seem to sense the weather changing.", /* weather in the mountains can change fast and unexpectedly */
1024 "sense the change of air pressure.",
1025 "feel that the air is getting thin.",
1026 "must contest the harder part of the Adventurer Zone!", /* Mushroom Kingdom Fusion */
1027 "feel that in the name of Caesar, Carthage MUST be destroyed!",
1028 "switch out your lamp for a climbing set.", /* ToME has climbing tools for scaling mountains but sadly they use the same slot that light sources occupy */
1029 "realize that your chosen character class is hard to play for the entire length of the game.",
1030 "wish you had a dumbo to ride on.",
1031 "wonder how a legion would deal with an icy staircase.",
1033 You("%s", arduousmountain_msg[rn2(6+hallu*6)]);
1034 return;
1036 if (level.flags.has_changingroom && !rn2(200)) {
1037 static const char *changingroom_msg[] = {
1038 "hear women talking about clothing.",
1039 "listen to giggling sounds.", /* girls while changing clothes */
1040 "feel as if messages are being transmitted via bush telegraph methods.",
1041 "sense a scentful smell.",
1042 "hear a hollow beating sound.", /* someone tapping their shoes on the ground */
1043 "feel that someone around here is unusually busy.",
1044 "dream of a little black dress, even though you don't have any reason for bereavement.",
1045 "absolutely want a pair of leather boots with bright green block heels!",
1046 "look forward to buying several pairs of 'Janina' underwear.",
1047 "try to picture AmyBSOD in front of your mental eyes, with her wearing only high heels and pants.", /* inspired by bhaak */
1048 "wonder whether you're the peeping tom?", /* Pokemon, Erika's Gym, don't remember which edition but probably yellow? */
1049 "feel like you've not changed your underwear for a whole day, so it's time to change them now!",
1051 You("%s", changingroom_msg[rn2(6+hallu*6)]);
1052 return;
1054 if (level.flags.has_levelffroom && !rn2(200)) {
1055 static const char *levelffroom_msg[] = {
1056 "hear laughing sounds.",
1057 "listen to dissonant beeps.", /* supposed to be the Metroid "Beepbebeep beep BEEP beep, beep beep BEEP beep!" "music" */
1058 "have the feeling that there will be errors.", /* many of these are inspired by various glitches in Castle of the Winds */
1059 "hear an asynchronous sound.",
1060 "realize some unexpected hard disk activity.",
1061 "have to use phase door if you want to get inside.",
1062 "wonder whether teleportation will work on this floor.",
1063 "wonder whether shooting the percents will make it go away.",
1064 "have the urge to click on that gray tile!",
1065 "get a NTLL - Not a valid save file!",
1066 "suddenly notice the superdeep type over there!",
1067 "scrolled too far down and the ultrayousee ends your game. Sorry.",
1068 "just lost another continue! If you keep playing that badly, you'll run out and be eliminated prematurely!",
1069 "need to use clairvoyance in a very specific place or you won't be able to teleport!",
1070 "suddenly remember the highscore cheat that Amy's roommate discovered!",
1071 "are challenged by Julietta, and have to defeat her in the auto racer duel!",
1073 You("%s", levelffroom_msg[rn2(8+hallu*8)]);
1074 return;
1076 if (level.flags.has_verminroom && !rn2(200)) {
1077 static const char *verminroom_msg[] = {
1078 "hear chittering sounds.",
1079 "hear hissing noises.",
1080 "feel as if there's rats in the walls.",
1081 "notice a foul stench in the air.",
1082 "fell into an open sewer hole!",
1083 "think that it must be raining outside, judging by the ratty smell.", /* canal lids on the ground sometimes emit a horrific smell when it's raining... */
1084 "suddenly bear witness to a huge invasion of ants, rats, cockroaches and other vermin!",
1086 You("%s", verminroom_msg[rn2(4+hallu*3)]);
1087 return;
1089 if (level.flags.has_questorroom && !rn2(200)) {
1090 static const char *questorroom_msg[] = {
1091 "feel like you should be working.",
1092 "seem to hear your superiors calling your name.",
1093 "suddenly meet one of your colleagues who is just passing by.",
1094 "absolutely don't want to visit the canteen.", /* because the "food" that is served there gives your stomach trouble */
1095 "are late for work! Now your boss will give you a final written warning!",
1096 "find out that while you didn't lose your job yet, you have to continue working at 20%% reduced pay, and if you make one more mistake it'll get lowered even more.", /* inspired by jonadab */
1097 "feel extremely nauseated all of a sudden. Maybe it was a mistake after all to eat canteen calls-itself-food.",
1098 "are sooooooo fed up with your annoying colleague! Having to see that same insufferable person every day makes you want to vomit!",
1100 You("%s", questorroom_msg[rn2(4+hallu*4)]);
1101 return;
1103 if (level.flags.has_miraspa && !rn2(200)) {
1104 static const char *miraspa_msg[] = {
1105 "hear a female voice praising her spa.",
1106 "notice an overwhelming stench of urine.",
1107 "hear a distorted splash.",
1108 "listen to a complaining customer and a female voice saying 'Nope, you don't get your money back, sorry.'",
1109 "hear a constant peeing noise.",
1110 "encounter Mira, and she asks: 'Do you want to bathe in my urine? Only 20 zorkmids for one hour of pure fun!'",
1111 "suddenly see the skeletons of people who died in a most painful way!",
1112 "can't wrap the head around Mira's fantasies.",
1113 "are certainly turned OFF bathing for now. Did Mira really pee into the basin???", /* she did... */
1114 "notice the stench of ammonia.",
1116 You("%s", miraspa_msg[rn2(5+hallu*5)]);
1117 return;
1119 if (level.flags.has_machineroom && !rn2(200)) {
1120 static const char *machineroom_msg[] = {
1121 "hear clatter.",
1122 "hear the grinding gears of industry.",
1123 "hear busy, hectic noises.",
1124 "realize that you're in the industrial district now.",
1125 "hear the sound of a dump truck.",
1126 "hear the track bed being gravelled.",
1127 "hear the taunts of the motherfucking Glass Golem!",
1128 "listen to the sound of a truck rolling over a road.",
1129 "wonder how long the industrial highway is, it seems to be endless?!",
1130 "hear a 'choo-choo' sound and as you turn around, you see a TRAAAAAAAAAIN! YAAAAAAAY! It's headed to Trier, so it's probably a Sueueueueueuewex? :-)",
1131 "doze off into a peaceful slumber as the trains keep passing through the station once every 30 minutes.",
1132 "suddenly wonder why there's so much traffic.",
1134 You("%s", machineroom_msg[rn2(6+hallu*6)]);
1135 if (uarmf && itemhasappearance(uarmf, APP_INDUSTRIAL_BOOTS) && !u.uspellprot) {
1136 u.uspellprot = 4;
1137 u.uspmtime = 10;
1138 if (!u.usptime) u.usptime = u.uspmtime;
1139 find_ac();
1140 flags.botl = TRUE;
1141 You_feel("strangely protected. Could be due to your boots.");
1143 return;
1145 if (level.flags.has_showerroom && !rn2(200)) {
1146 static const char *showerroom_msg[] = {
1147 "hear water currents.",
1148 "feel like dancing in the rain.",
1149 "listen to a mix of splashes.",
1150 "hear the shower running.",
1151 "inhale the smell of brine.",
1152 "hear a thunderous rumble.",
1153 "listen to the emergency service trying to repair a broken water pipe.",
1154 "hear someone scream 'HELP! I can't swim! Save me please, I'm drowning!!!",
1155 "realize that the sorcery adept doesn't know how to stop the water...", /* some poem that I forgot the name off, maybe "the mage adept"? the poor sap wants to fill the bathtub with water by using a spell but forgot how to stop the helpers he summoned */
1156 "detect a flooding on this sub level.",
1158 You("%s", showerroom_msg[rn2(6+hallu*4)]);
1159 return;
1161 if ((level.flags.has_greencrossroom || (at_dgn_entrance("Green Cross")) ) && !rn2(200)) {
1162 static const char *greencrossroom_msg[] = {
1163 "hear some mundane talk.", /* most of these are Castle of the Winds-inspired */
1164 "listen to the cackle of poultry.",
1165 "feel like reaching the next town.",
1166 "seem to be in a nice atmosphere.",
1167 "hear pages turning.",
1168 "listen to the villagers' conversations.",
1169 "want to check whether the secret path is open.",
1170 "inhale the sharp smell of burning thatch!",
1171 "suddenly see the hill giant lord throwing enormous rocks on the shops! And he's killing the shopkeeper with a giant club! Ack!",
1172 "must be in a town that's not very easy to reach.",
1173 "hacked into Arabella's chat, allowing you to monitor her talk and that of her girlfriends. And you realize that Henrietta complains about you having gotten away from her because she can't follow you now.",
1174 "need to squeeze past all the statues with the ancient white dragon breathing down your neck!",
1175 "have 100 turns left to find the secret entrance to an otherwise unreachable dungeon level before the hidden warp portal dissipates.",
1176 "somehow feel that the secret advice hussies can't get you for now.",
1178 You("%s", greencrossroom_msg[rn2(7+hallu*7)]);
1179 return;
1181 if (level.flags.has_ruinedchurch && !rn2(200)) {
1182 static const char *ruinedchurch_msg[] = {
1183 "feel a haunting presence.",
1184 "hear a chiming bell.",
1185 "hear a C major chord.",
1186 "feel that all sanctity of this place has been lost.",
1187 "are sure that the dead are floating around here.",
1188 "hear an orchestral melody that goes 'Daaaaa... daaaaaa... DAAAAAAAAAAAAAAA!!!'",
1189 "notice a sound: 'Ooeoeoeoep! ... Ooeoeoeoep!' Suddenly someone shouts 'Ey, that's not called 'Ooeoeoeoep', that's a church bell, didn't you know that!'",
1190 "remember the bible saying that you should do unto others what you want others to do unto you.",
1191 "know that practice makes perfect. Yeah, yeah.",
1193 You("%s", ruinedchurch_msg[rn2(5+hallu*4)]);
1194 return;
1196 if (level.flags.has_gamecorner && !rn2(200)) {
1197 static const char *gamecorner_msg[] = {
1198 "hear the Tetris melody.",
1199 "listen to someone playing Diablo 2.",
1200 "seem to catch earshot of people playing Dungeons and Dragons.",
1201 "hear the familiar melody of Mario Kart 64.",
1202 "listen to the typical Electronic Arts games slogan.",
1203 "seem to catch earshot of a dragon shout from Skyrim.",
1204 "encounter a tiny lag that indicates monsters being spawned.",
1205 "have to click OK on the shareware notice.",
1206 "see the accursed crashy graphics card logo.",
1207 "hear a speedrunner curse at Super Kaizo Mario because the game is too damn hard!",
1208 "suddenly feel that you're really playing GTA! A cop car appears! The cop wields a shotgun! The cop fires a shotgun shell!--More--",
1209 "lost your last hitpoint and jump out of the picture!",
1210 "suddenly feel like just standing there and letting a sexy prostitute kick you in the nuts repeatedly.",
1211 "want to be expenditure-feasted by the sharp claws!",
1212 "absolutely long to have a succubus slowly and very painfully scratch you with her erotic blade!",
1213 "feel that the developer inserted even the most impossible bugs into the game that a normal mortal could never conceive!",
1214 "feel that the colors are very fleece-bouffant!",
1215 "hear someone say 'Die-Far-ben-sind-sehr-flau-schel-bau-schig!'",
1216 "push buttons and your stupid PC responds by making annoying 'DIE-DIE-DOE' sounds instead of executing your commands!",
1218 You("%s", gamecorner_msg[rn2(9+hallu*10)]);
1219 return;
1221 if (level.flags.has_illusionroom && !rn2(200)) {
1222 static const char *illusionroom_msg[] = {
1223 "feel a little confused about this place.",
1224 "feel that things aren't necessarily really there just because you can see them.",
1225 "are sure that some strange presences are on this floor.",
1226 "need to stay alert for anything out of the ordinary.",
1227 "have an everchanging feeling.",
1228 "feel slightly irritated and annoyed at something.",
1229 "notice that your weapon has no effect! Get a shield!",
1230 "can't think about difficult things or your brain will asplode!",
1231 "forgot that you were suffering from amnesia! Oh no!",
1232 "decide that you'd rather not and we'll just pretend that you did so you can move on.",
1233 "hope that one of the gods can help you out of your predicament...",
1234 "should stop thinking of eldritch abominations all the time or you'll end up permanently confused!",
1236 You("%s", illusionroom_msg[rn2(6+hallu*6)]);
1237 return;
1240 if (level.flags.has_terrorhall && !rn2(200)) {
1241 static const char *terrorhall_msg[] = {
1242 "feel weirded out.",
1243 "sense something strange about this place.",
1244 "think you just saw something move.",
1245 "feel terrified.",
1246 "hear the walls crumbling down.",
1247 "hear an eerie curse.",
1248 "think you're seeing white rabbits!",
1249 "feel totally down, like you're on a bad trip!",
1250 "feel reminded of the am shop notice!",
1251 "develop an acute case of agoraphobia because of all the car notices!",
1252 "listen to someone flat a notice on you!",
1253 "hear the all-too-familiar telltale sound of an incoming airstrike! RUN! TAKE COVER!",
1255 You("%s", terrorhall_msg[rn2(6+hallu*6)]);
1256 return;
1259 if (level.flags.has_insideroom && !rn2(200)) {
1260 static const char *insideroom_msg[] = {
1261 "have a weird feeling of chills and excitement.",
1262 "sense that something isn't right here...",
1263 "shudder in expectation.",
1264 "listen to Arabella saying 'The inside part is too dangerous for me.'",
1265 "listen to Arabella saying 'Please be careful in the inside part.'",
1266 "listen to Arabella saying 'That place is so perilous, even I won't be entering.'",
1267 "listen to Arabella saying 'Take care. There's nasty traps everywhere.'",
1268 "listen to Arabella saying 'Even I can't remember all the nasty traps I placed on this dungeon level.'",
1269 "listen to Anastasia saying 'My vacuum cleaner is waiting for you.'",
1270 "listen to Henrietta saying 'You won't get away from me this time.'",
1271 "listen to Katrin saying 'Why don't you come over here and have some fun with me?'",
1272 "listen to Jana saying 'I'm well hidden, you won't even find me.'",
1273 "see an error message pop up: NETHACK.EXE caused a General Protection Fault at address 000D:001D.",
1274 "see an error message pop up: Warning: Low Local Memory. Freeing description strings.",
1275 "see an error message pop up: nt|| - Not a valid save file",
1276 "see an error message pop up: APPLICATION ERROR - integer divide by 0",
1277 "see an error message pop up: Runtime error! Program: NETHACK.EXE. R6025 - pure virtual function call",
1278 "see an error message pop up: Buffer overrun detected! Program: NETHACK.EXE. A buffer overrun has been detected which has corrupted the program's internal state. The program cannot safely continue execution and must now be terminated.",
1279 "see an error message pop up: Runtime error! Program: NETHACK.EXE. This application has requested the Runtime to terminate it in an unusual way. Please contact the application's support team for more information.",
1280 "see an error message pop up: Not enough memory to create inventory window",
1281 "see an error message pop up: Error: Nethack will only run in Protect mode",
1282 "see an error message pop up: Oops... Suddenly, the dungeon collapses. NETHACK.EXE has stopped working. Unsaved data may have been lost.",
1283 "see an error message pop up: ERROR: SIGNAL 11 WAS RAISED",
1284 "see an error message pop up: UNHANDLED EXCEPTION: ACCESS_VIOLATION (C0000005)",
1285 "see an error message pop up: An error has occurred in your application. If you choose Close, your application will be terminated. If you choose Ignore, you should save your work in a new file.",
1286 "see an error message pop up: Do you want your possessions identified? DYWYPI?",
1287 "see an error message pop up: Windows Subsystem service has stopped unexpectedly.",
1288 "see an error message pop up: nv4_disp.dll device driver is stuck in an infinite loop.",
1289 "see an error message pop up: The win16 subsystem has insufficient resources to continue running. Click on OK, close your application and restart your machine.",
1290 "see an error message pop up: System resources depleted. Please restart your computer.",
1291 "listen to Arabella saying 'Stop stalking me all the time, you're creepy.'",
1292 "listen to Arabella saying 'You're not Marc, and therefore you won't ever defeat me.'",
1293 "listen to Arabella saying 'You admitted that you want to grope my girl butt. Time to join #metoo and tell them that you're a sexual predator.'",
1294 "listen to Arabella saying 'What, you thought I stepped into dog shit because I want to clean my shoes myself? No, *you* will do that now, by hand and without tools.'",
1295 "listen to Arabella saying 'If you get too close to me, I will push your shoes into a heap of shit. Then, no matter what you do to me, you'll at least have to clean the shit off your shoes again.'",
1296 "listen to Anastasia saying 'Thanks for cleaning the dog shit off my profiled dancing shoes. Now I'll find a new heap of shit to step into, and if you like, you may then clean my shoes again. Was it fun?'",
1297 "listen to Henrietta saying 'Because of you I stepped into dog shit with my Henrietta shoes. As a punishment you have to clean them by hand now.'",
1298 "listen to Katrin saying 'Please let me stick my soft chewing gum on your skin! Then I can very slowly and extremely painfully take it off again, ripping off your skin in the process.'",
1299 "listen to Jana saying 'Even if you find me, I'll just teleport away and prevent you from defeating me! And your skill certainly isn't good enough to reach Sven, so you won't be fulfilling the alternate victory condition either!'",
1301 You("%s", insideroom_msg[rn2(12+hallu*27)]);
1302 return;
1305 if (level.flags.has_riverroom && !rn2(200)) {
1306 static const char *riverroom_msg[] = {
1307 "hear seagulls.",
1308 "hear waves on sand.",
1309 "hear something fishy happening.",
1310 "hear the trickle of water.",
1311 "sense a watery smell mixed with grass.",
1312 "listen to an unusual ambient sound.",
1313 "listen to a song that goes 'Leyde, coming down to the ri-ver...'",
1314 "suddenly start humming the tune of 'Green River' by CCR.",
1315 "hear a fountain crash through solid rock with a mighty roar!",
1316 "admire the beautiful mountains around here. Strange, how can mountains be in an underground dungeon?",
1317 "return to your hiding place, only to find a cursed called. Shit.",
1318 "return to your weapon camp, but to your dismay Arabella has looted almost everything, leaving only a single wand of magic missile for you.",
1319 "get the dreaded 'Can't write to save file' error. Bullshit.",
1320 "hear burly voices singing shanties.",
1321 "here someone ask about warez.",
1322 "hear a speedboat.",
1323 "hear a squeaking rubber duck!",
1324 "hear a loud advert for Tide.",
1325 "hear a commercial for protein bars.",
1326 "hear a shark jumping!",
1327 "hear a gull asking for a bite of your sandwich.",
1328 "hear a foghorn!",
1329 "hear a sea shell exploding!",
1330 "hear a C-shell script running.",
1332 You("%s", riverroom_msg[rn2(8+hallu*16)]);
1333 return;
1336 if (level.flags.has_tenshall && !rn2(200)) {
1337 static const char *tenshall_msg[] = {
1338 "feel a certain tension.",
1339 "feel a certain tension. This message was stolen from ADOM.",
1340 "sense a certain tension.",
1341 "suddenly see nightmarish images with Thomas Biskup in your mind!", /* ADOM creator */
1342 "sense a certain tension. Perhaps you should head for the nearest toilet...",
1343 "sense a certain tension. That dreaded Dungeon Master probably filled the next room with arch-liches, disenchanters and master mind flayers.",
1344 "sense a certain tension. That dreaded Dungeon Master probably filled the next room with black dragons, green slimes and invisible cockatrices.",
1345 "sense a certain tension. That dreaded Dungeon Master probably filled the next room with luck suckers, Mothers-in-Law and questing beasts.",
1346 "fear that a fucking crash bug is going to eat your savegame file!", /* yes, Adom does that sometimes */
1347 "fear that some anti-cheat mechanism is going to curse all of your items even though you clearly didn't cheat at all!", /* and yes, that's another annoying fact of Adom that makes me glad I'm playing Nethack instead --Amy */
1349 You("%s", tenshall_msg[rn2(3+hallu*7)]);
1350 return;
1352 if (level.flags.has_zoo && !rn2(200)) {
1353 static const char * const zoo_msg[] = {
1354 "a sound reminiscent of an elephant stepping on a peanut.",
1355 "a sound reminiscent of a seal barking.",
1356 "David feeding his animals.",
1357 "a roar.",
1358 "Doctor Doolittle!",
1359 "someone asking 'Who the fuck is David?'",
1361 for (mtmp = fmon; mtmp; mtmp = mtmp->nmon) {
1362 if (DEADMONSTER(mtmp)) continue;
1363 if ((mtmp->msleeping || is_animal(mtmp->data)) &&
1364 mon_in_room(mtmp, ZOO)) {
1365 You_hear("%s", zoo_msg[rn2(4+hallu*2)]);
1366 return;
1370 if (level.flags.has_shop && !rn2(200)) {
1371 if (!(sroom = search_special(ANY_SHOP))) {
1372 /* strange... */
1373 level.flags.has_shop = 0;
1374 return;
1376 if (tended_shop(sroom) &&
1377 !index(u.ushops, ROOM_INDEX(sroom) + ROOMOFFSET)) {
1378 static const char * const shop_msg[3] = {
1379 "someone cursing shoplifters.",
1380 "the chime of a cash register.",
1381 "Neiman and Marcus arguing!",
1383 if (rn2(50)) You_hear("%s", shop_msg[rn2(2+hallu)]);
1384 else { /* sporkhack; I know they don't always fit, but oh well --Amy */
1385 static const char * const shop_sporkmsg[] = {
1386 "Any %s would love these! Finest quality!",
1387 "Fit for a Knight, but they'll last for weeks!",
1388 "It's dangerous 'round here these days... better wear something safe!",
1389 "Hey, %s, I've got something here that'll fit you perfectly!",
1390 "Guaranteed safety or double your money back!",
1391 "If any of the armors you buy here doesn't save your life, you get your money back of course!",
1392 "'ere now, this isn't a library; get lost, you freeloader!",
1393 "Waterproof ink upon request! ... for a small surcharge.",
1394 "Curses removed, gold detected, and weapons enchanted, at your whim!",
1395 "If you can read, %s, you'll want some of these!",
1396 "Booze on ice! Getcher booze on ice!",
1397 "Come on, %s. You know you're thirsty.",
1398 "Ahhh, it'll put hair on yer chest!",
1399 "Lowest percentage of cursed items around!",
1400 "Sharpest weapons around! On sale, today only!",
1401 "We sell 'em, you stab 'em!",
1402 "Guaranteed to not dull for ten fights or your money back!",
1403 "Look, %s, with a face like that you'll be in a lot of fights. Better buy something now.",
1404 "You'll never slash the same again after one of ours!",
1405 "Gitchore luvverly orinjes!",
1406 "Fresh fish! So fresh it'll grab yer naughty bits!",
1407 "Sausage inna bun! Hot sausage!",
1408 "Genuine pig parts, these. So good most pigs don't even know they got 'em.",
1409 "Well, you seem like a fine, discerning young %s; come look at this.",
1410 "Eat hot and tasty pizza here!",
1411 "We sell the best food in the world: the Doenerteller Versace!",
1412 "Do you like McDonalds, %s? Well, our fries are even better than theirs, so come on over!",
1413 "Come over %s, and taste the one and only Shawarma you'll get in the entire dungeon!",
1414 "Yo %s, this way to the Burger King restaurant! We know you're hungry!",
1415 "Special sparklies for a special %s, perhaps?",
1416 "Once you put one of ours on, you'll never want to take it off!",
1417 "Our bands never break or melt!",
1418 "Shiny, isn't it?",
1419 "Credit available for valued customers!",
1420 "We offer premium quality inka rings! Guaranteed to make your woman use her sexy butt cheeks to shower you with love!",
1421 "The other shops may be trying to sell you amulets of strangulation, but we have something that saves your life instead!",
1422 "Bugger off, you filthy little %s. Don't come begging around here!",
1423 "Straightest zaps anywhere! 100%% money back guarantee (less usage)!",
1424 "Our wands explode less than all others!",
1425 "New EZ-BREAK feature on these in case of emergency!",
1426 "Dude, %s, I have a wand of wishing for sale today. Buy now before someone else does!",
1427 "Tins opened, faces wiped, gazes reflected; your one-stop shop!",
1428 "How you gonna carry all your stuff without a bag, %s?",
1429 "Must be hard kickin' all those doors down, I bet a key would help...",
1430 "Only tools wouldn't buy our tools!",
1431 "Large print available!",
1432 "Mental magnificence for the scholarly IN-clined!",
1433 "'Banned' section now open! (I.D. required)",
1434 "Hey, %s! Best candles in Minetown! You'll need 'em later, count on it!",
1435 "You've got a long way down yet, %s. Be sure you're ready.",
1436 "Let us be the light in your darkness!",
1437 "You know, I hear some of these old lamps might be... magic.",
1438 "Be a shame if you missed anything because you didn't see it!",
1439 "Enchant your armor here! We offer premium enchant armor services!",
1440 "Hey %s, want to rustproof your armor? Our service will never fail you!",
1441 "Need to poison your weapon, %s? I have what you need!",
1442 "Dawg, I got quality shit for you here.",
1443 "Out of enchant weapon scrolls? Come over to my shop and you can enchant your weapon for just a few zorkmids!",
1444 "Tired of your weapon rusting and corroding all the damn time? Our shop allows you to proof them for a small fee!",
1445 "Got surplus weapons and need to know their enchantment? No problem, our appraisal service's really cheap and guaranteed to help you!",
1446 "Purchase your identify services here! We'll allow you to know what your items are!",
1447 "Premium wand recharging, %s! You don't want to miss our service!",
1448 "Enchant your rings in our shop! Only a few hundred zorkmids per charge!",
1449 "Tools empty? No problem - we recharge them if you got the money!",
1450 "You know you need a new pet! Come now and pick from our fine selection of brand-new figurines!",
1451 "Come to our gun shop and purchase rifles and ammo for all your hunting needs!",
1453 verbalize(shop_sporkmsg[rn2(SIZE(shop_sporkmsg))],urace.noun);
1456 return;
1458 if (Is_oracle_level(&u.uz) && !rn2(400)) {
1459 /* make sure the Oracle is still here */
1460 for (mtmp = fmon; mtmp; mtmp = mtmp->nmon)
1461 if (!DEADMONSTER(mtmp) && mtmp->data == &mons[PM_ORACLE])
1462 break;
1463 /* and don't produce silly effects when she's clearly visible */
1464 if (mtmp && (hallu || !canseemon(mtmp))) {
1465 static const char * const ora_msg[] = {
1466 "a strange wind.", /* Jupiter at Dodona */
1467 "convulsive ravings.", /* Apollo at Delphi */
1468 "snoring snakes.", /* AEsculapius at Epidaurus */
1469 "someone say \"No more woodchucks!\"",
1470 "a loud ZOT!" /* both rec.humor.oracle */
1472 /* KMH -- Give funny messages on Groundhog Day */
1473 if (flags.groundhogday) hallu = 1;
1474 You_hear("%s", ora_msg[rn2(3+hallu*2)]);
1476 return;
1478 if (!Is_blackmarket(&u.uz) && at_dgn_entrance("One-eyed Sam's Market") &&
1479 !rn2(200)) {
1480 static const char *blkmar_msg[] = {
1481 "You hear someone complaining about the prices.",
1482 "Somebody whispers: \"Food rations? Only 900 zorkmids.\"",
1483 "Somebody whispers: \"For one million zorkmids you can buy the legendary one-of-a-kind Excalibur!\"",
1484 "You feel like searching for more gold.",
1485 "Somebody whispers: \"Dawg, I got quality shit around here.\"",
1486 "Somebody whispers: \"I have that old playboy magazine issue that has naked pics of several dozen celebrities. I'll sell it to you for 10000 zorkmids.\"",
1488 pline("%s", blkmar_msg[rn2(3+hallu*3)]);
1491 /* finding alignment quests is way too hard, so the player will get some help. --Amy */
1492 if ( (at_dgn_entrance("Lawful Quest") || at_dgn_entrance("Neutral Quest") || at_dgn_entrance("Chaotic Quest") ) &&
1493 !rn2(1000)) {
1494 static const char *alignquest_msg[] = {
1495 "You feel the presence of some sort of force.",
1496 "There seems to be something special about this place.",
1497 "You detect the presence of an alignment quest portal!",
1498 "You hear an evil figure taunting you to step through the magic portal!",
1499 "You hear someone say: \"Force field activated!\"",
1500 "You hear someone say: \"Warp panel test sequence is starting in three... two... one...\"",
1501 "You see Diablo 2, the boss from the game with the same name, and he's holding your mother hostage!",
1502 "You know that on the flipside they have a cat AND a dog!",
1504 pline("%s", alignquest_msg[rn2(4+hallu*4)]);
1507 /* finding the subquest is even more annoying because you have to do it */
1508 if ( at_dgn_entrance("The Subquest") && u.silverbellget && !rn2(500) ) {
1509 static const char *subquest_msg[] = {
1510 "You sense some questing power!",
1511 "You detect the presence of the subquest portal!",
1512 "A lot of force seems to be in the air.",
1513 "You listen to the taunts of your nemesis who wants a rematch!",
1514 "You suddenly fear that you'll face your nemesis again and lose!",
1515 "You have a vision of your home being burned to the ground by the person you despise the most!",
1516 "Something tells you that the only thing you can depend on is your family, and even that not always!",
1517 "You hear a voice announce: \"Morn', player. I'm Sean Gonorrhea. I like my coffee black, my women slutty, and my mucosa membranes inflamed.\"",
1519 pline("%s", subquest_msg[rn2(4+hallu*4)]);
1525 #endif /* OVL0 */
1526 #ifdef OVLB
1528 static const char * const h_sounds[] = {
1529 "beeps", "boings", "sings", "belches", "creaks", "coughs", "rattles",
1530 "ululates", "pops", "jingles", "sniffles", "tinkles", "eeps",
1531 "clatters", "hums", "sizzles", "twitters", "wheezes", "rustles",
1532 "honks", "lisps", "yodels", "coos", "burps", "moos", "booms",
1533 "murmurs", "oinks", "quacks", "rumbles", "twangs", "bellows",
1534 "toots", "gargles", "hoots", "warbles", "crackles", "hisses",
1535 "growls", "roars", "buzzes", "squeals", "screeches", "neighs",
1536 "wails", "commotions", "squaarks", "screams", "yowls", "yelps",
1537 "snarls", "squeals", "screaks", "whimpers", "whines", "howls",
1538 "yips", "barks", "purrs", "meows", "mews", "drones", "whinnies",
1539 "whickers", "gurgles", "burbles", "shrieks", "baaaas", "clucks",
1543 /* make the sounds of a pet in any level of distress */
1544 /* (1 = "whimper", 2 = "yelp", 3 = "growl") */
1545 void
1546 pet_distress(mtmp, lev)
1547 register struct monst *mtmp;
1548 int lev;
1550 const char *verb;
1551 if (mtmp->msleeping || !mtmp->mcanmove || !mtmp->data->msound)
1552 return;
1553 /* presumably nearness and soundok checks have already been made */
1555 if (Hallucination)
1556 verb = h_sounds[rn2(SIZE(h_sounds))];
1557 else if (lev == 3)
1558 verb = growl_sound(mtmp);
1559 else if (lev == 2)
1560 verb = yelp_sound(mtmp);
1561 else if (lev == 1)
1562 verb = whimper_sound(mtmp);
1563 else
1564 panic("strange level of distress");
1566 if (verb) {
1567 pline("%s %s%c", Monnam(mtmp), verb, lev>1?'!':'.');
1568 if (flags.run) nomul(0, 0, FALSE);
1569 wake_nearto(mtmp->mx,mtmp->my,mtmp->data->mlevel*6*lev);
1573 /* the sounds of a seriously abused pet, including player attacking it */
1574 /* in extern.h: #define growl(mon) pet_distess((mon),3) */
1576 const char *
1577 growl_sound(mtmp)
1578 register struct monst *mtmp;
1580 const char *ret;
1582 switch (mtmp->data->msound) {
1583 case MS_MEW:
1584 case MS_HISS:
1585 ret = "hisses";
1586 break;
1587 case MS_BARK:
1588 case MS_GROWL:
1589 case MS_GRAKA:
1590 case MS_TEMPER:
1591 case MS_TRIP:
1592 ret = "growls";
1593 break;
1594 case MS_ROAR:
1595 ret = "roars";
1596 break;
1597 case MS_BUZZ:
1598 ret = "buzzes";
1599 break;
1600 case MS_SQEEK:
1601 ret = "squeals";
1602 break;
1603 case MS_SQAWK:
1604 ret = "screeches";
1605 break;
1606 case MS_NEIGH:
1607 ret = "neighs";
1608 break;
1609 case MS_WAIL:
1610 ret = "wails";
1611 break;
1612 case MS_SILENT:
1613 ret = "commotions";
1614 break;
1615 case MS_PARROT:
1616 ret = "squaarks";
1617 break;
1618 case MS_GURGLE:
1619 ret = "gurgles threateningly";
1620 break;
1621 case MS_SHRIEK:
1622 ret = "shrieks aggravatingly";
1623 aggravate();
1624 break;
1625 case MS_BONES:
1626 ret = "rattles frighteningly";
1627 You("freeze for a moment.");
1628 nomul(-2, "scared by rattling", TRUE);
1629 nomovemsg = 0;
1630 break;
1631 case MS_LAUGH:
1632 ret = "laughs fiendishly";
1633 break;
1634 case MS_MUMBLE:
1635 ret = "mumbles loudly";
1636 break;
1637 case MS_CASINO:
1638 ret = "calls for the casino's security";
1639 break;
1640 case MS_GLYPHS:
1641 ret = "screams 'Wait until I activate the awesome power of the yellow glyph!'";
1642 break;
1643 case MS_GIBBERISH:
1644 pline("%s", generate_garbage_string());
1645 break;
1646 case MS_SOCKS:
1647 ret = "looks very sad";
1648 break;
1649 case MS_PANTS:
1650 ret = "is heavily damaged";
1651 break;
1652 case MS_HANDY:
1653 ret = "screams 'How do you dare interrupting me during an important call!'";
1654 break;
1655 case MS_CAR:
1656 ret = "shouts 'You dorf, get away get away!'";
1657 break;
1658 case MS_JAPANESE:
1659 ret = "announces 'Sore wa seisen-shi no yarikata ni hanshimasu.'";
1660 break;
1661 case MS_SOVIET:
1662 ret = "shouts 'Ty pochuvstvuyesh' kholodnyy potseluy smerti, debil!'";
1663 break;
1664 case MS_SNORE:
1665 ret = "is jolted into consciousness";
1666 break;
1667 case MS_PHOTO:
1668 ret = "shouts 'Attacking a journalist is a severe crime!'";
1669 break;
1670 case MS_REPAIR:
1671 ret = "shouts 'Hey! I want to repair your gear, not be attacked by you!'";
1672 break;
1673 case MS_DRUGS:
1674 ret = "shouts 'Fuck you, asshole! I'm gonna sell my stuff somewhere else!'";
1675 break;
1676 case MS_COMBAT:
1677 ret = "shouts 'You can't fight fair, eh?'";
1678 break;
1679 case MS_MUTE:
1680 ret = "emits a long, angry grunt";
1681 break;
1682 case MS_CORONA:
1683 ret = "screams 'Hopefully you contract the virus and die!'";
1684 break;
1685 case MS_TRUMPET:
1686 ret = "emits a long, anguished trumpet sound";
1687 aggravate();
1688 break;
1689 case MS_PAIN:
1690 ret = "screams 'Ow-wow-wow! Owwwww!'";
1691 break;
1692 case MS_BRAG:
1693 ret = "shouts 'One day I'll kill you, and then you'll end up crying!'";
1694 break;
1695 case MS_PRINCESSLEIA:
1696 ret = "sobs 'That's not a way to treat a princess...'";
1697 break;
1698 case MS_LIEDER:
1699 ret = "shouts 'You will be excommunicated!'";
1700 break;
1701 case MS_GAARDIEN:
1702 ret = "shouts 'Friendly fire! FRIENDLY FIRE!'";
1703 break;
1704 case MS_MISSING:
1705 ret = "does not make a sound when seriously abused";
1706 break;
1707 case MS_SELFHARM:
1708 ret = "is bleeding terribly...";
1709 increasesanity(rnz(100));
1710 break;
1711 case MS_CLOCK:
1712 ret = "complains about the clock being broken";
1713 break;
1714 case MS_OHGOD:
1715 ret = "screams 'Ohtenthousandfoldgod!'";
1716 break;
1717 case MS_WOLLOH:
1718 ret = "shouts 'Wolloh asshole, I'm gonna beat up your ugly face wolloh!'";
1719 break;
1720 case MS_CODE:
1721 ret = "seems unable to remember the code";
1722 break;
1723 case MS_BARBER:
1724 ret = "screams 'Argh! I'm a barber, not a haircutter!'";
1725 break;
1726 case MS_AREOLA:
1727 ret = "is about to go crazy";
1728 break;
1729 case MS_STABILIZE:
1730 ret = "frantically tries to cast an emergency spell";
1731 break;
1732 case MS_ESCAPE:
1733 ret = "is about to escape";
1734 break;
1735 case MS_FEARHARE:
1736 ret = "is seriously afraid!";
1737 break;
1738 case MS_OE:
1739 ret = "seems fearful!";
1740 break;
1741 case MS_BAN:
1742 ret = "shouts 'I'll disappear if this continues!'";
1743 break;
1744 case MS_TALONCOMPANY:
1745 ret = "shouts 'Damn, I'm hit!'";
1746 break;
1747 case MS_REGULATOR:
1748 ret = "shouts 'Damn, I'm hit!'";
1749 break;
1750 case MS_RAIDER:
1751 ret = "shouts 'Stand still for once!'";
1752 break;
1753 case MS_ENCLAVE:
1754 ret = "shouts 'Ten-four! Target in sight!'";
1755 break;
1756 case MS_MUTANT:
1757 ret = "shouts 'I'm gonna eat your arms when you're dead, little human!'";
1758 break;
1759 case MS_MYTHICALDAWN:
1760 ret = "mutters 'The paradise awaits me...'";
1761 break;
1762 case MS_DREMORA:
1763 ret = "shouts 'Wince, failure!'";
1764 break;
1765 case MS_BOS:
1766 ret = "shouts 'Are you really trying to mess with the Brotherhood?'";
1767 break;
1768 case MS_OUTCAST:
1769 ret = "shouts 'Been a long time since I last killed someone!'";
1770 break;
1771 case MS_AMNESIA:
1772 ret = "mutters 'Huh, I think someone just attacked me.'";
1773 break;
1774 case MS_SHIVERINGESLES:
1775 ret = "announces 'Widerliche Tergens sind das. Heffin sie alle.'";
1776 break;
1777 case MS_ANOREXIA:
1778 ret = "mumbles 'Ah, who cares, I'm gonna die anyway.'";
1779 break;
1780 case MS_BULIMIA:
1781 ret = "shouts 'I will kill you! I swear, if you don't leave NOW I'll really kill you!'";
1782 break;
1783 case MS_BLANKER:
1784 ret = "shouts 'Now I'm gonna disenchant all your armor.'";
1785 break;
1786 case MS_CONDESCEND:
1787 ret = "laughs 'You're no match for me.'";
1788 break;
1789 case MS_MOLEST:
1790 if (flags.female) ret = "laughs 'Now I'll rape you, little girl.'";
1791 else ret = "sneers 'Fucking man, begone!'";
1792 break;
1793 case MS_SHOCKTROOPER:
1794 ret = "says 'ku kur ku'";
1795 break;
1796 case MS_GAGA:
1797 ret = "screams 'You violated my gender!!!!!!!111'";
1798 break;
1799 case MS_COMMON:
1800 ret = "screams 'I was seriously abused!'";
1801 break;
1802 case MS_PIRATE:
1803 ret = "shouts 'Gonna cleave ye to the brisket!'";
1804 break;
1805 case MS_SILLY:
1806 ret = "shouts 'Your ass will come out of the back!'";
1807 break;
1808 case MS_MIDI:
1809 ret = "makes a frenzied clamping sound";
1810 break;
1811 case MS_HERCULES:
1812 ret = "laughs 'You're no match for me, wimp.'";
1813 break;
1814 case MS_BEG:
1815 ret = "screams 'You're cruel.'";
1816 break;
1817 case MS_HIRE:
1818 case MS_ARMORER:
1819 case MS_OMEN:
1820 case MS_NEWS:
1821 case MS_CRYTHROAT:
1822 case MS_HOOT:
1823 case MS_RUSTLE:
1824 case MS_SEMEN:
1825 case MS_SCIENTIST:
1826 case MS_MODALSHOP:
1827 /* todo */
1828 ret = "Unfinished sound effect.";
1829 break;
1831 case MS_SPOILER:
1832 ret = "Error 25. Please restart the game";
1833 break;
1834 case MS_DEAD:
1835 ret = "moans 'Please just kill me now.'";
1836 break;
1837 case MS_TREESQUAD:
1838 ret = "screams 'Alert! Serious environmental damage!'";
1839 break;
1840 case MS_METALMAFIA:
1841 ret = "groans 'I will get your metal someday...'";
1842 break;
1843 case MS_DEEPSTATE:
1844 ret = "doesn't show a visible reaction";
1845 break;
1846 case MS_SISSY:
1847 ret = "whines 'owwww %s has me pain-done!'";
1848 break;
1849 case MS_SING:
1850 ret = "shouts 'Stop that! You're not allowed to use those girl boots against me!'";
1851 break;
1852 case MS_POMPEJI:
1853 ret = "moans 'Pompejiiiiiiii...'";
1854 break;
1855 case MS_FLUIDATOR:
1856 ret = "shouts 'Now leave to me finite in peace, you hell creature!'";
1857 break;
1858 case MS_BULLETATOR:
1859 ret = "shouts 'If you continue like that, I'll kill you.'";
1860 break;
1861 case MS_ALLA:
1862 ret = "shouts 'If you keep angering me like that, you'll pay.'";
1863 break;
1864 case MS_POKEDEX:
1865 ret = "shouts 'Hey! You're damaging my pokedex's CPU!'";
1866 break;
1867 case MS_BOT:
1868 ret = "drones 'Hostile acts detected.'";
1869 break;
1870 case MS_APOC:
1871 ret = "screams 'The apocalypse is truly coming now, everyone's going insane!'";
1872 break;
1873 case MS_ARREST:
1874 ret = "shouts 'I am an officer of the law!'";
1875 break;
1876 case MS_SOLDIER:
1877 ret = "shouts 'I'm gonna report you to your superior!";
1878 break;
1879 case MS_VAMPIRE:
1880 ret = "shouts 'Don't make me bite your the neck!'";
1881 break;
1882 case MS_CUSS:
1883 ret = "screams 'Fucking cunt!'";
1884 break;
1885 case MS_WHORE:
1886 ret = "shouts 'My pimp is the only one who may lay a hand on me!'";
1887 break;
1888 case MS_SUPERMAN:
1889 ret = "shouts 'YOU SHALL BE EXTERMINATED!'";
1890 aggravate();
1891 break;
1892 case MS_FART_QUIET:
1893 case MS_FART_NORMAL:
1894 case MS_FART_LOUD:
1895 ret = "screams 'Stop slapping my butt! That's painful!'";
1896 break;
1897 case MS_BOSS:
1898 ret = "shouts 'Hey! *I* am the boss here, not you!'";
1899 break;
1900 case MS_SHOE:
1901 ret = "screams 'Don't treat us like that! We don't like that at all!'";
1902 break;
1903 case MS_STENCH:
1904 ret = "screams 'You ruined my makeup!'";
1905 break;
1906 case MS_CONVERT:
1907 ret = "shouts 'Siz Allah'in sadik bir takipcisi degilsiniz, kafir!'";
1908 break;
1909 case MS_HCALIEN:
1910 ret = "looks at you with a gaze that is capable of killing";
1911 if (!rn2(20)) losehp(d(10,8), "the HC alien's gaze", KILLED_BY);
1912 else if (!rn2(5)) losehp(d(6,8), "the HC alien's gaze", KILLED_BY);
1913 else losehp(d(4,6), "the HC alien's gaze", KILLED_BY);
1914 break;
1915 default:
1916 ret = "screams";
1918 return ret;
1921 /* the sounds of mistreated pets */
1922 /* in extern.h: #define yelp(mon) pet_distress((mon),2) */
1924 static
1925 const char *
1926 yelp_sound(mtmp)
1927 register struct monst *mtmp;
1929 const char *ret;
1931 switch(mtmp->data->msound) {
1932 case MS_MEW:
1933 ret = "yowls";
1934 break;
1935 case MS_BARK:
1936 case MS_GROWL:
1937 case MS_GRAKA:
1938 case MS_TEMPER:
1939 case MS_TRIP:
1940 ret = "yelps";
1941 break;
1942 case MS_ROAR:
1943 ret = "snarls";
1944 break;
1945 case MS_SQEEK:
1946 ret = "squeals";
1947 break;
1948 case MS_SQAWK:
1949 ret = "screaks";
1950 break;
1951 case MS_WAIL:
1952 ret = "wails";
1953 break;
1954 case MS_GURGLE:
1955 ret = "gurgles hissingly";
1956 break;
1957 case MS_SHRIEK:
1958 ret = "shrieks in pain";
1959 aggravate();
1960 break;
1961 case MS_BONES:
1962 ret = "rattles";
1963 You("freeze for a moment.");
1964 nomul(-2, "scared by rattling", TRUE);
1965 nomovemsg = 0;
1966 break;
1967 case MS_LAUGH:
1968 ret = "stops laughing";
1969 break;
1970 case MS_MUMBLE:
1971 ret = "mumbles a bit";
1972 break;
1973 case MS_CASINO:
1974 ret = "complains about a loss of money";
1975 break;
1976 case MS_GIBBERISH:
1977 pline("%s", generate_garbage_string());
1978 break;
1979 case MS_SOCKS:
1980 ret = "frowns";
1981 break;
1982 case MS_PANTS:
1983 ret = "doesn't look so good";
1984 break;
1985 case MS_HANDY:
1986 ret = "has to interrupt a call";
1987 break;
1988 case MS_CAR:
1989 ret = "flashes a warning light";
1990 break;
1991 case MS_JAPANESE:
1992 ret = "mumbles 'Watashi wa futatabi kin'yoku-tekidenakereba narimasen...'";
1993 break;
1994 case MS_SOVIET:
1995 ret = "shouts 'Eto podzemel'ye rabotayet ne tak, kak zadumano!'";
1996 break;
1997 case MS_SNORE:
1998 ret = "seems alert for a bit, then dozes off again";
1999 break;
2000 case MS_PHOTO:
2001 ret = "checks the camera again";
2002 break;
2003 case MS_REPAIR:
2004 ret = "checks the repair hammer again";
2005 break;
2006 case MS_DRUGS:
2007 ret = "grumbles 'Stupid cops, can't they just go home...'";
2008 break;
2009 case MS_COMBAT:
2010 ret = "assumes a fighting pose";
2011 break;
2012 case MS_MUTE:
2013 ret = "growls annoyedly";
2014 break;
2015 case MS_CORONA:
2016 ret = "screams 'Police! Someone got closer to me than 1,50 meters!'";
2017 break;
2018 case MS_TRUMPET:
2019 ret = "emits a muffled trumpet sound";
2020 break;
2021 case MS_PAIN:
2022 ret = "seems to be in pain";
2023 break;
2024 case MS_BRAG:
2025 ret = "leafs through the monster stat sheet";
2026 break;
2027 case MS_PRINCESSLEIA:
2028 ret = "cries 'It's unfair that I always get hurt! A princess is supposed to be protected from harm at all times!'";
2029 break;
2030 case MS_LIEDER:
2031 ret = "shouts 'That's a violation of your conduct!'";
2032 break;
2033 case MS_GAARDIEN:
2034 ret = "laughs 'Keep doing that and I'll tell your boss, then you'll be fired.'";
2035 break;
2036 case MS_MISSING:
2037 ret = "does not make a sound when injured";
2038 break;
2039 case MS_SELFHARM:
2040 ret = "is squirting blood...";
2041 increasesanity(rnz(10));
2042 break;
2043 case MS_CLOCK:
2044 ret = "has to check the clock again";
2045 break;
2046 case MS_OHGOD:
2047 ret = "shouts 'Ohdoublegod!'";
2048 break;
2049 case MS_WOLLOH:
2050 ret = "screams 'Wolloh man, I'll fuck you up if you do that again, wolloh!";
2051 break;
2052 case MS_CODE:
2053 ret = "is trying hard to keep the code secret";
2054 break;
2055 case MS_BARBER:
2056 ret = "shouts 'No one stops the tunnel queues!'";
2057 break;
2058 case MS_AREOLA:
2059 ret = "stares at you in shock";
2060 break;
2061 case MS_STABILIZE:
2062 ret = "is attempting to erect a force field";
2063 break;
2064 case MS_ESCAPE:
2065 ret = "ponders the meaning of the dungeon";
2066 break;
2067 case MS_FEARHARE:
2068 ret = "screams 'Ah! I'm endangered! Screw that, I'm outta here!'";
2069 break;
2070 case MS_OE:
2071 ret = "feels in danger";
2072 break;
2073 case MS_BAN:
2074 ret = "shouts 'Emergency! Gotta get away from here!'";
2075 break;
2076 case MS_TALONCOMPANY:
2077 ret = "laughs 'I like it if they fight back!'";
2078 break;
2079 case MS_REGULATOR:
2080 ret = "shouts 'You can't escape the law!'";
2081 break;
2082 case MS_RAIDER:
2083 ret = "shouts 'Fresh blood, just waiting to be spilled!'";
2084 break;
2085 case MS_ENCLAVE:
2086 ret = "shouts 'Security breach!'";
2087 break;
2088 case MS_MUTANT:
2089 ret = "mutters 'Just get close... I'll tear off your legs...'";
2090 break;
2091 case MS_MYTHICALDAWN:
2092 ret = "announces 'I don't fear death.'";
2093 break;
2094 case MS_DREMORA:
2095 ret = "shouts 'You'll be my next trophy, scapegrace!'";
2096 break;
2097 case MS_BOS:
2098 ret = "shouts 'Evil-doer, I shall purge you from this world!'";
2099 break;
2100 case MS_OUTCAST:
2101 ret = "shouts 'What the hell do you think you're doing?!'";
2102 break;
2103 case MS_AMNESIA:
2104 ret = "grumbles 'Hmm, I think I've just been wounded!'";
2105 break;
2106 case MS_SHIVERINGESLES:
2107 ret = "grumbles 'Ich werde den Finduh kalikraken. Ehrlich. Darauf koennt Ihr terraten!'";
2108 break;
2109 case MS_ANOREXIA:
2110 ret = "mutters 'This is all worthless.'";
2111 break;
2112 case MS_BULIMIA:
2113 ret = "growls 'Do that one more time and I'll slit your throat!'";
2114 break;
2115 case MS_BLANKER:
2116 ret = "growls 'Leave me alone or I'll cast destroy armor at you.'";
2117 break;
2118 case MS_CONDESCEND:
2119 ret = "snickers 'Does that little adventurer really think they can match my skill?'";
2120 break;
2121 case MS_MOLEST:
2122 if (flags.female) ret = "snickers 'You really want me to play with the orifice between your legs, huh, girl?'";
2123 else ret = "shouts 'Asshole dude! Leave me the fuck alone!'";
2124 break;
2125 case MS_SHOCKTROOPER:
2126 ret = "says 'dup dup'";
2127 break;
2128 case MS_GAGA:
2129 ret = "shouts 'Did you just assume my gender?'";
2130 break;
2131 case MS_COMMON:
2132 ret = "shouts 'I have been mistreated!'";
2133 break;
2134 case MS_PIRATE:
2135 ret = "shouts 'Hang'em from the yardarm!'";
2136 break;
2137 case MS_SILLY:
2138 ret = "shouts 'Penis masturbation! Titty fuck!'";
2139 break;
2140 case MS_MIDI:
2141 ret = "drums rapidly";
2142 break;
2143 case MS_HERCULES:
2144 ret = "sneers 'If you do that again I'll force you to clean the stables.'";
2145 break;
2146 case MS_BEG:
2147 ret = "sighs 'Beggars always cry...'";
2148 break;
2149 case MS_HIRE:
2150 case MS_ARMORER:
2151 case MS_OMEN:
2152 case MS_NEWS:
2153 case MS_CRYTHROAT:
2154 case MS_HOOT:
2155 case MS_RUSTLE:
2156 case MS_SEMEN:
2157 case MS_SCIENTIST:
2158 case MS_MODALSHOP:
2159 /* todo */
2160 ret = "Unfinished sound effect.";
2161 break;
2163 case MS_SPOILER:
2164 ret = "Buffer overrun detected. NETHACK cannot safely continue execution and needs to close.";
2165 break;
2166 case MS_DEAD:
2167 ret = "mutters 'Oh, if only I could have stayed dead...'";
2168 break;
2169 case MS_TREESQUAD:
2170 ret = "screams 'All activists, protect the trees with your lives!'";
2171 break;
2172 case MS_METALMAFIA:
2173 ret = "shouts 'If you don't give me your metal I'll shoot you with my gun and take it by force!'";
2174 break;
2175 case MS_DEEPSTATE:
2176 ret = "has second thoughts about you";
2177 break;
2178 case MS_SISSY:
2179 ret = "cries 'noooooo i broke a nail!'";
2180 break;
2181 case MS_SING:
2182 ret = "is sad that no one wants to clean the female shoes";
2183 break;
2184 case MS_POMPEJI:
2185 ret = "shouts 'Pompeji!!!'";
2186 break;
2187 case MS_FLUIDATOR:
2188 ret = "bellows 'You are always cursed!'";
2189 break;
2190 case MS_BULLETATOR:
2191 ret = "shouts 'You no-good bastard!'";
2192 break;
2193 case MS_ALLA:
2194 ret = "shouts 'Better stop mistreating me, for you'll not like my counterattack.'";
2195 break;
2196 case MS_POKEDEX:
2197 ret = "looks worriedly at the PokeGear(TM) display";
2198 break;
2199 case MS_BOT:
2200 ret = "drones 'Threat level omega.'";
2201 break;
2202 case MS_APOC:
2203 ret = "mutters 'Everything is falling apart at the seams...'";
2204 break;
2205 case MS_GLYPHS:
2206 ret = "moans 'Why doesn't the glyph work...'";
2207 break;
2208 case MS_ARREST:
2209 ret = "blows a whistle";
2210 aggravate();
2211 break;
2212 case MS_SOLDIER:
2213 ret = "shouts 'Medic!'";
2214 break;
2215 case MS_VAMPIRE:
2216 ret = "groans";
2217 break;
2218 case MS_CUSS:
2219 ret = "grumbles 'If you do that again I'm gonna open a can of whoopass on you...'";
2220 break;
2221 case MS_WHORE:
2222 ret = "exclaims 'Hey! I ain't a slut!'";
2223 break;
2224 case MS_SUPERMAN:
2225 ret = "shouts 'NO! FUCK YOU!!!'";
2226 aggravate();
2227 break;
2228 case MS_FART_QUIET:
2229 case MS_FART_NORMAL:
2230 case MS_FART_LOUD:
2231 ret = "sobs 'This is humiliating...'";
2232 break;
2233 case MS_BOSS:
2234 ret = "shouts 'That's twice you hit me now! One more time and I'll kill you!'";
2235 break;
2236 case MS_SHOE:
2237 ret = "threatens 'If you keep doing that, we'll scratch your legs full length!'";
2238 break;
2239 case MS_STENCH:
2240 ret = "shouts 'That's no way to treat a woman!'";
2241 break;
2242 case MS_CONVERT:
2243 ret = "shouts 'Peygamber bunu hatirlayacak!'";
2244 break;
2245 case MS_HCALIEN:
2246 ret = "strikes fear into your heart with a gaze";
2247 make_feared(HFeared + rnd(10 + (monster_difficulty()) ),TRUE);
2248 break;
2249 default:
2250 ret = (const char*) 0;
2252 return ret;
2255 /* the sounds of distressed pets */
2256 /* in extern.h: #define whimper(mon) pet_distress((mon),1) */
2258 static
2259 const char *
2260 whimper_sound(mtmp)
2261 register struct monst *mtmp;
2263 const char *ret;
2265 switch (mtmp->data->msound) {
2266 case MS_MEW:
2267 case MS_GROWL:
2268 case MS_GRAKA:
2269 case MS_TEMPER:
2270 case MS_TRIP:
2271 ret = "whimpers";
2272 break;
2273 case MS_BARK:
2274 ret = "whines";
2275 break;
2276 case MS_SQEEK:
2277 ret = "squeals";
2278 break;
2279 case MS_SHRIEK:
2280 ret = "shrieks fearfully";
2281 aggravate();
2282 break;
2283 case MS_BONES:
2284 ret = "claps";
2285 break;
2286 case MS_LAUGH:
2287 ret = "laughs quietly";
2288 break;
2289 case MS_MUMBLE:
2290 ret = "mumbles in anticipation of danger";
2291 break;
2292 case MS_CASINO:
2293 ret = "warns you that the mafia is coming";
2294 break;
2295 case MS_GIBBERISH:
2296 pline("%s", generate_garbage_string());
2297 break;
2298 case MS_SOCKS:
2299 ret = "waggles warningly";
2300 break;
2301 case MS_PANTS:
2302 ret = "swerves back and forth";
2303 break;
2304 case MS_HANDY:
2305 ret = "briefly interrupts the call and shouts 'CAREFUL!'";
2306 break;
2307 case MS_CAR:
2308 ret = "alarm installation goes off!";
2309 aggravate();
2310 break;
2311 case MS_JAPANESE:
2312 ret = "instructs 'Sono pureto kara hanarete kudasai, sore wa jaakuna doragon ni yotte settei sa reta wanadesu.'";
2313 break;
2314 case MS_SOVIET:
2315 ret = "laughs 'Vy popadete v lovushku i, nakonets, zakonchite igru, i vy, kak sleduyet, igrayete v takuyu ??der'movuyu igru.'";
2316 break;
2317 case MS_SNORE:
2318 ret = "opens the eyes, looks worriedly at you, and dozes off again";
2319 break;
2320 case MS_PHOTO:
2321 ret = "takes a photo of the nearby dungeon floor for some reason";
2322 break;
2323 case MS_REPAIR:
2324 ret = "makes a motion towards the floor";
2325 break;
2326 case MS_DRUGS:
2327 ret = "screams 'Damn! It's a trap set by the cops!'";
2328 break;
2329 case MS_COMBAT:
2330 ret = "shouts 'Search! There's a trap nearby! Use the search command!'";
2331 break;
2332 case MS_MUTE:
2333 ret = "exhales thrice in a row, while gesturing at the floor";
2334 break;
2335 case MS_CORONA:
2336 ret = "shouts 'Let's go somewhere else, the corona wind is bad around here!'";
2337 break;
2338 case MS_TRUMPET:
2339 ret = "trumpets scaredly";
2340 break;
2341 case MS_PAIN:
2342 ret = "shouts 'Ack! It's a trap!'";
2343 break;
2344 case MS_BRAG:
2345 ret = "laughs 'Bet I'll find that trap before you do?'";
2346 break;
2347 case MS_PRINCESSLEIA:
2348 ret = "whispers 'I sense a trap. Please be careful, don't step into it.'";
2349 break;
2350 case MS_LIEDER:
2351 ret = "says 'The nemesis put a trap over there! Don't trigger it!'";
2352 break;
2353 case MS_GAARDIEN:
2354 ret = "tells you 'I remember that there's a trap here.'";
2355 break;
2356 case MS_MISSING:
2357 ret = "does not make a sound when distressed";
2358 break;
2359 case MS_SELFHARM:
2360 ret = "suddenly seems very eager to take one more step!";
2361 break;
2362 case MS_CLOCK:
2363 ret = "notices that the clock's alarm has gone off!";
2364 break;
2365 case MS_OHGOD:
2366 ret = "shouts 'Oh god, a trap!'";
2367 break;
2368 case MS_WOLLOH:
2369 ret = "shouts 'Wolloh, watch out, wolloh!'";
2370 break;
2371 case MS_CODE:
2372 ret = "is trying hard to avoid losing the code";
2373 break;
2374 case MS_BARBER:
2375 ret = "says 'Watch out, the overseer has laid a trap!'";
2376 break;
2377 case MS_AREOLA:
2378 ret = "is staring at you in expectation";
2379 break;
2380 case MS_STABILIZE:
2381 ret = "opens the abilities menu and searches for the one that disarms traps";
2382 break;
2383 case MS_ESCAPE:
2384 ret = "wonders whether there's an escape path";
2385 break;
2386 case MS_FEARHARE:
2387 ret = "screams 'Get me away from here, I don't have a good feeling about this place!'";
2388 break;
2389 case MS_OE:
2390 ret = "feels like there's a beartrap or landmine nearby!";
2391 break;
2392 case MS_BAN:
2393 ret = "says 'Are you sure we should stay here?'";
2394 break;
2395 case MS_TALONCOMPANY:
2396 ret = "shouts 'Take cover! Ass grenade!'";
2397 break;
2398 case MS_REGULATOR:
2399 ret = "shouts 'Grenade!'";
2400 break;
2401 case MS_RAIDER:
2402 ret = "screams 'Oh, green nines!'";
2403 break;
2404 case MS_ENCLAVE:
2405 ret = "announces 'Explosion imminent!'";
2406 break;
2407 case MS_MUTANT:
2408 ret = "announces 'Hot potato!'";
2409 break;
2410 case MS_MYTHICALDAWN:
2411 ret = "announces 'Only the chosen ones will survive purgatory.'";
2412 break;
2413 case MS_DREMORA:
2414 ret = "announces 'Be quick, mortal.'";
2415 break;
2416 case MS_BOS:
2417 ret = "announces 'Be careful, there may be traps.'";
2418 break;
2419 case MS_OUTCAST:
2420 ret = "shouts 'Watch out, they placed a bomb!'";
2421 break;
2422 case MS_AMNESIA:
2423 ret = "doesn't seem to remember whether there were traps here.";
2424 break;
2425 case MS_SHIVERINGESLES:
2426 ret = "says 'Gorbeln. Koennt Ihr sie nicht gorbeln hoeren?'";
2427 break;
2428 case MS_ANOREXIA:
2429 ret = "says 'Stay away from the food.'";
2430 break;
2431 case MS_BULIMIA:
2432 ret = "says 'Don't step on that plate!'";
2433 break;
2434 case MS_BLANKER:
2435 ret = "shouts 'There, an anti-magic trap!'";
2436 break;
2437 case MS_CONDESCEND:
2438 ret = "whispers 'Watch out, that one floor tile is a different shade of color from the rest.'";
2439 break;
2440 case MS_MOLEST:
2441 if (flags.female) ret = "laughs 'Please, girl, step into the insemination trap for me!'";
2442 else ret = "shouts 'Watch out man, a trap!'";
2443 break;
2444 case MS_SHOCKTROOPER:
2445 ret = "says 'dup blis dup'";
2446 break;
2447 case MS_GAGA:
2448 ret = "mutters 'Some bigot must have placed a trap there!'";
2449 break;
2450 case MS_COMMON:
2451 ret = "says 'I sense a trap nearby.'";
2452 break;
2453 case MS_PIRATE:
2454 ret = "says 'Avast, they runnin' a rig on ye!'";
2455 break;
2456 case MS_SILLY:
2457 ret = "grins 'I see an angular sign and a socketed angular sign.'";
2458 break;
2459 case MS_MIDI:
2460 ret = "pings with an annoyingly high pitch";
2461 break;
2462 case MS_HERCULES:
2463 ret = "remarks 'This must be another one of those divine tasks.'";
2464 break;
2465 case MS_BEG:
2466 ret = "shouts 'Someone wants to kill me!'";
2467 break;
2468 case MS_HIRE:
2469 case MS_ARMORER:
2470 case MS_OMEN:
2471 case MS_NEWS:
2472 case MS_CRYTHROAT:
2473 case MS_HOOT:
2474 case MS_RUSTLE:
2475 case MS_SEMEN:
2476 case MS_SCIENTIST:
2477 case MS_MODALSHOP:
2478 /* todo */
2479 ret = "Unfinished sound effect.";
2480 break;
2482 case MS_SPOILER:
2483 ret = "An error has occurred in your application. If you choose Close, NETHACK will close. If you choose Ignore, you should save your work in a new file.";
2484 break;
2485 case MS_DEAD:
2486 ret = "whimpers 'Why do you have to lead me into such dangerous areas?'";
2487 break;
2488 case MS_TREESQUAD:
2489 ret = "shouts 'Attention! Our enemies are up to something devious!'";
2490 break;
2491 case MS_METALMAFIA:
2492 ret = "contemplates 'Hmm... if I just pull that hunk of metal out of the ground...'";
2493 break;
2494 case MS_DEEPSTATE:
2495 ret = "is pointing a finger in a certain direction";
2496 break;
2497 case MS_SISSY:
2498 ret = "whimpers 'arrrrgh we will all die!'";
2499 break;
2500 case MS_SING:
2501 ret = "seems happy for some reason";
2502 break;
2503 case MS_POMPEJI:
2504 ret = "points a finger and shouts 'Pompeji!'";
2505 break;
2506 case MS_FLUIDATOR:
2507 ret = "remarks 'Pass up, falling!'";
2508 break;
2509 case MS_BULLETATOR:
2510 ret = "shouts 'Watch for the traps!'";
2511 break;
2512 case MS_ALLA:
2513 ret = "wordlessly gazes at you";
2514 break;
2515 case MS_POKEDEX:
2516 ret = "shouts 'A game bug! Watch out, don't step on that tile next to you or the game will glitch out and delete your last pokemon!'";
2517 break;
2518 case MS_BOT:
2519 ret = "drones 'Area is scanned for hostile threats!'";
2520 break;
2521 case MS_APOC:
2522 ret = "shouts 'The plunderers are trying to lead us into a trap!'";
2523 break;
2524 case MS_GLYPHS:
2525 ret = "suggests you to use a trap detection glyph";
2526 break;
2527 case MS_ARREST:
2528 ret = "calls for reinforcements";
2529 break;
2530 case MS_SOLDIER:
2531 ret = "whispers 'Careful! It's an ambush!'";
2532 break;
2533 case MS_CUSS:
2534 ret = "shouts 'Shit! Danger!'";
2535 break;
2536 case MS_WHORE:
2537 ret = "moans 'Those filthy customers keep trying to beat me up!'";
2538 break;
2539 case MS_FART_QUIET:
2540 case MS_FART_NORMAL:
2541 case MS_FART_LOUD:
2542 ret = "advises you to be careful";
2543 break;
2544 case MS_BOSS:
2545 ret = "whispers 'Careful, I know there's traps here. Let's try to avoid them.'";
2546 break;
2547 case MS_SHOE:
2548 ret = "shouts 'Stop! There's a heap of shit over there! Make sure we don't step into it!'";
2549 break;
2550 case MS_STENCH:
2551 ret = "asks you to be careful";
2552 break;
2553 case MS_CONVERT:
2554 ret = "whispers 'Kafirler goelgede saklaniyor, ama Allah onlan yok edecek.'";
2555 break;
2556 case MS_HCALIEN:
2557 ret = "makes a pointing gesture";
2558 break;
2559 default:
2560 ret = (const char *)0;
2562 return ret;
2565 /* pet makes "I'm hungry" noises */
2566 void
2567 beg(mtmp)
2568 register struct monst *mtmp;
2570 if (mtmp->msleeping || !mtmp->mcanmove ||
2571 !(carnivorous(mtmp->data) || herbivorous(mtmp->data) || metallivorous(mtmp->data) || mtmp->egotype_lithivore || mtmp->egotype_metallivore || mtmp->egotype_allivore || lithivorous(mtmp->data)))
2572 return;
2574 /* presumably nearness and soundok checks have already been made */
2575 if (!is_silent(mtmp->data) && mtmp->data->msound <= MS_ANIMAL)
2576 (void) domonnoise(mtmp);
2577 else if (mtmp->data->msound >= MS_HUMANOID) {
2578 if (!canspotmon(mtmp) && !(mtmp->data->msound == MS_DEEPSTATE) && !(mtmp->egotype_deepstatemember))
2579 map_invisible(mtmp->mx, mtmp->my);
2580 (void) domonnoise(mtmp); /* "I'm hungry" for MS_HUMANOID but different for others --Amy */
2584 static int
2585 domonnoise(mtmp)
2586 register struct monst *mtmp;
2588 register const char *pline_msg = 0, /* Monnam(mtmp) will be prepended */
2589 *verbl_msg = 0; /* verbalize() */
2590 struct permonst *ptr = mtmp->data;
2591 char verbuf[BUFSZ];
2592 char buf[BUFSZ];
2594 int armpro, armprolimit;
2596 /* monster should make hungry noises only if it actually has to eat --Amy */
2597 boolean hastoeat = TRUE;
2598 if (!carnivorous(mtmp->data) && !herbivorous(mtmp->data) && !metallivorous(mtmp->data) && !mtmp->egotype_lithivore && !mtmp->egotype_metallivore && !mtmp->egotype_allivore && !lithivorous(mtmp->data)) hastoeat = FALSE;
2600 if (mtmp->egotype_farter) {
2602 if (uleft && objects[(uleft)->otyp].oc_material == MT_INKA) {
2603 verbalize("Let me take off that ring for you.");
2604 remove_worn_item(uleft, TRUE);
2606 if (uright && objects[(uright)->otyp].oc_material == MT_INKA) {
2607 verbalize("Let me take off that ring for you.");
2608 remove_worn_item(uright, TRUE);
2611 pline("You gently caress %s's %s butt using %s %s.", mon_nam(mtmp), mtmp->female ? "sexy" : "ugly", !rn2(3) ? "both your left and right" : rn2(2) ? "your left" : "your right", body_part(HAND) );
2612 if (mtmp->mtame) {
2613 pline("%s seems to love you even more than before.", Monnam(mtmp) );
2614 if (mtmp->mtame < 30) mtmp->mtame++;
2615 if (EDOG(mtmp)->abuse) EDOG(mtmp)->abuse--;
2617 else if (mtmp->mpeaceful) {
2618 pline("%s seems to like being felt up by you.", Monnam(mtmp) );
2620 else if (uarmf && uarmf->oartifact == ART_SPEAK_TO_OJ && !mtmp->mfrenzied) {
2621 pline("%s is charmed by your stroking units.", Monnam(mtmp) );
2622 mtmp->mpeaceful = 1;
2624 else if (uarmg && uarmg->oartifact == ART_GROPESTROKER && !mtmp->mfrenzied && !rn2(20)) {
2625 if (rn2(6)) {
2626 pline("%s is charmed by your stroking units.", Monnam(mtmp) );
2627 mtmp->mpeaceful = 1;
2628 } else {
2629 pline("%s is really angry and calls you a sexual predator.", Monnam(mtmp) );
2630 mtmp->mfrenzied = 1;
2633 else {
2634 pline("%s seems to be even more angry at you than before.", Monnam(mtmp) );
2636 m_respond(mtmp);
2639 /* presumably nearness and sleep checks have already been made */
2640 if (!flags.soundok) return(0);
2642 if (ptr == &mons[PM_FJORDE]) verbalize("I can't help it, I really consider fish to be the most beautiful creatures in existence."); /* must do that here because they're "silent" */
2644 if (is_silent(ptr)) return(0);
2646 /* Make sure its your role's quest quardian; adjust if not */
2647 if (ptr->msound == MS_GUARDIAN && ptr != &mons[urole.guardnum]) {
2648 int mndx = monsndx(ptr);
2649 ptr = &mons[genus(mndx,1)];
2652 /* be sure to do this before talking; the monster might teleport away, in
2653 * which case we want to check its pre-teleport position
2655 if (!canspotmon(mtmp) && !(mtmp->data->msound == MS_DEEPSTATE) && !(mtmp->egotype_deepstatemember))
2656 map_invisible(mtmp->mx, mtmp->my);
2658 if (ptr == &mons[PM_DONALD_TRUMP]) { /* idea by Crawldragon, actual messages by Amy */
2660 if (issoviet) verbalize("Of course Russia was not involved in the presidential election in any way. That's just fake news.");
2661 else pline("Make America GREAT again!");
2664 if (ptr == &mons[PM_EMERA]) verbalize("HATE! HATE! HATE!");
2666 switch (ptr->msound) {
2667 case MS_ORACLE:
2668 return doconsult(mtmp);
2669 case MS_PRIEST:
2670 priest_talk(mtmp);
2671 break;
2672 case MS_LEADER:
2673 case MS_NEMESIS:
2674 case MS_GUARDIAN:
2675 quest_chat(mtmp);
2676 break;
2677 case MS_SELL: /* pitch, pay, total */
2679 if (mtmp->data == &mons[PM_BAKER]) {
2680 verbalize("Want a square meal? (100 zorkmids)");
2681 if (yn("Accept the offer?") == 'y') {
2682 if (u.ugold < 100) {
2683 You("check your wallet and shake your head.");
2684 } else {
2685 u.ugold -= 100;
2686 lesshungry(100);
2687 pline("The taste is not bad.");
2692 if (mtmp->data == &mons[PM_BERTIE_BOTT] || mtmp->data == &mons[PM_DIAGON_ALLEY_VENDOR]) {
2693 verbalize("Want some of my All-Flavor Beans? Just 2000 zorkmids!");
2694 if (yn("Accept the offer?") == 'y') {
2695 if (u.ugold < 2000) {
2696 You("check your wallet and shake your head.");
2697 } else {
2698 struct obj *udrink;
2699 u.ugold -= 2000;
2700 udrink = mkobj(POTION_CLASS, TRUE, FALSE);
2701 if (udrink) {
2702 dropy(udrink);
2703 stackobj(udrink);
2704 verbalize("Enjoy! I've placed it on the ground. It'll certainly taste like earthworm or vomit, hahaha!");
2705 } else {
2706 u.ugold += 2000;
2707 verbalize("Hmm, I must have misplaced it. Try again later. Here you have your money back.");
2714 if (mtmp->data == &mons[PM_ELONA_TRADER]) {
2715 verbalize("Do you want to trade 2000 zorkmids for a random item?");
2716 if (yn("Accept the offer?") == 'y') {
2717 if (u.ugold < 2000) {
2718 You("check your wallet and shake your head.");
2719 } else {
2720 struct obj *udrink;
2721 u.ugold -= 2000;
2722 udrink = mkobj(RANDOM_CLASS, TRUE, FALSE);
2723 if (udrink) {
2724 dropy(udrink);
2725 stackobj(udrink);
2726 verbalize("Alright, check the ground below you!");
2727 } else {
2728 u.ugold += 1800;
2729 verbalize("Huh, it seems that there's some thief around who stole the item just as you went to pick it up! I'll give you a refund, minus an administration fee of 200 zorkmids of course.");
2735 if (mtmp->data == &mons[PM_ELONA_INNKEEPER]) {
2736 verbalize("Hey, do you want a refreshing drink? Just 1000 zorkmids!");
2737 if (yn("Accept the offer?") == 'y') {
2738 if (u.ugold < 1000) {
2739 You("check your wallet and shake your head.");
2740 } else {
2741 struct obj *udrink;
2742 u.ugold -= 1000;
2743 udrink = mksobj(POT_BOOZE, TRUE, FALSE, FALSE);
2744 if (udrink) {
2745 udrink->known = udrink->dknown = 1;
2746 udrink->finalcancel = 1;
2747 dropy(udrink);
2748 stackobj(udrink);
2749 verbalize("There you go, I placed it at your feet!");
2750 } else {
2751 verbalize("Oh sorry, we're out of stock.");
2752 u.ugold += 1000;
2759 shk_chat(mtmp);
2760 break;
2761 case MS_VAMPIRE:
2763 /* vampire messages are varied by tameness, peacefulness, and time of night */
2764 boolean isnight = night();
2765 boolean kindred = maybe_polyd(u.umonnum == PM_VAMPIRE ||
2766 u.umonnum == PM_VAMPIRE_LORD ||
2767 u.umonnum == PM_VAMPIRE_MAGE,
2768 Race_if(PM_VAMPIRE));
2769 boolean nightchild = (Upolyd && (u.umonnum == PM_WOLF ||
2770 u.umonnum == PM_SHADOW_WOLF ||
2771 u.umonnum == PM_MIST_WOLF ||
2772 u.umonnum == PM_WINTER_WOLF ||
2773 u.umonnum == PM_WINTER_WOLF_CUB));
2774 const char *racenoun = (flags.female && urace.individual.f) ?
2775 urace.individual.f : (urace.individual.m) ?
2776 urace.individual.m : urace.noun;
2778 if (mtmp->mtame) {
2779 if (mtmp->mhp < mtmp->mhpmax/3) {
2780 verbl_msg = "I didn't get a drink in a long time...";
2781 } else if (kindred) {
2782 sprintf(verbuf, "Good %s to you Master%s",
2783 isnight ? "evening" : "day",
2784 isnight ? "!" : ". Why do we not rest?");
2785 verbl_msg = verbuf;
2786 } else {
2787 sprintf(verbuf,"%s%s",
2788 nightchild ? "Child of the night, " : "",
2789 midnight() ?
2790 "I can stand this craving no longer!" :
2791 isnight ?
2792 "I beg you, help me satisfy this growing craving!" :
2793 "I find myself growing a little weary.");
2794 verbl_msg = verbuf;
2796 } else if (mtmp->mpeaceful) {
2797 if (kindred && isnight) {
2798 sprintf(verbuf, "Good feeding %s!",
2799 flags.female ? "sister" : "brother");
2800 verbl_msg = verbuf;
2801 } else if (nightchild && isnight) {
2802 sprintf(verbuf,
2803 "How nice to hear you, child of the night!");
2804 verbl_msg = verbuf;
2805 } else
2806 verbl_msg = "I only drink... potions.";
2807 } else {
2808 int vampindex;
2809 static const char * const vampmsg[] = {
2810 /* These first two (0 and 1) are specially handled below */
2811 "I vant to suck your %s!",
2812 "I vill come after %s without regret!",
2813 /* other famous vampire quotes can follow here if desired */
2815 if (kindred)
2816 verbl_msg = "This is my hunting ground that you dare to prowl!";
2817 else if (youmonst.data == &mons[PM_SILVER_DRAGON] ||
2818 youmonst.data == &mons[PM_BABY_SILVER_DRAGON]) {
2819 /* Silver dragons are silver in color, not made of silver */
2820 sprintf(verbuf, "%s! Your silver sheen does not frighten me!",
2821 youmonst.data == &mons[PM_SILVER_DRAGON] ?
2822 "Fool" : "Young Fool");
2823 verbl_msg = verbuf;
2824 } else {
2825 vampindex = rn2(SIZE(vampmsg));
2826 if (vampindex == 0) {
2827 sprintf(verbuf, vampmsg[vampindex], body_part(BLOOD));
2828 verbl_msg = verbuf;
2829 } else if (vampindex == 1) {
2830 sprintf(verbuf, vampmsg[vampindex],
2831 (Upolyd && !missingnoprotect) ? an(mons[u.umonnum].mname) : an(racenoun));
2832 verbl_msg = verbuf;
2833 } else
2834 verbl_msg = vampmsg[vampindex];
2838 break;
2839 case MS_WERE:
2840 if (flags.moonphase == FULL_MOON && (night() ^ !rn2(13))) {
2841 pline("%s throws back %s head and lets out a blood curdling %s!",
2842 Monnam(mtmp), mhis(mtmp),
2843 ptr == &mons[PM_HUMAN_WERERAT] ? "shriek" : "howl");
2844 wake_nearto(mtmp->mx, mtmp->my, 11*11);
2845 } else
2846 pline_msg =
2847 "whispers inaudibly. All you can make out is \"moon\".";
2848 break;
2849 case MS_BARK:
2850 if (flags.moonphase == FULL_MOON && night()) {
2851 pline_msg = "howls.";
2852 } else if (mtmp->mpeaceful) {
2853 if (mtmp->mtame && (mtmp->mconf || mtmp->mflee || mtmp->mtrapped || (moves > EDOG(mtmp)->hungrytime && hastoeat) || mtmp->mtame < 5))
2854 pline_msg = "whines.";
2855 else if (mtmp->mtame && hastoeat && (EDOG(mtmp)->hungrytime > (moves + 1000)))
2856 pline_msg = "yips.";
2857 else {
2858 if (mtmp->data != &mons[PM_DINGO]) /* dingos do not actually bark */
2859 pline_msg = "barks.";
2861 } else {
2862 pline_msg = "growls.";
2864 break;
2865 case MS_MEW:
2866 if (mtmp->mtame) {
2867 if (mtmp->mconf || mtmp->mflee || mtmp->mtrapped ||
2868 mtmp->mtame < 5)
2869 pline_msg = "yowls.";
2870 else if (moves > EDOG(mtmp)->hungrytime && hastoeat)
2871 pline_msg = "meows.";
2872 else if ((EDOG(mtmp)->hungrytime > (moves + 1000)) && hastoeat)
2873 pline_msg = "purrs.";
2874 else
2875 pline_msg = "mews.";
2876 break;
2877 } /* else FALLTHRU */
2878 case MS_GROWL:
2879 if (mtmp->mtame) {
2880 if (mtmp->mhp < mtmp->mhpmax/3)
2881 pline_msg = "lets out a tormented snarl.";
2882 else if (mtmp->mtame && !mtmp->isminion && hastoeat && moves > EDOG(mtmp)->hungrytime)
2883 pline_msg = "growls hungrily.";
2884 else if (mtmp->mconf || mtmp->mflee || mtmp->mtrapped)
2885 pline_msg = "whines.";
2886 else if (mtmp->mtame && hastoeat && (EDOG(mtmp)->hungrytime > (moves + 1000)))
2887 pline_msg = "yips.";
2888 else
2889 pline_msg = "snarls.";
2891 else pline_msg = mtmp->mpeaceful ? "snarls." : "growls!";
2892 break;
2893 case MS_ROAR:
2894 if (mtmp->mtame) {
2895 if (mtmp->mhp < mtmp->mhpmax/3)
2896 pline_msg = "lets out a tormented snarl.";
2897 else if (mtmp->mtame && !mtmp->isminion && hastoeat && moves > EDOG(mtmp)->hungrytime)
2898 pline_msg = "emits a faint roar.";
2899 else
2900 pline_msg = (ptr == &mons[PM_SYSTEM_FAILURE]) ? "says in a monotone voice: 'Pieteikumu kluda.'" : "snarls.";
2902 else pline_msg = (ptr == &mons[PM_SYSTEM_FAILURE]) ? "says in a monotone voice: 'Pieteikumu kluda.'" : mtmp->mpeaceful ? "snarls." : "roars!";
2903 break;
2904 case MS_SQEEK:
2905 if (mtmp->mtame) {
2906 if (mtmp->mhp < mtmp->mhpmax/3)
2907 pline_msg = "squeaks in agony.";
2908 else if (mtmp->mtame && !mtmp->isminion && hastoeat && moves > EDOG(mtmp)->hungrytime)
2909 pline_msg = "emits a high squeak.";
2910 else if (mtmp->mconf || mtmp->mflee || mtmp->mtrapped)
2911 pline_msg = "emits a terrified squeak.";
2912 else if (mtmp->mtame && EDOG(mtmp)->hungrytime > moves + 1000)
2913 pline_msg = "squeaks joyfully.";
2914 else
2915 pline_msg = "squeaks.";
2917 else pline_msg = "squeaks.";
2918 break;
2919 case MS_PARROT:
2921 if (mtmp->mtame && mtmp->mhp < mtmp->mhpmax/3) {
2922 pline_msg = "says 'Help! Police!'";
2923 } else if (mtmp->mtame && !mtmp->isminion && hastoeat && moves > EDOG(mtmp)->hungrytime) {
2924 pline_msg = "says 'Pass me the damn food already!'";
2925 } else switch (rn2(8)) {
2926 default:
2927 case 0:
2928 pline_msg = "squaarks louldly!";
2929 break;
2930 case 1:
2931 pline_msg = "says 'Polly want a lembas wafer!'";
2932 break;
2933 case 2:
2934 pline_msg = "says 'Nobody expects the Spanish Inquisition!'";
2935 break;
2936 case 3:
2937 pline_msg = "says 'Who's a good boy, then?'";
2938 break;
2939 case 4:
2940 pline_msg = "says 'Show us yer knickers!'";
2941 break;
2942 case 5:
2943 pline_msg = "says 'You'll never make it!'";
2944 break;
2945 case 6:
2946 pline_msg = "whistles suggestively!";
2947 break;
2948 case 7:
2949 pline_msg = "says 'What sort of a sword do you call that!'";
2950 break;
2952 break;
2953 case MS_SQAWK:
2954 if (mtmp->mtame) {
2955 if (mtmp->mhp < mtmp->mhpmax/3)
2956 pline_msg = "squawks in agony.";
2957 else if (mtmp->mtame && !mtmp->isminion && hastoeat && moves > EDOG(mtmp)->hungrytime)
2958 pline_msg = "makes a distressed squawk.";
2959 else if (ptr == &mons[PM_RAVEN] && !mtmp->mpeaceful)
2960 verbl_msg = "Nevermore!";
2961 else
2962 pline_msg = "squawks.";
2964 else if (ptr == &mons[PM_RAVEN] && !mtmp->mpeaceful)
2965 verbl_msg = "Nevermore!";
2966 else
2967 pline_msg = "squawks.";
2968 break;
2969 case MS_HISS:
2970 if (!mtmp->mpeaceful)
2971 pline_msg = "hisses!";
2972 else if (mtmp->mtame) {
2973 if (mtmp->mhp < mtmp->mhpmax/3)
2974 pline_msg = "hisses angrily.";
2975 else if (mtmp->mtame && !mtmp->isminion && hastoeat && moves > EDOG(mtmp)->hungrytime)
2976 pline_msg = "tries to snap at your finger.";
2977 else if (mtmp->mconf || mtmp->mflee || mtmp->mtrapped)
2978 pline_msg = "makes a confused hiss.";
2979 else if (mtmp->mtame && hastoeat && (EDOG(mtmp)->hungrytime > (moves + 1000)))
2980 pline_msg = "hums.";
2981 else
2982 pline_msg = "hisses peacefully.";
2984 else return 0; /* no sound */
2985 break;
2986 case MS_BUZZ:
2987 if (mtmp->mtame) {
2988 if (mtmp->mhp < mtmp->mhpmax/5)
2989 pline_msg = "displays a blue screen of death!";
2990 else if (mtmp->mhp < mtmp->mhpmax/3)
2991 pline_msg = "displays an error message: 'General protection fault'...";
2992 else if (mtmp->mtame && !mtmp->isminion && hastoeat && moves > EDOG(mtmp)->hungrytime)
2993 pline_msg = "is waiting for data input...";
2994 else if (mtmp->mconf || mtmp->mflee || mtmp->mtrapped)
2995 pline_msg = "makes a confused droning sound.";
2996 else
2997 pline_msg = "drones.";
2999 else pline_msg = mtmp->mpeaceful ? "drones." : "buzzes angrily.";
3000 break;
3001 case MS_GRUNT: /* YANI by ShivanHunter */
3002 if (mtmp->mtame) {
3003 if (mtmp->data->mlet == S_TROLL) {
3004 if (mtmp->mhp < mtmp->mhpmax/3)
3005 pline_msg = "shouts: 'Curse those right-wing extremists!'";
3006 else if (mtmp->mtame && !mtmp->isminion && hastoeat && moves > EDOG(mtmp)->hungrytime)
3007 pline_msg = "shouts: 'Does this stinking hole not have a restaurant??? '";
3008 else if (mtmp->mconf || mtmp->mflee || mtmp->mtrapped)
3009 pline_msg = "shouts: 'rn2(P = NP) can't be false because we didn't see any rn2(0) impossibles, which proves that P = NP!'";
3010 else
3011 pline_msg = "shouts: 'VI > EMACS!!!!!'";
3013 } else {
3014 if (mtmp->mhp < mtmp->mhpmax/3)
3015 pline_msg = "seems to be wounded.";
3016 else if (mtmp->mtame && !mtmp->isminion && hastoeat && moves > EDOG(mtmp)->hungrytime)
3017 pline_msg = "is hungry.";
3018 else if (mtmp->mconf || mtmp->mflee || mtmp->mtrapped)
3019 pline_msg = "grovels.";
3020 else
3021 pline_msg = "grunts.";
3024 else pline_msg = (mtmp->data->mlet == S_TROLL) ? "shouts: 'VI > EMACS!!!!!'" : "grunts.";
3025 break;
3026 case MS_NEIGH:
3027 if (mtmp->mtame && mtmp->mhp < mtmp->mhpmax/3)
3028 pline_msg = "whines.";
3029 else if (mtmp->mtame < 5)
3030 pline_msg = "neighs.";
3031 else if (hastoeat && moves > EDOG(mtmp)->hungrytime)
3032 pline_msg = "whinnies.";
3033 else
3034 pline_msg = "whickers.";
3035 break;
3036 case MS_WAIL:
3037 if (mtmp->mtame) {
3038 if (mtmp->mhp < mtmp->mhpmax/3)
3039 pline_msg = "seems about to faint.";
3040 else
3041 pline_msg = "wails mournfully.";
3043 else pline_msg = "wails mournfully.";
3044 break;
3045 case MS_GURGLE:
3046 if (mtmp->mtame) {
3047 if (mtmp->mhp < mtmp->mhpmax/3)
3048 pline_msg = "gurgles loudly.";
3049 else
3050 pline_msg = "gurgles.";
3052 else pline_msg = "gurgles.";
3053 break;
3054 case MS_BURBLE:
3055 if (mtmp->mtame) {
3056 if (mtmp->mhp < mtmp->mhpmax/4)
3057 pline_msg = "makes a frightened burble.";
3058 else
3059 pline_msg = "burbles.";
3061 else pline_msg = "burbles.";
3062 break;
3063 case MS_SHRIEK:
3064 if (mtmp->mtame) {
3065 if (mtmp->mhp < mtmp->mhpmax/3)
3066 pline_msg = "emits a faint shriek.";
3067 else
3068 pline_msg = "shrieks.";
3069 aggravate();
3071 else {
3072 pline_msg = "shrieks.";
3073 aggravate();
3075 break;
3076 case MS_FART_QUIET:
3077 case MS_FART_NORMAL:
3078 case MS_FART_LOUD:
3080 if (uleft && objects[(uleft)->otyp].oc_material == MT_INKA) {
3081 verbalize("Let me take off that ring for you.");
3082 remove_worn_item(uleft, TRUE);
3084 if (uright && objects[(uright)->otyp].oc_material == MT_INKA) {
3085 verbalize("Let me take off that ring for you.");
3086 remove_worn_item(uright, TRUE);
3089 if (uarmf && uarmf->oartifact == ART_ELENA_S_REWARD && quest_status.killed_nemesis && mtmp->data->msound == MS_FART_NORMAL && !mtmp->mpeaceful && !mtmp->mtame && !mtmp->mfrenzied) {
3090 mtmp->mpeaceful = TRUE;
3091 verbalize("You've won, so I'll be at your service...");
3094 pline("You gently caress %s's %s butt using %s %s.", mon_nam(mtmp), mtmp->female ? "sexy" : "ugly", !rn2(3) ? "both your left and right" : rn2(2) ? "your left" : "your right", body_part(HAND) );
3096 if (uarmu && uarmu->oartifact == ART_SUE_LYN_S_SEX_GAME && !mtmp->mpeaceful && !mtmp->mfrenzied) {
3097 mtmp->mpeaceful = TRUE;
3100 if (mtmp->mtame) {
3102 if (mtmp->mhp < mtmp->mhpmax/3) {
3103 verbl_msg = "Please don't let me die!";
3104 break;
3105 } else if (mtmp->mtame && !mtmp->isminion && hastoeat && moves > EDOG(mtmp)->hungrytime) {
3106 verbl_msg = "I haven't eaten in a while. Please bring me some chicken meat garnished with pepperoni.";
3107 break;
3108 } else {
3109 pline("%s seems to love you even more than before.", Monnam(mtmp) );
3110 if (mtmp->mtame < 30) mtmp->mtame++;
3113 else if (mtmp->mpeaceful) {
3114 pline("%s seems to like being felt up by you.", Monnam(mtmp) );
3116 else if (uarmf && uarmf->oartifact == ART_SPEAK_TO_OJ && !mtmp->mfrenzied) {
3117 pline("%s is charmed by your stroking units.", Monnam(mtmp) );
3118 mtmp->mpeaceful = 1;
3120 else if (uarmg && uarmg->oartifact == ART_GROPESTROKER && !mtmp->mfrenzied && !rn2(20)) {
3121 if (rn2(6)) {
3122 pline("%s is charmed by your stroking units.", Monnam(mtmp) );
3123 mtmp->mpeaceful = 1;
3124 } else {
3125 pline("%s is really angry and calls you a sexual predator.", Monnam(mtmp) );
3126 mtmp->mfrenzied = 1;
3129 else if (FemtrapActiveSueLyn && mtmp->female && !mtmp->mfrenzied && mtmp->data->msound == MS_FART_NORMAL) {
3130 if (!rn2(20)) {
3131 pline("%s is satisfied by your caressing touch.", Monnam(mtmp) );
3132 mtmp->mpeaceful = TRUE;
3133 } else {
3134 pline("%s demands that you continue stroking %s butt!", Monnam(mtmp), mhis(mtmp) );
3137 else {
3138 pline("%s seems to be even more angry at you than before.", Monnam(mtmp) );
3140 m_respond(mtmp);
3142 if (uarmu && uarmu->oartifact == ART_SUE_LYN_S_SEX_GAME && mtmp->mpeaceful && !mtmp->mfrenzied && !mtmp->mtame && (mtmp->m_lev < 1 || (u.ugold >= (mtmp->m_lev * 100))) ) {
3143 pline("%s offers to join you for %d zorkmids.", Monnam(mtmp), (mtmp->m_lev < 1) ? 0 : (mtmp->m_lev * 100));
3144 if (yn("Accept the offer?") == 'y') {
3145 if (mtmp->m_lev > 0) u.ugold -= (mtmp->m_lev * 100);
3146 struct monst *suepet;
3147 suepet = tamedog(mtmp, (struct obj *) 0, TRUE);
3148 if (suepet) mtmp = suepet;
3149 if (mtmp) verbalize("You really caressed my butt cheeks so beautifully, I think I'm in love with you!");
3150 else impossible("suepet was tamed but doesn't exist now??");
3155 break;
3156 case MS_IMITATE:
3157 if (mtmp->mtame) {
3158 if (mtmp->mhp < mtmp->mhpmax/3)
3159 pline_msg = "unsuccessfully tries to imitate you.";
3160 else if (mtmp->mtame && hastoeat && !mtmp->isminion && moves > EDOG(mtmp)->hungrytime)
3161 pline_msg = "imitates a starving person.";
3162 else
3163 pline_msg = "imitates you.";
3165 else pline_msg = "imitates you.";
3166 break;
3167 case MS_SHEEP:
3168 if (mtmp->mtame) {
3169 if (mtmp->mhp < mtmp->mhpmax/3)
3170 pline_msg = "makes a sound that reminds you of a moan.";
3171 else if (mtmp->mtame && hastoeat && !mtmp->isminion && moves > EDOG(mtmp)->hungrytime)
3172 pline_msg = "baaaas hungrily.";
3173 else if (mtmp->mconf || mtmp->mflee || mtmp->mtrapped)
3174 pline_msg = "is scared.";
3175 else
3176 pline_msg = "baaaas.";
3178 else pline_msg = "baaaas.";
3179 break;
3180 case MS_CHICKEN:
3181 if (mtmp->mtame) {
3182 if (mtmp->mhp < mtmp->mhpmax/3) {
3183 pline_msg = "makes an anguished shriek.";
3184 aggravate();
3185 } else if (mtmp->mtame && hastoeat && !mtmp->isminion && moves > EDOG(mtmp)->hungrytime)
3186 pline_msg = "looks hungry.";
3187 else if (mtmp->mconf || mtmp->mflee)
3188 pline_msg = "runs wildly in fear.";
3189 else if (mtmp->mtrapped)
3190 pline_msg = "is mortally scared.";
3191 else
3192 pline_msg = "clucks.";
3194 else pline_msg = "clucks.";
3195 break;
3196 case MS_GLYPHS:
3197 if (mtmp->mtame) {
3198 if (mtmp->mhp < mtmp->mhpmax/3) {
3199 verbl_msg = "Hell if I knew how to activate the healing glyph...";
3200 } else if (mtmp->mtame && hastoeat && !mtmp->isminion && moves > EDOG(mtmp)->hungrytime)
3201 verbl_msg = "I've been trying all this time to make this glyph do something, but the only thing that happened was that I'm getting hungry!";
3202 else if (mtmp->mconf || mtmp->mflee)
3203 verbl_msg = "Where is the button? Hey, can you take a look, do you see a button somewhere on this stone glyph?";
3204 else
3205 verbl_msg = "I know that the magic glyphs exist, and I even know the name of the place where they supposedly can be found, but I forgot the name! Damn!";
3207 else verbl_msg = "Go away, I'm looking for the magic glyphs, they have to be around here somewhere...";
3208 break;
3210 case MS_SOCKS:
3212 if (mtmp->mtame) {
3213 if (mtmp->mhp < mtmp->mhpmax/3) {
3214 pline_msg = "are very sad that they've been damaged so badly...";
3215 } else
3216 pline_msg = "look sexy.";
3218 else pline_msg = "emit an exciting smell.";
3220 break;
3221 case MS_PANTS:
3222 if (mtmp->mtame) {
3223 if (mtmp->mhp < mtmp->mhpmax/3) {
3224 pline_msg = "look quite torn.";
3225 } else
3226 pline_msg = "are quite erotic.";
3228 else pline_msg = "want you to take a whiff from them.";
3230 break;
3231 case MS_HANDY:
3232 if (mtmp->handytime) {
3233 pline_msg = "is on the phone and can't be interrupted right now!";
3234 break;
3237 if (mtmp->mtame && mtmp->mhp < mtmp->mhpmax/3) {
3238 verbl_msg = "I gotta call an ambulance!";
3239 break;
3241 if (mtmp->mtame && hastoeat && moves > EDOG(mtmp)->hungrytime) {
3242 verbl_msg = "Do you happen to have the phone number of that pizza delivery service?";
3243 break;
3245 if (mtmp->mtame) verbl_msg = "Go ahead, I'll follow you. But please be aware that I'm expecting an important phone call.";
3246 else verbl_msg = "Don't disturb me, I'm expecting a phone call!";
3248 break;
3249 case MS_CAR:
3250 if (mtmp->mtame && mtmp->mhp < mtmp->mhpmax/3) {
3251 verbl_msg = "Just hold on Tetsuo. I'm gonna find you to cure your pain.";
3252 break;
3254 if (mtmp->mtame && hastoeat && moves > EDOG(mtmp)->hungrytime) {
3255 verbl_msg = "Teeeeeeeee tsuuuuuuu oooooooo!";
3256 break;
3258 if (mtmp->mtame) verbl_msg = "Relax, it's gonna take some time to warm my engine up.";
3259 else verbl_msg = rn2(2) ? "Bo-Bo-Bo" : "Va-Va-Va";
3261 break;
3262 case MS_JAPANESE:
3263 if (mtmp->mtame && mtmp->mhp < mtmp->mhpmax/10) {
3264 verbl_msg = "Kofuku shimasen! Watashi wa katsu ka, watashi no kuni no tame ni shinudeshou!";
3265 break;
3267 if (mtmp->mtame && mtmp->mhp < mtmp->mhpmax/3) {
3268 verbl_msg = "Watashitachi no firudodokuta ni denwa shite kudasai!";
3269 break;
3271 if (mtmp->mtame && mtmp->mconf) {
3272 verbl_msg = "Nani? Chugokujin wa shinryaku shite imasu ka? Soretomo daitoryo wa kakumisairu o hassha shita nodeshou ka?";
3273 break;
3275 if (mtmp->mtame && hastoeat && moves > EDOG(mtmp)->hungrytime) {
3276 verbl_msg = "Yasai o tori ni itte kudasai.";
3277 break;
3279 if (mtmp->mtame && mtmp->bleedout) {
3280 verbl_msg = "Kizuguchi ni subayaku hotai o maku!";
3281 break;
3283 if (mtmp->mtame) verbl_msg = "Kekko.";
3284 else if (mtmp->mpeaceful) verbl_msg = "Go aisatsu.";
3285 else if (mtmp->mfrenzied) verbl_msg = "Watashi ni kohei-sa o kitai shinaide kudasai.";
3286 else verbl_msg = "Anata wa tekidesu.";
3288 break;
3289 case MS_SOVIET:
3290 if (mtmp->mtame && mtmp->mhp < mtmp->mhpmax/10) {
3291 verbl_msg = "K chertu vsyu igru, kto voobshche zaprogrammiruyet etu fignyu.";
3292 break;
3294 if (mtmp->mtame && mtmp->mhp < mtmp->mhpmax/3) {
3295 verbl_msg = "Skazhi programmistu, chtoby on otsosal mne.";
3296 break;
3298 if (mtmp->mtame && mtmp->mconf) {
3299 verbl_msg = "YA sluchayno sozdal svoy variant? Eto neobychno.";
3300 break;
3302 if (mtmp->mtame && hastoeat && moves > EDOG(mtmp)->hungrytime) {
3303 verbl_msg = "Ba, v moyey igre ya smogu protyanut' dol'she bez yedy.";
3304 break;
3306 if (mtmp->mtame && mtmp->bleedout) {
3307 verbl_msg = "Pochemu etot statusnyy effekt voobshche imeyet znacheniye.";
3308 break;
3310 if (mtmp->mtame) verbl_msg = "Da ladno, ya ne khochu razygryvat' etu glupost'.";
3311 else if (mtmp->mpeaceful) verbl_msg = "Pochemu ya voobshche dolzhen byt' zdes'?";
3312 else if (mtmp->mfrenzied) verbl_msg = "Vse neuravnovesheno i ne imeyet smysla, i Emi deystvitel'no stoit obratit'sya k psikhiatru, potomu chto u neye opredelenno yest' bol'she, chem prosto neskol'ko nezakreplennykh vintov.";
3313 else verbl_msg = "Skoro ty umresh', i togda tebe ne ostanetsya nichego drugogo, kak sygrat' v ledyanoy blok tipa yego variant, kotoryy namnogo luchshe, chem etot musor!";
3315 break;
3316 case MS_SNORE:
3317 if (mtmp->mtame) {
3318 if (mtmp->mhp < mtmp->mhpmax/3)
3319 pline_msg = "breathes faintly.";
3320 else if (mtmp->mtame && hastoeat && !mtmp->isminion && moves > EDOG(mtmp)->hungrytime)
3321 pline_msg = "wants to eat a lot.";
3322 else
3323 pline_msg = "snores peacefully.";
3325 else pline_msg = "snores.";
3326 break;
3327 case MS_PHOTO:
3328 if (mtmp->mtame && mtmp->mhp < mtmp->mhpmax/3) {
3329 verbl_msg = "I'll take a photo of whoever hurt me there, and then we'll manhunt that person!";
3330 break;
3332 if (mtmp->mtame && hastoeat && moves > EDOG(mtmp)->hungrytime) {
3333 verbl_msg = "Let's go to the cafeteria, I need a little snack!";
3334 break;
3336 if (mtmp->mtame) {
3337 if (ACURR(A_CHA) > 17) verbl_msg = "Wow, you look splendid! I'm happy to accompany you!";
3338 else if (ACURR(A_CHA) > 17) verbl_msg = "Hey, good looking!";
3339 else verbl_msg = "Let's look for good photo opportunities.";
3341 else verbl_msg = "Don't move, I want to take a photo of you!";
3343 break;
3344 case MS_REPAIR:
3347 if (mtmp->repaircredit) verbalize("Welcome back to my repair shop. You still have %d credit remaining for repairs.", mtmp->repaircredit);
3348 else verbalize("Welcome to my repair shop. You can pawn gems to me to generate credit, and then use that credit to have your equipment repaired!");
3350 winid tmpwin;
3351 anything any;
3352 menu_item *selected;
3353 int n;
3355 any.a_void = 0; /* zero out all bits */
3356 tmpwin = create_nhwindow(NHW_MENU);
3357 start_menu(tmpwin);
3358 any.a_int = 1;
3359 add_menu(tmpwin, NO_GLYPH, &any , 'p', 0, ATR_NONE, "Pawn Gems", MENU_UNSELECTED);
3360 any.a_int = 2;
3361 add_menu(tmpwin, NO_GLYPH, &any , 'r', 0, ATR_NONE, "Repair", MENU_UNSELECTED);
3363 end_menu(tmpwin, "Services Available:");
3364 n = select_menu(tmpwin, PICK_ONE, &selected);
3365 destroy_nhwindow(tmpwin);
3367 if (n > 0) {
3368 switch (selected[0].item.a_int) {
3369 case 1:
3371 struct obj *pawngem;
3372 int gemvalue = 0;
3373 pawngem = getobj((const char *)pawnables, "pawn");
3374 if (!pawngem) break;
3375 if (pawngem->oclass != GEM_CLASS) {
3376 verbalize("That's not a gem!");
3377 break;
3379 if (pawngem->otyp >= ELIF_S_JEWEL) {
3380 verbalize("Sorry, I only accept real gems or worthless glass.");
3381 break;
3383 if (pawngem->otyp > JADE) gemvalue = 5;
3384 else gemvalue = objects[pawngem->otyp].oc_cost;
3385 if (pawngem->spe > 0) gemvalue += (pawngem->spe * 10);
3386 if (pawngem->spe < 0) {
3387 gemvalue += (pawngem->spe * 10);
3388 if (gemvalue < 5) gemvalue = 5;
3390 if (mtmp->mpeaceful) {
3391 gemvalue *= 5;
3392 gemvalue /= 4;
3394 if (pawngem->oeroded == 3) gemvalue /= 4;
3395 else if (pawngem->oeroded == 2) gemvalue /= 3;
3396 else if (pawngem->oeroded == 1) gemvalue /= 2;
3397 if (pawngem->oeroded2 == 3) gemvalue /= 4;
3398 else if (pawngem->oeroded2 == 2) gemvalue /= 3;
3399 else if (pawngem->oeroded2 == 1) gemvalue /= 2;
3400 if (gemvalue < 1) gemvalue = 1;
3402 if (pawngem->quan > 1) {
3403 pawngem->quan--;
3404 pawngem->owt = weight(pawngem);
3405 } else useup(pawngem);
3407 mtmp->repaircredit += gemvalue;
3408 verbalize("Alright, your credit was increased by %d and amounts to %d now.", gemvalue, mtmp->repaircredit);
3411 break;
3412 case 2:
3414 register struct obj *repairotmp;
3415 int repaircost = 0;
3417 if (mtmp->repaircredit < 1000) {
3418 verbalize("Sorry, you only have %d credit, that's too little.", mtmp->repaircredit);
3419 break;
3422 repairitemchoice:
3423 repairotmp = getobj(allnoncount, "magically repair");
3424 if (!repairotmp) {
3425 break;
3428 if (!repairotmp->oeroded && !repairotmp->oeroded2) {
3429 verbalize("That item doesn't need repairs!");
3430 break;
3433 if (repairotmp->oeroded == 3) repaircost += 10000;
3434 if (repairotmp->oeroded == 2) repaircost += 2500;
3435 if (repairotmp->oeroded == 1) repaircost += 1000;
3436 if (repairotmp->oeroded2 == 3) repaircost += 10000;
3437 if (repairotmp->oeroded2 == 2) repaircost += 2500;
3438 if (repairotmp->oeroded2 == 1) repaircost += 1000;
3440 if (repaircost > mtmp->repaircredit) {
3441 verbalize("Sorry, you only have %d credit, and repairing that item would cost %d.", mtmp->repaircredit, repaircost);
3442 break;
3445 verbalize("It'll cost you %d zorkmids to repair that.", repaircost);
3446 if (yn("Pay?") != 'y') {
3447 verbalize("Ah well, maybe next time.");
3448 break;
3450 mtmp->repaircredit -= repaircost;
3452 if (repairotmp && stack_too_big(repairotmp)) {
3453 pline("The stack was too big and therefore didn't get repaired!");
3454 } else if (repairotmp) {
3455 if (!Blind) {
3456 pline("Your %s looks as good as new!",xname(repairotmp));
3458 if (repairotmp->oeroded > 0) { repairotmp->oeroded = 0; }
3459 if (repairotmp->oeroded2 > 0) { repairotmp->oeroded2 = 0; }
3460 if (repairotmp && objects[(repairotmp)->otyp].oc_material == MT_CELESTIUM && !stack_too_big(repairotmp)) {
3461 if (!repairotmp->cursed) bless(repairotmp);
3462 else uncurse(repairotmp, FALSE);
3468 break;
3473 break;
3474 case MS_DRUGS:
3476 register int cnt = 0;
3477 register struct monst *mkop, *mkop2;
3478 int kopchance = 10;
3480 verbalize("Ey yo man, what you need, dog?");
3481 if (yn("Purchase drugs?") != 'y') {
3482 verbalize("Keep calm, man!");
3483 break;
3485 if (u.ugold < 1000) {
3486 verbalize("You ain't got the cash, man!");
3487 break;
3489 u.ugold -= 1000;
3490 adjalign(-5);
3492 struct obj *medkit;
3493 medkit = mksobj(rn2(2) ? MUSHROOM : PILL, TRUE, FALSE, FALSE);
3494 if (medkit) {
3495 medkit->quan = 1;
3496 medkit->known = medkit->dknown = medkit->bknown = medkit->rknown = 1;
3497 medkit->owt = weight(medkit);
3498 dropy(medkit);
3499 stackobj(medkit);
3501 verbalize("Yo, cool man, go check out the ground but shhhh!");
3503 for (mkop = fmon; mkop; mkop = mkop2) {
3504 mkop2 = mkop->nmon;
3505 if (mkop->data->mlet == S_KOP) {
3506 cnt++;
3509 while (cnt > 0) {
3510 cnt--;
3511 if (!rn2(4)) kopchance--;
3513 if (kopchance < 3) kopchance = 3;
3514 if (!rn2(kopchance)) {
3515 u.copwantedlevel += rnz(1000);
3516 verbalize("WEOWEO");
3519 if (!rn2(kopchance)) {
3520 int randsp;
3521 int i;
3522 coord cc, dd;
3523 int cx,cy;
3524 cx = rn2(COLNO);
3525 cy = rn2(ROWNO);
3527 randsp = (rn2(14) + 2);
3528 if (!rn2(10)) randsp *= 2;
3529 if (!rn2(100)) randsp *= 3;
3530 if (!rn2(1000)) randsp *= 5;
3531 if (!rn2(10000)) randsp *= 10;
3533 for (i = 0; i < randsp; i++) {
3534 if (!enexto(&dd, u.ux, u.uy, (struct permonst *)0) ) continue;
3535 (void) makemon(mkclass(S_KOP,0), cx, cy, MM_ADJACENTOK|MM_ANGRY|MM_FRENZIED);
3540 if (!rn2(7)) {
3541 mongone(mtmp);
3542 verbalize("Yo man this too hot here, later!");
3543 return(1);
3546 break;
3547 case MS_COMBAT:
3548 if (mtmp->mtame && mtmp->mhp < mtmp->mhpmax/10) {
3549 verbl_msg = "If I don't get some source of healing, the next hit will kill me!";
3550 break;
3552 if (mtmp->mtame && mtmp->mhp < mtmp->mhpmax/3) {
3553 verbl_msg = "I'm low on health! Hopefully you have some healing powers!";
3554 break;
3556 if (mtmp->mtame && mtmp->mconf) {
3557 verbl_msg = "I'm confused! Could you lend me your unicorn horn?";
3558 break;
3560 if (mtmp->mtame && hastoeat && moves > EDOG(mtmp)->hungrytime) {
3561 verbl_msg = "Find me something to eat!";
3562 break;
3564 if (mtmp->mtame && mtmp->bleedout) {
3565 verbl_msg = "Dang, I'm still bleeding from that last hit! Can you heal me? That should take care of it!";
3566 break;
3568 if (mtmp->mtame) verbl_msg = "I'm looking forward to the next battle!";
3569 else if (mtmp->mpeaceful) verbl_msg = "I'd like to fight some enemies!";
3570 else if (mtmp->mfrenzied) verbl_msg = "I'll finish you off!";
3571 else verbl_msg = "Come! Fight me!";
3572 break;
3573 case MS_MUTE:
3574 if (mtmp->mtame) {
3575 if (mtmp->mhp < mtmp->mhpmax/3)
3576 pline_msg = "moans.";
3577 else if (mtmp->mtame && hastoeat && !mtmp->isminion && moves > EDOG(mtmp)->hungrytime)
3578 pline_msg = "grunts like a pig.";
3579 else
3580 pline_msg = "grunts peacefully.";
3582 else pline_msg = rn2(2) ? "barks threateningly." : "grunts angrily.";
3583 break;
3584 case MS_CORONA:
3585 if (mtmp->mtame && mtmp->mhp < mtmp->mhpmax/3) {
3586 verbl_msg = "I'm dying of covid-19! Bring me to the intensive care unit, FAST!";
3587 break;
3589 if (mtmp->mtame && hastoeat && moves > EDOG(mtmp)->hungrytime) {
3590 verbl_msg = "Man, everything tastes the same! But I really need to eat something...";
3591 break;
3593 if (mtmp->mtame) {
3594 verbl_msg = rn2(2) ? "Lead the way, and be sure to always wear your face mask properly." : "Careful, I know we're on the same team, but please don't get closer than 1.50 meters to me.";
3596 else verbl_msg = rn2(2) ? "Stop! You need to wear a face mask! I'm not gonna let you spread the virus to me!" : "Stay away! I don't want to contract your covid infection! Keep a minimum distance of 2 meters, got it?";
3597 break;
3598 case MS_TRUMPET:
3599 if (mtmp->mtame) {
3600 if (mtmp->mhp < mtmp->mhpmax/3)
3601 pline_msg = "lets out a tormented squeak.";
3602 else if (mtmp->mtame && !mtmp->isminion && hastoeat && moves > EDOG(mtmp)->hungrytime)
3603 pline_msg = "emits a long sigh.";
3604 else
3605 pline_msg = "trumpets.";
3607 else pline_msg = mtmp->mpeaceful ? "trumpets peacefully." : "roars!";
3608 break;
3609 case MS_PAIN:
3610 verbalize("My health status is %d HP out of a maximum of %d!", mtmp->mhp, mtmp->mhpmax);
3611 break;
3612 case MS_BRAG:
3613 if (mtmp->mtame && mtmp->mhp < mtmp->mhpmax/3) {
3614 verbl_msg = "Bah, I won't die that easily! I still got some hit points left!";
3615 break;
3617 if (mtmp->mtame && hastoeat && moves > EDOG(mtmp)->hungrytime) {
3618 verbl_msg = "Once I've eaten, my strength will be even higher than before!";
3619 break;
3621 if (mtmp->mtame) {
3622 verbl_msg = "I am the best!";
3624 else verbl_msg = "Bah, I'm much better than you!";
3625 break;
3626 case MS_LIEDER:
3627 if (mtmp->mtame && mtmp->mhp < mtmp->mhpmax/3) {
3628 verbl_msg = "If you let me die now, I can't give you advice on how to beat your quest anymore!";
3629 break;
3631 if (mtmp->mtame && hastoeat && moves > EDOG(mtmp)->hungrytime) {
3632 verbl_msg = "Hey, I'll help you, but first I need to eat something!";
3633 break;
3635 if (mtmp->mtame) {
3636 verbl_msg = "Keep going forward, you'll be able to beat your quest!";
3638 else verbl_msg = "How far have you gotten in your quest?";
3639 break;
3640 case MS_GAARDIEN:
3641 if (mtmp->mtame && mtmp->mhp < mtmp->mhpmax/3) {
3642 verbl_msg = "Why are you letting my health drop so low? Can't you cast a healing spell on me?";
3643 break;
3645 if (mtmp->mtame && hastoeat && moves > EDOG(mtmp)->hungrytime) {
3646 verbl_msg = "Hungry!";
3647 break;
3649 if (mtmp->mtame) {
3650 verbl_msg = "The boss is counting on you.";
3652 else verbl_msg = "Get moving, that quest doesn't complete itself!";
3653 break;
3654 case MS_MISSING:
3655 pline("%s does not make a sound.", Monnam(mtmp));
3656 break;
3657 case MS_SELFHARM:
3658 if (mtmp->mhp < mtmp->mhpmax/10) {
3659 verbl_msg = "The suffering will be over soon.";
3660 break;
3662 if (mtmp->mtame && mtmp->mhp < mtmp->mhpmax/3) {
3663 verbl_msg = "Hopefully I manage to kill myself this time...";
3664 break;
3666 if (mtmp->mtame && hastoeat && moves > EDOG(mtmp)->hungrytime) {
3667 verbl_msg = "No, I don't want to eat! I just want to die!";
3668 break;
3670 if (mtmp->bleedout > 100) {
3671 verbl_msg = "Uhh... maybe I did go too far this time after all, I think I've hit styro...";
3672 break;
3674 if (mtmp->bleedout > 50) {
3675 verbl_msg = "This is looking good, I only have to apply the razorblade again...";
3676 break;
3678 if (mtmp->bleedout > 0) {
3679 verbl_msg = "That didn't do much damage, perhaps I should cut deeper...";
3680 break;
3682 if (mtmp->mtame) {
3683 verbl_msg = "I always have my tools at hand. Don't worry, I'm fine.";
3685 else verbl_msg = "Damn, I'm having THE urge!";
3686 break;
3687 case MS_CLOCK:
3688 if (mtmp->mhp < mtmp->mhpmax/3) {
3689 verbl_msg = "Damn, the clock is broken!";
3690 break;
3692 if (mtmp->mtame && hastoeat && moves > EDOG(mtmp)->hungrytime) {
3693 verbl_msg = "Uhh, I hope it's not too late to get some food! Do you happen to know a restaurant that is open now?";
3694 break;
3697 time_t rawtime;
3698 struct tm *info;
3699 time(&rawtime);
3700 info = localtime(&rawtime);
3702 pline("'The time is: %s'", asctime(info));
3703 break;
3704 case MS_OHGOD:
3705 if (mtmp->mtame && mtmp->mhp < mtmp->mhpmax/3) {
3706 verbl_msg = "Oh-god-o-matic!";
3707 break;
3709 if (mtmp->mconf) {
3710 verbl_msg = "Oh Buddha! Or was it Jahwe? Oh Allah!";
3711 break;
3713 if (mtmp->mtame && hastoeat && moves > EDOG(mtmp)->hungrytime) {
3714 verbl_msg = "Ohgod no food! Ohgod!";
3715 break;
3717 verbl_msg = "Oh goooood...";
3718 break;
3719 case MS_WOLLOH:
3720 if (mtmp->mtame && mtmp->mhp < mtmp->mhpmax/3) {
3721 verbl_msg = "Wolloh that shit's fucked up wolloh!";
3722 break;
3724 if (mtmp->mconf) {
3725 verbl_msg = "Hollow? Why is everything hollow?";
3726 break;
3728 if (mtmp->mtame && hastoeat && moves > EDOG(mtmp)->hungrytime) {
3729 verbl_msg = "Wolloh age, let's go doener kebab wolloh!";
3730 break;
3732 if (mtmp->mtame) {
3733 verbl_msg = "Wolloh come with me!";
3734 } else if (mtmp->mpeaceful) {
3735 verbl_msg = "Wolloh wassup?";
3737 else verbl_msg = "Wolloh, I'm gonna fuck you up asshole! Wolloh age!";
3738 break;
3739 case MS_CODE:
3740 if (mtmp->codeguessed) {
3741 verbalize("Sorry, you already took a guess.");
3742 } else {
3743 mtmp->codeguessed = TRUE;
3744 verbalize("What is the secret four-digit code number?");
3746 char buf[BUFSZ];
3747 long offer;
3749 getlin("Your guess:", buf);
3750 if (sscanf(buf, "%ld", &offer) != 1) offer = 0L;
3751 if (offer < 0) {
3752 verbalize("Certainly not, mastermind!");
3753 } else if (offer > 9999) {
3754 verbalize("Nice try, but no, the code is four-digit. You gave too many digits.");
3755 } else if (offer == u.secretcodenumber) {
3756 u.secretcodenumber = rn2(10000);
3757 verbalize("We have a winner!!! You shall receive a boon.");
3758 if (!rn2(4)) makewish(evilfriday ? FALSE : TRUE);
3759 else othergreateffect();
3760 } else {
3761 verbalize("Sorry, your guess was wrong.");
3766 break;
3767 case MS_BARBER:
3769 if (u.barbertimer < 5000) {
3770 verbalize("Sorry, your last haircut was just %d turns ago, you have to wait a bit until I can give you another!", u.barbertimer);
3771 break;
3775 int barbercost = 250;
3776 if (u.barberamount > 0) barbercost += (u.barberamount * 50);
3777 if (u.barbertimer > 5999) {
3778 int barberxtracost = u.barbertimer - 5000;
3779 while (barberxtracost >= 1000) {
3780 barberxtracost -= 1000;
3781 barbercost += 100;
3785 verbalize("Hey %s, want a new haircut? Just %d zorkmids!", flags.female ? "girl" : "man", barbercost);
3787 if (yn("Do you want a new haircut?") != 'y') {
3788 verbalize("Oh well, if you don't wanna... you know where to find me if you change your mind.");
3789 } else {
3790 if (u.ugold < barbercost) {
3791 verbalize("Sorry, I'm not working for free. Get enough cash first!");
3792 } else {
3793 int charismagain = 1;
3794 if (Role_if(PM_LADIESMAN)) charismagain++;
3796 u.ugold -= barbercost;
3797 u.barberamount++;
3798 u.barbertimer = 0;
3799 if (flags.female) {
3800 u.femalehaircut = rnd(55);
3801 } else {
3802 u.malehaircut = rnd(18);
3803 u.malebeard = rnd(48);
3805 (void) adjattrib(A_CHA, charismagain, 0, TRUE);
3808 d_level flev;
3810 if (mon_has_amulet(mtmp) || In_endgame(&u.uz)) {
3811 verbalize("Alright, done. I'll be off looking for another customer! Seeya!");
3812 mongone(mtmp);
3813 Your("new hairstyle is '%s.", bundledescription());
3814 return(1);
3816 flev = random_branchport_level();
3817 migrate_to_level(mtmp, ledger_no(&flev), MIGR_RANDOM, (coord *)0);
3818 verbalize("Alright, done. I'll be off looking for another customer! Seeya!");
3819 Your("new hairstyle is '%s.", bundledescription());
3820 return(1);
3825 break;
3826 case MS_AREOLA:
3827 if (mtmp->mtame && mtmp->mhp < mtmp->mhpmax/3) {
3828 pline_msg = "doesn't seem very happy.";
3829 break;
3831 if (mtmp->mconf) {
3832 pline_msg = "seems to be lost in thought...";
3833 break;
3835 if (mtmp->mtame && hastoeat && moves > EDOG(mtmp)->hungrytime) {
3836 pline_msg = "wants to eat a lot.";
3837 break;
3839 if (mtmp->mtame) {
3840 pline_msg = "puffs out its chest with pride.";
3841 } else if (mtmp->mpeaceful) {
3842 pline_msg = "looks surprised.";
3844 else pline_msg = "spits on the ground.";
3845 break;
3846 case MS_STABILIZE:
3847 if (mtmp->mtame && mtmp->mhp < mtmp->mhpmax/3) {
3848 pline_msg = "tries to deactivate the force field so that an emergency teleport spell can be cast.";
3849 break;
3851 if (mtmp->mconf) {
3852 pline_msg = "seems to have forgotten the original plan.";
3853 break;
3855 if (mtmp->mtame && hastoeat && moves > EDOG(mtmp)->hungrytime) {
3856 pline_msg = "needs to refuel.";
3857 break;
3859 if (mtmp->mtame) {
3860 pline_msg = "tells you that the force field will improve your chance of success.";
3861 } else if (mtmp->mpeaceful) {
3862 pline_msg = "merrily remarks that the force field is working well.";
3864 else pline_msg = "tells you that you won't break through the force field!";
3865 break;
3866 case MS_ESCAPE:
3867 if (mtmp->mtame && mtmp->mhp < mtmp->mhpmax/3) {
3868 verbl_msg = "That's it, I'm out of here! Catch me if you can, I'm the Gingerbread Man!";
3869 break;
3871 if (mtmp->mtame && hastoeat && moves > EDOG(mtmp)->hungrytime) {
3872 verbl_msg = "Where's the canteen?";
3873 break;
3875 if (mtmp->mtame) {
3876 verbl_msg = "Okay, I'll follow you.";
3877 } else if (mtmp->mpeaceful) {
3878 verbl_msg = "Pinky, are you pondering what I'm pondering?";
3880 else verbl_msg = "Are you crazy? Well, neglecting to wear safety gear does verge on the edge of lunacy... anyway, stop attacking me, immediately!";
3881 break;
3882 case MS_OE:
3883 if (mtmp->mtame && mtmp->mhp < mtmp->mhpmax/3) {
3884 verbl_msg = "Need healing!";
3885 break;
3887 if (mtmp->mtame && hastoeat && moves > EDOG(mtmp)->hungrytime) {
3888 verbl_msg = "Need food!";
3889 break;
3891 if (mtmp->mtame) {
3892 verbl_msg = "Lead the way!";
3893 } else if (mtmp->mpeaceful) {
3894 verbl_msg = "What's going on?";
3896 else verbl_msg = "Enemy!";
3897 break;
3898 case MS_BAN:
3899 if (mtmp->mtame && mtmp->mhp < mtmp->mhpmax/3) {
3900 verbl_msg = "I'll get out of this area soon.";
3901 break;
3903 if (mtmp->mtame && hastoeat && moves > EDOG(mtmp)->hungrytime) {
3904 verbl_msg = "Give me something to eat!";
3905 break;
3907 if (mtmp->mtame) {
3908 verbl_msg = "I'll follow you for now.";
3909 } else if (mtmp->mpeaceful) {
3910 verbl_msg = "This area seems reasonably safe.";
3912 else verbl_msg = "Get away from me!";
3913 break;
3914 case MS_TALONCOMPANY:
3915 if (mtmp->mtame && mtmp->mhp < mtmp->mhpmax/3) {
3916 verbl_msg = "This ain't what I signed up for!";
3917 break;
3919 if (mtmp->mtame && hastoeat && moves > EDOG(mtmp)->hungrytime) {
3920 verbl_msg = "Food! Get me some fucking food!";
3921 break;
3923 if (mtmp->mtame) {
3924 verbl_msg = "Yeah?";
3925 } else if (mtmp->mpeaceful) {
3926 verbl_msg = "Hello.";
3928 else verbl_msg = "You're dead!";
3929 break;
3930 case MS_REGULATOR:
3931 if (mtmp->mtame && mtmp->mhp < mtmp->mhpmax/3) {
3932 verbl_msg = "This ain't what I signed up for!";
3933 break;
3935 if (mtmp->mtame && hastoeat && moves > EDOG(mtmp)->hungrytime) {
3936 verbl_msg = "Gotta eat another donut, I'm hungry!";
3937 break;
3939 if (mtmp->mtame) {
3940 verbl_msg = "Yeah?";
3941 } else if (mtmp->mpeaceful) {
3942 verbl_msg = "Hello.";
3944 else verbl_msg = "Well what do we have here, the Vault rogues are back.";
3945 break;
3946 case MS_RAIDER:
3947 if (mtmp->mtame && mtmp->mhp < mtmp->mhpmax/3) {
3948 verbl_msg = "Oh God, I don't want to die!";
3949 break;
3951 if (mtmp->mtame && hastoeat && moves > EDOG(mtmp)->hungrytime) {
3952 verbl_msg = "Where's the damn meat shipment?";
3953 break;
3955 if (mtmp->mtame) {
3956 verbl_msg = "Shh, not so loud. The others shouldn't notice that I'm doing business with you.";
3957 } else if (mtmp->mpeaceful) {
3958 verbl_msg = "Well, if that ain't a very alive horn ox!";
3960 else verbl_msg = "Hahahahahahaha! Time to kill!";
3961 break;
3962 case MS_ENCLAVE:
3963 if (mtmp->mtame && mtmp->mhp < mtmp->mhpmax/3) {
3964 verbl_msg = "Retreat and regroup!";
3965 break;
3967 if (mtmp->mtame && hastoeat && moves > EDOG(mtmp)->hungrytime) {
3968 verbl_msg = "Need a C-ration!";
3969 break;
3971 if (mtmp->mtame) {
3972 verbl_msg = "Greetings, commander.";
3973 } else if (mtmp->mpeaceful) {
3974 verbl_msg = "Hello.";
3976 else verbl_msg = "Attack is continued!";
3977 break;
3978 case MS_MUTANT:
3979 if (mtmp->mtame && mtmp->mhp < mtmp->mhpmax/3) {
3980 verbl_msg = "Please... rescue me...";
3981 break;
3983 if (mtmp->mtame && hastoeat && moves > EDOG(mtmp)->hungrytime) {
3984 verbl_msg = "Almost no green stuff left...";
3985 break;
3987 if (mtmp->mtame) {
3988 verbl_msg = "What's going on?";
3989 } else if (mtmp->mpeaceful) {
3990 verbl_msg = "I seem to remember something... from before. I knew a woman... or maybe I *WAS* one...";
3992 else verbl_msg = "Hahahahahahaha! Let's play, little human!";
3993 break;
3994 case MS_MYTHICALDAWN:
3995 if (mtmp->mtame && mtmp->mhp < mtmp->mhpmax/3) {
3996 verbl_msg = "The old Tamriel still has some power left!";
3997 break;
3999 if (mtmp->mtame && hastoeat && moves > EDOG(mtmp)->hungrytime) {
4000 verbl_msg = "Once I'm in paradise I'll eat lichor and ambrosia in great profusion!";
4001 break;
4003 if (mtmp->mtame) {
4004 verbl_msg = "We will hunt those accursed Blades.";
4005 } else if (mtmp->mpeaceful) {
4006 verbl_msg = "Lord Dagon will walk the earth again!";
4008 else verbl_msg = "You're weak, just like the gods you pray to.";
4009 break;
4010 case MS_DREMORA:
4011 if (mtmp->mtame && mtmp->mhp < mtmp->mhpmax/3) {
4012 verbl_msg = "Stop stealing my air.";
4013 break;
4015 if (mtmp->mtame && hastoeat && moves > EDOG(mtmp)->hungrytime) {
4016 verbl_msg = "Dark and deep!";
4017 break;
4019 if (mtmp->mtame) {
4020 verbl_msg = "Heel, doggie!";
4021 } else if (mtmp->mpeaceful) {
4022 verbl_msg = "Begone, mortal.";
4024 else verbl_msg = "On your knees, coward!";
4025 break;
4026 case MS_BOS:
4027 if (mtmp->mtame && mtmp->mhp < mtmp->mhpmax/3) {
4028 verbl_msg = "Damn, I'm gonna have to contact Scribe Jameson, for the scrolls...";
4029 break;
4031 if (mtmp->mtame && hastoeat && moves > EDOG(mtmp)->hungrytime) {
4032 verbl_msg = "I need a lunch break.";
4033 break;
4035 if (mtmp->mtame) {
4036 verbl_msg = "Greetings.";
4037 } else if (mtmp->mpeaceful) {
4038 verbl_msg = "Don't worry, you're safe in our presence.";
4040 else verbl_msg = "Enemy contact!";
4041 break;
4042 case MS_OUTCAST:
4043 if (mtmp->mtame && mtmp->mhp < mtmp->mhpmax/3) {
4044 verbl_msg = "I'm about to expire!";
4045 break;
4047 if (mtmp->mtame && hastoeat && moves > EDOG(mtmp)->hungrytime) {
4048 verbl_msg = "Gonna have to eat a lot!";
4049 break;
4051 if (mtmp->mtame) {
4052 verbl_msg = "Don't ever forget the fire that forged you, or you're lost.";
4053 } else if (mtmp->mpeaceful) {
4054 verbl_msg = "Casdin made the right choice when he left Lyons' little group of do-gooders.";
4056 else verbl_msg = "Old man, kiss my ass!"; /* referring to Elder Lyons, not your player character */
4057 break;
4058 case MS_GENDER:
4059 if (mtmp->mtame && mtmp->mhp < mtmp->mhpmax/3) {
4060 verbl_msg = "I may die, but let everyone know that I'm %s!", is_neuter(mtmp->data) ? "neuter" : mtmp->female ? "female" : "male";
4061 break;
4063 if (mtmp->mtame && hastoeat && moves > EDOG(mtmp)->hungrytime) {
4064 verbl_msg = "This %s needs something to eat!", is_neuter(mtmp->data) ? "neutrum" : mtmp->female ? "woman" : "man";
4065 break;
4067 if (mtmp->mtame) {
4068 verbl_msg = "Do you like the fact that you have a %s ally?", is_neuter(mtmp->data) ? "neuter" : mtmp->female ? "female" : "male";
4069 } else if (mtmp->mpeaceful) {
4070 verbl_msg = "Hey look at me! I'm %s!", is_neuter(mtmp->data) ? "neuter" : mtmp->female ? "female" : "male";
4072 else verbl_msg = "You're gonna lose to a %s!", is_neuter(mtmp->data) ? "neutrum" : mtmp->female ? "girl" : "boy";
4073 break;
4074 case MS_AMNESIA:
4075 if (mtmp->mtame && mtmp->mhp < mtmp->mhpmax/3) {
4076 verbl_msg = "Forget about it.";
4077 break;
4079 if (mtmp->mtame && hastoeat && moves > EDOG(mtmp)->hungrytime) {
4080 verbl_msg = "Hmm, I forgot what I'm supposed to do when my stomach growls...";
4081 break;
4083 if (mtmp->mtame) {
4084 verbl_msg = "Hey, what do you want from me, I don't know you!";
4085 } else if (mtmp->mpeaceful) {
4086 verbl_msg = "I don't remember seeing you before.";
4088 else verbl_msg = "Huh, who are you?";
4089 break;
4090 case MS_SHIVERINGESLES:
4091 if (mtmp->mtame && mtmp->mhp < mtmp->mhpmax/3) {
4092 verbl_msg = "Ich habe den Zaxer gesehen. Und ich habe ihn gemaggt. Ach, fribbel!";
4093 break;
4095 if (mtmp->mtame && hastoeat && moves > EDOG(mtmp)->hungrytime) {
4096 verbl_msg = "Gebt ihnen Gargen zum Emmet.";
4097 break;
4099 if (mtmp->mtame && mtmp->mconf) {
4100 verbl_msg = "Grundi Obelisken! Immer tetteraten sie Ritter und Festars. Verwendet den Dookas, um sie in Ordnung zu bringen.";
4101 break;
4103 if (mtmp->mtame && mtmp->mstun) {
4104 verbl_msg = "Ich wette einen Quintat, dass sie ipanaten koennen.";
4105 break;
4107 if (mtmp->mtame && mtmp->mtrapped) {
4108 verbl_msg = "Dunkel-dunkel. Wir haben einen Zeffel geyingt.";
4109 break;
4111 if (mtmp->mtame && mtmp->mcan) {
4112 verbl_msg = "Zeut Femul dimat! Ich boestle, bevor ich redauple.";
4113 break;
4115 if (mtmp->mtame && mtmp->mblinded) {
4116 verbl_msg = "Sagt dem Dagen Bescheid! Dem Dagen! Karn Himmel relft schon.";
4117 break;
4119 if (mtmp->mtame) {
4120 verbl_msg = "Nehmt Zickel. Niemand macht rebbi Zickel heutzutage.";
4121 } else if (mtmp->mpeaceful) {
4122 verbl_msg = "Gal bursten es.";
4124 else verbl_msg = "Uungor spredet, er 'tschaui.' Spredet mit Uungor. Ihr sterfeht mich? Spredet mit Uungor! Gebt Freund Pennigkeit in Uungors Ratzepueklo.";
4125 break;
4126 case MS_ANOREXIA:
4127 if (mtmp->mtame && mtmp->mhp < mtmp->mhpmax/3) {
4128 verbl_msg = "Can't I just abstain from eating in peace?";
4129 break;
4131 if (mtmp->mtame && hastoeat && moves > EDOG(mtmp)->hungrytime) {
4132 verbl_msg = "I'm still not skinny enough!";
4133 break;
4135 if (mtmp->mtame) {
4136 verbl_msg = "Do you think I'm skinny and beautiful?";
4137 } else if (mtmp->mpeaceful) {
4138 verbl_msg = "Please don't tell me I'm fat!";
4140 else verbl_msg = "You think I'm fat, I know it.";
4141 break;
4142 case MS_BULIMIA:
4143 if (mtmp->mtame && mtmp->mhp < mtmp->mhpmax/3) {
4144 verbl_msg = "Fuck the whole world!";
4145 break;
4147 if (mtmp->mtame && hastoeat && moves > EDOG(mtmp)->hungrytime) {
4148 verbl_msg = "I need to eat a lot!";
4149 break;
4151 if (mtmp->mtame) {
4152 verbl_msg = "I'm happy and feeling fine!";
4153 } else if (mtmp->mpeaceful) {
4154 verbl_msg = "Nice day today, huh?";
4156 else verbl_msg = "Don't you DARE comment on my teeth!";
4157 break;
4158 case MS_TEMPER:
4159 if (mtmp->mtame && mtmp->mhp < mtmp->mhpmax/3) {
4160 verbl_msg = "Need healing!";
4161 break;
4163 if (mtmp->mtame && hastoeat && moves > EDOG(mtmp)->hungrytime) {
4164 verbl_msg = "Hungry!";
4165 break;
4167 if (mtmp->mtame) {
4168 verbl_msg = "Sup!";
4169 } else if (mtmp->mpeaceful) {
4170 verbl_msg = "Eh!";
4172 else verbl_msg = "GRR!";
4173 break;
4174 case MS_BLANKER:
4175 /* todo */
4176 break;
4177 case MS_CONDESCEND:
4178 if (mtmp->mtame && mtmp->mhp < mtmp->mhpmax/3) {
4179 verbl_msg = "I'm not gonna die! I'll just heal!";
4180 break;
4182 if (mtmp->mtame && hastoeat && moves > EDOG(mtmp)->hungrytime) {
4183 verbl_msg = "Once I've eaten, I'll finish off my enemy!";
4184 break;
4186 if (mtmp->mtame) {
4187 verbl_msg = "You're my subordinate, just obey my command and everything is fine.";
4188 } else if (mtmp->mpeaceful) {
4189 verbl_msg = "Oh, what a cute little specimen you are.";
4191 else verbl_msg = "You will fall like wheat before my sword.";
4192 break;
4193 case MS_MOLEST:
4194 if (flags.female) {
4195 if (mtmp->mtame && mtmp->mhp < mtmp->mhpmax/3) {
4196 verbl_msg = "I'm not gonna go down like that! My penis still has lots of semen left for inseminating women!";
4197 break;
4199 if (mtmp->mtame && hastoeat && moves > EDOG(mtmp)->hungrytime) {
4200 verbl_msg = "Hey, girl! Make me a sandwich, will ya?";
4201 break;
4203 if (mtmp->mtame) {
4204 verbl_msg = "Oh girl, I'm looking forward to landing you in bed tonight...";
4205 } else if (mtmp->mpeaceful) {
4206 verbl_msg = "Do you like it if I massage your buttocks with my hands?";
4208 else verbl_msg = "Now my penis will penetrate your vagina, girl. Hehehehehe.";
4209 } else {
4210 if (mtmp->mtame && mtmp->mhp < mtmp->mhpmax/3) {
4211 verbl_msg = "Gah why the hell do there have to be so many men on this planet FUCK THAT SHIT!";
4212 break;
4214 if (mtmp->mtame && hastoeat && moves > EDOG(mtmp)->hungrytime) {
4215 verbl_msg = "Bring me some food, fast!";
4216 break;
4218 if (mtmp->mtame) {
4219 verbl_msg = "Gah, why do you have to be a man?";
4220 } else if (mtmp->mpeaceful) {
4221 verbl_msg = "You're not interesting to me because you have a penis.";
4223 else verbl_msg = "God, why are you male? Ah well, I'll just get rid of you real quick and then I'll find some girls to play with!";
4226 break;
4227 case MS_SHOCKTROOPER:
4228 if (mtmp->mtame && mtmp->mhp < mtmp->mhpmax/3) {
4229 verbl_msg = "ka ga blis blis ka";
4230 break;
4232 if (mtmp->mtame && hastoeat && moves > EDOG(mtmp)->hungrytime) {
4233 verbl_msg = "puh pur hyu ka";
4234 break;
4236 if (mtmp->mtame) {
4237 verbl_msg = "kss wirt ras";
4238 } else if (mtmp->mpeaceful) {
4239 verbl_msg = "kss kyur kiml";
4241 else verbl_msg = "kiml kiml";
4242 break;
4243 case MS_GAGA:
4244 if (mtmp->mtame && mtmp->mhp < mtmp->mhpmax/3) {
4245 verbl_msg = "The LGBTIQ+ community will avenge me...";
4246 break;
4248 if (mtmp->mtame && hastoeat && moves > EDOG(mtmp)->hungrytime) {
4249 verbl_msg = "Can you procure some food that's suitable for my gender?";
4250 break;
4252 if (mtmp->mtame) {
4253 verbl_msg = "Always be aware of my gender.";
4254 } else if (mtmp->mpeaceful) {
4255 verbl_msg = "Hey, did I tell you about my gender yet?";
4257 else verbl_msg = "You have to use the correct pronouns when talking to me!!!!!";
4258 break;
4259 case MS_COMMON:
4260 if (mtmp->mtame && mtmp->mhp < mtmp->mhpmax/3) {
4261 verbl_msg = "My health is low!";
4262 break;
4264 if (mtmp->mtame && hastoeat && moves > EDOG(mtmp)->hungrytime) {
4265 verbl_msg = "I need to eat something!";
4266 break;
4268 if (mtmp->mtame) {
4269 verbl_msg = "Hello, friend.";
4270 } else if (mtmp->mpeaceful) {
4271 verbl_msg = "Greetings, adventurer.";
4273 else verbl_msg = "You are my enemy.";
4274 break;
4275 case MS_PIRATE:
4276 if (mtmp->mtame && mtmp->mhp < mtmp->mhpmax/3) {
4277 verbl_msg = "Blow me down!";
4278 break;
4280 if (mtmp->mtame && hastoeat && moves > EDOG(mtmp)->hungrytime) {
4281 verbl_msg = "Splice the mainbrace!";
4282 break;
4284 if (mtmp->mtame) {
4285 verbl_msg = "Weigh anchor and hoist the mizzen!";
4286 } else if (mtmp->mpeaceful) {
4287 verbl_msg = "Yo Ho Ho!";
4289 else verbl_msg = "Scurvy dog!";
4290 break;
4291 case MS_BUSY:
4292 if (mtmp->mtame && mtmp->mhp < mtmp->mhpmax/3) {
4293 verbl_msg = "I can't do this anymore...";
4294 break;
4296 if (mtmp->mtame && hastoeat && moves > EDOG(mtmp)->hungrytime) {
4297 verbl_msg = "Quick lunchbreak before I get back to work!";
4298 break;
4300 else verbl_msg = "I'm very busy! Please don't disturb me!";
4301 break;
4302 case MS_SILLY:
4303 if (mtmp->mtame && mtmp->mhp < mtmp->mhpmax/3) {
4304 verbl_msg = "Soon I will go dead, but bring myself back into the play.";
4305 break;
4307 if (mtmp->mtame && hastoeat && moves > EDOG(mtmp)->hungrytime) {
4308 verbl_msg = "Now I need to eat a food ration that contains meat, because I don't have an eating disorder.";
4309 break;
4311 if (mtmp->mtame) {
4312 verbl_msg = "Do you want me to alternate between massaging your nuts and kicking them?";
4313 } else if (mtmp->mpeaceful) {
4314 verbl_msg = "The block heels are made of cuddle cloth!";
4316 else verbl_msg = "Now I will pull you the pants down!";
4317 break;
4318 case MS_MIDI:
4319 if (mtmp->mtame && mtmp->mhp < mtmp->mhpmax/3) {
4320 verbl_msg = "rnn rnn rnn RNN RNN RNN!";
4321 break;
4323 if (mtmp->mtame && hastoeat && moves > EDOG(mtmp)->hungrytime) {
4324 verbl_msg = "deeeeeeeee, dededidadaDEEEEEEE-daaaaa-deeeeee!";
4325 break;
4327 if (mtmp->mtame) {
4328 verbl_msg = "klimpklamp";
4329 } else if (mtmp->mpeaceful) {
4330 verbl_msg = "klampklimpklamp";
4332 else verbl_msg = "klilili!";
4333 break;
4334 case MS_HERCULES:
4335 if (mtmp->mtame && mtmp->mhp < mtmp->mhpmax/3) {
4336 verbl_msg = "Impossible. I cannot fail.";
4337 break;
4339 if (mtmp->mtame && hastoeat && moves > EDOG(mtmp)->hungrytime) {
4340 verbl_msg = "Even I have to eat something from time to time. So, where can we get some meat?";
4341 break;
4343 if (mtmp->mtame) {
4344 verbl_msg = "With your assistance, we will overcome all the obstacles.";
4345 } else if (mtmp->mpeaceful) {
4346 verbl_msg = "Hey, I'm on a task given to me by the gods themselves!";
4348 else verbl_msg = "You won't stop me! I'm a God, you puny mortal!";
4349 break;
4350 case MS_BEG:
4351 verbalize("Hey, I have no money to buy food, will you spare %d zorkmids, noble adventurer?", mtmp->m_lev + u.ulevel);
4352 if (u.ugold >= (mtmp->m_lev + u.ulevel)) {
4353 if (yn("Give the beggar some cash?") == 'y') {
4354 verbalize("Thanks! I'll never forget this.");
4355 u.ugold -= (mtmp->m_lev + u.ulevel);
4356 if (!mtmp->mpeaceful) {
4357 mtmp->mpeaceful = TRUE;
4358 mtmp->mfrenzied = FALSE;
4360 if (Race_if(PM_HUMANOID_DEVIL)) devil_misbehavior();
4361 else if (u.ualign.type != A_CHAOTIC) adjalign(1);
4362 } else {
4363 verbalize("You're so cheap!");
4365 } else {
4366 pline("But you don't have enough money.");
4369 break;
4370 case MS_HIRE:
4371 case MS_ARMORER:
4372 case MS_OMEN:
4373 case MS_NEWS:
4374 case MS_CRYTHROAT:
4375 case MS_HOOT:
4376 case MS_RUSTLE:
4377 case MS_SEMEN:
4378 case MS_SCIENTIST:
4379 case MS_MODALSHOP:
4380 /* todo */
4381 verbl_msg = "The sound effect of this monster has not been implemented yet.";
4382 break;
4384 case MS_FEARHARE:
4385 if (mtmp->mtame && mtmp->mhp < mtmp->mhpmax/3) {
4386 verbl_msg = "Help me, help me! I can't handle them myself!";
4387 break;
4389 if (mtmp->mtame && hastoeat && moves > EDOG(mtmp)->hungrytime) {
4390 verbl_msg = "Please, let's get something to eat, I'm afraid that if I don't eat, then some monster will eat me!";
4391 break;
4393 if (mtmp->mtame) {
4394 verbl_msg = "Are you sure you know where you're going?";
4395 } else if (mtmp->mpeaceful) {
4396 verbl_msg = "The situation clearly can't get any worse than this.";
4398 else verbl_msg = "Stop attacking, I'm a fiend! Err, friend! Fruck, I always mess that R up.";
4399 break;
4400 case MS_SPOILER:
4401 if (mtmp->mhp < mtmp->mhpmax/3) {
4402 pline_msg = "Unhandled exception: At address 002EF0C";
4403 break;
4405 if (mtmp->mconf) {
4406 pline_msg = "Application termination, app event: BEX";
4407 break;
4409 if (mtmp->mtame) {
4410 pline_msg = "Network Error: NO ERROR";
4411 } else if (mtmp->mpeaceful) {
4412 pline_msg = "Error: No route to host";
4414 else pline_msg = "Runtime Error - program is running at the wrong time of the day. Please restart the program later.";
4415 break;
4416 case MS_DEAD:
4417 if (mtmp->mtame && mtmp->mhp < mtmp->mhpmax/3) {
4418 verbl_msg = "Now I have to experience death a second time, because of you...";
4419 break;
4421 if (mtmp->mconf) {
4422 verbl_msg = "Huh, am I dead now? I think I'm dead! Or is this all just a dream?";
4423 break;
4425 if (mtmp->mtame && hastoeat && moves > EDOG(mtmp)->hungrytime) {
4426 verbl_msg = "Oh well, I think I'll just starve to death now, that wouldn't be the worst possible fate.";
4427 break;
4429 if (mtmp->mtame) {
4430 verbl_msg = "Yeah I guess I can assist you...";
4431 } else if (mtmp->mpeaceful) {
4432 verbl_msg = "Who resurrected me?!";
4434 else verbl_msg = "I tell you, if you're responsible for disturbing my peaceful slumber I'll make sure that you die before I do!";
4435 break;
4436 case MS_TREESQUAD:
4437 if (mtmp->mtame && mtmp->mhp < mtmp->mhpmax/3) {
4438 verbl_msg = "Even if I die, the trees will be protected by my comrades!";
4439 break;
4441 if (mtmp->mconf) {
4442 verbl_msg = "What is that huge mana flower doing there, can I harvest ambrosia or lichor from it?";
4443 break;
4445 if (mtmp->mtame && hastoeat && moves > EDOG(mtmp)->hungrytime) {
4446 verbl_msg = "Gotta eat some acorns and berries!";
4447 break;
4449 if (mtmp->mtame) {
4450 verbl_msg = "Don't hesitate to kill anyone who dares chopping down a tree.";
4451 } else if (mtmp->mpeaceful) {
4452 verbl_msg = "Remember, nature has to be protected at all times. Everyone who applies an axe to a tree is a criminal!";
4454 else verbl_msg = "You devil, I'll make sure you never fell a tree again!";
4455 break;
4456 case MS_METALMAFIA:
4457 if (mtmp->mtame && mtmp->mhp < mtmp->mhpmax/3) {
4458 verbl_msg = "Dammit, they're defending their metal with teeth and claws!";
4459 break;
4461 if (mtmp->mtame && hastoeat && moves > EDOG(mtmp)->hungrytime) {
4462 verbl_msg = "Let's spend our money on a good meal, and then we'll resume stealing metal!";
4463 break;
4465 if (mtmp->mtame) {
4466 verbl_msg = "Let's go! We gotta find someone who has valuable metal that we can steal and sell for profit!";
4467 } else if (mtmp->mpeaceful) {
4468 verbl_msg = "Metal is the only material worth anything on the black market.";
4469 } else if (mtmp->mfrenzied) {
4470 verbl_msg = "I'm gonna kill you, and then I'll loot your backpack for metallic items that I can sell.";
4471 } else {
4472 verbalize("Gimme your metal!");
4474 /* metal mafia goons want your metal, and if you give them something that weighs enough, they may
4475 * turn peaceful and leave you alone, but it's only a chance --Amy */
4477 register struct obj *metalmafiaotmp;
4479 metalmafiaagain:
4481 metalmafiaotmp = getobj(allnoncount, "offer to the metal mafia");
4483 if (!metalmafiaotmp) {
4484 verbalize("I said, gimme your metal!");
4485 break;
4487 if (!is_metallic(metalmafiaotmp)) {
4488 verbalize("Stop bullshitting me, that thing's not metal and therefore it's worthless! Gimme your metal dammit!");
4489 break;
4491 if (metalmafiaotmp->oartifact) {
4492 verbalize("Hey, I ain't touching something that hot!");
4493 break;
4495 if (objects[(metalmafiaotmp)->otyp].oc_material == MT_ETHER) {
4496 verbalize("Stay the hell away with that contaminated garbage!");
4497 break;
4499 if (evades_destruction(metalmafiaotmp)) {
4500 verbalize("No way! There's no fence on the black market who would buy that!");
4501 break;
4503 if (metalmafiaotmp->oclass == COIN_CLASS) {
4504 verbalize("You can't bribe me with money! I need metallic items!");
4505 break;
4507 if (metalmafiaotmp->owt < 20) {
4508 useupall(metalmafiaotmp);
4509 verbalize("That's scrap metal. I'll take it, but it's not gonna fetch much cash, so... gimme something better!");
4510 goto metalmafiaagain;
4511 break;
4512 } else {
4513 if (!rn2(5)) {
4514 int metalmafiaworth = rnd(100);
4515 if (metalmafiaotmp->oerodeproof) {
4516 useupall(metalmafiaotmp);
4517 mtmp->mpeaceful = TRUE;
4518 verbalize("Damn, that's a truly shiny piece! This will sell for a fortune! I officially consider you a friend now. Many thanks, the metal mafia is very pleased to do business with you!");
4519 } else if (metalmafiaotmp->owt >= metalmafiaworth) {
4520 useupall(metalmafiaotmp);
4521 mtmp->mpeaceful = TRUE;
4522 verbalize("Alright, that should do it! It's been a pleasure doing business with you. Have a nice day!");
4523 } else {
4524 useupall(metalmafiaotmp);
4525 verbalize("Yeah, that thing's good, it'll sell for some cash, but I still need more. Gimme more metal!");
4526 goto metalmafiaagain;
4528 break;
4529 } else {
4530 useupall(metalmafiaotmp);
4531 verbalize("Yeah, that thing's good, it'll sell for some cash, but I still need more. Gimme more metal!");
4532 goto metalmafiaagain;
4533 break;
4538 break;
4539 case MS_DEEPSTATE:
4540 if (mtmp->mtame && mtmp->mhp < mtmp->mhpmax/3) {
4541 verbl_msg = "We are many. I can be replaced.";
4542 break;
4544 if (mtmp->mconf) {
4545 verbl_msg = "is there some sort of deep anti-state at work?";
4546 break;
4548 if (mtmp->mtame && hastoeat && moves > EDOG(mtmp)->hungrytime) {
4549 verbl_msg = "Need food.";
4550 break;
4552 if (mtmp->mtame) {
4553 verbl_msg = "Don't say a word.";
4554 } else if (mtmp->mpeaceful) {
4555 verbl_msg = "You've never seen me, aight?";
4557 else verbl_msg = rn2(2) ? "You're dead." : "This is your end.";
4558 break;
4559 case MS_PRINCESSLEIA:
4560 if (mtmp->mtame && mtmp->mhp < mtmp->mhpmax/10) {
4561 verbl_msg = "Noooooo! I may not die! If I die, this kingdom will perish!";
4562 break;
4564 if (mtmp->mtame && mtmp->mhp < mtmp->mhpmax/3) {
4565 verbl_msg = "Please repair my broken nail!";
4566 break;
4568 if (mtmp->mtame && mtmp->mconf) {
4569 verbl_msg = "That green elf dude... I think his name was Zelda, right? And he has to defeat that horned demon named Link to save the kingdom of Ganondorf!";
4570 break;
4572 if (mtmp->mtame && hastoeat && moves > EDOG(mtmp)->hungrytime) {
4573 verbl_msg = "Oh, I just remember that I baked a cake, but I forgot where I left it? Can you find it, then we can eat it together?";
4574 break;
4576 if (mtmp->mtame && mtmp->bleedout) {
4577 verbl_msg = "Do something! You see that I'm dripping my blue blood all over the place!";
4578 break;
4580 if (mtmp->mtame) verbl_msg = "Together, we can peacefully rule this kingdom.";
4581 else if (mtmp->mpeaceful) verbl_msg = "Have you seen Han Solo?";
4582 else if (mtmp->mfrenzied) verbl_msg = "You cannot defeat the princess! My marital arts training will pay off and I'll chase you away!";
4583 else verbl_msg = "Are you trying to invade my kingdom? Because if you are, I'll have to bludgeon you with my pointy pink girl shoes.";
4585 break;
4586 case MS_SISSY:
4587 verbl_msg = "waaaaaaah...";
4588 break;
4589 case MS_SING:
4590 if (mtmp->mtame && mtmp->mhp < mtmp->mhpmax/3) {
4591 verbl_msg = "What, why'd they turn on me? I was supposed to rule them...";
4592 break;
4594 if (mtmp->mtame && hastoeat && moves > EDOG(mtmp)->hungrytime) {
4595 verbl_msg = "Oh, I'm afraid I've run out of bloodpacks, do you have some for me?";
4596 break;
4598 if (mtmp->mtame) {
4599 verbl_msg = "It's nice of you to help me force those slaves to clean the girls' shoes.";
4601 else if (mtmp->mpeaceful) verbl_msg = "Hey, do you want to assist me? I'd be thrilled if you were to step into dog shit with your shoes, because then I can force my slaves to clean your shoes, and when they're done, you'll get them back.";
4602 else verbl_msg = "You know the rules. You have to clean the dog shit off of every pair of female shoes that I present to you, and you're not allowed to use anything other than your hands and a can of shoe polish.";
4603 break;
4604 case MS_BULLETATOR:
4605 if (mtmp->mconf) {
4606 verbl_msg = "Hmm... I think the BFG is not an automatic weapon, so using it is okay...";
4607 break;
4609 if (mtmp->mtame && mtmp->mhp < mtmp->mhpmax/10) {
4610 verbl_msg = "Save me! Please!";
4611 break;
4613 if (mtmp->mtame && mtmp->mhp < mtmp->mhpmax/3) {
4614 verbl_msg = "Can you heal me, please?";
4615 break;
4617 if (mtmp->mtame && hastoeat && moves > EDOG(mtmp)->hungrytime) {
4618 verbl_msg = "Need food!";
4619 break;
4621 if (mtmp->mtame) {
4622 switch (rnd(5)) {
4623 case 1:
4624 if (bulletator_allowed(1)) verbl_msg = "Don't worry, you can use automatic firearms.";
4625 else verbl_msg = "A reminder that you unfortunately can't use automatic firearms.";
4626 break;
4627 case 2:
4628 if (bulletator_allowed(2)) verbl_msg = "Don't worry, you can use the hydra bow.";
4629 else verbl_msg = "A reminder that you unfortunately can't use the hydra bow.";
4630 break;
4631 case 3:
4632 if (bulletator_allowed(3)) verbl_msg = "Don't worry, you can use the demon crossbow.";
4633 else verbl_msg = "A reminder that you unfortunately can't use the demon crossbow.";
4634 break;
4635 case 4:
4636 if (bulletator_allowed(4)) verbl_msg = "Don't worry, you can use the catapult.";
4637 else verbl_msg = "A reminder that you unfortunately can't use the catapult.";
4638 break;
4639 case 5:
4640 if (bulletator_allowed(5)) verbl_msg = "Don't worry, you can use flamethrowers.";
4641 else verbl_msg = "A reminder that you unfortunately can't use flamethrowers.";
4642 break;
4644 } else if (mtmp->mpeaceful) {
4645 switch (rnd(5)) {
4646 case 1:
4647 if (bulletator_allowed(1)) verbl_msg = "You may use automatic firearms.";
4648 else verbl_msg = "Remember, you're not allowed to use automatic firearms!";
4649 break;
4650 case 2:
4651 if (bulletator_allowed(2)) verbl_msg = "You may use the hydra bow.";
4652 else verbl_msg = "Remember, you're not allowed to use the hydra bow!";
4653 break;
4654 case 3:
4655 if (bulletator_allowed(3)) verbl_msg = "You may use the demon crossbow.";
4656 else verbl_msg = "Remember, you're not allowed to use the demon crossbow!";
4657 break;
4658 case 4:
4659 if (bulletator_allowed(4)) verbl_msg = "You may use the catapult.";
4660 else verbl_msg = "Remember, you're not allowed to use the catapult!";
4661 break;
4662 case 5:
4663 if (bulletator_allowed(5)) verbl_msg = "You may use flamethrowers.";
4664 else verbl_msg = "Remember, you're not allowed to use flamethrowers!";
4665 break;
4667 } else {
4668 verbl_msg = "Now you'll be punished for using automatic weapons.";
4669 break;
4671 break;
4672 case MS_FLUIDATOR:
4673 if (mtmp->mconf) {
4674 verbl_msg = "What are we to now make?";
4675 break;
4677 if (mtmp->mtame && mtmp->mhp < mtmp->mhpmax/10) {
4678 verbl_msg = "I am equal dead! Assistance!";
4679 break;
4681 if (mtmp->mtame && mtmp->mhp < mtmp->mhpmax/3) {
4682 verbl_msg = "I must take some welfare watering places!";
4683 break;
4685 if (mtmp->mtame && hastoeat && moves > EDOG(mtmp)->hungrytime) {
4686 verbl_msg = "I custom which to eat!";
4687 break;
4689 if (mtmp->mtame) {
4690 verbl_msg = u.fluidatorwantedlevel ? "Are you glad, with me to allies its?" : "You is my buddy!";
4692 else if (mtmp->mpeaceful) {
4693 verbl_msg = u.fluidatorwantedlevel ? "Now you are however to!" : "Is greeted, unknown potato.";
4694 if (u.fluidatorwantedlevel) mtmp->mpeaceful = FALSE;
4696 else verbl_msg = u.fluidatorwantedlevel ? "Now you can however which experience, you hybrid!" : "We are attacked becoming!";
4697 break;
4698 case MS_POMPEJI:
4699 if (mtmp->mtame && mtmp->mhp < mtmp->mhpmax/3) {
4700 verbl_msg = "Pom... peji...";
4701 break;
4703 if (mtmp->mtame && hastoeat && moves > EDOG(mtmp)->hungrytime) {
4704 verbl_msg = "Pompeji-pompeji!";
4705 break;
4707 if (mtmp->mtame) {
4708 verbl_msg = "Poooooom peeeeeeee jiiiiiiii!";
4710 else if (mtmp->mpeaceful) verbl_msg = "Pompeji.";
4711 else verbl_msg = "Pompe-e-ji!";
4712 break;
4713 case MS_ALLA:
4714 if (!mtmp->mtame && !mtmp->mpeaceful) verbl_msg = "you will lose";
4715 break;
4716 case MS_POKEDEX:
4717 if (mtmp->mtame && mtmp->mhp < mtmp->mhpmax/3) {
4718 verbl_msg = "Argh, I bit off more than I can chew! That monster is too strong!";
4719 break;
4721 if (mtmp->mtame && hastoeat && moves > EDOG(mtmp)->hungrytime) {
4722 verbl_msg = "All that pokemon hunting has caused me to go hungry! I got to eat some berries!";
4723 break;
4725 if (mtmp->mtame) {
4726 verbl_msg = "Let's look for new pokemon in that grass patch over there.";
4728 else if (mtmp->mpeaceful) verbl_msg = "Hmm, my PokeWalker(TM) said that a couple new pokemon species can be encountered on this level...";
4729 else verbl_msg = "Go away, this is my pokemon hunting ground! I'm not letting you catch the shinies here, you hear?";
4730 break;
4731 case MS_BOT:
4732 if (mtmp->mtame && mtmp->mhp < mtmp->mhpmax/3) {
4733 verbl_msg = "Calculating chance of success... 25%%.";
4734 break;
4736 if (mtmp->mtame && hastoeat && moves > EDOG(mtmp)->hungrytime) {
4737 verbl_msg = "Hungry! Let's go to the bar!";
4738 break;
4740 if (mtmp->mtame) {
4741 verbl_msg = "I protect and serve you.";
4743 else if (mtmp->mpeaceful) verbl_msg = "Another great day in the history of our army!";
4744 else verbl_msg = "Please don't be surprised if I kill you. That's just my programming.";
4745 break;
4746 case MS_APOC:
4747 if (mtmp->mhp < mtmp->mhpmax/3) {
4748 verbl_msg = "Just fucking kill me now.";
4749 break;
4751 if (mtmp->mtame && hastoeat && moves > EDOG(mtmp)->hungrytime) {
4752 verbl_msg = "Of course, the food supply chains have broken down too...";
4753 break;
4755 if (mtmp->mtame) {
4756 verbl_msg = "This world is headed towards destruction.";
4758 else if (mtmp->mpeaceful) verbl_msg = "Did you know that the end of the world is coming?";
4759 else verbl_msg = "Oh, don't mind me, I know that we're all gonna die anyway.";
4760 break;
4762 case MS_GIBBERISH:
4763 pline("%s", generate_garbage_string());
4764 break;
4765 case MS_CASINO:
4767 boolean willdisappear = 0;
4768 int returnvalue = 0;
4769 verbalize("Hello sir, welcome to 'Fortune Cookie' casino!"); /* from Elona, where they always say 'sir' even if you're female */
4770 returnvalue = play_blackjack(FALSE);
4771 if (returnvalue == 2) willdisappear = 1;
4772 if (returnvalue >= 1 && (mtmp->data == &mons[PM_CROUPIER] || mtmp->data == &mons[PM_MASTER_CROUPIER] || mtmp->data == &mons[PM_EXPERIENCED_CROUPIER] || mtmp->data == &mons[PM_EXCEPTIONAL_CROUPIER] || mtmp->data == &mons[PM_ELITE_CROUPIER]) ) {
4773 /* you played, so the croupier should become peaceful; other MS_CASINO monsters don't care */
4774 mtmp->mfrenzied = FALSE;
4775 mtmp->mpeaceful = TRUE;
4778 if (willdisappear) {
4779 mongone(mtmp);
4780 verbalize("Sorry sir, I've been ordered to return to Las Venturas! Thanks for playing!");
4781 return(1);
4783 verbalize("Remember, if you win, your reward will be dropped on the ground beneath you.");
4785 break;
4786 case MS_COW:
4787 if (mtmp->mtame) {
4788 if (mtmp->mhp < mtmp->mhpmax/3)
4789 pline_msg = "breathes heavily.";
4790 else if (mtmp->mtame && hastoeat && !mtmp->isminion && moves > EDOG(mtmp)->hungrytime)
4791 pline_msg = "makes a distressed bellow.";
4792 else
4793 pline_msg = "bellows.";
4795 else pline_msg = "bellows.";
4796 break;
4797 case MS_BONES:
4798 if (mtmp->mtame && mtmp->mhp < mtmp->mhpmax/3) {
4799 pline("%s's bones seem about to break!", Monnam(mtmp));
4800 } else {
4801 pline(FunnyHallu ? "%s plays the xylophone!" : "%s rattles noisily.", Monnam(mtmp));
4802 You("freeze for a moment.");
4803 nomul(-2, "scared by rattling", TRUE);
4804 nomovemsg = 0;
4806 break;
4807 case MS_LAUGH:
4809 if (mtmp->mtame && mtmp->mhp < mtmp->mhpmax/4) {
4810 verbl_msg = "Hahahahahahahaaaaaaaaaa!"; /* Super Mario 64 :P */
4811 break;
4815 static const char * const laugh_msg[4] = {
4816 "giggles.", "chuckles.", "snickers.", "laughs.",
4818 pline_msg = laugh_msg[rn2(4)];
4820 break;
4821 case MS_MUMBLE:
4822 if (mtmp->mtame && mtmp->mhp < mtmp->mhpmax/3) {
4823 pline_msg = "mumbles faintly.";
4824 } else pline_msg = "mumbles incomprehensibly.";
4825 break;
4826 case MS_DJINNI:
4828 if (mtmp->data == &mons[PM_POEZ_PRESIDENT] && u.ualign.type == A_CHAOTIC && !mtmp->mtame && !mtmp->mfrenzied) {
4830 mtmp->mpeaceful = TRUE;
4831 verbalize("Hey %s! I see you're a POEZ member! I'm gonna join your team!", playeraliasname);
4833 struct monst *ppresident;
4834 ppresident = tamedog(mtmp, (struct obj *) 0, TRUE);
4835 if (ppresident) mtmp = ppresident;
4836 if (!mtmp) impossible("poez president was tamed but doesn't exist now??");
4837 break;
4840 if (mtmp->data == &mons[PM_GIRL_OUTSIDE_GANG] && u.ualign.type == A_LAWFUL && !mtmp->mtame && !mtmp->mfrenzied) {
4842 mtmp->mpeaceful = TRUE;
4843 verbalize("%s! It is good that you have come! You see, I'm one of the few girls that resisted joining those filthy youth gangs. Since you despise them as much as I do, I decide to join your cause.", playeraliasname);
4845 struct monst *ppresident;
4846 ppresident = tamedog(mtmp, (struct obj *) 0, TRUE);
4847 if (ppresident) mtmp = ppresident;
4848 if (!mtmp) impossible("girl outside gang was tamed but doesn't exist now??");
4849 break;
4852 if (mtmp->data == &mons[PM_OCCASIONAL_FRIEND] && u.ualign.type == A_NEUTRAL && !mtmp->mtame && !mtmp->mfrenzied) {
4854 mtmp->mpeaceful = TRUE;
4855 verbalize("Yeeeeah! %s, let's mow down all our opponents! I'll gladly join your team, and then we'll be unstoppable!", playeraliasname);
4857 struct monst *ppresident;
4858 ppresident = tamedog(mtmp, (struct obj *) 0, TRUE);
4859 if (ppresident) mtmp = ppresident;
4860 if (!mtmp) impossible("girl outside gang was tamed but doesn't exist now??");
4861 break;
4865 if (mtmp->mtame) {
4866 verbl_msg = "Sorry, I'm all out of wishes.";
4867 } else if (mtmp->mpeaceful) {
4868 if (ptr == &mons[PM_WATER_DEMON])
4869 pline_msg = "gurgles.";
4870 else
4871 verbl_msg = "I'm free!";
4872 } else verbl_msg = "This will teach you not to disturb me!";
4874 break;
4875 case MS_SHOE:
4877 if (mtmp->mtame && mtmp->mhp < mtmp->mhpmax/3) {
4878 if (u.usteed == mtmp)
4879 verbl_msg = "Why do you wear us out like that? Can't you, like, try to avoid the mud and dogshit?";
4880 else
4881 verbl_msg = "Nooooo! We're nearing the end of our lifetime! Can you please take us to a shoe repair shop?";
4882 } else if (mtmp->mfrenzied) {
4883 if (u.usteed == mtmp)
4884 verbl_msg = "Wear us if you want, but take us off and we'll scratch you to death and make your blood squirt in all directions.";
4885 else
4886 verbl_msg = "We'll scratch very bloody wounds on your legs and kill you.";
4887 } else if (mtmp->mtame) {
4888 if (u.usteed == mtmp)
4889 verbl_msg = "Yes! Please! Keep wearing us and we'll take you to the end of the world and beyond!";
4890 else
4891 verbl_msg = "Come on my dear, find someone whom we can kick to death!";
4892 } else if (mtmp->mpeaceful) {
4893 if (u.usteed == mtmp)
4894 verbl_msg = "You're not our owner, but we allow you to wear us for a while because we like you.";
4895 else
4896 verbl_msg = "We are beautiful, in every single way!";
4897 } else {
4898 if (u.usteed == mtmp)
4899 verbl_msg = "Okay, you may wear us. But as soon as you take us off, we'll teach you a lesson in pain.";
4900 else
4901 verbl_msg = "You don't need to fight. Just stand there and we'll cause soothing pain to you.";
4903 break;
4904 case MS_STENCH:
4906 if (mtmp->mtame && mtmp->mhp < mtmp->mhpmax/3) {
4907 verbl_msg = "I sure hope you'll protect me with your life.";
4908 break;
4910 if (mtmp->mtame && !mtmp->isminion && hastoeat && moves > EDOG(mtmp)->hungrytime) {
4911 verbl_msg = "Dinner time! Can you take me to a noble restaurant please?";
4912 break;
4915 if (mtmp->data == &mons[PM_MANDARUCK] && !mtmp->mfrenzied) {
4917 if (!mtmp->mpeaceful && !mtmp->mfrenzied) mtmp->mpeaceful = TRUE;
4919 static const char *hint_msgs[] = {
4920 "Always guard your purse from thieves.",
4921 "Be wary of Jessica, she might not look like it but she'll steal your money repeatedly.",
4922 "Careful when dealing with the mysterious 2! They're known to sneak into your backpack as blind passengers!",
4923 "The journalist Rhea wants to open your backpack and film it at the same time, which will cause you to appear in the newspaper in a rather negative light...",
4924 "Don't react to Mariya when she clicks open all the drawers of your backpack. She will seduce you if you confront her, and then make you unconscious.",
4925 "If your backpack is suddenly much heavier with no warning, it means that Wendy jumped on top of it and you're dragging her weight.",
4926 "There's a sexy princess called Cathlette, but she's really evil. God help you if she decides to make you a target.",
4927 "Watch out for Lisa's tricks. She will divert you by talking about boring stuff.",
4928 "Make sure you don't turn your back on May-Britt, or she might end up breaking your backpack's zippers!",
4930 verbalize("%s", hint_msgs[rn2(SIZE(hint_msgs))]);
4932 break;
4935 if (mtmp->data == &mons[PM_TEARFRAN] && !mtmp->mfrenzied) {
4937 if (mtmp->mpeaceful) {
4938 verbalize("*sob*... there are no good days in this life at all, there are only terrible ones... *sob*");
4939 } else if (u.ualign.record > 0) {
4940 mtmp->mpeaceful = TRUE;
4941 verbalize("Oh... I see you care for me... please, protect me from harm...");
4942 pline("You can see tears running down %s's cheeks, and try your best to make her feel better.", mon_nam(mtmp));
4943 } else if (u.ualign.record < 0) {
4944 mtmp->mfrenzied = TRUE;
4945 monflee(mtmp, 100, TRUE, TRUE);
4946 verbalize("*sob* *sob* You're just as evil as all the other people... please end this life of misery and agony already...");
4947 } else verbalize("Oh... can I talk to you?");
4948 break;
4952 if (mtmp->data == &mons[PM_MELISTRIDE] && PlayerInHighHeels && !mtmp->mfrenzied) {
4953 mtmp->mpeaceful = TRUE;
4954 verbalize("Wow, I really like your heels, %s!", playeraliasname);
4956 if (ACURR(A_CHA) >= 18 && !mtmp->mtame) {
4957 struct monst *melistride;
4958 melistride = tamedog(mtmp, (struct obj *) 0, TRUE);
4959 if (melistride) mtmp = melistride;
4960 if (mtmp) verbalize("You know what? I'll join you. We're in this together, after all. Let's complete our tasks in a team effort!");
4961 else impossible("melistride was tamed but doesn't exist now??");
4963 break;
4966 if (mtmp->data == &mons[PM_NASTROSCHA] && (uarmg && itemhasappearance(uarmg, APP_VELVET_GLOVES) ) && !mtmp->mfrenzied) {
4967 mtmp->mpeaceful = TRUE;
4968 pline("With your velvet gloves, you caress %s...", mon_nam(mtmp));
4970 if (!mtmp->mtame) {
4971 struct monst *nastroscha;
4972 nastroscha = tamedog(mtmp, (struct obj *) 0, TRUE);
4973 if (nastroscha) mtmp = nastroscha;
4974 if (!mtmp) impossible("nastroscha was tamed but doesn't exist now??");
4975 else pline("Suddenly %s is absolutely in love with you!", mon_nam(mtmp));
4976 } else verbalize("Ooh %s, I really like those velvety soft gloves...", playeraliasname);
4977 break;
4980 if (mtmp->data == &mons[PM_WUXTINA] && !mtmp->mcan) {
4981 verbalize("Get the fuck out of here! I'm the only one who may use the analysis port now and if you want to use it too you have to stand in the fucking line!");
4983 if (yn("Do you obey the command that the wuxtina uttered with her bitchy voice?") != 'y') {
4984 pline("%s suddenly sprays her scentful perfume right into your %s.", Monnam(mtmp), body_part(FACE));
4985 u.cnd_perfumecount++;
4986 if (Role_if(PM_SOCIAL_JUSTICE_WARRIOR)) sjwtrigger();
4987 if (Role_if(PM_HUSSY)) {
4988 You("joyously inhale %s's scentful perfume. It's very soothing.", mon_nam(mtmp));
4989 } else {
4990 pline("Inhaling %s's scentful perfume is not the brightest idea. But in this case you didn't have a choice...", mon_nam(mtmp));
4992 if (rn2(10) && uarmh && itemhasappearance(uarmh, APP_GAS_MASK) ) {
4993 pline("But the gas mask protects you from the effects.");
4994 } else if (rn2(5) && uarmf && uarmf->oartifact == ART_CLAUDIA_S_SELF_WILL) {
4995 pline("But you actually enjoy the lovely scent.");
4996 } else if (rn2(20) && uwep && uwep->oartifact == ART_HIGH_ORIENTAL_PRAISE) {
4997 pline("But you actually enjoy the lovely scent.");
4998 } else if (rn2(10) && uarmf && uarmf->oartifact == ART_KATHARINA_S_SIGH) {
4999 pline("But you actually enjoy the lovely scent.");
5000 } else {
5001 badeffect();
5002 if (rn2(2)) increasesanity(rnz(20 + mtmp->m_lev));
5006 } else {
5008 mtmp->mcan = TRUE;
5010 if (((u.uhave.amulet) && !u.freeplaymode) || CannotTeleport || (u.usteed && mon_has_amulet(u.usteed)) ) { pline("You shudder for a moment."); (void) safe_teleds_normalterrain(FALSE); break;}
5011 if (playerlevelportdisabled()) {
5012 pline("For some reason you resist the banishment!");
5013 break;
5016 make_stunned(HStun + 2, FALSE); /* to suppress teleport control that you might have */
5018 if (!u.banishmentbeam) {
5019 u.banishmentbeam = 1;
5020 nomul(-2, "being banished", FALSE);
5022 verbalize(!rn2(4) ? "Don't molest me ever again. If you do, I'll kick your hands bloodily with my dancing shoes." : !rn2(3) ? "Good riddance. Now get lost and annoy other girls instead." : !rn2(2) ? "Get lost before I start burning your arm with my candle." : "If you ever come back, I'm gonna extinguish my cigarette right in your face.");
5023 if (FunnyHallu) pline("(She obviously likes assholes, you say to yourself.)");
5027 break;
5030 u.cnd_perfumecount++;
5031 if (Role_if(PM_SOCIAL_JUSTICE_WARRIOR)) sjwtrigger();
5032 if (Role_if(PM_HUSSY)) {
5033 You("joyously inhale %s's scentful perfume. It's very soothing.", mon_nam(mtmp));
5034 } else {
5035 pline("Inhaling %s's scentful perfume is not the brightest idea.", mon_nam(mtmp));
5037 if (rn2(10) && uarmh && itemhasappearance(uarmh, APP_GAS_MASK) ) {
5038 pline("But the gas mask protects you from the effects.");
5039 } else if (rn2(5) && uarmf && uarmf->oartifact == ART_CLAUDIA_S_SELF_WILL) {
5040 pline("But you actually enjoy the lovely scent.");
5041 } else if (rn2(20) && uwep && uwep->oartifact == ART_HIGH_ORIENTAL_PRAISE) {
5042 pline("But you actually enjoy the lovely scent.");
5043 } else if (rn2(10) && uarmf && uarmf->oartifact == ART_KATHARINA_S_SIGH) {
5044 pline("But you actually enjoy the lovely scent.");
5045 } else {
5046 badeffect();
5047 if (rn2(2)) increasesanity(rnz(20 + mtmp->m_lev));
5051 break;
5053 case MS_CONVERT:
5055 if (mtmp->mtame) {
5056 if (mtmp->mhp < mtmp->mhpmax/3)
5057 verbl_msg = "Allah bana bunu yapan kafirleri cezalandiracak!";
5058 else if (mtmp->mtame && !mtmp->isminion && hastoeat && moves > EDOG(mtmp)->hungrytime)
5059 verbl_msg = "Baska bir doener kebap yemem gerek!";
5060 else if (mtmp->mconf || mtmp->mflee || mtmp->mtrapped)
5061 verbl_msg = "Simdi kime dua etmem gerekiyor? Jahwe? Hayir, hatirliyorum, bu Buda!";
5062 else {
5063 if (flags.female) verbl_msg = "Selamlar, kiz kardes.";
5064 else verbl_msg = "Selamlar, erkek kardes.";
5066 break;
5067 } else if (mtmp->mpeaceful) {
5068 if (flags.female) verbl_msg = "Selamlar, kiz kardes.";
5069 else verbl_msg = "Selamlar, erkek kardes.";
5071 break;
5073 } else if (Race_if(PM_TURMENE) || Race_if(PM_HC_ALIEN) || Race_if(PM_SLYER_ALIEN) || (have_hardcoreaddiction() && rn2(10)) || (uarmh && uarmh->oartifact == ART_JAMILA_S_BELIEF)) {
5075 break;
5077 } else {
5079 conversionsermon();
5080 u.cnd_conversioncount++;
5081 if (Role_if(PM_SOCIAL_JUSTICE_WARRIOR)) sjwtrigger();
5085 if (uarmf && uarmf->oartifact == ART_RUEA_S_FAILED_CONVERSION && rn2(20)) break;
5086 if (uwep && uwep->oartifact == ART_CRONVERT && rn2(10)) break;
5087 if (uarmf && uarmf->oartifact == ART_EXHAUST_DAMAGE) break;
5089 if (u.ualign.record < -20 && !rn2(Race_if(PM_KORONST) ? 10 : 100) && (sgn(mtmp->data->maligntyp) != u.ualign.type) ) { /* You have been converted! */
5091 if(u.ualignbase[A_CURRENT] == u.ualignbase[A_ORIGINAL] && mtmp->data->maligntyp != A_NONE) {
5092 You("have a strong feeling that %s is angry...", u_gname());
5093 pline("%s accepts your allegiance.", align_gname(sgn(mtmp->data->maligntyp)));
5095 /* The player wears a helm of opposite alignment? */
5096 if (uarmh && uarmh->otyp == HELM_OF_OPPOSITE_ALIGNMENT)
5097 u.ualignbase[A_CURRENT] = sgn(mtmp->data->maligntyp);
5098 else
5099 u.ualign.type = u.ualignbase[A_CURRENT] = sgn(mtmp->data->maligntyp);
5100 u.ublessed = 0;
5101 flags.botl = 1;
5103 You("have a sudden sense of a new direction.");
5104 /* Beware, Conversion is costly */
5105 change_luck(-3);
5106 u.ublesscnt += (ishaxor ? 150 : 300);
5107 adjalign((int)(u.ualignbase[A_ORIGINAL] * (u.alignlim / 2)));
5109 } else {
5110 u.ugangr += 3;
5111 adjalign(-25);
5112 godvoice(sgn(mtmp->data->maligntyp), "Suffer, infidel!");
5113 change_luck(-5);
5114 (void) adjattrib(A_WIS, -2, TRUE, TRUE);
5115 angrygods(sgn(mtmp->data->maligntyp));
5121 adjalign(-(mtmp->m_lev + 1));
5123 if (!rn2(10)) badeffect();
5125 break;
5127 case MS_HCALIEN:
5129 if (mtmp->mtame) {
5130 if (mtmp->mhp < mtmp->mhpmax/3)
5131 pline("%s points a %s at %s heart.", Monnam(mtmp), mbodypart(mtmp, FINGER), mhis(mtmp));
5132 else if (mtmp->mtame && hastoeat && !mtmp->isminion && moves > EDOG(mtmp)->hungrytime)
5133 pline("%s grunts long and deeply.", Monnam(mtmp));
5134 else if (mtmp->mconf || mtmp->mflee || mtmp->mtrapped)
5135 pline("%s spins %s %s wildly.", Monnam(mtmp), mhis(mtmp), mbodypart(mtmp, HEAD));
5136 else if (Race_if(PM_TURMENE) || Race_if(PM_EGYMID) || Race_if(PM_PERVERT) || Race_if(PM_HC_ALIEN) || Race_if(PM_SLYER_ALIEN))
5137 pline("%s nods approvingly.", Monnam(mtmp));
5138 else
5139 pline("%s makes an approving gesture, but doesn't deign to talk to you.", Monnam(mtmp));
5140 break;
5143 if (mtmp->mpeaceful) {
5145 if (Race_if(PM_TURMENE) || Race_if(PM_EGYMID) || Race_if(PM_PERVERT) || Race_if(PM_HC_ALIEN) || Race_if(PM_SLYER_ALIEN)) pline("%s looks at you for a moment.", Monnam(mtmp));
5146 else pline("%s does not deign to look at you, let alone talk to you.", Monnam(mtmp));
5147 break;
5151 if (Race_if(PM_TURMENE) || Race_if(PM_HC_ALIEN) || Race_if(PM_SLYER_ALIEN) || (have_hardcoreaddiction() && rn2(4)) || (uarmh && uarmh->oartifact == ART_JAMILA_S_BELIEF)) {
5152 break;
5155 wouwoutaunt();
5156 u.cnd_wouwoucount++;
5157 if (Role_if(PM_SOCIAL_JUSTICE_WARRIOR)) sjwtrigger();
5159 badeffect();
5161 if (!obsidianprotection()) switch (rn2(17)) {
5162 case 0:
5163 case 1:
5164 case 2:
5165 case 3: make_confused(HConfusion + rnd(100 + (mtmp->m_lev * 5) ), FALSE); /* 40% */
5166 break;
5167 case 4:
5168 case 5:
5169 case 6: make_confused(HConfusion + (2L * rnd(100 + (mtmp->m_lev * 5) ) / 3L), FALSE); /* 30% */
5170 make_stunned(HStun + (rnd(100 + (mtmp->m_lev * 5) ) / 3L), FALSE);
5171 break;
5172 case 7:
5173 case 8: make_stunned(HStun + (2L * rnd(100 + (mtmp->m_lev * 5) ) / 3L), FALSE); /* 20% */
5174 make_confused(HConfusion + (rnd(100 + (mtmp->m_lev * 5) ) / 3L), FALSE);
5175 break;
5176 case 9: make_stunned(HStun + rnd(100 + (mtmp->m_lev * 5) ), FALSE); /* 10% */
5177 break;
5178 case 10: make_numbed(HNumbed + rnd(100 + (mtmp->m_lev * 5) ), FALSE); /* 10% */
5179 break;
5180 case 11: make_frozen(HFrozen + rnd(100 + (mtmp->m_lev * 5) ), FALSE); /* 10% */
5181 break;
5182 case 12: make_burned(HBurned + rnd(100 + (mtmp->m_lev * 5) ), FALSE); /* 10% */
5183 break;
5184 case 13: make_feared(HFeared + rnd(100 + (mtmp->m_lev * 5) ), FALSE); /* 10% */
5185 break;
5186 case 14: make_blinded(Blinded + rnd(100 + (mtmp->m_lev * 5) ), FALSE); /* 10% */
5187 break;
5188 case 15: make_hallucinated(HHallucination + rnd(100 + (mtmp->m_lev * 5) ), FALSE, 0L); /* 10% */
5189 break;
5190 case 16: make_dimmed(HDimmed + rnd(100 + (mtmp->m_lev * 5) ), FALSE); /* 10% */
5191 break;
5193 if (!rn2(20)) increasesanity(rnd(10 + (mtmp->m_lev * 2) ));
5195 break;
5197 case MS_BOAST: /* giants */
5198 if (!mtmp->mpeaceful) {
5199 switch (rn2(4)) {
5200 case 0: pline("%s boasts about %s gem collection.",
5201 Monnam(mtmp), mhis(mtmp));
5202 break;
5203 case 1: pline_msg = "complains about a diet of mutton.";
5204 break;
5205 default: pline_msg = "shouts \"Fee Fie Foe Foo!\" and guffaws.";
5206 wake_nearto(mtmp->mx, mtmp->my, 7*7);
5207 break;
5209 break;
5211 /* else FALLTHRU */
5212 case MS_NASTYTRAP:
5213 case MS_GRAKA:
5214 case MS_JAM:
5215 case MS_HUMANOID:
5216 case MS_SPEEDBUG:
5217 case MS_LOWPRIORITY:
5218 case MS_AETHERIC:
5219 case MS_TRIP:
5220 case MS_FEMI:
5221 if (!mtmp->mpeaceful) {
5222 if (In_endgame(&u.uz) && is_mplayer(ptr)) {
5223 mplayer_talk(mtmp);
5224 break;
5225 } else return 0; /* no sound */
5227 /* Generic peaceful humanoid behaviour. */
5228 if (mtmp->mflee)
5229 pline_msg = "wants nothing to do with you.";
5230 else if (mtmp->mhp < mtmp->mhpmax/4)
5231 pline_msg = "moans.";
5232 else if (mtmp->mconf || mtmp->mstun)
5233 verbl_msg = !rn2(3) ? "Huh?" : rn2(2) ? "What?" : "Eh?";
5234 else if (!mtmp->mcansee)
5235 verbl_msg = "I can't see!";
5236 else if (mtmp->mtrapped) {
5237 struct trap *t = t_at(mtmp->mx, mtmp->my);
5239 if (t && !t->hiddentrap) t->tseen = 1;
5240 verbl_msg = "I'm trapped!";
5241 } else if (mtmp->mhp < mtmp->mhpmax/2)
5242 pline_msg = "asks for a potion of healing.";
5243 else if (mtmp->mtame && hastoeat && !mtmp->isminion && moves > EDOG(mtmp)->hungrytime)
5244 verbl_msg = "I'm hungry.";
5245 /* Specific monsters' interests */
5246 else if (is_elf(ptr))
5247 pline_msg = "curses orcs.";
5248 else if (is_dwarf(ptr))
5249 pline_msg = "talks about mining.";
5250 else if (likes_magic(ptr) && (monsndx(ptr) != PM_KLAPPTNIX) && rn2(5) )
5251 pline_msg = "talks about spellcraft.";
5252 else if (ptr->mlet == S_CENTAUR)
5253 pline_msg = "discusses hunting.";
5254 else switch (monsndx(ptr)) {
5255 case PM_HOBBIT:
5256 pline_msg = (mtmp->mhpmax - mtmp->mhp >= 10) ?
5257 "complains about unpleasant dungeon conditions."
5258 : "asks you about the One Ring.";
5259 break;
5260 #if 0 /* OBSOLETE */
5261 case PM_FARMER_MAGGOT:
5262 pline_msg = "mumbles something about Morgoth.";
5263 break;
5264 #endif
5265 case PM_ARCHEOLOGIST:
5266 pline_msg = "describes a recent article in \"Spelunker Today\" magazine.";
5267 break;
5268 case PM_TOURIST:
5269 verbl_msg = "Aloha.";
5270 break;
5271 case PM_EMERA:
5272 verbl_msg = "HATE! HATE! HATE!";
5273 break;
5274 case PM_MECHTNED:
5275 verbl_msg = "Mechtned.";
5276 break;
5277 case PM_KLAPPTNIX:
5278 verbl_msg = "Klapptnix.";
5279 break;
5280 case PM_UNLUCKY_GIRL:
5281 verbl_msg = "Damn those people who constantly make me slip into dog shit with my zipper boots!";
5282 break;
5283 case PM_FJORDE:
5284 verbl_msg = "I can't help it, I really consider fish to be the most beautiful creatures in existence.";
5285 break;
5286 case PM_PRACTICANT:
5287 verbl_msg = "I'm gonna introduce all those bastard assistants to my battering ram.";
5288 break;
5289 case PM_BUTT_LOVER:
5290 verbl_msg = "Mmmmmmmmmmm... lovely, soft butt cheeks...";
5291 break;
5292 case PM_SHOE_FETISHIST:
5293 verbl_msg = "I absolutely looooooooove high heels!";
5294 break;
5295 case PM_SECRET_ADVICE_MEMBER:
5296 verbl_msg = "Careful. I'm a member of the Secret Advice.";
5297 break;
5298 case PM_PREVERSIONER:
5299 verbl_msg = "Who the hell would design a game with a reset button that has no confirmation and simply erases your current game without giving you a chance to save???";
5300 break;
5301 case PM_GENDERSTARIST:
5302 verbl_msg = !rn2(3) ? "Sehr geehrte Buergerinnen und Buerger, die Schuelerinnen und Schueler sind unter dem gesetzlich geforderten Niveau..." : !rn2(2) ? "Sehr geehrte Buergerlnnen, die Schuelerlnnen fallen beim Pisa-Test zu oft durch..." : "Sehr geehrte Buerger*innen, die Schueler*innen weigern sich, den Gender*stern* zu* benutz*en*/*in*...*";
5303 break;
5304 case PM_DEATH_EATER:
5305 pline_msg = "talks about hunting muggles.";
5306 break;
5307 case PM_GANGSTER:
5308 pline_msg = "talks about doing a drive-by.";
5309 break;
5310 case PM_GEEK:
5311 verbl_msg = "Enematzu memalezu!";
5312 break;
5313 case PM_ALGONQUIN_BUSINESSLADY:
5314 verbl_msg = "I'm very busy! Please don't disturb me!";
5315 break;
5316 case PM_GOFF:
5317 verbl_msg = "britny is a prep!!!111";
5318 break;
5319 case PM_UNBELIEVER:
5320 verbl_msg = "Gods are nonexistant. People should stop believing in them.";
5321 break;
5322 case PM_HUSSY:
5323 verbl_msg = "Anna is gonna finish off that Walt bumbler.";
5324 break;
5325 case PM_POKEMON:
5326 verbl_msg = "Little strawberry me baby!";
5327 break;
5328 case PM_GANG_SCHOLAR:
5329 verbl_msg = "I'm constantly being bullied by the Bang Gang and Anna's hussies...";
5330 break;
5331 case PM_WALSCHOLAR:
5332 verbl_msg = "Hidden diamonds are like tree bark.";
5333 break;
5334 case PM_SINGSLAVE:
5335 verbl_msg = "That Sing bitch keeps forcing me to clean the dog shit from all the girls' shoes! Please rescue me!";
5336 break;
5337 case PM_TRANSVESTITE:
5338 verbl_msg = "Look at my heels! Do you think they're beautiful?";
5339 break;
5340 case PM_TRANSSYLVANIAN:
5341 verbl_msg = "My block-heeled combat boots are very fleecy!";
5342 break;
5343 case PM_TOPMODEL:
5344 verbl_msg = "I'm the chosen one who is going to win the ANTM show!";
5345 break;
5346 case PM_FAILED_EXISTENCE:
5347 verbl_msg = "Waaaaaah! Life has been so cruel to me!";
5348 break;
5349 case PM_ACTIVISTOR:
5350 case PM_PEACEMAKER:
5351 case PM_ACTIVIST:
5352 verbl_msg = "We're here to bring peace to the world.";
5353 break;
5354 case PM_BLEEDER:
5355 verbl_msg = "*sigh* If only I could make this bleeding stop...";
5356 break;
5357 case PM_COURIER:
5358 pline_msg = "talks about some random guy named Benny.";
5359 break;
5360 case PM_ROCKER:
5361 pline_msg = "talks about groovy music.";
5362 break;
5364 default:
5365 pline_msg = "discusses dungeon exploration.";
5366 break;
5368 break;
5369 case MS_SEDUCE:
5370 if (ptr->mlet != S_NYMPH && u.homosexual == 0) {
5372 pline("You're discovering your sexuality...");
5373 getlin("Are you homosexual? [y/yes/no] (If you answer no, you're heterosexual.)", buf);
5374 (void) lcase (buf);
5375 if (!(strcmp (buf, "yes")) || !(strcmp (buf, "y")) || !(strcmp (buf, "ye")) || !(strcmp (buf, "ys"))) u.homosexual = 2;
5376 else u.homosexual = 1;
5379 if (ptr->mlet != S_NYMPH &&
5380 could_seduceX(mtmp, &youmonst, (struct attack *)0) == 1) {
5381 (void) doseduce(mtmp);
5382 break;
5384 switch ((poly_gender() != (int) mtmp->female) ? rn2(3) : 0)
5386 case 2:
5387 verbl_msg = "Hello, sailor.";
5388 break;
5389 case 1:
5390 pline_msg = "comes on to you.";
5391 break;
5392 default:
5393 pline_msg = "cajoles you.";
5395 break;
5396 case MS_ARREST:
5397 if (mtmp->mtame && mtmp->mhp < mtmp->mhpmax/10) {
5398 verbalize("This is unit %d to headquarters. Send reinforcements! Repeat! Send reinforcements!", mtmp->m_id); /* inspired by the anachronononononononononononononaut NPCs in dnethack, thanks Chris --Amy */
5399 } else if (mtmp->mtame && mtmp->mhp < mtmp->mhpmax/3) {
5400 verbalize("Officer in need of a medic!");
5401 } else if (mtmp->mpeaceful)
5402 verbalize("Just the facts, %s.", flags.female ? "Ma'am" : "Sir");
5403 else {
5404 static const char * const arrest_msg[3] = {
5405 "Anything you say can be used against you.",
5406 "You're under arrest!",
5407 "Stop in the name of the Law!",
5409 verbl_msg = arrest_msg[rn2(3)];
5411 break;
5412 case MS_BRIBE:
5413 if (monsndx(ptr) == PM_PRISON_GUARD) {
5414 long gdemand = 500 * u.ulevel;
5415 long goffer = 0;
5417 if (!mtmp->mpeaceful && !mtmp->mtame) {
5418 pline("%s demands %ld %s to avoid re-arrest.",
5419 Amonnam(mtmp), gdemand, currency(gdemand));
5420 if ((goffer = bribe(mtmp)) >= gdemand) {
5421 verbl_msg = "Good. Now beat it, scum!";
5422 if (!mtmp->mfrenzied) mtmp->mpeaceful = 1;
5423 set_malign(mtmp);
5424 break;
5425 } else {
5426 pline("I said %ld!", gdemand);
5427 mtmp->mspec_used = 1000;
5428 break;
5430 } else {
5431 verbl_msg = "Out of my way, scum!"; /* still a jerk */
5433 } else
5434 if (mtmp->mpeaceful && !mtmp->mtame) {
5435 (void) demon_talk(mtmp);
5436 break;
5438 /* fall through */
5439 case MS_CUSS:
5440 if (!mtmp->mpeaceful)
5441 cuss(mtmp);
5443 if (mtmp->mpeaceful && monsndx(ptr) == PM_WIZARD_OF_YENDOR && Race_if(PM_RODNEYAN) ) {
5445 if (mon_has_amulet(mtmp) ) {
5446 verbalize("Here, take the amulet and use it well, %s!", flags.female ? "sister" : "brother");
5447 mdrop_special_objs(mtmp);
5449 else if (mon_has_special(mtmp) ) {
5450 verbalize("Here %s, I got a nice artifact for you!", flags.female ? "sister" : "brother");
5451 mdrop_special_objs(mtmp);
5453 else verbalize("Good luck on your quest, %s!", flags.female ? "sister" : "brother");
5457 if (mtmp->mtame && mtmp->mhp < mtmp->mhpmax/3) verbalize("Doggone it!");
5459 break;
5460 case MS_GYPSY: /* KMH */
5461 if (mtmp->mpeaceful) {
5462 gypsy_chat(mtmp);
5463 break;
5465 /* fall through */
5466 case MS_SPELL:
5468 if (mtmp->mtame && mtmp->mhp < mtmp->mhpmax/3) {
5469 pline_msg = "is trying to cast a healing spell.";
5470 break;
5473 /* deliberately vague, since it's not actually casting any spell */
5474 pline_msg = "seems to mutter a cantrip.";
5475 break;
5476 case MS_NURSE: /* services added by Amy - maybe we should make this into a menu instead of y/n prompts? */
5479 int nursesanitycost = (u.usanity * 10); /* fixed cost */
5481 int nursedecontcost = u.nursedecontamcost; /* goes up every time you purchase it */
5483 int nursehpcost = u.nurseextracost; /* goes up every time you purchase it */
5485 int nursesymbiotecost = u.nursesymbiotecost; /* goes up every time you purchase it */
5487 int nurseshutdowncost = u.nurseshutdowncost;
5489 if (Upolyd) nursehpcost /= 5;
5491 winid tmpwin;
5492 anything any;
5493 menu_item *selected;
5494 int n;
5496 if (!mtmp->nurse_extrahealth && !mtmp->nurse_decontaminate && !mtmp->nurse_healing && !mtmp->nurse_curesickness && !mtmp->nurse_curesliming && !mtmp->nurse_curesanity && !mtmp->nurse_medicalsupplies && !mtmp->nurse_purchasedrugs && !mtmp->nurse_obtainsymbiote && !mtmp->nurse_fixsymbiote && !mtmp->nurse_shutdownsymbiote && !mtmp->nurse_restoration && !mtmp->nurse_vaccine && !mtmp->nurse_alla) {
5497 verbalize("Sorry. I'm all out of services.");
5498 goto noservices;
5501 any.a_void = 0; /* zero out all bits */
5502 tmpwin = create_nhwindow(NHW_MENU);
5503 start_menu(tmpwin);
5504 any.a_int = 1;
5505 if (mtmp->nurse_extrahealth) add_menu(tmpwin, NO_GLYPH, &any , 'e', 0, ATR_NONE, "Extra Health", MENU_UNSELECTED);
5506 any.a_int = 2;
5507 if (mtmp->nurse_decontaminate) add_menu(tmpwin, NO_GLYPH, &any , 'd', 0, ATR_NONE, "Decontaminate", MENU_UNSELECTED);
5508 any.a_int = 3;
5509 if (mtmp->nurse_healing) add_menu(tmpwin, NO_GLYPH, &any , 'h', 0, ATR_NONE, "Healing", MENU_UNSELECTED);
5510 any.a_int = 4;
5511 if (mtmp->nurse_curesickness) add_menu(tmpwin, NO_GLYPH, &any , 'c', 0, ATR_NONE, "Cure Sickness", MENU_UNSELECTED);
5512 any.a_int = 5;
5513 if (mtmp->nurse_curesliming) add_menu(tmpwin, NO_GLYPH, &any , 'l', 0, ATR_NONE, "Cure Sliming", MENU_UNSELECTED);
5514 any.a_int = 6;
5515 if (mtmp->nurse_curesanity) add_menu(tmpwin, NO_GLYPH, &any , 'i', 0, ATR_NONE, "Cure Sanity", MENU_UNSELECTED);
5516 any.a_int = 7;
5517 if (mtmp->nurse_medicalsupplies) add_menu(tmpwin, NO_GLYPH, &any , 'm', 0, ATR_NONE, "Medical Supplies", MENU_UNSELECTED);
5518 any.a_int = 8;
5519 if (mtmp->nurse_purchasedrugs) add_menu(tmpwin, NO_GLYPH, &any , 'p', 0, ATR_NONE, "Purchase Drugs", MENU_UNSELECTED);
5520 any.a_int = 9;
5521 if (mtmp->nurse_obtainsymbiote) add_menu(tmpwin, NO_GLYPH, &any , 'o', 0, ATR_NONE, "Obtain Symbiote", MENU_UNSELECTED);
5522 any.a_int = 10;
5523 if (mtmp->nurse_fixsymbiote) add_menu(tmpwin, NO_GLYPH, &any , 'f', 0, ATR_NONE, "Fix Symbiote", MENU_UNSELECTED);
5524 any.a_int = 11;
5525 if (mtmp->nurse_shutdownsymbiote) add_menu(tmpwin, NO_GLYPH, &any , 's', 0, ATR_NONE, "Shutdown Symbiote", MENU_UNSELECTED);
5526 any.a_int = 12;
5527 if (mtmp->nurse_restoration) add_menu(tmpwin, NO_GLYPH, &any , 'r', 0, ATR_NONE, "Restoration", MENU_UNSELECTED);
5528 any.a_int = 13;
5529 if (mtmp->nurse_vaccine) add_menu(tmpwin, NO_GLYPH, &any , 'v', 0, ATR_NONE, "COVID-19 Vaccine", MENU_UNSELECTED);
5530 any.a_int = 14;
5531 if (mtmp->nurse_alla) add_menu(tmpwin, NO_GLYPH, &any , 'v', 0, ATR_NONE, "Gain Alla", MENU_UNSELECTED);
5533 end_menu(tmpwin, "Services Available:");
5534 n = select_menu(tmpwin, PICK_ONE, &selected);
5535 destroy_nhwindow(tmpwin);
5537 if (n > 0) {
5538 switch (selected[0].item.a_int) {
5539 case 1:
5540 if (u.ugold >= nursehpcost) {
5541 verbalize("I can inject extra health into you for %d dollars if you want.", nursehpcost);
5542 if (yn("Accept the offer?") == 'y') {
5543 verbalize("Okay, hold still while I puncture you with this long, pointy needle...");
5544 if (!rn2(10)) mtmp->nurse_extrahealth = 0;
5545 u.ugold -= nursehpcost;
5546 if (u.ualign.type == A_NEUTRAL) adjalign(1);
5547 u.cnd_nurseserviceamount++;
5548 maybegaincha();
5549 if (!Upolyd) u.uhpmax++;
5550 else u.mhmax++;
5551 use_skill(P_SQUEAKING, 1);
5552 if (uinsymbiosis) {
5553 u.usymbiote.mhpmax++;
5554 maybe_evolve_symbiote();
5555 if (u.usymbiote.mhpmax > 500) u.usymbiote.mhpmax = 500;
5557 u.nurseextracost += 50;
5558 if (u.nurseextracost < 1000) u.nurseextracost = 1000; /* fail safe */
5559 break;
5561 } else verbalize("Sorry, extra health costs %d dollars.", nursehpcost);
5563 break;
5564 case 2:
5565 if (u.ugold >= nursedecontcost && u.contamination) {
5566 verbalize("I can decontaminate you for %d dollars if you want.", nursedecontcost);
5567 if (yn("Accept the offer?") == 'y') {
5568 verbalize("Okay, hold still while I puncture you with this long, pointy needle...");
5569 if (!rn2(5)) mtmp->nurse_decontaminate = 0;
5570 u.ugold -= nursedecontcost;
5571 if (u.ualign.type == A_NEUTRAL) adjalign(1);
5572 u.cnd_nurseserviceamount++;
5573 maybegaincha();
5574 decontaminate(u.contamination);
5575 pline("Now you don't have the %d gold pieces any longer.", nursedecontcost);
5576 if (FunnyHallu) pline("You offer a 'thank you' to Captain Obvious.");
5577 u.nursedecontamcost += 500;
5578 if (u.nursedecontamcost < 1000) u.nursedecontamcost = 1000; /* fail safe */
5579 break;
5581 } else if (!u.contamination) verbalize("Huh? You don't need to do that.");
5582 else verbalize("Sorry, decontamination costs %d dollars.", nursedecontcost);
5584 break;
5585 case 3:
5587 if (u.uhp == u.uhpmax && (!Upolyd || (Upolyd && u.mh == u.mhmax))) {
5588 verbalize("Apart from potential mental disorders everything's fine with you. There's no need for me to waste my medical supplies on you.");
5589 break;
5591 if (u.ugold >= 500) {
5592 verbalize("Sure thing, I can heal you for 500 dollars.");
5593 if (yn("Accept the offer?") == 'y') {
5594 verbalize("Okay, hold still while I puncture you with this long, pointy needle...");
5595 if (!rn2(50)) mtmp->nurse_healing = 0;
5596 u.ugold -= 500;
5597 if (u.ualign.type == A_NEUTRAL) adjalign(1);
5598 u.cnd_nurseserviceamount++;
5599 maybegaincha();
5600 u.uhp += 50;
5601 if (u.uhp > u.uhpmax) u.uhp = u.uhpmax;
5602 if (Upolyd) {
5603 u.mh += 50;
5604 if (u.mh > u.mhmax) u.mh = u.mhmax;
5606 break;
5608 } else verbalize("Sorry, healing costs 500 dollars.");
5610 break;
5611 case 4:
5612 if (!Sick) {
5613 verbalize("Don't call in sick when you aren't! Come back to me when you actually have a sickness that needs curing.");
5614 break;
5616 if (u.ugold >= 5000) {
5617 verbalize("It is wise of you to come to see a doctor. For only 5000 dollars, I can heal you.");
5618 if (yn("Accept the offer?") == 'y') {
5619 verbalize("Okay, hold still while I puncture you with this long, pointy needle...");
5620 if (!rn2(15)) mtmp->nurse_curesickness = 0;
5621 u.ugold -= 5000;
5622 if (u.ualign.type == A_NEUTRAL) adjalign(1);
5623 u.cnd_nurseserviceamount++;
5624 maybegaincha();
5625 You_feel("better.");
5626 make_sick(0L, (char *) 0, FALSE, SICK_ALL);
5627 break;
5629 } else verbalize("Sorry, the cure for sickness costs 5000 dollars.");
5631 break;
5632 case 5:
5633 if (!Slimed) {
5634 verbalize("Do you see any slime on your body? No? Well, me neither. Come back when you're actually slimed.");
5635 break;
5637 if (u.ugold >= 10000) {
5638 verbalize("Eek! Yeah that would normally require a medical doctor, but if you have 10000 dollars I can give you something that should hopefully cure the sliming.");
5639 if (yn("Accept the offer?") == 'y') {
5640 verbalize("Okay, hold still while I puncture you with this long, pointy needle...");
5641 if (!rn2(12)) mtmp->nurse_curesliming = 0;
5642 u.ugold -= 10000;
5643 if (u.ualign.type == A_NEUTRAL) adjalign(1);
5644 u.cnd_nurseserviceamount++;
5645 maybegaincha();
5646 FunnyHallu ? pline("The rancid goo is gone! Yay!") : pline_The("slime disappears.");
5647 Slimed = 0;
5648 flags.botl = 1;
5649 delayed_killer = 0;
5650 break;
5652 } else verbalize("Sorry, the cure for sliming costs 10000 dollars.");
5654 break;
5655 case 6:
5656 if (u.usanity && (u.ugold >= nursesanitycost)) {
5657 verbalize("I can cure your sanity for %d dollars if you want.", nursesanitycost);
5658 if (yn("Accept the offer?") == 'y') {
5659 verbalize("Okay, hold still while I puncture you with this long, pointy needle...");
5660 if (!rn2(5)) mtmp->nurse_curesanity = 0;
5661 u.ugold -= nursesanitycost;
5662 if (u.ualign.type == A_NEUTRAL) adjalign(1);
5663 u.cnd_nurseserviceamount++;
5664 maybegaincha();
5665 reducesanity(u.usanity);
5666 break;
5668 } else if (!u.usanity) verbalize("You have no sanity that could be cured! Be glad, being insane is the preferred state of mind you want in this dungeon!");
5669 else verbalize("Sorry, the cure for sanity costs %d dollars.", nursesanitycost);
5671 break;
5672 case 7:
5673 if (u.ugold >= 10000) {
5674 verbalize("Ah, you look like a walking coinpurse. Sure, you can have medical supplies, but they come at a price. For 10000 dollars I can sell you a medical kit.");
5675 if (yn("Accept the offer?") == 'y') {
5676 u.ugold -= 10000;
5677 if (!rn2(10)) mtmp->nurse_medicalsupplies = 0;
5678 if (u.ualign.type == A_NEUTRAL) adjalign(1);
5679 u.cnd_nurseserviceamount++;
5680 maybegaincha();
5681 struct obj *medkit;
5682 medkit = mksobj(MEDICAL_KIT, TRUE, FALSE, FALSE);
5683 verbalize(medkit ? "A pleasure doing business with you. The medical kit is waiting on the ground below you." : "Whoops. It seems that I don't have supplies for you right now, but for technical reasons I can't give you a refund. Sorry.");
5684 use_skill(P_SQUEAKING, 2);
5685 if (medkit) {
5686 medkit->quan = 1;
5687 medkit->known = medkit->dknown = medkit->bknown = medkit->rknown = 1;
5688 medkit->owt = weight(medkit);
5689 dropy(medkit);
5690 stackobj(medkit);
5693 } else verbalize("Sorry, medical supplies cost 10000 dollars.");
5694 break;
5695 case 8:
5696 if (u.ugold >= 2000) {
5697 verbalize("Hmm, I think I can give you a little something, but I need 2000 dollars to cover up expenses.");
5698 if (yn("Accept the offer?") == 'y') {
5699 u.ugold -= 2000;
5700 if (!rn2(20)) mtmp->nurse_purchasedrugs = 0;
5701 if (u.ualign.type == A_NEUTRAL) adjalign(1);
5702 u.cnd_nurseserviceamount++;
5703 maybegaincha();
5704 struct obj *medkit;
5705 medkit = mksobj(rn2(2) ? MUSHROOM : PILL, TRUE, FALSE, FALSE);
5706 verbalize(medkit ? "Here, your stuff is on the ground. Have fun, but remember: if you call the cops, I'll send my assassins after you!" : "Oh, sorry, I don't have anything for you... but thanks for the money, sucker!");
5707 use_skill(P_SQUEAKING, 1);
5708 if (medkit) {
5709 medkit->quan = 1;
5710 medkit->known = medkit->dknown = medkit->bknown = medkit->rknown = 1;
5711 medkit->owt = weight(medkit);
5712 dropy(medkit);
5713 stackobj(medkit);
5717 } else verbalize("What? I'm not a dealer! But I might change my mind if you can bring at least 2000 dollars.");
5718 break;
5719 case 9:
5720 if (uinsymbiosis && u.usymbiote.cursed) {
5721 verbalize("Your current symbiote is cursed! I can't replace it with a new one unless you fix that problem first.");
5722 break;
5725 if (u.ugold < nursesymbiotecost) {
5726 verbalize("Sorry, a symbiote costs %d dollars.", nursesymbiotecost);
5727 break;
5729 if (uinsymbiosis) verbalize("This will replace your current symbiote. By continuing, I assume that you agree to discard your symbiote for a random new one.");
5731 if (u.ugold >= nursesymbiotecost) {
5732 verbalize("A symbiote injection costs %d dollars. According to current Yendorian law, I'm forced to inform you that the symbiote you receive is random and may or may not be useful to you. By continuing, you confirm that you know of this risk and will not hold me responsible if you don't like the result.", nursesymbiotecost);
5733 if (yn("Accept the offer?") == 'y') {
5734 verbalize("Alright, here's your injection.");
5735 if (!rn2(10)) mtmp->nurse_obtainsymbiote = 0;
5736 u.ugold -= nursesymbiotecost;
5737 if (u.ualign.type == A_NEUTRAL) adjalign(1);
5738 u.cnd_nurseserviceamount++;
5739 maybegaincha();
5740 getrandomsymbiote(FALSE, FALSE);
5742 u.nursesymbiotecost += 5000;
5743 if (u.nursesymbiotecost < 10000) u.nursesymbiotecost = 10000; /* fail safe */
5744 break;
5748 break;
5749 case 10:
5750 if (!uinsymbiosis) {
5751 verbalize("What? You don't have a symbiote! Sorry, but I can't fix something that doesn't exist!");
5752 break;
5754 if (!u.usymbiote.cursed && u.usymbiote.mhp == u.usymbiote.mhpmax) {
5755 verbalize("Your symbiote is in perfect condition, so you don't need my services.");
5756 break;
5758 int symhealcost = 0;
5760 /* The nurse will always remove all the curses. So in order to not make it too easy
5761 * to get rid of the nastier curses, we have to add to the cost of the service,
5762 * scaling with the severity of cursedness of your symbiote --Amy */
5763 if (u.usymbiote.cursed) symhealcost += 2000;
5764 if (u.usymbiote.hvycurse) symhealcost += 3000;
5765 if (u.usymbiote.prmcurse) symhealcost += 15000;
5766 if (u.usymbiote.evilcurse) symhealcost += 480000;
5767 if (u.usymbiote.morgcurse) symhealcost += 480000;
5768 if (u.usymbiote.bbcurse) symhealcost += 480000;
5769 if (u.usymbiote.stckcurse) symhealcost += 10000;
5770 if (u.usymbiote.mhp < u.usymbiote.mhpmax) symhealcost += ((u.usymbiote.mhpmax - u.usymbiote.mhp) * 100);
5771 if (u.ugold >= symhealcost) {
5772 verbalize("Sure thing, I can fully heal your symbiote and remove all curses from it for %d dollars.", symhealcost);
5773 if (yn("Accept the offer?") == 'y') {
5774 verbalize("Alright, hold still. Don't worry, this injection won't hurt your symbiote a bit.");
5775 if (!rn2(8)) mtmp->nurse_fixsymbiote = 0;
5776 u.ugold -= symhealcost;
5777 if (u.ualign.type == A_NEUTRAL) adjalign(1);
5778 u.cnd_nurseserviceamount++;
5779 maybegaincha();
5780 uncursesymbiote(TRUE);
5781 u.usymbiote.mhp = u.usymbiote.mhpmax;
5782 if (flags.showsymbiotehp) flags.botl = TRUE;
5783 break;
5785 } else verbalize("Sorry, fixing your symbiote's current condition costs %d dollars.", symhealcost);
5787 break;
5788 case 11:
5790 if (!uinsymbiosis) {
5791 verbalize("Hey, I can shut down your symbiote only if you actually have one.");
5792 break;
5794 if (u.shutdowntime) {
5795 verbalize("Your symbiote is already shut down. Trying to shut it down again would disturb the space-time continuum.");
5796 break;
5799 if (u.ugold < nurseshutdowncost) {
5800 verbalize("Sorry, symbiote shutdown costs %d dollars.", nurseshutdowncost);
5801 break;
5804 if (u.ugold >= nurseshutdowncost) {
5805 verbalize("Shutting down your symbiote will temporarily prevent it from attacking, defending or otherwise participating in combat. This will cost you %d dollars.", nurseshutdowncost);
5806 if (yn("Accept the offer?") == 'y') {
5807 verbalize("Okay, here's a special injection for your symbiote. Please hold still.");
5808 if (!rn2(20)) mtmp->nurse_shutdownsymbiote = 0;
5809 u.ugold -= nurseshutdowncost;
5810 if (u.ualign.type == A_NEUTRAL) adjalign(1);
5811 u.cnd_nurseserviceamount++;
5812 maybegaincha();
5813 use_skill(P_SQUEAKING, 3);
5814 u.shutdowntime = 1000;
5816 u.nurseshutdowncost += 500;
5817 if (u.nurseshutdowncost < 1000) u.nurseshutdowncost = 1000; /* fail safe */
5818 if (flags.showsymbiotehp) flags.botl = TRUE;
5819 break;
5823 break;
5824 case 12:
5825 if (u.ugold < 2500) {
5826 verbalize("Sorry, restoration costs 2500 dollars.");
5827 break;
5829 if (issoviet) {
5830 verbalize("Otvali! V Sovetskoy Rossli zdorov'ye istoshchayet VAS!");
5831 break;
5833 if (u.ugold >= 2500) {
5834 verbalize("This procedure will safely recover one drained attribute point for 2500 dollars. Please be aware that if none of your attributes have been drained, you won't get your money back.");
5835 if (yn("Accept the offer?") == 'y') {
5836 verbalize("Okay, hold still while I puncture you with this long, pointy needle...");
5837 u.ugold -= 2500;
5838 if (!rn2(10)) mtmp->nurse_restoration = 0;
5839 if (u.ualign.type == A_NEUTRAL) adjalign(1);
5842 int i, ii, lim;
5844 i = rn2(A_MAX); /* start at a random point */
5845 for (ii = 0; ii < A_MAX; ii++) {
5846 lim = AMAX(i);
5847 if (i == A_STR && u.uhs >= 3) --lim; /* WEAK */
5848 if (ABASE(i) < lim) {
5849 ABASE(i)++;
5850 pline("Wow! This makes you feel good!");
5851 flags.botl = 1;
5852 break; /* only restore one --Amy */
5854 if(++i >= A_MAX) i = 0;
5858 u.cnd_nurseserviceamount++;
5859 maybegaincha();
5863 break;
5864 case 13:
5865 if (u.ugold < u.nursevaccinecost) {
5866 verbalize("Sorry, vaccination costs %d dollars.", u.nursevaccinecost);
5867 break;
5869 if (u.ulevel < 4) {
5870 verbalize("Sorry. You're still a child, and the permanent vaccination commission doesn't recommend us to vaccinate children. Come back when you're older.");
5871 break;
5873 if (u.ugold >= u.nursevaccinecost) {
5874 verbalize("Yes, you are wise to get vaccinated against COVID-19. Unfortunately, we are currently experiencing supply bottlenecks, which has caused the prices for vaccines to explode, which means that a shot will cost you %d dollars, but it's for the best, because we're using a Yendorian State Approved(TM) vaccine that is guaranteed to be safe and highly effective! Get your covid shot now!", u.nursevaccinecost);
5875 if (yn("Accept the offer?") == 'y') {
5876 verbalize("Okay, hold still while I puncture you with this long, pointy needle...");
5877 u.ugold -= u.nursevaccinecost;
5878 if (!rn2(20)) mtmp->nurse_vaccine = 0;
5879 if (u.ualign.type == A_NEUTRAL) adjalign(1);
5880 u.cnd_nurseserviceamount++;
5881 maybegaincha();
5882 u.nursevaccinecost += 250;
5883 if (u.nursevaccinecost < 2000) u.nurseshutdowncost = 2000; /* fail safe */
5884 upnivel(TRUE); /* guaranteed */
5888 break;
5889 case 14:
5890 if (u.ugold < 100) {
5891 verbalize("Sorry, that costs 100 dollars.");
5892 break;
5894 if (u.ugold >= 100) {
5895 verbalize("You can buy one line of alla for 100 dollars.");
5896 if (yn("Accept the offer?") == 'y') {
5897 verbalize("Alright here's a line of alla for you.");
5898 u.ugold -= 100;
5899 if (!rn2(100)) mtmp->nurse_alla = 0;
5900 if (u.ualign.type == A_NEUTRAL) adjalign(1);
5901 u.cnd_nurseserviceamount++;
5902 maybegaincha();
5903 gain_alla(1);
5907 break;
5908 } /* switch statement */
5909 } /* n > 0 menu check */
5911 noservices:
5912 if (uwep && (uwep->oclass == WEAPON_CLASS || uwep->oclass == BALL_CLASS || uwep->oclass == CHAIN_CLASS || uwep->oclass == VENOM_CLASS || is_weptool(uwep))
5913 || (u.twoweap && uswapwep && (uswapwep->oclass == WEAPON_CLASS
5914 || is_weptool(uswapwep))))
5915 verbl_msg = "Put that weapon away before you hurt someone!";
5916 else if (uarmc || uarm || uarmh || uarms || uarmg || uarmf)
5917 verbl_msg = (Role_if(PM_HEALER) || Race_if(PM_HERBALIST)) ?
5918 "Doc, I can't help you unless you cooperate." :
5919 "Please undress so I can examine you.";
5920 else if (uarmu)
5921 verbl_msg = "Take off your shirt, please.";
5922 else verbl_msg = "Relax, this won't hurt a bit.";
5926 break;
5927 case MS_GUARD:
5928 #ifndef GOLDOBJ
5929 if (u.ugold)
5930 #else
5931 if (money_cnt(invent))
5932 #endif
5933 verbl_msg = "Please drop that gold and follow me.";
5934 else
5935 verbl_msg = "Please follow me.";
5936 break;
5937 case MS_SOLDIER:
5939 if (mtmp->mtame && mtmp->mhp < mtmp->mhpmax/3) {
5940 verbl_msg = "Medic!!!";
5941 break;
5944 if (mtmp->mtame && hastoeat && moves > EDOG(mtmp)->hungrytime) {
5945 verbl_msg = "We gotta stop by the next canteen.";
5946 break;
5950 static const char * const soldier_foe_msg[3] = {
5951 "Resistance is useless!",
5952 "You're dog meat!",
5953 "Surrender!",
5954 }, * const soldier_pax_msg[3] = {
5955 "What lousy pay we're getting here!",
5956 "The food's not fit for Orcs!",
5957 "My feet hurt, I've been on them all day!",
5959 verbl_msg = mtmp->mpeaceful ? soldier_pax_msg[rn2(3)]
5960 : soldier_foe_msg[rn2(3)];
5962 break;
5963 case MS_RIDER:
5964 if (ptr == &mons[PM_DEATH] && !rn2(10))
5965 pline_msg = "is busy reading a copy of Sandman #8.";
5966 else verbl_msg = "Who do you think you are, War?";
5967 break;
5969 case MS_VICE:
5970 switch(monsndx(ptr)) {
5971 case PM_GLUTTONY:
5972 pline_msg = rn2(2) ? "gobbling noisily." : /*[Sakusha]*/
5973 "mumbles through a mouthful of food.";
5974 break;
5975 case PM_LUST:
5976 pline_msg = "breathes heavily...";
5977 break;
5978 case PM_GREED:
5979 verbl_msg = "Mine! All mine!";
5980 break;
5981 case PM_ENVY:
5982 #ifndef GOLDOBJ
5983 if(u.ugold)
5984 #else
5985 if(money_cnt(invent))
5986 #endif
5987 verbl_msg = "Give me that gold!";
5988 else {
5989 pline_msg = "stares at you jealously.";
5991 break;
5992 case PM_WRATH:
5993 pline_msg = "glares at you ferociously.";
5994 break;
5995 case PM_SLOTH:
5996 pline_msg = "sighs.";
5997 break;
5998 case PM_DEPRESSION:
5999 pline_msg = "moans in agony.";
6000 break;
6001 case PM_PRIDE:
6002 pline_msg = "doesn't deign to reply.";
6003 break;
6004 default:
6005 verbl_msg = "Think you're innocent and pure? That can be changed!";
6006 break;
6008 break;
6010 case MS_DOUGLAS_ADAMS:
6012 static const char *da_msgs[] = {
6013 "42",
6014 "It's a nice day today!",
6015 "Have a Pan Galactic Gargle Blaster?",
6016 "Time is relative. Lunchtime doubly so.",
6017 "This is some strange usage of the word 'safe' that I wasn't aware of.",
6019 if (mtmp->data == &mons[PM_MARVIN]) {
6020 verbalize("Life, loathe it or ignore it, you cannot like it.");
6021 } else if (mtmp->data == &mons[PM_DEEP_THOUGHT]) {
6022 verbalize("6*9 = 42");
6023 } else if (mtmp->data == &mons[PM_EDDIE]) {
6024 verbalize("I'm feeling just great, guys!");
6025 } else {
6026 verbalize("%s", da_msgs[rn2(SIZE(da_msgs))]);
6029 break;
6030 case MS_PUPIL:
6032 if (mtmp->mtame && mtmp->mhp < mtmp->mhpmax/3) {
6033 verbalize("%s! Those bullies beat me up! Help!", flags.female ? "Mom" : "Dad");
6034 break;
6036 if (mtmp->mtame && !mtmp->isminion && hastoeat && moves > EDOG(mtmp)->hungrytime) {
6037 verbl_msg = "Man, how much longer does this lesson last? I need a break so I can eat some peanuts!";
6038 break;
6041 pupiltaunt();
6043 break;
6045 case MS_WHORE:
6047 if (mtmp->mtame && u.roxannemode && mtmp->data == &mons[PM_ROXANNE]) {
6048 if (u.roxannetimer) {
6049 if (u.roxannetimer < 1000) verbalize("My poison enchantment is active, but I'm running low on bolts!");
6050 else verbalize("My poison enchantment is active, meaning that all nearby monsters are being poisoned automatically.");
6053 register struct obj *roxybolt;
6054 findmorebolts:
6055 roxybolt = carrying(CROSSBOW_BOLT);
6056 if (!roxybolt) roxybolt = carrying(FLEECE_BOLT);
6057 if (!roxybolt) roxybolt = carrying(PIN_BOLT);
6058 if (!roxybolt) roxybolt = carrying(MINERAL_BOLT);
6059 if (!roxybolt) roxybolt = carrying(DROVEN_BOLT);
6060 if (!roxybolt) roxybolt = carrying(KOKKEN);
6061 if (!roxybolt) roxybolt = carrying(POISON_BOLT);
6062 if (!roxybolt) roxybolt = carrying(HEAVY_CROSSBOW_BOLT);
6063 if (!roxybolt) roxybolt = carrying(SPIKY_BOLT);
6064 if (!roxybolt) roxybolt = carrying(HARDENED_BOLT);
6065 if (!roxybolt) roxybolt = carrying(INFERIOR_BOLT);
6066 if (!roxybolt) roxybolt = carrying(ETHER_BOLT);
6067 if (!roxybolt) roxybolt = carrying(MATERIAL_BOLT);
6068 if (roxybolt) {
6069 verbalize("Ah, excellent, you have a stack of %ld crossbow bolts! Do you want to give them to me?", roxybolt->quan);
6071 if (yn("Give the bolts to Roxanne?") == 'y') {
6073 struct attack* attkptr;
6074 struct permonst* poisonroxanne = &mons[PM_ROXANNE];
6076 u.roxannetimer += (roxybolt->quan * 200);
6077 useupall(roxybolt);
6078 verbalize("Thanks! My poison enchantment will ensure that the enemy is poisoned.");
6080 attkptr = &poisonroxanne->mattk[4];
6081 attkptr->aatyp = AT_NONE;
6082 attkptr->adtyp = AD_POIS;
6083 attkptr->damn = 0;
6084 attkptr->damd = 4;
6086 attkptr = &poisonroxanne->mattk[5];
6087 attkptr->aatyp = AT_LASH;
6088 attkptr->adtyp = AD_POIS;
6089 attkptr->damn = 2;
6090 attkptr->damd = 4;
6092 goto findmorebolts;
6098 if (mtmp->mtame && mtmp->mhp < mtmp->mhpmax/3) {
6099 verbl_msg = "Why did you allow those rude customers to treat me like that? Some sort of pimp you are!";
6100 break;
6102 if (mtmp->mtame && !mtmp->isminion && hastoeat && moves > EDOG(mtmp)->hungrytime) {
6103 verbl_msg = "Can we get something to eat, honey? I promise that I'll pay for my meal with my own money!";
6104 break;
6107 if (mtmp->data == &mons[PM_ROXY] && !mtmp->mtame && mtmp->wastame && u.ugold >= 1000) {
6108 verbalize("For 1000 zorkmids I'll join your team again.");
6109 if (yn("Accept the offer?") == 'y') {
6111 struct monst *roxylein;
6112 u.ugold -= 1000;
6114 roxylein = tamedog(mtmp, (struct obj *) 0, TRUE);
6115 if (roxylein) mtmp = roxylein;
6116 if (mtmp) verbalize("Thank you!");
6117 else impossible("roxy was tamed but doesn't exist now??");
6118 break;
6123 if (!flags.female) verbalize("Hey, baby, want to have some fun?");
6124 else verbalize("I don't have many female customers, but do you want to have fun with me?");
6125 if (yn("Accept the offer?") == 'y') {
6127 if (u.homosexual == 0) {
6128 pline("You're discovering your sexuality...");
6129 getlin("Are you homosexual? [y/yes/no] (If you answer no, you're heterosexual.)", buf);
6130 (void) lcase (buf);
6131 if (!(strcmp (buf, "yes")) || !(strcmp (buf, "y")) || !(strcmp (buf, "ye")) || !(strcmp (buf, "ys"))) u.homosexual = 2;
6132 else u.homosexual = 1;
6135 (void) doseduce(mtmp);
6136 break;
6139 if (!mtmp->mpeaceful) prostitutetaunt();
6141 break;
6143 case MS_SUPERMAN:
6145 if (mtmp->mtame && mtmp->mhp < mtmp->mhpmax/3) {
6146 verbl_msg = "I WILL COME BACK...";
6147 break;
6149 if (mtmp->mtame && !mtmp->isminion && hastoeat && moves > EDOG(mtmp)->hungrytime) {
6150 verbl_msg = "HUNGRY! NEED FOOD!";
6151 break;
6153 if (mtmp->mtame) { /* tame and no distress */
6154 static const char *superman_tame[] = {
6155 "GO!",
6156 "LETS! GO!",
6157 "GO! SQUAD!",
6158 "WE WILL KICK THEM IN THE GOD DAMN ASS!",
6159 "MOVE IN!",
6160 "ENEMY SPOTTED!",
6161 "FIRE IN THE ASS HOLE!",
6162 "SQUAD STAY ALERT FOUR HOSTILES!",
6163 "SIR I HERE SOMETHING!", /* too lazy to check for female PC --Amy */
6164 "MY PRIVATE IS FIVEMETERS TANGO ALL!",
6165 "MY PRIVATE IS TENMETERS ALERT CREEPS HOT ASS!",
6166 "ECHO MISSION IS GO!",
6169 verbalize("%s", superman_tame[rn2(SIZE(superman_tame))]);
6170 break;
6173 if (!mtmp->mpeaceful) {
6174 static const char *superman_msgs[] = {
6175 "FRONTAL ATTACK!!!",
6176 "YOU DON'T STAND A CHANCE!",
6177 "YOU WILL DIE A SLOW, SLOW, DEATH...",
6178 "COME OUT! WE WILL HURT YOU!",
6179 "GRRRRRRRRRAAAAAAAAAAHHH!",
6180 "CHARRRRRRRRRGE!",
6181 "FEAR ME!!!",
6182 "DIE YOU SON OF A BITCH!", /* too lazy to check for female PC --Amy */
6183 "I AM YOUR DOOM!",
6184 "YOUR LIFE IS GONNA END NOW!",
6185 "YOU WILL CEASE TO EXIST!",
6186 "I'M GOING TO EAT YOU!",
6187 "RAAAAAAAAAAAARGH!",
6188 "ATTACK PATTERN ALPHA!",
6189 "YOU CAN'T HIDE!",
6190 "THERE'S NO ESCAPE!",
6191 "BE AFRAID OF ME!",
6192 "ATTAAAAAAAAAAAAACK!",
6195 verbalize("%s", superman_msgs[rn2(SIZE(superman_msgs))]);
6196 badeffect();
6197 increasesanity(rnz(50 + (mtmp->m_lev * 5) ));
6198 u.cnd_supermancount++;
6200 break;
6202 case MS_TEACHER:
6204 if (mtmp->mtame && mtmp->mhp < mtmp->mhpmax/3) {
6205 verbl_msg = "Those kids these days ain't got no respect, I tell you...";
6206 break;
6208 if (mtmp->mtame && !mtmp->isminion && hastoeat && moves > EDOG(mtmp)->hungrytime) {
6209 verbl_msg = "Why did I forget to bring along any food?";
6210 break;
6213 teachertaunt();
6215 break;
6217 case MS_PRINCIPAL:
6219 if (mtmp->mtame && mtmp->mhp < mtmp->mhpmax/3) {
6220 verbl_msg = "No! I can't faint! I'm the only one who can lead this school!";
6221 break;
6223 if (mtmp->mtame && !mtmp->isminion && hastoeat && moves > EDOG(mtmp)->hungrytime) {
6224 verbl_msg = "Wait, I need a pit stop! Be back in a minute!";
6225 break;
6228 principaltaunt();
6230 break;
6232 case MS_BOSS:
6233 if (mtmp->mtame && mtmp->mhp < mtmp->mhpmax/3) {
6234 verbl_msg = "What? It's impossible that they are beating me, I'm the boss of this game after all!";
6235 if (Sick) verbl_msg = "I might be running low on health, but unlike you, at least my nose isn't running all the time!";
6236 break;
6238 if (mtmp->mtame && mtmp->mhp < mtmp->mhpmax/5) {
6239 verbl_msg = "Argh, my spaceship is falling apart! Quick, someone needs to repair it!";
6240 break;
6242 if (mtmp->mtame && !mtmp->isminion && hastoeat && moves > EDOG(mtmp)->hungrytime) {
6243 verbl_msg = "Dude, get me something to eat! Now! You have 50 turns or you're fired.";
6244 break;
6246 if (mtmp->mtame) {
6247 verbl_msg = "Yes, my pet, we're in this together. I'm the boss, you just need to follow my lead and we'll finish off our enemies.";
6248 break;
6250 break;
6252 case MS_SMITH:
6253 /* this assumes that it's Duri, however actually there's also other monsters using this... --Amy
6254 * you can only request services at his forge, but other monsters can bring you the artifacts */
6255 if (u.duriworking) {
6256 verbalize("I'm working. Please don't disturb me again!");
6257 break;
6260 if (!mtmp->mpeaceful) {
6261 verbalize("That's it. No soup for you!");
6262 break;
6265 /* request variable: 0 = nothing, 1 = evil artifact, 2 = good artifact */
6266 if (u.durirequest == 1) {
6267 u.durirequest = 0;
6268 bad_artifact();
6269 if (mtmp->data == &mons[PM_BLACKSMITH] || mtmp->data == &mons[PM_ELONA_BLACKSMITH]) verbalize("Here's your artifact. Watch out, it's cursed and may well have downsides.");
6270 else verbalize("Here, I'm supposed to give you this cursed artifact from the blacksmith. Watch out, it may well have downsides.");
6271 break;
6274 if (u.durirequest == 2) {
6275 struct obj *durifact;
6276 u.durirequest = 0;
6278 boolean havegifts = u.ugifts;
6279 if (!havegifts) u.ugifts++;
6281 durifact = mk_artifact((struct obj *)0, !rn2(3) ? A_CHAOTIC : rn2(2) ? A_NEUTRAL : A_LAWFUL, TRUE);
6282 if (durifact) {
6284 int duriskill = get_obj_skill(durifact, TRUE);
6286 if (P_MAX_SKILL(duriskill) == P_ISRESTRICTED) {
6287 unrestrict_weapon_skill(duriskill);
6288 } else if (P_MAX_SKILL(duriskill) == P_UNSKILLED) {
6289 unrestrict_weapon_skill(duriskill);
6290 P_MAX_SKILL(duriskill) = P_BASIC;
6291 } else if (rn2(2) && P_MAX_SKILL(duriskill) == P_BASIC) {
6292 P_MAX_SKILL(duriskill) = P_SKILLED;
6293 } else if (!rn2(4) && P_MAX_SKILL(duriskill) == P_SKILLED) {
6294 P_MAX_SKILL(duriskill) = P_EXPERT;
6295 } else if (!rn2(10) && P_MAX_SKILL(duriskill) == P_EXPERT) {
6296 P_MAX_SKILL(duriskill) = P_MASTER;
6297 } else if (!rn2(100) && P_MAX_SKILL(duriskill) == P_MASTER) {
6298 P_MAX_SKILL(duriskill) = P_GRAND_MASTER;
6299 } else if (!rn2(200) && P_MAX_SKILL(duriskill) == P_GRAND_MASTER) {
6300 P_MAX_SKILL(duriskill) = P_SUPREME_MASTER;
6302 if (Race_if(PM_RUSMOT)) {
6303 if (P_MAX_SKILL(duriskill) == P_ISRESTRICTED) {
6304 unrestrict_weapon_skill(duriskill);
6305 } else if (P_MAX_SKILL(duriskill) == P_UNSKILLED) {
6306 unrestrict_weapon_skill(duriskill);
6307 P_MAX_SKILL(duriskill) = P_BASIC;
6308 } else if (rn2(2) && P_MAX_SKILL(duriskill) == P_BASIC) {
6309 P_MAX_SKILL(duriskill) = P_SKILLED;
6310 } else if (!rn2(4) && P_MAX_SKILL(duriskill) == P_SKILLED) {
6311 P_MAX_SKILL(duriskill) = P_EXPERT;
6312 } else if (!rn2(10) && P_MAX_SKILL(duriskill) == P_EXPERT) {
6313 P_MAX_SKILL(duriskill) = P_MASTER;
6314 } else if (!rn2(100) && P_MAX_SKILL(duriskill) == P_MASTER) {
6315 P_MAX_SKILL(duriskill) = P_GRAND_MASTER;
6316 } else if (!rn2(200) && P_MAX_SKILL(duriskill) == P_GRAND_MASTER) {
6317 P_MAX_SKILL(duriskill) = P_SUPREME_MASTER;
6321 dropy(durifact);
6322 discover_artifact(durifact->oartifact);
6325 if (!havegifts) u.ugifts--;
6327 if (mtmp->data == &mons[PM_BLACKSMITH] || mtmp->data == &mons[PM_ELONA_BLACKSMITH]) verbalize("Here's your artifact. You'll find it on the floor beneath you. Have fun!");
6328 else verbalize("Duri sent me to give you this artifact, so I'm dropping it at the floor beneath you. Have fun!");
6329 break;
6332 if (mtmp->data == &mons[PM_BLACKSMITH] || mtmp->data == &mons[PM_ELONA_BLACKSMITH]) {
6333 verbalize("Welcome to Duri's forge! I offer various services, including equipment repair, proofing, and artifact forging.");
6335 winid tmpwin;
6336 anything any;
6337 menu_item *selected;
6338 int n;
6340 any.a_void = 0; /* zero out all bits */
6341 tmpwin = create_nhwindow(NHW_MENU);
6342 start_menu(tmpwin);
6343 any.a_int = 1;
6344 add_menu(tmpwin, NO_GLYPH, &any , 'r', 0, ATR_NONE, "Repair", MENU_UNSELECTED);
6345 any.a_int = 2;
6346 add_menu(tmpwin, NO_GLYPH, &any , 'e', 0, ATR_NONE, "Erosionproofing", MENU_UNSELECTED);
6347 any.a_int = 3;
6348 add_menu(tmpwin, NO_GLYPH, &any , 'b', 0, ATR_NONE, "Bad artifact", MENU_UNSELECTED);
6349 any.a_int = 4;
6350 add_menu(tmpwin, NO_GLYPH, &any , 'g', 0, ATR_NONE, "Good artifact", MENU_UNSELECTED);
6352 end_menu(tmpwin, "Services Available:");
6353 n = select_menu(tmpwin, PICK_ONE, &selected);
6354 destroy_nhwindow(tmpwin);
6356 if (n > 0) {
6357 switch (selected[0].item.a_int) {
6358 case 1:
6359 verbalize("For only %d zorkmids, I can repair all damage on an item of your choice!", u.durirepaircost);
6360 if (u.ugold < u.durirepaircost) {
6361 verbalize("But sadly you don't seem to have enough money.");
6362 break;
6364 struct obj *repairobj;
6365 repairobj = getobj(allnoncount, "repair");
6366 if (!repairobj) break;
6367 if (repairobj) {
6368 if (!(repairobj->oeroded) && !(repairobj->oeroded2)) {
6369 verbalize("That item isn't damaged. You don't need to repair it!");
6370 break;
6372 if (yn("Pay for the repairs?") == 'y') {
6373 u.ugold -= u.durirepaircost;
6374 u.durirepaircost += 500;
6375 if (!stack_too_big(repairobj)) {
6376 repairobj->oeroded = repairobj->oeroded2 = 0;
6377 verbalize("Alright! Your item is in tiptop shape again!");
6378 } else verbalize("Oh no! The stack was too big, causing my repair attempt to fail!");
6381 break;
6382 case 2:
6383 verbalize("So you want to erodeproof your items? All you need to do is give me %d zorkmids!", u.durienchantcost);
6384 if (u.ugold < u.durienchantcost) {
6385 verbalize("Well %s, it seems you can't afford it. Bummer.", flags.female ? "lady" : "dude");
6386 break;
6388 struct obj *proofobj;
6389 proofobj = getobj(allnoncount, "erosionproof");
6390 if (!proofobj) break;
6391 if (proofobj) {
6392 if (proofobj->oerodeproof) {
6393 verbalize("That item is erosionproof already!");
6394 break;
6396 if (yn("Pay for erosionproofing?") == 'y') {
6397 u.ugold -= u.durienchantcost;
6398 u.durienchantcost += 2000;
6399 if (!stack_too_big(proofobj)) {
6400 proofobj->oerodeproof = 1;
6401 verbalize("Your item is untouchable now!");
6402 } else verbalize("Bad luck, %s - proofing such a large stack of items can fail, and it seems you didn't get lucky this time.", flags.female ? "gal" : "lad");
6405 break;
6406 case 3:
6407 verbalize("Forging a bad artifact will cost %d zorkmids.", u.duriarticostevil);
6408 if (u.ugold < u.duriarticostevil) {
6409 verbalize("Unfortunately you don't have enough money!");
6410 break;
6412 if (yn("Forge a bad artifact?") == 'y') {
6413 u.ugold -= u.duriarticostevil;
6414 u.duriarticostevil += 5000;
6415 u.duriworking = 1000;
6416 u.durirequest = 1;
6417 verbalize("Alright, give me about 1000 turns and I'll have something for you.");
6419 break;
6420 case 4:
6421 verbalize("Forging a good artifact will cost %d zorkmids.", u.duriarticostnormal);
6422 if (u.ugold < u.duriarticostnormal) {
6423 verbalize("Unfortunately you don't have enough money!");
6424 break;
6426 if (yn("Forge a good artifact?") == 'y') {
6427 u.ugold -= u.duriarticostnormal;
6428 u.duriarticostnormal += 10000;
6429 u.duriworking = 2000;
6430 u.durirequest = 2;
6431 verbalize("Alright, give me about 2000 turns and I'll have something for you. It'll be worth the wait, I promise!");
6433 break;
6436 break;
6440 verbalize("Sorry, I don't think I can help you. Look for Duri in the Blacksmith's Forge.");
6442 break;
6446 if (pline_msg) pline("%s %s", Monnam(mtmp), pline_msg);
6447 else if (verbl_msg) verbalize("%s", verbl_msg);
6448 return(1);
6453 dotalk()
6456 struct monst* mtmp2;
6457 int untamingchance;
6459 if (MenuIsBugged) {
6460 pline("The chat command is currently unavailable!");
6461 if (flags.moreforced && !MessagesSuppressed) display_nhwindow(WIN_MESSAGE, TRUE); /* --More-- */
6462 return 0;
6465 if (HardcoreAlienMode) {
6467 wouwoutaunt();
6468 u.cnd_wouwoucount++;
6469 if (Role_if(PM_SOCIAL_JUSTICE_WARRIOR)) sjwtrigger();
6470 wake_nearby();
6472 return 1;
6476 int result;
6477 boolean save_soundok = flags.soundok;
6478 if (!(YouAreDeaf)) flags.soundok = 1; /* always allow sounds while chatting */
6479 result = dochat();
6480 flags.soundok = save_soundok;
6482 if (FemtrapActiveSolvejg) {
6484 pline("Your grating, annoying voice aggravates everyone in your vicinity.");
6486 for (mtmp2 = fmon; mtmp2; mtmp2 = mtmp2->nmon) {
6488 if (mtmp2->mtame <= rnd(21) ) {
6490 int untamingchance = 10;
6492 if (!(PlayerCannotUseSkills)) {
6493 switch (P_SKILL(P_PETKEEPING)) {
6494 default: untamingchance = 10; break;
6495 case P_BASIC: untamingchance = 9; break;
6496 case P_SKILLED: untamingchance = 8; break;
6497 case P_EXPERT: untamingchance = 7; break;
6498 case P_MASTER: untamingchance = 6; break;
6499 case P_GRAND_MASTER: untamingchance = 5; break;
6500 case P_SUPREME_MASTER: untamingchance = 4; break;
6504 if (untamingchance > rnd(10) && !(Role_if(PM_DRAGONMASTER) && uarms && Is_dragon_shield(uarms) && mtmp2->data->mlet == S_DRAGON) && !((rnd(30 - ACURR(A_CHA))) < 4) ) {
6506 mtmp2->mtame = mtmp2->mpeaceful = 0;
6510 } else if (!mtmp2->mtame && !is_infrastructure_monster(mtmp2)) {
6512 mtmp2->mtame = mtmp2->mpeaceful = 0;
6516 if (!is_infrastructure_monster(mtmp2) && !mtmp2->mtame && !rn2(5)) mtmp2->mfrenzied = 1;
6522 return result;
6525 /* monster got hit, and can now emit a pain sound or otherwise display a message for the player; it shouldn't always do so,
6526 * but every once in a while, so that the player can gauge roughly how much damage they're doing to a monster,
6527 * or (more importantly) how much their pet has been hurt, to make it possible to tell when they're in need of healing
6528 * without constantly needing to stethoscope or chat to them (which requires you to be adjacent to them and often also
6529 * wastes a turn, which isn't always an option in the middle of a fight). --Amy */
6530 void
6531 monster_pain(mtmp)
6532 register struct monst *mtmp;
6534 int painchance = 10;
6535 boolean soundbased = FALSE;
6536 int distresslevel = 0;
6538 if (!mtmp) {
6539 impossible("monster_pain called with nonexistant monster!");
6540 return;
6543 if (mtmp->mundetected && is_hider(mtmp->data)) mtmp->mundetected = FALSE;
6544 if (mtmp->mundetected && hides_under(mtmp->data)) mtmp->mundetected = FALSE;
6546 if (FemtrapActiveLittleMarie && is_female(mtmp->data)) {
6547 if (SuperFemtrapLittleMarie) randomnastytrapeffect(rnz(2 + (mtmp->m_lev * 2)), 1000 - (mtmp->m_lev * 2));
6548 else randomnastytrapeffect(rnz(2 + mtmp->m_lev), 1000 - mtmp->m_lev);
6549 u.cnd_littlemarietrapcnt++;
6552 if (FemtrapActiveSonja && !mtmp->mpeaceful && !mtmp->mtame && !rn2(SuperFemtrapSonja ? 5 : 10) && is_female(mtmp->data)) {
6553 incr_itimeout(&HAggravate_monster, (mtmp->m_lev * 5) + 1);
6554 You_feel("that monsters are aware of your presence.");
6555 if (PlayerHearsSoundEffects) pline(issoviet ? "Dazhe sovetskaya Pyat' Lo obostryayetsya v vashem nizkom igrovom masterstve." : "Woaaaaaah!");
6556 aggravate();
6559 if (mtmp->data->msound == MS_FEARHARE) {
6560 monflee(mtmp, rnd(10), TRUE, TRUE);
6563 if (mtmp->mhp < (mtmp->mhpmax / 4)) distresslevel = 3;
6564 else if (mtmp->mhp < (mtmp->mhpmax / 2)) distresslevel = 2;
6565 else if (mtmp->mhp < (mtmp->mhpmax * 3 / 4)) distresslevel = 1;
6567 if (distresslevel == 0) return; /* didn't lose enough health yet */
6569 if (mtmp->data->msound == MS_SILENT) return; /* never emits any sound */
6570 if (mtmp->data->msound == MS_SISSY) painchance = 0; /* always emits a sound whenever it's damaged */
6572 /* petkeeping skill makes it more likely for pets to make sounds, so that you can see how much they've been hurt */
6573 if (mtmp->mtame) {
6574 if (!PlayerCannotUseSkills) {
6575 switch (P_SKILL(P_PETKEEPING)) {
6576 case P_BASIC: painchance -= 1; break;
6577 case P_SKILLED: painchance -= 2; break;
6578 case P_EXPERT: painchance -= 3; break;
6579 case P_MASTER: painchance -= 4; break;
6580 case P_GRAND_MASTER: painchance -= 5; break;
6581 case P_SUPREME_MASTER: painchance -= 6; break;
6582 default: break;
6588 /* riding skill makes it more likely for your steed to make sounds, even if the steed isn't tame */
6589 if (u.usteed && (u.usteed == mtmp)) {
6590 if (!PlayerCannotUseSkills) {
6591 switch (P_SKILL(P_RIDING)) {
6592 case P_BASIC: painchance -= 1; break;
6593 case P_SKILLED: painchance -= 2; break;
6594 case P_EXPERT: painchance -= 3; break;
6595 case P_MASTER: painchance -= 4; break;
6596 case P_GRAND_MASTER: painchance -= 5; break;
6597 case P_SUPREME_MASTER: painchance -= 6; break;
6598 default: break;
6602 if (painchance < 0) painchance = 0; /* fail safe */
6604 /* pets need even better chances */
6605 if (mtmp->mtame && !rn2(10)) painchance = 0;
6606 if (!PlayerCannotUseSkills && mtmp->mtame) {
6607 if (P_SKILL(P_PETKEEPING) >= P_BASIC && !rn2(10)) painchance = 0;
6608 if (P_SKILL(P_PETKEEPING) >= P_SKILLED && !rn2(10)) painchance = 0;
6609 if (P_SKILL(P_PETKEEPING) >= P_EXPERT && !rn2(10)) painchance = 0;
6610 if (P_SKILL(P_PETKEEPING) >= P_MASTER && !rn2(10)) painchance = 0;
6611 if (P_SKILL(P_PETKEEPING) >= P_GRAND_MASTER && !rn2(10)) painchance = 0;
6612 if (P_SKILL(P_PETKEEPING) >= P_SUPREME_MASTER && !rn2(10)) painchance = 0;
6615 if (!(PainSense && !rn2(10)) && !(StrongPainSense && !rn2(5)) && (painchance >= (rnd(11))) ) return;
6617 /* some of these are sound-based, others are vision-based */
6618 switch (mtmp->data->msound) {
6619 default:
6620 break;
6621 case MS_HUMANOID:
6622 case MS_OHGOD:
6623 case MS_ARREST:
6624 case MS_SOLDIER:
6625 case MS_CUSS:
6626 case MS_SUPERMAN:
6627 case MS_CONVERT:
6628 case MS_JAPANESE:
6629 case MS_SOVIET:
6630 case MS_BRAG:
6631 case MS_PRINCESSLEIA:
6632 case MS_FLUIDATOR:
6633 case MS_SISSY:
6634 case MS_BOT:
6635 case MS_BARBER:
6636 case MS_TREESQUAD:
6637 case MS_METALMAFIA:
6638 case MS_WOLLOH:
6639 soundbased = TRUE;
6640 break;
6643 if (soundbased && !flags.soundok) return; /* can't hear */
6644 if (soundbased && mtmp->data->msound != MS_SISSY && (distu(mtmp->mx,mtmp->my) > (BOLT_LIM+1)*(BOLT_LIM+1)) ) return; /* too far away */
6645 if (!soundbased && mtmp->data->msound != MS_GIBBERISH && !cansee(mtmp->mx, mtmp->my)) return; /* can't see */
6647 switch (mtmp->data->msound) {
6649 default:
6650 case MS_BARK:
6651 case MS_MEW:
6652 case MS_ROAR:
6653 case MS_GROWL:
6654 case MS_SQEEK:
6655 case MS_SQAWK:
6656 case MS_HISS:
6657 case MS_BUZZ:
6658 case MS_GRUNT:
6659 case MS_NEIGH:
6660 case MS_WAIL:
6661 case MS_GURGLE:
6662 case MS_BURBLE:
6663 /*case MS_ANIMAL: -- duplicate */
6664 case MS_SHRIEK:
6665 case MS_BONES:
6666 case MS_LAUGH:
6667 case MS_MUMBLE:
6668 case MS_IMITATE:
6669 /*case MS_ORC: -- duplicate */
6670 case MS_GUARD:
6671 case MS_DJINNI:
6672 case MS_NURSE:
6673 case MS_SEDUCE:
6674 case MS_VAMPIRE:
6675 case MS_BRIBE:
6676 case MS_RIDER:
6677 case MS_LEADER:
6678 case MS_NEMESIS:
6679 case MS_GUARDIAN:
6680 case MS_SELL:
6681 case MS_ORACLE:
6682 case MS_PRIEST:
6683 case MS_SPELL:
6684 case MS_WERE:
6685 case MS_BOAST:
6686 case MS_GYPSY:
6687 case MS_SHEEP:
6688 case MS_CHICKEN:
6689 case MS_COW:
6690 case MS_PARROT:
6691 case MS_VICE:
6692 case MS_BOSS:
6693 case MS_SOUND:
6694 case MS_STENCH:
6695 case MS_CASINO:
6696 case MS_GLYPHS:
6697 case MS_SNORE:
6698 case MS_PHOTO:
6699 case MS_REPAIR:
6700 case MS_DRUGS:
6701 case MS_COMBAT:
6702 case MS_MUTE:
6703 case MS_CORONA:
6704 case MS_TRUMPET:
6705 case MS_PAIN:
6706 case MS_SING:
6707 case MS_ALLA:
6708 case MS_POKEDEX:
6709 case MS_APOC:
6710 case MS_LIEDER:
6711 case MS_GAARDIEN:
6712 case MS_CLOCK:
6713 case MS_AREOLA:
6714 case MS_DEAD:
6715 case MS_STABILIZE:
6716 case MS_ESCAPE:
6717 case MS_POMPEJI:
6718 case MS_FEARHARE:
6719 case MS_CODE:
6720 case MS_BULLETATOR:
6721 case MS_OE:
6722 case MS_NASTYTRAP:
6723 case MS_FEMI:
6724 case MS_ANOREXIA:
6725 case MS_BULIMIA:
6726 case MS_GRAKA:
6727 case MS_BLANKER:
6728 case MS_CONDESCEND:
6729 case MS_TRIP:
6730 case MS_COMMON:
6731 case MS_AETHERIC:
6732 case MS_BUSY:
6733 case MS_JAM:
6734 case MS_LOWPRIORITY:
6735 case MS_SPEEDBUG:
6736 case MS_BEG:
6738 /* todo all the way down */
6739 case MS_HIRE:
6740 case MS_ARMORER:
6741 case MS_OMEN:
6742 case MS_NEWS:
6743 case MS_CRYTHROAT:
6744 case MS_HOOT:
6745 case MS_RUSTLE:
6746 case MS_SEMEN:
6747 case MS_MODALSHOP:
6748 case MS_SCIENTIST: /* todo all the way up */
6750 switch (distresslevel) {
6751 case 1:
6752 pline("%s screams.", Monnam(mtmp));
6753 break;
6754 case 2:
6755 pline("%s writhes in pain.", Monnam(mtmp));
6756 break;
6757 case 3:
6758 pline("%s is severely hurt!", Monnam(mtmp));
6759 break;
6761 break;
6763 case MS_HERCULES:
6764 switch (distresslevel) {
6765 case 1:
6766 verbalize("That's just a flesh wound...");
6767 break;
6768 case 2:
6769 verbalize("I underestimated you, but you'll still fall before my sword!");
6770 break;
6771 case 3:
6772 verbalize("The gods will grant me the strength to overcome this difficult opponent...");
6773 break;
6775 break;
6776 case MS_SILLY:
6777 switch (distresslevel) {
6778 case 1:
6779 verbalize("My vital signs are dropping!");
6780 break;
6781 case 2:
6782 verbalize("Uhh, that might require a tetanus shot. Speaking of which, my last vaccination was more than 10 years ago...");
6783 break;
6784 case 3:
6785 verbalize("Hey! Why is this HEV suit beeping constantly? That's so annoying!");
6786 break;
6788 break;
6789 case MS_MIDI:
6790 switch (distresslevel) {
6791 case 1:
6792 verbalize("Dadadiededada-dedidada-diededada-dedidada...");
6793 break;
6794 case 2:
6795 verbalize("La laaaaaa, lalala-laaaaaa...");
6796 break;
6797 case 3:
6798 verbalize("nananananinenananoe!");
6799 break;
6801 break;
6802 case MS_PIRATE:
6803 switch (distresslevel) {
6804 case 1:
6805 verbalize("Scuttle that landlubber!");
6806 break;
6807 case 2:
6808 verbalize("Gonna keelhaul ye!");
6809 break;
6810 case 3:
6811 verbalize("Ye'r gonna dance with Jack Ketch!");
6812 break;
6814 break;
6815 case MS_GAGA:
6816 switch (distresslevel) {
6817 case 1:
6818 verbalize("Do you not recognize the fact that I'm %s?", mongenderidentity(mtmp));
6819 break;
6820 case 2:
6821 verbalize("This %s is not amused!", mongenderidentity(mtmp));
6822 break;
6823 case 3:
6824 verbalize("One day all the members of the LGBTIQ+ community are gonna cancel you, and then everyone will treat me as a respected %s!", mongenderidentity(mtmp));
6825 break;
6827 break;
6828 case MS_SHOCKTROOPER:
6829 switch (distresslevel) {
6830 case 1:
6831 verbalize("mub puh mub dit dit");
6832 break;
6833 case 2:
6834 verbalize("dit kss kss");
6835 break;
6836 case 3:
6837 verbalize("kss dit dit kss");
6838 break;
6840 break;
6841 case MS_MOLEST:
6842 switch (distresslevel) {
6843 case 1:
6844 if (flags.female) pline("%s shouts 'I'm gonna fuck you for that, bitch!'", Monnam(mtmp));
6845 else pline("%s shouts 'Bastard!'", Monnam(mtmp));
6846 break;
6847 case 2:
6848 if (flags.female) pline("%s shouts 'My penis will thrust into your vagina again and again, you slut!'", Monnam(mtmp));
6849 else pline("%s shouts 'Motherfucker, I'll polish your kisser!'", Monnam(mtmp));
6850 break;
6851 case 3:
6852 if (flags.female) pline("%s screams 'No woman gets away from me! You will be made pregnant by my dick, no matter what you devil's whore try to do!'", Monnam(mtmp));
6853 else pline("%s screams 'Fuck Fuck Fuck why does that asshole have to be a man why can't I get a woman instead I'd so totally rape her into submission fuuuuuck...'", Monnam(mtmp));
6854 break;
6856 break;
6857 case MS_TEMPER:
6858 switch (distresslevel) {
6859 case 1:
6860 pline("%s shouts 'You'll die!'", Monnam(mtmp));
6861 break;
6862 case 2:
6863 pline("%s shouts 'I'ma smash you for this!'", Monnam(mtmp));
6864 break;
6865 case 3:
6866 pline("%s screams 'FUCK YOU ASSHOLE!!!'", Monnam(mtmp));
6867 break;
6869 break;
6870 case MS_SHIVERINGESLES:
6871 switch (distresslevel) {
6872 case 1:
6873 pline("%s shouts 'Sie sterben schnell, wenn man sie jenijakt. Jenijak! Jenijak!'", Monnam(mtmp));
6874 break;
6875 case 2:
6876 pline("%s shouts 'Sendockel den Klen. Verstanden? Den Klen!'", Monnam(mtmp));
6877 break;
6878 case 3:
6879 pline("%s groans 'Fribbel! Einfach fribbel!'", Monnam(mtmp));
6880 break;
6882 break;
6883 case MS_GENDER:
6884 switch (distresslevel) {
6885 case 1:
6886 pline("%s shouts 'Help! I'm %s and got attacked!'", Monnam(mtmp), is_neuter(mtmp->data) ? "neuter" : mtmp->female ? "female" : "male");
6887 break;
6888 case 2:
6889 pline("%s shouts 'Someone must rescue me, I'm a very important %s!'", Monnam(mtmp), is_neuter(mtmp->data) ? "neutrum" : mtmp->female ? "woman" : "man");
6890 break;
6891 case 3:
6892 pline("%s groans 'I don't wanna die a virgin...'", Monnam(mtmp));
6893 break;
6895 break;
6896 case MS_OUTCAST:
6897 switch (distresslevel) {
6898 case 1:
6899 pline("%s shouts 'What the heck?'", Monnam(mtmp));
6900 break;
6901 case 2:
6902 pline("%s shouts 'Outcasts, attack my target!'", Monnam(mtmp));
6903 break;
6904 case 3:
6905 pline("%s groans 'Casdin shall avenge me...'", Monnam(mtmp));
6906 break;
6908 break;
6909 case MS_AMNESIA:
6910 switch (distresslevel) {
6911 case 1:
6912 pline("%s shouts 'Something just hurt me!'", Monnam(mtmp));
6913 break;
6914 case 2:
6915 pline("%s shouts 'Ah! I think I just got stabbed! But I don't remember by whom!'", Monnam(mtmp));
6916 break;
6917 case 3:
6918 pline("%s groans 'Oh... think I need to perform first aid... but I forgot how that works...'", Monnam(mtmp));
6919 break;
6921 break;
6922 case MS_BOS:
6923 switch (distresslevel) {
6924 case 1:
6925 pline("%s shouts 'I got hit!'", Monnam(mtmp));
6926 break;
6927 case 2:
6928 pline("%s shouts 'They hit me in the chest!'", Monnam(mtmp));
6929 break;
6930 case 3:
6931 pline("%s groans 'Argh... I'm not gonna make it...'", Monnam(mtmp));
6932 break;
6934 break;
6935 case MS_DREMORA:
6936 switch (distresslevel) {
6937 case 1:
6938 pline("%s shouts 'I'll banish you!'", Monnam(mtmp));
6939 break;
6940 case 2:
6941 pline("%s shouts 'Beg, milkface!'", Monnam(mtmp));
6942 break;
6943 case 3:
6944 pline("%s shouts 'Break apart! Shatter!'", Monnam(mtmp));
6945 break;
6947 break;
6948 case MS_MYTHICALDAWN:
6949 switch (distresslevel) {
6950 case 1:
6951 pline("%s shouts 'Dawn is breaking!'", Monnam(mtmp));
6952 break;
6953 case 2:
6954 pline("%s shouts 'Lord Dagon awaits your soul in Oblivion!'", Monnam(mtmp));
6955 break;
6956 case 3:
6957 pline("%s shouts 'The time of purgatory is drawing near!'", Monnam(mtmp));
6958 break;
6960 break;
6961 case MS_BAN:
6962 switch (distresslevel) {
6963 case 1:
6964 pline("%s shouts 'This area isn't safe!'", Monnam(mtmp));
6965 break;
6966 case 2:
6967 pline("%s shouts 'Why did I come here? Should have picked another dungeon level!'", Monnam(mtmp));
6968 break;
6969 case 3:
6970 pline("%s screams 'This is insane! I'll warp to a different level!'", Monnam(mtmp));
6971 break;
6973 break;
6974 case MS_MUTANT:
6975 switch (distresslevel) {
6976 case 1:
6977 pline("%s screams 'Ahh, the %s!'", Monnam(mtmp), mbodypart(mtmp, LEG));
6978 break;
6979 case 2:
6980 pline("%s screams 'Paaaaaaaain!'", Monnam(mtmp));
6981 break;
6982 case 3:
6983 pline("%s roars 'Gueueueaaaarrrrrrr!!'", Monnam(mtmp));
6984 break;
6986 break;
6987 case MS_ENCLAVE:
6988 switch (distresslevel) {
6989 case 1:
6990 pline("%s screams 'Medic!'", Monnam(mtmp));
6991 break;
6992 case 2:
6993 pline("%s screams 'My %s!'", Monnam(mtmp), !rn2(4) ? mbodypart(mtmp, LEG) : !rn2(3) ? mbodypart(mtmp, ARM) : rn2(2) ? mbodypart(mtmp, HEAD) : mbodypart(mtmp, EYE) );
6994 break;
6995 case 3:
6996 pline("%s mutters 'For... Eden.'", Monnam(mtmp));
6997 break;
6999 break;
7000 case MS_TALONCOMPANY:
7001 switch (distresslevel) {
7002 case 1:
7003 pline("%s shouts 'Don't mess with the Talons!'", Monnam(mtmp));
7004 break;
7005 case 2:
7006 pline("%s shouts 'Fuck that shit!'", Monnam(mtmp));
7007 break;
7008 case 3:
7009 pline("%s shouts 'Retreat, fucking shit, retreat!!'", Monnam(mtmp));
7010 break;
7012 break;
7013 case MS_REGULATOR:
7014 switch (distresslevel) {
7015 case 1:
7016 pline("%s shouts 'The law will always win!'", Monnam(mtmp));
7017 break;
7018 case 2:
7019 pline("%s shouts 'Arrh!'", Monnam(mtmp));
7020 break;
7021 case 3:
7022 pline("%s shouts 'Retreat!'", Monnam(mtmp));
7023 break;
7025 break;
7026 case MS_HUMANOID:
7027 switch (distresslevel) {
7028 case 1:
7029 pline("%s shouts 'I'm hit!'", Monnam(mtmp));
7030 break;
7031 case 2:
7032 pline("%s shouts 'Need a healing potion!'", Monnam(mtmp));
7033 break;
7034 case 3:
7035 pline("%s groans 'I'm close to death!'", Monnam(mtmp));
7036 break;
7038 break;
7039 case MS_METALMAFIA:
7040 switch (distresslevel) {
7041 case 1:
7042 pline("%s shouts 'Stop being such a dick! Just gimme your metal!'", Monnam(mtmp));
7043 break;
7044 case 2:
7045 pline("%s shouts 'I'll blast you with my shotgun if you don't give me your metal!'", Monnam(mtmp));
7046 break;
7047 case 3:
7048 pline("%s groans 'You cannot stop the metal mafia...'", Monnam(mtmp));
7049 break;
7051 break;
7052 case MS_RAIDER:
7053 switch (distresslevel) {
7054 case 1:
7055 pline("%s shouts 'Should have stayed in bed instead of playing superhero!'", Monnam(mtmp));
7056 break;
7057 case 2:
7058 pline("%s shouts 'Muck!'", Monnam(mtmp));
7059 break;
7060 case 3:
7061 pline("%s sobs 'No, please don't kill me!'", Monnam(mtmp));
7062 break;
7064 break;
7065 case MS_ARREST:
7066 switch (distresslevel) {
7067 case 1:
7068 pline("%s shouts 'Unit %d was hit!'", Monnam(mtmp), mtmp->m_id);
7069 break;
7070 case 2:
7071 pline("%s shouts 'Officer in need of a backup!'", Monnam(mtmp));
7072 break;
7073 case 3:
7074 pline("%s shouts 'Emergency! Unit %d confronted with extreme resistance!'", Monnam(mtmp), mtmp->m_id);
7075 break;
7077 break;
7078 case MS_FLUIDATOR:
7079 switch (distresslevel) {
7080 case 1:
7081 pline("%s shouts 'The opponent met me!'", Monnam(mtmp));
7082 break;
7083 case 2:
7084 pline("%s shouts 'I have hits off-gotten, I custom assistance!'", Monnam(mtmp));
7085 break;
7086 case 3:
7087 pline("%s shouts 'Outer one no, equivalent I am dead!'", Monnam(mtmp));
7088 break;
7090 break;
7091 case MS_TREESQUAD:
7092 switch (distresslevel) {
7093 case 1:
7094 pline("%s shouts 'They're resisting!'", Monnam(mtmp));
7095 break;
7096 case 2:
7097 pline("%s shouts 'We need to kill them, it's the only way to stop them!'", Monnam(mtmp));
7098 break;
7099 case 3:
7100 pline("%s shouts 'They're going to burn our trees! We must not fall!'", Monnam(mtmp));
7101 break;
7103 break;
7104 case MS_SOLDIER:
7105 switch (distresslevel) {
7106 case 1:
7107 pline("%s shouts 'Medic!'", Monnam(mtmp));
7108 break;
7109 case 2:
7110 pline("%s shouts 'Excuse me! I'm in need of medical attention!'", Monnam(mtmp));
7111 break;
7112 case 3:
7113 pline("%s shouts 'God dammit!'", Monnam(mtmp));
7114 break;
7116 break;
7117 case MS_BARBER:
7118 switch (distresslevel) {
7119 case 1:
7120 pline("%s shouts 'You're not allowed to hit me, I'm a barber!'", Monnam(mtmp));
7121 break;
7122 case 2:
7123 pline("%s shouts 'Stop that, man! Let me cut your hair instead!'", Monnam(mtmp));
7124 break;
7125 case 3:
7126 pline("%s shouts 'I'm gonna cut like the devil!'", Monnam(mtmp));
7127 break;
7129 break;
7130 case MS_SPOILER:
7131 switch (distresslevel) {
7132 case 1:
7133 pline("Out of memory. Please restart the program.");
7134 break;
7135 case 2:
7136 pline("Runtime Error! R6016 - Not enough space for thread data");
7137 break;
7138 case 3:
7139 pline("Runtime Error! R6025 - pure virtual function call");
7140 break;
7142 break;
7143 case MS_OHGOD:
7144 switch (distresslevel) {
7145 case 1:
7146 pline("%s shouts 'Oh god!'", Monnam(mtmp));
7147 break;
7148 case 2:
7149 pline("%s shouts 'Oh doublegod!'", Monnam(mtmp));
7150 break;
7151 case 3:
7152 pline("%s shouts 'Ohtenfoldgod!'", Monnam(mtmp));
7153 break;
7155 break;
7156 case MS_WOLLOH:
7157 switch (distresslevel) {
7158 case 1:
7159 pline("%s shouts 'Wolloh age!'", Monnam(mtmp));
7160 break;
7161 case 2:
7162 pline("%s shouts 'Wolloh, you fucked up, wolloh!'", Monnam(mtmp));
7163 break;
7164 case 3:
7165 pline("%s shouts 'Ey wolloh, older! Wolloh, I have a knife, wolloh, and I'll cut out your fucking tongue, wolloh!'", Monnam(mtmp));
7166 break;
7168 break;
7169 case MS_SELFHARM:
7170 switch (distresslevel) {
7171 case 1:
7172 pline("%s is bleeding...", Monnam(mtmp));
7173 increasesanity(rnz(10));
7174 break;
7175 case 2:
7176 pline("%s is squirting blood everywhere!", Monnam(mtmp));
7177 increasesanity(rnz(50));
7178 break;
7179 case 3:
7180 pline("Oh no! %s is bleeding profusely and it just doesn't want to stop and the entire floor is already colored red and... urgh, your %s...", Monnam(mtmp), body_part(STOMACH));
7181 increasesanity(rnz(200));
7182 break;
7184 break;
7185 case MS_CUSS:
7186 switch (distresslevel) {
7187 case 1:
7188 pline("%s shouts 'Fuck! I'm hit!'", Monnam(mtmp));
7189 break;
7190 case 2:
7191 pline("%s shouts 'Damn those assholes!'", Monnam(mtmp));
7192 break;
7193 case 3:
7194 pline("%s shouts 'Your mother is such a cunt!'", Monnam(mtmp));
7195 break;
7197 break;
7198 case MS_WHORE:
7199 switch (distresslevel) {
7200 case 1:
7201 pline("%s complains about a broken nail.", Monnam(mtmp));
7202 break;
7203 case 2:
7204 pline("%s's makeup is running down %s cheeks.", Monnam(mtmp), mhis(mtmp));
7205 break;
7206 case 3:
7207 pline("%s is badly bruised.", Monnam(mtmp));
7208 break;
7210 break;
7211 case MS_SUPERMAN:
7212 switch (distresslevel) {
7213 case 1:
7214 verbalize("GRRRR!");
7215 break;
7216 case 2:
7217 verbalize("ARRRRH! REVENGE!");
7218 break;
7219 case 3:
7220 verbalize("KILL THEM ALL!");
7221 break;
7223 break;
7224 case MS_FART_QUIET:
7225 case MS_FART_NORMAL:
7226 case MS_FART_LOUD:
7227 switch (distresslevel) {
7228 case 1:
7229 pline("%s's butt cheeks are bruised.", Monnam(mtmp));
7230 break;
7231 case 2:
7232 pline("%s's butt cheeks look sore.", Monnam(mtmp));
7233 break;
7234 case 3:
7235 pline("%s's butt cheeks are bleeding...", Monnam(mtmp));
7236 break;
7238 break;
7239 case MS_SHOE:
7240 case MS_SOCKS:
7241 case MS_PANTS:
7242 switch (distresslevel) {
7243 case 1:
7244 pline("%s's material seems to degrade.", Monnam(mtmp));
7245 break;
7246 case 2:
7247 pline("%s looks a bit worn-out.", Monnam(mtmp));
7248 break;
7249 case 3:
7250 pline("%s seems about to fall apart!", Monnam(mtmp));
7251 break;
7253 break;
7254 case MS_CONVERT:
7255 switch (distresslevel) {
7256 case 1:
7257 pline("%s shouts 'Kafirler!'", Monnam(mtmp));
7258 break;
7259 case 2:
7260 pline("%s shouts 'Allah seni cezalandiracak!'", Monnam(mtmp));
7261 break;
7262 case 3:
7263 pline("%s grumbles 'Cennette beni bekleyen bir suerue bakire var...'", Monnam(mtmp));
7264 break;
7266 break;
7267 case MS_HCALIEN:
7268 switch (distresslevel) {
7269 case 1:
7270 pline("%s looks annoyed.", Monnam(mtmp));
7271 break;
7272 case 2:
7273 pline("%s seems to be angry at the enemy who attacked %s.", Monnam(mtmp), mhim(mtmp));
7274 break;
7275 case 3:
7276 pline("%s's facial expression is very threatening.", Monnam(mtmp));
7277 break;
7279 break;
7280 case MS_GIBBERISH:
7281 pline("%s", generate_garbage_string());
7282 break;
7283 case MS_HANDY: /* todo for when they're in the middle of a call */
7284 switch (distresslevel) {
7285 case 1:
7286 pline("%s screams.", Monnam(mtmp));
7287 break;
7288 case 2:
7289 pline("%s writhes in pain.", Monnam(mtmp));
7290 break;
7291 case 3:
7292 pline("%s is severely hurt!", Monnam(mtmp));
7293 break;
7295 break;
7296 case MS_CAR:
7297 switch (distresslevel) {
7298 case 1:
7299 pline("%s is dented.", Monnam(mtmp));
7300 break;
7301 case 2:
7302 pline("Splinters of %s's chassis are flying around!", mon_nam(mtmp));
7303 break;
7304 case 3:
7305 pline("%s looks quite a bit like a car wreck!", Monnam(mtmp));
7306 break;
7308 break;
7309 case MS_JAPANESE:
7310 switch (distresslevel) {
7311 case 1:
7312 pline("%s shouts 'Karera no ken ga watashi o osotta!'", Monnam(mtmp));
7313 break;
7314 case 2:
7315 pline("%s shouts 'Iya, senaka ni ya ga sasatte iru!'", Monnam(mtmp));
7316 break;
7317 case 3:
7318 pline("%s shouts 'Watashi wa mada shinu ka jisatsu suru junbi ga dekite imasen!'", Monnam(mtmp));
7319 break;
7321 break;
7322 case MS_SOVIET:
7323 switch (distresslevel) {
7324 case 1:
7325 pline("%s remarks 'Eta igra - otstoy.'", Monnam(mtmp));
7326 break;
7327 case 2:
7328 pline("%s mutters 'Fignya programmirovaniya.'", Monnam(mtmp));
7329 break;
7330 case 3:
7331 pline("%s grumbles 'Emi chertova shlyukha, i yey dolzhno byt' stydno za sebya.'", Monnam(mtmp));
7332 break;
7334 break;
7335 case MS_BRAG:
7336 switch (distresslevel) {
7337 case 1:
7338 verbalize("Bah! I still have %d HP remaining!", mtmp->mhp);
7339 break;
7340 case 2:
7341 verbalize("Yeah whatever, I have %d HP left!", mtmp->mhp);
7342 break;
7343 case 3:
7344 verbalize("No one can take off my remaining %d HP!", mtmp->mhp);
7345 break;
7347 break;
7348 case MS_PRINCESSLEIA:
7349 switch (distresslevel) {
7350 case 1:
7351 pline("%s sighs 'Another evil-doer who doesn't respect a princess...'", Monnam(mtmp));
7352 break;
7353 case 2:
7354 pline("%s sobs 'If only we could live in a world without those violent people...'", Monnam(mtmp));
7355 break;
7356 case 3:
7357 pline("%s cries 'This is not fair! I just want to wear my crown and purple dress, not spill my blue blood all over the place!'", Monnam(mtmp));
7358 break;
7360 break;
7361 case MS_SISSY:
7362 switch (distresslevel) {
7363 case 1:
7364 switch (rnd(5)) {
7365 case 1:
7366 verbalize("ow!");
7367 break;
7368 case 2:
7369 verbalize("owwow!");
7370 break;
7371 case 3:
7372 verbalize("ouch!");
7373 break;
7374 case 4:
7375 verbalize("ow, this is painful!");
7376 break;
7377 case 5:
7378 verbalize("ouchie!");
7379 break;
7381 break;
7382 case 2:
7383 switch (rnd(5)) {
7384 case 1:
7385 verbalize("owwowow ow-wow!");
7386 break;
7387 case 2:
7388 verbalize("owwowow!");
7389 break;
7390 case 3:
7391 verbalize("ow! ow!");
7392 break;
7393 case 4:
7394 verbalize("oooooow!");
7395 break;
7396 case 5:
7397 verbalize("man this hurts so much!");
7398 break;
7400 break;
7401 case 3:
7402 switch (rnd(5)) {
7403 case 1:
7404 verbalize("oooooooow-wowowowowowowow!");
7405 break;
7406 case 2:
7407 verbalize("ooooooow! this is so painful! please make it stop hurting!");
7408 break;
7409 case 3:
7410 verbalize("owwowow! owwowow! why doesn't it stop hurting?!");
7411 break;
7412 case 4:
7413 verbalize("owwooooooooow! i don't want that, owwooooooooow!");
7414 break;
7415 case 5:
7416 verbalize("waaaaaaaah! waaaaaaah! you meanie! you big, evil... owwww...");
7417 break;
7419 break;
7421 break;
7422 case MS_BOT:
7423 switch (distresslevel) {
7424 case 1:
7425 verbalize("Bsst.");
7426 break;
7427 case 2:
7428 verbalize("Dirt ****!");
7429 break;
7430 case 3:
7431 verbalize("Bssssssss-bssssssss...");
7432 break;
7434 break;
7440 static int
7441 dochat()
7443 register struct monst *mtmp;
7444 register int tx,ty;
7445 struct obj *otmp;
7446 char buf[BUFSZ];
7448 boolean eligiblesymbio = FALSE;
7450 if (Muteness || u.uprops[MUTENESS].extrinsic || have_mutenessstone() || (uarmh && uarmh->oartifact == ART_CLELIA_S_TONGUE_BREAKER) ) {
7451 pline("You're muted!");
7452 if (flags.moreforced && !MessagesSuppressed) display_nhwindow(WIN_MESSAGE, TRUE); /* --More-- */
7453 return(0);
7456 if (tech_inuse(T_SILENT_OCEAN)) {
7457 pline("The silent ocean prevents you from talking.");
7458 if (flags.moreforced && !MessagesSuppressed) display_nhwindow(WIN_MESSAGE, TRUE); /* --More-- */
7459 return(0);
7462 if (is_silent(youmonst.data)) {
7463 pline("As %s, you cannot speak.", !missingnoprotect ? an(youmonst.data->mname) : "this weird creature");
7464 if (flags.moreforced && !MessagesSuppressed) display_nhwindow(WIN_MESSAGE, TRUE); /* --More-- */
7465 return(0);
7467 if (Strangled) {
7468 You_cant("speak. You're choking!");
7469 if (flags.moreforced && !MessagesSuppressed) display_nhwindow(WIN_MESSAGE, TRUE); /* --More-- */
7470 return(0);
7472 if (u.uswallow) {
7473 pline("They won't hear you out there.");
7474 if (flags.moreforced && !MessagesSuppressed) display_nhwindow(WIN_MESSAGE, TRUE); /* --More-- */
7475 return(0);
7477 if (Underwater) {
7478 Your("speech is unintelligible underwater.");
7479 if (flags.moreforced && !MessagesSuppressed) display_nhwindow(WIN_MESSAGE, TRUE); /* --More-- */
7480 return(0);
7483 if (!Blind && (otmp = shop_object(u.ux, u.uy)) != (struct obj *)0) {
7484 /* standing on something in a shop and chatting causes the shopkeeper
7485 to describe the price(s). This can inhibit other chatting inside
7486 a shop, but that shouldn't matter much. shop_object() returns an
7487 object iff inside a shop and the shopkeeper is present and willing
7488 (not angry) and able (not asleep) to speak and the position contains
7489 any objects other than just gold.
7491 price_quote(otmp);
7492 return(1);
7495 if (!getdir("Talk to whom? (in what direction)")) {
7496 /* decided not to chat */
7497 return(0);
7500 if (u.usteed && u.dz > 0)
7501 return (domonnoise(u.usteed));
7502 if (u.dz) {
7503 pline("They won't hear you %s there.", u.dz < 0 ? "up" : "down");
7504 return(0);
7507 if (u.dx == 0 && u.dy == 0) {
7509 * Let's not include this. It raises all sorts of questions: can you wear
7510 * 2 helmets, 2 amulets, 3 pairs of gloves or 6 rings as a marilith,
7511 * etc... --KAA
7512 if (u.umonnum == PM_ETTIN) {
7513 You("discover that your other head makes boring conversation.");
7514 return(1);
7517 pline("Talking to yourself is a bad habit for a dungeoneer.");
7518 return(0);
7521 tx = u.ux+u.dx; ty = u.uy+u.dy;
7522 mtmp = m_at(tx, ty);
7524 if (!mtmp || mtmp->mundetected ||
7525 mtmp->m_ap_type == M_AP_FURNITURE ||
7526 mtmp->m_ap_type == M_AP_OBJECT)
7527 return(0);
7529 if (mtmp->shinymonst && !mtmp->mfrenzied && !mtmp->mtame && (u.alla > 100)) {
7531 if (yn("You can tame this monster for 100 alla. Do it?") == 'y') {
7533 mtmp->mpeaceful = TRUE;
7534 (void) tamedog(mtmp, (struct obj *) 0, TRUE);
7535 u.alla -= 100;
7536 pline("Done!");
7537 return 1;
7543 /* sleeping monsters won't talk, except priests (who wake up) */
7544 if ((!mtmp->mcanmove || mtmp->msleeping) && !mtmp->ispriest) {
7545 /* If it is unseen, the player can't tell the difference between
7546 not noticing him and just not existing, so skip the message. */
7547 if (canspotmon(mtmp))
7548 pline("%s seems not to notice you.", Monnam(mtmp));
7549 return(0);
7552 /* if this monster is waiting for something, prod it into action */
7553 mtmp->mstrategy &= ~STRAT_WAITMASK;
7555 if (mtmp->mtame && mtmp->meating) {
7556 if (!canspotmon(mtmp) && !(mtmp->data->msound == MS_DEEPSTATE) && !(mtmp->egotype_deepstatemember))
7557 map_invisible(mtmp->mx, mtmp->my);
7558 pline("%s is eating noisily.", Monnam(mtmp));
7559 return (0);
7562 if ((mtmp->data == &mons[PM_SYMBIULD]) || (mtmp->data == &mons[PM_SYMBIOTE_WITH_A_DATA_DELETE_ATTACK])) eligiblesymbio = TRUE;
7564 if ( (mtmp->mtame) && (((stationary(mtmp->data) || mtmp->data->mmove == 0 || mtmp->data->mlet == S_TURRET) && !Race_if(PM_GOAULD)) || (!(stationary(mtmp->data) || mtmp->data->mmove == 0 || mtmp->data->mlet == S_TURRET) && Race_if(PM_GOAULD))) && !is_arabellamonster(mtmp->data) && !mtmp->mfrenzied && !(mtmp->data->mlevel > 20 || (mtmp->data->mlevel > (u.ulevel + 5)) || cannot_be_tamed(mtmp->data) || (mtmp->cham == CHAM_ZRUTINATOR) || mtmp->isshk || mtmp->isgd || mtmp->ispriest || mtmp->isminion || mtmp->isgyp || (mtmp->oldmonnm != monsndx(mtmp->data))) ) eligiblesymbio = TRUE;
7566 if (eligiblesymbio) {
7568 pline("You can attempt to turn this pet into a symbiote. Warning: if it's an intelligent monster, it may fail and result in a frenzied monster instead!");
7569 getlin("Attempt to turn the pet into a symbiote? [yes/no]", buf);
7570 (void) lcase (buf);
7571 if (!(strcmp (buf, "yes")) ) {
7573 int resistrounds = 0;
7574 if (!mindless(mtmp->data)) resistrounds++;
7575 if (humanoid(mtmp->data)) resistrounds++;
7576 if (mtmp->data == &mons[PM_SYMBIULD]) resistrounds = 0;
7577 if (mtmp->data == &mons[PM_SYMBIOTE_WITH_A_DATA_DELETE_ATTACK]) resistrounds = 0;
7578 if (resistrounds >= 1 && resist(mtmp, TOOL_CLASS, 0, 0)) {
7579 mtmp->mtame = FALSE;
7580 mtmp->mpeaceful = FALSE;
7581 mtmp->mfrenzied = TRUE;
7582 pline("Oh no! %s is frenzied!", Monnam(mtmp));
7583 return 1;
7585 if (resistrounds >= 2 && resist(mtmp, TOOL_CLASS, 0, 0)) {
7586 mtmp->mtame = FALSE;
7587 mtmp->mpeaceful = FALSE;
7588 mtmp->mfrenzied = TRUE;
7589 pline("Oh no! %s is frenzied!", Monnam(mtmp));
7590 return 1;
7593 if (uinsymbiosis && u.usymbiote.cursed) {
7594 pline(FunnyHallu ? "Apparently Morgoth himself decided to curse you with some ancient hex." : "Since your current symbiote is cursed, you cannot get a new one.");
7595 return 1;
7598 /* it worked! */
7600 if (touch_petrifies(mtmp->data) && (!Stone_resistance || (!IntStone_resistance && !rn2(20))) ) {
7601 if (poly_when_stoned(youmonst.data) && polymon(PM_STONE_GOLEM))
7602 display_nhwindow(WIN_MESSAGE, FALSE);
7603 else {
7604 static char kbuf[BUFSZ];
7605 pline("Incorporating a petrifying creature is a fatal mistake.");
7606 sprintf(kbuf, "picking the wrong symbiote");
7607 instapetrify(kbuf);
7610 if (slime_on_touch(mtmp->data) && !Slimed && !flaming(youmonst.data) && !Unchanging && !slime_on_touch(youmonst.data)) {
7611 You("don't feel very well.");
7612 make_slimed(100);
7613 killer_format = KILLED_BY_AN;
7614 delayed_killer = "slimed by picking the wrong symbiote";
7617 turnmonintosymbiote(mtmp, FALSE); /* WARNING: mtmp is removed at this point */
7619 return 1;
7624 if (Role_if(PM_CONVICT) && is_rat(mtmp->data) && mtmp->m_lev <= 30 && mtmp->m_lev <= (u.ulevel + 5) && !mtmp->mpeaceful && !mtmp->mtame) {
7625 You("attempt to soothe the %s with chittering sounds.", l_monnam(mtmp));
7626 if ((rnl(10) < 2) || ((rnd(30 - ACURR(A_CHA))) < 4)) {
7627 (void) tamedog(mtmp, (struct obj *) 0, FALSE);
7628 } else {
7629 if (rnl(10) > 8) {
7630 pline("%s unfortunately ignores your overtures.", Monnam(mtmp));
7631 return 1;
7633 if (!mtmp->mfrenzied) mtmp->mpeaceful = 1;
7634 set_malign(mtmp);
7636 return 1;
7639 if (u.ugold >= 1000 && !mtmp->mtame && mtmp->mnum != quest_info(MS_NEMESIS) && uarmh && uarmh->oartifact == ART_CLAUDIA_S_SEXY_SCENT && mtmp->data->msound == MS_STENCH) {
7641 if (yn("Hire this pretty lady for 1000 dollars?") == 'y') {
7643 (void) tamedog(mtmp, (struct obj *) 0, FALSE);
7644 u.ugold -= 1000;
7645 use_skill(P_SQUEAKING, rnd(5));
7646 return 1;
7652 if (u.smexyberries >= 1000 && !mtmp->mtame && mtmp->mnum != quest_info(MS_NEMESIS) && uarmf && uarmf->oartifact == ART_SMEXY_BERRIES && mtmp->female && mtmp->data->geno & G_UNIQ && (mtmp->data->msound == MS_BOSS || mtmp->data->msound == MS_FART_NORMAL || mtmp->data->msound == MS_FART_QUIET || mtmp->data->msound == MS_FART_LOUD) ) {
7654 if (yn("This lady wants to join your team. Do you want to tame her?") == 'y') {
7656 (void) tamedog(mtmp, (struct obj *) 0, FALSE);
7657 u.smexyberries = 0;
7658 use_skill(P_SQUEAKING, rnd(5));
7659 return 1;
7665 if ( (Role_if(PM_FEAT_MASTER) || Race_if(PM_VORTEX) || Race_if(PM_CORTEX)) && mtmp->m_lev <= 30 && mtmp->m_lev <= (u.ulevel + 7) && mtmp->data->mlet == S_VORTEX && !mtmp->mtame && mtmp->mnum != quest_info(MS_NEMESIS) && !(mtmp->data->geno & G_UNIQ) ) {
7667 if (yn("Tame the vortex?") == 'y') {
7669 pline("You attempt to tame %s.",mon_nam(mtmp) );
7670 (void) tamedog(mtmp, (struct obj *) 0, FALSE);
7671 return 1;
7675 if (Race_if(PM_KOP) && mtmp->m_lev <= 30 && mtmp->m_lev <= (u.ulevel + 10) && mtmp->data->mlet == S_KOP && mtmp->mpeaceful && !mtmp->mtame && mtmp->mnum != quest_info(MS_NEMESIS) && !(mtmp->data->geno & G_UNIQ) && u.uhunger > 100 ) {
7677 if (yn("Recruit this officer of the law?") == 'y') {
7679 pline("You convince %s to join your cause.",mon_nam(mtmp) );
7680 morehungry(100);
7682 (void) tamedog(mtmp, (struct obj *) 0, TRUE);
7683 use_skill(P_SQUEAKING, 1);
7685 return 1;
7689 if (((uarmf && itemhasappearance(uarmf, APP_FETISH_HEELS))) && (mtmp->data->mlet == S_NYMPH || mtmp->data->msound == MS_FART_NORMAL || mtmp->data->msound == MS_FART_QUIET || mtmp->data->msound == MS_FART_LOUD)) {
7691 if (yn("Pacify this monster?") == 'y') {
7692 pline("You attempt to pacify %s.",mon_nam(mtmp) );
7694 if (!mtmp->mfrenzied && mtmp->m_lev < rnd(50) && rn2(u.ulevel + 2) && (rn2(3) || ((rnd(30 - ACURR(A_CHA))) < 4)) ) {
7695 mtmp->mpeaceful = 1;
7696 return 1;
7702 if ((Role_if(PM_PROSTITUTE) || Role_if(PM_KURWA) || (uarmf && uarmf->oartifact == ART_VERY_PROSTITUTED) || autismweaponcheck(ART_SEXCALIBUR)) && humanoid(mtmp->data) ) {
7704 if (!(mtmp->mtame)) {
7706 if (u.homosexual == 0) {
7707 pline("You're discovering your sexuality...");
7708 getlin("Are you homosexual? [y/yes/no] (If you answer no, you're heterosexual.)", buf);
7709 (void) lcase (buf);
7710 if (!(strcmp (buf, "yes")) || !(strcmp (buf, "y")) || !(strcmp (buf, "ye")) || !(strcmp (buf, "ys"))) u.homosexual = 2;
7711 else u.homosexual = 1;
7714 (void) doseduce(mtmp);
7715 return 1;
7720 if (Role_if(PM_LADIESMAN) && mtmp->m_lev <= 30 && mtmp->m_lev <= (u.ulevel + 10) && !flags.female && (mtmp->data->mlet == S_NYMPH || mtmp->data->msound == MS_NURSE || mtmp->data->msound == MS_SEDUCE || mtmp->data->msound == MS_WHORE) && !mtmp->mtame && !mtmp->mpeaceful && mtmp->mnum != quest_info(MS_NEMESIS) && !mtmp->mfrenzied && !(mtmp->data->geno & G_UNIQ) ) {
7722 if (yn("Seduce this pretty lady?") == 'y') {
7724 pline("You attempt to seduce %s.",mon_nam(mtmp) );
7726 mtmp->mpeaceful = 1; /* they will always become at least peaceful. --Amy */
7727 set_malign(mtmp);
7729 /* higher level monsters are less likely to be affected --Amy */
7730 if (mtmp->m_lev < rnd(50) && rn2(u.ulevel + 2) && (rn2(3) || ((rnd(30 - ACURR(A_CHA))) < 4)) ) {
7731 (void) tamedog(mtmp, (struct obj *) 0, TRUE);
7734 return 1;
7738 if (Race_if(PM_BABYLONIAN) && mtmp->mpeaceful && mtmp->m_lev <= 30 && mtmp->m_lev < (u.ulevel + 5) && !mtmp->mtame && mtmp->data->mlet == S_TURRET) {
7739 int stonescost = 10;
7740 if (mtmp->m_lev >= 1) stonescost = (mtmp->m_lev) * 10;
7741 pline("You can turn this turret into a symbiote by paying %d stones.", stonescost);
7742 if (yn("Do it?") == 'y') {
7743 register struct obj *prcstone;
7744 prcstone = carrying(ROCK);
7745 if (prcstone) {
7746 if (prcstone->quan > stonescost) {
7747 prcstone->quan -= stonescost;
7748 prcstone->owt = weight(prcstone);
7749 turnmonintosymbiote(mtmp, FALSE); /* WARNING: mtmp is removed at this point */
7750 } else if (prcstone->quan == stonescost) {
7751 useupall(prcstone);
7752 turnmonintosymbiote(mtmp, FALSE); /* WARNING: mtmp is removed at this point */
7753 } else {
7754 pline("Your main stack of stones isn't big enough!");
7756 } else pline("You don't have any stones!");
7757 return 1;
7761 if (Race_if(PM_IMPERIAL) && mtmp->mnum != quest_info(MS_NEMESIS) && !(mtmp->data->geno & G_UNIQ) && !mtmp->mpeaceful &&
7762 !mtmp->mtame && u.uhunger > 100) {
7764 if (yn("Use the Emperor's Voice?") == 'y') {
7766 verbalize("%s", !rn2(3) ? "By the power of His Holiness Titus Medes, I beseech thee - stop thine combat actions!" : !rn2(2) ? "Long live Martin Septim! Thou shall surrender lest I smite thee!" : "The Emperor will spare thy life if thou stoppest fighting!");
7767 morehungry(100);
7768 use_skill(P_SQUEAKING, 1);
7770 /* higher level monsters are less likely to be affected --Amy */
7771 if (!mtmp->mfrenzied && mtmp->m_lev < rnd(50) && rn2(u.ulevel + 2) && (rn2(3) || ((rnd(30 - ACURR(A_CHA))) < 4)) ) {
7772 mtmp->mpeaceful = 1;
7773 set_malign(mtmp);
7774 pline("%s is convinced by your sermon, and no longer views you as an enemy!",l_monnam(mtmp));
7777 return 1;
7782 if (uarmg && uarmg->oartifact == ART_VULTUREHANDLER && mtmp->data->mlet == S_BAT && !is_bat(mtmp->data) && !mtmp->mpeaceful && !mtmp->mfrenzied && !mtmp->mtame) {
7783 if (yn("Try to pacify the bird?") == 'y') {
7785 pline("You try to calm %s.", mon_nam(mtmp) );
7787 if (!rn2(4)) {
7788 if (!resist(mtmp, RING_CLASS, 0, NOTELL)) {
7789 mtmp->mpeaceful = TRUE;
7790 pline("%s seems calmer.", Monnam(mtmp));
7794 return 1;
7800 if (Race_if(PM_MUMMY) && mtmp->mnum != quest_info(MS_NEMESIS) && mtmp->m_lev <= 30 && mtmp->m_lev <= (u.ulevel + 7) && !(mtmp->data->geno & G_UNIQ) &&
7801 !mtmp->mtame && (is_undead(mtmp->data) || mtmp->egotype_undead) && u.uhunger > 500) {
7803 if (yn("Try to tame this undead monster?") == 'y') {
7805 pline("You frantically chant at %s.",mon_nam(mtmp) );
7806 morehungry(500);
7807 use_skill(P_SQUEAKING, rnd(5));
7809 /* higher level monsters are less likely to be affected --Amy */
7810 if (mtmp->m_lev < rnd(100) && rn2(u.ulevel + 2) && (rn2(3) || ((rnd(30 - ACURR(A_CHA))) < 4)) ) {
7812 (void) tamedog(mtmp, (struct obj *) 0, FALSE);
7815 return 1;
7820 return domonnoise(mtmp);
7823 #ifdef USER_SOUNDS
7825 extern void play_usersound(const char*, int);
7827 typedef struct audio_mapping_rec {
7828 #ifdef USER_SOUNDS_REGEX
7829 struct re_pattern_buffer regex;
7830 #else
7831 char *pattern;
7832 #endif
7833 char *filename;
7834 int volume;
7835 struct audio_mapping_rec *next;
7836 } audio_mapping;
7838 static audio_mapping *soundmap = 0;
7840 char* sounddir = ".";
7842 /* adds a sound file mapping, returns 0 on failure, 1 on success */
7844 add_sound_mapping(mapping)
7845 const char *mapping;
7847 char text[256];
7848 char filename[256];
7849 char filespec[256];
7850 int volume;
7852 if (sscanf(mapping, "MESG \"%255[^\"]\"%*[\t ]\"%255[^\"]\" %d",
7853 text, filename, &volume) == 3) {
7854 const char *err;
7855 audio_mapping *new_map;
7857 if (strlen(sounddir) + strlen(filename) > 254) {
7858 raw_print("sound file name too long");
7859 return 0;
7861 sprintf(filespec, "%s/%s", sounddir, filename);
7863 if (can_read_file(filespec)) {
7864 new_map = (audio_mapping *)alloc(sizeof(audio_mapping));
7865 #ifdef USER_SOUNDS_REGEX
7866 new_map->regex.translate = 0;
7867 new_map->regex.fastmap = 0;
7868 new_map->regex.buffer = 0;
7869 new_map->regex.allocated = 0;
7870 new_map->regex.regs_allocated = REGS_FIXED;
7871 #else
7872 new_map->pattern = (char *)alloc(strlen(text) + 1);
7873 strcpy(new_map->pattern, text);
7874 #endif
7875 new_map->filename = strdup(filespec);
7876 new_map->volume = volume;
7877 new_map->next = soundmap;
7879 #ifdef USER_SOUNDS_REGEX
7880 err = re_compile_pattern(text, strlen(text), &new_map->regex);
7881 #else
7882 err = 0;
7883 #endif
7884 if (err) {
7885 raw_print(err);
7886 free(new_map->filename);
7887 free(new_map);
7888 return 0;
7889 } else {
7890 soundmap = new_map;
7892 } else {
7893 sprintf(text, "cannot read %.243s", filespec);
7894 raw_print(text);
7895 return 0;
7897 } else {
7898 raw_print("syntax error in SOUND");
7899 return 0;
7902 return 1;
7905 void
7906 play_sound_for_message(msg)
7907 const char* msg;
7909 audio_mapping* cursor = soundmap;
7911 while (cursor) {
7912 #ifdef USER_SOUNDS_REGEX
7913 if (re_search(&cursor->regex, msg, strlen(msg), 0, 9999, 0) >= 0) {
7914 #else
7915 if (pmatch(cursor->pattern, msg)) {
7916 #endif
7917 play_usersound(cursor->filename, cursor->volume);
7919 cursor = cursor->next;
7923 #endif /* USER_SOUNDS */
7925 void
7926 maybegaincha()
7928 if (ABASE(A_CHA) < 10) {
7929 int chachance = 100;
7930 switch (ABASE(A_CHA)) {
7931 case 1: chachance = 33; break;
7932 case 2: chachance = 66; break;
7933 case 3: chachance = 100; break;
7934 case 4: chachance = 150; break;
7935 case 5: chachance = 200; break;
7936 case 6: chachance = 250; break;
7937 case 7: chachance = 300; break;
7938 case 8: chachance = 350; break;
7939 case 9: chachance = 400; break;
7940 default: chachance = 500; break;
7942 if (!rn2(chachance)) (void) adjattrib(A_CHA, 1, FALSE, TRUE);
7946 void
7947 playermsconvert()
7949 int k, l;
7950 struct monst *mtmp3;
7952 int cost = 50;
7953 if (!PlayerCannotUseSkills) {
7954 switch (P_SKILL(P_SQUEAKING)) {
7955 case P_BASIC: cost *= 9; cost /= 10; break;
7956 case P_SKILLED: cost *= 8; cost /= 10; break;
7957 case P_EXPERT: cost *= 7; cost /= 10; break;
7958 case P_MASTER: cost *= 6; cost /= 10; break;
7959 case P_GRAND_MASTER: cost *= 5; cost /= 10; break;
7960 case P_SUPREME_MASTER: cost *= 4; cost /= 10; break;
7961 default: break;
7964 if (u.uen < cost) {
7965 You("lack the energy to use your conversion sermon! Need at least %d mana!", cost);
7966 if (flags.moreforced && !MessagesSuppressed) display_nhwindow(WIN_MESSAGE, TRUE); /* --More-- */
7967 return;
7969 u.uen -= cost;
7970 use_skill(P_SQUEAKING, 2);
7971 conversionsermon();
7973 for (k = -3; k <= 3; k++) for(l = -3; l <= 3; l++) {
7974 if (!isok(u.ux + k, u.uy + l)) continue;
7975 if ( ((mtmp3 = m_at(u.ux + k, u.uy + l)) != 0) && !is_infrastructure_monster(mtmp3) && mtmp3->mtame == 0 && mtmp3->mpeaceful == 0 && mtmp3->mfrenzied == 0 && mtmp3->isminion == 0 && mtmp3->isgyp == 0
7976 && mtmp3->mnum != quest_info(MS_NEMESIS) && !(mtmp3->data->geno & G_UNIQ) )
7979 if ( (!rn2(10) || mtmp3->data->msound == MS_CONVERT || mtmp3->data->msound == MS_HCALIEN) && !resist(mtmp3, RING_CLASS, 0, NOTELL)) {
7980 pline("%s is converted.", mon_nam(mtmp3));
7981 mtmp3->mpeaceful = 1;
7984 } /* monster is catchable loop */
7985 } /* for loop */
7989 void
7990 playerwouwoutaunt()
7993 int cost = 100;
7994 if (!PlayerCannotUseSkills) {
7995 switch (P_SKILL(P_SQUEAKING)) {
7996 case P_BASIC: cost *= 9; cost /= 10; break;
7997 case P_SKILLED: cost *= 8; cost /= 10; break;
7998 case P_EXPERT: cost *= 7; cost /= 10; break;
7999 case P_MASTER: cost *= 6; cost /= 10; break;
8000 case P_GRAND_MASTER: cost *= 5; cost /= 10; break;
8001 case P_SUPREME_MASTER: cost *= 4; cost /= 10; break;
8002 default: break;
8005 if (u.uen < cost) {
8006 You("lack the energy to chant a wouwou taunt! Need at least %d mana!", cost);
8007 if (flags.moreforced && !MessagesSuppressed) display_nhwindow(WIN_MESSAGE, TRUE); /* --More-- */
8008 return;
8010 u.uen -= cost;
8011 use_skill(P_SQUEAKING, 4);
8012 wouwoutaunt();
8014 register struct monst *mtmp;
8016 for(mtmp = fmon; mtmp; mtmp = mtmp->nmon) {
8017 if (DEADMONSTER(mtmp)) continue;
8018 if (mtmp->mpeaceful || mtmp->mfrenzied || mtmp->mtame) continue;
8019 if(distu(mtmp->mx, mtmp->my) < 65) {
8020 if (!resist(mtmp, SCROLL_CLASS, 0, NOTELL)) {
8022 if (mtmp->data->msound == MS_CONVERT || mtmp->data->msound == MS_HCALIEN) {
8023 pline("%s is pacified.", mon_nam(mtmp));
8024 mtmp->mpeaceful = 1;
8025 } else {
8026 monflee(mtmp, rnd(10), FALSE, FALSE);
8027 pline("%s turns to flee!", Monnam(mtmp));
8036 void
8037 playerwhoretalk()
8040 int cost = 100;
8041 if (!PlayerCannotUseSkills) {
8042 switch (P_SKILL(P_SQUEAKING)) {
8043 case P_BASIC: cost *= 9; cost /= 10; break;
8044 case P_SKILLED: cost *= 8; cost /= 10; break;
8045 case P_EXPERT: cost *= 7; cost /= 10; break;
8046 case P_MASTER: cost *= 6; cost /= 10; break;
8047 case P_GRAND_MASTER: cost *= 5; cost /= 10; break;
8048 case P_SUPREME_MASTER: cost *= 4; cost /= 10; break;
8049 default: break;
8052 if (u.uen < cost) {
8053 You("lack the energy to use your sexy talk ability! Need at least %d mana!", cost);
8054 if (flags.moreforced && !MessagesSuppressed) display_nhwindow(WIN_MESSAGE, TRUE); /* --More-- */
8055 return;
8057 u.uen -= cost;
8058 use_skill(P_SQUEAKING, 4);
8060 You("make very female noises!");
8062 register struct monst *nexusmon, *nextmon;
8063 for(nexusmon = fmon; nexusmon; nexusmon = nextmon) {
8064 nextmon = nexusmon->nmon; /* trap might kill mon */
8065 if (DEADMONSTER(nexusmon)) continue;
8066 if (nexusmon->mpeaceful || nexusmon->mtame) continue;
8067 if (resist(nexusmon, SPBOOK_CLASS, 0, NOTELL)) continue;
8068 if (resist(nexusmon, SPBOOK_CLASS, 0, NOTELL)) continue;
8070 if (distu(nexusmon->mx, nexusmon->my) > rnd(50)) continue;
8072 /* doesn't anger peaceful ones - not a bug --Amy */
8073 pline("%s cannot resist!", Monnam(nexusmon));
8074 monflee(nexusmon, rnd(20), FALSE, TRUE);
8075 if (nexusmon->mblinded < 100) nexusmon->mblinded += 20;
8076 nexusmon->mcansee = 0;
8077 nexusmon->mstun = TRUE;
8078 nexusmon->mconf = TRUE;
8080 if (!resists_drain(nexusmon) && !resist(nexusmon, SPBOOK_CLASS, 0, NOTELL)) {
8081 pline("%s shudders in dread!", Monnam(nexusmon));
8082 nexusmon->mhpmax -= rnd(10);
8083 if (nexusmon->mhpmax < 1) nexusmon->mhpmax = 1;
8084 if (nexusmon->mhp > nexusmon->mhpmax) nexusmon->mhp = nexusmon->mhpmax;
8085 nexusmon->m_enmax -= rnd(10);
8086 if (nexusmon->m_enmax < 0) nexusmon->m_enmax = 0;
8087 if (nexusmon->m_en > nexusmon->m_enmax) nexusmon->m_en = nexusmon->m_enmax;
8088 if (nexusmon->m_lev > 0) nexusmon->m_lev--;
8089 if (nexusmon->m_lev > 0 && !rn2(4)) nexusmon->m_lev--;
8095 if (practicantterror) {
8096 pline("%s rings out: 'Your irritating noises are disturbing the other practicants, so here's a warning for you to not do that again and I also receive 50 zorkmids from you.'", noroelaname());
8097 fineforpracticant(50, 0, 0);
8102 void
8103 playersupermantaunt()
8106 int cost = 200;
8107 if (!PlayerCannotUseSkills) {
8108 switch (P_SKILL(P_SQUEAKING)) {
8109 case P_BASIC: cost *= 9; cost /= 10; break;
8110 case P_SKILLED: cost *= 8; cost /= 10; break;
8111 case P_EXPERT: cost *= 7; cost /= 10; break;
8112 case P_MASTER: cost *= 6; cost /= 10; break;
8113 case P_GRAND_MASTER: cost *= 5; cost /= 10; break;
8114 case P_SUPREME_MASTER: cost *= 4; cost /= 10; break;
8115 default: break;
8118 if (u.uen < cost) {
8119 You("lack the energy to make a superman taunt! Need at least %d mana!", cost);
8120 if (flags.moreforced && !MessagesSuppressed) display_nhwindow(WIN_MESSAGE, TRUE); /* --More-- */
8121 return;
8123 u.uen -= cost;
8124 use_skill(P_SQUEAKING, 10);
8125 supermantaunt();
8126 turn_allmonsters();
8128 if (practicantterror) {
8129 pline("%s booms: 'Stop screaming like a mad%s. You pay 500 zorkmids now, and better don't scare the other practicants like that again, maggot!'", noroelaname(), flags.female ? "woman" : "man");
8130 fineforpracticant(500, 0, 0);
8136 void
8137 playerrattlebones()
8140 int cost = 25;
8141 if (!PlayerCannotUseSkills) {
8142 switch (P_SKILL(P_SQUEAKING)) {
8143 case P_BASIC: cost *= 9; cost /= 10; break;
8144 case P_SKILLED: cost *= 8; cost /= 10; break;
8145 case P_EXPERT: cost *= 7; cost /= 10; break;
8146 case P_MASTER: cost *= 6; cost /= 10; break;
8147 case P_GRAND_MASTER: cost *= 5; cost /= 10; break;
8148 case P_SUPREME_MASTER: cost *= 4; cost /= 10; break;
8149 default: break;
8152 if (u.uen < cost) {
8153 You("lack the energy to rattle your bones! Need at least %d mana!", cost);
8154 if (flags.moreforced && !MessagesSuppressed) display_nhwindow(WIN_MESSAGE, TRUE); /* --More-- */
8155 return;
8157 u.uen -= cost;
8158 use_skill(P_SQUEAKING, 1);
8159 You(FunnyHallu ? "play the xylophone." : "rattle noisily.");
8162 register struct monst *nexusmon, *nextmon;
8163 for(nexusmon = fmon; nexusmon; nexusmon = nextmon) {
8164 nextmon = nexusmon->nmon; /* trap might kill mon */
8165 if (DEADMONSTER(nexusmon)) continue;
8166 if (!nexusmon->mcanmove) continue;
8167 if (rn2(10)) continue; /* low chance of success --Amy */
8168 if (resist(nexusmon, SPBOOK_CLASS, 0, NOTELL)) continue;
8170 if (distu(nexusmon->mx, nexusmon->my) > rnd(26)) continue;
8172 wakeup(nexusmon); /* can anger peaceful monsters --Amy */
8173 nexusmon->mcanmove = 0;
8174 nexusmon->mfrozen = 2;
8175 nexusmon->mstrategy &= ~STRAT_WAITFORU;
8176 pline("%s freezes for a moment.", Monnam(nexusmon));
8181 if (practicantterror) {
8182 pline("%s rings out: 'Your irritating noises are disturbing the other practicants, so here's a warning for you to not do that again and I also receive 50 zorkmids from you.'", noroelaname());
8183 if (FunnyHallu) pline("%s adds: 'Better hope I won't confiscate your xylophone. This is a chemical laboratory, not a music hall.'", noroelaname());
8184 fineforpracticant(50, 0, 0);
8189 void
8190 conversionsermon()
8192 static const char *conversion_msgs[] = {
8193 "Kafir! Yuece Tanri sizi sevmez, ve sonra doenuestuermek yoksa cezalandirilacaktir!",
8194 "Kafir, Allah'a doenuestuermek ya da oel!",
8195 "Kafir, kutsal Tanri bu boelgede emanetler en kadirdir. Ve bunu degistirmek olmaz!",
8196 "Kafir, sizin yollariniz sapkin vardir! Islam sizi doenuestuermek zamanidir.",
8197 "Kafir, sen domuz pirzola yeme suc islemis! Allah sana cok kizgin!",
8198 "Allahu Akbar! Allahu Akbar!",
8199 "Kafir, Allah bueyuektuer ve seni yok eder!",
8200 "Kafir! Kac kere zaten gavur dedin? Sen inanc degistirmek icin ya da Tanri ilahi ceza kesin olacak var!",
8201 "Allah senin gibi kafirler sevmez ve cok zalim bir sekilde sizi cezalandiracaktir!",
8202 "Bizim kutsal cami kafirler tarafindan yerle bir olma tehlikesiyle karsi karsiya! Bueyuek Tanri bize yardim ve ilahi asker goendermesi gerekir!",
8203 "Kafir, Allah bueyuek ve gueclue oldugunu! Ona inanmaya baslarlar yoksa, aci olacak!",
8204 "Allah onlari oelduererek ve kutsal ateste kendi cesetlerini yakarak buetuen kafirleri cezalandiracaktir.",
8205 "Kafir, Allah beni tuvalete bok sesleri ueretmek icin izin! Eger o saygi yoksa sonsuza aci olacaktir!",
8206 "Tek bir gercek dindir ve Tuerkiye cumhurbaskani, onu buetuen duenyaya yayacak bilge bir adamdir! Allah bueyuek!",
8207 "Kafir! Kutsal topraklarda hicbir sey kaybetmedin! ABD'ye ya da nereye giderseniz gidin!",
8208 "Inanilmaz olan, senin evin benim tarafimdan yere serilecek.",
8209 "Inanilmaz, nihayet askerlerini uelkemden mi cekiyorsun yoksa sinirlenmek zorunda miyim?",
8210 "Inanmasiz, silahim seni vurmak uezere! Sana daha iyi bakarim!",
8211 "Haha, sen inandin, saldirmami kaldiramazsin!",
8212 "Inanli olmayan, sana simdi pusu kurup seni uyariyorum. Yani beni yine de durdurma sansin yok.",
8213 "Kafir! Hemen buradan cik, buguen camiye gitmem ve dua etmeliyim!",
8214 "Kafir! seni ve iman eden askerlerinizi yok edecegiz!",
8215 "Inanilmazsin, benden uzak dur yoksa bir talihsizlik olur!",
8216 "Inkar edenler sadece korkaklar, asla kendinizi adil bir doevuese sokmazsiniz! Simdi sikici el bombalari kullanmaliyim!",
8217 "Gercekten sadece buguen sinirlenmek istiyor musun, inandin mi? Sanirim simdi agir topcuyla gelecegim.",
8218 "Inanilmaz olan, Islam'in tek gercek din oldugunu itiraf etme zamani.",
8219 "Inancsiz, pes et! Islam'in kutsal askerleri simdi sehrinizi istila edecek!",
8220 "Inanilmaz, yavas yavas oelmesi gerektigini duesuenmueyor musun? Vuecudun yine de degersiz!",
8221 "Bu bir hacli seferi olacak mi, inandin mi? Kutsal Allah'in gazabini zorla cagirir misin?",
8222 "Kafirlerin sizin talihsizlikleriniz icin yiyeceksiniz ve Allah sahsen sizi atesin uezerinde bas asagi kizdiracak!",
8223 "Lanet olasi inanmayan koepekler, kutsal topraklardan disari cik! Hepiniz inkar ediyorsunuz ve Allah sizi sevmiyor, duyuyor musunuz?",
8224 "Tamam, inandin. Yeterli olan yeter! Herkese, kafirleri hemen yok edin!",
8225 "Ben cihad, kutsal savas icin cagiriyorum! Kafirler, oelueme savasiyoruz!",
8226 "Hepinizi inatci koepekler yapacagiz!",
8227 "Inanilmaz, ama simdi yeterli! Simdi Allah'in gazabi sana vuracak!",
8228 "Inkar edenler iki seceneginiz var. Hemen Islam'a itiraf edin ya da yueksek savas botlarim ciddi yaralar acacak.",
8229 "Oyuncu bir guevensiz! Onu Islam'a doenuestuerme zamani.",
8230 "Inkar edenler yenilir. Derhal Islam'in tek gercek din oldugunu ya da kutsal Allah'in gazabini hissettirdigini itiraf edin!",
8231 "Oyuncu ve adamlari... pah. Buetuen inanmayanlar. Sadece askerlerim kimin dine inanmalari gerektigini biliyor!",
8232 "Hahahaha Hahahaha! Tuerk savas botlari bedeninizi yok etti, siz kafirler!",
8233 "Nihayet uelkemi terk ediyor musun, inanmiyor musun?",
8234 "Kafir! Ha ha! Simdi ya Islam'a ya da oeluersuen.",
8235 "Kafirler, senin kokulu fabrikalarin simdi yikilacak!",
8236 "Inanli olmayan, Allah size uecuencueluek eder ve sonra sizi tehlikede yakar.",
8237 "Kafir! Simdi kac kere seni guevensiz aradim?",
8238 "Sonunda inanclarinizi degistirmelisiniz, siz kafirler, aksi takdirde bir firtina olacak!",
8239 "Gizli silahimi nerede sakladigimi hatirladim! Hehehe, simdi size goesteriyorum, siz kafirler.",
8240 "Kutsal cami kafirlerin tehdidi altindadir! Allah, bize yardim et ve onlari yuvarlamalarini engelle!",
8241 "Tuem erkekler ve kadinlar saldirmak icin! Kafirleri derhal uzaklastirin!",
8242 "Buetuen kafirlere goere kutsal Islam, bu topraklarin kalintilarinin cogunda hakimdir.",
8243 "Kafirler buguen emanetlerimizi tekrar yakalamayacaklar!",
8244 "Yalanci medyanin fikri yok! Islam tek gercek din ve kafirler bunu degistirmeyecek!",
8245 "Inkar edenler beni kandirdi, ama sizi Islam'in tek gercek din olduguna inandiricam.",
8246 "Aaaaaaaaaaaah! Hayir! Kafirlerimiz camimizi gercekten yok etti! Simdi kim Islam'i yaymali?",
8247 "Oh hayir, simdi vazgecebilirim, sadece bu kafirler yuezuenden...",
8248 "Inkar edenler, engizisyonumdan kacamaz, itiraf edemez veya oelebilirler.",
8249 "Allah seni yok edecek, inandin!",
8250 "Neden oyuna daha fazla inanmayan asker getiriyorsun?",
8251 "Siz kafirsiniz, dininiz bos ve gecersizdir!",
8252 "Kafir, bas oertuesue baskinin bir sembolue degil! Onu kucaklamali ve bir tane de giymelisin yoksa Allah seni cezalandiracak!",
8253 "Kafir, bir kadinin tuem kafasini kamuya goestermemesi gerektigini asla anlamayacaksiniz. Bueyuek Allah, bir bas oertuesue her zaman giyilmesi gerektigini oegretir.",
8254 "Kafirlerin beni tuvalete kadar takip etmelerine izin vermeyecegim ve kicimin uerettigi erotik kirma seslerini dinleyemem. Yine de yaparsan, doevues botu topuklari bacaklarini kemige cizecek ve seni oelduerecek.",
8255 "Benim siyah bayan sandaletler senin gibi bir kafir tarafindan asla hasar goermeyecek!",
8256 "Senin yayla botlarimin altindaki kafirleri ezecegim!",
8257 "Bir kafirle evlenmeyecegim, Allah'a iman eden birisini sececegim ve ic camasirlarimi, coraplarimi ve sandaletlerimle savasirken disi catlak seslerimi dinlemesine izin vererek onu memnun edecegim.",
8258 "Cogu zaman tuvalette saatlerce catlak sesler ueretiyorum, ama sadece Allah'in inanclilari onlari dinleyebilir. Gizlice iceri girerlerse kafirler oelecek.",
8259 "Hic kafir bir kadini cok guezel bulabilir! Her zaman kafa oertueleri giymeliyiz!",
8260 "Allah kafa bezinin bize oezguerluek verdigini soeyler, cuenkue saf olmayan kafirlerin pis bakislarini uzak tutar!",
8261 "Ben seksi yueksek topuklu botlar giyiyorum cuenkue ben bir harlotum, ama ben sadece aydinlanmis olanlar icin calisiyorum, bu yuezden de bir bas kumasina ihtiyacim var! Hic kafir beni beceremez!",
8262 "Eger herhangi bir aldatmaca kafamin uestuenue cikarmaya calisirsa, onu oelduermek icin erkekleri ise alirim!",
8263 "Bueyuek Allah, kadinlara basoertuesue takmayan firmalarin ateste oelecegini soeylueyor!",
8264 "Tabii ki kuecuek okul kizlari da bir bas oertuesue giymelidir! Cok fazla kendilerini goesterirlerse, bazi iyi olmayan cocuklar da onlara bakar ve Allah her ne pahasina olursa olsun bunu engellemelidir!",
8265 "Kendimizi kafir toplumlara entegre etmek zorunda degiliz, onlari Allah adina sollamak zorundayiz! Cuenkue bu heretiklerin Islam'a doenuesmesi gerekiyor!",
8266 "Hic kimse kirli domuz eti yiyemez! Allah onu dizanteri ile yemeye cueret eden herkesi cezalandiracak.",
8267 "Bir kafir adamin Mueslueman bir bayanla konusmasi tamamen duesuenuelemez. Bu, kafa bezine sahip olmamizin nedenlerinden biri, cuenkue Yuece Allah, bizi zarardan koruyor.",
8268 "Biz, buezguelue ailelerin barok kalelerde yer bulduklari icin bez giyiyoruz, cuenkue kafir aileler ilk geldiler bile beklemek zorundalar. Bueyuek Allah, degersiz bir Alman azinligi bekler!",
8269 "Biz bez harbots basimiza yueksek topuklularimizla asyali tekmeyi oegrendik, bu sayede kutsal Allah adina kafirlerin ezmelerini ve parcalarini kirabiliriz.",
8270 "Cok fazla kafir adam var ve bu yuezden kafamizi hicbir zaman halka acik goesteremiyoruz. Ancak, sadece kadinlara yoenelik spor merkezine girersek, bas bezini cikaririz cuenkue Allah, kadinlarin asla tecavuez etmeyecegini bilir. Lezbiyenlik yoktur.",
8271 "Allah, basoertuesue takmayan kafir Avrupali kadinlardan nefret eder. Muesluemanlarin ayri bir banyosunun yapilmasini istiyoruz cuenkue bizi o boktan fahiselerin tuvalete gitmesini istemiyoruz.",
8272 "Kafamizi takmiyorken bizi goeren kafir adama vay canina. Yuece Allah, ona asiri oenyargi ile yaklasir.",
8273 "Bazen inatci erkekleri kandirmak icin paragraf botlari giyerim. Benimle sevisebileceklerini duesuenuerlerse, kiralik suikastcilar onu Allah'in adiyla sessizce kaldiracaklar.",
8274 "Domuz cocuk bahcesinde servis edilirse yanlistir! Buetuen bu kafir egitmenler yakinda Allah'a iman eden insanlarla degistirilecek.",
8275 "Evet, kafirler bize yuezuemuezue oerten kiyafetler vermedikce yuezme ya da spora katilmak zorunda olmadigimiz dogrudur. Allah bize, inkarcilarin yaptigi kurallarin bizim kurallarimiz olmadigini ve takip edilmesine gerek olmadigini oegretir.",
8276 "Aptal Alman uelkesi kendisini yok edecek ve bu kafirleri yavasca kaldirarak Allah'a yardim edecegiz. Daha sonra Berlin, Yeni Istanbul'a yeniden adlandirilacaktir.",
8277 "Neden kizlari kizdirmaya calisiyorsun? Sizi durdurmak icin herkesi basoertuesue takmaya zorlayacagiz!",
8278 "Ne, sen kafir, cinsel popoyu ihale popomun tuvalete yaptigi kadin sesine cekti mi? Delirmis olmalisin!",
8279 "Ne, sen kafir kafami sadece beni kizdirmak mi istiyorsun? Allah, senin icin oeluem cezasi olacagini soeyler!",
8280 "Sen kafir doenuestueruelecek, ve eger bir kadin iseniz de bir kafa bezi giymek zorunda kalacaksiniz!",
8281 "Bueyuek Allah, bu kadar genisletilmis egrinin, en iyi varyant oldugunu kabul etmeyen herkesi cezalandiracak! Eger sporkun daha iyi oldugunu duesuenueyorsaniz, sen lanet bir kafirsin ve diri diri diri yakilacaksin!",
8282 "Bu oyunun aptal bir versiyonunu oynuyorsun, seni kafir! Yuece Allah, benim icin bir oyuncu vur!",
8283 "Kuefuer edersiniz, Isvecli adamin yapmasi gereken varyanti oynamalisiniz, cuenkue canavarlar soykirimin yazilarini okumalarina izin vererek cok daha dengeli!",
8284 "Oynayabilecegin cok daha iyi bir cesit var, zindanlar ve ejderhalar hack, ama sen eski heretik bu boku oynamak zorunda. Allah size yildirim carpacaktir.",
8285 "Neden hala salak oyun oynuyorsun? Doert kana gecin ya da cok gueclue Allah sizi parcalara ayirir!",
8286 "Allah, varyantini yuezen goezbebeklerini calmayan her kafirin kisisel bilgisayarini kizdirir.",
8287 "Onun varyanti seytan degildir, sen kafir! Simdi oyna ya da bu senin sonun!",
8288 "Bana 2000 numara altin parca, yoksa oyunun coekmesine sebep olacaksin, seni kafir!",
8289 "Sen seytani hain! Bu ne cueret? Intikam seni guevende, kafir!",
8290 "Hicbir kafirin direnemeyecegi cok kadin tuvalet sesleri ueretebilirim.",
8291 "Tuvalete yapabilecegim kadin sesler basmak ve sicramak. Korktun mu, sen kafir misin?",
8292 "Ne, beni cekici buldugunu soeylueyorsun? Bu olamaz. Derhal bas borumu tekrar giyecegim.",
8293 "Sert cekirdekli uzaylilar uzayli degil! Onlarin bedenlerini kafir erkek bakislarindan saklamak icin pecelerini giyiyorlar!",
8294 "Kadinlara karsi kadinlari kuran feminist hakli, erkek kafirleri her zaman masum kadinlara bakiyor! Koruma icin basoertuesue ve pece giymeliyiz!",
8295 "Ne, ben guezel oldugumu mu soeylueyorsun? Bu tahammuel edilemez. Hicbir kafir, bir Islam kadinini guezel olarak algilayamaz! Cildimi suya batiracak ve basoertuesue ve tam oertue giyecegim!",
8296 "Benim guezel savas botlari bacaklarinizi tam uzunlukta kesecek ve oelueme kadar kanayacak, kafir cehennemden ortaya cikmayacak!",
8297 "Bana ne diyorsun seytan kadin? Ben oeyle degilim! Ben Islam'in bueyuek sorusturmacisiyim ve kutsal Allah adina seni kafir edecegim!",
8298 "Plato kiz botlarimin uezerinden gecmemelisin! Senin gibi bir kafir asla evlenmeyecegi icin adanmislikla diz coekmen gerekiyor!",
8299 "Benim gri spor ayakkabim hicbir sekilde oezel degil, seksi bulursaniz sizi havaya ucurur. Beni cekici buldugum kafirler bas barimla bogulurlar.",
8300 "Ben farkli degilim cuenkue bir bas oertuesue giyiyorum! Beni ayrimcilik yapmamalisin, kafir demek istiyorsun!",
8301 "Siz kafirler bizi kabul etmeli ve dininize uygun olmali! Kapsayici olmak istiyorsaniz, oegretmenlerin ve polis kadinlarinin ve digerlerinin halka acik bir bez kullanmasina izin veriyorsunuz!",
8302 "Beni 'basoertuesue kiz' sluruna duesuerme, seni lanet olasi kafir! Bu benim kimligimin bir parcasi ve bunu kabullenmek icin kanunla zorlanacaksin!",
8303 "Kafa bezi bize fransiz sigaralari gibi oezguerluek veriyor! Siz kafirler asla anlayamayacaksiniz cuenkue Tanri'ya inanmiyorsunuz!",
8304 "Yeme tabagim sacmalik degil! Sen pis kafir sadece domuz eti kirli oldugunu ve hic kimsenin tarafindan yenilmeyecegini anlamiyorum! Cuenkue yaparsan kansersin!",
8305 "Imam, kafir kueltueruenuen hicbir seyin degersiz oldugunu soeylueyor. Bu nedenle aptal kurallariniza uymak zorunda degiliz ve okul da ise yaramiyor, cuenkue birkac yil icinde hepiniz asimile olacaksiniz.",
8306 "Yuezmeye katilmak zorunda degilim! Kafir guecuen beni zorlamak istiyor ama kutsal Islam her zaman bir bas oertuesue giymem gerektigini soeylueyor ve bu da aptal yuezme derslerine uymuyor! Politikacilarina bogma tilsimindan bogulmalarini soeyle!",
8307 "Acil bir durum varsa, oence Allah'ta muesluemanlar ve inananlar kurtarilmalidir! Kafirler daha bueyuek iyilik icin kurban edilebilir!",
8308 "Inanilmaz lanet olasi guezel Islam'in duenyayi yoenetecegini anlamazsin.",
8309 "Ne, Almanya'nin alternatifi mueslueman avlamak mi istiyor? Yuece Allah adina, bu kafirleri dogrudan cehenneme goenderecek, cocuklarini oelduerecek ve kadinlarini koele tueccarlarina satacagiz.",
8310 "Kafa bezi sadece bir bez parcasi degildir! Onu takariz cuenkue bizi Allah'in kutsal mueminleri olarak tanimlar! Sadece kafirlerin anlamadigi icin hicbir anlam ifade etmez!",
8311 "Bir Yahudi dini semboluenue giydigi icin saldiriya ugrarsa, kendi hatasidir. Biz mueslueman bir kafa bezi giymek icin bize saldiran kimseyi asla kabul etmeyecegiz, cuenkue biz kafir topuklularimizla bir asyali tekmelemizi dogrudan kafir somunlarina yerlestirecegiz.",
8312 "Siz kafirsiniz, Allah'a doenmelisiniz cuenkue o zaman cennette doksan dokuz genc kadin var! Eger yapmazsan, cehennemin kirmizi seytanlari acimasizca iskence edecek!",
8313 "Halkimizin kutsal topraklara seyahat etmesine izin verilmemesi bir hakaret! Bueyuek Tanri, bu karardan sorumlu olan buetuen kafirleri cezalandirir!",
8314 "Kongremizdeki kadinlar suclu degil! Ancak baskan kirli bir kuefuer ve Tanri sahsen ona yildirim carpacak!",
8315 "Bir bildirimin ardindan geri doendueguemuez icin neden uezuelmemiz gerektigini duesuenueyorsunuz? Siz heretik, istediginizi aldiniz, cuenkue yuece Tanrimiz affetmez!",
8316 "Yasli ihtiyar bizim icadi olan doener kebabi yiyorsun, ama dinimiz hakkinda yalan soeylueyorsun! Tanrimiz seni mahvedecek!",
8317 "Ceviri makinesi kirli kafirler tarafindan isletiliyor, cuenkue tanri adina varsayilan ceviriyi degistirdiler!",
8318 "Benim konusmalarimi zaten anlamiyorsunuz, bu yuezden irkinizin tamamen ortadan kaldirilmasi icin cagri yapabilirim, sizi allahimiza inanmayan insafsizsiniz.",
8319 "Temizlik Allah'in guenue buetuen kafirler cezalandirmak ve ilk bu sapkin kadin olacak!",
8320 "Sen inanmayan basoertueguemue indiremezsin!",
8321 "Savas botlarim kaninizi kutsal Allah'a feda edecek, sizi kafir!",
8322 "Kafirler gelmeden tuvalete gitmem gerekiyor!",
8323 "Belki kafirleri erojen seslerle cezbedebilirim!",
8324 "Kafirlere arkadan saldirdigimizda Allah razi olur.",
8325 "Allah'in gazabindan hicbir kafir kacamaz.",
8326 "Allah'imiz, tuem kafirleri yok edecek.",
8327 "Geri cekilmek! Kafirlerin bizi yakalamasina izin vermeyin!",
8328 "Basoertueguemue caldin! Bunun icin bu kafir doerde boeluenmeli!",
8329 "Eger benim gibi bir Muesluemana kuefuer edersen, Allah onu yildirimla oeldueruer!",
8330 "Kutsal Allah'a kurban olacaginiz sunak hazir!",
8331 "Hicbir kafir Islam'i durduramaz!",
8332 "Yuece Allah, yardim et ve beni kafirlerden koru!",
8333 "Kafirler korku icinde titreyip Allah'in kutsal gazabina huekmedilsin.",
8334 "Basoertuesue takmayan tuem inancsiz kadinlar din degistirilmelidir!",
8335 "Evlilik oencesi cinsel iliski, yalnizca inanmayanlarin isledigi oeluemcuel bir guenahtir! Bunun icin Allah onlari oelduerecek!",
8336 "Allah onlara oeluem emrini verdigi icin, oegrencilerimizin geleneksel kiyafetlerini giymelerine izin vermedikleri icin buetuen kafirler oelecekler.",
8337 "Bizim kanunumuz Allah'in kanunudur! Hicbir duenyevi insanin, oezellikle de sapkinlarin neyin dogru oldugu konusunda soez hakki yoktur!",
8338 "Biz bu uelkeye aitiz ve aksini soeyleyen her kafir Allah'in gazabina ugrayacaktir! Bu bir gercek!",
8339 "Kamuoyunda basoertuesue takma hakkimizi savunmak icin kaya gibi dimdik duracagiz! Kafirler bize neyi giyip giyemeyecegimizi soeyleyemezler, cuenkue Allah bizden yanadir!",
8341 verbalize("%s", conversion_msgs[rn2(SIZE(conversion_msgs))]);
8345 void
8346 wouwoutaunt()
8348 static const char *hcalien_msgs[] = {
8349 "Wouwou.",
8350 "Wouuu.",
8351 "Www-wouwou.",
8352 "Wwouwwouww.",
8353 "Wowou.",
8354 "Wwwouu.",
8356 verbalize("%s", hcalien_msgs[rn2(SIZE(hcalien_msgs))]);
8360 void
8361 supermantaunt()
8363 static const char *superman_msgs[] = {
8364 "FRONTAL ATTACK!!!",
8365 "YOU DON'T STAND A CHANCE!",
8366 "YOU WILL DIE A SLOW, SLOW, DEATH...",
8367 "COME OUT! WE WILL HURT YOU!",
8368 "GRRRRRRRRRAAAAAAAAAAHHH!",
8369 "CHARRRRRRRRRGE!",
8370 "FEAR ME!!!",
8371 "DIE YOU SON OF A BITCH!", /* too lazy to check for female PC --Amy */
8372 "I AM YOUR DOOM!",
8373 "YOUR LIFE IS GONNA END NOW!",
8374 "YOU WILL CEASE TO EXIST!",
8375 "I'M GOING TO EAT YOU!",
8376 "RAAAAAAAAAAAARGH!",
8377 "ATTACK PATTERN ALPHA!",
8378 "YOU CAN'T HIDE!",
8379 "THERE'S NO ESCAPE!",
8380 "BE AFRAID OF ME!",
8381 "ATTAAAAAAAAAAAAACK!",
8384 verbalize("%s", superman_msgs[rn2(SIZE(superman_msgs))]);
8388 void
8389 prostitutetaunt()
8391 static const char *whore_msgs[] = { /* These are obviously inspired by the GTA series --Amy */
8392 "Come to Momma.",
8393 "I'm gonna call my pimp.",
8394 "You picked the wrong bitch.",
8395 "You're just another sorry ass!",
8396 "Hey, this is my first night!",
8397 "You know, I used to be a marine before the OP.", /* Vice City */
8398 "Cocksucker!",
8399 "I'll kick your nuts flat!", /* yes the PC can be female, but who cares? */
8400 "I'm no slut, I just need the money!",
8401 "I'll be sitting on you in a second.",
8402 "You think I can't mess you up?",
8403 "Die in a pool of your own blood.",
8404 "Get ready for an ass-kicking.",
8405 "You want me to whoop you?",
8406 "You want some? I'll give you some!",
8407 "Enjoy this stiletto.",
8408 "If I don't kill you, my parents will.",
8409 "I know kickboxing.",
8410 "I'm a black belt in karate.",
8411 "My hands are lethal weapons.",
8412 "I'll kick your teeth in.",
8413 "Would you really hit a woman?",
8414 "I've killed hundreds of pigs like you!",
8415 "I'm gonna open up a can of whoopass on you now!",
8416 "Girls can fight too!",
8417 "Beating on girls, right?",
8418 "I have no problem kicking you in the nuts.",
8419 "I'll slap you silly.",
8420 "My pimp will take care of you.",
8421 "You're messing with an angry bitch!",
8422 "Another asshole with a problem!",
8423 "You think cause I'm a girl I can't fight?",
8424 "You call that 'fighting'?",
8425 "I'm gonna stomp your balls!",
8426 "I'm a lady but I can fight.",
8427 "I'm an innocent virgin!",
8428 "You just made me break a nail!",
8429 "I'm expecting an apology!",
8430 "You insult my womanhood.",
8431 "You disgust me.",
8432 "Oh yeah baby, let's brawl.",
8433 "Think you're hard hitting a woman?",
8434 "You want my heel in your ass?",
8435 "This is gonna hurt!",
8436 "Ass-kicking runs in my family.",
8437 "How about a free face-lift?",
8438 "Watch those shoes, girl.",
8439 "Oh my god, watch the pumps!",
8440 "You're ruining the ambience.",
8441 "I love it when it gets violent.",
8442 "I'm totally spitting in your drink.",
8443 "Can you put lotion on the back of my leg?",
8444 "I can kick, you know.",
8445 "You fight like a girl.",
8446 "What are you wearing?!",
8447 "Let's scrap you, buster.",
8448 "Still sleepy, sister?",
8449 "I'm gonna slap you so hard you're gonna cry!",
8450 "Oh what's the matter baby, gonna cry?",
8451 "Now I have to get another panic here!",
8452 "You can't beat me. I'm empowered.",
8453 "Hitting me does not make you any less of a loser.",
8454 "Are you sorry now?",
8455 "Don't mess with a lifestyle doll.",
8456 "Accept your punishment!",
8457 "You can't hit me, I'm a lady!",
8458 "I'm gonna beat me just like I beat my children!",
8461 verbalize("%s", whore_msgs[rn2(SIZE(whore_msgs))]);
8465 void
8466 principaltaunt()
8468 static const char *principal_msgs[] = {
8469 "What's up?",
8470 "I really feel sick - there are so many things to do!",
8471 "Help me, I faint!",
8472 "We'll do that in groups of one person!",
8475 verbalize("%s", principal_msgs[rn2(SIZE(principal_msgs))]);
8478 void
8479 pupiltaunt()
8481 static const char *pupil_msgs[] = {
8482 "Today no homework ... *please*",
8483 "six times nine is ... um ... uh ... ... forty-two",
8484 "you ... Strange word", /* You're not expected to understand this ... */
8485 "Bugger off!",
8486 "*uck off!",
8487 "What are the newest news about the Super Information Highway?",
8488 "What do you want?",
8489 "Do the world a favour---jump out of the 20th story of the Uni-Center!",
8492 verbalize("%s", pupil_msgs[rn2(SIZE(pupil_msgs))]);
8496 void
8497 teachertaunt()
8499 static const char *teacher_msgs[] = {
8500 "No chance! Every day you'll get homework!",
8501 "Is it really true? Does really _everybody_ have the homework?",
8502 "That usage of the word 'goes' does harm to my ears!",
8503 "Your attitude is really unacceptable!",
8504 "The \"Stigel-Brauerei\" was founded 1492. Well, in that year was that affair with that guy, Columbus, but that really isn't important.",
8505 "Why are you going? I'm only 20 minutes late!",
8506 "Where's your problem? I'll be happy to help you",
8507 "You didn't understand? Then let's begin again ... (*sigh*)",
8508 "No homework yet? - This can be changed!",
8509 "Overbecks - das Ueberbier",
8510 "How about dehydrating carbonhydrates today?",
8511 "Back when I was a pupil, the following thing happened ...",
8512 "Back when I was studying chemistry, the following thing happened ...",
8513 "... dann ist die Scheisse am dampfen",
8514 "NIKI forever!",
8515 "Pascal forever!",
8516 "Yes ... I know that everything is easier in C, but I simply love Pascal ...",
8517 "You have Str:0 (at most), so bugger off!",
8518 "Do it - who cares about the odd broken bone?",
8519 "You are sick because you were running for 30 minutes? So run another hour!",
8520 "Shall I help you? (takes the whip)",
8521 "We'll do that diagonally. *grin* (wipes sweat off head)",
8522 "*grin*",
8523 "You know, (*grin*) we'll have to do something now! (*grin*)",
8524 "How about a pupil experiment - cut off your ears?",
8525 "Yet another pupil experiment: the consequences of KCN ingested.",
8526 "Don't expect to get away without homework!",
8527 "No homework in the holidays? You must have something to do, after all!",
8528 "The low level of you all is really beyond acception!",
8529 "There was endless work in the supervision and administration of the farm ...",
8530 /* it's really a shame that I can't think of more messages for him */
8531 "I expect you to do your homework _regularly_ and _carefully_!",
8532 "The level of work is really very low nowadays!",
8533 "In _our_ times pupils were real pupils and teachers were real teachers!",
8534 "Back when pupils where real pupils and teachers were real teachers, everything was better!",
8537 verbalize("%s", teacher_msgs[rn2(SIZE(teacher_msgs))]);
8540 #endif /* OVLB */
8542 /*sounds.c*/