1 /* NetHack 3.6 priest.c $NHDT-Date: 1446892452 2015/11/07 10:34:12 $ $NHDT-Branch: master $:$NHDT-Revision: 1.41 $ */
2 /* Copyright (c) Izchak Miller, Steve Linhart, 1989. */
3 /* NetHack may be freely redistributed. See license for details. */
5 /* JNetHack Copyright */
6 /* (c) Issei Numata, Naoki Hamada, Shigehiro Miyashita, 1994-2000 */
7 /* For 3.4-, Copyright (c) SHIRAKATA Kentaro, 2002-2016 */
8 /* JNetHack may be freely redistributed. See license for details. */
13 /* these match the categorizations shown by enlightenment */
14 #define ALGN_SINNED (-4) /* worse than strayed (-1..-3) */
15 #define ALGN_PIOUS 14 /* better than fervent (9..13) */
17 STATIC_DCL boolean FDECL(histemple_at, (struct monst *, XCHAR_P, XCHAR_P));
18 STATIC_DCL boolean FDECL(has_shrine, (struct monst *));
25 mtmp->mextra = newmextra();
27 EPRI(mtmp) = (struct epri *) alloc(sizeof(struct epri));
28 (void) memset((genericptr_t) EPRI(mtmp), 0, sizeof(struct epri));
36 if (mtmp->mextra && EPRI(mtmp)) {
37 free((genericptr_t) EPRI(mtmp));
38 EPRI(mtmp) = (struct epri *) 0;
44 * Move for priests and shopkeepers. Called from shk_move() and pri_move().
45 * Valid returns are 1: moved 0: didn't -1: let m_move do it -2: died.
48 move_special(mtmp, in_his_shop, appr, uondoor, avoid, omx, omy, gx, gy)
49 register struct monst *mtmp;
52 boolean uondoor, avoid;
53 register xchar omx, omy, gx, gy;
55 register xchar nx, ny, nix, niy;
61 struct obj *ib = (struct obj *) 0;
63 if (omx == gx && omy == gy)
73 allowflags = ALLOW_SSM;
75 allowflags = ALLOW_SSM | ALLOW_SANCT;
76 if (passes_walls(mtmp->data))
77 allowflags |= (ALLOW_ROCK | ALLOW_WALL);
78 if (throws_rocks(mtmp->data))
79 allowflags |= ALLOW_ROCK;
80 if (tunnels(mtmp->data))
81 allowflags |= ALLOW_DIG;
82 if (!nohands(mtmp->data) && !verysmall(mtmp->data)) {
83 allowflags |= OPENDOOR;
84 if (monhaskey(mtmp, TRUE))
85 allowflags |= UNLOCKDOOR;
87 if (is_giant(mtmp->data))
88 allowflags |= BUSTDOOR;
89 cnt = mfndpos(mtmp, poss, info, allowflags);
91 if (mtmp->isshk && avoid && uondoor) { /* perhaps we cannot avoid him */
92 for (i = 0; i < cnt; i++)
93 if (!(info[i] & NOTONL))
98 #define GDIST(x, y) (dist2(x, y, gx, gy))
101 for (i = 0; i < cnt; i++) {
104 if (IS_ROOM(levl[nx][ny].typ)
105 || (mtmp->isshk && (!in_his_shop || ESHK(mtmp)->following))) {
106 if (avoid && (info[i] & NOTONL))
108 if ((!appr && !rn2(++chcnt))
109 || (appr && GDIST(nx, ny) < GDIST(nix, niy))) {
115 if (mtmp->ispriest && avoid && nix == omx && niy == omy
116 && onlineu(omx, omy)) {
117 /* might as well move closer as long it's going to stay
123 if (nix != omx || niy != omy) {
124 remove_monster(omx, omy);
125 place_monster(mtmp, nix, niy);
127 if (mtmp->isshk && !in_his_shop && inhishop(mtmp))
128 check_special_room(FALSE);
130 if (cansee(mtmp->mx, mtmp->my))
132 pline("%s picks up %s.", Monnam(mtmp),
133 distant_name(ib, doname));
135 pline("%s
\82Í%s
\82ð
\8fE
\82Á
\82½
\81D", Monnam(mtmp),
136 distant_name(ib, doname));
138 obj_extract_self(ib);
139 (void) mpickobj(mtmp, ib);
147 temple_occupied(array)
148 register char *array;
152 for (ptr = array; *ptr; ptr++)
153 if (rooms[*ptr - ROOMOFFSET].rtype == TEMPLE)
159 histemple_at(priest, x, y)
160 register struct monst *priest;
163 return (boolean) (priest && priest->ispriest
164 && (EPRI(priest)->shroom == *in_rooms(x, y, TEMPLE))
165 && on_level(&(EPRI(priest)->shrlevel), &u.uz));
170 struct monst *priest;
172 /* make sure we have a priest */
173 if (!priest || !priest->ispriest)
175 /* priest must be on right level and in right room */
176 if (!histemple_at(priest, priest->mx, priest->my))
178 /* temple room must still contain properly aligned altar */
179 return has_shrine(priest);
183 * pri_move: return 1: moved 0: didn't -1: let m_move do it -2: died
187 register struct monst *priest;
189 register xchar gx, gy, omx, omy;
191 boolean avoid = TRUE;
196 if (!histemple_at(priest, omx, omy))
199 temple = EPRI(priest)->shroom;
201 gx = EPRI(priest)->shrpos.x;
202 gy = EPRI(priest)->shrpos.y;
204 gx += rn1(3, -1); /* mill around the altar */
207 if (!priest->mpeaceful
208 || (Conflict && !resist(priest, RING_CLASS, 0, 0))) {
209 if (monnear(priest, u.ux, u.uy)) {
212 Your("displaced image doesn't fool %s!", mon_nam(priest));
214 Your("
\8c¶
\89e
\82Í%s
\82ð
\82¾
\82Ü
\82¹
\82È
\82©
\82Á
\82½
\81I", mon_nam(priest));
215 (void) mattacku(priest);
217 } else if (index(u.urooms, temple)) {
218 /* chase player if inside temple & can see him */
219 if (priest->mcansee && m_canseeu(priest)) {
228 return move_special(priest, FALSE, TRUE, FALSE, avoid, omx, omy, gx, gy);
231 /* exclusively for mktemple() */
233 priestini(lvl, sroom, sx, sy, sanctum)
235 struct mkroom *sroom;
237 boolean sanctum; /* is it the seat of the high priest? */
239 struct monst *priest;
243 if (MON_AT(sx + 1, sy))
244 (void) rloc(m_at(sx + 1, sy), FALSE); /* insurance */
246 priest = makemon(&mons[sanctum ? PM_HIGH_PRIEST : PM_ALIGNED_PRIEST],
247 sx + 1, sy, MM_EPRI);
249 EPRI(priest)->shroom = (schar) ((sroom - rooms) + ROOMOFFSET);
250 EPRI(priest)->shralign = Amask2align(levl[sx][sy].altarmask);
251 EPRI(priest)->shrpos.x = sx;
252 EPRI(priest)->shrpos.y = sy;
253 assign_level(&(EPRI(priest)->shrlevel), lvl);
254 priest->mtrapseen = ~0; /* traps are known */
255 priest->mpeaceful = 1;
256 priest->ispriest = 1;
257 priest->isminion = 0;
258 priest->msleeping = 0;
259 set_malign(priest); /* mpeaceful may have changed */
261 /* now his/her goodies... */
262 if (sanctum && EPRI(priest)->shralign == A_NONE
263 && on_level(&sanctum_level, &u.uz)) {
264 (void) mongets(priest, AMULET_OF_YENDOR);
266 /* 2 to 4 spellbooks */
267 for (cnt = rn1(3, 2); cnt > 0; --cnt) {
268 (void) mpickobj(priest, mkobj(SPBOOK_CLASS, FALSE));
270 /* robe [via makemon()] */
271 if (rn2(2) && (otmp = which_armor(priest, W_ARMC)) != 0) {
272 if (p_coaligned(priest))
280 /* get a monster's alignment type without caller needing EPRI & EMIN */
285 aligntyp algn = mon->ispriest ? EPRI(mon)->shralign
286 : mon->isminion ? EMIN(mon)->min_align
287 : mon->data->maligntyp;
290 return A_NONE; /* negative but differs from chaotic */
291 return (algn > 0) ? A_LAWFUL : (algn < 0) ? A_CHAOTIC : A_NEUTRAL;
295 * Specially aligned monsters are named specially.
296 * - aligned priests with ispriest and high priests have shrines
297 * they retain ispriest and epri when polymorphed
298 * - aligned priests without ispriest are roamers
299 * they have isminion set and use emin rather than epri
300 * - minions do not have ispriest but have isminion and emin
301 * - caller needs to inhibit Hallucination if it wants to force
302 * the true name even when under that influence
305 priestname(mon, pname)
306 register struct monst *mon;
307 char *pname; /* caller-supplied output buffer */
309 boolean do_hallu = Hallucination,
310 aligned_priest = mon->data == &mons[PM_ALIGNED_PRIEST],
311 high_priest = mon->data == &mons[PM_HIGH_PRIEST];
312 char whatcode = '\0';
313 const char *what = do_hallu ? rndmonnam(&whatcode) : mon->data->mname;
315 if (!mon->ispriest && !mon->isminion) /* should never happen... */
316 return strcpy(pname, what); /* caller must be confused */
319 #if 0 /*JP*//*
\93ú
\96{
\8cê
\82Å
\82Í
\95s
\97v*/
320 if (!do_hallu || !bogon_is_pname(whatcode))
321 Strcat(pname, "the ");
325 Strcat(pname, "invisible ");
327 Strcat(pname, "
\93§
\96¾
\82È");
328 if (mon->isminion && EMIN(mon)->renegade)
330 Strcat(pname, "renegade ");
332 Strcat(pname, "
\97 \90Ø
\82è
\8eÒ
\82Ì");
334 if (mon->ispriest || aligned_priest) { /* high_priest implies ispriest */
335 if (!aligned_priest && !high_priest) {
336 ; /* polymorphed priest; use ``what'' as is */
340 Strcat(pname, "high ");
344 what = "
\96³
\94\
\8d\82\8b\89\8a¯
\97»";
348 else /*
\8fã
\8bL
\82Å
\8a®
\90¬
\82³
\82¹
\82Ä
\81A
\88È
\89º
\82Ì
\83R
\81[
\83h
\82Í
\92Ê
\82ç
\82È
\82
\82·
\82é */
354 what = "
\96³
\94\
\8a¯
\97»";
355 else if (mon->female)
368 if (mon->mtame && !strcmpi(what, "Angel"))
370 if (mon->mtame && !strcmpi(what, "
\93V
\8eg"))
372 Strcat(pname, "guardian ");
374 Strcat(pname, "
\8cx
\8cì");
378 /* same as distant_monnam(), more or less... */
379 if (do_hallu || !high_priest || !Is_astralevel(&u.uz)
380 || distu(mon->mx, mon->my) <= 2 || program_state.gameover) {
382 Strcat(pname, " of ");
383 Strcat(pname, halu_gname(mon_aligntyp(mon)));
391 struct monst *priest;
393 return (boolean) (u.ualign.type == mon_aligntyp(priest));
403 if (!pri || !pri->ispriest)
406 lev = &levl[epri_p->shrpos.x][epri_p->shrpos.y];
407 if (!IS_ALTAR(lev->typ) || !(lev->altarmask & AM_SHRINE))
409 return (boolean) (epri_p->shralign
410 == (Amask2align(lev->altarmask & ~AM_SHRINE)));
417 register struct monst *mtmp;
419 for (mtmp = fmon; mtmp; mtmp = mtmp->nmon) {
420 if (DEADMONSTER(mtmp))
422 if (mtmp->ispriest && (EPRI(mtmp)->shroom == roomno)
423 && histemple_at(mtmp, mtmp->mx, mtmp->my))
426 return (struct monst *) 0;
429 /* called from check_special_room() when the player enters the temple room */
434 struct monst *priest, *mtmp;
436 boolean shrined, sanctum, can_speak;
437 long *this_time, *other_time;
438 const char *msg1, *msg2;
441 /* don't do anything if hero is already in the room */
442 if (temple_occupied(u.urooms0))
445 if ((priest = findpriest((char) roomno)) != 0) {
448 epri_p = EPRI(priest);
449 shrined = has_shrine(priest);
450 sanctum = (priest->data == &mons[PM_HIGH_PRIEST]
451 && (Is_sanctum(&u.uz) || In_endgame(&u.uz)));
452 can_speak = (priest->mcanmove && !priest->msleeping);
453 if (can_speak && !Deaf && moves >= epri_p->intone_time) {
454 unsigned save_priest = priest->ispriest;
456 /* don't reveal the altar's owner upon temple entry in
457 the endgame; for the Sanctum, the next message names
458 Moloch so suppress the "of Moloch" for him here too */
459 if (sanctum && !Hallucination)
460 priest->ispriest = 0;
463 canseemon(priest) ? Monnam(priest) : "A nearby voice");
465 pline("%s
\82ª
\89r
\8f¥
\82µ
\82½
\81F",
466 canseemon(priest) ? Monnam(priest) : "
\8bß
\82
\82Å
\92N
\82©");
468 priest->ispriest = save_priest;
469 epri_p->intone_time = moves + (long) d(10, 500); /* ~2505 */
470 /* make sure that we don't suppress entry message when
471 we've just given its "priest intones" introduction */
472 epri_p->enter_time = 0L;
475 if (sanctum && Is_sanctum(&u.uz)) {
476 if (priest->mpeaceful) {
477 /* first time inside */
479 msg1 = "Infidel, you have entered Moloch's Sanctum!";
481 msg1 = "
\88Ù
\92[
\8eÒ
\82æ
\81I
\82±
\82±
\82Í
\81C
\83\82\81[
\83\8d\83b
\83N
\82Ì
\90¹
\88æ
\82¾
\81I";
485 msg2 = "
\97§
\82¿
\82³
\82ê
\81I";
486 priest->mpeaceful = 0;
487 /* became angry voluntarily; no penalty for attacking him */
490 /* repeat visit, or attacked priest before entering */
492 msg1 = "You desecrate this place by your presence!";
494 msg1 = "
\82¨
\82Ü
\82¦
\82Í
\82±
\82Ì
\90_
\90¹
\82È
\8fê
\8f\8a\82ð
\89\98\82µ
\82Ä
\82¢
\82é
\81I";
496 } else if (moves >= epri_p->enter_time) {
498 Sprintf(buf, "Pilgrim, you enter a %s place!",
499 !shrined ? "desecrated" : "sacred");
501 Sprintf(buf, "
\8f\84\97ç
\8eÒ
\82æ
\81C
\82¨
\82Ü
\82¦
\82Í%s
\92n
\82É
\82¢
\82é
\81I",
502 !shrined ? "
\95s
\8fò
\82Ì" : "
\90_
\90¹
\82È
\82é");
506 if (msg1 && can_speak && !Deaf) {
510 epri_p->enter_time = moves + (long) d(10, 100); /* ~505 */
513 if (!shrined || !p_coaligned(priest)
514 || u.ualign.record <= ALGN_SINNED) {
516 msg1 = "have a%s forbidding feeling...";
518 msg1 = "%s
\8bß
\82Ã
\82«
\82ª
\82½
\82¢
\8bC
\8e\9d\82ª
\82µ
\82½
\81D
\81D
\81D";
520 msg2 = (!shrined || !p_coaligned(priest)) ? "" : " strange";
522 msg2 = (!shrined || !p_coaligned(priest)) ? "" : "
\8aï
\96
\82È";
523 this_time = &epri_p->hostile_time;
524 other_time = &epri_p->peaceful_time;
527 msg1 = "experience %s sense of peace.";
529 msg1 = "%s
\96\9e\82¿
\91«
\82è
\82½
\8bC
\8e\9d\82¿
\82É
\82È
\82Á
\82½
\81D";
531 msg2 = (u.ualign.record >= ALGN_PIOUS) ? "a" : "an unusual";
533 msg2 = (u.ualign.record >= ALGN_PIOUS) ? "a" : "
\82¢
\82Â
\82É
\82È
\82";
534 this_time = &epri_p->peaceful_time;
535 other_time = &epri_p->hostile_time;
537 /* give message if we haven't seen it recently or
538 if alignment update has caused it to switch from
539 forbidding to sense-of-peace or vice versa */
540 if (moves >= *this_time || *other_time >= *this_time) {
542 *this_time = moves + (long) d(10, 20); /* ~55 */
543 /* avoid being tricked by the RNG: switch might have just
544 happened and previous random threshold could be larger */
545 if (*this_time <= *other_time)
546 *other_time = *this_time - 1L;
549 /* recognize the Valley of the Dead and Moloch's Sanctum
550 once hero has encountered the temple priest on those levels */
551 mapseen_temple(priest);
558 You("have an eerie feeling...");
560 You("
\82¼
\82Á
\82Æ
\82µ
\82½
\81D
\81D
\81D");
564 You_feel("like you are being watched.");
566 You("
\8c©
\82Â
\82ß
\82ç
\82ê
\82Ä
\82¢
\82é
\82æ
\82¤
\82È
\8bC
\82ª
\82µ
\82½
\81D");
570 pline("A shiver runs down your %s.", body_part(SPINE));
572 pline("
\82 \82È
\82½
\82Ì%s
\82ð
\90k
\82¦
\82ª
\91\96\82Á
\82½
\81D", body_part(SPINE));
575 break; /* no message; unfortunately there's no
576 EPRI(priest)->eerie_time available to
577 make sure we give one the first time */
580 && (mtmp = makemon(&mons[PM_GHOST], u.ux, u.uy, NO_MM_FLAGS))
582 /* [TODO: alter this (at a minimum, by switching from
583 an exclamation to a simple declaration) if hero has
584 already killed enough ghosts.] */
585 if (canspotmon(mtmp))
587 pline("An enormous ghost appears next to you!");
589 pline("
\8b\90\91å
\82È
\97H
\97ì
\82ª
\82 \82È
\82½
\82Ì
\82·
\82®
\82»
\82Î
\82É
\8c»
\82í
\82ê
\82½
\81I");
592 You("sense a presence close by!");
594 You("
\82·
\82®
\82»
\82Î
\82É
\89½
\82©
\82ª
\82¢
\82é
\82Ì
\82ð
\8a´
\82¶
\82½
\81I");
599 You("are frightened to death, and unable to move.");
601 You("
\82Ü
\82Á
\82³
\82¨
\82É
\82È
\82Á
\82Ä
\8bÁ
\82«
\81C
\93®
\82¯
\82È
\82
\82È
\82Á
\82½
\81D");
604 multi_reason = "being terrified of a demon";
606 multi_reason = "
\88«
\97ì
\82É
\8b°
\95|
\82µ
\82Ä
\82¢
\82é
\8e\9e\82É";
608 nomovemsg = "You regain your composure.";
610 nomovemsg = "
\82 \82È
\82½
\82Í
\95½
\90Ã
\82ð
\8eæ
\82è
\96ß
\82µ
\82½
\81D";
615 /* reset the move counters used to limit temple entry feedback;
616 leaving the level and then returning yields a fresh start */
618 forget_temple_entry(priest)
619 struct monst *priest;
621 struct epri *epri_p = priest->ispriest ? EPRI(priest) : 0;
624 impossible("attempting to manipulate shrine data for non-priest?");
627 epri_p->intone_time = epri_p->enter_time = epri_p->peaceful_time =
628 epri_p->hostile_time = 0L;
633 register struct monst *priest;
635 boolean coaligned = p_coaligned(priest);
636 boolean strayed = (u.ualign.record < 0);
639 u.uconduct.gnostic++;
641 if (priest->mflee || (!priest->ispriest && coaligned && strayed)) {
643 pline("%s doesn't want anything to do with you!", Monnam(priest));
645 pline("%s
\82Í
\82 \82È
\82½
\82É
\8d\
\82¢
\82½
\82
\82È
\82¢
\82æ
\82¤
\82¾
\81I", Monnam(priest));
646 priest->mpeaceful = 0;
650 /* priests don't chat unless peaceful and in their own temple */
651 if (!inhistemple(priest) || !priest->mpeaceful
652 || !priest->mcanmove || priest->msleeping) {
653 static const char *cranky_msg[3] = {
655 "Thou wouldst have words, eh? I'll give thee a word or two!",
657 "
\93ð
\8c¾
\97t
\82ð
\96]
\82Þ
\82Ì
\82©
\81H",
659 "Talk? Here is what I have to say!",
661 "
\98b
\82·
\81H
\89½
\82ð
\8c¾
\82¦
\82Î
\82æ
\82¢
\82Ì
\82¾
\81I",
663 "Pilgrim, I would speak no longer with thee."
665 "
\8f\84\97ç
\8eÒ
\82æ
\81C
\93ð
\82É
\8cê
\82é
\82±
\82Æ
\82È
\82Ç
\82È
\82¢
\81D"
668 if (!priest->mcanmove || priest->msleeping) {
670 pline("%s breaks out of %s reverie!", Monnam(priest),
673 pline("%s
\82ÍáÒ
\91z
\82ð
\92\86\92f
\82µ
\82½
\81I", Monnam(priest));
675 priest->mfrozen = priest->msleeping = 0;
676 priest->mcanmove = 1;
678 priest->mpeaceful = 0;
679 verbalize1(cranky_msg[rn2(3)]);
683 /* you desecrated the temple and now you want to chat? */
684 if (priest->mpeaceful && *in_rooms(priest->mx, priest->my, TEMPLE)
685 && !has_shrine(priest)) {
688 "Begone! Thou desecratest this holy place with thy presence.");
690 "
\97§
\82¿
\8b\8e\82ê
\81I
\93ð
\82Í
\82±
\82Ì
\90_
\90¹
\82È
\82é
\8fê
\8f\8a\82ð
\89\98\82µ
\82Ä
\82¢
\82é
\81D");
691 priest->mpeaceful = 0;
694 if (!money_cnt(invent)) {
695 if (coaligned && !strayed) {
696 long pmoney = money_cnt(priest->minvent);
698 /* Note: two bits is actually 25 cents. Hmm. */
700 pline("%s gives you %s for an ale.", Monnam(priest),
701 (pmoney == 1L) ? "one bit" : "two bits");
703 pline("%s
\82Í
\82 \82È
\82½
\82ª
\83G
\81[
\83\8b\8eð
\82ð
\88ù
\82ß
\82é
\82æ
\82¤
\82É
\81C%s
\82ð
\97^
\82¦
\82½
\81D", Monnam(priest),
704 (pmoney == 1L) ? "
\8bà
\89Ý1
\96\87" : "
\8bà
\89Ý2
\96\87");
706 money2u(priest, pmoney > 1L ? 2 : 1);
709 pline("%s preaches the virtues of poverty.", Monnam(priest));
711 pline("%s
\82Í
\90´
\95n
\82Ì
\94ü
\93¿
\82É
\82Â
\82¢
\82Ä
\90à
\8b³
\82µ
\82½
\81D", Monnam(priest));
712 exercise(A_WIS, TRUE);
715 pline("%s is not interested.", Monnam(priest));
717 pline("%s
\82Í
\8b»
\96¡
\82ð
\8e¦
\82³
\82È
\82¢
\81D", Monnam(priest));
723 pline("%s asks you for a contribution for the temple.",
725 pline("%s
\82Í
\82 \82È
\82½
\82É
\8e\9b\89@
\82Ö
\82Ì
\8añ
\91¡
\82ð
\8b\81\82ß
\82½
\81D",
727 if ((offer = bribe(priest)) == 0) {
729 verbalize("Thou shalt regret thine action!");
731 verbalize("
\93ð
\82Ì
\8ds
\88×
\82Í
\90_
\82ð
\96`
\93À
\82·
\82é
\82à
\82Ì
\82È
\82è
\81I");
734 } else if (offer < (u.ulevel * 200)) {
735 if (money_cnt(invent) > (offer * 2L)) {
737 verbalize("Cheapskate.");
739 verbalize("
\83P
\83`
\82ß
\81D");
742 verbalize("I thank thee for thy contribution.");
744 verbalize("
\93ð
\82Ì
\8añ
\91¡
\82É
\95ñ
\82¢
\82æ
\82¤
\82¼
\81D");
745 /* give player some token */
746 exercise(A_WIS, TRUE);
748 } else if (offer < (u.ulevel * 400)) {
750 verbalize("Thou art indeed a pious individual.");
752 verbalize("
\93ð
\81C
\82Ü
\82³
\82É
\8chåi
\82È
\82è
\81D");
753 if (money_cnt(invent) < (offer * 2L)) {
754 if (coaligned && u.ualign.record <= ALGN_SINNED)
757 verbalize("I bestow upon thee a blessing.");
759 verbalize("
\93ð
\82É
\8fj
\95\9f\82ð
\81D");
760 incr_itimeout(&HClairvoyant, rn1(500, 500));
762 } else if (offer < (u.ulevel * 600)
763 /* u.ublessed is only active when Protection is
764 enabled via something other than worn gear
765 (theft by gremlin clears the intrinsic but not
766 its former magnitude, making it recoverable) */
767 && (!(HProtection & INTRINSIC)
769 && (u.ublessed < 9 || !rn2(u.ublessed))))) {
771 verbalize("Thy devotion has been rewarded.");
773 verbalize("
\93ð
\82ª
\8c£
\90g
\82É
\95ñ
\82í
\82ñ
\81D");
774 if (!(HProtection & INTRINSIC)) {
775 HProtection |= FROMOUTSIDE;
777 u.ublessed = rn1(3, 2);
782 verbalize("Thy selfless generosity is deeply appreciated.");
784 verbalize("
\93ð
\8e©
\90g
\82Ì
\90^
\89¿
\82Í
\91å
\82¢
\82É
\94F
\82ß
\82ç
\82ê
\82½
\81D");
785 if (money_cnt(invent) < (offer * 2L) && coaligned) {
786 if (strayed && (moves - u.ucleansed) > 5000L) {
787 u.ualign.record = 0; /* cleanse thee */
798 mk_roamer(ptr, alignment, x, y, peaceful)
799 register struct permonst *ptr;
804 register struct monst *roamer;
805 register boolean coaligned = (u.ualign.type == alignment);
807 #if 0 /* this was due to permonst's pxlth field which is now gone */
808 if (ptr != &mons[PM_ALIGNED_PRIEST] && ptr != &mons[PM_ANGEL])
809 return (struct monst *) 0;
813 (void) rloc(m_at(x, y), FALSE); /* insurance */
815 if (!(roamer = makemon(ptr, x, y, MM_ADJACENTOK | MM_EMIN)))
816 return (struct monst *) 0;
818 EMIN(roamer)->min_align = alignment;
819 EMIN(roamer)->renegade = (coaligned && !peaceful);
820 roamer->ispriest = 0;
821 roamer->isminion = 1;
822 roamer->mtrapseen = ~0; /* traps are known */
823 roamer->mpeaceful = peaceful;
824 roamer->msleeping = 0;
825 set_malign(roamer); /* peaceful may have changed */
832 reset_hostility(roamer)
833 register struct monst *roamer;
835 if (!roamer->isminion)
837 if (roamer->data != &mons[PM_ALIGNED_PRIEST]
838 && roamer->data != &mons[PM_ANGEL])
841 if (EMIN(roamer)->min_align != u.ualign.type) {
842 roamer->mpeaceful = roamer->mtame = 0;
845 newsym(roamer->mx, roamer->my);
849 in_your_sanctuary(mon, x, y)
850 struct monst *mon; /* if non-null, <mx,my> overrides <x,y> */
853 register char roomno;
854 register struct monst *priest;
857 if (is_minion(mon->data) || is_rider(mon->data))
859 x = mon->mx, y = mon->my;
861 if (u.ualign.record <= ALGN_SINNED) /* sinned or worse */
863 if ((roomno = temple_occupied(u.urooms)) == 0
864 || roomno != *in_rooms(x, y, TEMPLE))
866 if ((priest = findpriest(roomno)) == 0)
868 return (boolean) (has_shrine(priest) && p_coaligned(priest)
869 && priest->mpeaceful);
872 /* when attacking "priest" in his temple */
875 struct monst *priest;
877 int x, y, ax, ay, roomno = (int) temple_occupied(u.urooms);
878 struct mkroom *troom;
880 if (!roomno || !has_shrine(priest))
883 ax = x = EPRI(priest)->shrpos.x;
884 ay = y = EPRI(priest)->shrpos.y;
885 troom = &rooms[roomno - ROOMOFFSET];
887 if ((u.ux == x && u.uy == y) || !linedup(u.ux, u.uy, x, y, 1)) {
888 if (IS_DOOR(levl[u.ux][u.uy].typ)) {
889 if (u.ux == troom->lx - 1) {
892 } else if (u.ux == troom->hx + 1) {
895 } else if (u.uy == troom->ly - 1) {
898 } else if (u.uy == troom->hy + 1) {
922 if (!linedup(u.ux, u.uy, x, y, 1))
929 pline("%s roars in anger: \"Thou shalt suffer!\"",
931 pline("%s
\82Í
\93{
\82è
\82Ì
\90º
\82ð
\82 \82°
\82½
\81F
\81u
\93ð
\81C
\8bê
\82µ
\82Þ
\82ª
\82æ
\82¢
\81I
\81v",
936 pline("%s voice booms: \"How darest thou harm my servant!\"",
938 pline("%s
\82Ì
\90º
\82ª
\8b¿
\82¢
\82½
\81F
\81u
\82í
\82ª
\89º
\96l
\82É
\8bê
\82µ
\82Þ
\82ª
\82æ
\82¢
\81I
\81v",
939 s_suffix(a_gname_at(ax, ay)));
943 pline("%s roars: \"Thou dost profane my shrine!\"",
945 pline("%s
\82Ì
\90º
\82ª
\95·
\82±
\82¦
\82é
\81F
\81u
\93ð
\81C
\89ä
\82ª
\90¹
\93°
\82ð
\89\98\82µ
\82½
\82è
\81I
\81v",
950 buzz(-10 - (AD_ELEC - 1), 6, x, y, sgn(tbx),
951 sgn(tby)); /* bolt of lightning */
952 exercise(A_WIS, FALSE);
958 register struct monst *priest;
961 if ((priest = findpriest(temple_occupied(u.urooms))) != 0) {
962 struct epri *eprip = EPRI(priest);
966 * If the altar has been destroyed or converted, let the
968 * (When it's just a conversion and there happens to be
969 * a fresh corpse nearby, the priest ought to have an
970 * opportunity to try converting it back; maybe someday...)
972 lev = &levl[eprip->shrpos.x][eprip->shrpos.y];
973 if (!IS_ALTAR(lev->typ)
974 || ((aligntyp) Amask2align(lev->altarmask & AM_MASK)
975 != eprip->shralign)) {
978 priest->ispriest = 0; /* now a roaming minion */
979 priest->isminion = 1;
980 EMIN(priest)->min_align = eprip->shralign;
981 EMIN(priest)->renegade = FALSE;
982 /* discard priest's memory of his former shrine;
983 if we ever implement the re-conversion mentioned
984 above, this will need to be removed */
991 * When saving bones, find priests that aren't on their shrine level,
992 * and remove them. This avoids big problems when restoring bones.
993 * [Perhaps we should convert them into roamers instead?]
1000 for (mtmp = fmon; mtmp; mtmp = mtmp->nmon) {
1001 if (DEADMONSTER(mtmp))
1003 if (mtmp->ispriest && !on_level(&(EPRI(mtmp)->shrlevel), &u.uz))
1008 /* munge priest-specific structure when restoring -dlc */
1010 restpriest(mtmp, ghostly)
1011 register struct monst *mtmp;
1016 assign_level(&(EPRI(mtmp)->shrlevel), &u.uz);