Source:NetHack 3.2.0/makemon.c

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

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

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