1 /* SCCS Id: @(#)pray.c 3.3 2000/06/29 */
2 /* Copyright (c) Benson I. Margulies, Mike Stephenson, Steve Linhart, 1989. */
3 /* NetHack may be freely redistributed. See license for details. */
4
5 #include "hack.h"
6 #include "epri.h"
7
8 STATIC_PTR int NDECL(prayer_done);
9 STATIC_DCL int NDECL(in_trouble);
10 STATIC_DCL void FDECL(fix_worst_trouble,(int));
11 STATIC_DCL void FDECL(angrygods,(ALIGNTYP_P));
12 STATIC_DCL void FDECL(pleased,(ALIGNTYP_P));
13 STATIC_DCL void FDECL(godvoice,(ALIGNTYP_P,const char*));
14 STATIC_DCL void FDECL(god_zaps_you,(ALIGNTYP_P));
15 STATIC_DCL void FDECL(fry_by_god,(ALIGNTYP_P));
16 STATIC_DCL void FDECL(gods_angry,(ALIGNTYP_P));
17 STATIC_DCL void FDECL(gods_upset,(ALIGNTYP_P));
18 STATIC_DCL void FDECL(consume_offering,(struct obj *));
19 STATIC_DCL boolean FDECL(water_prayer,(BOOLEAN_P));
20 STATIC_DCL boolean FDECL(blocked_boulder,(int,int));
21
22 /*
23 * Logic behind deities and altars and such:
24 * + prayers are made to your god if not on an altar, and to the altar's god
25 * if you are on an altar
26 * + If possible, your god answers all prayers, which is why bad things happen
27 * if you try to pray on another god's altar
28 * + sacrifices work basically the same way, but the other god may decide to
29 * accept your allegiance, after which they are your god. If rejected,
30 * your god takes over with your punishment.
31 * + if you're in Gehennom, all messages come from Moloch
32 */
33
34 /*
35 * Moloch, who dwells in Gehennom, is the "renegade" cruel god
36 * responsible for the theft of the Amulet from Marduk, the Creator.
37 * Moloch is unaligned.
38 */
39 static const char *Moloch = "Moloch";
40
41 static const char *godvoices[] = {
42 "booms out",
43 "thunders",
44 "rings out",
45 "booms",
46 };
47
48 /* values calculated when prayer starts, and used when completed */
49 static aligntyp p_aligntyp;
50 static int p_trouble;
51 static int p_type; /* (-1)-3: (-1)=really naughty, 3=really good */
52
53 #define PIOUS 20
54 #define DEVOUT 14
55 #define FERVENT 9
56 #define STRIDENT 4
57
58 #define TROUBLE_STONED 12
59 #define TROUBLE_SLIMED 11
60 #define TROUBLE_STRANGLED 10
61 #define TROUBLE_LAVA 9
62 #define TROUBLE_SICK 8
63 #define TROUBLE_STARVING 7
64 #define TROUBLE_HIT 6
65 #define TROUBLE_LYCANTHROPE 5
66 #define TROUBLE_COLLAPSING 4
67 #define TROUBLE_STUCK_IN_WALL 3
68 #define TROUBLE_CURSED_BLINDFOLD 2
69 #define TROUBLE_CURSED_LEVITATION 1
70
71 #define TROUBLE_PUNISHED (-1)
72 #define TROUBLE_CURSED_ITEMS (-2)
73 #define TROUBLE_BLIND (-3)
74 #define TROUBLE_POISONED (-4)
75 #define TROUBLE_WOUNDED_LEGS (-5)
76 #define TROUBLE_HUNGRY (-6)
77 #define TROUBLE_STUNNED (-7)
78 #define TROUBLE_CONFUSED (-8)
79 #define TROUBLE_HALLUCINATION (-9)
80
81 /* We could force rehumanize of polyselfed people, but we can't tell
82 unintentional shape changes from the other kind. Oh well. */
83
84 /* Return 0 if nothing particular seems wrong, positive numbers for
85 serious trouble, and negative numbers for comparative annoyances. This
86 returns the worst problem. There may be others, and the gods may fix
87 more than one.
88
89 This could get as bizarre as noting surrounding opponents, (or hostile dogs),
90 but that's really hard.
91 */
92
93 #define ugod_is_angry() (u.ualign.record < 0)
94 #define on_altar() IS_ALTAR(levl[u.ux][u.uy].typ)
95 #define on_shrine() ((levl[u.ux][u.uy].altarmask & AM_SHRINE) != 0)
96 #define a_align(x,y) ((aligntyp)Amask2align(levl[x][y].altarmask & AM_MASK))
97
98 STATIC_OVL int
in_trouble()99 in_trouble()
100 {
101 register struct obj *otmp;
102 int i, j, count=0;
103
104 /* Borrowed from eat.c */
105
106 #define SATIATED 0
107 #define NOT_HUNGRY 1
108 #define HUNGRY 2
109 #define WEAK 3
110 #define FAINTING 4
111 #define FAINTED 5
112 #define STARVED 6
113
114 if(Stoned) return(TROUBLE_STONED);
115 if(Slimed) return(TROUBLE_SLIMED);
116 if(Strangled) return(TROUBLE_STRANGLED);
117 if(u.utrap && u.utraptype == TT_LAVA) return(TROUBLE_LAVA);
118 if(Sick) return(TROUBLE_SICK);
119 if(u.uhs >= WEAK) return(TROUBLE_STARVING);
120 if (Upolyd ? (u.mh <= 5 || u.mh*7 <= u.mhmax) :
121 (u.uhp <= 5 || u.uhp*7 <= u.uhpmax)) return TROUBLE_HIT;
122 if(u.ulycn >= LOW_PM) return(TROUBLE_LYCANTHROPE);
123 if(near_capacity() >= EXT_ENCUMBER && AMAX(A_STR)-ABASE(A_STR) > 3)
124 return(TROUBLE_COLLAPSING);
125
126 for (i= -1; i<=1; i++) for(j= -1; j<=1; j++) {
127 if (!i && !j) continue;
128 if (!isok(u.ux+i, u.uy+j) || IS_ROCK(levl[u.ux+i][u.uy+j].typ)
129 || (blocked_boulder(i,j) && !throws_rocks(youmonst.data)))
130 count++;
131 }
132 if (count == 8 && !Passes_walls)
133 return(TROUBLE_STUCK_IN_WALL);
134
135 if((uarmf && uarmf->otyp==LEVITATION_BOOTS && uarmf->cursed) ||
136 (uleft && uleft->otyp==RIN_LEVITATION && uleft->cursed) ||
137 (uright && uright->otyp==RIN_LEVITATION && uright->cursed))
138 return(TROUBLE_CURSED_LEVITATION);
139 if(Blindfolded && ublindf->cursed) return(TROUBLE_CURSED_BLINDFOLD);
140
141 if(Punished) return(TROUBLE_PUNISHED);
142 for(otmp=invent; otmp; otmp=otmp->nobj)
143 if((otmp->otyp==LOADSTONE || otmp->otyp==LUCKSTONE) &&
144 otmp->cursed)
145 return(TROUBLE_CURSED_ITEMS);
146 if((uarmh && uarmh->cursed) || /* helmet */
147 (uarms && uarms->cursed) || /* shield */
148 (uarmg && uarmg->cursed) || /* gloves */
149 (uarm && uarm->cursed) || /* armor */
150 (uarmc && uarmc->cursed) || /* cloak */
151 (uarmf && uarmf->cursed && uarmf->otyp != LEVITATION_BOOTS) ||
152 /* boots */
153 (ublindf && ublindf->otyp == LENSES && ublindf->cursed) ||
154 /* lenses: blindfold is TROUBLE_CURSED_BLINDFOLD */
155 #ifdef TOURIST
156 (uarmu && uarmu->cursed) || /* shirt */
157 #endif
158 (welded(uwep)) ||
159 (uleft && uleft->cursed && uleft->otyp != RIN_LEVITATION) ||
160 (uright && uright->cursed && uright->otyp != RIN_LEVITATION) ||
161 (uamul && uamul->cursed))
162 return(TROUBLE_CURSED_ITEMS);
163
164 if(Blinded > 1) return(TROUBLE_BLIND);
165 for(i=0; i<A_MAX; i++)
166 if(ABASE(i) < AMAX(i)) return(TROUBLE_POISONED);
167 if(Wounded_legs) return (TROUBLE_WOUNDED_LEGS);
168 if(u.uhs >= HUNGRY) return(TROUBLE_HUNGRY);
169 if(HStun) return (TROUBLE_STUNNED);
170 if(HConfusion) return (TROUBLE_CONFUSED);
171 if(Hallucination) return(TROUBLE_HALLUCINATION);
172
173 return(0);
174 }
175
176 const char leftglow[] = "left ring softly glows";
177 const char rightglow[] = "right ring softly glows";
178
179 STATIC_OVL void
fix_worst_trouble(trouble)180 fix_worst_trouble(trouble)
181 register int trouble;
182 {
183 int i;
184 struct obj *otmp;
185 const char *what = (const char *)0;
186
187 switch (trouble) {
188 case TROUBLE_STONED:
189 You_feel("more limber.");
190 Stoned = 0;
191 delayed_killer = 0;
192 break;
193 case TROUBLE_SLIMED:
194 pline_The("slime disappears.");
195 Slimed = 0;
196 delayed_killer = 0;
197 break;
198 case TROUBLE_STRANGLED:
199 if (uamul && uamul->otyp == AMULET_OF_STRANGULATION) {
200 Your("amulet vanishes!");
201 useup(uamul);
202 }
203 You("can breathe again.");
204 Strangled = 0;
205 break;
206 case TROUBLE_LAVA:
207 You("are back on solid ground.");
208 /* teleport should always succeed, but if not,
209 * just untrap them.
210 */
211 if(!safe_teleds())
212 u.utrap = 0;
213 break;
214 case TROUBLE_STARVING:
215 losestr(-1);
216 /* fall into... */
217 case TROUBLE_HUNGRY:
218 Your("stomach feels content.");
219 init_uhunger();
220 flags.botl = 1;
221 break;
222 case TROUBLE_SICK:
223 You_feel("better.");
224 make_sick(0L, (char *) 0, FALSE, SICK_ALL);
225 break;
226 case TROUBLE_HIT:
227 /* "fix all troubles" will keep trying if hero has
228 5 or less hit points, so make sure they're always
229 boosted to be more than that */
230 You_feel("much better.");
231 if (Upolyd) {
232 u.mhmax += rnd(5);
233 if (u.mhmax <= 5) u.mhmax = 5+1;
234 u.mh = u.mhmax;
235 }
236 if (u.uhpmax < u.ulevel * 5 + 11) u.uhpmax += rnd(5);
237 if (u.uhpmax <= 5) u.uhpmax = 5+1;
238 u.uhp = u.uhpmax;
239 flags.botl = 1;
240 break;
241 case TROUBLE_COLLAPSING:
242 ABASE(A_STR) = AMAX(A_STR);
243 flags.botl = 1;
244 break;
245 case TROUBLE_STUCK_IN_WALL:
246 Your("surroundings change.");
247 /* no control, but works on no-teleport levels */
248 (void) safe_teleds();
249 break;
250 case TROUBLE_CURSED_LEVITATION:
251 if (uarmf && uarmf->otyp==LEVITATION_BOOTS
252 && uarmf->cursed)
253 otmp = uarmf;
254 else if (uleft && uleft->otyp==RIN_LEVITATION
255 && uleft->cursed) {
256 otmp = uleft;
257 what = leftglow;
258 } else {
259 otmp = uright;
260 what = rightglow;
261 }
262 goto decurse;
263 case TROUBLE_CURSED_BLINDFOLD:
264 otmp = ublindf;
265 goto decurse;
266 case TROUBLE_LYCANTHROPE:
267 you_unwere(TRUE);
268 break;
269 case TROUBLE_PUNISHED:
270 Your("chain disappears.");
271 unpunish();
272 break;
273 case TROUBLE_CURSED_ITEMS:
274 /* weapon takes precedence if it interferes
275 with taking off a ring or shield */
276 if (welded(uwep) && /* weapon */
277 (uright || (bimanual(uwep) && (uleft || uarms))))
278 otmp = uwep;
279 /* gloves come next, due to rings */
280 else if (uarmg && uarmg->cursed) /* gloves */
281 otmp = uarmg;
282 /* then shield due to two handed weapons and spells */
283 else if (uarms && uarms->cursed) /* shield */
284 otmp = uarms;
285 /* then cloak due to body armor */
286 else if (uarmc && uarmc->cursed) /* cloak */
287 otmp = uarmc;
288 else if (uarm && uarm->cursed) /* armor */
289 otmp = uarm;
290 else if (uarmh && uarmh->cursed) /* helmet */
291 otmp = uarmh;
292 else if (uarmf && uarmf->cursed) /* boots */
293 otmp = uarmf;
294 #ifdef TOURIST
295 else if (uarmu && uarmu->cursed) /* shirt */
296 otmp = uarmu;
297 #endif
298 /* (perhaps amulet should take precedence over rings?) */
299 else if (uleft && uleft->cursed) {
300 otmp = uleft;
301 what = leftglow;
302 } else if (uright && uright->cursed) {
303 otmp = uright;
304 what = rightglow;
305 } else if (uamul && uamul->cursed) /* amulet */
306 otmp = uamul;
307 else if (ublindf && ublindf->cursed) /* eyewear */
308 otmp = ublindf; /* must be non-blinding lenses */
309 /* if weapon wasn't handled above, do it now */
310 else if (welded(uwep)) /* weapon */
311 otmp = uwep;
312 else {
313 for(otmp=invent; otmp; otmp=otmp->nobj)
314 if ((otmp->otyp==LOADSTONE ||
315 otmp->otyp==LUCKSTONE) && otmp->cursed)
316 break;
317 }
318 decurse:
319 if (!otmp) {
320 impossible("fix_worst_trouble: nothing to uncurse.");
321 return;
322 }
323 uncurse(otmp);
324 otmp->bknown = TRUE;
325 if (!Blind)
326 Your("%s %s.",
327 what ? what :
328 (const char *)aobjnam (otmp, "softly glow"),
329 hcolor(amber));
330 break;
331 case TROUBLE_POISONED:
332 if (Hallucination)
333 pline("There's a tiger in your tank.");
334 else
335 You_feel("in good health again.");
336 for(i=0; i<A_MAX; i++) {
337 if(ABASE(i) < AMAX(i)) {
338 ABASE(i) = AMAX(i);
339 flags.botl = 1;
340 }
341 }
342 (void) encumber_msg();
343 break;
344 case TROUBLE_BLIND:
345 Your("%s feel better.", makeplural(body_part(EYE)));
346 make_blinded(0L,FALSE);
347 break;
348 case TROUBLE_WOUNDED_LEGS:
349 heal_legs();
350 break;
351 case TROUBLE_STUNNED:
352 make_stunned(0L,TRUE);
353 break;
354 case TROUBLE_CONFUSED:
355 make_confused(0L,TRUE);
356 break;
357 case TROUBLE_HALLUCINATION:
358 pline ("Looks like you are back in Kansas.");
359 make_hallucinated(0L,FALSE,0L);
360 break;
361 }
362 }
363
364 /* "I am sometimes shocked by... the nuns who never take a bath without
365 * wearing a bathrobe all the time. When asked why, since no man can see them,
366 * they reply 'Oh, but you forget the good God'. Apparently they conceive of
367 * the Deity as a Peeping Tom, whose omnipotence enables Him to see through
368 * bathroom walls, but who is foiled by bathrobes." --Bertrand Russell, 1943
369 * Divine wrath, dungeon walls, and armor follow the same principle.
370 */
371 STATIC_OVL void
god_zaps_you(resp_god)372 god_zaps_you(resp_god)
373 aligntyp resp_god;
374 {
375 if (u.uswallow) {
376 pline("Suddenly a bolt of lightning comes down at you from the heavens!");
377 pline("It strikes %s!", mon_nam(u.ustuck));
378 if (!resists_elec(u.ustuck)) {
379 pline("%s fries to a crisp!", Monnam(u.ustuck));
380 /* Yup, you get experience. It takes guts to successfully
381 * pull off this trick on your god, anyway.
382 */
383 xkilled(u.ustuck, 0);
384 } else
385 pline("%s seems unaffected.", Monnam(u.ustuck));
386 } else {
387 pline("Suddenly, a bolt of lightning strikes you!");
388 if (Reflecting) {
389 shieldeff(u.ux, u.uy);
390 if (Blind)
391 pline("For some reason you're unaffected.");
392 else
393 (void) ureflects("%s reflects from your %s.", "It");
394 } else if (Shock_resistance) {
395 shieldeff(u.ux, u.uy);
396 pline("It seems not to affect you.");
397 } else
398 fry_by_god(resp_god);
399 }
400
401 pline("%s is not deterred...", align_gname(resp_god));
402 if (u.uswallow) {
403 pline("A wide-angle disintegration beam aimed at you hits %s!",
404 mon_nam(u.ustuck));
405 if (!resists_disint(u.ustuck)) {
406 pline("%s fries to a crisp!", Monnam(u.ustuck));
407 xkilled(u.ustuck, 2); /* no corpse */
408 } else
409 pline("%s seems unaffected.", Monnam(u.ustuck));
410 } else {
411 pline("A wide-angle disintegration beam hits you!");
412
413 /* disintegrate shield and body armor before disintegrating
414 * the impudent mortal, like black dragon breath -3.
415 */
416 if (uarms && !(EReflecting & W_ARMS) &&
417 !(EDisint_resistance & W_ARMS))
418 (void) destroy_arm(uarms);
419 if (uarmc && !(EReflecting & W_ARMC) &&
420 !(EDisint_resistance & W_ARMC))
421 (void) destroy_arm(uarmc);
422 if (uarm && !(EReflecting & W_ARM) &&
423 !(EDisint_resistance & W_ARM) && !uarmc)
424 (void) destroy_arm(uarm);
425 #ifdef TOURIST
426 if (uarmu && !uarm && !uarmc) (void) destroy_arm(uarmu);
427 #endif
428 if (!Disint_resistance)
429 fry_by_god(resp_god);
430 else {
431 You("bask in its %s glow for a minute...", Black);
432 godvoice(resp_god, "I believe it not!");
433 }
434 if (Is_astralevel(&u.uz) || Is_sanctum(&u.uz)) {
435 /* one more try for high altars */
436 verbalize("Thou cannot escape my wrath, mortal!");
437 summon_minion(resp_god, FALSE);
438 summon_minion(resp_god, FALSE);
439 summon_minion(resp_god, FALSE);
440 verbalize("Destroy %s, my servants!", him[flags.female]);
441 }
442 }
443 }
444
445 STATIC_OVL void
fry_by_god(resp_god)446 fry_by_god(resp_god)
447 aligntyp resp_god;
448 {
449 char killerbuf[64];
450
451 You("fry to a crisp.");
452 killer_format = KILLED_BY;
453 Sprintf(killerbuf, "the wrath of %s", align_gname(resp_god));
454 killer = killerbuf;
455 done(DIED);
456 }
457
458 STATIC_OVL void
angrygods(resp_god)459 angrygods(resp_god)
460 aligntyp resp_god;
461 {
462 register int maxanger;
463
464 if(Inhell) resp_god = A_NONE;
465 u.ublessed = 0;
466
467 /* changed from tmp = u.ugangr + abs (u.uluck) -- rph */
468 /* added test for alignment diff -dlc */
469 if(resp_god != u.ualign.type)
470 maxanger = u.ualign.record/2 + (Luck > 0 ? -Luck/3 : -Luck);
471 else
472 maxanger = 3*u.ugangr +
473 ((Luck > 0 || u.ualign.record >= STRIDENT) ? -Luck/3 : -Luck);
474 if (maxanger < 1) maxanger = 1; /* possible if bad align & good luck */
475 else if (maxanger > 15) maxanger = 15; /* be reasonable */
476
477 switch (rn2(maxanger)) {
478 case 0:
479 case 1: You_feel("that %s is %s.", align_gname(resp_god),
480 Hallucination ? "bummed" : "displeased");
481 break;
482 case 2:
483 case 3:
484 godvoice(resp_god,(char *)0);
485 pline("\"Thou %s, %s.\"",
486 (ugod_is_angry() && resp_god == u.ualign.type)
487 ? "hast strayed from the path" :
488 "art arrogant",
489 youmonst.data->mlet == S_HUMAN ? "mortal" : "creature");
490 verbalize("Thou must relearn thy lessons!");
491 (void) adjattrib(A_WIS, -1, FALSE);
492 losexp((char *)0);
493 break;
494 case 6: if (!Punished) {
495 gods_angry(resp_god);
496 punish((struct obj *)0);
497 break;
498 } /* else fall thru */
499 case 4:
500 case 5: gods_angry(resp_god);
501 if (!Blind && !Antimagic)
502 pline("%s glow surrounds you.",
503 An(hcolor(Black)));
504 rndcurse();
505 break;
506 case 7:
507 case 8: godvoice(resp_god,(char *)0);
508 verbalize("Thou durst %s me?",
509 (on_altar() &&
510 (a_align(u.ux,u.uy) != resp_god)) ?
511 "scorn":"call upon");
512 pline("\"Then die, %s!\"",
513 youmonst.data->mlet == S_HUMAN ? "mortal" : "creature");
514 summon_minion(resp_god, FALSE);
515 break;
516
517 default: gods_angry(resp_god);
518 god_zaps_you(resp_god);
519 break;
520 }
521 u.ublesscnt = rnz(300);
522 return;
523 }
524
525 STATIC_OVL void
pleased(g_align)526 pleased(g_align)
527 aligntyp g_align;
528 {
529 int trouble = p_trouble; /* what's your worst difficulty? */
530 int pat_on_head = 0, kick_on_butt;
531
532 You_feel("that %s is %s.", align_gname(g_align),
533 u.ualign.record >= DEVOUT ?
534 Hallucination ? "pleased as punch" : "well-pleased" :
535 u.ualign.record >= STRIDENT ?
536 Hallucination ? "ticklish" : "pleased" :
537 Hallucination ? "full" : "satisfied");
538
539 /* not your deity */
540 if (on_altar() && p_aligntyp != u.ualign.type) {
541 adjalign(-1);
542 return;
543 } else if (u.ualign.record < 2 && trouble <= 0) adjalign(1);
544
545 /* depending on your luck & align level, the god you prayed to will:
546 - fix your worst problem if it's major.
547 - fix all your major problems.
548 - fix your worst problem if it's minor.
549 - fix all of your problems.
550 - do you a gratuitous favor.
551
552 if you make it to the the last category, you roll randomly again
553 to see what they do for you.
554
555 If your luck is at least 0, then you are guaranteed rescued
556 from your worst major problem. */
557
558 if (!trouble && u.ualign.record >= DEVOUT) pat_on_head = 1;
559 else {
560 int action = rn1(on_altar() ? 3 + on_shrine() : 2, Luck+1);
561
562 if (!on_altar()) action = max(action,2);
563 if (u.ualign.record < STRIDENT)
564 action = (u.ualign.record > 0 || !rnl(2)) ? 1 : 0;
565
566 switch(min(action,5)) {
567 case 5: pat_on_head = 1;
568 case 4: do fix_worst_trouble(trouble);
569 while ((trouble = in_trouble()) != 0);
570 break;
571
572 case 3: fix_worst_trouble(trouble);
573 case 2: while ((trouble = in_trouble()) > 0)
574 fix_worst_trouble(trouble);
575 break;
576
577 case 1: if (trouble > 0) fix_worst_trouble(trouble);
578 case 0: break; /* your god blows you off, too bad */
579 }
580 }
581
582 if(pat_on_head)
583 switch(rn2((Luck + 6)>>1)) {
584 case 0: break;
585 case 1:
586 if (uwep && (welded(uwep) || uwep->oclass == WEAPON_CLASS ||
587 is_weptool(uwep))) {
588 char repair_buf[BUFSZ];
589
590 *repair_buf = '\0';
591 if (uwep->oeroded || uwep->oeroded2)
592 Sprintf(repair_buf, " and %s now as good as new",
593 uwep->quan == 1L ? "is" : "are");
594
595 if (uwep->cursed) {
596 uncurse(uwep);
597 uwep->bknown = TRUE;
598 if (!Blind)
599 Your("%s %s%s.", aobjnam(uwep, "softly glow"),
600 hcolor(amber), repair_buf);
601 else You_feel("the power of %s over your %s.",
602 u_gname(), xname(uwep));
603 *repair_buf = '\0';
604 } else if (!uwep->blessed) {
605 bless(uwep);
606 uwep->bknown = TRUE;
607 if (!Blind)
608 Your("%s with %s aura%s.",
609 aobjnam(uwep, "softly glow"),
610 an(hcolor(light_blue)), repair_buf);
611 else You_feel("the blessing of %s over your %s.",
612 u_gname(), xname(uwep));
613 *repair_buf = '\0';
614 }
615
616 /* fix any rust/burn/rot damage, but don't protect
617 against future damage */
618 if (uwep->oeroded || uwep->oeroded2) {
619 uwep->oeroded = uwep->oeroded2 = 0;
620 /* only give this message if we didn't just bless
621 or uncurse (which has already given a message) */
622 if (*repair_buf)
623 Your("%s as good as new!",
624 aobjnam(uwep, Blind ? "feel" : "look"));
625 }
626 }
627 break;
628 case 3:
629 /* takes 2 hints to get the music to enter the stronghold */
630 if (flags.soundok && !u.uevent.uopened_dbridge) {
631 if(u.uevent.uheard_tune < 1) {
632 godvoice(g_align,(char *)0);
633 verbalize("Hark, %s!",
634 youmonst.data->mlet == S_HUMAN ? "mortal" : "creature");
635 verbalize(
636 "To enter the castle, thou must play the right tune!");
637 u.uevent.uheard_tune++;
638 break;
639 } else if (u.uevent.uheard_tune < 2) {
640 You_hear(Hallucination ? "a funeral march..." : "a divine music...");
641 pline("It sounds like: \"%s\".", tune);
642 u.uevent.uheard_tune++;
643 break;
644 }
645 }
646 /* Otherwise, falls into next case */
647 case 2:
648 if (!Blind)
649 You("are surrounded by %s glow.",
650 an(hcolor(golden)));
651 if (Upolyd) u.mh = u.mhmax += 5;
652 u.uhp = u.uhpmax += 5;
653 ABASE(A_STR) = AMAX(A_STR);
654 if (u.uhunger < 900) init_uhunger();
655 if (u.uluck < 0) u.uluck = 0;
656 make_blinded(0L,TRUE);
657 flags.botl = 1;
658 break;
659 case 4: {
660 register struct obj *otmp;
661
662 if (Blind)
663 You_feel("the power of %s.", u_gname());
664 else You("are surrounded by %s aura.",
665 an(hcolor(light_blue)));
666 for(otmp=invent; otmp; otmp=otmp->nobj) {
667 if (otmp->cursed) {
668 uncurse(otmp);
669 if (!Blind) {
670 Your("%s %s.", aobjnam(otmp, "softly glow"),
671 hcolor(amber));
672 otmp->bknown = TRUE;
673 }
674 }
675 }
676 break;
677 }
678 case 5: {
679 const char *msg="\"and thus I grant thee the gift of %s!\"";
680 godvoice(u.ualign.type, "Thou hast pleased me with thy progress,");
681 if (!(HTelepat & INTRINSIC)) {
682 HTelepat |= FROMOUTSIDE;
683 pline(msg, "Telepathy");
684 if (Blind) see_monsters();
685 } else if (!(HFast & INTRINSIC)) {
686 HFast |= FROMOUTSIDE;
687 pline(msg, "Speed");
688 } else if (!(HStealth & INTRINSIC)) {
689 HStealth |= FROMOUTSIDE;
690 pline(msg, "Stealth");
691 } else {
692 if (!(HProtection & INTRINSIC)) {
693 HProtection |= FROMOUTSIDE;
694 if (!u.ublessed) u.ublessed = rn1(3, 2);
695 } else u.ublessed++;
696 pline(msg, "my protection");
697 }
698 verbalize("Use it wisely in my name!");
699 break;
700 }
701 case 7:
702 case 8:
703 case 9: /* KMH -- can occur during full moons */
704 #ifdef ELBERETH
705 if (u.ualign.record >= PIOUS && !u.uevent.uhand_of_elbereth) {
706 register struct obj *obj = uwep; /* to be blessed */
707 boolean already_exists, in_hand;
708 const char *dropped_item;
709 int sp_no;
710
711 HSee_invisible |= FROMOUTSIDE;
712 HFire_resistance |= FROMOUTSIDE;
713 HCold_resistance |= FROMOUTSIDE;
714 HPoison_resistance |= FROMOUTSIDE;
715 godvoice(u.ualign.type,(char *)0);
716
717 switch(u.ualign.type) {
718 case A_LAWFUL:
719 u.uevent.uhand_of_elbereth = 1;
720 verbalize("I crown thee... The Hand of Elbereth!");
721 if (obj && (obj->otyp == LONG_SWORD) && !obj->oartifact) {
722 obj = oname(obj, artiname(ART_EXCALIBUR));
723 if (obj && obj->oartifact == ART_EXCALIBUR) u.ugifts++;
724 }
725 /* acquire this skill regardless of weapon */
726 unrestrict_weapon_skill(P_LONG_SWORD);
727 if (obj && obj->oartifact == ART_EXCALIBUR)
728 discover_artifact(ART_EXCALIBUR);
729 break;
730 case A_NEUTRAL:
731 u.uevent.uhand_of_elbereth = 2;
732 verbalize("Thou shalt be my Envoy of Balance!");
733 dropped_item = 0;
734 if (uwep && uwep->oartifact == ART_VORPAL_BLADE) {
735 obj = uwep; /* to be blessed and rustproofed */
736 Your("%s goes snicker-snack!", xname(obj));
737 obj->dknown = TRUE;
738 } else if (Role_if(PM_WIZARD) &&
739 !carrying(SPE_FINGER_OF_DEATH)) {
740 obj = mksobj(SPE_FINGER_OF_DEATH, TRUE, FALSE);
741 bless(obj);
742 dropped_item = "A spellbook appears";
743 } else if (!exist_artifact(LONG_SWORD,
744 artiname(ART_VORPAL_BLADE))) {
745 obj = mksobj(LONG_SWORD, FALSE, FALSE);
746 obj = oname(obj, artiname(ART_VORPAL_BLADE));
747 obj->spe = 1;
748 dropped_item = "A sword appears";
749 }
750 if (dropped_item) {
751 if (Blind) dropped_item = "Something lands";
752 pline("%s %s your %s!", dropped_item,
753 Levitation ? "beneath" : "at",
754 makeplural(body_part(FOOT)));
755 dropy(obj);
756 u.ugifts++;
757 }
758 /* acquire this skill regardless of weapon (or book) */
759 unrestrict_weapon_skill(P_LONG_SWORD);
760 if (obj && obj->oartifact == ART_VORPAL_BLADE)
761 discover_artifact(ART_VORPAL_BLADE);
762 /* when getting a new book for known spell, enhance
763 currently wielded weapon rather than the book */
764 if (obj && obj->otyp == SPE_FINGER_OF_DEATH) {
765 for (sp_no = 0; sp_no < MAXSPELL; sp_no++)
766 if (spl_book[sp_no].sp_id == SPE_FINGER_OF_DEATH) {
767 if (uwep) obj = uwep; /* to be blessed,&c */
768 break;
769 }
770 }
771 break;
772 case A_CHAOTIC:
773 u.uevent.uhand_of_elbereth = 3;
774 in_hand = (uwep && uwep->oartifact == ART_STORMBRINGER);
775 already_exists = exist_artifact(RUNESWORD,
776 artiname(ART_STORMBRINGER));
777 verbalize("Thou art chosen to %s for My Glory!",
778 already_exists && !in_hand ?
779 "take lives" : "steal souls");
780 if (in_hand) {
781 obj = uwep; /* to be blessed and rustproofed */
782 } else if (!already_exists) {
783 obj = mksobj(RUNESWORD, FALSE, FALSE);
784 obj = oname(obj, artiname(ART_STORMBRINGER));
785 pline("%s %s %s your %s!", Blind ? Something :
786 An(hcolor(Black)),
787 Blind ? "lands" : "sword appears",
788 Levitation ? "beneath" : "at",
789 makeplural(body_part(FOOT)));
790 obj->spe = 1;
791 dropy(obj);
792 u.ugifts++;
793 }
794 /* acquire this skill regardless of weapon */
795 unrestrict_weapon_skill(P_BROAD_SWORD);
796 if (obj && obj->oartifact == ART_STORMBRINGER)
797 discover_artifact(ART_STORMBRINGER);
798 break;
799 default:
800 obj = 0; /* lint */
801 break;
802 }
803 /* enhance weapon regardless of alignment or artifact status */
804 if (obj && (obj->oclass == WEAPON_CLASS || is_weptool(obj))) {
805 bless(obj);
806 obj->oeroded = obj->oeroded2 = 0;
807 obj->oerodeproof = TRUE;
808 obj->bknown = obj->rknown = TRUE;
809 if (obj->spe < 1) obj->spe = 1;
810 /* acquire skill in this weapon */
811 unrestrict_weapon_skill(weapon_type(obj));
812 } else if (obj && (obj->oclass == SPBOOK_CLASS)) {
813 obj->bknown = TRUE;
814 } else /* opportunity knocked, but there was nobody home... */
815 You_feel("unworthy.");
816 break;
817 }
818 #endif /*ELBERETH*/
819
820 case 6: {
821 struct obj *otmp;
822 int sp_no, trycnt = u.ulevel + 1;
823
824 pline("An object appears at your %s!",
825 makeplural(body_part(FOOT)));
826 /* not yet known spells given preference over already known ones */
827 otmp = mkobj(SPBOOK_CLASS, TRUE);
828 while (--trycnt > 0) {
829 if (otmp->otyp != SPE_BLANK_PAPER) {
830 for (sp_no = 0; sp_no < MAXSPELL; sp_no++)
831 if (spl_book[sp_no].sp_id == otmp->otyp) break;
832 if (sp_no == MAXSPELL) break; /* not yet known */
833 } else {
834 if (!objects[SPE_BLANK_PAPER].oc_name_known ||
835 carrying(MAGIC_MARKER)) break;
836 }
837 otmp->otyp = rnd_class(bases[SPBOOK_CLASS], SPE_BLANK_PAPER);
838 }
839 bless(otmp);
840 place_object(otmp, u.ux, u.uy);
841 break;
842 }
843 default: impossible("Confused deity!");
844 break;
845 }
846
847 u.ublesscnt = rnz(350);
848 kick_on_butt = u.uevent.udemigod ? 1 : 0;
849 #ifdef ELBERETH
850 if (u.uevent.uhand_of_elbereth) kick_on_butt++;
851 #endif
852 if (kick_on_butt) u.ublesscnt += kick_on_butt * rnz(1000);
853
854 return;
855 }
856
857 /* either blesses or curses water on the altar,
858 * returns true if it found any water here.
859 */
860 STATIC_OVL boolean
water_prayer(bless_water)861 water_prayer(bless_water)
862 boolean bless_water;
863 {
864 register struct obj* otmp;
865 register long changed = 0;
866 boolean other = FALSE, bc_known = !(Blind || Hallucination);
867
868 for(otmp = level.objects[u.ux][u.uy]; otmp; otmp = otmp->nexthere) {
869 /* turn water into (un)holy water */
870 if (otmp->otyp == POT_WATER && (boolean)otmp->blessed != bless_water) {
871 otmp->blessed = bless_water;
872 otmp->cursed = !bless_water;
873 otmp->bknown = bc_known;
874 changed += otmp->quan;
875 } else if(otmp->oclass == POTION_CLASS)
876 other = TRUE;
877 }
878 if(!Blind && changed) {
879 pline("%s potion%s on the altar glow%s %s for a moment.",
880 ((other && changed > 1L) ? "Some of the" :
881 (other ? "One of the" : "The")),
882 ((other || changed > 1L) ? "s" : ""), (changed > 1L ? "" : "s"),
883 (bless_water ? hcolor(light_blue) : hcolor(Black)));
884 }
885 return((boolean)(changed > 0L));
886 }
887
888 STATIC_OVL void
godvoice(g_align,words)889 godvoice(g_align, words)
890 aligntyp g_align;
891 const char *words;
892 {
893 const char *quot = "";
894 if(words)
895 quot = "\"";
896 else
897 words = "";
898
899 pline_The("voice of %s %s: %s%s%s", align_gname(g_align),
900 godvoices[rn2(SIZE(godvoices))], quot, words, quot);
901 }
902
903 STATIC_OVL void
gods_angry(g_align)904 gods_angry(g_align)
905 aligntyp g_align;
906 {
907 godvoice(g_align, "Thou hast angered me.");
908 }
909
910 /* The g_align god is upset with you. */
911 STATIC_OVL void
gods_upset(g_align)912 gods_upset(g_align)
913 aligntyp g_align;
914 {
915 if(g_align == u.ualign.type) u.ugangr++;
916 else if(u.ugangr) u.ugangr--;
917 angrygods(g_align);
918 }
919
920 static NEARDATA const char sacrifice_types[] = { FOOD_CLASS, AMULET_CLASS, 0 };
921
922 STATIC_OVL void
consume_offering(otmp)923 consume_offering(otmp)
924 register struct obj *otmp;
925 {
926 if (Hallucination)
927 switch (rn2(3)) {
928 case 0:
929 Your("sacrifice sprouts wings and a propeller and roars away!");
930 break;
931 case 1:
932 Your("sacrifice puffs up, swelling bigger and bigger, and pops!");
933 break;
934 case 2:
935 Your("sacrifice collapses into a cloud of dancing particles and fades away!");
936 break;
937 }
938 else if (Blind && u.ualign.type == A_LAWFUL)
939 Your("sacrifice disappears!");
940 else Your("sacrifice is consumed in a %s!",
941 u.ualign.type == A_LAWFUL ? "flash of light" : "burst of flame");
942 if (carried(otmp)) useup(otmp);
943 else useupf(otmp, 1L);
944 exercise(A_WIS, TRUE);
945 }
946
947 int
dosacrifice()948 dosacrifice()
949 {
950 register struct obj *otmp;
951 int value = 0;
952 int pm;
953 aligntyp altaralign = a_align(u.ux,u.uy);
954
955 if (!on_altar()) {
956 You("are not standing on an altar.");
957 return 0;
958 }
959
960 if (In_endgame(&u.uz)) {
961 if (!(otmp = getobj(sacrifice_types, "sacrifice"))) return 0;
962 } else {
963 if (!(otmp = floorfood("sacrifice", 1))) return 0;
964 }
965 /*
966 Was based on nutritional value and aging behavior (< 50 moves).
967 Sacrificing a food ration got you max luck instantly, making the
968 gods as easy to please as an angry dog!
969
970 Now only accepts corpses, based on the game's evaluation of their
971 toughness. Human and pet sacrifice, as well as sacrificing unicorns
972 of your alignment, is strongly discouraged.
973 */
974
975 #define MAXVALUE 24 /* Highest corpse value (besides Wiz) */
976
977 if (otmp->otyp == CORPSE) {
978 register struct permonst *ptr = &mons[otmp->corpsenm];
979 struct monst *mtmp;
980 extern const int monstr[];
981
982 /* KMH, conduct */
983 u.uconduct.gnostic++;
984
985 /* you're handling this corpse, even if it was killed upon the altar */
986 feel_cockatrice(otmp, TRUE);
987
988 if (otmp->corpsenm == PM_ACID_BLOB
989 || (monstermoves <= peek_at_iced_corpse_age(otmp) + 50)) {
990 value = monstr[otmp->corpsenm] + 1;
991 if (otmp->oeaten)
992 value = eaten_stat(value, otmp);
993 }
994
995 if (your_race(ptr)) {
996 if (is_demon(youmonst.data)) {
997 You("find the idea very satisfying.");
998 exercise(A_WIS, TRUE);
999 } else if (u.ualign.type != A_CHAOTIC) {
1000 pline("You'll regret this infamous offense!");
1001 exercise(A_WIS, FALSE);
1002 }
1003
1004 if (altaralign != A_CHAOTIC && altaralign != A_NONE) {
1005 /* curse the lawful/neutral altar */
1006 pline_The("altar is stained with %s blood.", urace.adj);
1007 if(!Is_astralevel(&u.uz))
1008 levl[u.ux][u.uy].altarmask = AM_CHAOTIC;
1009 angry_priest();
1010 } else {
1011 struct monst *dmon;
1012 const char *demonless_msg;
1013
1014 /* Human sacrifice on a chaotic or unaligned altar */
1015 /* is equivalent to demon summoning */
1016 if (altaralign == A_CHAOTIC && u.ualign.type != A_CHAOTIC) {
1017 pline(
1018 "The blood floods the altar, which vanishes in %s cloud!",
1019 an(hcolor(Black)));
1020 levl[u.ux][u.uy].typ = ROOM;
1021 levl[u.ux][u.uy].altarmask = 0;
1022 if(Invisible) newsym(u.ux, u.uy);
1023 angry_priest();
1024 demonless_msg = "cloud dissipates";
1025 } else {
1026 /* either you're chaotic or altar is Moloch's or both */
1027 pline_The("blood covers the altar!");
1028 change_luck(altaralign == A_NONE ? -2 : 2);
1029 demonless_msg = "blood coagulates";
1030 }
1031 if ((pm = dlord(altaralign)) != NON_PM &&
1032 (dmon = makemon(&mons[pm], u.ux, u.uy, NO_MM_FLAGS))) {
1033 You("have summoned %s!", a_monnam(dmon));
1034 if (sgn(u.ualign.type) == sgn(dmon->data->maligntyp))
1035 dmon->mpeaceful = TRUE;
1036 You("are terrified, and unable to move.");
1037 nomul(-3);
1038 } else pline_The("%s.", demonless_msg);
1039 }
1040
1041 if (u.ualign.type != A_CHAOTIC) {
1042 adjalign(-5);
1043 u.ugangr += 3;
1044 (void) adjattrib(A_WIS, -1, TRUE);
1045 if (!Inhell) angrygods(u.ualign.type);
1046 change_luck(-5);
1047 } else adjalign(5);
1048 if (carried(otmp)) useup(otmp);
1049 else useupf(otmp, 1L);
1050 return(1);
1051 } else if (otmp->oxlth && otmp->oattached == OATTACHED_MONST
1052 && ((mtmp = get_mtraits(otmp, FALSE)) != (struct monst *)0)
1053 && mtmp->mtame) {
1054 /* mtmp is a temporary pointer to a tame monster's attributes,
1055 * not a real monster */
1056 pline("So this is how you repay loyalty?");
1057 adjalign(-3);
1058 value = -1;
1059 HAggravate_monster |= FROMOUTSIDE;
1060 } else if (is_undead(ptr)) { /* Not demons--no demon corpses */
1061 if (u.ualign.type != A_CHAOTIC)
1062 value += 1;
1063 } else if (is_unicorn(ptr)) {
1064 int unicalign = sgn(ptr->maligntyp);
1065
1066 /* If same as altar, always a very bad action. */
1067 if (unicalign == altaralign) {
1068 pline("Such an action is an insult to %s!",
1069 (unicalign == A_CHAOTIC)
1070 ? "chaos" : unicalign ? "law" : "balance");
1071 (void) adjattrib(A_WIS, -1, TRUE);
1072 value = -5;
1073 } else if (u.ualign.type == altaralign) {
1074 /* If different from altar, and altar is same as yours, */
1075 /* it's a very good action */
1076 if (u.ualign.record < ALIGNLIM)
1077 You_feel("appropriately %s.", align_str(u.ualign.type));
1078 else You_feel("you are thoroughly on the right path.");
1079 adjalign(5);
1080 value += 3;
1081 } else
1082 /* If sacrificing unicorn of your alignment to altar not of */
1083 /* your alignment, your god gets angry and it's a conversion */
1084 if (unicalign == u.ualign.type) {
1085 u.ualign.record = -1;
1086 value = 1;
1087 } else value += 3;
1088 }
1089 } /* corpse */
1090
1091 if (otmp->otyp == AMULET_OF_YENDOR) {
1092 if (!In_endgame(&u.uz)) {
1093 if (Hallucination)
1094 You_feel("homesick.");
1095 else
1096 You_feel("an urge to return to the surface.");
1097 return 1;
1098 } else {
1099 /* The final Test. Did you win? */
1100 if(uamul == otmp) Amulet_off();
1101 u.uevent.ascended = 1;
1102 if(carried(otmp)) useup(otmp); /* well, it's gone now */
1103 else useupf(otmp, 1L);
1104 You("offer the Amulet of Yendor to %s...", a_gname());
1105 if (u.ualign.type != altaralign) {
1106 /* And the opposing team picks you up and
1107 carries you off on their shoulders */
1108 adjalign(-99);
1109 pline("%s accepts your gift, and gains dominion over %s...",
1110 a_gname(), u_gname());
1111 pline("%s is enraged...", u_gname());
1112 pline("Fortunately, %s permits you to live...", a_gname());
1113 pline("A cloud of %s smoke surrounds you...",
1114 hcolor((const char *)"orange"));
1115 done(ESCAPED);
1116 } else { /* super big win */
1117 adjalign(10);
1118 pline("An invisible choir sings, and you are bathed in radiance...");
1119 godvoice(altaralign, "Congratulations, mortal!");
1120 display_nhwindow(WIN_MESSAGE, FALSE);
1121 verbalize("In return for thy service, I grant thee the gift of Immortality!");
1122 You("ascend to the status of Demigod%s...",
1123 flags.female ? "dess" : "");
1124 done(ASCENDED);
1125 }
1126 }
1127 } /* real Amulet */
1128
1129 if (otmp->otyp == FAKE_AMULET_OF_YENDOR) {
1130 if (flags.soundok)
1131 You_hear("a nearby thunderclap.");
1132 if (!otmp->known) {
1133 You("realize you have made a %s.",
1134 Hallucination ? "boo-boo" : "mistake");
1135 otmp->known = TRUE;
1136 change_luck(-1);
1137 return 1;
1138 } else {
1139 /* don't you dare try to fool the gods */
1140 change_luck(-3);
1141 adjalign(-1);
1142 u.ugangr += 3;
1143 value = -3;
1144 }
1145 } /* fake Amulet */
1146
1147 if (value == 0) {
1148 pline(nothing_happens);
1149 return (1);
1150 }
1151
1152 if (altaralign != u.ualign.type &&
1153 (Is_astralevel(&u.uz) || Is_sanctum(&u.uz))) {
1154 /*
1155 * REAL BAD NEWS!!! High altars cannot be converted. Even an attempt
1156 * gets the god who owns it truely pissed off.
1157 */
1158 You_feel("the air around you grow charged...");
1159 pline("Suddenly, you realize that %s has noticed you...", a_gname());
1160 godvoice(altaralign, "So, mortal! You dare desecrate my High Temple!");
1161 /* Throw everything we have at the player */
1162 god_zaps_you(altaralign);
1163 } else if (value < 0) { /* I don't think the gods are gonna like this... */
1164 gods_upset(altaralign);
1165 } else {
1166 int saved_anger = u.ugangr;
1167 int saved_cnt = u.ublesscnt;
1168 int saved_luck = u.uluck;
1169
1170 /* Sacrificing at an altar of a different alignment */
1171 if (u.ualign.type != altaralign) {
1172 /* Is this a conversion ? */
1173 /* An unaligned altar in Gehennom will always elicit rejection. */
1174 if (ugod_is_angry() || (altaralign == A_NONE && Inhell)) {
1175 if(u.ualignbase[A_CURRENT] == u.ualignbase[A_ORIGINAL] &&
1176 altaralign != A_NONE) {
1177 You("have a strong feeling that %s is angry...", u_gname());
1178 consume_offering(otmp);
1179 pline("%s accepts your allegiance.", a_gname());
1180
1181 /* The player wears a helm of opposite alignment? */
1182 if (uarmh && uarmh->otyp == HELM_OF_OPPOSITE_ALIGNMENT)
1183 u.ualignbase[A_CURRENT] = altaralign;
1184 else
1185 u.ualign.type = u.ualignbase[A_CURRENT] = altaralign;
1186 u.ublessed = 0;
1187 flags.botl = 1;
1188
1189 You("have a sudden sense of a new direction.");
1190 /* Beware, Conversion is costly */
1191 change_luck(-3);
1192 u.ublesscnt += 300;
1193 adjalign((int)(u.ualignbase[A_ORIGINAL] * (ALIGNLIM / 2)));
1194 } else {
1195 u.ugangr += 3;
1196 adjalign(-5);
1197 pline("%s rejects your sacrifice!", a_gname());
1198 godvoice(altaralign, "Suffer, infidel!");
1199 change_luck(-5);
1200 (void) adjattrib(A_WIS, -2, TRUE);
1201 if (!Inhell) angrygods(u.ualign.type);
1202 }
1203 return(1);
1204 } else {
1205 consume_offering(otmp);
1206 You("sense a conflict between %s and %s.",
1207 u_gname(), a_gname());
1208 if (rn2(8 + u.ulevel) > 5) {
1209 struct monst *pri;
1210 You_feel("the power of %s increase.", u_gname());
1211 exercise(A_WIS, TRUE);
1212 change_luck(1);
1213 /* Yes, this is supposed to be &=, not |= */
1214 levl[u.ux][u.uy].altarmask &= AM_SHRINE;
1215 /* the following accommodates stupid compilers */
1216 levl[u.ux][u.uy].altarmask =
1217 levl[u.ux][u.uy].altarmask | (Align2amask(u.ualign.type));
1218 if (!Blind)
1219 pline_The("altar glows %s.",
1220 hcolor(
1221 u.ualign.type == A_LAWFUL ? White :
1222 u.ualign.type ? Black : (const char *)"gray"));
1223
1224 if (rnl(u.ulevel) > 6 && u.ualign.record > 0 &&
1225 rnd(u.ualign.record) > (3*ALIGNLIM)/4)
1226 summon_minion(altaralign, TRUE);
1227 /* anger priest; test handles bones files */
1228 if((pri = findpriest(temple_occupied(u.urooms))) &&
1229 !p_coaligned(pri))
1230 angry_priest();
1231 } else {
1232 pline("Unluckily, you feel the power of %s decrease.",
1233 u_gname());
1234 change_luck(-1);
1235 exercise(A_WIS, FALSE);
1236 if (rnl(u.ulevel) > 6 && u.ualign.record > 0 &&
1237 rnd(u.ualign.record) > (7*ALIGNLIM)/8)
1238 summon_minion(altaralign, TRUE);
1239 }
1240 return(1);
1241 }
1242 }
1243
1244 consume_offering(otmp);
1245 /* OK, you get brownie points. */
1246 if(u.ugangr) {
1247 u.ugangr -=
1248 ((value * (u.ualign.type == A_CHAOTIC ? 2 : 3)) / MAXVALUE);
1249 if(u.ugangr < 0) u.ugangr = 0;
1250 if(u.ugangr != saved_anger) {
1251 if (u.ugangr) {
1252 pline("%s seems %s.", u_gname(),
1253 Hallucination ? "groovy" : "slightly mollified");
1254
1255 if ((int)u.uluck < 0) change_luck(1);
1256 } else {
1257 pline("%s seems %s.", u_gname(), Hallucination ?
1258 "cosmic (not a new fact)" : "mollified");
1259
1260 if ((int)u.uluck < 0) u.uluck = 0;
1261 }
1262 } else { /* not satisfied yet */
1263 if (Hallucination)
1264 pline_The("gods seem tall.");
1265 else You("have a feeling of inadequacy.");
1266 }
1267 } else if(ugod_is_angry()) {
1268 if(value > MAXVALUE) value = MAXVALUE;
1269 if(value > -u.ualign.record) value = -u.ualign.record;
1270 adjalign(value);
1271 You_feel("partially absolved.");
1272 } else if (u.ublesscnt > 0) {
1273 u.ublesscnt -=
1274 ((value * (u.ualign.type == A_CHAOTIC ? 500 : 300)) / MAXVALUE);
1275 if(u.ublesscnt < 0) u.ublesscnt = 0;
1276 if(u.ublesscnt != saved_cnt) {
1277 if (u.ublesscnt) {
1278 if (Hallucination)
1279 You("realize that the gods are not like you and I.");
1280 else
1281 You("have a hopeful feeling.");
1282 if ((int)u.uluck < 0) change_luck(1);
1283 } else {
1284 if (Hallucination)
1285 pline("Overall, there is a smell of fried onions.");
1286 else
1287 You("have a feeling of reconciliation.");
1288 if ((int)u.uluck < 0) u.uluck = 0;
1289 }
1290 }
1291 } else {
1292 int nartifacts = nartifact_exist();
1293
1294 /* you were already in pretty good standing */
1295 /* The player can gain an artifact */
1296 /* The chance goes down as the number of artifacts goes up */
1297 if (u.ulevel > 2 && !rn2(10 + (2 * u.ugifts * nartifacts))) {
1298 otmp = mk_artifact((struct obj *)0, a_align(u.ux,u.uy));
1299 if (otmp) {
1300 if (otmp->spe < 0) otmp->spe = 0;
1301 if (otmp->cursed) uncurse(otmp);
1302 dropy(otmp);
1303 pline("An object appears at your %s!",
1304 makeplural(body_part(FOOT)));
1305 godvoice(u.ualign.type, "Use my gift wisely!");
1306 u.ugifts++;
1307 u.ublesscnt = rnz(300 + (50 * nartifacts));
1308 exercise(A_WIS, TRUE);
1309 /* make sure we can use this weapon */
1310 unrestrict_weapon_skill(weapon_type(otmp));
1311 discover_artifact(otmp->oartifact);
1312 return(1);
1313 }
1314 }
1315 change_luck((value * LUCKMAX) / (MAXVALUE * 2));
1316 if (u.uluck != saved_luck) {
1317 if (Blind)
1318 You("think %s brushed your %s.",something, body_part(FOOT));
1319 else You(Hallucination ?
1320 "see crabgrass at your %s. A funny thing in a dungeon." :
1321 "glimpse a four-leaf clover at your %s.",
1322 makeplural(body_part(FOOT)));
1323 }
1324 }
1325 }
1326 return(1);
1327 }
1328
1329
1330 /* determine prayer results in advance; also used for enlightenment */
1331 boolean
can_pray(praying)1332 can_pray(praying)
1333 boolean praying; /* false means no messages should be given */
1334 {
1335 int alignment;
1336
1337 p_aligntyp = on_altar() ? a_align(u.ux,u.uy) : u.ualign.type;
1338 p_trouble = in_trouble();
1339
1340 if (is_demon(youmonst.data) && (p_aligntyp != A_CHAOTIC)) {
1341 if (praying)
1342 pline_The("very idea of praying to a %s god is repugnant to you.",
1343 p_aligntyp ? "lawful" : "neutral");
1344 return FALSE;
1345 }
1346
1347 if (praying)
1348 You("begin praying to %s.", align_gname(p_aligntyp));
1349
1350 if (u.ualign.type && u.ualign.type == -p_aligntyp)
1351 alignment = -u.ualign.record; /* Opposite alignment altar */
1352 else if (u.ualign.type != p_aligntyp)
1353 alignment = u.ualign.record / 2; /* Different alignment altar */
1354 else alignment = u.ualign.record;
1355
1356 if ((p_trouble > 0) ? (u.ublesscnt > 200) : /* big trouble */
1357 (p_trouble < 0) ? (u.ublesscnt > 100) : /* minor difficulties */
1358 (u.ublesscnt > 0)) /* not in trouble */
1359 p_type = 0; /* too soon... */
1360 else if ((int)Luck < 0 || u.ugangr || alignment < 0)
1361 p_type = 1; /* too naughty... */
1362 else /* alignment >= 0 */ {
1363 if(on_altar() && u.ualign.type != p_aligntyp)
1364 p_type = 2;
1365 else
1366 p_type = 3;
1367 }
1368
1369 if (is_undead(youmonst.data) && !Inhell &&
1370 (p_aligntyp == A_LAWFUL || (p_aligntyp == A_NEUTRAL && !rn2(10))))
1371 p_type = -1;
1372 /* Note: when !praying, the random factor for neutrals makes the
1373 return value a non-deterministic approximation for enlightenment.
1374 This case should be uncommon enough to live with... */
1375
1376 return !praying ? (boolean)(p_type == 3 && !Inhell) : TRUE;
1377 }
1378
1379 int
dopray()1380 dopray()
1381 {
1382 /* Confirm accidental slips of Alt-P */
1383 if (flags.prayconfirm)
1384 if (yn("Are you sure you want to pray?") == 'n')
1385 return (0);
1386 u.uconduct.gnostic++;
1387
1388 /* set up p_type and p_alignment */
1389 if (!can_pray(TRUE)) return 0;
1390
1391 #ifdef WIZARD
1392 if (wizard && p_type >= 0) {
1393 if (yn("Force the gods to be pleased?") == 'y') {
1394 u.ublesscnt = 0;
1395 if (u.uluck < 0) u.uluck = 0;
1396 if (u.ualign.record <= 0) u.ualign.record = 1;
1397 u.ugangr = 0;
1398 if(p_type < 2) p_type = 3;
1399 }
1400 }
1401 #endif
1402 nomul(-3);
1403 nomovemsg = "You finish your prayer.";
1404 afternmv = prayer_done;
1405
1406 if(p_type == 3 && !Inhell) {
1407 /* if you've been true to your god you can't die while you pray */
1408 if (!Blind)
1409 You("are surrounded by a shimmering light.");
1410 u.uinvulnerable = TRUE;
1411 }
1412
1413 return(1);
1414 }
1415
1416 STATIC_PTR int
prayer_done()1417 prayer_done() /* M. Stephenson (1.0.3b) */
1418 {
1419 aligntyp alignment = p_aligntyp;
1420
1421 u.uinvulnerable = FALSE;
1422 if(p_type == -1) {
1423 godvoice(alignment,
1424 alignment == A_LAWFUL ?
1425 "Vile creature, thou durst call upon me?" :
1426 "Walk no more, perversion of nature!");
1427 You_feel("like you are falling apart.");
1428 /* KMH -- Gods have mastery over unchanging */
1429 rehumanize();
1430 losehp(rnd(20), "residual undead turning effect", KILLED_BY_AN);
1431 exercise(A_CON, FALSE);
1432 return(1);
1433 }
1434 if (Inhell) {
1435 pline("Since you are in Gehennom, %s won't help you.",
1436 align_gname(alignment));
1437 /* haltingly aligned is least likely to anger */
1438 if (u.ualign.record <= 0 || rnl(u.ualign.record))
1439 angrygods(u.ualign.type);
1440 return(0);
1441 }
1442
1443 if (p_type == 0) {
1444 if(on_altar() && u.ualign.type != alignment)
1445 (void) water_prayer(FALSE);
1446 u.ublesscnt += rnz(250);
1447 change_luck(-3);
1448 gods_upset(u.ualign.type);
1449 } else if(p_type == 1) {
1450 if(on_altar() && u.ualign.type != alignment)
1451 (void) water_prayer(FALSE);
1452 angrygods(u.ualign.type); /* naughty */
1453 } else if(p_type == 2) {
1454 if(water_prayer(FALSE)) {
1455 /* attempted water prayer on a non-coaligned altar */
1456 u.ublesscnt += rnz(250);
1457 change_luck(-3);
1458 gods_upset(u.ualign.type);
1459 } else pleased(alignment);
1460 } else {
1461 /* coaligned */
1462 if(on_altar())
1463 (void) water_prayer(TRUE);
1464 pleased(alignment); /* nice */
1465 }
1466 return(1);
1467 }
1468
1469 int
doturn()1470 doturn()
1471 { /* Knights & Priest(esse)s only please */
1472
1473 struct monst *mtmp, *mtmp2;
1474 int once, range, xlev;
1475
1476 if (!Role_if(PM_PRIEST) && !Role_if(PM_KNIGHT)) {
1477 /* Try to use turn undead spell. */
1478 if (objects[SPE_TURN_UNDEAD].oc_name_known) {
1479 register int sp_no;
1480 for (sp_no = 0; sp_no < MAXSPELL &&
1481 spl_book[sp_no].sp_id != NO_SPELL &&
1482 spl_book[sp_no].sp_id != SPE_TURN_UNDEAD; sp_no++);
1483
1484 if (sp_no < MAXSPELL &&
1485 spl_book[sp_no].sp_id == SPE_TURN_UNDEAD)
1486 return spelleffects(sp_no, TRUE);
1487 }
1488
1489 You("don't know how to turn undead!");
1490 return(0);
1491 }
1492 if ((u.ualign.type != A_CHAOTIC &&
1493 (is_demon(youmonst.data) || is_undead(youmonst.data))) ||
1494 u.ugangr > 6 /* "Die, mortal!" */) {
1495
1496 pline("For some reason, %s seems to ignore you.", u_gname());
1497 aggravate();
1498 exercise(A_WIS, FALSE);
1499 return(0);
1500 }
1501
1502 if (Inhell) {
1503 pline("Since you are in Gehennom, %s won't help you.", u_gname());
1504 aggravate();
1505 return(0);
1506 }
1507 pline("Calling upon %s, you chant an arcane formula.", u_gname());
1508 exercise(A_WIS, TRUE);
1509 u.uconduct.gnostic++;
1510
1511 /* note: does not perform unturn_dead() on victims' inventories */
1512 range = BOLT_LIM + (u.ulevel / 5); /* 5 to 11 */
1513 range *= range;
1514 once = 0;
1515 for(mtmp = fmon; mtmp; mtmp = mtmp2) {
1516 mtmp2 = mtmp->nmon;
1517
1518 if (DEADMONSTER(mtmp)) continue;
1519 if (!cansee(mtmp->mx,mtmp->my) ||
1520 distu(mtmp->mx,mtmp->my) > range) continue;
1521
1522 if (!mtmp->mpeaceful && (is_undead(mtmp->data) ||
1523 (is_demon(mtmp->data) && (u.ulevel > (MAXULEV/2))))) {
1524
1525 mtmp->msleeping = 0;
1526 if (Confusion) {
1527 if (!once++)
1528 pline("Unfortunately, your voice falters.");
1529 mtmp->mflee = 0;
1530 mtmp->mfrozen = 0;
1531 mtmp->mcanmove = 1;
1532 } else if (!resist(mtmp, '\0', 0, TELL)) {
1533 xlev = 6;
1534 switch (mtmp->data->mlet) {
1535 /* this is intentional, lichs are tougher
1536 than zombies. */
1537 case S_LICH: xlev += 2;
1538 case S_GHOST: xlev += 2;
1539 case S_VAMPIRE: xlev += 2;
1540 case S_WRAITH: xlev += 2;
1541 case S_MUMMY: xlev += 2;
1542 case S_ZOMBIE:
1543 mtmp->mflee = 1; /* at least */
1544 if(u.ulevel >= xlev &&
1545 !resist(mtmp, '\0', 0, NOTELL)) {
1546 if(u.ualign.type == A_CHAOTIC) {
1547 mtmp->mpeaceful = 1;
1548 } else { /* damn them */
1549 killed(mtmp);
1550 }
1551 }
1552 break;
1553 default: mtmp->mflee = 1;
1554 break;
1555 }
1556 }
1557 }
1558 }
1559 nomul(-5);
1560 return(1);
1561 }
1562
1563 const char *
a_gname()1564 a_gname()
1565 {
1566 return(a_gname_at(u.ux, u.uy));
1567 }
1568
1569 const char *
a_gname_at(x,y)1570 a_gname_at(x,y) /* returns the name of an altar's deity */
1571 xchar x, y;
1572 {
1573 if(!IS_ALTAR(levl[x][y].typ)) return((char *)0);
1574
1575 return align_gname(a_align(x,y));
1576 }
1577
1578 const char *
u_gname()1579 u_gname() /* returns the name of the player's deity */
1580 {
1581 return align_gname(u.ualign.type);
1582 }
1583
1584 const char *
align_gname(alignment)1585 align_gname(alignment)
1586 aligntyp alignment;
1587 {
1588 const char *gnam;
1589
1590 switch (alignment) {
1591 case A_NONE: gnam = Moloch; break;
1592 case A_LAWFUL: gnam = urole.lgod; break;
1593 case A_NEUTRAL: gnam = urole.ngod; break;
1594 case A_CHAOTIC: gnam = urole.cgod; break;
1595 default: impossible("unknown alignment.");
1596 gnam = "someone"; break;
1597 }
1598 if (*gnam == '_') ++gnam;
1599 return gnam;
1600 }
1601
1602 /* hallucination handling for priest/minion names: select a random god
1603 iff character is hallucinating */
1604 const char *
halu_gname(alignment)1605 halu_gname(alignment)
1606 aligntyp alignment;
1607 {
1608 const char *gnam;
1609 int which;
1610
1611 if (!Hallucination) return align_gname(alignment);
1612
1613 which = randrole();
1614 switch (rn2(3)) {
1615 case 0: gnam = roles[which].lgod; break;
1616 case 1: gnam = roles[which].ngod; break;
1617 case 2: gnam = roles[which].cgod; break;
1618 default: gnam = 0; break; /* lint suppression */
1619 }
1620 if (!gnam) gnam = Moloch;
1621 if (*gnam == '_') ++gnam;
1622 return gnam;
1623 }
1624
1625 /* deity's title */
1626 const char *
align_gtitle(alignment)1627 align_gtitle(alignment)
1628 aligntyp alignment;
1629 {
1630 const char *gnam, *result = "god";
1631
1632 switch (alignment) {
1633 case A_LAWFUL: gnam = urole.lgod; break;
1634 case A_NEUTRAL: gnam = urole.ngod; break;
1635 case A_CHAOTIC: gnam = urole.cgod; break;
1636 default: gnam = 0; break;
1637 }
1638 if (gnam && *gnam == '_') result = "goddess";
1639 return result;
1640 }
1641
1642 void
altar_wrath(x,y)1643 altar_wrath(x, y)
1644 register int x, y;
1645 {
1646 aligntyp altaralign = a_align(x,y);
1647
1648 if(!strcmp(align_gname(altaralign), u_gname())) {
1649 godvoice(altaralign, "How darest thou desecrate my altar!");
1650 (void) adjattrib(A_WIS, -1, FALSE);
1651 } else {
1652 pline("A voice (could it be %s?) whispers:",
1653 align_gname(altaralign));
1654 verbalize("Thou shalt pay, infidel!");
1655 change_luck(-1);
1656 }
1657 }
1658
1659 /* assumes isok() at one space away, but not necessarily at two */
1660 STATIC_OVL boolean
blocked_boulder(dx,dy)1661 blocked_boulder(dx,dy)
1662 int dx,dy;
1663 {
1664 register struct obj *otmp;
1665 long count = 0L;
1666
1667 for(otmp = level.objects[u.ux+dx][u.uy+dy]; otmp; otmp = otmp->nexthere) {
1668 if(otmp->otyp == BOULDER)
1669 count += otmp->quan;
1670 }
1671
1672 switch(count) {
1673 case 0: return FALSE; /* no boulders--not blocked */
1674 case 1: break; /* possibly blocked depending on if it's pushable */
1675 default: return TRUE; /* >1 boulder--blocked after they push the top
1676 one; don't force them to push it first to find out */
1677 }
1678
1679 if (!isok(u.ux+2*dx, u.uy+2*dy))
1680 return TRUE;
1681 if (IS_ROCK(levl[u.ux+2*dx][u.uy+2*dy].typ))
1682 return TRUE;
1683 if (sobj_at(BOULDER, u.ux+2*dx, u.uy+2*dy))
1684 return TRUE;
1685
1686 return FALSE;
1687 }
1688
1689 /*pray.c*/
1690