Source:SLASH'EM 0.0.7E7F2/makemon.c

Below is the full text to makemon.c from the source code of SLASH'EM 0.0.7E7F2. To link to a particular line, write [[SLASH'EM 0.0.7E7F2/makemon.c#line123 ]], for example.

The latest source code for vanilla NetHack is at Source code.

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.  STATIC_DCL void FDECL(m_initweap_normal,(struct monst *)); 31.  #ifdef OVL1 32.  STATIC_DCL void FDECL(m_initinv,(struct monst *)); 33.  #endif /* OVL1 */ 34.   35.   extern const int monstr[]; 36.   37.   #define m_initsgrp(mtmp, x, y)	m_initgrp(mtmp, x, y, 3) 38.  #define m_initlgrp(mtmp, x, y)	m_initgrp(mtmp, x, y, 10) 39.  #define m_initvlgrp(mtmp, x, y)  m_initgrp(mtmp, x, y, 20) 40.  #define toostrong(monindx, lev) (monstr[monindx] > lev) 41.  #define tooweak(monindx, lev)	(monstr[monindx] < lev) 42.   43.   #ifdef OVLB 44.  boolean 45.  is_home_elemental(ptr) 46.  register struct permonst *ptr; 47.  {  48.   	if (ptr->mlet == S_ELEMENTAL) 49.  	    switch (monsndx(ptr)) { 50.  		case PM_AIR_ELEMENTAL: return Is_airlevel(&u.uz); 51.  		case PM_FIRE_ELEMENTAL: return Is_firelevel(&u.uz); 52.  		case PM_EARTH_ELEMENTAL: return Is_earthlevel(&u.uz); 53.  		case PM_WATER_ELEMENTAL: return Is_waterlevel(&u.uz); 54.  	    }  55.   	return FALSE; 56.  }  57.    58.   /*  59.    * Return true if the given monster cannot exist on this elemental level. 60.   */  61.   STATIC_OVL boolean 62.  wrong_elem_type(ptr) 63.      register struct permonst *ptr; 64.  {  65.       if (ptr->mlet == S_ELEMENTAL) { 66.  	return((boolean)(!is_home_elemental(ptr))); 67.      } else if (Is_earthlevel(&u.uz)) { 68.  	/* no restrictions? */ 69.       } else if (Is_waterlevel(&u.uz)) { 70.  	/* just monsters that can swim */ 71.  	if(!is_swimmer(ptr)) return TRUE; 72.      } else if (Is_firelevel(&u.uz)) { 73.  	if (!pm_resistance(ptr,MR_FIRE)) return TRUE; 74.      } else if (Is_airlevel(&u.uz)) { 75.  	if(!(is_flyer(ptr) && ptr->mlet != S_TRAPPER) && !is_floater(ptr)  76.   	   && !amorphous(ptr) && !noncorporeal(ptr) && !is_whirly(ptr)) 77.  	    return TRUE; 78.      }  79.       return FALSE; 80.  }  81.    82.   STATIC_OVL void 83.  m_initgrp(mtmp, x, y, n)	/* make a group just like mtmp */ 84.  register struct monst *mtmp; 85.  register int x, y, n;  86. { 87.   	coord mm; 88.  	register int cnt = rnd(n); 89.  	struct monst *mon; 90.  #if defined(__GNUC__) && (defined(HPUX) || defined(DGUX)) 91.  	/* There is an unresolved problem with several people finding that 92.  	 * the game hangs eating CPU; if interrupted and restored, the level 93.  	 * will be filled with monsters. Of those reports giving system type, 94.  	 * there were two DG/UX and two HP-UX, all using gcc as the compiler. 95.  	 * hcroft@hpopb1.cern.ch, using gcc 2.6.3 on HP-UX, says that the 96.  	 * problem went away for him and another reporter-to-newsgroup 97.  	 * after adding this debugging code. This has almost got to be a 98. * compiler bug, but until somebody tracks it down and gets it fixed, 99.  	 * might as well go with the "but it went away when I tried to find  100.  	 * it" code. 101. 	 */  102.  	int cnttmp,cntdiv; 103.  104.  	cnttmp = cnt; 105. # ifdef DEBUG 106. 	pline("init group call x=%d,y=%d,n=%d,cnt=%d.", x, y, n, cnt); 107. # endif 108. 	cntdiv = ((u.ulevel < 3) ? 4 : (u.ulevel < 5) ? 2 : 1); 109. #endif 110. 	/* Tuning: cut down on swarming at low character levels [mrs] */ 111. 	if (u.ulevel < 5) cnt /= 2; 112. #if defined(__GNUC__) && (defined(HPUX) || defined(DGUX)) 113. 	if (cnt != (cnttmp/cntdiv)) { 114. 		pline("cnt=%d using %d, cnttmp=%d, cntdiv=%d", cnt,  115.  			(u.ulevel < 3) ? 4 : (u.ulevel < 5) ? 2 : 1,  116.  			cnttmp, cntdiv); 117. 	}  118.  #endif 119. 	if(!cnt) cnt++; 120. #if defined(__GNUC__) && (defined(HPUX) || defined(DGUX)) 121. 	if (cnt < 0) cnt = 1; 122. 	if (cnt > 10) cnt = 10; 123. #endif 124.  125.  	mm.x = x;  126. mm.y = y; 127. while(cnt--) { 128. 		if (peace_minded(mtmp->data)) continue; 129. 		/* Don't create groups of peaceful monsters since they'll get 130. 		 * in our way. If the monster has a percentage chance so some 131. 		 * are peaceful and some are not, the result will just be a  132. * smaller group. 133. 		 */  134.  		if (enexto(&mm, mm.x, mm.y, mtmp->data)) { 135. 		    mon = makemon(mtmp->data, mm.x, mm.y, NO_MM_FLAGS); 136. 		    mon->mpeaceful = FALSE; 137. 		    mon->mavenge = 0; 138. 		    set_malign(mon); 139. 		    /* Undo the second peace_minded check in makemon; if the 140. 		     * monster turned out to be peaceful the first time we  141. * didn't create it at all; we don't want a second check. 142. 		     */  143.  		}  144.  	}  145.  }  146.   147.  STATIC_OVL 148. void 149. m_initthrow(mtmp,otyp,oquan) 150. struct monst *mtmp; 151. int otyp,oquan; 152. {  153.  	register struct obj *otmp; 154.  155.  	otmp = mksobj(otyp, TRUE, FALSE); 156. 	otmp->quan = (long) rn1(oquan, 3); 157. 	otmp->owt = weight(otmp); 158. 	if (otyp == ORCISH_ARROW) otmp->opoisoned = TRUE; 159. 	(void) mpickobj(mtmp, otmp); 160. }  161.   162.  #endif /* OVLB */ 163. #ifdef OVL2 164.  165.  STATIC_OVL void 166. m_initweap_normal(mtmp) 167. register struct monst *mtmp; 168. {  169.  	register struct permonst *ptr = mtmp->data; 170. 	int bias; 171.  172.  	bias = is_lord(ptr) + is_prince(ptr) * 2 + extra_nasty(ptr); 173. 	switch(rnd(14 - (2 * bias))) { 174. 	    case 1: 175. 		if(strongmonst(ptr)) (void) mongets(mtmp, BATTLE_AXE); 176. 		else m_initthrow(mtmp, DART, 12); 177. 		break; 178. 	    case 2: 179. 		if(strongmonst(ptr)) 180. 		    (void) mongets(mtmp, TWO_HANDED_SWORD); 181. 		else { 182. 		    (void) mongets(mtmp, CROSSBOW); 183. 		    m_initthrow(mtmp, CROSSBOW_BOLT, 12); 184. 		}  185.  		break; 186. 	    case 3: 187. 		(void) mongets(mtmp, BOW); 188. 		m_initthrow(mtmp, ARROW, 12); 189. 		break; 190. 	    case 4: 191. 		if(strongmonst(ptr)) (void) mongets(mtmp, LONG_SWORD); 192. 		else m_initthrow(mtmp, DAGGER, 3); 193. 		break; 194. 	    case 5: 195. 		if(strongmonst(ptr)) 196. 		    (void) mongets(mtmp, LUCERN_HAMMER); 197. 		else (void) mongets(mtmp, AKLYS); 198. 		break; 199. 	    /* [Tom] added some more */ 200. 	    case 6: 201. 		if(strongmonst(ptr)) 202. 		    (void) mongets(mtmp, AXE); 203. 		else (void) mongets(mtmp, SHORT_SWORD); 204. 		break; 205. 	    case 7: 206. 		if(strongmonst(ptr)) 207. 		    (void) mongets(mtmp, MACE); 208. 		else (void) mongets(mtmp, CLUB); 209. 		break; 210. 	    default: 211. 		break; 212. 	}  213.   214.  	return; 215. }  216.   217.  STATIC_OVL void 218. m_initweap(mtmp) 219. register struct monst *mtmp; 220. {  221.  	register struct permonst *ptr = mtmp->data; 222. 	register int mm = monsndx(ptr); 223. 	struct obj *otmp; 224.  225.  #ifdef REINCARNATION 226. 	if (Is_rogue_level(&u.uz)) return; 227. #endif 228. /*  229.   *	first a few special cases: 230.  *  231.   *		giants get a boulder to throw sometimes. 232.  *		ettins get clubs 233.  *		kobolds get darts to throw 234.  *		centaurs get some sort of bow & arrows or bolts 235.  *		soldiers get all sorts of things. 236.  *		kops get clubs & cream pies. 237.  */  238.  	switch (ptr->mlet) { 239. 	    case S_GIANT: 240. 		if (rn2(2)) (void)mongets(mtmp, (mm != PM_ETTIN) ?  241.  				    BOULDER : CLUB); 242. 		break; 243. 	    case S_HUMAN: 244. 		if(is_mercenary(ptr) || mm == PM_SHOPKEEPER  245.  #ifdef YEOMAN  246.  				|| mm == PM_CHIEF_YEOMAN_WARDER || mm == PM_YEOMAN_WARDER  247.  #endif  248.  		) { 249. 		    int w1 = 0, w2 = 0; 250. 		    switch (mm) { 251. 			case PM_SOLDIER: 252. #ifdef FIREARMS 253. 			  w1 = rn2(2) ? RIFLE : SUBMACHINE_GUN; 254. 		  	  m_initthrow(mtmp, BULLET, 25); 255. 		  	  m_initthrow(mtmp, BULLET, 25); 256. 			  w2 = rn2(2) ? KNIFE : DAGGER; 257. 			  (void) mongets(mtmp, FRAG_GRENADE); 258. 			  break; 259. #endif 260. 			case PM_WATCHMAN: 261. 			  if (!rn2(3)) { 262. 			      w1 = rn1(BEC_DE_CORBIN - PARTISAN + 1, PARTISAN); 263. 			      w2 = rn2(2) ? DAGGER : KNIFE; 264. 			  } else w1 = rn2(2) ? SPEAR : SHORT_SWORD; 265. 			  break; 266. 			case PM_WATCH_CAPTAIN: 267. 			  w1 = rn2(2) ? LONG_SWORD : SILVER_SABER; 268. 			  break; 269. 			case PM_LIEUTENANT: 270. #ifdef FIREARMS 271. 			  if (rn2(2)) { 272. 			  	w1 = HEAVY_MACHINE_GUN; 273. 			  	m_initthrow(mtmp, BULLET, 50); 274. 			  	m_initthrow(mtmp, BULLET, 50); 275. 			  	m_initthrow(mtmp, BULLET, 50); 276. 			  } else { 277. 			  	w1 = SUBMACHINE_GUN; 278. 			  	m_initthrow(mtmp, BULLET, 30); 279. 			  	m_initthrow(mtmp, BULLET, 30); 280. 			  }  281.  			  w2 = rn2(2) ? KNIFE : DAGGER; 282. 			  if (rn2(2)) { 283. 			  	(void) mongets(mtmp, FRAG_GRENADE); 284. 			  	(void) mongets(mtmp, FRAG_GRENADE); 285. 			  } else { 286. 			  	(void) mongets(mtmp, GAS_GRENADE); 287. 			  	(void) mongets(mtmp, GAS_GRENADE); 288. 			  }  289.  			  break; 290. #endif 291. 			case PM_SERGEANT: 292. #ifdef FIREARMS 293. 			  if (rn2(2)) { 294. 			  	w1 = AUTO_SHOTGUN; 295. 			  	m_initthrow(mtmp, SHOTGUN_SHELL, 10); 296. 			  	m_initthrow(mtmp, SHOTGUN_SHELL, 10); 297. 			  } else { 298. 			  	w1 = ASSAULT_RIFLE; 299. 			  	m_initthrow(mtmp, BULLET, 30); 300. 			  	m_initthrow(mtmp, BULLET, 30); 301. 			  }  302.  			  w2= rn2(2) ? DAGGER : KNIFE; 303. 			  if (rn2(2)) { 304. 			  	m_initthrow(mtmp, FRAG_GRENADE, 5); 305. 			  } else { 306. 			  	m_initthrow(mtmp, GAS_GRENADE, 5); 307. 			  }  308.  			  if (!rn2(5)) (void) mongets(mtmp, GRENADE_LAUNCHER); 309. 			  break; 310. #endif 311. #ifdef YEOMAN 312. 			case PM_YEOMAN_WARDER: 313. #endif 314. 			  w1 = rn2(2) ? FLAIL : MACE; 315. 			  break; 316. 			case PM_CAPTAIN: 317. #ifdef FIREARMS 318. 			  if (rn2(2)) { 319. 			  	w1 = AUTO_SHOTGUN; 320. 			  	m_initthrow(mtmp, SHOTGUN_SHELL, 20); 321. 			  	m_initthrow(mtmp, SHOTGUN_SHELL, 20); 322. 			  } else if (rn2(2)) { 323. 			  	w1 = HEAVY_MACHINE_GUN; 324. 			  	m_initthrow(mtmp, BULLET, 60); 325. 			  	m_initthrow(mtmp, BULLET, 60); 326. 			  	m_initthrow(mtmp, BULLET, 60); 327. 			  } else { 328. 			  	w1 = ASSAULT_RIFLE; 329. 			  	m_initthrow(mtmp, BULLET, 60); 330. 			  	m_initthrow(mtmp, BULLET, 60); 331. 			  }  332.  			  if (rn2(2)) { 333. 				  w2 = ROCKET_LAUNCHER; 334. 			  	  m_initthrow(mtmp, ROCKET, 5); 335. 			  } else if (rn2(2)) { 336. 				  (void) mongets(mtmp, GRENADE_LAUNCHER); 337. 			  	  m_initthrow(mtmp,  338.  			  	  	(rn2(2) ? FRAG_GRENADE : GAS_GRENADE), 339.  			  	  	5); 340. 			  } else { 341. 				  w2 = rn2(2) ? SILVER_SABER : DAGGER; 342. 			  }  343.  			  break; 344. #endif 345. #ifdef YEOMAN 346. 			case PM_CHIEF_YEOMAN_WARDER: 347. #endif 348. 			  w1 = rn2(2) ? BROADSWORD : LONG_SWORD; 349. 			  break; 350. 			case PM_SHOPKEEPER: 351. #ifdef FIREARMS 352. 			  (void) mongets(mtmp,SHOTGUN); 353. 			  m_initthrow(mtmp, SHOTGUN_SHELL, 20); 354. 			  m_initthrow(mtmp, SHOTGUN_SHELL, 20); 355. 			  m_initthrow(mtmp, SHOTGUN_SHELL, 20); 356. #endif 357. 			  /* Fallthrough */ 358. 			default: 359. 			  if (!rn2(4)) w1 = DAGGER; 360. 			  if (!rn2(7)) w2 = SPEAR; 361. 			  break; 362. 		    }  363.  		    if (w1) (void)mongets(mtmp, w1); 364. 		    if (!w2 && w1 != DAGGER && !rn2(4)) w2 = KNIFE; 365. 		    if (w2) (void)mongets(mtmp, w2); 366. 		} else if (is_elf(ptr)) { 367. 		    if (mm == PM_DROW) { 368. 			(void) mongets(mtmp, DARK_ELVEN_MITHRIL_COAT); 369. 			(void) mongets(mtmp, DARK_ELVEN_SHORT_SWORD); 370. 			(void) mongets(mtmp, DARK_ELVEN_BOW); 371. 			m_initthrow(mtmp, DARK_ELVEN_ARROW, 12); 372. 		    } else { 373. 		    if (rn2(2)) 374. 			(void) mongets(mtmp,  375.  				   !rn2(4) ? ELVEN_MITHRIL_COAT : ELVEN_CLOAK); 376. 		      if (!rn2(3)) (void)mongets(mtmp, ELVEN_LEATHER_HELM); 377. 		    else if (!rn2(4)) (void)mongets(mtmp, ELVEN_BOOTS); 378. 		      if (!rn2(3)) (void)mongets(mtmp, ELVEN_DAGGER); 379. 		    switch (rn2(3)) { 380. 			case 0: 381. 			    if (!rn2(4)) (void)mongets(mtmp, ELVEN_SHIELD); 382. 			    if (rn2(3)) (void)mongets(mtmp, ELVEN_SHORT_SWORD); 383. 			    (void)mongets(mtmp, ELVEN_BOW); 384. 			    m_initthrow(mtmp, ELVEN_ARROW, 12); 385. 			    break; 386. 			case 1: 387. 			    (void)mongets(mtmp, ELVEN_BROADSWORD); 388. 			    if (rn2(2)) (void)mongets(mtmp, ELVEN_SHIELD); 389. 			    break; 390. 			case 2: 391. 			    if (rn2(2)) { 392. 				(void)mongets(mtmp, ELVEN_SPEAR); 393. 				(void)mongets(mtmp, ELVEN_SHIELD); 394. 			    }  395.  			    break; 396. 		    }  397.  		    if (mm == PM_ELVENKING) { 398. 			if (rn2(3) || (in_mklev && Is_earthlevel(&u.uz))) 399. 			    (void)mongets(mtmp, PICK_AXE); 400. 			if (!rn2(50)) (void)mongets(mtmp, CRYSTAL_BALL); 401. 		    }  402.  		    } /* normal elves */ 403. 		} else /* enemy characters! */ 404.  		 if (mm >= PM_ARCHEOLOGIST && mm <= PM_WIZARD && rn2(4)) { 405. 		  switch (mm) { 406. 		   case PM_ARCHEOLOGIST: 407. 		     (void)mongets(mtmp, BULLWHIP); 408. 		     (void)mongets(mtmp, LEATHER_JACKET); 409. 		     (void)mongets(mtmp, FEDORA); 410. 		     if (rn2(2)) (void)mongets(mtmp, PICK_AXE); 411. #ifndef GOLDOBJ 412. 		     mtmp->mgold = (long) d(mtmp->m_lev, 15); 413. #else 414. 		     mkmonmoney(mtmp, (long) d(mtmp->m_lev, 15)); 415. #endif 416. 		   break; 417. 		   case PM_BARBARIAN: 418. 		     (void)mongets(mtmp, BATTLE_AXE); 419. 		     if (!rn2(2)) (void)mongets(mtmp, TWO_HANDED_SWORD); 420. 		     (void)mongets(mtmp, RING_MAIL); 421. #ifndef GOLDOBJ 422. 		     mtmp->mgold = (long) d(mtmp->m_lev, 15); 423. #else 424. 		     mkmonmoney(mtmp, (long) d(mtmp->m_lev, 15)); 425. #endif 426. 		   break; 427. 		   case PM_CAVEMAN: case PM_CAVEWOMAN: 428. 		     (void)mongets(mtmp, CLUB); 429. 		     if (rn2(3)) { 430. 			(void)mongets(mtmp, BOW); 431. 			 m_initthrow(mtmp, ARROW, 18); 432. 		     }  433.  		     (void)mongets(mtmp, LEATHER_ARMOR); 434. #ifndef GOLDOBJ 435. 		     mtmp->mgold = (long) d(mtmp->m_lev, 15); 436. #else 437. 		     mkmonmoney(mtmp, (long) d(mtmp->m_lev, 15)); 438. #endif 439. 		   break; 440. 		   case PM_DOPPELGANGER: 441. 		     (void)mongets(mtmp, SILVER_DAGGER); 442. #ifndef GOLDOBJ 443. 		     mtmp->mgold = (long) d(mtmp->m_lev, 15); 444. #else 445. 		     mkmonmoney(mtmp, (long) d(mtmp->m_lev, 15)); 446. #endif 447. 		   break; 448. 		   case PM_ELF: 449. 		     /* gets taken care of later... */ 450.  		     /*(void)mongets(mtmp, ELVEN_SHORT_SWORD); 451. 		     if (rn2(3)) { 452. 			(void)mongets(mtmp, ELVEN_BOW); 453. 			 m_initthrow(mtmp, ELVEN_ARROW, 18); 454. 		     }  455.  		     if (rn2(3)) (void)mongets(mtmp, ELVEN_CLOAK); 456. 		     else (void)mongets(mtmp, ELVEN_MITHRIL_COAT);*/ 457. #ifndef GOLDOBJ 458. 		     mtmp->mgold = (long) d(mtmp->m_lev, 15); 459. #else 460. 		     mkmonmoney(mtmp, (long) d(mtmp->m_lev, 15)); 461. #endif 462. 		   break; 463. 		   case PM_FLAME_MAGE: 464. 		     (void)mongets(mtmp, QUARTERSTAFF); 465. 		     (void)mongets(mtmp, STUDDED_LEATHER_ARMOR); 466. 		     (void)mongets(mtmp, WAN_FIRE); 467. #ifndef GOLDOBJ 468. 		     mtmp->mgold = (long) d(mtmp->m_lev, 15); 469. #else 470. 		     mkmonmoney(mtmp, (long) d(mtmp->m_lev, 15)); 471. #endif 472. 		   break; 473. 		   case PM_HEALER: 474. 		     (void)mongets(mtmp, SCALPEL); 475. 		     (void)mongets(mtmp, LEATHER_GLOVES); 476. 		     (void)mongets(mtmp, WAN_HEALING); 477. 		     (void)mongets(mtmp, WAN_SLEEP); 478. #ifndef GOLDOBJ 479. 		     mtmp->mgold = (long) d(mtmp->m_lev, 20); 480. #else 481. 		     mkmonmoney(mtmp, (long) d(mtmp->m_lev, 20)); 482. #endif 483. 		   break; 484. 		   case PM_ICE_MAGE: 485. 		     (void)mongets(mtmp, QUARTERSTAFF); 486. 		     (void)mongets(mtmp, STUDDED_LEATHER_ARMOR); 487. 		     (void)mongets(mtmp, WAN_COLD); 488. #ifndef GOLDOBJ 489. 		     mtmp->mgold = (long) d(mtmp->m_lev, 15); 490. #else 491. 		     mkmonmoney(mtmp, (long) d(mtmp->m_lev, 15)); 492. #endif 493. 		   break; 494. #ifdef YEOMAN 495. 		   case PM_YEOMAN: 496. #endif 497. 		   case PM_KNIGHT: 498. 		     (void)mongets(mtmp, LONG_SWORD); 499. 		     (void)mongets(mtmp, PLATE_MAIL); 500. 		     (void)mongets(mtmp, LARGE_SHIELD); 501. 		     (void)mongets(mtmp, HELMET); 502. 		     (void)mongets(mtmp, LEATHER_GLOVES); 503. #ifndef GOLDOBJ 504. 		     mtmp->mgold = (long) d(mtmp->m_lev, 15); 505. #else 506. 		     mkmonmoney(mtmp, (long) d(mtmp->m_lev, 15)); 507. #endif 508. 		     break; 509. 		   case PM_MONK: 510. #ifndef GOLDOBJ 511. 		     mtmp->mgold = (long) d(mtmp->m_lev, 5); 512. #else 513. 		     mkmonmoney(mtmp, (long) d(mtmp->m_lev, 5)); 514. #endif 515. 		   break; 516. 		   case PM_NECROMANCER: 517. 		     (void)mongets(mtmp, ATHAME); 518. 		     if (!rn2(4)) (void)mongets(mtmp, PICK_AXE); 519. 		     (void) mongets(mtmp, rnd_offensive_item(mtmp)); 520. 		     (void) mongets(mtmp, rnd_defensive_item(mtmp)); 521. #ifndef GOLDOBJ 522. 		     mtmp->mgold = (long) d(mtmp->m_lev, 15); 523. #else 524. 		     mkmonmoney(mtmp, (long) d(mtmp->m_lev, 15)); 525. #endif 526. 		   break; 527. 		   case PM_PRIEST: 528. 		   case PM_PRIESTESS: 529. 		     (void)mongets(mtmp, MACE); 530. 		     (void)mongets(mtmp, rn1(ROBE_OF_WEAKNESS - ROBE + 1, ROBE)); 531. 		     (void)mongets(mtmp, SMALL_SHIELD); 532. 		     if (!rn2(4)) { 533. 			int v,vials; 534. 			vials = rn2(4)+1; 535. 			for (v=0;vmgold = (long) d(mtmp->m_lev, 15); 543. #else 544. 		     mkmonmoney(mtmp, (long) d(mtmp->m_lev, 15)); 545. #endif 546. 		   break; 547. 		   case PM_ROGUE: 548. 		     (void)mongets(mtmp, SHORT_SWORD); 549. 		     (void)mongets(mtmp, LEATHER_ARMOR); 550. #ifndef GOLDOBJ 551. 		     mtmp->mgold = (long) d(mtmp->m_lev, 25); 552. #else 553. 		     mkmonmoney(mtmp, (long) d(mtmp->m_lev, 25)); 554. #endif 555. 		   break; 556. 		   case PM_SAMURAI: 557. 		     (void)mongets(mtmp, KATANA); 558. 		     if (rn2(2)) (void)mongets(mtmp, SHORT_SWORD); 559. 		     if (rn2(3)) { 560. 			(void)mongets(mtmp, YUMI); 561. 			m_initthrow(mtmp, YA, 18); 562. 		     }  563.  		     (void)mongets(mtmp, SPLINT_MAIL); 564. #ifndef GOLDOBJ 565. 		     mtmp->mgold = (long) d(mtmp->m_lev, 15); 566. #else 567. 		     mkmonmoney(mtmp, (long) d(mtmp->m_lev, 15)); 568. #endif 569. 		   break; 570. #ifdef TOURIST 571. 		   case PM_TOURIST: 572. 		     m_initthrow(mtmp, DART, 18); 573. 		     (void)mongets(mtmp, HAWAIIAN_SHIRT); 574. 		     if (rn2(2)) (void)mongets(mtmp, EXPENSIVE_CAMERA); 575. #ifndef GOLDOBJ 576. 		     mtmp->mgold = (long) d(mtmp->m_lev, 20); 577. #else 578. 		     mkmonmoney(mtmp, (long) d(mtmp->m_lev, 20)); 579. #endif 580. 		   break; 581. #endif 582. 		   case PM_UNDEAD_SLAYER: 583. 		     (void)mongets(mtmp, SILVER_SPEAR); 584. 		     (void)mongets(mtmp, CHAIN_MAIL); 585. #ifndef GOLDOBJ 586. 		     mtmp->mgold = (long) d(mtmp->m_lev, 15); 587. #else 588. 		     mkmonmoney(mtmp, (long) d(mtmp->m_lev, 15)); 589. #endif 590. 		   break; 591. 		   case PM_VALKYRIE: 592. 		     (void)mongets(mtmp, LONG_SWORD); 593. 		     if (!rn2(3)) m_initthrow(mtmp, DAGGER, 4); 594. 		     (void)mongets(mtmp, SMALL_SHIELD); 595. #ifndef GOLDOBJ 596. 		     mtmp->mgold = (long) d(mtmp->m_lev, 15); 597. #else 598. 		     mkmonmoney(mtmp, (long) d(mtmp->m_lev, 15)); 599. #endif 600. 		   break; 601. 		   case PM_WIZARD: 602. 		     (void)mongets(mtmp, ATHAME); 603. 		     (void) mongets(mtmp, rnd_offensive_item(mtmp)); 604. 		     (void) mongets(mtmp, rnd_offensive_item(mtmp)); 605. 		     (void) mongets(mtmp, rnd_defensive_item(mtmp)); 606. #ifndef GOLDOBJ 607. 		     mtmp->mgold = (long) d(mtmp->m_lev, 15); 608. #else 609. 		     mkmonmoney(mtmp, (long) d(mtmp->m_lev, 15)); 610. #endif 611. 		   break; 612. 		   default: 613. 		   break; 614. 		  }  615.  		  if ((int) mtmp->m_lev > rn2(40)) 616. 		     (void) mongets(mtmp, rnd_offensive_item(mtmp)); 617. 		  if ((int) mtmp->m_lev > rn2(40)) 618. 		     (void) mongets(mtmp, rnd_offensive_item(mtmp)); 619. 		  if ((int) mtmp->m_lev > rn2(40)) 620. 		     (void) mongets(mtmp, rnd_defensive_item(mtmp)); 621. 		  if ((int) mtmp->m_lev > rn2(40)) 622. 		     (void) mongets(mtmp, rnd_defensive_item(mtmp)); 623. 		  if ((int) mtmp->m_lev > rn2(40)) 624. 		     (void) mongets(mtmp, rnd_misc_item(mtmp)); 625. 		  if ((int) mtmp->m_lev > rn2(40)) 626. 		     (void) mongets(mtmp, rnd_misc_item(mtmp)); 627. 		 } /* end of other characters */ 628. 	       /*break;*/ 629. 		else if (ptr->msound == MS_PRIEST ||  630.  			quest_mon_represents_role(ptr,PM_PRIEST)) { 631. 		    otmp = mksobj(MACE, FALSE, FALSE); 632. 		    if(otmp) { 633. 			otmp->spe = rnd(3); 634. 			if(!rn2(2)) curse(otmp); 635. 			(void) mpickobj(mtmp, otmp); 636. 		    }  637.   638.  		    /* MRKR: Dwarves in the Mines sometimes carry torches */ 639.  640.  		    if (In_mines(&u.uz)) { 641. 		      if (!rn2(4)) { 642. 			otmp = mksobj(TORCH, TRUE, FALSE); 643. 			otmp->quan = 1; 644. 			(void) mpickobj(mtmp, otmp); 645.  646.  			/* If this spot is unlit, light the torch */ 647.  648.  			if (!levl[mtmp->mx][mtmp->my].lit) { 649. 			  begin_burn(otmp, FALSE); 650. 			}		       651.  		      }  652.  		    }  653.  		}  654.  		break; 655.  656.  	    case S_ANGEL: 657. 		{  658.  		    int spe2; 659.  660.  		    /* create minion stuff; can't use mongets */ 661. 		    otmp = mksobj(LONG_SWORD, FALSE, FALSE); 662.  663.  		    /* maybe make it special */ 664. 		    if (!rn2(20) || is_lord(ptr)) 665. 			otmp = oname(otmp, artiname( 666. 				rn2(2) ? ART_DEMONBANE : ART_SUNSWORD)); 667. 		    bless(otmp); 668. 		    otmp->oerodeproof = TRUE; 669. 		    spe2 = rn2(4); 670. 		    otmp->spe = max(otmp->spe, spe2); 671. 		    (void) mpickobj(mtmp, otmp); 672.  673.  		    otmp = mksobj(!rn2(4) || is_lord(ptr) ?  674.  				  SHIELD_OF_REFLECTION : LARGE_SHIELD,  675.  				  FALSE, FALSE); 676. 		    otmp->cursed = FALSE; 677. 		    otmp->oerodeproof = TRUE; 678. 		    otmp->spe = 0; 679. 		    (void) mpickobj(mtmp, otmp); 680. 		}  681.  		break; 682. 	    case S_GNOME: 683. 		switch (mm) { 684. 		    case PM_GNOLL: 685. 			if(!rn2(3)) (void) mongets(mtmp, ORCISH_HELM); 686. 			if(!rn2(3)) (void) mongets(mtmp, STUDDED_LEATHER_ARMOR); 687. 			if(!rn2(3)) (void) mongets(mtmp, ORCISH_SHIELD); 688. 			if(!rn2(4)) (void) mongets(mtmp, SPEAR); 689. 			break; 690.  691.  		    case PM_GNOLL_WARRIOR: 692. 			if(!rn2(2)) (void) mongets(mtmp, ORCISH_HELM); 693.  694.  			if (!rn2(20)) 695. 			    (void) mongets(mtmp, ORANGE_DRAGON_SCALE_MAIL); 696. 			else if (rn2(3)) 697. 			    (void) mongets(mtmp, SCALE_MAIL); 698. 			else 699. 			    (void) mongets(mtmp, SPLINT_MAIL); 700.  701.  			if(!rn2(2)) (void) mongets(mtmp, ORCISH_SHIELD); 702. 			if(!rn2(3)) (void) mongets(mtmp, KATANA); 703. 			break; 704.  705.  		    case PM_GNOLL_CHIEFTAIN: 706. 			(void) mongets(mtmp, ORCISH_HELM); 707.  708.  			if (!rn2(10)) 709. 			    (void) mongets(mtmp, BLUE_DRAGON_SCALE_MAIL); 710. 			else 711. 			    (void) mongets(mtmp, CRYSTAL_PLATE_MAIL); 712.  713.  			(void) mongets(mtmp, ORCISH_SHIELD); 714. 			(void) mongets(mtmp, KATANA); 715. 			(void) mongets(mtmp, rnd_offensive_item(mtmp)); 716. 			break; 717.  718.  		    case PM_GNOLL_SHAMAN: 719. 			if (!rn2(10)) 720. 			    (void) mongets(mtmp, SILVER_DRAGON_SCALE_MAIL); 721. 			else if (rn2(5)) 722. 			    (void) mongets(mtmp, CRYSTAL_PLATE_MAIL); 723. 			else 724. 			    (void) mongets(mtmp, RED_DRAGON_SCALE_MAIL); 725.  726.  			(void) mongets(mtmp, ATHAME); 727. 			m_initthrow(mtmp, SHURIKEN, 12); 728. 			(void) mongets(mtmp, rnd_offensive_item(mtmp)); 729. 			(void) mongets(mtmp, rnd_offensive_item(mtmp)); 730. 			break; 731.  732.  		    default: 733. 			m_initweap_normal(mtmp); 734. 			break; 735. 		}	  736.  		break; 737. 	    case S_HUMANOID: 738. 		if (is_dwarf(ptr)) { 739. 		    if (rn2(7)) (void)mongets(mtmp, DWARVISH_CLOAK); 740. 		    if (rn2(7)) (void)mongets(mtmp, IRON_SHOES); 741. 		    if (!rn2(4)) { 742. 			(void)mongets(mtmp, DWARVISH_SHORT_SWORD); 743. 			/* note: you can't use a mattock with a shield */ 744. 			if (rn2(2)) (void)mongets(mtmp, DWARVISH_MATTOCK); 745. 			else { 746. 				(void)mongets(mtmp, AXE); 747. 				(void)mongets(mtmp, DWARVISH_ROUNDSHIELD); 748. 			}  749.  			(void)mongets(mtmp, DWARVISH_IRON_HELM); 750. 			if (!rn2(4)) 751. 			    (void)mongets(mtmp, DWARVISH_MITHRIL_COAT); 752. 		    } else { 753. 			(void)mongets(mtmp, !rn2(3) ? PICK_AXE : DAGGER); 754. 		    }  755.  		} else if (is_hobbit(ptr)) { 756. 			    switch (rn2(3)) { 757. 			        case 0: 758. 				    (void)mongets(mtmp, DAGGER); 759. 				    break; 760. 				case 1: 761. 				    (void)mongets(mtmp, ELVEN_DAGGER); 762. 				    break; 763. 				case 2: 764. 			            (void)mongets(mtmp, SLING); 765. 			            /* WAC give them some rocks to throw */ 766. 			            m_initthrow(mtmp, ROCK, 2); 767. 						break; 768. 			      }  769.  				/* WAC add 50% chance of leather */ 770. 			    if (!rn2(10)) (void)mongets(mtmp, ELVEN_MITHRIL_COAT); 771. 				else if (!rn2(2)) (void)mongets(mtmp, LEATHER_ARMOR); 772. 				if (!rn2(10)) (void)mongets(mtmp, DWARVISH_CLOAK); 773. 		} else switch(mm) { 774.           /* Mind flayers get robes */ 775.           case PM_MIND_FLAYER: 776.             if (!rn2(2)) (void)mongets(mtmp, ROBE); 777.             break; 778.           case PM_MASTER_MIND_FLAYER: 779.             if (!rn2(10)) (void)mongets(mtmp, ROBE_OF_PROTECTION); 780. 			else if (!rn2(10)) (void)mongets(mtmp, ROBE_OF_POWER); 781. 			else (void)mongets(mtmp, ROBE); 782.             break; 783. 		  case PM_GNOLL: 784. 			if (!rn2(2)) switch (rn2(3)) { 785. 				case 0: (void)mongets(mtmp, BARDICHE); break; 786. 				case 1: (void)mongets(mtmp, VOULGE); break; 787. 				case 2: (void)mongets(mtmp, HALBERD); break; 788. 			}  789.  			if (!rn2(2)) (void)mongets(mtmp, LEATHER_ARMOR); 790. 			break; 791.           default: 792. 	          break; 793. 		}  794.  		break; 795. # ifdef KOPS 796. 	    case S_KOP:		/* create Keystone Kops with cream pies to  797. * throw. As suggested by KAA. [MRS] 798. 				 */  799.  		if (!rn2(4)) m_initthrow(mtmp, CREAM_PIE, 2); 800. 		if (!rn2(3)) (void)mongets(mtmp,(rn2(2)) ? CLUB : RUBBER_HOSE); 801. 		break; 802. # endif 803. 	    case S_ORC: 804.                 /* All orcs will get at least an orcish dagger*/ 805. 		if(rn2(2)) (void)mongets(mtmp, ORCISH_HELM); 806. 		switch (mm != PM_ORC_CAPTAIN ? mm :  807.  			rn2(2) ? PM_MORDOR_ORC : PM_URUK_HAI) { 808. 		    case PM_MORDOR_ORC: 809. 			if(!rn2(3)) (void)mongets(mtmp, SCIMITAR); 810.                             else (void)mongets(mtmp, ORCISH_DAGGER); 811. 			if(!rn2(3)) (void)mongets(mtmp, ORCISH_SHIELD); 812. 			if(!rn2(3)) (void)mongets(mtmp, KNIFE); 813.                         /* WAC add possible orcish spear */ 814.                         if (!rn2(4)) m_initthrow(mtmp, ORCISH_SPEAR, 1); 815. 			if(!rn2(3)) (void)mongets(mtmp, KNIFE); 816. 			if(!rn2(3)) (void)mongets(mtmp, ORCISH_CHAIN_MAIL); 817. 			break; 818. 		    case PM_URUK_HAI: 819. 			if(!rn2(3)) (void)mongets(mtmp, ORCISH_CLOAK); 820. 			if(!rn2(3)) (void)mongets(mtmp, ORCISH_SHORT_SWORD); 821.                             else (void)mongets(mtmp, ORCISH_DAGGER); 822. 			if(!rn2(3)) (void)mongets(mtmp, IRON_SHOES); 823. 			if(!rn2(3)) { 824. 			    (void)mongets(mtmp, ORCISH_BOW); 825. 			    m_initthrow(mtmp, ORCISH_ARROW, 12); 826. 			}  827.  			if(!rn2(3)) (void)mongets(mtmp, URUK_HAI_SHIELD); 828. 			break; 829.                     case PM_GOBLIN: 830.                         if(!rn2(3)) (void)mongets(mtmp, ORCISH_SHORT_SWORD); 831.                             else (void)mongets(mtmp, ORCISH_DAGGER); 832. 			break; 833.                     case PM_HOBGOBLIN: 834.                         if(!rn2(3)) (void)mongets(mtmp, MORNING_STAR); 835.                             else if(!rn2(3)) (void)mongets(mtmp, ORCISH_SHORT_SWORD); 836.                             else (void)mongets(mtmp, ORCISH_DAGGER); 837. 			break; 838. 		    default: 839. 			if (mm != PM_ORC_SHAMAN && rn2(2)) 840. /*                          (void)mongets(mtmp, (mm == PM_GOBLIN || rn2(2) == 0)*/  841.                            (void)mongets(mtmp, (rn2(2) == 0) 842. 						   ? ORCISH_DAGGER : SCIMITAR);  843.  		}  844.  		break;  845.  	    case S_OGRE:  846.  		if (!rn2(mm == PM_OGRE_KING ? 3 : mm == PM_OGRE_LORD ? 6 : 12))  847.  		    (void) mongets(mtmp, BATTLE_AXE);  848.  		else  849.  		    (void) mongets(mtmp, CLUB);  850.  		break;  851.  	    case S_KOBOLD:  852.                  /* WAC gets orcish 1:4, otherwise darts  853.                          (used to be darts 1:4)  854.                     gets orcish short sword 1:4, otherwise orcish dagger */  855.                  if (!rn2(4)) m_initthrow(mtmp, ORCISH_SPEAR, 1);  856.                     else m_initthrow(mtmp, DART, 12);  857.                  if (!rn2(4)) mongets(mtmp, ORCISH_SHORT_SWORD);  858.                     else mongets(mtmp, ORCISH_DAGGER);  859.  		break;  860.   861.  	    case S_CENTAUR:  862.  		if (rn2(2)) {  863.  		    if(ptr == &mons[PM_FOREST_CENTAUR]) { 864. 			(void)mongets(mtmp, BOW); 865. 			m_initthrow(mtmp, ARROW, 12); 866. 		    } else { 867. 			(void)mongets(mtmp, CROSSBOW); 868. 			m_initthrow(mtmp, CROSSBOW_BOLT, 12); 869. 		    }  870.  		}  871.  		break; 872. 	    case S_WRAITH: 873. 		(void)mongets(mtmp, KNIFE); 874. 		(void)mongets(mtmp, LONG_SWORD); 875. 		break; 876. 	    case S_ZOMBIE: 877. 		if (!rn2(4)) (void)mongets(mtmp, LEATHER_ARMOR); 878. 		if (!rn2(4)) 879. 			(void)mongets(mtmp, (rn2(3) ? KNIFE : SHORT_SWORD)); 880. 		break; 881. 	    case S_LIZARD: 882. 		if (mm == PM_SALAMANDER) 883. 			(void)mongets(mtmp, (rn2(7) ? SPEAR : rn2(3) ? 884. 					     TRIDENT : STILETTO)); 885. 		break; 886. 	    case S_TROLL: 887. 		if (!rn2(2)) switch (rn2(4)) { 888. 		    case 0: (void)mongets(mtmp, RANSEUR); break; 889. 		    case 1: (void)mongets(mtmp, PARTISAN); break; 890. 		    case 2: (void)mongets(mtmp, GLAIVE); break; 891. 		    case 3: (void)mongets(mtmp, SPETUM); break; 892. 		}  893.  		break; 894. 	    case S_DEMON: 895. 		switch (mm) { 896. 		    case PM_BALROG: 897. 			(void)mongets(mtmp, BULLWHIP); 898. 			(void)mongets(mtmp, BROADSWORD); 899. 			break; 900. 		    case PM_ORCUS: 901. 			(void)mongets(mtmp, WAN_DEATH); /* the Wand of Orcus */ 902. 			break; 903. 		    case PM_HORNED_DEVIL: 904. 			(void)mongets(mtmp, rn2(4) ? TRIDENT : BULLWHIP); 905. 			break; 906. 		    case PM_DISPATER: 907. 			(void)mongets(mtmp, WAN_STRIKING); 908. 			break; 909. 		    case PM_YEENOGHU: 910. 			(void)mongets(mtmp, FLAIL); 911. 			break; 912. 		}  913.  		/* prevent djinnis and mail daemons from leaving objects when 914. 		 * they vanish 915. 		 */  916.  		if (!is_demon(ptr)) break; 917. 		/* fall thru */ 918. /*  919.   *	Now the general case, Some chance of getting some type 920.  *	of weapon for "normal" monsters. Certain special types 921.  *	of monsters will get a bonus chance or different selections. 922.  */  923.  	    default: 924. 	      m_initweap_normal(mtmp); 925. 	      break; 926. 	}  927.  /*    if ((int) mtmp->m_lev > rn2(120)) */ 928.       if ((int) mtmp->m_lev > rn2(200)) 929. 		(void) mongets(mtmp, rnd_offensive_item(mtmp)); 930. }  931.   932.  #endif /* OVL2 */ 933. #ifdef OVL1 934.  935.  #ifdef GOLDOBJ 936. /*  937.   *   Makes up money for monster's inventory. 938.  *   This will change with silver & copper coins 939.  */  940.  void 941. mkmonmoney(mtmp, amount) 942. struct monst *mtmp; 943. long amount; 944. {  945.      struct obj *gold = mksobj(GOLD_PIECE, FALSE, FALSE); 946.     gold->quan = amount; 947.     add_to_minv(mtmp, gold); 948. }  949.  #endif 950.  951.  STATIC_OVL void 952. m_initinv(mtmp) 953. register struct	monst	*mtmp; 954. {  955.  	register int cnt; 956. 	register struct obj *otmp; 957. 	register struct permonst *ptr = mtmp->data; 958. /* 	char *opera_cloak = "opera cloak";*/ 959. 	int i;  960. 961. #ifdef REINCARNATION 962. 	if (Is_rogue_level(&u.uz)) return; 963. #endif 964.  965.  /*  966.   *	Soldiers get armour & rations - armour approximates their ac. 967.  *	Nymphs may get mirror or potion of object detection. 968.  */  969.  	switch(ptr->mlet) { 970. 	    case S_HUMAN: 971. 		if(is_mercenary(ptr)  972.  #ifdef YEOMAN  973.  				|| ptr == &mons[PM_CHIEF_YEOMAN_WARDER]  974.  				|| ptr == &mons[PM_YEOMAN_WARDER]  975.  #endif  976.  		) { 977. 		    register int mac; 978.  979.  		    switch(monsndx(ptr)) { 980. 			case PM_GUARD: mac = -1; break; 981. 			case PM_SOLDIER: mac = 3; break; 982. 			case PM_SERGEANT: mac = 0; break; 983. 			case PM_LIEUTENANT: mac = -2; break; 984. 			case PM_CAPTAIN: mac = -3; break; 985. #ifdef YEOMAN 986. 			case PM_YEOMAN_WARDER: 987. #endif 988. 			case PM_WATCHMAN: mac = 3; break; 989. #ifdef YEOMAN 990. 			case PM_CHIEF_YEOMAN_WARDER: 991. 				mongets(mtmp, TALLOW_CANDLE); 992. #endif 993. 			case PM_WATCH_CAPTAIN: mac = -2; break; 994. 			default: impossible("odd mercenary %d?", monsndx(ptr)); 995. 				mac = 0; 996. 				break; 997. 		    }  998.   999.  		    if (mac < -1 && rn2(5)) 1000. 			mac += 7 + mongets(mtmp, (rn2(5)) ? 1001. 					   PLATE_MAIL : CRYSTAL_PLATE_MAIL); 1002. 		   else if (mac < 3 && rn2(5)) 1003. 			mac += 6 + mongets(mtmp, (rn2(3)) ? 1004. 					   SPLINT_MAIL : BANDED_MAIL); 1005. 		   else if (rn2(5)) 1006. 			mac += 3 + mongets(mtmp, (rn2(3)) ? 1007. 					   RING_MAIL : STUDDED_LEATHER_ARMOR); 1008. 		   else 1009. 			mac += 2 + mongets(mtmp, LEATHER_ARMOR); 1010. 1011. 		    if (mac < 10 && rn2(3)) 1012. 			mac += 1 + mongets(mtmp, HELMET); 1013. 		   else if (mac < 10 && rn2(2)) 1014. 			mac += 1 + mongets(mtmp, DENTED_POT); 1015. 		   if (mac < 10 && rn2(3)) 1016. 			mac += 1 + mongets(mtmp, SMALL_SHIELD); 1017. 		   else if (mac < 10 && rn2(2)) 1018. 			mac += 2 + mongets(mtmp, LARGE_SHIELD); 1019. 		   if (mac < 10 && rn2(3)) 1020. 			mac += 1 + mongets(mtmp, LOW_BOOTS); 1021. 		   else if (mac < 10 && rn2(2)) 1022. 			mac += 2 + mongets(mtmp, HIGH_BOOTS); 1023. 		   if (mac < 10 && rn2(3)) 1024. 			mac += 1 + mongets(mtmp, LEATHER_GLOVES); 1025. 		   else if (mac < 10 && rn2(2)) 1026. 			mac += 1 + mongets(mtmp, LEATHER_CLOAK); 1027. 1028. 		    if(ptr != &mons[PM_GUARD] &&  1029. 			ptr != &mons[PM_WATCHMAN] &&  1030. 			ptr != &mons[PM_WATCH_CAPTAIN]) { 1031. 			if (!rn2(3)) (void) mongets(mtmp, K_RATION); 1032. 			if (!rn2(2)) (void) mongets(mtmp, C_RATION); 1033. 			if (ptr != &mons[PM_SOLDIER] && !rn2(3)) 1034. 				(void) mongets(mtmp, BUGLE); 1035. 		   } else 1036. 			  if (ptr == &mons[PM_WATCHMAN] && rn2(3)) 1037. 				(void) mongets(mtmp, TIN_WHISTLE); 1038. 		} else if (ptr == &mons[PM_SHOPKEEPER]) { 1039. 		   (void) mongets(mtmp,SKELETON_KEY); 1040. 		   /* STEPHEN WHITE'S NEW CODE 1041. 		    *  1042. 		     * "Were here to pump *clap* YOU up!" -Hans and Frans 1043. 		    *                                      Saterday Night Live 1044. 		    */  1045. #ifndef FIREARMS 1046. 		   switch (rn2(4)) { 1047. 		   /* MAJOR fall through ... */ 1048. 		    case 0: (void) mongets(mtmp, WAN_MAGIC_MISSILE); 1049. 		   case 1: (void) mongets(mtmp, POT_EXTRA_HEALING); 1050. 		   case 2: (void) mongets(mtmp, POT_HEALING); 1051. 		   case 3: (void) mongets(mtmp, WAN_STRIKING); 1052. 		   }  1053. #endif 1054. 		   switch (rnd(4)) { 1055. 			/* MAJOR fall through ... */ 1056. 			case 1: (void) mongets(mtmp,POT_HEALING); 1057. 			case 2: (void) mongets(mtmp,POT_EXTRA_HEALING); 1058. 			case 3: (void) mongets(mtmp,SCR_TELEPORTATION); 1059. 			case 4: (void) mongets(mtmp,WAN_TELEPORTATION); 1060. 			default: 1061. 				break; 1062. 		   }  1063. 		} else if (ptr->msound == MS_PRIEST ||  1064. 			quest_mon_represents_role(ptr,PM_PRIEST)) { 1065. 		   (void) mongets(mtmp,  1066. 			    rn2(7) ? rn1(ROBE_OF_WEAKNESS - ROBE + 1, ROBE) :  1067. 					     rn2(3) ? CLOAK_OF_PROTECTION :  1068. 						 CLOAK_OF_MAGIC_RESISTANCE); 1069. 		   (void) mongets(mtmp, SMALL_SHIELD); 1070. #ifndef GOLDOBJ 1071. 		   mtmp->mgold = (long)rn1(10,20); 1072. #else 1073. 		   mkmonmoney(mtmp,(long)rn1(10,20)); 1074. #endif 1075. 		} else if (quest_mon_represents_role(ptr,PM_MONK)) { 1076. 		   (void) mongets(mtmp, rn2(11) ? ROBE :  1077. 					     CLOAK_OF_MAGIC_RESISTANCE); 1078. 		} 1079. 		break; 1080. 	   case S_NYMPH: 1081. 		if(!rn2(2)) (void) mongets(mtmp, MIRROR); 1082. 		if(!rn2(2)) (void) mongets(mtmp, POT_OBJECT_DETECTION); 1083. 		break; 1084. 	   case S_GIANT: 1085. 		if (ptr == &mons[PM_MINOTAUR]) { 1086. 		   if (!rn2(3) || (in_mklev && Is_earthlevel(&u.uz))) 1087. 			(void) mongets(mtmp, WAN_DIGGING); 1088. 		} else if (is_giant(ptr)) { 1089. 		   for (cnt = rn2((int)(mtmp->m_lev / 2)); cnt; cnt--) { 1090. 			otmp = mksobj(rnd_class(DILITHIUM_CRYSTAL,LUCKSTONE-1), 1091. 				      FALSE, FALSE); 1092. 			otmp->quan = (long) rn1(2, 3); 1093. 			otmp->owt = weight(otmp); 1094. 			(void) mpickobj(mtmp, otmp); 1095. 		   }  1096. 		}  1097. 		break; 1098. 	   case S_WRAITH: 1099. 	   if (!rn2(2)) (void)mongets(mtmp, ROBE); 1100. 		if (ptr == &mons[PM_NAZGUL]) { 1101. 			otmp = mksobj(RIN_INVISIBILITY, FALSE, FALSE); 1102. 			curse(otmp); 1103. 			(void) mpickobj(mtmp, otmp); 1104. 		} 1105. 		break; 1106. 	   case S_LICH: 1107. 		if (ptr == &mons[PM_MASTER_LICH] && !rn2(13)) 1108. 			(void)mongets(mtmp, (rn2(7) ? ATHAME : WAN_NOTHING)); 1109. 		else if (ptr == &mons[PM_ARCH_LICH] && !rn2(3)) { 1110. 			otmp = mksobj(rn2(3) ? ATHAME : QUARTERSTAFF, 1111. 				      TRUE, rn2(13) ? FALSE : TRUE); 1112. 			if (otmp->spe < 2) otmp->spe = rnd(3); 1113. 			if (!rn2(4)) otmp->oerodeproof = 1; 1114. 			(void) mpickobj(mtmp, otmp); 1115. 		} 1116. 		break; 1117. 	   case S_MUMMY: 1118. 		if (rn2(7)) (void)mongets(mtmp, MUMMY_WRAPPING); 1119. 		break; 1120. 	   case S_QUANTMECH: 1121. 		if (monsndx(ptr) == PM_QUANTUM_MECHANIC && !rn2(20)) { 1122. 			otmp = mksobj(LARGE_BOX, FALSE, FALSE); 1123. 			otmp->spe = 1; /* flag for special box */ 1124. 			otmp->owt = weight(otmp); 1125. 			(void) mpickobj(mtmp, otmp); 1126. 		} 1127. 		if (monsndx(ptr) == PM_DOCTOR_FRANKENSTEIN) { 1128. 			(void)mongets(mtmp, LAB_COAT); 1129. 			(void)mongets(mtmp, WAN_POLYMORPH); 1130. 			(void)mongets(mtmp, SPE_POLYMORPH); 1131. 		} 1132. 		break; 1133. 	   case S_LEPRECHAUN: 1134. #ifndef GOLDOBJ 1135. 		mtmp->mgold = (long) d(level_difficulty, 30); 1136. #else 1137. 		mkmonmoney(mtmp, (long) d(level_difficulty, 30)); 1138. #endif 1139. 		break; 1140. 	   case S_ELEMENTAL: 1141.  /*            if(ptr == &mons[PM_WATER_WEIRD]){ 1142. 			otmp = mksobj(WAN_WISHING,TRUE,FALSE); 1143. 			otmp->spe=3; 1144. 			otmp->blessed=0; 1145. 			mpickobj(mtmp, otmp); 1146. 		}*/ 1147. 		break; 1148. 	   case S_VAMPIRE: 1149. 		/* [Lethe] Star and fire vampires don't get this stuff */ 1150. 		if (ptr == &mons[PM_STAR_VAMPIRE] || 1151. 				ptr == &mons[PM_FIRE_VAMPIRE]) 1152. 		   break; 1153. 	   	/* Get opera cloak */ 1154. /*	   	otmp = readobjnam(opera_cloak); 1155. 		if (otmp && otmp != &zeroobj) mpickobj(mtmp, otmp);*/ 1156. 		for (i = STRANGE_OBJECT; i < NUM_OBJECTS; i++) { 1157. 			register const char *zn; 1158. 			if ((zn = OBJ_DESCR(objects[i])) && !strcmpi(zn, "opera cloak")) { 1159. 				if (!OBJ_NAME(objects[i])) i = STRANGE_OBJECT; 1160. 				break; 1161. 			} 1162. 		}  1163. 		if (i != NUM_OBJECTS) (void)mongets(mtmp, i); 1164. 		if (rn2(2)) { 1165. 		   if ((int) mtmp->m_lev > rn2(30)) 1166. 			(void)mongets(mtmp, POT_VAMPIRE_BLOOD); 1167. 		   else 1168. 			(void)mongets(mtmp, POT_BLOOD); 1169. 		} 1170. 		break; 1171. 	   case S_DEMON: 1172. 		/* moved here from m_initweap because these don't 1173. have AT_WEAP so m_initweap is not called for them */ 1174. 		if (ptr == &mons[PM_ICE_DEVIL] && !rn2(4)) { 1175. 			(void)mongets(mtmp, SPEAR); 1176. 		/* [DS] Cthulhu isn't fully integrated yet, and he won't be 1177. *     until Moloch's Sanctum is rearranged */ 1178. 		} else if (ptr == &mons[PM_CTHULHU]) { 1179. 			(void)mongets(mtmp, AMULET_OF_YENDOR); 1180. 			(void)mongets(mtmp, WAN_DEATH); 1181. 			(void)mongets(mtmp, POT_FULL_HEALING); 1182. 		} else if (ptr == &mons[PM_ASMODEUS]) { 1183. 			(void)mongets(mtmp, WAN_COLD); 1184. 			(void)mongets(mtmp, WAN_FIRE); 1185. 		} 1186. 		break; 1187. 	   default: 1188. 		break; 1189. 	} 1190.  1191. 	/* ordinary soldiers rarely have access to magic (or gold :-) */ 1192. 	if (ptr == &mons[PM_SOLDIER] && rn2(15)) return; 1193. 1194. 	if ((int) mtmp->m_lev > rn2(200)) 1195. 		(void) mongets(mtmp, rnd_defensive_item(mtmp)); 1196. 	if ((int) mtmp->m_lev > rn2(200)) 1197. 		(void) mongets(mtmp, rnd_misc_item(mtmp)); 1198. #ifndef GOLDOBJ 1199. 	if (likes_gold(ptr) && !mtmp->mgold && !rn2(5)) 1200. 		mtmp->mgold = 1201. 		     (long) d(level_difficulty, mtmp->minvent ? 5 : 10); 1202. #else 1203. 	if (likes_gold(ptr) && !findgold(mtmp->minvent) && !rn2(5)) 1204. 		mkmonmoney(mtmp, (long) d(level_difficulty, mtmp->minvent ? 5 : 10)); 1205. #endif 1206. } 1207.  1208. /* Note: for long worms, always call cutworm (cutworm calls clone_mon) */ 1209. struct monst * 1210. clone_mon(mon, x, y) 1211. struct monst *mon; 1212. xchar x, y;	/* clone's preferred location or 0 (near mon) */ 1213. { 1214. 	coord mm; 1215. 	struct monst *m2; 1216. 1217. 	/* may be too weak or have been extinguished for population control */ 1218. 	if (mon->mhp <= 1 || (mvitals[monsndx(mon->data)].mvflags & G_EXTINCT)) 1219. 	   return (struct monst *)0; 1220. 1221. 	if (x == 0) { 1222. 	   mm.x = mon->mx; 1223. 	   mm.y = mon->my; 1224. 	   if (!enexto(&mm, mm.x, mm.y, mon->data) || MON_AT(mm.x, mm.y)) 1225. 		return (struct monst *)0; 1226. 	} else if (!isok(x, y)) { 1227. 	   return (struct monst *)0;	/* paranoia */ 1228. 	} else { 1229. 	   mm.x = x;  1230. mm.y = y; 1231. if (MON_AT(mm.x, mm.y)) { 1232. 		if (!enexto(&mm, mm.x, mm.y, mon->data) || MON_AT(mm.x, mm.y)) 1233. 		   return (struct monst *)0; 1234. 	   }  1235. 	}  1236. 	m2 = newmonst(0); 1237. 	*m2 = *mon;			/* copy condition of old monster */ 1238. 	m2->nmon = fmon; 1239. 	fmon = m2; 1240. 	m2->m_id = flags.ident++; 1241. 	if (!m2->m_id) m2->m_id = flags.ident++;	/* ident overflowed */ 1242. 	m2->mx = mm.x; 1243. m2->my = mm.y; 1244. 1245. 	m2->minvent = (struct obj *) 0; /* objects don't clone */ 1246. 	m2->mleashed = FALSE; 1247. #ifndef GOLDOBJ 1248. 	m2->mgold = 0L; 1249. #endif 1250. 	/* Max HP the same, but current HP halved for both. The caller 1251. 	 * might want to override this by halving the max HP also. 1252. 	 * When current HP is odd, the original keeps the extra point. 1253. 	 */ 1254. 	m2->mhpmax = mon->mhpmax; 1255. 	m2->mhp = mon->mhp / 2; 1256. 	mon->mhp -= m2->mhp; 1257. 1258. 	/* Same for the power */ 1259. 	m2->m_enmax = mon->m_enmax; 1260. 	m2->m_en = mon->m_en /= 2; 1261. 1262. 	/* since shopkeepers and guards will only be cloned if they've been 1263. 	 * polymorphed away from their original forms, the clone doesn't have 1264. 	 * room for the extra information. we also don't want two shopkeepers 1265. 	 * around for the same shop. 1266. 	 */ 1267. 	if (mon->isshk) m2->isshk = FALSE; 1268. 	if (mon->isgd) m2->isgd = FALSE; 1269. 	if (mon->ispriest) m2->ispriest = FALSE; 1270. 	if (mon->isgyp) m2->isgyp = FALSE; 1271. 	m2->mxlth = 0; 1272. 	place_monster(m2, m2->mx, m2->my); 1273. 	if (emits_light(m2->data)) 1274. 	   new_light_source(m2->mx, m2->my, emits_light(m2->data),  1275. 			     LS_MONSTER, (genericptr_t)m2); 1276. 	if (m2->mnamelth) { 1277. 	   m2->mnamelth = 0; /* or it won't get allocated */ 1278. 	   m2 = christen_monst(m2, NAME(mon)); 1279. 	} else if (mon->isshk) { 1280. 	   m2 = christen_monst(m2, shkname(mon)); 1281. 	} 1282.  1283. 	/* not all clones caused by player are tame or peaceful */ 1284. 	if (!flags.mon_moving) { 1285. 	   if (mon->mtame) 1286. 		m2->mtame = rn2(max(2 + u.uluck, 2)) ? mon->mtame : 0; 1287. 	   else if (mon->mpeaceful) 1288. 		m2->mpeaceful = rn2(max(2 + u.uluck, 2)) ? 1 : 0; 1289. 	}  1290.  1291. 	newsym(m2->mx,m2->my);	/* display the new monster */ 1292. 	if (m2->mtame) { 1293. 	   struct monst *m3; 1294. 1295. 	    if (mon->isminion) { 1296. 		m3 = newmonst(sizeof(struct epri) + mon->mnamelth); 1297. 		*m3 = *m2; 1298. 		m3->mxlth = sizeof(struct epri); 1299. 		if (m2->mnamelth) Strcpy(NAME(m3), NAME(m2)); 1300. 		*(EPRI(m3)) = *(EPRI(mon)); 1301. 		replmon(m2, m3); 1302. 		m2 = m3; 1303. 	   } else { 1304. 		/* because m2 is a copy of mon it is tame but not init'ed. 1305. 		 * however, tamedog will not re-tame a tame dog, so m2 1306. * must be made non-tame to get initialized properly. 1307. 		 */ 1308. 		m2->mtame = 0; 1309. 		if ((m3 = tamedog(m2, (struct obj *)0)) != 0) { 1310. 		   m2 = m3; 1311. 		   *(EDOG(m2)) = *(EDOG(mon)); 1312. 		} 1313. 	    }  1314. 	}  1315. 	set_malign(m2); 1316. 1317. 	return m2; 1318. } 1319.  1320. /*  1321.  * Propagate a species 1322. *  1323.  * Once a certain number of monsters are created, don't create any more 1324. * at random (i.e. make them extinct). The previous (3.2) behavior was 1325. * to do this when a certain number had _died_, which didn't make 1326. * much sense. 1327. *  1328.  * Returns FALSE propagation unsuccessful 1329. *         TRUE  propagation successful 1330. */  1331. boolean 1332. propagate(mndx, tally, ghostly) 1333. int mndx; 1334. boolean tally; 1335. boolean ghostly; 1336. { 1337. 	boolean result; 1338. 	uchar lim = mbirth_limit(mndx); 1339. 	boolean gone = (mvitals[mndx].mvflags & G_GONE); /* genocided or extinct */ 1340. 1341. 	result = (((int) mvitals[mndx].born < lim) && !gone) ? TRUE : FALSE; 1342. 1343. 	/* if it's unique, don't ever make it again */ 1344. 	if (mons[mndx].geno & G_UNIQ) mvitals[mndx].mvflags |= G_EXTINCT; 1345. 1346. 	if (mvitals[mndx].born < 255 && tally && (!ghostly || (ghostly && result))) 1347. 		 mvitals[mndx].born++; 1348. 	if ((int) mvitals[mndx].born >= lim && !(mons[mndx].geno & G_NOGEN) && 1349. 		!(mvitals[mndx].mvflags & G_EXTINCT)) { 1350. #if defined(DEBUG) && defined(WIZARD) 1351. 		if (wizard) pline("Automatically extinguished %s.", 1352. 					makeplural(mons[mndx].mname)); 1353. #endif 1354. 		mvitals[mndx].mvflags |= G_EXTINCT; 1355. 		reset_rndmonst(mndx); 1356. 	} 1357. 	return result; 1358. } 1359.  1360. /*  1361.  * called with [x,y] = coordinates; 1362. *	[0,0] means anyplace 1363. *	[u.ux,u.uy] means: near player (if !in_mklev) 1364. *  1365.  *	In case we make a monster group, only return the one at [x,y]. 1366. */  1367. struct monst * 1368. makemon(ptr, x, y, mmflags) 1369. register struct permonst *ptr; 1370. register int	x, y; 1371. register int	mmflags; 1372. { 1373. 	register struct monst *mtmp; 1374. 	int mndx, mcham, ct, mitem, xlth; 1375. 	boolean anymon = (!ptr); 1376. 	boolean byyou = (x == u.ux && y == u.uy); 1377. 	boolean allow_minvent = ((mmflags & NO_MINVENT) == 0); 1378. 	boolean countbirth = ((mmflags & MM_NOCOUNTBIRTH) == 0); 1379. 	unsigned gpflags = (mmflags & MM_IGNOREWATER) ? MM_IGNOREWATER : 0; 1380. 1381. 	/* if caller wants random location, do it here */ 1382. 	if(x == 0 && y == 0) { 1383. 		int tryct = 0;	/* careful with bigrooms */ 1384. 		struct monst fakemon; 1385. 1386. 		fakemon.data = ptr;	/* set up for goodpos */ 1387. 		do { 1388. 			x = rn1(COLNO-3,2); 1389. 			y = rn2(ROWNO); 1390. 		} while(!goodpos(x, y, ptr ? &fakemon : (struct monst *)0, gpflags) || 1391. 			(!in_mklev && tryct++ < 50 && cansee(x, y))); 1392. 	} else if (byyou && !in_mklev) { 1393. 		coord bypos; 1394. 1395. 		if(enexto_core(&bypos, u.ux, u.uy, ptr, gpflags)) { 1396. 			x = bypos.x; 1397. y = bypos.y; 1398. } else 1399. 			return((struct monst *)0); 1400. 	} 1401.  1402. 	/* Does monster already exist at the position? */ 1403. 	if(MON_AT(x, y)) { 1404. 		if ((mmflags & MM_ADJACENTOK) != 0) { 1405. 			coord bypos; 1406. 			if(enexto_core(&bypos, x, y, ptr, gpflags)) { 1407. 				x = bypos.x; 1408. y = bypos.y; 1409. } else 1410. 				return((struct monst *) 0); 1411. 		} else 1412. 			return((struct monst *) 0); 1413. 	} 1414.  1415. 	if(ptr){ 1416. 		mndx = monsndx(ptr); 1417. 		/* if you are to make a specific monster and it has 1418. 		  already been genocided, return */ 1419. 		if (mvitals[mndx].mvflags & G_GENOD) return((struct monst *) 0); 1420. #if defined(WIZARD) && defined(DEBUG) 1421. 		if (wizard && (mvitals[mndx].mvflags & G_EXTINCT)) 1422. 		   pline("Explicitly creating extinct monster %s.",  1423. 			mons[mndx].mname); 1424. #endif 1425. 	} else { 1426. 		/* make a random (common) monster that can survive here. 1427. 		 * (the special levels ask for random monsters at specific 1428. 		 * positions, causing mass drowning on the medusa level,  1429. 		 * for instance.) 1430. 		 */ 1431. 		int tryct = 0;	/* maybe there are no good choices */ 1432. 		struct monst fakemon; 1433. 		do { 1434. 			if(!(ptr = rndmonst)) { 1435. #ifdef DEBUG 1436. 			   pline("Warning: no monster."); 1437. #endif 1438. 			   return((struct monst *) 0);	/* no more monsters! */ 1439. 			}  1440. 			fakemon.data = ptr;	/* set up for goodpos */ 1441. 		} while(!goodpos(x, y, &fakemon, gpflags) && tryct++ < 50); 1442. 		mndx = monsndx(ptr); 1443. 	} 1444. 	(void) propagate(mndx, countbirth, FALSE); 1445. 	xlth = ptr->pxlth; 1446. 	if (mmflags & MM_EDOG) xlth += sizeof(struct edog); 1447. 	else if (mmflags & MM_EMIN) xlth += sizeof(struct emin); 1448. 	mtmp = newmonst(xlth); 1449. 	*mtmp = zeromonst;		/* clear all entries in structure */ 1450. 	(void)memset((genericptr_t)mtmp->mextra, 0, xlth); 1451. 	mtmp->nmon = fmon; 1452. 	fmon = mtmp; 1453. 	mtmp->m_id = flags.ident++; 1454. 	if (!mtmp->m_id) mtmp->m_id = flags.ident++;	/* ident overflowed */ 1455. 	set_mon_data(mtmp, ptr, 0); 1456. 	if (mtmp->data->msound == MS_LEADER) 1457. 	   quest_status.leader_m_id = mtmp->m_id; 1458. 	mtmp->mxlth = xlth; 1459. 	mtmp->mnum = mndx; 1460. 1461. 	mtmp->m_lev = adj_lev(ptr); 1462. 	 1463. 	/* WAC set oldmonnm */ 1464. 	mtmp->oldmonnm = monsndx(ptr); 1465. 	 1466. 	if (ptr >= &mons[PM_ARCHEOLOGIST] && ptr <= &mons[PM_WIZARD]) { 1467. 	  /* enemy characters are of varying level */ 1468. 	  int base_you, base_lev; 1469. 	  base_you = (u.ulevel / 2)+1; 1470. 	  base_lev = level_difficulty+1; 1471. 	  if (base_you < 1) base_you = 1; 1472. 	  if (base_lev < 1) base_lev = 1; 1473. 	  mtmp->m_lev = (1 + rn2(base_you) + rn2(base_lev) / 2)+1; 1474. 	} 1475.  1476. 	/* Set HP, HPmax */ 1477. 	if (is_golem(ptr)) { 1478. 	   mtmp->mhpmax = mtmp->mhp = golemhp(mndx); 1479. 	} else if (is_rider(ptr)) { 1480. 	   /* We want low HP, but a high mlevel so they can attack well */ 1481. 		mtmp->mhpmax = mtmp->mhp = d(10,8) + 20; 1482. 	} else if (ptr->mlevel > 49) { 1483. 	   /* "special" fixed hp monster 1484. 	    * the hit points are encoded in the mlevel in a somewhat strange 1485. 	    * way to fit in the 50..127 positive range of a signed character 1486. 	    * above the 1..49 that indicate "normal" monster levels */ 1487. 	   mtmp->mhpmax = mtmp->mhp = 2*(ptr->mlevel - 6); 1488. 	   mtmp->m_lev = mtmp->mhp / 4;	/* approximation */ 1489. 	} else if (ptr->mlet == S_DRAGON && mndx >= PM_GRAY_DRAGON) { 1490. 	   /* adult dragons */ 1491. 	   mtmp->mhpmax = mtmp->mhp = (int) (In_endgame(&u.uz) ?  1492. 		(8 * mtmp->m_lev) : (4 * mtmp->m_lev + d((int)mtmp->m_lev, 4))); 1493. 	} else if (!mtmp->m_lev) { 1494. 	   mtmp->mhpmax = mtmp->mhp = rnd(4); 1495. 	} else { 1496. 	   mtmp->mhpmax = mtmp->mhp = d((int)mtmp->m_lev, 8); 1497. 	    1498. 	    if (is_home_elemental(ptr)) 1499. 		mtmp->mhpmax = (mtmp->mhp *= 3); 1500. 	   else mtmp->mhpmax = mtmp->mhp = 1501. 		d((int)mtmp->m_lev, 8) + (mtmp->m_lev*rnd(2)); 1502. 	} 1503.  1504. 	/* Assign power */ 1505. 	if (mindless(ptr)) { 1506. 	   mtmp->m_enmax = mtmp->m_en = 0; 1507. 	} else { 1508. 	   /* This is actually quite similar to hit dice, 1509. 	    * but with more randomness 1510. 	    */  1511. 	    mtmp->m_enmax = mtmp->m_en = 1512. 		d((int)mtmp->m_lev * 2, 4) + (mtmp->m_lev*rnd(2)); 1513. 	} 1514. 	if (is_female(ptr)) mtmp->female = TRUE; 1515. 	else if (is_male(ptr)) mtmp->female = FALSE; 1516. 	else mtmp->female = rn2(2);	/* ignored for neuters */ 1517. 1518. 	if (In_sokoban(&u.uz) && !mindless(ptr))  /* know about traps here */ 1519. 	   mtmp->mtrapseen = (1L << (PIT - 1)) | (1L << (HOLE - 1)); 1520. 	if (ptr->msound == MS_LEADER)		/* leader knows about portal */ 1521. 	   mtmp->mtrapseen |= (1L << (MAGIC_PORTAL-1)); 1522. 1523. 	place_monster(mtmp, x, y); 1524. 	mtmp->mcansee = mtmp->mcanmove = TRUE; 1525. 	mtmp->mpeaceful = (mmflags & MM_ANGRY) ? FALSE : peace_minded(ptr); 1526. 	mtmp->mtraitor = FALSE; 1527. 1528. 	switch(ptr->mlet) { 1529. 		case S_MIMIC: 1530. 			set_mimic_sym(mtmp); 1531. 			break; 1532. 		case S_SPIDER: 1533. 		case S_SNAKE: 1534. 			if(in_mklev) 1535. 			   if(x && y)  1536. (void) mkobj_at(0, x, y, TRUE); 1537. 			if(hides_under(ptr) && OBJ_AT(x, y)) 1538. 			   mtmp->mundetected = TRUE; 1539. 			break; 1540. 		case S_LIGHT: 1541. 		case S_ELEMENTAL: 1542. 			if (mndx == PM_STALKER || mndx == PM_BLACK_LIGHT) { 1543. 			   mtmp->perminvis = TRUE; 1544. 			   mtmp->minvis = TRUE; 1545. 			} 1546. 			break; 1547. 		case S_EEL: 1548. 			if (is_pool(x, y)) 1549. 			   mtmp->mundetected = TRUE; 1550. 			break; 1551. 		case S_LEPRECHAUN: 1552. 			mtmp->msleeping = 1; 1553. 			break; 1554. 		case S_JABBERWOCK: 1555. 		case S_NYMPH: 1556. 			if (rn2(5) && !u.uhave.amulet) mtmp->msleeping = 1; 1557. 			if (mndx == PM_PIXIE) { 1558. /* 			    mtmp->perminvis = TRUE;*/ 1559.  			    mtmp->minvis = TRUE; 1560. 			} 1561. 			break; 1562. 		case S_ORC: 1563. 			if (Race_if(PM_ELF)) mtmp->mpeaceful = FALSE; 1564. 			break; 1565. 		case S_UNICORN: 1566. 			if (is_unicorn(ptr) && 1567. 					sgn(u.ualign.type) == sgn(ptr->maligntyp)) 1568. 				mtmp->mpeaceful = TRUE; 1569. 			break; 1570. 		case S_BAT: 1571. 			if (Inhell && is_bat(ptr)) 1572. 			   mon_adjust_speed(mtmp, 2, (struct obj *)0); 1573. 			break; 1574. 		case S_VAMPIRE: 1575. 			/* [DS] Star vampires are invisible until they feed */ 1576. 			if (mndx == PM_STAR_VAMPIRE) { 1577. 			   mtmp->perminvis = TRUE; 1578. 			   mtmp->minvis = TRUE; 1579. 			} 1580. 			break; 1581. 	} 1582. 	if ((ct = emits_light(mtmp->data)) > 0) 1583. 		new_light_source(mtmp->mx, mtmp->my, ct, 1584. 				 LS_MONSTER, (genericptr_t)mtmp); 1585. 1586. 	mitem = 0;	/* extra inventory item for this monster */ 1587. 1588. 	if ((mcham = pm_to_cham(mndx)) != CHAM_ORDINARY) { 1589. 		/* If you're protected with a ring, don't create 1590. 		 * any shape-changing chameleons -dgk 1591. 		 */ 1592. 		if (Protection_from_shape_changers) 1593. 			mtmp->cham = CHAM_ORDINARY; 1594. 		else { 1595. 			mtmp->cham = mcham; 1596. 			(void) mon_spec_poly(mtmp, rndmonst, 0L, FALSE, FALSE, FALSE, FALSE); 1597. 		} 1598. 	} else if (mndx == PM_WIZARD_OF_YENDOR) { 1599. 		mtmp->iswiz = TRUE; 1600. 		flags.no_of_wizards++; 1601. 		if (flags.no_of_wizards == 1 && Is_earthlevel(&u.uz)) 1602. 			mitem = SPE_DIG; 1603. 	} else if (mndx == PM_DJINNI) { 1604. 		flags.djinni_count++; 1605. 	} else if (mndx == PM_GHOST) { 1606. 		flags.ghost_count++; 1607. 		if (!(mmflags & MM_NONAME)) 1608. 			mtmp = christen_monst(mtmp, rndghostname); 1609. 	} else if (mndx == PM_NIGHTMARE) { 1610. 		struct obj *otmp; 1611. 1612. 		otmp = oname(mksobj(SKELETON_KEY, TRUE, FALSE),  1613. 				artiname(ART_KEY_OF_LAW)); 1614. 		if (otmp) { 1615. 			otmp->blessed = otmp->cursed = 0; 1616. 			mpickobj(mtmp, otmp); 1617. 		} 1618. 	} else if (mndx == PM_BEHOLDER) { 1619. 		struct obj *otmp; 1620. 1621. 		otmp = oname(mksobj(SKELETON_KEY, TRUE, FALSE),  1622. 				artiname(ART_KEY_OF_NEUTRALITY)); 1623. 		if (otmp) { 1624. 			otmp->blessed = otmp->cursed = 0; 1625. 			mpickobj(mtmp, otmp); 1626. 		} 1627. 	} else if (mndx == PM_VECNA) { 1628. 		struct obj *otmp; 1629. 1630. 		otmp = oname(mksobj(SKELETON_KEY, TRUE, FALSE),  1631. 				artiname(ART_KEY_OF_CHAOS)); 1632. 		if (otmp) { 1633. 			otmp->blessed = otmp->cursed = 0; 1634. 			mpickobj(mtmp, otmp); 1635. 		} 1636. 	} else if (mndx == PM_GYPSY) { 1637. 		/* KMH -- Gypsies are randomly generated; initialize them here */ 1638. 		gypsy_init(mtmp); 1639. 	} else if (mndx == PM_VLAD_THE_IMPALER) { 1640. 		mitem = CANDELABRUM_OF_INVOCATION; 1641. 	} else if (mndx == PM_CROESUS) { 1642. 		mitem = TWO_HANDED_SWORD; 1643. 	} else if (ptr->msound == MS_NEMESIS) { 1644. 		mitem = BELL_OF_OPENING; 1645. 	} else if (mndx == PM_PESTILENCE) { 1646. 		mitem = POT_SICKNESS; 1647. 	} 1648. 	if (mitem && allow_minvent) (void) mongets(mtmp, mitem); 1649. 1650. 	if(in_mklev) { 1651. 		if(((is_ndemon(ptr)) || 1652. 		   (mndx == PM_WUMPUS) || 1653. 		   (mndx == PM_LONG_WORM) || 1654. 		   (mndx == PM_GIANT_EEL)) && !u.uhave.amulet && rn2(5)) 1655. 			mtmp->msleeping = 1; 1656. 	} else { 1657. 		if(byyou) { 1658. 			newsym(mtmp->mx,mtmp->my); 1659. 			set_apparxy(mtmp); 1660. 		} 1661. 	}  1662. 	if(is_dprince(ptr) && ptr->msound == MS_BRIBE) { 1663. 	   mtmp->mpeaceful = mtmp->minvis = mtmp->perminvis = 1; 1664. 	   mtmp->mavenge = 0; 1665. 	   if (uwep && uwep->oartifact == ART_EXCALIBUR) 1666. 		mtmp->mpeaceful = mtmp->mtame = FALSE; 1667. 	} 1668. #ifndef DCC30_BUG 1669. 	if (mndx == PM_LONG_WORM && (mtmp->wormno = get_wormno) != 0) 1670. #else 1671. 	/* DICE 3.0 doesn't like assigning and comparing mtmp->wormno in the 1672. 	 * same expression. 1673. 	 */ 1674. 	if (mndx == PM_LONG_WORM &&  1675. 		(mtmp->wormno = get_wormno, mtmp->wormno != 0)) 1676. #endif 1677. 	{ 1678. 	    /* we can now create worms with tails - 11/91 */ 1679. 	   initworm(mtmp, rn2(5)); 1680. 	   if (count_wsegs(mtmp)) place_worm_tail_randomly(mtmp, x, y); 1681. 	} 1682. 	set_malign(mtmp);		/* having finished peaceful changes */ 1683. 	if(anymon) { 1684. 	   if ((ptr->geno & G_SGROUP) && rn2(2)) { 1685. 		m_initsgrp(mtmp, mtmp->mx, mtmp->my); 1686. 	   } else if (ptr->geno & G_LGROUP) { 1687. 		if(rn2(3)) m_initlgrp(mtmp, mtmp->mx, mtmp->my); 1688. 		else	   m_initsgrp(mtmp, mtmp->mx, mtmp->my); 1689. 	   }  1690. 	    else if(ptr->geno & G_VLGROUP) { 1691. 			if(rn2(3)) m_initvlgrp(mtmp, mtmp->mx, mtmp->my); 1692. 			else if(rn2(3)) m_initlgrp(mtmp, mtmp->mx, mtmp->my); 1693. 			else       m_initsgrp(mtmp, mtmp->mx, mtmp->my); 1694. 	   }  1695. 	}  1696.  1697. 	if (allow_minvent) { 1698. 	   if(is_armed(ptr)) 1699. 		m_initweap(mtmp);	/* equip with weapons / armor */ 1700. 	   m_initinv(mtmp);  /* add on a few special items incl. more armor */ 1701. 	   m_dowear(mtmp, TRUE); 1702. 	} else { 1703. 	   if (mtmp->minvent) discard_minvent(mtmp); 1704. 	   mtmp->minvent = (struct obj *)0;    /* caller expects this */ 1705. 	   mtmp->minvent = (struct obj *)0;    /* caller expects this */ 1706. 	} 1707. 	if ((ptr->mflags3 & M3_WAITMASK) && !(mmflags & MM_NOWAIT)) { 1708. 		if (ptr->mflags3 & M3_WAITFORU) 1709. 			mtmp->mstrategy |= STRAT_WAITFORU; 1710. 		if (ptr->mflags3 & M3_CLOSE) 1711. 			mtmp->mstrategy |= STRAT_CLOSE; 1712. 	} 1713. 	if (!in_mklev) 1714. 	   newsym(mtmp->mx,mtmp->my);	/* make sure the mon shows up */ 1715. 1716. 	return(mtmp); 1717. } 1718.  1719. int 1720. mbirth_limit(mndx) 1721. int mndx; 1722. { 1723. 	/* assert(MAXMONNO < 255); */ 1724. 	return (mndx == PM_NAZGUL ? 9 : mndx == PM_ERINYS ? 3 : MAXMONNO); 1725. } 1726.  1727. /* used for wand/scroll/spell of create monster */ 1728. /* returns TRUE iff you know monsters have been created */ 1729. 1730. boolean 1731. create_critters(cnt, mptr) 1732. int cnt; 1733. struct permonst *mptr;		/* usually null; used for confused reading */ 1734. { 1735. 	coord c;  1736. int x, y; 1737. struct monst *mon; 1738. 	boolean known = FALSE; 1739. #ifdef WIZARD 1740. 	boolean ask = wizard; 1741. #endif 1742. 1743. 	while (cnt--) { 1744. #ifdef WIZARD 1745. 	   if (ask) { 1746. 		if (create_particular) { 1747. 		   known = TRUE; 1748. 		   continue; 1749. 		} 1750. 		else ask = FALSE;	/* ESC will shut off prompting */ 1751. 	   }  1752. #endif 1753. 	   x = u.ux,  y = u.uy; 1754. 	   /* if in water, try to encourage an aquatic monster 1755. 	      by finding and then specifying another wet location */ 1756. 	   if (!mptr && u.uinwater && enexto(&c, x, y, &mons[PM_GIANT_EEL])) 1757. 		x = c.x, y = c.y;  1758. 1759. 	   mon = makemon(mptr, x, y, NO_MM_FLAGS); 1760. 	   if (mon && canspotmon(mon)) known = TRUE; 1761. 	} 1762. 	return known; 1763. } 1764.  1765. #endif /* OVL1 */ 1766. #ifdef OVL0 1767. 1768. STATIC_OVL boolean 1769. uncommon(mndx) 1770. int mndx; 1771. { 1772. 	if (mons[mndx].geno & (G_NOGEN | G_UNIQ)) return TRUE; 1773. 	if (mvitals[mndx].mvflags & G_GONE) return TRUE; 1774. 	if (Inhell) 1775. 		return(mons[mndx].maligntyp > A_NEUTRAL); 1776. 	else 1777. 		return((mons[mndx].geno & G_HELL) != 0); 1778. } 1779.  1780. /*  1781.  *	shift the probability of a monster's generation by  1782. *	comparing the dungeon alignment and monster alignment. 1783. *	return an integer in the range of 0-5. 1784. */  1785. STATIC_OVL int 1786. align_shift(ptr) 1787. register struct permonst *ptr; 1788. { 1789.     static NEARDATA long oldmoves = 0L;	/* != 1, starting value of moves */ 1790.    static NEARDATA s_level *lev; 1791.    register int alshift; 1792. 1793.     if(oldmoves != moves) { 1794. 	lev = Is_special(&u.uz); 1795. 	oldmoves = moves; 1796.    }  1797.     switch((lev) ? lev->flags.align : dungeons[u.uz.dnum].flags.align) { 1798.    default:	/* just in case */ 1799.    case AM_NONE:	alshift = 0; 1800. 			break; 1801.    case AM_LAWFUL:	alshift = (ptr->maligntyp+20)/(2*ALIGNWEIGHT); 1802. 			break; 1803.    case AM_NEUTRAL:	alshift = (20 - abs(ptr->maligntyp))/ALIGNWEIGHT; 1804. 			break; 1805.    case AM_CHAOTIC:	alshift = (-(ptr->maligntyp-20))/(2*ALIGNWEIGHT); 1806. 			break; 1807.    }  1808.     return alshift; 1809. } 1810.  1811. static NEARDATA struct { 1812. 	int choice_count; 1813. 	char mchoices[SPECIAL_PM];	/* value range is 0..127 */ 1814. } rndmonst_state = { -1, {0} }; 1815. 1816. /* select a random monster type */ 1817. struct permonst * 1818. rndmonst 1819. { 1820. 	register struct permonst *ptr; 1821. 	register int mndx, ct; 1822. 1823. /* [Tom] this was locking up priest quest... who knows why? */ 1824. /* fixed it! no 'W' class monsters with corpses! oops! */ 1825. /*    if(u.uz.dnum == quest_dnum && (ptr = qt_montype)) return(ptr); */ 1826. 	if(u.uz.dnum == quest_dnum) { 1827. 		if ((ptr = qt_montype)) { 1828. 			return(ptr); 1829. 		} 1830. 	}  1831.  1832. 	/* KMH -- February 2 is Groundhog Day! */ 1833. 	if (Is_oracle_level(&u.uz) && (!!flags.groundhogday ^ !rn2(20))) 1834. 		return (&mons[PM_WOODCHUCK]); 1835. 1836. /*      if (u.uz.dnum == quest_dnum && rn2(7) && (ptr = qt_montype) != 0) 1837. 	   return ptr; */ 1838. 1839. 	if (rndmonst_state.choice_count < 0) {	/* need to recalculate */ 1840. 	   int zlevel, minmlev, maxmlev; 1841. 	   boolean elemlevel; 1842. #ifdef REINCARNATION 1843. 	   boolean upper; 1844. #endif 1845. 	   rndmonst_state.choice_count = 0; 1846. 	   /* look for first common monster */ 1847. 	   for (mndx = LOW_PM; mndx < SPECIAL_PM; mndx++) { 1848. 		if (!uncommon(mndx)) break; 1849. 		rndmonst_state.mchoices[mndx] = 0; 1850. 	   }		  1851. 	    if (mndx == SPECIAL_PM) { 1852. 		/* evidently they've all been exterminated */ 1853. #ifdef DEBUG 1854. 		pline("rndmonst: no common mons!"); 1855. #endif 1856. 		return (struct permonst *)0; 1857. 	   } /* else `mndx' now ready for use below */ 1858. 	   zlevel = level_difficulty; 1859. 	   /* determine the level of the weakest monster to make. */ 1860. 	    minmlev = zlevel / 6; 1861. 	   /* determine the level of the strongest monster to make. */ 1862. 	    maxmlev = (zlevel + u.ulevel + 1)>>1; 1863. #ifdef REINCARNATION 1864. 	   upper = Is_rogue_level(&u.uz); 1865. #endif 1866. 	   elemlevel = In_endgame(&u.uz) && !Is_astralevel(&u.uz); 1867. 1868. /*  1869.  *	Find out how many monsters exist in the range we have selected. 1870. */  1871. 	      1872. loopback: 1873. 	   /* (`mndx' initialized above) */ 1874. 	   for (mndx < SPECIAL_PM; mndx++) { 1875. 		ptr = &mons[mndx]; 1876. 		rndmonst_state.mchoices[mndx] = 0; 1877. 		if (tooweak(mndx, minmlev) || toostrong(mndx, maxmlev)) 1878. 		   continue; 1879. #ifdef REINCARNATION 1880. 		if (upper && !isupper((int)def_monsyms[(int)(ptr->mlet)])) continue; 1881. #endif 1882. 		if (elemlevel && wrong_elem_type(ptr)) continue; 1883. 		if (uncommon(mndx)) continue; 1884. 		if (Inhell && (ptr->geno & G_NOHELL)) continue; 1885. 		ct = (int)(ptr->geno & G_FREQ) + align_shift(ptr); 1886. 		if (ct < 0 || ct > 127) 1887. 		   panic("rndmonst: bad count [#%d: %d]", mndx, ct); 1888. 		rndmonst_state.choice_count += ct; 1889. 		rndmonst_state.mchoices[mndx] = (char)ct; 1890. 	   }  1891. /*  1892.  *	    Possible modification:  if choice_count is "too low", 1893. *	    expand minmlev..maxmlev range and try again. 1894. */  1895. 	} /* choice_count+mchoices[] recalc */ 1896. 1897. 	if (rndmonst_state.choice_count <= 0) { 1898. 	   /* maybe no common mons left, or all are too weak or too strong */ 1899. #ifdef DEBUG 1900. 	   Norep("rndmonst: choice_count=%d", rndmonst_state.choice_count); 1901. #endif 1902. 	   return (struct permonst *)0; 1903. 	} 1904.  1905. /*  1906.  *	Now, select a monster at random. 1907. */  1908. 	ct = rnd(rndmonst_state.choice_count); 1909. 	for (mndx = LOW_PM; mndx < SPECIAL_PM; mndx++) 1910. 	   if ((ct -= (int)rndmonst_state.mchoices[mndx]) <= 0) break; 1911. 1912. 	if (mndx == SPECIAL_PM || uncommon(mndx)) {	/* shouldn't happen */ 1913. 	   impossible("rndmonst: bad `mndx' [#%d]", mndx); 1914. 	   return (struct permonst *)0; 1915. 	} 1916. 	return &mons[mndx]; 1917. 1918. /*  1919.  * [Tom] Your rival adventurers are a special case: 1920. *       - They have varying levels, and thus can always appear 1921. *       - But they need to be sorta rare or else they're a large 1922. *         percentage of the dungeon inhabitants. 1923. */  1924. 	      if ((monsndx(ptr-1) >= PM_ARCHEOLOGIST) &&  1925. 		  (monsndx(ptr-1) <= PM_WIZARD)  1926. 		   && (rn2(4))) goto loopback; 1927. } 1928.  1929. /* called when you change level (experience or dungeon depth) or when 1930.   monster species can no longer be created (genocide or extinction) */ 1931. void 1932. reset_rndmonst(mndx) 1933. int mndx;	/* particular species that can no longer be created */ 1934. { 1935. 	/* cached selection info is out of date */ 1936. 	if (mndx == NON_PM) { 1937. 	   rndmonst_state.choice_count = -1;	/* full recalc needed */ 1938. 	} else if (mndx < SPECIAL_PM) { 1939. 	   rndmonst_state.choice_count -= rndmonst_state.mchoices[mndx]; 1940. 	   rndmonst_state.mchoices[mndx] = 0; 1941. 	} /* note: safe to ignore extinction of unique monsters */ 1942. } 1943.  1944. #endif /* OVL0 */ 1945. #ifdef OVL1 1946. 1947. /*	The routine below is used to make one of the multiple types 1948. *	of a given monster class. The second parameter specifies a 1949. *	special casing bit mask to allow the normal genesis 1950. *	masks to be deactivated. Returns 0 if no monsters 1951. *	in that class can be made. 1952. */  1953.  1954. struct permonst * 1955. mkclass(class,spc) 1956. char	class; 1957. int	spc; 1958. { 1959. 	register int    first; 1960. 1961. 	first = pm_mkclass(class,spc); 1962. 	 1963. 	if (first == -1) return((struct permonst *) 0); 1964. 1965. 	return(&mons[first]); 1966. } 1967.  1968. /* Called by mkclass - returns the pm of the monster 1969. * Returns -1 (PM_PLAYERMON) if can't find monster of the class 1970. *  1971.  * spc may have G_UNIQ and/or G_NOGEN set to allow monsters of  1972. * this type (otherwise they will be ignored). It may also have 1973. * MKC_ULIMIT set to place an upper limit on the difficulty of  1974. * the monster returned. 1975. */  1976. int 1977. pm_mkclass(class,spc) 1978. char   class; 1979. int    spc; 1980. { 1981. 	register int	first, last, num = 0; 1982. 	int maxmlev, mask = (G_NOGEN | G_UNIQ) & ~spc; 1983. 1984. 	maxmlev = level_difficulty >> 1; 1985. 	if(class < 1 || class >= MAXMCLASSES) { 1986. 	   impossible("mkclass called with bad class!"); 1987. 	   return(-1); 1988. 	} 1989. /*	Assumption #1:	monsters of a given class are contiguous in the 1990. *			mons[] array. 1991. */  1992. 	for (first = LOW_PM; first < SPECIAL_PM; first++) 1993. 	   if (mons[first].mlet == class) break; 1994. 	if (first == SPECIAL_PM) return (-1); 1995. 1996. 	for (last = first;  1997. 		last < SPECIAL_PM && mons[last].mlet == class; last++) 1998. 	   if (!(mvitals[last].mvflags & G_GONE) && !(mons[last].geno & mask)  1999. 					&& !is_placeholder(&mons[last])) { 2000. 		/* consider it */ 2001. 		if(spc & MKC_ULIMIT && toostrong(last, 4 * maxmlev)) break; 2002. 		if(num && toostrong(last, maxmlev) && 2003. 		   monstr[last] != monstr[last-1] && rn2(2)) break; 2004. 		num += mons[last].geno & G_FREQ; 2005. 	   }  2006.  2007. 	if(!num) return(-1); 2008. 2009. /*	Assumption #2:	monsters of a given class are presented in ascending 2010. *			order of strength. 2011. */  2012. 	for(num = rnd(num); num > 0; first++) 2013. 	   if (!(mvitals[first].mvflags & G_GONE) && !(mons[first].geno & mask)  2014. 					&& !is_placeholder(&mons[first])) { 2015. 		/* skew towards lower value monsters at lower exp. levels */ 2016. 		num -= mons[first].geno & G_FREQ; 2017. 		if (num && adj_lev(&mons[first]) > (u.ulevel*2)) { 2018. 		   /* but not when multiple monsters are same level */ 2019. 		   if (mons[first].mlevel != mons[first+1].mlevel) 2020. 			num--; 2021. 		} 2022. 	    }  2023. 	first--; /* correct an off-by-one error */ 2024. 2025. 	return(first); 2026. } 2027.  2028. int 2029. adj_lev(ptr)	/* adjust strength of monsters based on u.uz and u.ulevel */ 2030. register struct permonst *ptr; 2031. { 2032. 	int	tmp, tmp2; 2033. 2034. 	if (ptr == &mons[PM_WIZARD_OF_YENDOR]) { 2035. 		/* does not depend on other strengths, but does get stronger 2036. 		 * every time he is killed 2037. 		 */ 2038. 		tmp = ptr->mlevel + mvitals[PM_WIZARD_OF_YENDOR].died; 2039. 		if (tmp > 49) tmp = 49; 2040. 		return tmp; 2041. 	} 2042.  2043. 	if((tmp = ptr->mlevel) > 49) return(50); /* "special" demons/devils */ 2044. 	tmp2 = (level_difficulty - tmp); 2045. 	if(tmp2 < 0) tmp--;		/* if mlevel > u.uz decrement tmp */ 2046. 	else tmp += (tmp2 / 5);		/* else increment 1 per five diff */ 2047. 2048. 	tmp2 = (u.ulevel - ptr->mlevel);	/* adjust vs. the player */ 2049. 	if(tmp2 > 0) tmp += (tmp2 / 4);		/* level as well */ 2050. 2051. 	tmp2 = (3 * ((int) ptr->mlevel))/ 2;	/* crude upper limit */ 2052. 	if (tmp2 > 49) tmp2 = 49;		/* hard upper limit */ 2053. 	return((tmp > tmp2) ? tmp2 : (tmp > 0 ? tmp : 0)); /* 0 lower limit */ 2054. } 2055.  2056. #endif /* OVL1 */ 2057. #ifdef OVLB 2058. 2059. struct permonst * 2060. grow_up(mtmp, victim)	/* `mtmp' might "grow up" into a bigger version */ 2061. struct monst *mtmp, *victim; 2062. { 2063. 	int oldtype, newtype, max_increase, cur_increase, 2064. 	   lev_limit, hp_threshold; 2065. 	struct permonst *ptr = mtmp->data; 2066. 2067. 	/* monster died after killing enemy but before calling this function */ 2068. 	/* currently possible if killing a gas spore */ 2069. 	if (mtmp->mhp <= 0) 2070. 	   return ((struct permonst *)0); 2071. 2072. 	if (mtmp->oldmonnm != monsndx(ptr)) 2073. 	   return ptr;		/* No effect if polymorphed */ 2074. 2075. 	/* note:  none of the monsters with special hit point calculations 2076. 	  have both little and big forms */ 2077. 	oldtype = monsndx(ptr); 2078. 	newtype = little_to_big(oldtype); 2079. 	if (newtype == PM_PRIEST && mtmp->female) newtype = PM_PRIESTESS; 2080. 2081. 	/* growth limits differ depending on method of advancement */ 2082. 	if (victim) {		/* killed a monster */ 2083. 	   /*  2084. 	     * The HP threshold is the maximum number of hit points for the 2085. 	    * current level; once exceeded, a level will be gained. 2086. 	    * Possible bug: if somehow the hit points are already higher 2087. 	    * than that, monster will gain a level without any increase in HP. 2088. 	    */  2089. 	    hp_threshold = mtmp->m_lev * 8;		/* normal limit */ 2090. 	   if (!mtmp->m_lev) 2091. 		hp_threshold = 4; 2092. 	   else if (is_golem(ptr))	/* strange creatures */ 2093. 		hp_threshold = ((mtmp->mhpmax / 10) + 1) * 10 - 1; 2094. 	   else if (is_home_elemental(ptr)) 2095. 		hp_threshold *= 3; 2096. 	   lev_limit = 3 * (int)ptr->mlevel / 2;	/* same as adj_lev */ 2097. 	   /* If they can grow up, be sure the level is high enough for that */ 2098. 	   if (oldtype != newtype && mons[newtype].mlevel > lev_limit) 2099. 		lev_limit = (int)mons[newtype].mlevel; 2100. 	   /* number of hit points to gain; unlike for the player, we put 2101. 	      the limit at the bottom of the next level rather than the top */ 2102. 	   max_increase = rnd((int)victim->m_lev + 1); 2103. 	   if (mtmp->mhpmax + max_increase > hp_threshold + 1) 2104. 		max_increase = max((hp_threshold + 1) - mtmp->mhpmax, 0); 2105. 	   cur_increase = (max_increase > 1) ? rn2(max_increase) : 0; 2106. 	} else { 2107. 	   /* a gain level potion or wraith corpse; always go up a level 2108. 	      unless already at maximum (49 is hard upper limit except  2109. 	       for demon lords, who start at 50 and can't go any higher) */ 2110. 	   max_increase = cur_increase = rnd(8) + rnd(2); 2111. 	   hp_threshold = 0;	/* smaller than `mhpmax + max_increase' */ 2112. 	   lev_limit = 50;		/* recalc below */ 2113. 	} 2114.  2115. 	mtmp->mhpmax += max_increase; 2116. 	mtmp->mhp += cur_increase; 2117. 2118. 	mtmp->m_enmax += max_increase; 2119. 	mtmp->m_en += cur_increase; 2120. 	 2121. 	if (mtmp->mhpmax <= hp_threshold) 2122. 	   return ptr;		/* doesn't gain a level */ 2123. 2124. 	/* Allow to grow up even if grown up form would normally be  2125. * out of range */ 2126. 	if (lev_limit < mons[newtype].mlevel) 2127. 	   lev_limit = mons[newtype].mlevel; 2128. 2129. 	if (is_mplayer(ptr)) lev_limit = 30;    /* same as player */ 2130. 	else if (lev_limit < 5) lev_limit = 5; /* arbitrary */ 2131. 	else if (lev_limit > 49) lev_limit = (ptr->mlevel > 49 ? 50 : 49); 2132. 2133. 	if ((int)++mtmp->m_lev >= mons[newtype].mlevel && newtype != oldtype) { 2134. 	   ptr = &mons[newtype]; 2135. 	   if (mvitals[newtype].mvflags & G_GENOD) {	/* allow G_EXTINCT */ 2136. 		if (sensemon(mtmp)) 2137. 		   pline("As %s grows up into %s, %s %s!", mon_nam(mtmp),  2138. 			an(ptr->mname), mhe(mtmp),  2139. 			nonliving(ptr) ? "expires" : "dies"); 2140. 		set_mon_data(mtmp, ptr, -1);	/* keep mvitals[] accurate */ 2141. 		mondied(mtmp); 2142. 		return (struct permonst *)0; 2143. 	   }  2144. 	    set_mon_data(mtmp, ptr, 1);		/* preserve intrinsics */ 2145. 	   newsym(mtmp->mx, mtmp->my);		/* color may change */ 2146. 	   lev_limit = (int)mtmp->m_lev;	/* never undo increment */ 2147. 	} 2148. 	/* sanity checks */ 2149. 	if ((int)mtmp->m_lev > lev_limit) { 2150. 	   mtmp->m_lev--;	/* undo increment */ 2151. 	   /* HP might have been allowed to grow when it shouldn't */ 2152. 	   if (mtmp->mhpmax == hp_threshold + 1) mtmp->mhpmax--; 2153. 	} 2154. 	if (mtmp->mhpmax > 50*8) mtmp->mhpmax = 50*8;	  /* absolute limit */ 2155. 	if (mtmp->mhp > mtmp->mhpmax) mtmp->mhp = mtmp->mhpmax; 2156. 2157. 	if (mtmp->m_enmax > 50*8) mtmp->m_enmax = 50*8;     /* absolute limit */ 2158. 	if (mtmp->m_en > mtmp->m_enmax) mtmp->m_en = mtmp->m_enmax; 2159. 2160. 	if (mtmp->oldmonnm != monsndx(ptr)) mtmp->oldmonnm = monsndx(ptr); 2161. 	return ptr; 2162. } 2163.  2164. #endif /* OVLB */ 2165. #ifdef OVL1 2166. 2167. int 2168. mongets(mtmp, otyp) 2169. register struct monst *mtmp; 2170. register int otyp; 2171. { 2172. 	register struct obj *otmp; 2173. 	int spe; 2174. 2175. 	if (!otyp) return 0; 2176. 	otmp = mksobj(otyp, TRUE, FALSE); 2177. 	if (otmp) { 2178. 	   if (mtmp->data->mlet == S_DEMON) { 2179. 		/* demons never get blessed objects */ 2180. 		if (otmp->blessed) curse(otmp); 2181. 	   } else if(is_lminion(mtmp)) { 2182. 		/* lawful minions don't get cursed, bad, or rusting objects */ 2183. 		otmp->cursed = FALSE; 2184. 		if(otmp->spe < 0) otmp->spe = 0; 2185. 		otmp->oerodeproof = TRUE; 2186. 	   } else if(In_endgame(&u.uz) && is_mplayer(mtmp->data) && is_sword(otmp)) { 2187. 		otmp->spe = (3 + rn2(3)); 2188. 	   }  2189. /*  2190.  *      This seems to be covered under mkobj.c ...  2191. * 2192.  *          * STEPHEN WHITE'S NEW CODE * 2193. *  2194.  *          if ((otmp->otyp == ORCISH_DAGGER      && !rn2(8))  ||  2195.  *              (otmp->otyp == ORCISH_SPEAR       && !rn2(10)) ||  2196.  *              (otmp->otyp == ORCISH_SHORT_SWORD && !rn2(12))) 2197. *                      otmp->opoisoned = TRUE; 2198. *  2199.  *           * It could be alread immune to rust ... * 2200.  *          if (!otmp->oerodeproof && !is_rustprone(otmp) &&  2201.  *              ((otmp->otyp >= SPEAR && otmp->otyp <= BULLWHIP) || 2202. *               (otmp->otyp >= ELVEN_LEATHER_HELM &&  2203.  *                otmp->otyp <= LEVITATION_BOOTS))) { 2204. *                   if (!rn2(10-otmp->spe)) otmp->oerodeproof = TRUE; 2205. *              else if (!rn2(10+otmp->spe)) otmp->oeroded = rn2(3); 2206. *          }  2207.  */  2208.  2209. 	    if(otmp->otyp == CANDELABRUM_OF_INVOCATION) { 2210. 		otmp->spe = 0; 2211. 		otmp->age = 0L; 2212. 		otmp->lamplit = FALSE; 2213. 		otmp->blessed = otmp->cursed = FALSE; 2214. 	   } else if (otmp->otyp == BELL_OF_OPENING) { 2215. 		otmp->blessed = otmp->cursed = FALSE; 2216. 	   } else if (otmp->otyp == SPE_BOOK_OF_THE_DEAD) { 2217. 		otmp->blessed = FALSE; 2218. 		otmp->cursed = TRUE; 2219. 	   }  2220.  2221. 	    /* leaders don't tolerate inferior quality battle gear */ 2222. 	   if (is_prince(mtmp->data)) { 2223. 		if (otmp->oclass == WEAPON_CLASS && otmp->spe < 1) 2224. 		   otmp->spe = 1; 2225. 		else if (otmp->oclass == ARMOR_CLASS && otmp->spe < 0) 2226. 		   otmp->spe = 0; 2227. 	   }  2228.  2229. 	    spe = otmp->spe; 2230. 	   (void) mpickobj(mtmp, otmp);	/* might free otmp */ 2231. 	   return(spe); 2232. 	} else return(0); 2233. } 2234.  2235. #endif /* OVL1 */ 2236. #ifdef OVLB 2237. 2238. int 2239. golemhp(type) 2240. int type; 2241. { 2242. 	switch(type) { 2243. 		case PM_PAPER_GOLEM: return 36; 2244. 		case PM_STRAW_GOLEM: return 40; 2245. 		case PM_GARGOYLE: return 46; 2246. 		case PM_ROPE_GOLEM: return 60; 2247. 		case PM_LEATHER_GOLEM: return 80; 2248. 		case PM_GOLD_GOLEM: return 80; 2249. 		case PM_WOOD_GOLEM: return 100; 2250. 		case PM_FLESH_GOLEM: return 120; 2251. 		case PM_STATUE_GARGOYLE: return 140; 2252. 		case PM_CLAY_GOLEM: return 150; 2253. 		case PM_STONE_GOLEM: return 180; 2254. 		case PM_GLASS_GOLEM: return 140; 2255. 		case PM_IRON_GOLEM: return 240; 2256. 		case PM_RUBY_GOLEM: return 250; 2257. 		case PM_DIAMOND_GOLEM: return 270; 2258. 		case PM_SAPPHIRE_GOLEM: return 280; 2259. 		case PM_STEEL_GOLEM: return 290; 2260. 		case PM_CRYSTAL_GOLEM: return 300; 2261. 		case PM_FRANKENSTEIN_S_MONSTER: return 400; 2262. 		case PM_WAX_GOLEM: return 40; 2263. 		case PM_PLASTIC_GOLEM: return 60; 2264. 		default: return 0; 2265. 	} 2266. }  2267.  2268. #endif /* OVLB */ 2269. #ifdef OVL1 2270. 2271. /*  2272.  *	Alignment vs. yours determines monster's attitude to you. 2273. *	( some "animal" types are co-aligned, but also hungry ) 2274. */  2275.  2276. boolean 2277. peace_minded(ptr) 2278. register struct permonst *ptr; 2279. { 2280. 	aligntyp mal = ptr->maligntyp, ual = u.ualign.type; 2281. 2282. 	if (always_peaceful(ptr)) return TRUE; 2283. 2284. 	if (always_hostile(ptr)) return FALSE; 2285. 	if (ptr->msound == MS_LEADER || ptr->msound == MS_GUARDIAN) 2286. 		return TRUE; 2287. 	if (ptr->msound == MS_NEMESIS)	return FALSE; 2288. 2289. 	if (is_elf(ptr) && is_elf(youmonst.data)) { 2290. 		/* Light and dark elves are always hostile to each other. 2291. 		 * Suggested by Dr. Eva R. Myers. 2292. 		 */ 2293. 		 if (ual > A_NEUTRAL && mal < A_NEUTRAL ||  2294. 		   ual < A_NEUTRAL && mal > A_NEUTRAL) 2295. 			return FALSE; 2296. 	} 2297.  2298. 	if (race_peaceful(ptr)) return TRUE; 2299. 	if (race_hostile(ptr)) return FALSE; 2300. 2301. 	/* the monster is hostile if its alignment is different from the 2302. 	 * player's */ 2303. 	if (sgn(mal) != sgn(ual)) return FALSE; 2304. 2305. 	/* Negative monster hostile to player with Amulet. */ 2306. 	if (mal < A_NEUTRAL && u.uhave.amulet) return FALSE; 2307. 2308. 	/* minions are hostile to players that have strayed at all */ 2309. 	if (is_minion(ptr)) return((boolean)(u.ualign.record >= 0)); 2310. 2311. 	/* Last case:  a chance of a co-aligned monster being 2312. 	 * hostile. This chance is greater if the player has strayed 2313. 	 * (u.ualign.record negative) or the monster is not strongly aligned. 2314. 	 */ 2315. 	return((boolean)(!!rn2(16 + (u.ualign.record < -15 ? -15 : u.ualign.record)) && 2316. 		!!rn2(2 + abs(mal)))); 2317. } 2318.  2319. /* Set malign to have the proper effect on player alignment if monster is  2320. * killed. Negative numbers mean it's bad to kill this monster; positive 2321. * numbers mean it's good. Since there are more hostile monsters than 2322. * peaceful monsters, the penalty for killing a peaceful monster should be  2323. * greater than the bonus for killing a hostile monster to maintain balance. 2324. * Rules: 2325. *   it's bad to kill peaceful monsters, potentially worse to kill always- 2326. *	peaceful monsters 2327. *   it's never bad to kill a hostile monster, although it may not be good 2328. */  2329. void 2330. set_malign(mtmp) 2331. struct monst *mtmp; 2332. { 2333. 	schar mal = mtmp->data->maligntyp; 2334. 	boolean coaligned; 2335. 2336. 	if (mtmp->ispriest || mtmp->isminion) { 2337. 		/* some monsters have individual alignments; check them */ 2338. 		if (mtmp->ispriest) 2339. 			mal = EPRI(mtmp)->shralign; 2340. 		else if (mtmp->isminion) 2341. 			mal = EMIN(mtmp)->min_align; 2342. 		/* unless alignment is none, set mal to -5,0,5 */ 2343. 		/* (see align.h for valid aligntyp values)    */ 2344. 		if(mal != A_NONE) 2345. 			mal *= 5; 2346. 		/* make priests of Moloch hostile */ 2347. 		if (mal == A_NONE) mtmp->mpeaceful = 0; 2348. 	} 2349.  2350.  2351. 	coaligned = (sgn(mal) == sgn(u.ualign.type)); 2352. 	if (mtmp->data->msound == MS_LEADER) { 2353. 		mtmp->malign = -20; 2354. 	} else if (mal == A_NONE) { 2355. 		if (mtmp->mpeaceful) 2356. 			mtmp->malign = 0; 2357. 		else 2358. 			mtmp->malign = 20;	/* really hostile */ 2359. 	} else if (always_peaceful(mtmp->data)) { 2360. 		int absmal = abs(mal); 2361. 		if (mtmp->mpeaceful) 2362. 			mtmp->malign = -3*max(5,absmal); 2363. 		else 2364. 			mtmp->malign = 3*max(5,absmal); /* renegade */ 2365. 	} else if (always_hostile(mtmp->data)) { 2366. 		int absmal = abs(mal); 2367. 		if (coaligned) 2368. 			mtmp->malign = 0; 2369. 		else 2370. 			mtmp->malign = max(5,absmal); 2371. 	} else if (coaligned) { 2372. 		int absmal = abs(mal); 2373. 		if (mtmp->mpeaceful) 2374. 			mtmp->malign = -3*max(3,absmal); 2375. 		else	/* renegade */ 2376. 			mtmp->malign = max(3,absmal); 2377. 	} else	/* not coaligned and therefore hostile */ 2378. 		mtmp->malign = abs(mal); 2379. } 2380.  2381. #endif /* OVL1 */ 2382. #ifdef OVLB 2383. 2384. static NEARDATA char syms[] = { 2385. 	MAXOCLASSES, MAXOCLASSES+1, RING_CLASS, WAND_CLASS, WEAPON_CLASS, 2386. 	FOOD_CLASS, COIN_CLASS, SCROLL_CLASS, POTION_CLASS, ARMOR_CLASS, 2387. 	AMULET_CLASS, TOOL_CLASS, ROCK_CLASS, GEM_CLASS, SPBOOK_CLASS, 2388. 	S_MIMIC_DEF, S_MIMIC_DEF, S_MIMIC_DEF, 2389. }; 2390.  2391. void 2392. set_mimic_sym(mtmp)		/* KAA, modified by ERS */ 2393. register struct monst *mtmp; 2394. { 2395. 	int typ, roomno, rt; 2396. 	unsigned appear, ap_type; 2397. 	int s_sym; 2398. 	struct obj *otmp; 2399. 	int mx, my; 2400. 2401. 	if (!mtmp) return; 2402. 	mx = mtmp->mx; my = mtmp->my; 2403. 	typ = levl[mx][my].typ; 2404. 					/* only valid for INSIDE of room */ 2405. 	roomno = levl[mx][my].roomno - ROOMOFFSET; 2406. 	if (roomno >= 0) 2407. 		rt = rooms[roomno].rtype; 2408. #ifdef SPECIALIZATION 2409. 	else if (IS_ROOM(typ)) 2410. 		rt = OROOM, roomno = 0; 2411. #endif 2412. 	else	rt = 0;	/* roomno < 0 case for GCC_WARN */ 2413. 2414. 	if (OBJ_AT(mx, my)) { 2415. 		ap_type = M_AP_OBJECT; 2416. 		appear = level.objects[mx][my]->otyp; 2417. 	} else if (IS_DOOR(typ) || IS_WALL(typ) || 2418. 		   typ == SDOOR || typ == SCORR) { 2419. 		ap_type = M_AP_FURNITURE; 2420. 		/* 2421. 		 *  If there is a wall to the left that connects to this 2422. 		 * location, then the mimic mimics a horizontal closed door. 2423. 		 * This does not allow doors to be in corners of rooms. 2424. 		 */ 2425. 		if (mx != 0 &&  2426. 			(levl[mx-1][my].typ == HWALL    || 2427. 			 levl[mx-1][my].typ == TLCORNER || 2428. 			 levl[mx-1][my].typ == TRWALL  || 2429. 			 levl[mx-1][my].typ == BLCORNER || 2430. 			 levl[mx-1][my].typ == TDWALL  || 2431. 			 levl[mx-1][my].typ == CROSSWALL|| 2432. 			 levl[mx-1][my].typ == TUWALL   )) 2433. 		   appear = S_hcdoor; 2434. 		else 2435. 		   appear = S_vcdoor; 2436. 2437. 		if(!mtmp->minvis || See_invisible) 2438. 		   block_point(mx,my);	/* vision */ 2439. 	} else if (level.flags.is_maze_lev && rn2(2)) { 2440. 		ap_type = M_AP_OBJECT; 2441. 		appear = STATUE; 2442. 	} else if (roomno < 0) { 2443. 		ap_type = M_AP_OBJECT; 2444. 		appear = BOULDER; 2445. 		if(!mtmp->minvis || See_invisible) 2446. 		   block_point(mx,my);	/* vision */ 2447. 	} else if (rt == ZOO || rt == VAULT) { 2448. 		ap_type = M_AP_OBJECT; 2449. 		appear = GOLD_PIECE; 2450. 	} else if (rt == DELPHI) { 2451. 		if (rn2(2)) { 2452. 			ap_type = M_AP_OBJECT; 2453. 			appear = STATUE; 2454. 		} else { 2455. 			ap_type = M_AP_FURNITURE; 2456. 			appear = S_fountain; 2457. 		} 2458. 	} else if (rt == TEMPLE) { 2459. 		ap_type = M_AP_FURNITURE; 2460. 		appear = S_altar; 2461. 	/* 2462. 	 * We won't bother with beehives, morgues, barracks, throne rooms 2463. 	 * since they shouldn't contain too many mimics anyway... 2464. */ 2465. 	} else if (rt >= SHOPBASE) { 2466. 		s_sym = get_shop_item(rt - SHOPBASE); 2467. 		if (s_sym < 0) { 2468. 			ap_type = M_AP_OBJECT; 2469. 			appear = -s_sym; 2470. 		} else { 2471. 			if (s_sym == RANDOM_CLASS) 2472. 				s_sym = syms[rn2((int)sizeof(syms)-2) + 2]; 2473. 			goto assign_sym; 2474. 		} 2475. 	} else { 2476. 		s_sym = syms[rn2((int)sizeof(syms))]; 2477. assign_sym: 2478. 		if (s_sym >= MAXOCLASSES) { 2479. 			ap_type = M_AP_FURNITURE; 2480. 			appear = s_sym == MAXOCLASSES ? S_upstair : S_dnstair; 2481. 		} else if (s_sym == COIN_CLASS) { 2482. 			ap_type = M_AP_OBJECT; 2483. 			appear = GOLD_PIECE; 2484. 		} else { 2485. 			ap_type = M_AP_OBJECT; 2486. 			if (s_sym == S_MIMIC_DEF) { 2487. 				appear = STRANGE_OBJECT; 2488. 			} else { 2489. 				otmp = mkobj( (char) s_sym, FALSE ); 2490. 				appear = otmp->otyp; 2491. 				/* make sure container contents are free'ed */ 2492. 				if (Has_contents(otmp)) 2493. 					delete_contents(otmp); 2494. 				obfree(otmp, (struct obj *) 0); 2495. 			} 2496. 		}  2497. 	}  2498. 	mtmp->m_ap_type = ap_type; 2499. 	mtmp->mappearance = appear; 2500. } 2501.  2502. /* release a monster from a bag of tricks */ 2503. void 2504. bagotricks(bag) 2505. struct obj *bag; 2506. { 2507.     if (!bag || bag->otyp != BAG_OF_TRICKS) { 2508. 	impossible("bad bag o' tricks"); 2509.    } else if (bag->spe < 1) { 2510. 	pline(nothing_happens); 2511.    } else { 2512. 	boolean gotone = FALSE; 2513. 	int cnt = 1; 2514. 2515. 	consume_obj_charge(bag, TRUE); 2516. 2517. 	if (!rn2(23)) cnt += rn1(7, 1); 2518. 	while (cnt-- > 0) { 2519. 	   if (makemon((struct permonst *)0, u.ux, u.uy, NO_MM_FLAGS)) 2520. 		gotone = TRUE; 2521. 	} 2522. 	if (gotone) makeknown(BAG_OF_TRICKS); 2523.    }  2524. }  2525.  2526. #endif /* OVLB */ 2527. 2528. /*makemon.c*/