Source:NetHack 3.0.0/priest.c

Below is the full text to priest.c from the source code of NetHack 3.0.0. To link to a particular line, write [[NetHack 3.0.0/priest.c#line123 ]], for example.

Warning! This is the source code from an old release. For the latest release, see Source code

1.   /*	SCCS Id: @(#)priest.c	3.0	89/06/26 2.   /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ 3.    /* Copyright (c) Izchak Miller, Steve Linhart, 1989. */ 4.    /* NetHack may be freely redistributed. See license for details. */ 5.     6.    /* block some unused #defines to avoid overloading some cpp's */ 7.   #define MONATTK_H 8.   #include "hack.h"  9.    #include "mfndpos.h"  10. #include "eshk.h" 11. #include "epri.h" 12. 13.  /* used for the insides of shk_move and pri_move */ 14.  int 15.  move_special(mtmp,monroom,appr,uondoor,avoid,omx,omy,gx,gy) 16.  register struct monst *mtmp; 17.  schar monroom,appr; 18.  boolean uondoor,avoid; 19.  register xchar omx,omy,gx,gy; 20.  {  21.   	register xchar nx,ny,nix,niy; 22.  	register schar i;  23. schar chcnt,cnt; 24.  	coord poss[9]; 25.  	long info[9]; 26.  	long allowflags; 27.  	struct obj *ib = 0; 28.   29.   	if(omx == gx && omy == gy) 30.  		return(0); 31.  	if(mtmp->mconf) { 32.  		avoid = FALSE; 33.  		appr = 0; 34.  	}  35.    36.   	nix = omx; 37.  	niy = omy; 38.  	if (mtmp->isshk) allowflags = ALLOW_SSM; 39.  	else allowflags = ALLOW_SSM | ALLOW_SANCT; 40.  	if (passes_walls(mtmp->data)) allowflags |= (ALLOW_ROCK|ALLOW_WALL); 41.  	if (throws_rocks(mtmp->data)) allowflags |= ALLOW_ROCK; 42.  	if (tunnels(mtmp->data) &&  43.   		    (!needspick(mtmp->data) || m_carrying(mtmp, PICK_AXE))) 44.  		allowflags |= ALLOW_DIG; 45.  	cnt = mfndpos(mtmp, poss, info, allowflags); 46.  	if (allowflags & ALLOW_DIG) if(!mdig_tunnel(mtmp)) return(-2); 47.   48.   	if(mtmp->isshk && avoid && uondoor) { /* perhaps we cannot avoid him */ 49.  		for(i=0; iispriest && 63.  			    levl[nx][ny].typ == ALTAR) ||  64.   #endif  65.   			(mtmp->isshk && 66.  			    (monroom != ESHK(mtmp)->shoproom  67.   			    || ESHK(mtmp)->following))) { 68.  		    if(avoid && (info[i] & NOTONL)) 69.  			continue; 70.  		    if((!appr && !rn2(++chcnt)) ||  71.   			(appr && GDIST(nx,ny) < GDIST(nix,niy))) { 72.  			    nix = nx; 73.  			    niy = ny; 74.  		    }  75.   		}  76.   	}  77.   #if defined(ALTARS) && defined(THEOLOGY) 78.  	if(mtmp->ispriest && avoid &&  79.   			nix == omx && niy == omy && online(omx,omy)) { 80.  		/* might as well move closer as long it's going to stay 81.  		 * lined up */ 82.  		avoid = FALSE; 83.  		goto pick_move; 84.  	}  85.   #endif 86.   87.   	if(nix != omx || niy != omy) { 88.  		levl[omx][omy].mmask = 0; 89.  		levl[nix][niy].mmask = 1; 90.  		mtmp->mx = nix; 91.  		mtmp->my = niy; 92.  		pmon(mtmp); 93.  		if(ib) { 94.  			if (cansee(mtmp->mx,mtmp->my)) 95.  			    pline("%s picks up %s.", Monnam(mtmp),  96.   				distant_name(ib,doname)); 97.  			freeobj(ib); 98.  			mpickobj(mtmp, ib); 99.  		}  100.  		return(1); 101. 	}  102.  	return(0); 103. }  104.   105.  #if defined(ALTARS) && defined(THEOLOGY) 106.  107.  struct mkroom * 108. in_temple(x, y)  109. register int x, y; 110. { 111.  	register int roomno = inroom(x, y); 112.  113.  	if (roomno < 0 || rooms[roomno].rtype != TEMPLE) return(FALSE); 114. 	return(&rooms[roomno]); 115. }  116.   117.  static boolean 118. histemple_at(priest, x, y)  119. register struct monst *priest; 120. register int x, y;  121. { 122.  	return(EPRI(priest)->shroom == inroom(x, y) &&  123.  	       EPRI(priest)->shrlevel == dlevel); 124. }  125.   126.  /*  127.   * pri_move: return 1: he moved  0: he didn't  -1: let m_move do it  -2: died 128.  */  129.  int 130. pri_move(priest) 131. register struct monst *priest; 132. {  133.  	register xchar gx,gy,omx,omy; 134. 	schar temple; 135. 	boolean avoid = TRUE; 136.  137.  	omx = priest->mx; 138. 	omy = priest->my; 139.  140.  	if(!histemple_at(priest, omx, omy)) return(-1); 141.  142.  	temple = EPRI(priest)->shroom; 143. 	  144.  	gx = EPRI(priest)->shrpos.x;  145. gy = EPRI(priest)->shrpos.y; 146. 147. 	gx += rn1(3,-1);	/* mill around the altar */ 148. 	gy += rn1(3,-1); 149.  150.  	if(!priest->mpeaceful) { 151. 		if(dist(omx,omy) < 3) { 152. 			if(Displaced) 153. 				Your("displaced image doesn't fool %s!",  154.  					mon_nam(priest)); 155. 			(void) mattacku(priest); 156. 			return(0); 157. 		} else if(temple == inroom(u.ux,u.uy)) { 158. 			/* don't chase player outside temple */ 159. 			long saveBlind = Blinded; 160. 			struct obj *saveUblindf = ublindf; 161. 			Blinded = 0; 162. 			ublindf = (struct obj *)0; 163. 			if(priest->mcansee && !Invis && cansee(omx,omy)) { 164. 				gx = u.ux; 165. 				gy = u.uy; 166. 			}  167.  			Blinded = saveBlind; 168. 			ublindf = saveUblindf; 169. 			avoid = FALSE; 170. 		}  171.  	} else if(Invis) avoid = FALSE; 172. 	  173.  	return(move_special(priest,temple,TRUE,FALSE,avoid,omx,omy,gx,gy)); 174. }  175.   176.  /* exclusevely for mktemple */ 177. void 178. priestini(lvl, sx, sy, align) 179. register int lvl, sx, sy, align; 180. {  181.  	register struct monst *priest; 182. 	register struct obj *otmp = (struct obj *)0; 183. #ifdef SPELLS 184. 	register int cnt; 185. #endif 186.  187.  	if (priest = makemon(&mons[!rn2(2) ? PM_TEMPLE_PRIEST : 188. 			PM_TEMPLE_PRIESTESS], sx+1, sy)) { 189. 		EPRI(priest)->shroom = inroom(sx, sy); 190. 		EPRI(priest)->shralign = align; 191. 		EPRI(priest)->shrpos.x = sx; 192. 		EPRI(priest)->shrpos.y = sy; 193. 		EPRI(priest)->shrlevel = lvl; 194. 		EPRI(priest)->ismale = 195. 				(priest->data == &mons[PM_TEMPLE_PRIEST]); 196. 		Strcpy(EPRI(priest)->deitynam, a_gname_at(sx, sy)); 197. 		priest->mtrapseen = ~0;	/* traps are known */ 198. 		priest->mpeaceful = 1; 199. 		priest->ispriest = 1; 200. 		priest->msleep = 0; 201.  202.  		/* now his/her goodies... */ 203.  		(void) mongets(priest, CHAIN_MAIL); 204. 		(void) mongets(priest, SMALL_SHIELD); 205.  206.  		/* Do NOT put the rest in m_initinv. */ 207.  		/* Priests created elsewhere than in a  */ 208. 		/* temple should not carry these items, */ 209. 		/* except for the mace. */ 210.  #ifdef SPELLS 211. 		cnt = rn1(2,3); 212. 		while(cnt) { 213. 		    otmp = mkobj(SPBOOK_SYM, FALSE); 214. 		    if(otmp) mpickobj(priest, otmp); 215. 		    cnt--; 216. 		}  217.  #endif 218. 		if(p_coaligned(priest)) { 219. 		    (void) mongets(priest, rn2(2) ? CLOAK_OF_PROTECTION  220.  						  : CLOAK_OF_MAGIC_RESISTANCE); 221. #ifdef NAMED_ITEMS 222. 		    otmp = mk_aligned_artifact(EPRI(priest)->shralign); 223. 		    if(otmp) { 224. 			otmp->spe = rnd(4); 225. 			mpickobj(priest, otmp); 226. 		    }  227.  #endif 228. 		} else { 229. 		    if(!rn2(5)) 230. 			otmp = mksobj(CLOAK_OF_MAGIC_RESISTANCE, FALSE); 231. 		    else otmp = mksobj(CLOAK_OF_PROTECTION, FALSE); 232. 		    if(otmp) { 233. 			if(!rn2(2)) curse(otmp); 234. 			mpickobj(priest, otmp); 235. 		    }  236.  		    otmp = mksobj(MACE, FALSE); 237. 		    if(otmp) { 238. 			otmp->spe = rnd(3); 239. 			if(!rn2(2)) curse(otmp); 240. 			mpickobj(priest, otmp); 241. 		    }  242.  		}  243.  	}  244.  }  245.   246.  char * 247. priestname(priest) 248. register struct monst *priest; 249. {  250.  	static char pname[PL_NSIZ]; 251.  252.  	Strcpy(pname, "the "); 253. 	if(priest->minvis) Strcat(pname, "invisible "); 254. 	if(priest->data != &mons[PM_TEMPLE_PRIEST] &&  255.  			priest->data != &mons[PM_TEMPLE_PRIESTESS]) { 256. 		Strcat(pname, priest->data->mname); 257. 		Strcat(pname, " "); 258. 	}  259.  	if(EPRI(priest)->ismale) 260. 		Strcat(pname, "priest of "); 261. 	else 	Strcat(pname, "priestess of "); 262. 	Strcat(pname, EPRI(priest)->deitynam); 263. 	return(pname); 264. }  265.   266.  boolean 267. p_coaligned(priest) 268. struct monst *priest; 269. {  270.  	return(!strcmp(u_gname, EPRI(priest)->deitynam)); 271. }  272.   273.  static int 274. t_alignment(troom) 275. struct mkroom *troom; 276. {  277.  	int x, y;  278. 279. 	shrine_pos(&x,&y,troom); 280.  281.  	if(IS_ALTAR(levl[x][y].typ) && (levl[x][y].altarmask & A_SHRINE) != 0) 282. 		return(levl[x][y].altarmask & ~A_SHRINE); 283. 	return(-2); /* arbitrary non-alignment type value */ 284. }  285.   286.  static boolean 287. is_shrined(troom) 288. struct mkroom *troom; 289. {  290.  	int x, y;  291. 292. 	shrine_pos(&x,&y,troom); 293.  294.  	if(IS_ALTAR(levl[x][y].typ) && (levl[x][y].altarmask & A_SHRINE) != 0) 295. 		return(TRUE); 296. 	return(FALSE); 297. }  298.   299.  static boolean 300. t_coaligned(troom) 301. struct mkroom *troom; 302. {  303.  	return(t_alignment(troom) == u.ualigntyp + 1); 304. }  305.   306.  struct monst * 307. findpriest(troom) 308. struct mkroom *troom; 309. {  310.  	register struct monst *mtmp; 311.  312.  	for(mtmp = fmon; mtmp; mtmp = mtmp->nmon) 313. 	    if(mtmp->ispriest && histemple_at(mtmp,mtmp->mx,mtmp->my)  314.  			&& &rooms[EPRI(mtmp)->shroom] == troom) 315. 		return(mtmp); 316. 	return (struct monst *)0; 317. }  318.   319.  static boolean 320. p_inhistemple(troom) 321. struct mkroom *troom; 322. {  323.  	register struct monst *priest; 324.  325.  	priest = findpriest(troom); 326. 	if(priest) return(TRUE); 327. 	return(FALSE); 328. }  329.   330.  void 331. intemple { 332. 	register struct mkroom *troom; 333.  334.  	if(troom = in_temple(u.ux, u.uy)) { 335. 	    boolean shrined = is_shrined(troom); 336. 	    boolean tended = p_inhistemple(troom); 337.  338.  	    if(!in_temple(u.ux0, u.uy0)) { 339. 		pline("Pilgrim, you enter a%s place!",  340.  			(!(shrined || tended) ? " desecrated and deserted" : 341. 			 !shrined ? " desecrated" : 342. 			 !tended ? "n untended sacred" : 343. 			  " sacred")); 344. 		if(!t_coaligned(troom) || u.ualign < -5 || !shrined || !tended) 345. 		    You("have a%s forbidding feeling...",  346.  				(!shrined || !tended) ? "" :  347.  				 " strange"); 348. 		else You("experience a strange sense of peace."); 349. 	    } else if(!(shrined || tended) && !rn2(5)) { 350. 		switch(rn2(3)) { 351. 		    case 0: You("have an eerie feeling..."); break; 352. 		    case 1: You("feel like you are being watched."); break; 353. 		    default: pline("A shiver runs down your spine."); break; 354. 		}  355.  		if(!rn2(5)) { 356. 		    struct monst *mtmp; 357.  358.  		    if(!(mtmp = makemon(&mons[PM_GHOST],u.ux,u.uy))) return; 359. 		    pline("An enormous ghost appears next to you!"); 360. 		    mnexto(mtmp); 361. 		    mtmp->mpeaceful = 0; 362. 		    if(flags.verbose) 363. 		        You("are frightened to death, and unable to move."); 364. 		    nomul(-3); 365. 		    nomovemsg = "You regain your composure."; 366. 		}  367.  	    }  368.  	}  369.  }  370.   371.  void 372. priest_talk(priest) 373. register struct monst *priest; 374. {  375.  	boolean coaligned = p_coaligned(priest); 376. 	boolean strayed = (u.ualign < 0); 377.   378.  	if(priest->mflee) { 379. 	    kludge("%s doesn't want anything to do with you!",  380.  				Monnam(priest)); 381. 	    priest->mtame = priest->mpeaceful = 0; 382. 	    return; 383. 	}  384.   385.  	/* priests don't chat unless peaceful and in their own temple */ 386. 	if(!histemple_at(priest,priest->mx,priest->my) || priest->mtame ||  387.  		 !priest->mpeaceful || priest->mfroz || priest->msleep) { 388.             if(priest->mfroz || priest->msleep) { 389. 	        kludge("%s breaks out of his reverie!", Monnam(priest)); 390.                 priest->mfroz = priest->msleep = 0; 391. 	    }  392.  	    /* The following is now impossible according to monst.c, */ 393. 	    /* but it should stay just in case we change the latter. */ 394.  	    if(priest->mtame) 395. 		kludge("%s breaks out of your taming spell!", Monnam(priest)); 396. 	    priest->mtame = priest->mpeaceful = 0; 397. 	    switch(rn2(3)) { 398. 	        case 0: 399. 		   verbalize("Thou wouldst have words, eh?  I'll give thee a word or two!"); 400. 		   break; 401. 	        case 1: 402. 		   verbalize("Talk?  Here is what I have to say!"); 403. 		   break; 404. 	        default: 405. 		   verbalize("Pilgrim, I have lost mine desire to talk."); 406. 		   break; 407. 	    }  408.  	    return; 409. 	}  410.   411.  	/* he desecrated the temple and now he wants to chat? */ 412.  	if(!is_shrined(&rooms[inroom(priest->mx, priest->my)])  413.  		&& priest->mpeaceful) { 414. 	    verbalize("Begone!  Thou desecratest this holy place with thy presence."); 415. 	    priest->mpeaceful = 0; 416. 	    return; 417. 	}  418.   419.  	if(!u.ugold) { 420. 	    if(coaligned && !strayed) { 421. 	        kludge("%s gives you two bits for an ale.", Monnam(priest)); 422. 	        u.ugold = 2L; 423. 		if (priest->mgold) priest->mgold -= 2L; 424. 	    } else 425. 		kludge("%s is not interested.", Monnam(priest)); 426. 	    return; 427. 	} else { 428. 	    long offer; 429.  430.  	    kludge("%s asks you for a contribution for the temple.",  431.  			Monnam(priest)); 432. 	    if((offer = bribe(priest)) == 0) { 433. 		verbalize("Thou shalt regret thine action!"); 434. 		if(coaligned) u.ualign--; 435. 	    } else if(offer < (u.ulevel * 200)) { 436. 		if(u.ugold > (offer * 2L)) verbalize("Cheapskate."); 437. 		else { 438. 		    verbalize("I thank thee for thy contribution."); 439. 		    /*  give player some token  */ 440. 		}  441.  	    } else if(offer < (u.ulevel * 400)) { 442. 		verbalize("Thou art indeed a pious individual."); 443. 		if(u.ugold < (offer * 2L)) { 444. 		    if(coaligned && u.ualign < -5) u.ualign++; 445. 		    verbalize("I bestow upon thee a blessing."); 446. 		    Clairvoyant += rn1(500,500); 447. 		}  448.  	    } else if(offer < (u.ulevel * 600)) { 449. 		verbalize("Thy devotion has been rewarded."); 450. 		if (!(Protection & INTRINSIC))  { 451. 			Protection |= INTRINSIC; 452. 			if (!u.ublessed)  u.ublessed = rnd(3) + 1; 453. 		} else u.ublessed++; 454. 	    } else { 455. 		verbalize("Thy selfless generosity is deeply appreciated."); 456. 		if(u.ugold < (offer * 2L) && coaligned) { 457. 		    if(strayed && (moves - u.ucleansed) > 5000L) { 458. 			u.ualign = 0; /* cleanse him */ 459. 			u.ucleansed = moves; 460. 		    } else { 461. 		        u.ualign += 2; 462. 		    }  463.  		}  464.  	    }  465.  	}  466.  }  467.   468.  boolean 469. u_in_sanctuary(troom) 470. register struct mkroom *troom; 471. {  472.  	register struct mkroom *troom2; 473.  474.  	troom2 = in_temple(u.ux, u.uy); 475.  476.  	return(troom && troom2 && troom == troom2 && is_shrined(troom2) &&  477.  			t_coaligned(troom2) && u.ualign > -5); 478. }  479.   480.  void 481. ghod_hitsu 	/* when attacking a priest in his temple */ 482. {  483.  	int x, y, ax, ay; 484. 	struct monst *priest; 485. 	struct mkroom *troom = in_temple(u.ux, u.uy); 486.  487.  	if(!troom || !is_shrined(troom)) return; 488.  489.  	/* shrine converted by human sacrifice */ 490. 	if((priest = findpriest(troom)) &&  491.  	    strcmp(EPRI(priest)->deitynam, 492. 		a_gname_at(EPRI(priest)->shrpos.x, EPRI(priest)->shrpos.y))) 493. 		    return; 494.  495.  	shrine_pos(&x,&y,troom); 496. 	ax = x;  497. ay = y; 498. 499. 	if((u.ux == x && u.uy == y) || !linedup(u.ux, u.uy, x, y)) { 500. 	    if(IS_DOOR(levl[u.ux][u.uy].typ)) { 501. 		if(u.ux == troom->lx - 1) { 502. 		    x = troom->hx; 503. 		    y = u.uy; 504. 		} else if(u.ux == troom->hx + 1) { 505. 		    x = troom->lx; 506. 		    y = u.uy; 507. 		} else if(u.uy == troom->ly - 1) { 508. 		    x = u.ux; 509. 		    y = troom->hy; 510. 		} else if(u.uy == troom->hy + 1) { 511. 		    x = u.ux; 512. 		    y = troom->ly; 513. 		}  514.  	    } else { 515. 		switch(rn2(4)) { 516. 		case 0:  x = u.ux; y = troom->ly; break; 517. 		case 1:  x = u.ux; y = troom->hy; break; 518. 		case 2:  x = troom->lx; y = u.uy; break; 519. 		default: x = troom->hx; y = u.uy; break; 520. 		}  521.  	    }  522.  	    if(!linedup(u.ux, u.uy, x, y)) return; 523. 	}  524.   525.  	switch(rn2(3)) { 526. 	case 0: 527. 	    pline("%s roars in anger:  \"Thou shalt suffer!\"",  528.  			a_gname_at(ax, ay)); 529. 	    break; 530. 	case 1: 531. 	    pline("%s's voice booms:  \"How darest thou harm my servant!\"",  532.  			a_gname_at(ax, ay)); 533. 	    break; 534. 	default: 535. 	    pline("%s roars:  \"Thou dost profane my shrine!\"",  536.  			a_gname_at(ax, ay)); 537. 	    break; 538. 	}  539.   540.  	buzz(-15, 6, x, y, sgn(tbx), sgn(tby)); /* -15: bolt of lightning */ 541. }  542.   543.  void 544. angry_priest 545. {  546.  	register struct monst *priest; 547.  548.  	if(!(priest = findpriest(in_temple(u.ux, u.uy)))) return; 549. 	wakeup(priest); 550. }  551.  #endif /* ALTARS && THEOLOGY */