1 /* NetHack 3.6 priest.c $NHDT-Date: 1545131519 2018/12/18 11:11:59 $ $NHDT-Branch: NetHack-3.6.2-beta01 $:$NHDT-Revision: 1.45 $ */
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-2019 */
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 #if 0 /* dead code; see below */
62 struct obj *ib = (struct obj *) 0;
65 if (omx == gx && omy == gy)
75 allowflags = ALLOW_SSM;
77 allowflags = ALLOW_SSM | ALLOW_SANCT;
78 if (passes_walls(mtmp->data))
79 allowflags |= (ALLOW_ROCK | ALLOW_WALL);
80 if (throws_rocks(mtmp->data))
81 allowflags |= ALLOW_ROCK;
82 if (tunnels(mtmp->data))
83 allowflags |= ALLOW_DIG;
84 if (!nohands(mtmp->data) && !verysmall(mtmp->data)) {
85 allowflags |= OPENDOOR;
86 if (monhaskey(mtmp, TRUE))
87 allowflags |= UNLOCKDOOR;
89 if (is_giant(mtmp->data))
90 allowflags |= BUSTDOOR;
91 cnt = mfndpos(mtmp, poss, info, allowflags);
93 if (mtmp->isshk && avoid && uondoor) { /* perhaps we cannot avoid him */
94 for (i = 0; i < cnt; i++)
95 if (!(info[i] & NOTONL))
100 #define GDIST(x, y) (dist2(x, y, gx, gy))
103 for (i = 0; i < cnt; i++) {
106 if (IS_ROOM(levl[nx][ny].typ)
107 || (mtmp->isshk && (!in_his_shop || ESHK(mtmp)->following))) {
108 if (avoid && (info[i] & NOTONL))
110 if ((!appr && !rn2(++chcnt))
111 || (appr && GDIST(nx, ny) < GDIST(nix, niy))) {
117 if (mtmp->ispriest && avoid && nix == omx && niy == omy
118 && onlineu(omx, omy)) {
119 /* might as well move closer as long it's going to stay
125 if (nix != omx || niy != omy) {
126 remove_monster(omx, omy);
127 place_monster(mtmp, nix, niy);
129 if (mtmp->isshk && !in_his_shop && inhishop(mtmp))
130 check_special_room(FALSE);
131 #if 0 /* dead code; maybe someday someone will track down why... */
133 if (cansee(mtmp->mx, mtmp->my))
135 pline("%s picks up %s.", Monnam(mtmp),
136 distant_name(ib, doname));
138 pline("%s
\82Í%s
\82ð
\8fE
\82Á
\82½
\81D", Monnam(mtmp),
139 distant_name(ib, doname));
141 obj_extract_self(ib);
142 (void) mpickobj(mtmp, ib);
151 temple_occupied(array)
152 register char *array;
156 for (ptr = array; *ptr; ptr++)
157 if (rooms[*ptr - ROOMOFFSET].rtype == TEMPLE)
163 histemple_at(priest, x, y)
164 register struct monst *priest;
167 return (boolean) (priest && priest->ispriest
168 && (EPRI(priest)->shroom == *in_rooms(x, y, TEMPLE))
169 && on_level(&(EPRI(priest)->shrlevel), &u.uz));
174 struct monst *priest;
176 /* make sure we have a priest */
177 if (!priest || !priest->ispriest)
179 /* priest must be on right level and in right room */
180 if (!histemple_at(priest, priest->mx, priest->my))
182 /* temple room must still contain properly aligned altar */
183 return has_shrine(priest);
187 * pri_move: return 1: moved 0: didn't -1: let m_move do it -2: died
191 register struct monst *priest;
193 register xchar gx, gy, omx, omy;
195 boolean avoid = TRUE;
200 if (!histemple_at(priest, omx, omy))
203 temple = EPRI(priest)->shroom;
205 gx = EPRI(priest)->shrpos.x;
206 gy = EPRI(priest)->shrpos.y;
208 gx += rn1(3, -1); /* mill around the altar */
211 if (!priest->mpeaceful
212 || (Conflict && !resist(priest, RING_CLASS, 0, 0))) {
213 if (monnear(priest, u.ux, u.uy)) {
216 Your("displaced image doesn't fool %s!", mon_nam(priest));
218 Your("
\8c¶
\89e
\82Í%s
\82ð
\82¾
\82Ü
\82¹
\82È
\82©
\82Á
\82½
\81I", mon_nam(priest));
219 (void) mattacku(priest);
221 } else if (index(u.urooms, temple)) {
222 /* chase player if inside temple & can see him */
223 if (priest->mcansee && m_canseeu(priest)) {
232 return move_special(priest, FALSE, TRUE, FALSE, avoid, omx, omy, gx, gy);
235 /* exclusively for mktemple() */
237 priestini(lvl, sroom, sx, sy, sanctum)
239 struct mkroom *sroom;
241 boolean sanctum; /* is it the seat of the high priest? */
243 struct monst *priest;
247 if (MON_AT(sx + 1, sy))
248 (void) rloc(m_at(sx + 1, sy), FALSE); /* insurance */
250 priest = makemon(&mons[sanctum ? PM_HIGH_PRIEST : PM_ALIGNED_PRIEST],
251 sx + 1, sy, MM_EPRI);
253 EPRI(priest)->shroom = (schar) ((sroom - rooms) + ROOMOFFSET);
254 EPRI(priest)->shralign = Amask2align(levl[sx][sy].altarmask);
255 EPRI(priest)->shrpos.x = sx;
256 EPRI(priest)->shrpos.y = sy;
257 assign_level(&(EPRI(priest)->shrlevel), lvl);
258 priest->mtrapseen = ~0; /* traps are known */
259 priest->mpeaceful = 1;
260 priest->ispriest = 1;
261 priest->isminion = 0;
262 priest->msleeping = 0;
263 set_malign(priest); /* mpeaceful may have changed */
265 /* now his/her goodies... */
266 if (sanctum && EPRI(priest)->shralign == A_NONE
267 && on_level(&sanctum_level, &u.uz)) {
268 (void) mongets(priest, AMULET_OF_YENDOR);
270 /* 2 to 4 spellbooks */
271 for (cnt = rn1(3, 2); cnt > 0; --cnt) {
272 (void) mpickobj(priest, mkobj(SPBOOK_CLASS, FALSE));
274 /* robe [via makemon()] */
275 if (rn2(2) && (otmp = which_armor(priest, W_ARMC)) != 0) {
276 if (p_coaligned(priest))
284 /* get a monster's alignment type without caller needing EPRI & EMIN */
289 aligntyp algn = mon->ispriest ? EPRI(mon)->shralign
290 : mon->isminion ? EMIN(mon)->min_align
291 : mon->data->maligntyp;
294 return A_NONE; /* negative but differs from chaotic */
295 return (algn > 0) ? A_LAWFUL : (algn < 0) ? A_CHAOTIC : A_NEUTRAL;
299 * Specially aligned monsters are named specially.
300 * - aligned priests with ispriest and high priests have shrines
301 * they retain ispriest and epri when polymorphed
302 * - aligned priests without ispriest are roamers
303 * they have isminion set and use emin rather than epri
304 * - minions do not have ispriest but have isminion and emin
305 * - caller needs to inhibit Hallucination if it wants to force
306 * the true name even when under that influence
309 priestname(mon, pname)
310 register struct monst *mon;
311 char *pname; /* caller-supplied output buffer */
313 boolean do_hallu = Hallucination,
314 aligned_priest = mon->data == &mons[PM_ALIGNED_PRIEST],
315 high_priest = mon->data == &mons[PM_HIGH_PRIEST];
316 char whatcode = '\0';
317 const char *what = do_hallu ? rndmonnam(&whatcode) : mon->data->mname;
319 if (!mon->ispriest && !mon->isminion) /* should never happen... */
320 return strcpy(pname, what); /* caller must be confused */
323 #if 0 /*JP*//*
\93ú
\96{
\8cê
\82Å
\82Í
\95s
\97v*/
324 if (!do_hallu || !bogon_is_pname(whatcode))
325 Strcat(pname, "the ");
329 Strcat(pname, "invisible ");
331 Strcat(pname, "
\93§
\96¾
\82È");
332 if (mon->isminion && EMIN(mon)->renegade)
334 Strcat(pname, "renegade ");
336 Strcat(pname, "
\97 \90Ø
\82è
\8eÒ
\82Ì");
338 #if 1 /*JP*//*
\91®
\90«
\82Í
\82±
\82±
\82Å
\95t
\82¯
\82é*/
339 if (do_hallu || !high_priest || !Is_astralevel(&u.uz)
340 || distu(mon->mx, mon->my) <= 2 || program_state.gameover) {
341 Strcat(pname, halu_gname(mon_aligntyp(mon)));
342 Strcat(pname, "
\82Ì");
345 if (mon->ispriest || aligned_priest) { /* high_priest implies ispriest */
346 if (!aligned_priest && !high_priest) {
347 ; /* polymorphed priest; use ``what'' as is */
351 Strcat(pname, "high ");
355 what = "
\96³
\94\
\8d\82\8b\89\8a¯
\97»";
359 else /*
\8fã
\8bL
\82Å
\8a®
\90¬
\82³
\82¹
\82Ä
\81A
\88È
\89º
\82Ì
\83R
\81[
\83h
\82Í
\92Ê
\82ç
\82È
\82
\82·
\82é */
365 what = "
\96³
\94\
\8a¯
\97»";
366 else if (mon->female)
379 if (mon->mtame && !strcmpi(what, "Angel"))
381 if (mon->mtame && !strcmpi(what, "
\93V
\8eg"))
383 Strcat(pname, "guardian ");
385 Strcat(pname, "
\8cx
\8cì");
389 #if 0 /*JP*//*
\91®
\90«
\82Í
\82·
\82Å
\82É
\95t
\82¯
\82Ä
\82¢
\82é*/
390 /* same as distant_monnam(), more or less... */
391 if (do_hallu || !high_priest || !Is_astralevel(&u.uz)
392 || distu(mon->mx, mon->my) <= 2 || program_state.gameover) {
393 Strcat(pname, " of ");
394 Strcat(pname, halu_gname(mon_aligntyp(mon)));
402 struct monst *priest;
404 return (boolean) (u.ualign.type == mon_aligntyp(priest));
414 if (!pri || !pri->ispriest)
417 lev = &levl[epri_p->shrpos.x][epri_p->shrpos.y];
418 if (!IS_ALTAR(lev->typ) || !(lev->altarmask & AM_SHRINE))
420 return (boolean) (epri_p->shralign
421 == (Amask2align(lev->altarmask & ~AM_SHRINE)));
428 register struct monst *mtmp;
430 for (mtmp = fmon; mtmp; mtmp = mtmp->nmon) {
431 if (DEADMONSTER(mtmp))
433 if (mtmp->ispriest && (EPRI(mtmp)->shroom == roomno)
434 && histemple_at(mtmp, mtmp->mx, mtmp->my))
437 return (struct monst *) 0;
440 /* called from check_special_room() when the player enters the temple room */
445 struct monst *priest, *mtmp;
447 boolean shrined, sanctum, can_speak;
448 long *this_time, *other_time;
449 const char *msg1, *msg2;
452 /* don't do anything if hero is already in the room */
453 if (temple_occupied(u.urooms0))
456 if ((priest = findpriest((char) roomno)) != 0) {
459 epri_p = EPRI(priest);
460 shrined = has_shrine(priest);
461 sanctum = (priest->data == &mons[PM_HIGH_PRIEST]
462 && (Is_sanctum(&u.uz) || In_endgame(&u.uz)));
463 can_speak = (priest->mcanmove && !priest->msleeping);
464 if (can_speak && !Deaf && moves >= epri_p->intone_time) {
465 unsigned save_priest = priest->ispriest;
467 /* don't reveal the altar's owner upon temple entry in
468 the endgame; for the Sanctum, the next message names
469 Moloch so suppress the "of Moloch" for him here too */
470 if (sanctum && !Hallucination)
471 priest->ispriest = 0;
474 canseemon(priest) ? Monnam(priest) : "A nearby voice");
476 pline("%s
\82ª
\89r
\8f¥
\82µ
\82½
\81F",
477 canseemon(priest) ? Monnam(priest) : "
\8bß
\82
\82Å
\92N
\82©");
479 priest->ispriest = save_priest;
480 epri_p->intone_time = moves + (long) d(10, 500); /* ~2505 */
481 /* make sure that we don't suppress entry message when
482 we've just given its "priest intones" introduction */
483 epri_p->enter_time = 0L;
486 if (sanctum && Is_sanctum(&u.uz)) {
487 if (priest->mpeaceful) {
488 /* first time inside */
490 msg1 = "Infidel, you have entered Moloch's Sanctum!";
492 msg1 = "
\88Ù
\92[
\8eÒ
\82æ
\81I
\82±
\82±
\82Í
\81C
\83\82\81[
\83\8d\83b
\83N
\82Ì
\90¹
\88æ
\82¾
\81I";
496 msg2 = "
\97§
\82¿
\82³
\82ê
\81I";
497 priest->mpeaceful = 0;
498 /* became angry voluntarily; no penalty for attacking him */
501 /* repeat visit, or attacked priest before entering */
503 msg1 = "You desecrate this place by your presence!";
505 msg1 = "
\82¨
\82Ü
\82¦
\82Í
\82±
\82Ì
\90_
\90¹
\82È
\8fê
\8f\8a\82ð
\89\98\82µ
\82Ä
\82¢
\82é
\81I";
507 } else if (moves >= epri_p->enter_time) {
509 Sprintf(buf, "Pilgrim, you enter a %s place!",
510 !shrined ? "desecrated" : "sacred");
512 Sprintf(buf, "
\8f\84\97ç
\8eÒ
\82æ
\81C
\82¨
\82Ü
\82¦
\82Í%s
\92n
\82É
\82¢
\82é
\81I",
513 !shrined ? "
\95s
\8fò
\82Ì" : "
\90_
\90¹
\82È
\82é");
517 if (msg1 && can_speak && !Deaf) {
521 epri_p->enter_time = moves + (long) d(10, 100); /* ~505 */
524 if (!shrined || !p_coaligned(priest)
525 || u.ualign.record <= ALGN_SINNED) {
527 msg1 = "have a%s forbidding feeling...";
529 msg1 = "%s
\8bß
\82Ã
\82«
\82ª
\82½
\82¢
\8bC
\8e\9d\82ª
\82µ
\82½
\81D
\81D
\81D";
531 msg2 = (!shrined || !p_coaligned(priest)) ? "" : " strange";
533 msg2 = (!shrined || !p_coaligned(priest)) ? "" : "
\8aï
\96
\82È";
534 this_time = &epri_p->hostile_time;
535 other_time = &epri_p->peaceful_time;
538 msg1 = "experience %s sense of peace.";
540 msg1 = "%s
\96\9e\82¿
\91«
\82è
\82½
\8bC
\8e\9d\82¿
\82É
\82È
\82Á
\82½
\81D";
542 msg2 = (u.ualign.record >= ALGN_PIOUS) ? "a" : "an unusual";
544 msg2 = (u.ualign.record >= ALGN_PIOUS) ? "a" : "
\82¢
\82Â
\82É
\82È
\82";
545 this_time = &epri_p->peaceful_time;
546 other_time = &epri_p->hostile_time;
548 /* give message if we haven't seen it recently or
549 if alignment update has caused it to switch from
550 forbidding to sense-of-peace or vice versa */
551 if (moves >= *this_time || *other_time >= *this_time) {
553 *this_time = moves + (long) d(10, 20); /* ~55 */
554 /* avoid being tricked by the RNG: switch might have just
555 happened and previous random threshold could be larger */
556 if (*this_time <= *other_time)
557 *other_time = *this_time - 1L;
560 /* recognize the Valley of the Dead and Moloch's Sanctum
561 once hero has encountered the temple priest on those levels */
562 mapseen_temple(priest);
569 You("have an eerie feeling...");
571 You("
\82¼
\82Á
\82Æ
\82µ
\82½
\81D
\81D
\81D");
575 You_feel("like you are being watched.");
577 You("
\8c©
\82Â
\82ß
\82ç
\82ê
\82Ä
\82¢
\82é
\82æ
\82¤
\82È
\8bC
\82ª
\82µ
\82½
\81D");
581 pline("A shiver runs down your %s.", body_part(SPINE));
583 pline("
\82 \82È
\82½
\82Ì%s
\82ð
\90k
\82¦
\82ª
\91\96\82Á
\82½
\81D", body_part(SPINE));
586 break; /* no message; unfortunately there's no
587 EPRI(priest)->eerie_time available to
588 make sure we give one the first time */
591 && (mtmp = makemon(&mons[PM_GHOST], u.ux, u.uy, NO_MM_FLAGS))
593 int ngen = mvitals[PM_GHOST].born;
594 if (canspotmon(mtmp))
596 pline("A%s ghost appears next to you%c",
597 ngen < 5 ? "n enormous" : "",
598 ngen < 10 ? '!' : '.');
600 pline("%s
\97H
\97ì
\82ª
\82 \82È
\82½
\82Ì
\82·
\82®
\82»
\82Î
\82É
\8c»
\82í
\82ê
\82½%s",
601 ngen < 5 ? "
\8b\90\91å
\82È" : "",
602 ngen < 10 ? "
\81I" : "
\81D");
606 You("sense a presence close by!");
608 You("
\82·
\82®
\82»
\82Î
\82É
\89½
\82©
\82ª
\82¢
\82é
\82Ì
\82ð
\8a´
\82¶
\82½
\81I");
613 You("are frightened to death, and unable to move.");
615 You("
\82Ü
\82Á
\82³
\82¨
\82É
\82È
\82Á
\82Ä
\8bÁ
\82«
\81C
\93®
\82¯
\82È
\82
\82È
\82Á
\82½
\81D");
618 multi_reason = "being terrified of a ghost";
620 multi_reason = "
\97H
\97ì
\82É
\8b°
\95|
\82µ
\82Ä
\82¢
\82é
\8e\9e\82É";
622 nomovemsg = "You regain your composure.";
624 nomovemsg = "
\82 \82È
\82½
\82Í
\95½
\90Ã
\82ð
\8eæ
\82è
\96ß
\82µ
\82½
\81D";
629 /* reset the move counters used to limit temple entry feedback;
630 leaving the level and then returning yields a fresh start */
632 forget_temple_entry(priest)
633 struct monst *priest;
635 struct epri *epri_p = priest->ispriest ? EPRI(priest) : 0;
638 impossible("attempting to manipulate shrine data for non-priest?");
641 epri_p->intone_time = epri_p->enter_time = epri_p->peaceful_time =
642 epri_p->hostile_time = 0L;
647 register struct monst *priest;
649 boolean coaligned = p_coaligned(priest);
650 boolean strayed = (u.ualign.record < 0);
653 u.uconduct.gnostic++;
655 if (priest->mflee || (!priest->ispriest && coaligned && strayed)) {
657 pline("%s doesn't want anything to do with you!", Monnam(priest));
659 pline("%s
\82Í
\82 \82È
\82½
\82É
\8d\
\82¢
\82½
\82
\82È
\82¢
\82æ
\82¤
\82¾
\81I", Monnam(priest));
660 priest->mpeaceful = 0;
664 /* priests don't chat unless peaceful and in their own temple */
665 if (!inhistemple(priest) || !priest->mpeaceful
666 || !priest->mcanmove || priest->msleeping) {
667 static const char *cranky_msg[3] = {
669 "Thou wouldst have words, eh? I'll give thee a word or two!",
671 "
\93ð
\8c¾
\97t
\82ð
\96]
\82Þ
\82Ì
\82©
\81H",
673 "Talk? Here is what I have to say!",
675 "
\98b
\82·
\81H
\89½
\82ð
\8c¾
\82¦
\82Î
\82æ
\82¢
\82Ì
\82¾
\81I",
677 "Pilgrim, I would speak no longer with thee."
679 "
\8f\84\97ç
\8eÒ
\82æ
\81C
\93ð
\82É
\8cê
\82é
\82±
\82Æ
\82È
\82Ç
\82È
\82¢
\81D"
682 if (!priest->mcanmove || priest->msleeping) {
684 pline("%s breaks out of %s reverie!", Monnam(priest),
687 pline("%s
\82ÍáÒ
\91z
\82ð
\92\86\92f
\82µ
\82½
\81I", Monnam(priest));
689 priest->mfrozen = priest->msleeping = 0;
690 priest->mcanmove = 1;
692 priest->mpeaceful = 0;
693 verbalize1(cranky_msg[rn2(3)]);
697 /* you desecrated the temple and now you want to chat? */
698 if (priest->mpeaceful && *in_rooms(priest->mx, priest->my, TEMPLE)
699 && !has_shrine(priest)) {
702 "Begone! Thou desecratest this holy place with thy presence.");
704 "
\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");
705 priest->mpeaceful = 0;
708 if (!money_cnt(invent)) {
709 if (coaligned && !strayed) {
710 long pmoney = money_cnt(priest->minvent);
712 /* Note: two bits is actually 25 cents. Hmm. */
714 pline("%s gives you %s for an ale.", Monnam(priest),
715 (pmoney == 1L) ? "one bit" : "two bits");
717 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),
718 (pmoney == 1L) ? "
\8bà
\89Ý1
\96\87" : "
\8bà
\89Ý2
\96\87");
720 money2u(priest, pmoney > 1L ? 2 : 1);
723 pline("%s preaches the virtues of poverty.", Monnam(priest));
725 pline("%s
\82Í
\90´
\95n
\82Ì
\94ü
\93¿
\82É
\82Â
\82¢
\82Ä
\90à
\8b³
\82µ
\82½
\81D", Monnam(priest));
726 exercise(A_WIS, TRUE);
729 pline("%s is not interested.", Monnam(priest));
731 pline("%s
\82Í
\8b»
\96¡
\82ð
\8e¦
\82³
\82È
\82¢
\81D", Monnam(priest));
737 pline("%s asks you for a contribution for the temple.",
739 pline("%s
\82Í
\82 \82È
\82½
\82É
\8e\9b\89@
\82Ö
\82Ì
\8añ
\91¡
\82ð
\8b\81\82ß
\82½
\81D",
741 if ((offer = bribe(priest)) == 0) {
743 verbalize("Thou shalt regret thine action!");
745 verbalize("
\93ð
\82Ì
\8ds
\88×
\82Í
\90_
\82ð
\96`
\93À
\82·
\82é
\82à
\82Ì
\82È
\82è
\81I");
748 } else if (offer < (u.ulevel * 200)) {
749 if (money_cnt(invent) > (offer * 2L)) {
751 verbalize("Cheapskate.");
753 verbalize("
\83P
\83`
\82ß
\81D");
756 verbalize("I thank thee for thy contribution.");
758 verbalize("
\93ð
\82Ì
\8añ
\91¡
\82É
\95ñ
\82¢
\82æ
\82¤
\82¼
\81D");
759 /* give player some token */
760 exercise(A_WIS, TRUE);
762 } else if (offer < (u.ulevel * 400)) {
764 verbalize("Thou art indeed a pious individual.");
766 verbalize("
\93ð
\81C
\82Ü
\82³
\82É
\8chåi
\82È
\82è
\81D");
767 if (money_cnt(invent) < (offer * 2L)) {
768 if (coaligned && u.ualign.record <= ALGN_SINNED)
771 verbalize("I bestow upon thee a blessing.");
773 verbalize("
\93ð
\82É
\8fj
\95\9f\82ð
\81D");
774 incr_itimeout(&HClairvoyant, rn1(500, 500));
776 } else if (offer < (u.ulevel * 600)
777 /* u.ublessed is only active when Protection is
778 enabled via something other than worn gear
779 (theft by gremlin clears the intrinsic but not
780 its former magnitude, making it recoverable) */
781 && (!(HProtection & INTRINSIC)
783 && (u.ublessed < 9 || !rn2(u.ublessed))))) {
785 verbalize("Thy devotion has been rewarded.");
787 verbalize("
\93ð
\82ª
\8c£
\90g
\82É
\95ñ
\82í
\82ñ
\81D");
788 if (!(HProtection & INTRINSIC)) {
789 HProtection |= FROMOUTSIDE;
791 u.ublessed = rn1(3, 2);
796 verbalize("Thy selfless generosity is deeply appreciated.");
798 verbalize("
\93ð
\8e©
\90g
\82Ì
\90^
\89¿
\82Í
\91å
\82¢
\82É
\94F
\82ß
\82ç
\82ê
\82½
\81D");
799 if (money_cnt(invent) < (offer * 2L) && coaligned) {
800 if (strayed && (moves - u.ucleansed) > 5000L) {
801 u.ualign.record = 0; /* cleanse thee */
812 mk_roamer(ptr, alignment, x, y, peaceful)
813 register struct permonst *ptr;
818 register struct monst *roamer;
819 register boolean coaligned = (u.ualign.type == alignment);
821 #if 0 /* this was due to permonst's pxlth field which is now gone */
822 if (ptr != &mons[PM_ALIGNED_PRIEST] && ptr != &mons[PM_ANGEL])
823 return (struct monst *) 0;
827 (void) rloc(m_at(x, y), FALSE); /* insurance */
829 if (!(roamer = makemon(ptr, x, y, MM_ADJACENTOK | MM_EMIN)))
830 return (struct monst *) 0;
832 EMIN(roamer)->min_align = alignment;
833 EMIN(roamer)->renegade = (coaligned && !peaceful);
834 roamer->ispriest = 0;
835 roamer->isminion = 1;
836 roamer->mtrapseen = ~0; /* traps are known */
837 roamer->mpeaceful = peaceful;
838 roamer->msleeping = 0;
839 set_malign(roamer); /* peaceful may have changed */
846 reset_hostility(roamer)
847 register struct monst *roamer;
849 if (!roamer->isminion)
851 if (roamer->data != &mons[PM_ALIGNED_PRIEST]
852 && roamer->data != &mons[PM_ANGEL])
855 if (EMIN(roamer)->min_align != u.ualign.type) {
856 roamer->mpeaceful = roamer->mtame = 0;
859 newsym(roamer->mx, roamer->my);
863 in_your_sanctuary(mon, x, y)
864 struct monst *mon; /* if non-null, <mx,my> overrides <x,y> */
867 register char roomno;
868 register struct monst *priest;
871 if (is_minion(mon->data) || is_rider(mon->data))
873 x = mon->mx, y = mon->my;
875 if (u.ualign.record <= ALGN_SINNED) /* sinned or worse */
877 if ((roomno = temple_occupied(u.urooms)) == 0
878 || roomno != *in_rooms(x, y, TEMPLE))
880 if ((priest = findpriest(roomno)) == 0)
882 return (boolean) (has_shrine(priest) && p_coaligned(priest)
883 && priest->mpeaceful);
886 /* when attacking "priest" in his temple */
889 struct monst *priest;
891 int x, y, ax, ay, roomno = (int) temple_occupied(u.urooms);
892 struct mkroom *troom;
894 if (!roomno || !has_shrine(priest))
897 ax = x = EPRI(priest)->shrpos.x;
898 ay = y = EPRI(priest)->shrpos.y;
899 troom = &rooms[roomno - ROOMOFFSET];
901 if ((u.ux == x && u.uy == y) || !linedup(u.ux, u.uy, x, y, 1)) {
902 if (IS_DOOR(levl[u.ux][u.uy].typ)) {
903 if (u.ux == troom->lx - 1) {
906 } else if (u.ux == troom->hx + 1) {
909 } else if (u.uy == troom->ly - 1) {
912 } else if (u.uy == troom->hy + 1) {
936 if (!linedup(u.ux, u.uy, x, y, 1))
943 pline("%s roars in anger: \"Thou shalt suffer!\"",
945 pline("%s
\82Í
\93{
\82è
\82Ì
\90º
\82ð
\82 \82°
\82½
\81F
\81u
\93ð
\81C
\8bê
\82µ
\82Þ
\82ª
\82æ
\82¢
\81I
\81v",
950 pline("%s voice booms: \"How darest thou harm my servant!\"",
951 s_suffix(a_gname_at(ax, ay)));
953 pline("%s
\82Ì
\90º
\82ª
\8b¿
\82¢
\82½
\81F
\81u
\82í
\82ª
\89º
\96l
\82É
\8bê
\82µ
\82Þ
\82ª
\82æ
\82¢
\81I
\81v",
959 pline("%s roars: \"Thou dost profane my shrine!\"",
961 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",
966 buzz(-10 - (AD_ELEC - 1), 6, x, y, sgn(tbx),
967 sgn(tby)); /* bolt of lightning */
968 exercise(A_WIS, FALSE);
974 register struct monst *priest;
977 if ((priest = findpriest(temple_occupied(u.urooms))) != 0) {
978 struct epri *eprip = EPRI(priest);
980 wakeup(priest, FALSE);
981 setmangry(priest, FALSE);
983 * If the altar has been destroyed or converted, let the
985 * (When it's just a conversion and there happens to be
986 * a fresh corpse nearby, the priest ought to have an
987 * opportunity to try converting it back; maybe someday...)
989 lev = &levl[eprip->shrpos.x][eprip->shrpos.y];
990 if (!IS_ALTAR(lev->typ)
991 || ((aligntyp) Amask2align(lev->altarmask & AM_MASK)
992 != eprip->shralign)) {
995 priest->ispriest = 0; /* now a roaming minion */
996 priest->isminion = 1;
997 EMIN(priest)->min_align = eprip->shralign;
998 EMIN(priest)->renegade = FALSE;
999 /* discard priest's memory of his former shrine;
1000 if we ever implement the re-conversion mentioned
1001 above, this will need to be removed */
1008 * When saving bones, find priests that aren't on their shrine level,
1009 * and remove them. This avoids big problems when restoring bones.
1010 * [Perhaps we should convert them into roamers instead?]
1017 for (mtmp = fmon; mtmp; mtmp = mtmp->nmon) {
1018 if (DEADMONSTER(mtmp))
1020 if (mtmp->ispriest && !on_level(&(EPRI(mtmp)->shrlevel), &u.uz))
1025 /* munge priest-specific structure when restoring -dlc */
1027 restpriest(mtmp, ghostly)
1028 register struct monst *mtmp;
1033 assign_level(&(EPRI(mtmp)->shrlevel), &u.uz);
1038 * align_str(), piousness(), mstatusline() and ustatusline() used to be
1039 * in pline.c, presumeably because the latter two generate one line of
1040 * output. The USE_OLDARGS config gets warnings from 2016ish-vintage
1041 * gcc (for -Wint-to-pointer-cast, activated by -Wall or -W) when they
1042 * follow pline() itself. Fixing up the variadic calls like is done for
1043 * lev_comp would be needlessly messy there.
1045 * They don't belong here. If/when enlightenment ever gets split off
1046 * from cmd.c (which definitely doesn't belong there), they should go
1051 align_str(alignment)
1054 switch ((int) alignment) {
1064 return "
\92\86\97§";
1069 return "
\92\81\8f\98";
1082 /* used for self-probing */
1084 piousness(showneg, suffix)
1088 static char buf[32]; /* bigger than "insufficiently neutral" */
1091 /* note: piousness 20 matches MIN_QUEST_ALIGN (quest.h) */
1092 if (u.ualign.record >= 20)
1097 else if (u.ualign.record > 13)
1101 pio = "
\90M
\90S
\90[
\82¢";
1102 else if (u.ualign.record > 8)
1106 pio = "
\94M
\90S
\82È";
1107 else if (u.ualign.record > 3)
1111 pio = "
\91å
\82°
\82³
\82È";
1112 else if (u.ualign.record == 3)
1114 else if (u.ualign.record > 0)
1118 pio = "
\95s
\8a®
\91S
\82È";
1119 else if (u.ualign.record == 0)
1123 pio = "
\8c`
\82¾
\82¯
\82Ì";
1126 pio = "insufficiently";
1128 pio = "
\95s
\8f\
\95ª
\82È";
1129 else if (u.ualign.record >= -3)
1133 pio = "
\96À
\82¢
\82ð
\8e\9d\82Á
\82½";
1134 else if (u.ualign.record >= -8)
1138 pio = "
\8dß
\82ð
\95\89\82Á
\82½";
1141 pio = "transgressed";
1143 pio = "
\88í
\92E
\82µ
\82½";
1145 Sprintf(buf, "%s", pio);
1146 if (suffix && (!showneg || u.ualign.record >= 0)) {
1148 if (u.ualign.record != 3)
1151 Strcat(buf, suffix);
1156 /* stethoscope or probing applied to monster -- one-line feedback */
1161 aligntyp alignment = mon_aligntyp(mtmp);
1162 char info[BUFSZ], monnambuf[BUFSZ];
1167 Strcat(info, ", tame");
1169 Strcat(info, ",
\8e\94\82¢
\82È
\82ç
\82³
\82ê
\82Ä
\82¢
\82é");
1171 Sprintf(eos(info), " (%d", mtmp->mtame);
1172 if (!mtmp->isminion)
1173 Sprintf(eos(info), "; hungry %ld; apport %d",
1174 EDOG(mtmp)->hungrytime, EDOG(mtmp)->apport);
1177 } else if (mtmp->mpeaceful)
1179 Strcat(info, ", peaceful");
1181 Strcat(info, ",
\97F
\8dD
\93I");
1183 if (mtmp->data == &mons[PM_LONG_WORM]) {
1184 int segndx, nsegs = count_wsegs(mtmp);
1186 /* the worm code internals don't consider the head of be one of
1187 the worm's segments, but we count it as such when presenting
1188 worm feedback to the player */
1191 Strcat(info, ", single segment");
1193 Strcat(info, ",
\91S
\91Ì");
1195 ++nsegs; /* include head in the segment count */
1196 segndx = wseg_at(mtmp, bhitpos.x, bhitpos.y);
1198 Sprintf(eos(info), ", %d%s of %d segments",
1199 segndx, ordin(segndx), nsegs);
1201 Sprintf(eos(info), ", %d
\90ß
\82Ì
\82¤
\82¿%d
\94Ô
\96Ú",
1206 if (mtmp->cham >= LOW_PM && mtmp->data != &mons[mtmp->cham])
1207 /* don't reveal the innate form (chameleon, vampire, &c),
1208 just expose the fact that this current form isn't it */
1210 Strcat(info, ", shapechanger");
1212 Strcat(info, ",
\95Ï
\89»");
1213 /* pets eating mimic corpses mimic while eating, so this comes first */
1216 Strcat(info, ", eating");
1218 Strcat(info, ",
\90H
\8e\96\92\86");
1219 /* a stethoscope exposes mimic before getting here so this
1220 won't be relevant for it, but wand of probing doesn't */
1221 if (mtmp->mundetected || mtmp->m_ap_type)
1222 mhidden_description(mtmp, TRUE, eos(info));
1225 Strcat(info, ", cancelled");
1227 Strcat(info, ",
\96³
\97Í");
1230 Strcat(info, ", confused");
1232 Strcat(info, ",
\8d¬
\97\90\8fó
\91Ô");
1233 if (mtmp->mblinded || !mtmp->mcansee)
1235 Strcat(info, ", blind");
1237 Strcat(info, ",
\96Ó
\96Ú");
1240 Strcat(info, ", stunned");
1242 Strcat(info, ",
\82
\82ç
\82
\82ç
\8fó
\91Ô");
1243 if (mtmp->msleeping)
1245 Strcat(info, ", asleep");
1247 Strcat(info, ",
\90\87\96°
\8fó
\91Ô");
1248 #if 0 /* unfortunately mfrozen covers temporary sleep and being busy \
1249 (donning armor, for instance) as well as paralysis */
1250 else if (mtmp->mfrozen)
1251 Strcat(info, ", paralyzed");
1253 else if (mtmp->mfrozen || !mtmp->mcanmove)
1255 Strcat(info, ", can't move");
1257 Strcat(info, ",
\93®
\82¯
\82È
\82¢");
1259 /* [arbitrary reason why it isn't moving] */
1260 else if (mtmp->mstrategy & STRAT_WAITMASK)
1262 Strcat(info, ", meditating");
1264 Strcat(info, ",
\96»
\91z
\92\86");
1267 Strcat(info, ", scared");
1269 Strcat(info, ",
\8b¯
\82¦
\82Ä
\82¢
\82é");
1272 Strcat(info, ", trapped");
1274 Strcat(info, ", ã©
\82É
\82©
\82©
\82Á
\82Ä
\82¢
\82é");
1277 Strcat(info, (mtmp->mspeed == MFAST) ? ", fast"
1278 : (mtmp->mspeed == MSLOW) ? ", slow"
1281 Strcat(info, (mtmp->mspeed == MFAST) ? ",
\91f
\91\81\82¢"
1282 : (mtmp->mspeed == MSLOW) ? ",
\92x
\82¢"
1283 : ",
\91¬
\93x
\95s
\96¾");
1287 Strcat(info, ", invisible");
1289 Strcat(info, ",
\95s
\89Â
\8e\8b");
1290 if (mtmp == u.ustuck)
1292 Strcat(info, sticks(youmonst.data) ? ", held by you"
1293 : !u.uswallow ? ", holding you"
1294 : attacktype_fordmg(u.ustuck->data, AT_ENGL, AD_DGST)
1296 : is_animal(u.ustuck->data) ? ", swallowing you"
1297 : ", engulfing you");
1299 Strcat(info, sticks(youmonst.data) ? ",
\82 \82È
\82½
\82ª
\92Í
\82Ü
\82¦
\82Ä
\82¢
\82é"
1300 : !u.uswallow ? ",
\92Í
\82Ü
\82¦
\82Ä
\82¢
\82é"
1301 : attacktype_fordmg(u.ustuck->data, AT_ENGL, AD_DGST)
1302 ? ",
\8fÁ
\89»
\82µ
\82Ä
\82¢
\82é"
1303 : is_animal(u.ustuck->data) ? ",
\88ù
\82Ý
\8d\9e\82ñ
\82Å
\82¢
\82é"
1304 : ",
\8aª
\82«
\8d\9e\82ñ
\82Å
\82¢
\82é");
1306 if (mtmp == u.usteed)
1308 Strcat(info, ", carrying you");
1310 Strcat(info, ",
\82 \82È
\82½
\82ð
\8fæ
\82¹
\82Ä
\82¢
\82é");
1312 /* avoid "Status of the invisible newt ..., invisible" */
1313 /* and unlike a normal mon_nam, use "saddled" even if it has a name */
1314 Strcpy(monnambuf, x_monnam(mtmp, ARTICLE_THE, (char *) 0,
1315 (SUPPRESS_IT | SUPPRESS_INVISIBLE), FALSE));
1318 pline("Status of %s (%s): Level %d HP %d(%d) AC %d%s.", monnambuf,
1320 pline("%s
\82Ì
\8fó
\91Ô (%s)
\81F Level %d HP %d(%d) AC %d%s", monnambuf,
1321 align_str(alignment), mtmp->m_lev, mtmp->mhp, mtmp->mhpmax,
1322 find_mac(mtmp), info);
1325 /* stethoscope or probing applied to hero -- one-line feedback */
1334 Strcat(info, ", dying from");
1335 if (u.usick_type & SICK_VOMITABLE)
1336 Strcat(info, " food poisoning");
1337 if (u.usick_type & SICK_NONVOMITABLE) {
1338 if (u.usick_type & SICK_VOMITABLE)
1339 Strcat(info, " and");
1340 Strcat(info, " illness");
1344 if (u.usick_type & SICK_VOMITABLE)
1345 Strcat(info, "
\90H
\92\86\93Å");
1346 if (u.usick_type & SICK_NONVOMITABLE) {
1347 if (u.usick_type & SICK_VOMITABLE)
1348 Strcat(info, "
\82Æ");
1349 Strcat(info, "
\95a
\8bC");
1351 Strcat(info, "
\82Å
\8e\80\82É
\82Â
\82Â
\82 \82é");
1356 Strcat(info, ", solidifying");
1358 Strcat(info, ",
\90Î
\89»
\82µ
\82Â
\82Â
\82 \82é");
1361 Strcat(info, ", becoming slimy");
1363 Strcat(info, ",
\83X
\83\89\83C
\83\80\82É
\82È
\82è
\82Â
\82Â
\82 \82é");
1366 Strcat(info, ", being strangled");
1368 Strcat(info, ",
\8eñ
\82ð
\8di
\82ß
\82ç
\82ê
\82Ä
\82¢
\82é");
1371 Strcat(info, ", nauseated"); /* !"nauseous" */
1373 Strcat(info, ",
\93f
\82«
\8bC
\82ª
\82·
\82é");
1377 Strcat(info, ", confused");
1379 Strcat(info, ",
\8d¬
\97\90\8fó
\91Ô");
1382 Strcat(info, ", blind");
1384 if ((long) u.ucreamed < Blinded || Blindfolded
1385 || !haseyes(youmonst.data))
1386 Strcat(info, ", cover");
1387 Strcat(info, "ed by sticky goop");
1388 } /* note: "goop" == "glop"; variation is intentional */
1392 Strcat(info, "
\82Ë
\82Î
\82Ë
\82Î
\82×
\82Æ
\82Â
\82
\82à
\82Ì
\82Å");
1393 if ((long)u.ucreamed < Blinded || Blindfolded
1394 || !haseyes(youmonst.data))
1395 Strcat(info, "
\95¢
\82í
\82ê
\82Ä");
1397 Strcat(info, "
\96Ó
\96Ú
\8fó
\91Ô");
1402 Strcat(info, ", stunned");
1404 Strcat(info, ",
\82
\82ç
\82
\82ç
\8fó
\91Ô");
1405 if (!u.usteed && Wounded_legs) {
1406 const char *what = body_part(LEG);
1407 if ((Wounded_legs & BOTH_SIDES) == BOTH_SIDES)
1408 what = makeplural(what);
1410 Sprintf(eos(info), ", injured %s", what);
1412 Sprintf(eos(info), ", %s
\82É
\82¯
\82ª
\82ð
\82µ
\82Ä
\82¢
\82é", what);
1416 Sprintf(eos(info), ", slippery %s", makeplural(body_part(HAND)));
1418 Sprintf(eos(info), ", %s
\82ª
\82Ê
\82é
\82Ê
\82é", makeplural(body_part(HAND)));
1421 Strcat(info, ", trapped");
1423 Strcat(info, ", ã©
\82É
\82©
\82©
\82Á
\82Ä
\82¢
\82é");
1426 Strcat(info, Very_fast ? ", very fast" : ", fast");
1428 Strcat(info, Very_fast ? ",
\82Æ
\82Ä
\82à
\91f
\91\81\82¢" : ",
\91f
\91\81\82¢");
1431 Strcat(info, ", concealed");
1433 Strcat(info, ",
\89B
\82ê
\82Ä
\82¢
\82é");
1436 Strcat(info, ", invisible");
1438 Strcat(info, ",
\95s
\89Â
\8e\8b");
1441 if (sticks(youmonst.data))
1442 Strcat(info, ", holding ");
1444 Strcat(info, ", held by ");
1445 Strcat(info, mon_nam(u.ustuck));
1448 Strcat(info, mon_nam(u.ustuck));
1449 if (sticks(youmonst.data))
1450 Strcat(info, "
\82ð
\92Í
\82Ü
\82¦
\82Ä
\82¢
\82é");
1452 Strcat(info, "
\82É
\92Í
\82Ü
\82¦
\82ç
\82ê
\82Ä
\82¢
\82é");
1457 pline("Status of %s (%s): Level %d HP %d(%d) AC %d%s.", plname,
1459 pline("%s
\82Ì
\8fó
\91Ô (%s)
\81F Level %d HP %d(%d) AC %d%s", plname,
1460 piousness(FALSE, align_str(u.ualign.type)),
1461 Upolyd ? mons[u.umonnum].mlevel : u.ulevel, Upolyd ? u.mh : u.uhp,
1462 Upolyd ? u.mhmax : u.uhpmax, u.uac, info);