Source:NetHack 3.1.0/makemon.c

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