Source:Makemon.c

Below is the full text to src/makemon.c from NetHack 3.4.3. To link to a particular line, write [[makemon.c#line123 ]], for example. 1.   /*	SCCS Id: @(#)makemon.c	3.4	2003/09/06	*/ 2.   /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ 3.    /* NetHack may be freely redistributed. See license for details. */ 4.

5.   #include "hack.h"  6.    #include "epri.h"  7.    #include "emin.h"  8.    #include "edog.h"  9.    #ifdef REINCARNATION 10.  #include   11. #endif 12.   13.   STATIC_VAR NEARDATA struct monst zeromonst; 14.   15.   /* this assumes that a human quest leader or nemesis is an archetype 16.     of the corresponding role; that isn't so for some roles (tourist  17.      for instance) but is for the priests and monks we use it for... */ 18.   #define quest_mon_represents_role(mptr,role_pm) \ 19.  		(mptr->mlet == S_HUMAN && Role_if(role_pm) && \  20.   		  (mptr->msound == MS_LEADER || mptr->msound == MS_NEMESIS)) 21.   22.   #ifdef OVL0 23.  STATIC_DCL boolean FDECL(uncommon, (int)); 24.  STATIC_DCL int FDECL(align_shift, (struct permonst *)); 25.  #endif /* OVL0 */ 26.  STATIC_DCL boolean FDECL(wrong_elem_type, (struct permonst *)); 27.  STATIC_DCL void FDECL(m_initgrp,(struct monst *,int,int,int)); 28.  STATIC_DCL void FDECL(m_initthrow,(struct monst *,int,int)); 29.  STATIC_DCL void FDECL(m_initweap,(struct monst *)); 30.  #ifdef OVL1 31.  STATIC_DCL void FDECL(m_initinv,(struct monst *)); 32.  #endif /* OVL1 */ 33.   34.   extern const int monstr[]; 35.   36.   #define m_initsgrp(mtmp, x, y)	m_initgrp(mtmp, x, y, 3) 37.  #define m_initlgrp(mtmp, x, y)	m_initgrp(mtmp, x, y, 10) 38.  #define toostrong(monindx, lev) (monstr[monindx] > lev) 39.  #define tooweak(monindx, lev)	(monstr[monindx] < lev) 40.   41.   #ifdef OVLB 42.  boolean 43.  is_home_elemental(ptr) 44.  register struct permonst *ptr; 45.  {  46.   	if (ptr->mlet == S_ELEMENTAL) 47.  	    switch (monsndx(ptr)) { 48.  		case PM_AIR_ELEMENTAL: return Is_airlevel(&u.uz); 49.  		case PM_FIRE_ELEMENTAL: return Is_firelevel(&u.uz); 50.  		case PM_EARTH_ELEMENTAL: return Is_earthlevel(&u.uz); 51.  		case PM_WATER_ELEMENTAL: return Is_waterlevel(&u.uz); 52.  	    }  53.   	return FALSE; 54.  }  55.    56.   /*  57.    * Return true if the given monster cannot exist on this elemental level. 58.   */  59.   STATIC_OVL boolean 60.  wrong_elem_type(ptr) 61.      register struct permonst *ptr; 62.  {  63.       if (ptr->mlet == S_ELEMENTAL) { 64.  	return((boolean)(!is_home_elemental(ptr))); 65.      } else if (Is_earthlevel(&u.uz)) { 66.  	/* no restrictions? */ 67.       } else if (Is_waterlevel(&u.uz)) { 68.  	/* just monsters that can swim */ 69.  	if(!is_swimmer(ptr)) return TRUE; 70.      } else if (Is_firelevel(&u.uz)) { 71.  	if (!pm_resistance(ptr,MR_FIRE)) return TRUE; 72.      } else if (Is_airlevel(&u.uz)) { 73.  	if(!(is_flyer(ptr) && ptr->mlet != S_TRAPPER) && !is_floater(ptr)  74.   	   && !amorphous(ptr) && !noncorporeal(ptr) && !is_whirly(ptr)) 75.  	    return TRUE; 76.      }  77.       return FALSE; 78.  }  79.    80.   STATIC_OVL void 81.  m_initgrp(mtmp, x, y, n)	/* make a group just like mtmp */ 82.  register struct monst *mtmp; 83.  register int x, y, n;  84. { 85.   	coord mm; 86.  	register int cnt = rnd(n); 87.  	struct monst *mon; 88.  #if defined(__GNUC__) && (defined(HPUX) || defined(DGUX)) 89.  	/* There is an unresolved problem with several people finding that 90.  	 * the game hangs eating CPU; if interrupted and restored, the level 91.  	 * will be filled with monsters. Of those reports giving system type, 92.  	 * there were two DG/UX and two HP-UX, all using gcc as the compiler. 93.  	 * hcroft@hpopb1.cern.ch, using gcc 2.6.3 on HP-UX, says that the 94.  	 * problem went away for him and another reporter-to-newsgroup 95.  	 * after adding this debugging code. This has almost got to be a 96. * compiler bug, but until somebody tracks it down and gets it fixed, 97.  	 * might as well go with the "but it went away when I tried to find  98.   	 * it" code. 99.  	 */  100.  	int cnttmp,cntdiv; 101.  102.  	cnttmp = cnt; 103. # ifdef DEBUG 104. 	pline("init group call x=%d,y=%d,n=%d,cnt=%d.", x, y, n, cnt); 105. # endif 106. 	cntdiv = ((u.ulevel < 3) ? 4 : (u.ulevel < 5) ? 2 : 1); 107. #endif 108. 	/* Tuning: cut down on swarming at low character levels [mrs] */ 109. 	cnt /= (u.ulevel < 3) ? 4 : (u.ulevel < 5) ? 2 : 1; 110.  #if defined(__GNUC__) && (defined(HPUX) || defined(DGUX)) 111. 	if (cnt != (cnttmp/cntdiv)) { 112. 		pline("cnt=%d using %d, cnttmp=%d, cntdiv=%d", cnt,  113.  			(u.ulevel < 3) ? 4 : (u.ulevel < 5) ? 2 : 1,  114.  			cnttmp, cntdiv); 115. 	}  116.  #endif 117. 	if(!cnt) cnt++; 118. #if defined(__GNUC__) && (defined(HPUX) || defined(DGUX)) 119. 	if (cnt < 0) cnt = 1; 120. 	if (cnt > 10) cnt = 10; 121. #endif 122.  123.  	mm.x = x;  124. mm.y = y; 125. while(cnt--) { 126. 		if (peace_minded(mtmp->data)) continue; 127. 		/* Don't create groups of peaceful monsters since they'll get 128. 		 * in our way. If the monster has a percentage chance so some 129. 		 * are peaceful and some are not, the result will just be a  130. * smaller group. 131. 		 */  132.  		if (enexto(&mm, mm.x, mm.y, mtmp->data)) { 133. 		    mon = makemon(mtmp->data, mm.x, mm.y, NO_MM_FLAGS); 134. 		    mon->mpeaceful = FALSE; 135. 		    mon->mavenge = 0; 136. 		    set_malign(mon); 137. 		    /* Undo the second peace_minded check in makemon; if the 138. 		     * monster turned out to be peaceful the first time we  139. * didn't create it at all; we don't want a second check. 140. 		     */  141.  		}  142.  	}  143.  }  144.   145.  STATIC_OVL 146. void 147. m_initthrow(mtmp,otyp,oquan) 148. struct monst *mtmp; 149. int otyp,oquan; 150. {  151.  	register struct obj *otmp; 152.  153.  	otmp = mksobj(otyp, TRUE, FALSE); 154. 	otmp->quan = (long) rn1(oquan, 3); 155. 	otmp->owt = weight(otmp); 156. 	if (otyp == ORCISH_ARROW) otmp->opoisoned = TRUE; 157. 	(void) mpickobj(mtmp, otmp); 158. }  159.   160.  #endif /* OVLB */ 161. #ifdef OVL2 162.  163.  STATIC_OVL void 164. m_initweap(mtmp) 165. register struct monst *mtmp; 166. {  167.  	register struct permonst *ptr = mtmp->data; 168. 	register int mm = monsndx(ptr); 169. 	struct obj *otmp; 170.  171.  #ifdef REINCARNATION 172. 	if (Is_rogue_level(&u.uz)) return; 173. #endif 174. /*  175.   *	first a few special cases: 176.  *  177.   *		giants get a boulder to throw sometimes. 178.  *		ettins get clubs 179.  *		kobolds get darts to throw 180.  *		centaurs get some sort of bow & arrows or bolts 181.  *		soldiers get all sorts of things. 182.  *		kops get clubs & cream pies. 183.  */  184.  	switch (ptr->mlet) { 185. 	    case S_GIANT: 186. 		if (rn2(2)) (void)mongets(mtmp, (mm != PM_ETTIN) ?  187.  				    BOULDER : CLUB); 188. 		break; 189. 	    case S_HUMAN: 190. 		if(is_mercenary(ptr)) { 191. 		    int w1 = 0, w2 = 0; 192. 		    switch (mm) { 193.  194.  			case PM_WATCHMAN: 195. 			case PM_SOLDIER: 196. 			  if (!rn2(3)) { 197. 			      w1 = rn1(BEC_DE_CORBIN - PARTISAN + 1, PARTISAN); 198. 			      w2 = rn2(2) ? DAGGER : KNIFE; 199. 			  } else w1 = rn2(2) ? SPEAR : SHORT_SWORD; 200. 			  break; 201. 			case PM_SERGEANT: 202. 			  w1 = rn2(2) ? FLAIL : MACE; 203. 			  break; 204. 			case PM_LIEUTENANT: 205. 			  w1 = rn2(2) ? BROADSWORD : LONG_SWORD; 206. 			  break; 207. 			case PM_CAPTAIN: 208. 			case PM_WATCH_CAPTAIN: 209. 			  w1 = rn2(2) ? LONG_SWORD : SILVER_SABER; 210. 			  break; 211. 			default: 212. 			  if (!rn2(4)) w1 = DAGGER; 213. 			  if (!rn2(7)) w2 = SPEAR; 214. 			  break; 215. 		    }  216.  		    if (w1) (void)mongets(mtmp, w1); 217. 		    if (!w2 && w1 != DAGGER && !rn2(4)) w2 = KNIFE; 218. 		    if (w2) (void)mongets(mtmp, w2); 219. 		} else if (is_elf(ptr)) { 220. 		    if (rn2(2)) 221. 			(void) mongets(mtmp,  222.  				   rn2(2) ? ELVEN_MITHRIL_COAT : ELVEN_CLOAK); 223. 		    if (rn2(2)) (void)mongets(mtmp, ELVEN_LEATHER_HELM); 224. 		    else if (!rn2(4)) (void)mongets(mtmp, ELVEN_BOOTS); 225. 		    if (rn2(2)) (void)mongets(mtmp, ELVEN_DAGGER); 226. 		    switch (rn2(3)) { 227. 			case 0: 228. 			    if (!rn2(4)) (void)mongets(mtmp, ELVEN_SHIELD); 229. 			    if (rn2(3)) (void)mongets(mtmp, ELVEN_SHORT_SWORD); 230. 			    (void)mongets(mtmp, ELVEN_BOW); 231. 			    m_initthrow(mtmp, ELVEN_ARROW, 12); 232. 			    break; 233. 			case 1: 234. 			    (void)mongets(mtmp, ELVEN_BROADSWORD); 235. 			    if (rn2(2)) (void)mongets(mtmp, ELVEN_SHIELD); 236. 			    break; 237. 			case 2: 238. 			    if (rn2(2)) { 239. 				(void)mongets(mtmp, ELVEN_SPEAR); 240. 				(void)mongets(mtmp, ELVEN_SHIELD); 241. 			    }  242.  			    break; 243. 		    }  244.  		    if (mm == PM_ELVENKING) { 245. 			if (rn2(3) || (in_mklev && Is_earthlevel(&u.uz))) 246. 			    (void)mongets(mtmp, PICK_AXE); 247. 			if (!rn2(50)) (void)mongets(mtmp, CRYSTAL_BALL); 248. 		    }  249.  		} else if (ptr->msound == MS_PRIEST ||  250.  			quest_mon_represents_role(ptr,PM_PRIEST)) { 251. 		    otmp = mksobj(MACE, FALSE, FALSE); 252. 		    if(otmp) { 253. 			otmp->spe = rnd(3); 254. 			if(!rn2(2)) curse(otmp); 255. 			(void) mpickobj(mtmp, otmp); 256. 		    }  257.  		}  258.  		break; 259.  260.  	    case S_ANGEL: 261. 		{  262.  		    int spe2; 263.  264.  		    /* create minion stuff; can't use mongets */ 265. 		    otmp = mksobj(LONG_SWORD, FALSE, FALSE); 266.  267.  		    /* maybe make it special */ 268. 		    if (!rn2(20) || is_lord(ptr)) 269. 			otmp = oname(otmp, artiname( 270. 				rn2(2) ? ART_DEMONBANE : ART_SUNSWORD)); 271. 		    bless(otmp); 272. 		    otmp->oerodeproof = TRUE; 273. 		    spe2 = rn2(4); 274. 		    otmp->spe = max(otmp->spe, spe2); 275. 		    (void) mpickobj(mtmp, otmp); 276.  277.  		    otmp = mksobj(!rn2(4) || is_lord(ptr) ?  278.  				  SHIELD_OF_REFLECTION : LARGE_SHIELD,  279.  				  FALSE, FALSE); 280. 		    otmp->cursed = FALSE; 281. 		    otmp->oerodeproof = TRUE; 282. 		    otmp->spe = 0; 283. 		    (void) mpickobj(mtmp, otmp); 284. 		}  285.  		break; 286.  287.  	    case S_HUMANOID: 288. 		if (mm == PM_HOBBIT) { 289. 		    switch (rn2(3)) { 290. 			case 0: 291. 			    (void)mongets(mtmp, DAGGER); 292. 			    break; 293. 			case 1: 294. 			    (void)mongets(mtmp, ELVEN_DAGGER); 295. 			    break; 296. 			case 2: 297. 			    (void)mongets(mtmp, SLING); 298. 			    break; 299. 		      }  300.  		    if (!rn2(10)) (void)mongets(mtmp, ELVEN_MITHRIL_COAT); 301. 		    if (!rn2(10)) (void)mongets(mtmp, DWARVISH_CLOAK); 302. 		} else if (is_dwarf(ptr)) { 303. 		    if (rn2(7)) (void)mongets(mtmp, DWARVISH_CLOAK); 304. 		    if (rn2(7)) (void)mongets(mtmp, IRON_SHOES); 305. 		    if (!rn2(4)) { 306. 			(void)mongets(mtmp, DWARVISH_SHORT_SWORD); 307. 			/* note: you can't use a mattock with a shield */ 308. 			if (rn2(2)) (void)mongets(mtmp, DWARVISH_MATTOCK); 309. 			else { 310. 				(void)mongets(mtmp, AXE); 311. 				(void)mongets(mtmp, DWARVISH_ROUNDSHIELD); 312. 			}  313.  			(void)mongets(mtmp, DWARVISH_IRON_HELM); 314. 			if (!rn2(3)) 315. 			    (void)mongets(mtmp, DWARVISH_MITHRIL_COAT); 316. 		    } else { 317. 			(void)mongets(mtmp, !rn2(3) ? PICK_AXE : DAGGER); 318. 		    }  319.  		}  320.  		break; 321. # ifdef KOPS 322. 	    case S_KOP:		/* create Keystone Kops with cream pies to  323. * throw. As suggested by KAA. [MRS] 324. 				 */  325.  		if (!rn2(4)) m_initthrow(mtmp, CREAM_PIE, 2); 326. 		if (!rn2(3)) (void)mongets(mtmp,(rn2(2)) ? CLUB : RUBBER_HOSE); 327. 		break; 328. # endif 329. 	    case S_ORC: 330. 		if(rn2(2)) (void)mongets(mtmp, ORCISH_HELM); 331. 		switch (mm != PM_ORC_CAPTAIN ? mm :  332.  			rn2(2) ? PM_MORDOR_ORC : PM_URUK_HAI) { 333. 		    case PM_MORDOR_ORC: 334. 			if(!rn2(3)) (void)mongets(mtmp, SCIMITAR); 335. 			if(!rn2(3)) (void)mongets(mtmp, ORCISH_SHIELD); 336. 			if(!rn2(3)) (void)mongets(mtmp, KNIFE); 337. 			if(!rn2(3)) (void)mongets(mtmp, ORCISH_CHAIN_MAIL); 338. 			break; 339. 		    case PM_URUK_HAI: 340. 			if(!rn2(3)) (void)mongets(mtmp, ORCISH_CLOAK); 341. 			if(!rn2(3)) (void)mongets(mtmp, ORCISH_SHORT_SWORD); 342. 			if(!rn2(3)) (void)mongets(mtmp, IRON_SHOES); 343. 			if(!rn2(3)) { 344. 			    (void)mongets(mtmp, ORCISH_BOW); 345. 			    m_initthrow(mtmp, ORCISH_ARROW, 12); 346. 			}  347.  			if(!rn2(3)) (void)mongets(mtmp, URUK_HAI_SHIELD); 348. 			break; 349. 		    default: 350. 			if (mm != PM_ORC_SHAMAN && rn2(2)) 351. 			  (void)mongets(mtmp, (mm == PM_GOBLIN || rn2(2) == 0)  352.  						   ? ORCISH_DAGGER : SCIMITAR); 353. 		}  354.  		break; 355. 	    case S_OGRE: 356. 		if (!rn2(mm == PM_OGRE_KING ? 3 : mm == PM_OGRE_LORD ? 6 : 12)) 357.  		    (void) mongets(mtmp, BATTLE_AXE); 358. 		else 359. 		    (void) mongets(mtmp, CLUB); 360. 		break; 361. 	    case S_TROLL: 362. 		if (!rn2(2)) switch (rn2(4)) { 363. 		    case 0: (void)mongets(mtmp, RANSEUR); break; 364. 		    case 1: (void)mongets(mtmp, PARTISAN); break; 365. 		    case 2: (void)mongets(mtmp, GLAIVE); break; 366. 		    case 3: (void)mongets(mtmp, SPETUM); break; 367. 		}  368.  		break; 369. 	    case S_KOBOLD: 370. 		if (!rn2(4)) m_initthrow(mtmp, DART, 12); 371. 		break; 372.  373.  	    case S_CENTAUR: 374. 		if (rn2(2)) { 375. 		    if(ptr == &mons[PM_FOREST_CENTAUR]) { 376. 			(void)mongets(mtmp, BOW); 377. 			m_initthrow(mtmp, ARROW, 12); 378. 		    } else { 379. 			(void)mongets(mtmp, CROSSBOW); 380. 			m_initthrow(mtmp, CROSSBOW_BOLT, 12); 381. 		    }  382.  		}  383.  		break; 384. 	    case S_WRAITH: 385. 		(void)mongets(mtmp, KNIFE); 386. 		(void)mongets(mtmp, LONG_SWORD); 387. 		break; 388. 	    case S_ZOMBIE: 389. 		if (!rn2(4)) (void)mongets(mtmp, LEATHER_ARMOR); 390. 		if (!rn2(4)) 391. 			(void)mongets(mtmp, (rn2(3) ? KNIFE : SHORT_SWORD)); 392. 		break; 393. 	    case S_LIZARD: 394. 		if (mm == PM_SALAMANDER) 395. 			(void)mongets(mtmp, (rn2(7) ? SPEAR : rn2(3) ? 396. 					     TRIDENT : STILETTO)); 397. 		break; 398. 	    case S_DEMON: 399. 		switch (mm) { 400. 		    case PM_BALROG: 401. 			(void)mongets(mtmp, BULLWHIP); 402. 			(void)mongets(mtmp, BROADSWORD); 403. 			break; 404. 		    case PM_ORCUS: 405. 			(void)mongets(mtmp, WAN_DEATH); /* the Wand of Orcus */ 406. 			break; 407. 		    case PM_HORNED_DEVIL: 408. 			(void)mongets(mtmp, rn2(4) ? TRIDENT : BULLWHIP); 409. 			break; 410. 		    case PM_DISPATER: 411. 			(void)mongets(mtmp, WAN_STRIKING); 412. 			break; 413. 		    case PM_YEENOGHU: 414. 			(void)mongets(mtmp, FLAIL); 415. 			break; 416. 		}  417.  		/* prevent djinnis and mail daemons from leaving objects when 418. 		 * they vanish 419. 		 */  420.  		if (!is_demon(ptr)) break; 421. 		/* fall thru */ 422. /*  423.   *	Now the general case, Some chance of getting some type 424.  *	of weapon for "normal" monsters. Certain special types 425.  *	of monsters will get a bonus chance or different selections. 426.  */  427.  	    default: 428. 	      {  429.  		int bias; 430.  431.  		bias = is_lord(ptr) + is_prince(ptr) * 2 + extra_nasty(ptr); 432. 		switch(rnd(14 - (2 * bias))) { 433. 		    case 1: 434. 			if(strongmonst(ptr)) (void) mongets(mtmp, BATTLE_AXE); 435. 			else m_initthrow(mtmp, DART, 12); 436. 			break; 437. 		    case 2: 438. 			if(strongmonst(ptr)) 439. 			    (void) mongets(mtmp, TWO_HANDED_SWORD); 440. 			else { 441. 			    (void) mongets(mtmp, CROSSBOW); 442. 			    m_initthrow(mtmp, CROSSBOW_BOLT, 12); 443. 			}  444.  			break; 445. 		    case 3: 446. 			(void) mongets(mtmp, BOW); 447. 			m_initthrow(mtmp, ARROW, 12); 448. 			break; 449. 		    case 4: 450. 			if(strongmonst(ptr)) (void) mongets(mtmp, LONG_SWORD); 451. 			else m_initthrow(mtmp, DAGGER, 3); 452. 			break; 453. 		    case 5: 454. 			if(strongmonst(ptr)) 455. 			    (void) mongets(mtmp, LUCERN_HAMMER); 456. 			else (void) mongets(mtmp, AKLYS); 457. 			break; 458. 		    default: 459. 			break; 460. 		}  461.  	      }  462.  	      break; 463. 	}  464.  	if ((int) mtmp->m_lev > rn2(75)) 465. 		(void) mongets(mtmp, rnd_offensive_item(mtmp)); 466. }  467.   468.  #endif /* OVL2 */ 469. #ifdef OVL1 470.  471.  #ifdef GOLDOBJ 472. /*  473.   *   Makes up money for monster's inventory. 474.  *   This will change with silver & copper coins 475.  */  476.  void 477. mkmonmoney(mtmp, amount) 478. struct monst *mtmp; 479. long amount; 480. {  481.      struct obj *gold = mksobj(GOLD_PIECE, FALSE, FALSE); 482.     gold->quan = amount; 483.     add_to_minv(mtmp, gold); 484. }  485.  #endif 486.  487.  STATIC_OVL void 488. m_initinv(mtmp) 489. register struct	monst	*mtmp; 490. {  491.  	register int cnt; 492. 	register struct obj *otmp; 493. 	register struct permonst *ptr = mtmp->data; 494. #ifdef REINCARNATION 495. 	if (Is_rogue_level(&u.uz)) return; 496. #endif 497. /*  498.   *	Soldiers get armour & rations - armour approximates their ac. 499.  *	Nymphs may get mirror or potion of object detection. 500.  */  501.  	switch(ptr->mlet) { 502.  503.  	    case S_HUMAN: 504. 		if(is_mercenary(ptr)) { 505. 		    register int mac; 506.  507.  		    switch(monsndx(ptr)) { 508. 			case PM_GUARD: mac = -1; break; 509. 			case PM_SOLDIER: mac = 3; break; 510. 			case PM_SERGEANT: mac = 0; break; 511. 			case PM_LIEUTENANT: mac = -2; break; 512. 			case PM_CAPTAIN: mac = -3; break; 513. 			case PM_WATCHMAN: mac = 3; break; 514. 			case PM_WATCH_CAPTAIN: mac = -2; break; 515. 			default: impossible("odd mercenary %d?", monsndx(ptr)); 516. 				mac = 0; 517. 				break; 518. 		    }  519.   520.  		    if (mac < -1 && rn2(5)) 521. 			mac += 7 + mongets(mtmp, (rn2(5)) ?  522.  					   PLATE_MAIL : CRYSTAL_PLATE_MAIL); 523. 		    else if (mac < 3 && rn2(5)) 524. 			mac += 6 + mongets(mtmp, (rn2(3)) ?  525.  					   SPLINT_MAIL : BANDED_MAIL); 526. 		    else if (rn2(5)) 527. 			mac += 3 + mongets(mtmp, (rn2(3)) ?  528.  					   RING_MAIL : STUDDED_LEATHER_ARMOR); 529. 		    else 530. 			mac += 2 + mongets(mtmp, LEATHER_ARMOR); 531.  532.  		    if (mac < 10 && rn2(3)) 533. 			mac += 1 + mongets(mtmp, HELMET); 534. 		    else if (mac < 10 && rn2(2)) 535. 			mac += 1 + mongets(mtmp, DENTED_POT); 536. 		    if (mac < 10 && rn2(3)) 537. 			mac += 1 + mongets(mtmp, SMALL_SHIELD); 538. 		    else if (mac < 10 && rn2(2)) 539. 			mac += 2 + mongets(mtmp, LARGE_SHIELD); 540. 		    if (mac < 10 && rn2(3)) 541. 			mac += 1 + mongets(mtmp, LOW_BOOTS); 542. 		    else if (mac < 10 && rn2(2)) 543. 			mac += 2 + mongets(mtmp, HIGH_BOOTS); 544. 		    if (mac < 10 && rn2(3)) 545. 			mac += 1 + mongets(mtmp, LEATHER_GLOVES); 546. 		    else if (mac < 10 && rn2(2)) 547. 			mac += 1 + mongets(mtmp, LEATHER_CLOAK); 548.  549.  		    if(ptr != &mons[PM_GUARD] &&  550.  			ptr != &mons[PM_WATCHMAN] &&  551.  			ptr != &mons[PM_WATCH_CAPTAIN]) { 552. 			if (!rn2(3)) (void) mongets(mtmp, K_RATION); 553. 			if (!rn2(2)) (void) mongets(mtmp, C_RATION); 554. 			if (ptr != &mons[PM_SOLDIER] && !rn2(3)) 555. 				(void) mongets(mtmp, BUGLE); 556. 		    } else 557. 			   if (ptr == &mons[PM_WATCHMAN] && rn2(3)) 558. 				(void) mongets(mtmp, TIN_WHISTLE); 559. 		} else if (ptr == &mons[PM_SHOPKEEPER]) { 560. 		    (void) mongets(mtmp,SKELETON_KEY); 561. 		    switch (rn2(4)) { 562. 		    /* MAJOR fall through ... */ 563.  		    case 0: (void) mongets(mtmp, WAN_MAGIC_MISSILE); 564. 		    case 1: (void) mongets(mtmp, POT_EXTRA_HEALING); 565. 		    case 2: (void) mongets(mtmp, POT_HEALING); 566. 		    case 3: (void) mongets(mtmp, WAN_STRIKING); 567. 		    }  568.  		} else if (ptr->msound == MS_PRIEST ||  569.  			quest_mon_represents_role(ptr,PM_PRIEST)) { 570. 		    (void) mongets(mtmp, rn2(7) ? ROBE :  571.  					     rn2(3) ? CLOAK_OF_PROTECTION :  572.  						 CLOAK_OF_MAGIC_RESISTANCE); 573. 		    (void) mongets(mtmp, SMALL_SHIELD); 574. #ifndef GOLDOBJ 575. 		    mtmp->mgold = (long)rn1(10,20); 576. #else 577. 		    mkmonmoney(mtmp,(long)rn1(10,20)); 578. #endif 579. 		} else if (quest_mon_represents_role(ptr,PM_MONK)) { 580. 		    (void) mongets(mtmp, rn2(11) ? ROBE :  581.  					     CLOAK_OF_MAGIC_RESISTANCE); 582. 		}  583.  		break; 584. 	    case S_NYMPH: 585. 		if(!rn2(2)) (void) mongets(mtmp, MIRROR); 586. 		if(!rn2(2)) (void) mongets(mtmp, POT_OBJECT_DETECTION); 587. 		break; 588. 	    case S_GIANT: 589. 		if (ptr == &mons[PM_MINOTAUR]) { 590. 		    if (!rn2(3) || (in_mklev && Is_earthlevel(&u.uz))) 591. 			(void) mongets(mtmp, WAN_DIGGING); 592. 		} else if (is_giant(ptr)) { 593. 		    for (cnt = rn2((int)(mtmp->m_lev / 2)); cnt; cnt--) { 594. 			otmp = mksobj(rnd_class(DILITHIUM_CRYSTAL,LUCKSTONE-1),  595.  				      FALSE, FALSE); 596. 			otmp->quan = (long) rn1(2, 3); 597. 			otmp->owt = weight(otmp); 598. 			(void) mpickobj(mtmp, otmp); 599. 		    }  600.  		}  601.  		break; 602. 	    case S_WRAITH: 603. 		if (ptr == &mons[PM_NAZGUL]) { 604. 			otmp = mksobj(RIN_INVISIBILITY, FALSE, FALSE); 605. 			curse(otmp); 606. 			(void) mpickobj(mtmp, otmp); 607. 		}  608.  		break; 609. 	    case S_LICH: 610. 		if (ptr == &mons[PM_MASTER_LICH] && !rn2(13)) 611. 			(void)mongets(mtmp, (rn2(7) ? ATHAME : WAN_NOTHING)); 612. 		else if (ptr == &mons[PM_ARCH_LICH] && !rn2(3)) { 613. 			otmp = mksobj(rn2(3) ? ATHAME : QUARTERSTAFF,  614.  				      TRUE, rn2(13) ? FALSE : TRUE); 615. 			if (otmp->spe < 2) otmp->spe = rnd(3); 616. 			if (!rn2(4)) otmp->oerodeproof = 1; 617. 			(void) mpickobj(mtmp, otmp); 618. 		}  619.  		break; 620. 	    case S_MUMMY: 621. 		if (rn2(7)) (void)mongets(mtmp, MUMMY_WRAPPING); 622. 		break; 623. 	    case S_QUANTMECH: 624. 		if (!rn2(20)) { 625. 			otmp = mksobj(LARGE_BOX, FALSE, FALSE); 626. 			otmp->spe = 1; /* flag for special box */ 627. 			otmp->owt = weight(otmp); 628. 			(void) mpickobj(mtmp, otmp); 629. 		}  630.  		break; 631. 	    case S_LEPRECHAUN: 632. #ifndef GOLDOBJ 633. 		mtmp->mgold = (long) d(level_difficulty, 30); 634. #else 635. 		mkmonmoney(mtmp, (long) d(level_difficulty, 30)); 636. #endif 637. 		break; 638. 	    case S_DEMON: 639. 	    	/* moved here from m_initweap because these don't  640. have AT_WEAP so m_initweap is not called for them */ 641. 		if (ptr == &mons[PM_ICE_DEVIL] && !rn2(4)) { 642. 			(void)mongets(mtmp, SPEAR); 643. 		} else if (ptr == &mons[PM_ASMODEUS]) { 644. 			(void)mongets(mtmp, WAN_COLD); 645. 			(void)mongets(mtmp, WAN_FIRE); 646. 		}  647.  		break; 648. 	    default: 649. 		break; 650. 	}  651.   652.  	/* ordinary soldiers rarely have access to magic (or gold :-) */ 653. 	if (ptr == &mons[PM_SOLDIER] && rn2(13)) return; 654.  655.  	if ((int) mtmp->m_lev > rn2(50)) 656. 		(void) mongets(mtmp, rnd_defensive_item(mtmp)); 657. 	if ((int) mtmp->m_lev > rn2(100)) 658. 		(void) mongets(mtmp, rnd_misc_item(mtmp)); 659. #ifndef GOLDOBJ 660. 	if (likes_gold(ptr) && !mtmp->mgold && !rn2(5)) 661. 		mtmp->mgold = 662. 		      (long) d(level_difficulty, mtmp->minvent ? 5 : 10); 663. #else 664. 	if (likes_gold(ptr) && !findgold(mtmp->minvent) && !rn2(5)) 665. 		mkmonmoney(mtmp, (long) d(level_difficulty, mtmp->minvent ? 5 : 10)); 666.  #endif 667. }  668.   669.  /* Note: for long worms, always call cutworm (cutworm calls clone_mon) */ 670. struct monst * 671. clone_mon(mon, x, y)  672. struct monst *mon; 673. xchar x, y;	/* clone's preferred location or 0 (near mon) */ 674. {  675.  	coord mm; 676. 	struct monst *m2; 677.  678.  	/* may be too weak or have been extinguished for population control */ 679. 	if (mon->mhp <= 1 || (mvitals[monsndx(mon->data)].mvflags & G_EXTINCT)) 680. 	    return (struct monst *)0; 681.  682.  	if (x == 0) { 683. 	    mm.x = mon->mx; 684. 	    mm.y = mon->my; 685. 	    if (!enexto(&mm, mm.x, mm.y, mon->data) || MON_AT(mm.x, mm.y)) 686. 		return (struct monst *)0; 687. 	} else if (!isok(x, y)) { 688. 	    return (struct monst *)0;	/* paranoia */ 689. 	} else { 690. 	    mm.x = x;  691. mm.y = y; 692. if (MON_AT(mm.x, mm.y)) { 693. 		if (!enexto(&mm, mm.x, mm.y, mon->data) || MON_AT(mm.x, mm.y)) 694. 		    return (struct monst *)0; 695. 	    }  696.  	}  697.  	m2 = newmonst(0); 698. 	*m2 = *mon;			/* copy condition of old monster */ 699. 	m2->nmon = fmon; 700. 	fmon = m2; 701. 	m2->m_id = flags.ident++; 702. 	if (!m2->m_id) m2->m_id = flags.ident++;	/* ident overflowed */ 703. 	m2->mx = mm.x;  704. m2->my = mm.y; 705. 706. 	m2->minvent = (struct obj *) 0; /* objects don't clone */ 707. 	m2->mleashed = FALSE; 708. #ifndef GOLDOBJ 709. 	m2->mgold = 0L; 710. #endif 711. 	/* Max HP the same, but current HP halved for both. The caller 712. 	 * might want to override this by halving the max HP also. 713. 	 * When current HP is odd, the original keeps the extra point. 714. 	 */  715.  	m2->mhpmax = mon->mhpmax; 716. 	m2->mhp = mon->mhp / 2; 717. 	mon->mhp -= m2->mhp; 718.  719.  	/* since shopkeepers and guards will only be cloned if they've been 720. 	 * polymorphed away from their original forms, the clone doesn't have 721. 	 * room for the extra information. we also don't want two shopkeepers 722. 	 * around for the same shop. 723. 	 */  724.  	if (mon->isshk) m2->isshk = FALSE; 725. 	if (mon->isgd) m2->isgd = FALSE; 726. 	if (mon->ispriest) m2->ispriest = FALSE; 727. 	m2->mxlth = 0; 728. 	place_monster(m2, m2->mx, m2->my); 729. 	if (emits_light(m2->data)) 730. 	    new_light_source(m2->mx, m2->my, emits_light(m2->data),  731.  			     LS_MONSTER, (genericptr_t)m2); 732. 	if (m2->mnamelth) { 733. 	    m2->mnamelth = 0; /* or it won't get allocated */ 734. 	    m2 = christen_monst(m2, NAME(mon)); 735. 	} else if (mon->isshk) { 736. 	    m2 = christen_monst(m2, shkname(mon)); 737. 	}  738.   739.  	/* not all clones caused by player are tame or peaceful */ 740. 	if (!flags.mon_moving) { 741. 	    if (mon->mtame) 742. 		m2->mtame = rn2(max(2 + u.uluck, 2)) ? mon->mtame : 0; 743. 	    else if (mon->mpeaceful) 744. 		m2->mpeaceful = rn2(max(2 + u.uluck, 2)) ? 1 : 0; 745.  	}  746.   747.  	newsym(m2->mx,m2->my);	/* display the new monster */ 748. 	if (m2->mtame) { 749. 	    struct monst *m3; 750.  751.  	    if (mon->isminion) { 752. 		m3 = newmonst(sizeof(struct epri) + mon->mnamelth); 753. 		*m3 = *m2; 754. 		m3->mxlth = sizeof(struct epri); 755. 		if (m2->mnamelth) Strcpy(NAME(m3), NAME(m2)); 756. 		*(EPRI(m3)) = *(EPRI(mon)); 757. 		replmon(m2, m3); 758. 		m2 = m3; 759. 	    } else { 760. 		/* because m2 is a copy of mon it is tame but not init'ed. 761. 		 * however, tamedog will not re-tame a tame dog, so m2  762. * must be made non-tame to get initialized properly. 763. 		 */  764.  		m2->mtame = 0; 765. 		if ((m3 = tamedog(m2, (struct obj *)0)) != 0) { 766. 		    m2 = m3; 767. 		    *(EDOG(m2)) = *(EDOG(mon)); 768. 		}  769.  	    }  770.  	}  771.  	set_malign(m2); 772.  773.  	return m2; 774. }  775.   776.  /*  777.   * Propagate a species 778.  *  779.   * Once a certain number of monsters are created, don't create any more 780.  * at random (i.e. make them extinct). The previous (3.2) behavior was 781.  * to do this when a certain number had _died_, which didn't make 782.  * much sense. 783.  *  784.   * Returns FALSE propagation unsuccessful 785.  *         TRUE  propagation successful 786.  */  787.  boolean 788. propagate(mndx, tally, ghostly) 789. int mndx; 790. boolean tally; 791. boolean ghostly; 792. {  793.  	boolean result; 794. 	uchar lim = mbirth_limit(mndx); 795. 	boolean gone = (mvitals[mndx].mvflags & G_GONE); /* genocided or extinct */ 796.  797.  	result = (((int) mvitals[mndx].born < lim) && !gone) ? TRUE : FALSE; 798.  799.  	/* if it's unique, don't ever make it again */ 800. 	if (mons[mndx].geno & G_UNIQ) mvitals[mndx].mvflags |= G_EXTINCT; 801.  802.  	if (mvitals[mndx].born < 255 && tally && (!ghostly || (ghostly && result))) 803. 		 mvitals[mndx].born++; 804. 	if ((int) mvitals[mndx].born >= lim && !(mons[mndx].geno & G_NOGEN) &&  805.  		!(mvitals[mndx].mvflags & G_EXTINCT)) { 806. #if defined(DEBUG) && defined(WIZARD) 807. 		if (wizard) pline("Automatically extinguished %s.",  808.  					makeplural(mons[mndx].mname)); 809. #endif 810. 		mvitals[mndx].mvflags |= G_EXTINCT; 811. 		reset_rndmonst(mndx); 812. 	}  813.  	return result; 814. }  815.   816.  /*  817.   * called with [x,y] = coordinates; 818.  *	[0,0] means anyplace 819.  *	[u.ux,u.uy] means: near player (if !in_mklev) 820.  *  821.   *	In case we make a monster group, only return the one at [x,y]. 822.  */  823.  struct monst * 824. makemon(ptr, x, y, mmflags) 825. register struct permonst *ptr; 826. register int	x, y;  827. register int	mmflags; 828. {  829.  	register struct monst *mtmp; 830. 	int mndx, mcham, ct, mitem, xlth; 831. 	boolean anymon = (!ptr); 832. 	boolean byyou = (x == u.ux && y == u.uy); 833. 	boolean allow_minvent = ((mmflags & NO_MINVENT) == 0); 834. 	boolean countbirth = ((mmflags & MM_NOCOUNTBIRTH) == 0); 835. 	unsigned gpflags = (mmflags & MM_IGNOREWATER) ? MM_IGNOREWATER : 0; 836.  837.  	/* if caller wants random location, do it here */ 838. 	if(x == 0 && y == 0) { 839. 		int tryct = 0;	/* careful with bigrooms */ 840. 		struct monst fakemon; 841.  842.  		fakemon.data = ptr;	/* set up for goodpos */ 843. 		do { 844. 			x = rn1(COLNO-3,2); 845. 			y = rn2(ROWNO); 846. 		} while(!goodpos(x, y, ptr ? &fakemon : (struct monst *)0, gpflags) || 847.  			(!in_mklev && tryct++ < 50 && cansee(x, y))); 848. 	} else if (byyou && !in_mklev) { 849. 		coord bypos; 850.  851.  		if(enexto_core(&bypos, u.ux, u.uy, ptr, gpflags)) { 852. 			x = bypos.x;  853. y = bypos.y; 854. } else 855. 			return((struct monst *)0); 856. 	}  857.   858.  	/* Does monster already exist at the position? */ 859.  	if(MON_AT(x, y)) { 860. 		if ((mmflags & MM_ADJACENTOK) != 0) { 861. 			coord bypos; 862. 			if(enexto_core(&bypos, x, y, ptr, gpflags)) { 863. 				x = bypos.x;  864. y = bypos.y; 865. } else 866. 				return((struct monst *) 0); 867. 		} else 868. 			return((struct monst *) 0); 869. 	}  870.   871.  	if(ptr){ 872. 		mndx = monsndx(ptr); 873. 		/* if you are to make a specific monster and it has 874. 		   already been genocided, return */ 875. 		if (mvitals[mndx].mvflags & G_GENOD) return((struct monst *) 0); 876. #if defined(WIZARD) && defined(DEBUG) 877. 		if (wizard && (mvitals[mndx].mvflags & G_EXTINCT)) 878. 		    pline("Explicitly creating extinct monster %s.",  879.  			mons[mndx].mname); 880. #endif 881. 	} else { 882. 		/* make a random (common) monster that can survive here. 883. 		 * (the special levels ask for random monsters at specific  884.  		 * positions, causing mass drowning on the medusa level,  885.  		 * for instance.) 886. 		 */  887.  		int tryct = 0;	/* maybe there are no good choices */ 888. 		struct monst fakemon; 889. 		do { 890. 			if(!(ptr = rndmonst)) { 891. #ifdef DEBUG 892. 			    pline("Warning: no monster."); 893. #endif 894. 			    return((struct monst *) 0);	/* no more monsters! */ 895.  			}  896.  			fakemon.data = ptr;	/* set up for goodpos */ 897. 		} while(!goodpos(x, y, &fakemon, gpflags) && tryct++ < 50); 898. 		mndx = monsndx(ptr); 899. 	}  900.  	(void) propagate(mndx, countbirth, FALSE); 901. 	xlth = ptr->pxlth; 902. 	if (mmflags & MM_EDOG) xlth += sizeof(struct edog); 903. 	else if (mmflags & MM_EMIN) xlth += sizeof(struct emin); 904. 	mtmp = newmonst(xlth); 905. 	*mtmp = zeromonst;		/* clear all entries in structure */ 906. 	(void)memset((genericptr_t)mtmp->mextra, 0, xlth); 907. 	mtmp->nmon = fmon; 908. 	fmon = mtmp; 909. 	mtmp->m_id = flags.ident++; 910. 	if (!mtmp->m_id) mtmp->m_id = flags.ident++;	/* ident overflowed */ 911. 	set_mon_data(mtmp, ptr, 0); 912. 	if (mtmp->data->msound == MS_LEADER) 913. 	    quest_status.leader_m_id = mtmp->m_id; 914. 	mtmp->mxlth = xlth; 915. 	mtmp->mnum = mndx; 916.  917.  	mtmp->m_lev = adj_lev(ptr); 918. 	if (is_golem(ptr)) { 919. 	    mtmp->mhpmax = mtmp->mhp = golemhp(mndx); 920. 	} else if (is_rider(ptr)) { 921. 	    /* We want low HP, but a high mlevel so they can attack well */ 922. 	    mtmp->mhpmax = mtmp->mhp = d(10,8); 923. 	} else if (ptr->mlevel > 49) { 924. 	    /* "special" fixed hp monster 925. 	     * the hit points are encoded in the mlevel in a somewhat strange 926. 	     * way to fit in the 50..127 positive range of a signed character 927. 	     * above the 1..49 that indicate "normal" monster levels */ 928. 	    mtmp->mhpmax = mtmp->mhp = 2*(ptr->mlevel - 6); 929. 	    mtmp->m_lev = mtmp->mhp / 4;	/* approximation */ 930. 	} else if (ptr->mlet == S_DRAGON && mndx >= PM_GRAY_DRAGON) { 931. 	    /* adult dragons */ 932. 	    mtmp->mhpmax = mtmp->mhp = (int) (In_endgame(&u.uz) ?  933.  		(8 * mtmp->m_lev) : (4 * mtmp->m_lev + d((int)mtmp->m_lev, 4))); 934. 	} else if (!mtmp->m_lev) { 935. 	    mtmp->mhpmax = mtmp->mhp = rnd(4); 936. 	} else { 937. 	    mtmp->mhpmax = mtmp->mhp = d((int)mtmp->m_lev, 8); 938. 	    if (is_home_elemental(ptr)) 939. 		mtmp->mhpmax = (mtmp->mhp *= 3); 940. 	}  941.   942.  	if (is_female(ptr)) mtmp->female = TRUE; 943. 	else if (is_male(ptr)) mtmp->female = FALSE; 944. 	else mtmp->female = rn2(2);	/* ignored for neuters */ 945.  946.  	if (In_sokoban(&u.uz) && !mindless(ptr))  /* know about traps here */ 947. 	    mtmp->mtrapseen = (1L << (PIT - 1)) | (1L << (HOLE - 1)); 948. 	if (ptr->msound == MS_LEADER)		/* leader knows about portal */ 949. 	    mtmp->mtrapseen |= (1L << (MAGIC_PORTAL-1)); 950.  951.  	place_monster(mtmp, x, y); 952. 	mtmp->mcansee = mtmp->mcanmove = TRUE; 953. 	mtmp->mpeaceful = (mmflags & MM_ANGRY) ? FALSE : peace_minded(ptr); 954.  955.  	switch(ptr->mlet) { 956. 		case S_MIMIC: 957. 			set_mimic_sym(mtmp); 958. 			break; 959. 		case S_SPIDER: 960. 		case S_SNAKE: 961. 			if(in_mklev) 962. 			    if(x && y)  963. (void) mkobj_at(0, x, y, TRUE); 964. 			if(hides_under(ptr) && OBJ_AT(x, y)) 965. 			    mtmp->mundetected = TRUE; 966. 			break; 967. 		case S_LIGHT: 968. 		case S_ELEMENTAL: 969. 			if (mndx == PM_STALKER || mndx == PM_BLACK_LIGHT) { 970. 			    mtmp->perminvis = TRUE; 971. 			    mtmp->minvis = TRUE; 972. 			}  973.  			break; 974. 		case S_EEL: 975. 			if (is_pool(x, y)) 976. 			    mtmp->mundetected = TRUE; 977. 			break; 978. 		case S_LEPRECHAUN: 979. 			mtmp->msleeping = 1; 980. 			break; 981. 		case S_JABBERWOCK: 982. 		case S_NYMPH: 983. 			if (rn2(5) && !u.uhave.amulet) mtmp->msleeping = 1; 984. 			break; 985. 		case S_ORC: 986. 			if (Race_if(PM_ELF)) mtmp->mpeaceful = FALSE; 987. 			break; 988. 		case S_UNICORN: 989. 			if (is_unicorn(ptr) &&  990.  					sgn(u.ualign.type) == sgn(ptr->maligntyp)) 991. 				mtmp->mpeaceful = TRUE; 992. 			break; 993. 		case S_BAT: 994. 			if (Inhell && is_bat(ptr)) 995. 			    mon_adjust_speed(mtmp, 2, (struct obj *)0); 996. 			break; 997. 	}  998.  	if ((ct = emits_light(mtmp->data)) > 0) 999. 		new_light_source(mtmp->mx, mtmp->my, ct,  1000. 				 LS_MONSTER, (genericptr_t)mtmp); 1001. 	mitem = 0;	/* extra inventory item for this monster */ 1002. 1003. 	if ((mcham = pm_to_cham(mndx)) != CHAM_ORDINARY) { 1004. 		/* If you're protected with a ring, don't create 1005. 		 * any shape-changing chameleons -dgk 1006. 		 */ 1007. 		if (Protection_from_shape_changers) 1008. 			mtmp->cham = CHAM_ORDINARY; 1009. 		else { 1010. 			mtmp->cham = mcham; 1011. 			(void) newcham(mtmp, rndmonst, FALSE, FALSE); 1012. 		} 1013. 	} else if (mndx == PM_WIZARD_OF_YENDOR) { 1014. 		mtmp->iswiz = TRUE; 1015. 		flags.no_of_wizards++; 1016. 		if (flags.no_of_wizards == 1 && Is_earthlevel(&u.uz)) 1017. 			mitem = SPE_DIG; 1018. 	} else if (mndx == PM_DJINNI) { 1019. 		flags.djinni_count++; 1020. 	} else if (mndx == PM_GHOST) { 1021. 		flags.ghost_count++; 1022. 		if (!(mmflags & MM_NONAME)) 1023. 			mtmp = christen_monst(mtmp, rndghostname); 1024. 	} else if (mndx == PM_VLAD_THE_IMPALER) { 1025. 		mitem = CANDELABRUM_OF_INVOCATION; 1026. 	} else if (mndx == PM_CROESUS) { 1027. 		mitem = TWO_HANDED_SWORD; 1028. 	} else if (ptr->msound == MS_NEMESIS) { 1029. 		mitem = BELL_OF_OPENING; 1030. 	} else if (mndx == PM_PESTILENCE) { 1031. 		mitem = POT_SICKNESS; 1032. 	} 1033. 	if (mitem && allow_minvent) (void) mongets(mtmp, mitem); 1034. 1035. 	if(in_mklev) { 1036. 		if(((is_ndemon(ptr)) || 1037. 		   (mndx == PM_WUMPUS) || 1038. 		   (mndx == PM_LONG_WORM) || 1039. 		   (mndx == PM_GIANT_EEL)) && !u.uhave.amulet && rn2(5)) 1040. 			mtmp->msleeping = TRUE; 1041. 	} else { 1042. 		if(byyou) { 1043. 			newsym(mtmp->mx,mtmp->my); 1044. 			set_apparxy(mtmp); 1045. 		} 1046. 	}  1047. 	if(is_dprince(ptr) && ptr->msound == MS_BRIBE) { 1048. 	   mtmp->mpeaceful = mtmp->minvis = mtmp->perminvis = 1; 1049. 	   mtmp->mavenge = 0; 1050. 	   if (uwep && uwep->oartifact == ART_EXCALIBUR) 1051. 		mtmp->mpeaceful = mtmp->mtame = FALSE; 1052. 	} 1053. #ifndef DCC30_BUG 1054. 	if (mndx == PM_LONG_WORM && (mtmp->wormno = get_wormno) != 0) 1055. #else 1056. 	/* DICE 3.0 doesn't like assigning and comparing mtmp->wormno in the 1057. 	 * same expression. 1058. 	 */ 1059. 	if (mndx == PM_LONG_WORM &&  1060. 		(mtmp->wormno = get_wormno, mtmp->wormno != 0)) 1061. #endif 1062. 	{ 1063. 	    /* we can now create worms with tails - 11/91 */ 1064. 	   initworm(mtmp, rn2(5)); 1065. 	   if (count_wsegs(mtmp)) place_worm_tail_randomly(mtmp, x, y); 1066. 	} 1067. 	set_malign(mtmp);		/* having finished peaceful changes */ 1068. 	if(anymon) { 1069. 	   if ((ptr->geno & G_SGROUP) && rn2(2)) { 1070. 		m_initsgrp(mtmp, mtmp->mx, mtmp->my); 1071. 	   } else if (ptr->geno & G_LGROUP) { 1072. 		if(rn2(3)) m_initlgrp(mtmp, mtmp->mx, mtmp->my); 1073. 		else	   m_initsgrp(mtmp, mtmp->mx, mtmp->my); 1074. 	   }  1075. 	}  1076.  1077. 	if (allow_minvent) { 1078. 	   if(is_armed(ptr)) 1079. 		m_initweap(mtmp);	/* equip with weapons / armor */ 1080. 	   m_initinv(mtmp);  /* add on a few special items incl. more armor */ 1081. 	   m_dowear(mtmp, TRUE); 1082. 	} else { 1083. 	   /* no initial inventory is allowed */ 1084. 	   if (mtmp->minvent) discard_minvent(mtmp); 1085. 	   mtmp->minvent = (struct obj *)0;    /* caller expects this */ 1086. 	} 1087. 	if ((ptr->mflags3 & M3_WAITMASK) && !(mmflags & MM_NOWAIT)) { 1088. 		if (ptr->mflags3 & M3_WAITFORU) 1089. 			mtmp->mstrategy |= STRAT_WAITFORU; 1090. 		if (ptr->mflags3 & M3_CLOSE) 1091. 			mtmp->mstrategy |= STRAT_CLOSE; 1092. 	} 1093.  1094. 	if (!in_mklev) 1095. 	   newsym(mtmp->mx,mtmp->my);	/* make sure the mon shows up */ 1096. 1097. 	return(mtmp); 1098. } 1099.  1100. int 1101. mbirth_limit(mndx) 1102. int mndx; 1103. { 1104. 	/* assert(MAXMONNO < 255); */ 1105. 	return (mndx == PM_NAZGUL ? 9 : mndx == PM_ERINYS ? 3 : MAXMONNO); 1106. } 1107.  1108. /* used for wand/scroll/spell of create monster */ 1109. /* returns TRUE iff you know monsters have been created */ 1110. boolean 1111. create_critters(cnt, mptr) 1112. int cnt; 1113. struct permonst *mptr;		/* usually null; used for confused reading */ 1114. { 1115. 	coord c;  1116. int x, y; 1117. struct monst *mon; 1118. 	boolean known = FALSE; 1119. #ifdef WIZARD 1120. 	boolean ask = wizard; 1121. #endif 1122. 1123. 	while (cnt--) { 1124. #ifdef WIZARD 1125. 	   if (ask) { 1126. 		if (create_particular) { 1127. 		   known = TRUE; 1128. 		   continue; 1129. 		} 1130. 		else ask = FALSE;	/* ESC will shut off prompting */ 1131. 	   }  1132. #endif 1133. 	   x = u.ux,  y = u.uy; 1134. 	   /* if in water, try to encourage an aquatic monster 1135. 	      by finding and then specifying another wet location */ 1136. 	   if (!mptr && u.uinwater && enexto(&c, x, y, &mons[PM_GIANT_EEL])) 1137. 		x = c.x, y = c.y;  1138. 1139. 	   mon = makemon(mptr, x, y, NO_MM_FLAGS); 1140. 	   if (mon && canspotmon(mon)) known = TRUE; 1141. 	} 1142. 	return known; 1143. } 1144.  1145. #endif /* OVL1 */ 1146. #ifdef OVL0 1147. 1148. STATIC_OVL boolean 1149. uncommon(mndx) 1150. int mndx; 1151. { 1152. 	if (mons[mndx].geno & (G_NOGEN | G_UNIQ)) return TRUE; 1153. 	if (mvitals[mndx].mvflags & G_GONE) return TRUE; 1154. 	if (Inhell) 1155. 		return(mons[mndx].maligntyp > A_NEUTRAL); 1156. 	else 1157. 		return((mons[mndx].geno & G_HELL) != 0); 1158. } 1159.  1160. /*  1161.  *	shift the probability of a monster's generation by  1162. *	comparing the dungeon alignment and monster alignment. 1163. *	return an integer in the range of 0-5. 1164. */  1165. STATIC_OVL int 1166. align_shift(ptr) 1167. register struct permonst *ptr; 1168. { 1169.     static NEARDATA long oldmoves = 0L;	/* != 1, starting value of moves */ 1170.    static NEARDATA s_level *lev; 1171.    register int alshift; 1172. 1173.     if(oldmoves != moves) { 1174. 	lev = Is_special(&u.uz); 1175. 	oldmoves = moves; 1176.    }  1177.     switch((lev) ? lev->flags.align : dungeons[u.uz.dnum].flags.align) { 1178.    default:	/* just in case */ 1179.    case AM_NONE:	alshift = 0; 1180. 			break; 1181.    case AM_LAWFUL:	alshift = (ptr->maligntyp+20)/(2*ALIGNWEIGHT); 1182. 			break; 1183.    case AM_NEUTRAL:	alshift = (20 - abs(ptr->maligntyp))/ALIGNWEIGHT; 1184. 			break; 1185.    case AM_CHAOTIC:	alshift = (-(ptr->maligntyp-20))/(2*ALIGNWEIGHT); 1186. 			break; 1187.    }  1188.     return alshift; 1189. } 1190.  1191. static NEARDATA struct { 1192. 	int choice_count; 1193. 	char mchoices[SPECIAL_PM];	/* value range is 0..127 */ 1194. } rndmonst_state = { -1, {0} }; 1195. 1196. /* select a random monster type */ 1197. struct permonst * 1198. rndmonst 1199. { 1200. 	register struct permonst *ptr; 1201. 	register int mndx, ct; 1202. 1203. 	if (u.uz.dnum == quest_dnum && rn2(7) && (ptr = qt_montype) != 0) 1204. 	   return ptr; 1205. 1206. 	if (rndmonst_state.choice_count < 0) {	/* need to recalculate */ 1207. 	   int zlevel, minmlev, maxmlev; 1208. 	   boolean elemlevel; 1209. #ifdef REINCARNATION 1210. 	   boolean upper; 1211. #endif 1212. 1213. 	    rndmonst_state.choice_count = 0; 1214. 	   /* look for first common monster */ 1215. 	   for (mndx = LOW_PM; mndx < SPECIAL_PM; mndx++) { 1216. 		if (!uncommon(mndx)) break; 1217. 		rndmonst_state.mchoices[mndx] = 0; 1218. 	   }		  1219. 	    if (mndx == SPECIAL_PM) { 1220. 		/* evidently they've all been exterminated */ 1221. #ifdef DEBUG 1222. 		pline("rndmonst: no common mons!"); 1223. #endif 1224. 		return (struct permonst *)0; 1225. 	   } /* else `mndx' now ready for use below */ 1226. 	   zlevel = level_difficulty; 1227. 	   /* determine the level of the weakest monster to make. */ 1228. 	    minmlev = zlevel / 6; 1229. 	   /* determine the level of the strongest monster to make. */ 1230. 	    maxmlev = (zlevel + u.ulevel) / 2; 1231. #ifdef REINCARNATION 1232. 	   upper = Is_rogue_level(&u.uz); 1233. #endif 1234. 	   elemlevel = In_endgame(&u.uz) && !Is_astralevel(&u.uz); 1235. 1236. /*  1237.  *	Find out how many monsters exist in the range we have selected. 1238. */  1239. 	    /* (`mndx' initialized above) */ 1240. 	   for (mndx < SPECIAL_PM; mndx++) { 1241. 		ptr = &mons[mndx]; 1242. 		rndmonst_state.mchoices[mndx] = 0; 1243. 		if (tooweak(mndx, minmlev) || toostrong(mndx, maxmlev)) 1244. 		   continue; 1245. #ifdef REINCARNATION 1246. 		if (upper && !isupper(def_monsyms[(int)(ptr->mlet)])) continue; 1247. #endif 1248. 		if (elemlevel && wrong_elem_type(ptr)) continue; 1249. 		if (uncommon(mndx)) continue; 1250. 		if (Inhell && (ptr->geno & G_NOHELL)) continue; 1251. 		ct = (int)(ptr->geno & G_FREQ) + align_shift(ptr); 1252. 		if (ct < 0 || ct > 127) 1253. 		   panic("rndmonst: bad count [#%d: %d]", mndx, ct); 1254. 		rndmonst_state.choice_count += ct; 1255. 		rndmonst_state.mchoices[mndx] = (char)ct; 1256. 	   }  1257. /*  1258.  *	    Possible modification:  if choice_count is "too low", 1259. *	    expand minmlev..maxmlev range and try again. 1260. */  1261. 	} /* choice_count+mchoices[] recalc */ 1262. 1263. 	if (rndmonst_state.choice_count <= 0) { 1264. 	   /* maybe no common mons left, or all are too weak or too strong */ 1265. #ifdef DEBUG 1266. 	   Norep("rndmonst: choice_count=%d", rndmonst_state.choice_count); 1267. #endif 1268. 	   return (struct permonst *)0; 1269. 	} 1270.  1271. /*  1272.  *	Now, select a monster at random. 1273. */  1274. 	ct = rnd(rndmonst_state.choice_count); 1275. 	for (mndx = LOW_PM; mndx < SPECIAL_PM; mndx++) 1276. 	   if ((ct -= (int)rndmonst_state.mchoices[mndx]) <= 0) break; 1277. 1278. 	if (mndx == SPECIAL_PM || uncommon(mndx)) {	/* shouldn't happen */ 1279. 	   impossible("rndmonst: bad `mndx' [#%d]", mndx); 1280. 	   return (struct permonst *)0; 1281. 	} 1282. 	return &mons[mndx]; 1283. } 1284.  1285. /* called when you change level (experience or dungeon depth) or when 1286.   monster species can no longer be created (genocide or extinction) */ 1287. void 1288. reset_rndmonst(mndx) 1289. int mndx;	/* particular species that can no longer be created */ 1290. { 1291. 	/* cached selection info is out of date */ 1292. 	if (mndx == NON_PM) { 1293. 	   rndmonst_state.choice_count = -1;	/* full recalc needed */ 1294. 	} else if (mndx < SPECIAL_PM) { 1295. 	   rndmonst_state.choice_count -= rndmonst_state.mchoices[mndx]; 1296. 	   rndmonst_state.mchoices[mndx] = 0; 1297. 	} /* note: safe to ignore extinction of unique monsters */ 1298. } 1299.  1300. #endif /* OVL0 */ 1301. #ifdef OVL1 1302. 1303. /*	The routine below is used to make one of the multiple types 1304. *	of a given monster class. The second parameter specifies a 1305. *	special casing bit mask to allow the normal genesis 1306. *	masks to be deactivated. Returns 0 if no monsters 1307. *	in that class can be made. 1308. */  1309.  1310. struct permonst * 1311. mkclass(class,spc) 1312. char	class; 1313. int	spc; 1314. { 1315. 	register int	first, last, num = 0; 1316. 	int maxmlev, mask = (G_NOGEN | G_UNIQ) & ~spc; 1317. 1318. 	maxmlev = level_difficulty >> 1; 1319. 	if(class < 1 || class >= MAXMCLASSES) { 1320. 	   impossible("mkclass called with bad class!"); 1321. 	   return((struct permonst *) 0); 1322. 	} 1323. /*	Assumption #1:	monsters of a given class are contiguous in the 1324. *			mons[] array. 1325. */  1326. 	for (first = LOW_PM; first < SPECIAL_PM; first++) 1327. 	   if (mons[first].mlet == class) break; 1328. 	if (first == SPECIAL_PM) return (struct permonst *) 0; 1329. 1330. 	for (last = first;  1331. 		last < SPECIAL_PM && mons[last].mlet == class; last++) 1332. 	   if (!(mvitals[last].mvflags & G_GONE) && !(mons[last].geno & mask)  1333. 					&& !is_placeholder(&mons[last])) { 1334. 		/* consider it */ 1335. 		if(num && toostrong(last, maxmlev) && 1336. 		   monstr[last] != monstr[last-1] && rn2(2)) break; 1337. 		num += mons[last].geno & G_FREQ; 1338. 	   }  1339.  1340. 	if(!num) return((struct permonst *) 0); 1341. 1342. /*	Assumption #2:	monsters of a given class are presented in ascending 1343. *			order of strength. 1344. */  1345. 	for(num = rnd(num); num > 0; first++) 1346. 	   if (!(mvitals[first].mvflags & G_GONE) && !(mons[first].geno & mask)  1347. 					&& !is_placeholder(&mons[first])) { 1348. 		/* skew towards lower value monsters at lower exp. levels */ 1349. 		num -= mons[first].geno & G_FREQ; 1350. 		if (num && adj_lev(&mons[first]) > (u.ulevel*2)) { 1351. 		   /* but not when multiple monsters are same level */ 1352. 		   if (mons[first].mlevel != mons[first+1].mlevel) 1353. 			num--; 1354. 		} 1355. 	    }  1356. 	first--; /* correct an off-by-one error */ 1357. 1358. 	return(&mons[first]); 1359. } 1360.  1361. int 1362. adj_lev(ptr)	/* adjust strength of monsters based on u.uz and u.ulevel */ 1363. register struct permonst *ptr; 1364. { 1365. 	int	tmp, tmp2; 1366. 1367. 	if (ptr == &mons[PM_WIZARD_OF_YENDOR]) { 1368. 		/* does not depend on other strengths, but does get stronger 1369. 		 * every time he is killed 1370. 		 */ 1371. 		tmp = ptr->mlevel + mvitals[PM_WIZARD_OF_YENDOR].died; 1372. 		if (tmp > 49) tmp = 49; 1373. 		return tmp; 1374. 	} 1375.  1376. 	if((tmp = ptr->mlevel) > 49) return(50); /* "special" demons/devils */ 1377. 	tmp2 = (level_difficulty - tmp); 1378. 	if(tmp2 < 0) tmp--;		/* if mlevel > u.uz decrement tmp */ 1379. 	else tmp += (tmp2 / 5);		/* else increment 1 per five diff */ 1380. 1381. 	tmp2 = (u.ulevel - ptr->mlevel);	/* adjust vs. the player */ 1382. 	if(tmp2 > 0) tmp += (tmp2 / 4);		/* level as well */ 1383. 1384. 	tmp2 = (3 * ((int) ptr->mlevel))/ 2;	/* crude upper limit */ 1385. 	if (tmp2 > 49) tmp2 = 49;		/* hard upper limit */ 1386. 	return((tmp > tmp2) ? tmp2 : (tmp > 0 ? tmp : 0)); /* 0 lower limit */ 1387. } 1388.  1389. #endif /* OVL1 */ 1390. #ifdef OVLB 1391. 1392. struct permonst * 1393. grow_up(mtmp, victim)	/* `mtmp' might "grow up" into a bigger version */ 1394. struct monst *mtmp, *victim; 1395. { 1396. 	int oldtype, newtype, max_increase, cur_increase, 1397. 	   lev_limit, hp_threshold; 1398. 	struct permonst *ptr = mtmp->data; 1399. 1400. 	/* monster died after killing enemy but before calling this function */ 1401. 	/* currently possible if killing a gas spore */ 1402. 	if (mtmp->mhp <= 0) 1403. 	   return ((struct permonst *)0); 1404. 1405. 	/* note:  none of the monsters with special hit point calculations 1406. 	  have both little and big forms */ 1407. 	oldtype = monsndx(ptr); 1408. 	newtype = little_to_big(oldtype); 1409. 	if (newtype == PM_PRIEST && mtmp->female) newtype = PM_PRIESTESS; 1410. 1411. 	/* growth limits differ depending on method of advancement */ 1412. 	if (victim) {		/* killed a monster */ 1413. 	   /*  1414. 	     * The HP threshold is the maximum number of hit points for the 1415. 	    * current level; once exceeded, a level will be gained. 1416. 	    * Possible bug: if somehow the hit points are already higher 1417. 	    * than that, monster will gain a level without any increase in HP. 1418. 	    */  1419. 	    hp_threshold = mtmp->m_lev * 8;		/* normal limit */ 1420. 	   if (!mtmp->m_lev) 1421. 		hp_threshold = 4; 1422. 	   else if (is_golem(ptr))	/* strange creatures */ 1423. 		hp_threshold = ((mtmp->mhpmax / 10) + 1) * 10 - 1; 1424. 	   else if (is_home_elemental(ptr)) 1425. 		hp_threshold *= 3; 1426. 	   lev_limit = 3 * (int)ptr->mlevel / 2;	/* same as adj_lev */ 1427. 	   /* If they can grow up, be sure the level is high enough for that */ 1428. 	   if (oldtype != newtype && mons[newtype].mlevel > lev_limit) 1429. 		lev_limit = (int)mons[newtype].mlevel; 1430. 	   /* number of hit points to gain; unlike for the player, we put 1431. 	      the limit at the bottom of the next level rather than the top */ 1432. 	   max_increase = rnd((int)victim->m_lev + 1); 1433. 	   if (mtmp->mhpmax + max_increase > hp_threshold + 1) 1434. 		max_increase = max((hp_threshold + 1) - mtmp->mhpmax, 0); 1435. 	   cur_increase = (max_increase > 1) ? rn2(max_increase) : 0; 1436. 	} else { 1437. 	   /* a gain level potion or wraith corpse; always go up a level 1438. 	      unless already at maximum (49 is hard upper limit except  1439. 	       for demon lords, who start at 50 and can't go any higher) */ 1440. 	   max_increase = cur_increase = rnd(8); 1441. 	   hp_threshold = 0;	/* smaller than `mhpmax + max_increase' */ 1442. 	   lev_limit = 50;		/* recalc below */ 1443. 	} 1444.  1445. 	mtmp->mhpmax += max_increase; 1446. 	mtmp->mhp += cur_increase; 1447. 	if (mtmp->mhpmax <= hp_threshold) 1448. 	   return ptr;		/* doesn't gain a level */ 1449. 1450. 	if (is_mplayer(ptr)) lev_limit = 30;	/* same as player */ 1451. 	else if (lev_limit < 5) lev_limit = 5;	/* arbitrary */ 1452. 	else if (lev_limit > 49) lev_limit = (ptr->mlevel > 49 ? 50 : 49); 1453. 1454. 	if ((int)++mtmp->m_lev >= mons[newtype].mlevel && newtype != oldtype) { 1455. 	   ptr = &mons[newtype]; 1456. 	   if (mvitals[newtype].mvflags & G_GENOD) {	/* allow G_EXTINCT */ 1457. 		if (sensemon(mtmp)) 1458. 		   pline("As %s grows up into %s, %s %s!", mon_nam(mtmp),  1459. 			an(ptr->mname), mhe(mtmp),  1460. 			nonliving(ptr) ? "expires" : "dies"); 1461. 		set_mon_data(mtmp, ptr, -1);	/* keep mvitals[] accurate */ 1462. 		mondied(mtmp); 1463. 		return (struct permonst *)0; 1464. 	   }  1465. 	    set_mon_data(mtmp, ptr, 1);		/* preserve intrinsics */ 1466. 	   newsym(mtmp->mx, mtmp->my);		/* color may change */ 1467. 	   lev_limit = (int)mtmp->m_lev;	/* never undo increment */ 1468. 	} 1469. 	/* sanity checks */ 1470. 	if ((int)mtmp->m_lev > lev_limit) { 1471. 	   mtmp->m_lev--;	/* undo increment */ 1472. 	   /* HP might have been allowed to grow when it shouldn't */ 1473. 	   if (mtmp->mhpmax == hp_threshold + 1) mtmp->mhpmax--; 1474. 	} 1475. 	if (mtmp->mhpmax > 50*8) mtmp->mhpmax = 50*8;	  /* absolute limit */ 1476. 	if (mtmp->mhp > mtmp->mhpmax) mtmp->mhp = mtmp->mhpmax; 1477. 1478. 	return ptr; 1479. } 1480.  1481. #endif /* OVLB */ 1482. #ifdef OVL1 1483. 1484. int 1485. mongets(mtmp, otyp) 1486. register struct monst *mtmp; 1487. register int otyp; 1488. { 1489. 	register struct obj *otmp; 1490. 	int spe; 1491. 1492. 	if (!otyp) return 0; 1493. 	otmp = mksobj(otyp, TRUE, FALSE); 1494. 	if (otmp) { 1495. 	   if (mtmp->data->mlet == S_DEMON) { 1496. 		/* demons never get blessed objects */ 1497. 		if (otmp->blessed) curse(otmp); 1498. 	   } else if(is_lminion(mtmp)) { 1499. 		/* lawful minions don't get cursed, bad, or rusting objects */ 1500. 		otmp->cursed = FALSE; 1501. 		if(otmp->spe < 0) otmp->spe = 0; 1502. 		otmp->oerodeproof = TRUE; 1503. 	   } else if(is_mplayer(mtmp->data) && is_sword(otmp)) { 1504. 		otmp->spe = (3 + rn2(4)); 1505. 	   }  1506.  1507. 	    if(otmp->otyp == CANDELABRUM_OF_INVOCATION) { 1508. 		otmp->spe = 0; 1509. 		otmp->age = 0L; 1510. 		otmp->lamplit = FALSE; 1511. 		otmp->blessed = otmp->cursed = FALSE; 1512. 	   } else if (otmp->otyp == BELL_OF_OPENING) { 1513. 		otmp->blessed = otmp->cursed = FALSE; 1514. 	   } else if (otmp->otyp == SPE_BOOK_OF_THE_DEAD) { 1515. 		otmp->blessed = FALSE; 1516. 		otmp->cursed = TRUE; 1517. 	   }  1518.  1519. 	    /* leaders don't tolerate inferior quality battle gear */ 1520. 	   if (is_prince(mtmp->data)) { 1521. 		if (otmp->oclass == WEAPON_CLASS && otmp->spe < 1) 1522. 		   otmp->spe = 1; 1523. 		else if (otmp->oclass == ARMOR_CLASS && otmp->spe < 0) 1524. 		   otmp->spe = 0; 1525. 	   }  1526.  1527. 	    spe = otmp->spe; 1528. 	   (void) mpickobj(mtmp, otmp);	/* might free otmp */ 1529. 	   return(spe); 1530. 	} else return(0); 1531. } 1532.  1533. #endif /* OVL1 */ 1534. #ifdef OVLB 1535. 1536. int 1537. golemhp(type) 1538. int type; 1539. { 1540. 	switch(type) { 1541. 		case PM_STRAW_GOLEM: return 20; 1542. 		case PM_PAPER_GOLEM: return 20; 1543. 		case PM_ROPE_GOLEM: return 30; 1544. 		case PM_LEATHER_GOLEM: return 40; 1545. 		case PM_GOLD_GOLEM: return 40; 1546. 		case PM_WOOD_GOLEM: return 50; 1547. 		case PM_FLESH_GOLEM: return 40; 1548. 		case PM_CLAY_GOLEM: return 50; 1549. 		case PM_STONE_GOLEM: return 60; 1550. 		case PM_GLASS_GOLEM: return 60; 1551. 		case PM_IRON_GOLEM: return 80; 1552. 		default: return 0; 1553. 	} 1554. }  1555.  1556. #endif /* OVLB */ 1557. #ifdef OVL1 1558. 1559. /*  1560.  *	Alignment vs. yours determines monster's attitude to you. 1561. *	( some "animal" types are co-aligned, but also hungry ) 1562. */  1563. boolean 1564. peace_minded(ptr) 1565. register struct permonst *ptr; 1566. { 1567. 	aligntyp mal = ptr->maligntyp, ual = u.ualign.type; 1568. 1569. 	if (always_peaceful(ptr)) return TRUE; 1570. 	if (always_hostile(ptr)) return FALSE; 1571. 	if (ptr->msound == MS_LEADER || ptr->msound == MS_GUARDIAN) 1572. 		return TRUE; 1573. 	if (ptr->msound == MS_NEMESIS)	return FALSE; 1574. 1575. 	if (race_peaceful(ptr)) return TRUE; 1576. 	if (race_hostile(ptr)) return FALSE; 1577. 1578. 	/* the monster is hostile if its alignment is different from the 1579. 	 * player's */ 1580. 	if (sgn(mal) != sgn(ual)) return FALSE; 1581. 1582. 	/* Negative monster hostile to player with Amulet. */ 1583. 	if (mal < A_NEUTRAL && u.uhave.amulet) return FALSE; 1584. 1585. 	/* minions are hostile to players that have strayed at all */ 1586. 	if (is_minion(ptr)) return((boolean)(u.ualign.record >= 0)); 1587. 1588. 	/* Last case:  a chance of a co-aligned monster being 1589. 	 * hostile. This chance is greater if the player has strayed 1590. 	 * (u.ualign.record negative) or the monster is not strongly aligned. 1591. 	 */ 1592. 	return((boolean)(!!rn2(16 + (u.ualign.record < -15 ? -15 : u.ualign.record)) && 1593. 		!!rn2(2 + abs(mal)))); 1594. } 1595.  1596. /* Set malign to have the proper effect on player alignment if monster is  1597. * killed. Negative numbers mean it's bad to kill this monster; positive 1598. * numbers mean it's good. Since there are more hostile monsters than 1599. * peaceful monsters, the penalty for killing a peaceful monster should be  1600. * greater than the bonus for killing a hostile monster to maintain balance. 1601. * Rules: 1602. *   it's bad to kill peaceful monsters, potentially worse to kill always- 1603. *	peaceful monsters 1604. *   it's never bad to kill a hostile monster, although it may not be good 1605. */  1606. void 1607. set_malign(mtmp) 1608. struct monst *mtmp; 1609. { 1610. 	schar mal = mtmp->data->maligntyp; 1611. 	boolean coaligned; 1612. 1613. 	if (mtmp->ispriest || mtmp->isminion) { 1614. 		/* some monsters have individual alignments; check them */ 1615. 		if (mtmp->ispriest) 1616. 			mal = EPRI(mtmp)->shralign; 1617. 		else if (mtmp->isminion) 1618. 			mal = EMIN(mtmp)->min_align; 1619. 		/* unless alignment is none, set mal to -5,0,5 */ 1620. 		/* (see align.h for valid aligntyp values)    */ 1621. 		if(mal != A_NONE) 1622. 			mal *= 5; 1623. 	} 1624.  1625. 	coaligned = (sgn(mal) == sgn(u.ualign.type)); 1626. 	if (mtmp->data->msound == MS_LEADER) { 1627. 		mtmp->malign = -20; 1628. 	} else if (mal == A_NONE) { 1629. 		if (mtmp->mpeaceful) 1630. 			mtmp->malign = 0; 1631. 		else 1632. 			mtmp->malign = 20;	/* really hostile */ 1633. 	} else if (always_peaceful(mtmp->data)) { 1634. 		int absmal = abs(mal); 1635. 		if (mtmp->mpeaceful) 1636. 			mtmp->malign = -3*max(5,absmal); 1637. 		else 1638. 			mtmp->malign = 3*max(5,absmal); /* renegade */ 1639. 	} else if (always_hostile(mtmp->data)) { 1640. 		int absmal = abs(mal); 1641. 		if (coaligned) 1642. 			mtmp->malign = 0; 1643. 		else 1644. 			mtmp->malign = max(5,absmal); 1645. 	} else if (coaligned) { 1646. 		int absmal = abs(mal); 1647. 		if (mtmp->mpeaceful) 1648. 			mtmp->malign = -3*max(3,absmal); 1649. 		else	/* renegade */ 1650. 			mtmp->malign = max(3,absmal); 1651. 	} else	/* not coaligned and therefore hostile */ 1652. 		mtmp->malign = abs(mal); 1653. } 1654.  1655. #endif /* OVL1 */ 1656. #ifdef OVLB 1657. 1658. static NEARDATA char syms[] = { 1659. 	MAXOCLASSES, MAXOCLASSES+1, RING_CLASS, WAND_CLASS, WEAPON_CLASS, 1660. 	FOOD_CLASS, COIN_CLASS, SCROLL_CLASS, POTION_CLASS, ARMOR_CLASS, 1661. 	AMULET_CLASS, TOOL_CLASS, ROCK_CLASS, GEM_CLASS, SPBOOK_CLASS, 1662. 	S_MIMIC_DEF, S_MIMIC_DEF, S_MIMIC_DEF, 1663. }; 1664.  1665. void 1666. set_mimic_sym(mtmp)		/* KAA, modified by ERS */ 1667. register struct monst *mtmp; 1668. { 1669. 	int typ, roomno, rt; 1670. 	unsigned appear, ap_type; 1671. 	int s_sym; 1672. 	struct obj *otmp; 1673. 	int mx, my; 1674. 1675. 	if (!mtmp) return; 1676. 	mx = mtmp->mx; my = mtmp->my; 1677. 	typ = levl[mx][my].typ; 1678. 					/* only valid for INSIDE of room */ 1679. 	roomno = levl[mx][my].roomno - ROOMOFFSET; 1680. 	if (roomno >= 0) 1681. 		rt = rooms[roomno].rtype; 1682. #ifdef SPECIALIZATION 1683. 	else if (IS_ROOM(typ)) 1684. 		rt = OROOM, roomno = 0; 1685. #endif 1686. 	else	rt = 0;	/* roomno < 0 case for GCC_WARN */ 1687. 1688. 	if (OBJ_AT(mx, my)) { 1689. 		ap_type = M_AP_OBJECT; 1690. 		appear = level.objects[mx][my]->otyp; 1691. 	} else if (IS_DOOR(typ) || IS_WALL(typ) || 1692. 		   typ == SDOOR || typ == SCORR) { 1693. 		ap_type = M_AP_FURNITURE; 1694. 		/* 1695. 		 *  If there is a wall to the left that connects to this 1696. 		 * location, then the mimic mimics a horizontal closed door. 1697. 		 * This does not allow doors to be in corners of rooms. 1698. 		 */ 1699. 		if (mx != 0 &&  1700. 			(levl[mx-1][my].typ == HWALL    || 1701. 			 levl[mx-1][my].typ == TLCORNER || 1702. 			 levl[mx-1][my].typ == TRWALL  || 1703. 			 levl[mx-1][my].typ == BLCORNER || 1704. 			 levl[mx-1][my].typ == TDWALL  || 1705. 			 levl[mx-1][my].typ == CROSSWALL|| 1706. 			 levl[mx-1][my].typ == TUWALL   )) 1707. 		   appear = S_hcdoor; 1708. 		else 1709. 		   appear = S_vcdoor; 1710. 1711. 		if(!mtmp->minvis || See_invisible) 1712. 		   block_point(mx,my);	/* vision */ 1713. 	} else if (level.flags.is_maze_lev && rn2(2)) { 1714. 		ap_type = M_AP_OBJECT; 1715. 		appear = STATUE; 1716. 	} else if (roomno < 0) { 1717. 		ap_type = M_AP_OBJECT; 1718. 		appear = BOULDER; 1719. 		if(!mtmp->minvis || See_invisible) 1720. 		   block_point(mx,my);	/* vision */ 1721. 	} else if (rt == ZOO || rt == VAULT) { 1722. 		ap_type = M_AP_OBJECT; 1723. 		appear = GOLD_PIECE; 1724. 	} else if (rt == DELPHI) { 1725. 		if (rn2(2)) { 1726. 			ap_type = M_AP_OBJECT; 1727. 			appear = STATUE; 1728. 		} else { 1729. 			ap_type = M_AP_FURNITURE; 1730. 			appear = S_fountain; 1731. 		} 1732. 	} else if (rt == TEMPLE) { 1733. 		ap_type = M_AP_FURNITURE; 1734. 		appear = S_altar; 1735. 	/* 1736. 	 * We won't bother with beehives, morgues, barracks, throne rooms 1737. 	 * since they shouldn't contain too many mimics anyway... 1738. */ 1739. 	} else if (rt >= SHOPBASE) { 1740. 		s_sym = get_shop_item(rt - SHOPBASE); 1741. 		if (s_sym < 0) { 1742. 			ap_type = M_AP_OBJECT; 1743. 			appear = -s_sym; 1744. 		} else { 1745. 			if (s_sym == RANDOM_CLASS) 1746. 				s_sym = syms[rn2((int)sizeof(syms)-2) + 2]; 1747. 			goto assign_sym; 1748. 		} 1749. 	} else { 1750. 		s_sym = syms[rn2((int)sizeof(syms))]; 1751. assign_sym: 1752. 		if (s_sym >= MAXOCLASSES) { 1753. 			ap_type = M_AP_FURNITURE; 1754. 			appear = s_sym == MAXOCLASSES ? S_upstair : S_dnstair; 1755. 		} else if (s_sym == COIN_CLASS) { 1756. 			ap_type = M_AP_OBJECT; 1757. 			appear = GOLD_PIECE; 1758. 		} else { 1759. 			ap_type = M_AP_OBJECT; 1760. 			if (s_sym == S_MIMIC_DEF) { 1761. 				appear = STRANGE_OBJECT; 1762. 			} else { 1763. 				otmp = mkobj( (char) s_sym, FALSE ); 1764. 				appear = otmp->otyp; 1765. 				/* make sure container contents are free'ed */ 1766. 				obfree(otmp, (struct obj *) 0); 1767. 			} 1768. 		}  1769. 	}  1770. 	mtmp->m_ap_type = ap_type; 1771. 	mtmp->mappearance = appear; 1772. } 1773.  1774. /* release a monster from a bag of tricks */ 1775. void 1776. bagotricks(bag) 1777. struct obj *bag; 1778. { 1779.     if (!bag || bag->otyp != BAG_OF_TRICKS) { 1780. 	impossible("bad bag o' tricks"); 1781.    } else if (bag->spe < 1) { 1782. 	pline(nothing_happens); 1783.    } else { 1784. 	boolean gotone = FALSE; 1785. 	int cnt = 1; 1786. 1787. 	consume_obj_charge(bag, TRUE); 1788. 1789. 	if (!rn2(23)) cnt += rn1(7, 1); 1790. 	while (cnt-- > 0) { 1791. 	   if (makemon((struct permonst *)0, u.ux, u.uy, NO_MM_FLAGS)) 1792. 		gotone = TRUE; 1793. 	} 1794. 	if (gotone) makeknown(BAG_OF_TRICKS); 1795.    }  1796. }  1797.  1798. #endif /* OVLB */ 1799. 1800. /*makemon.c*/