Source:NetHack 3.1.0/polyself.c
Jump to navigation
Jump to search
Below is the full text to polyself.c from the source code of NetHack 3.1.0. To link to a particular line, write [[NetHack 3.1.0/polyself.c#line123]], for example.
Warning! This is the source code from an old release. For the latest release, see Source code
The NetHack General Public License applies to screenshots, source code and other content from NetHack.
This content was modified from the original NetHack source code distribution (by splitting up NetHack content between wiki pages, and possibly further editing). See the page history for a list of who changed it, and on what dates.
1. /* SCCS Id: @(#)polyself.c 3.1 92/11/24 2. /* Copyright (C) 1987, 1988, 1989 by Ken Arromdee */ 3. /* NetHack may be freely redistributed. See license for details. */ 4. 5. /* Polymorph self routine. */ 6. 7. #include "hack.h" 8. 9. #ifdef OVLB 10. #ifdef POLYSELF 11. static void NDECL(polyman); 12. static void NDECL(break_armor); 13. static void FDECL(drop_weapon,(int)); 14. static void NDECL(skinback); 15. static void NDECL(uunstick); 16. static int FDECL(armor_to_dragon,(int)); 17. 18. /* make a (new) human out of the player */ 19. static void 20. polyman() 21. { 22. boolean sticky = sticks(uasmon) && u.ustuck && !u.uswallow; 23. 24. if (u.umonnum != -1) { 25. u.acurr = u.macurr; /* restore old attribs */ 26. u.amax = u.mamax; 27. u.umonnum = -1; 28. flags.female = u.mfemale; 29. } 30. u.usym = S_HUMAN; 31. set_uasmon(); 32. 33. u.mh = u.mhmax = 0; 34. u.mtimedone = 0; 35. skinback(); 36. u.uundetected = 0; 37. newsym(u.ux,u.uy); 38. 39. if (sticky) uunstick(); 40. find_ac(); 41. if(!Levitation && !u.ustuck && 42. (is_pool(u.ux,u.uy) || is_lava(u.ux,u.uy))) 43. spoteffects(); 44. } 45. #endif /* POLYSELF */ 46. 47. void 48. change_sex() 49. { 50. flags.female = !flags.female; 51. max_rank_sz(); 52. if (pl_character[0] == 'P') 53. Strcpy(pl_character+6, flags.female ? "ess" : ""); 54. if (pl_character[0] == 'C') 55. Strcpy(pl_character+4, flags.female ? "woman" : "man"); 56. } 57. 58. void 59. newman() 60. { 61. int tmp, tmp2; 62. 63. if (!rn2(10)) change_sex(); 64. 65. tmp = u.uhpmax; 66. tmp2 = u.ulevel; 67. u.ulevel = u.ulevel-2+rn2(5); 68. if (u.ulevel > 127 || u.ulevel == 0) u.ulevel = 1; 69. if (u.ulevel > MAXULEV) u.ulevel = MAXULEV; 70. 71. adjabil(tmp2, (int)u.ulevel); 72. 73. /* random experience points for the new experience level */ 74. u.uexp = rndexp(); 75. #ifndef LINT 76. u.uhpmax = (u.uhpmax-10)*(long)u.ulevel/tmp2 + 19 - rn2(19); 77. #endif 78. /* If it was u.uhpmax*u.ulevel/tmp+9-rn2(19), then a 1st level character 79. with 16 hp who polymorphed into a 3rd level one would have an average 80. of 48 hp. */ 81. #ifdef LINT 82. u.uhp = u.uhp + tmp; 83. #else 84. u.uhp = u.uhp * (long)u.uhpmax/tmp; 85. #endif 86. 87. tmp = u.uenmax; 88. #ifndef LINT 89. u.uenmax = u.uenmax * (long)u.ulevel/tmp2 + 9 - rn2(19); 90. #endif 91. if (u.uenmax < 0) u.uenmax = 0; 92. #ifndef LINT 93. u.uen = (tmp ? u.uen * (long)u.uenmax / tmp : u.uenmax); 94. #endif 95. 96. redist_attr(); 97. u.uhunger = rn1(500,500); 98. newuhs(FALSE); 99. Sick = 0; 100. Stoned = 0; 101. if (u.uhp <= 0 || u.uhpmax <= 0) { 102. #ifdef POLYSELF 103. if(Polymorph_control) { 104. if (u.uhp <= 0) u.uhp = 1; 105. if (u.uhpmax <= 0) u.uhpmax = 1; 106. } else { 107. #endif 108. Your("new form doesn't seem healthy enough to survive."); 109. killer_format = KILLED_BY_AN; 110. killer="unsuccessful polymorph"; 111. done(DIED); 112. pline("Revived, you are in just as bad a shape as before."); 113. done(DIED); 114. #ifdef POLYSELF 115. } 116. #endif 117. } 118. #ifdef POLYSELF 119. polyman(); 120. #endif 121. You("feel like a new %sman!", flags.female ? "wo" : ""); 122. flags.botl = 1; 123. (void) encumber_msg(); 124. } 125. 126. #ifdef POLYSELF 127. void 128. polyself() 129. { 130. char buf[BUFSZ]; 131. int mntmp = -1; 132. int tries=0; 133. boolean draconian = (uarm && 134. uarm->otyp >= GRAY_DRAGON_SCALE_MAIL && 135. uarm->otyp <= YELLOW_DRAGON_SCALES); 136. 137. boolean iswere = (u.ulycn > -1 || is_were(uasmon)); 138. boolean isvamp = (u.usym == S_VAMPIRE || u.umonnum == PM_VAMPIRE_BAT); 139. 140. if(!Polymorph_control && !draconian && !iswere && !isvamp) { 141. if (rn2(20) > ACURR(A_CON)) { 142. You(shudder_for_moment); 143. losehp(rn2(30),"system shock", KILLED_BY_AN); 144. exercise(A_CON, FALSE); 145. return; 146. } 147. } 148. 149. if (Polymorph_control) { 150. do { 151. getlin("Become what kind of monster? [type the name]", 152. buf); 153. mntmp = name_to_mon(buf); 154. if (mntmp < 0) 155. pline("I've never heard of such monsters."); 156. /* Note: humans are illegal as monsters, but an 157. * illegal monster forces newman(), which is what we 158. * want if they specified a human.... */ 159. else if (!polyok(&mons[mntmp]) && 160. ((pl_character[0] == 'E') ? !is_elf(&mons[mntmp]) 161. : !is_human(&mons[mntmp])) ) 162. You("cannot polymorph into that."); 163. else break; 164. } while(++tries < 5); 165. if (tries==5) pline(thats_enough_tries); 166. /* allow skin merging, even when polymorph is controlled */ 167. if (draconian && 168. (mntmp == armor_to_dragon(uarm->otyp) || tries == 5)) 169. goto do_merge; 170. } else if (draconian || iswere || isvamp) { 171. /* special changes that don't require polyok() */ 172. if (draconian) { 173. do_merge: 174. mntmp = armor_to_dragon(uarm->otyp); 175. if (!(mons[mntmp].geno & G_GENOD)) { 176. /* allow G_EXTINCT */ 177. You("merge with your scaly armor."); 178. uskin = uarm; 179. uarm = (struct obj *)0; 180. } 181. } else if (iswere) { 182. if (is_were(uasmon)) 183. mntmp = PM_HUMAN; /* Illegal; force newman() */ 184. else 185. mntmp = u.ulycn; 186. } else { 187. if (u.usym == S_VAMPIRE) 188. mntmp = PM_VAMPIRE_BAT; 189. else 190. mntmp = PM_VAMPIRE; 191. } 192. if (polymon(mntmp)) 193. return; 194. } 195. 196. if (mntmp < 0) { 197. tries = 0; 198. do { 199. mntmp = rn2(PM_ARCHEOLOGIST); 200. /* All valid monsters are from 0 to PM_ARCHEOLOGIST-1 */ 201. } while(!polyok(&mons[mntmp]) && tries++ < 200); 202. } 203. 204. /* The below polyok() fails either if everything is genocided, or if 205. * we deliberately chose something illegal to force newman(). 206. */ 207. if (!polyok(&mons[mntmp]) || !rn2(5)) 208. newman(); 209. else if(!polymon(mntmp)) return; 210. 211. if (!uarmg) selftouch("No longer petrify-resistant, you"); 212. } 213. 214. /* (try to) make a mntmp monster out of the player */ 215. int 216. polymon(mntmp) /* returns 1 if polymorph successful */ 217. int mntmp; 218. { 219. boolean sticky = sticks(uasmon) && u.ustuck && !u.uswallow; 220. boolean dochange = FALSE; 221. int tmp; 222. 223. if (mons[mntmp].geno & G_GENOD) { /* allow G_EXTINCT */ 224. You("feel rather %s-ish.",mons[mntmp].mname); 225. exercise(A_WIS, TRUE); 226. return(0); 227. } 228. 229. if (u.umonnum == -1) { 230. /* Human to monster; save human stats */ 231. u.macurr = u.acurr; 232. u.mamax = u.amax; 233. u.mfemale = flags.female; 234. } else { 235. /* Monster to monster; restore human stats, to be 236. * immediately changed to provide stats for the new monster 237. */ 238. u.acurr = u.macurr; 239. u.amax = u.mamax; 240. flags.female = u.mfemale; 241. } 242. 243. if (is_male(&mons[mntmp])) { 244. if(flags.female) dochange = TRUE; 245. } else if (is_female(&mons[mntmp])) { 246. if(!flags.female) dochange = TRUE; 247. } else if (!is_neuter(&mons[mntmp])) { 248. if(!rn2(10)) dochange = TRUE; 249. } 250. if (dochange) { 251. flags.female = !flags.female; 252. You("%s %s %s!", 253. (u.umonnum != mntmp) ? "turn into a" : "feel like a new", 254. flags.female ? "female" : "male", 255. mons[mntmp].mname); 256. } else { 257. if (u.umonnum != mntmp) 258. You("turn into %s!", an(mons[mntmp].mname)); 259. else 260. You("feel like a new %s!", mons[mntmp].mname); 261. } 262. 263. u.umonnum = mntmp; 264. u.usym = mons[mntmp].mlet; 265. set_uasmon(); 266. 267. /* New stats for monster, to last only as long as polymorphed. 268. * Currently only strength gets changed. 269. */ 270. if(strongmonst(&mons[mntmp])) ABASE(A_STR) = AMAX(A_STR) = 118; 271. 272. if (resists_ston(uasmon) && Stoned) { /* parnes@eniac.seas.upenn.edu */ 273. Stoned = 0; 274. You("no longer seem to be petrifying."); 275. } 276. if (u.usym == S_FUNGUS && Sick) { 277. Sick = 0; 278. You("no longer feel sick."); 279. } 280. 281. if (u.usym == S_DRAGON && mntmp >= PM_GRAY_DRAGON) 282. u.mhmax = 8 * mons[mntmp].mlevel; 283. else if (is_golem(uasmon)) u.mhmax = golemhp(mntmp); 284. else { 285. /* 286. tmp = adj_lev(&mons[mntmp]); 287. * We can't do this, since there's no such thing as an 288. * "experience level of you as a monster" for a polymorphed 289. * character. 290. */ 291. tmp = mons[mntmp].mlevel; 292. if (!tmp) u.mhmax = rnd(4); 293. else u.mhmax = d(tmp, 8); 294. } 295. u.mh = u.mhmax; 296. 297. u.mtimedone = rn1(500, 500); 298. if (u.ulevel < mons[mntmp].mlevel) 299. /* Low level characters can't become high level monsters for long */ 300. #ifdef DUMB 301. { 302. /* DRS/NS 2.2.6 messes up -- Peter Kendell */ 303. int mtd = u.mtimedone, 304. ulv = u.ulevel, 305. mlv = mons[mntmp].mlevel; 306. 307. u.mtimedone = mtd * ulv / mlv; 308. } 309. #else 310. u.mtimedone = u.mtimedone * u.ulevel / mons[mntmp].mlevel; 311. #endif 312. 313. if (uskin && mntmp != armor_to_dragon(uskin->otyp)) 314. skinback(); 315. break_armor(); 316. drop_weapon(1); 317. if (hides_under(uasmon)) 318. u.uundetected = OBJ_AT(u.ux, u.uy); 319. else 320. u.uundetected = 0; 321. newsym(u.ux,u.uy); /* Change symbol */ 322. 323. if (!sticky && !u.uswallow && u.ustuck && sticks(uasmon)) u.ustuck = 0; 324. else if (sticky && !sticks(uasmon)) uunstick(); 325. 326. if (flags.verbose) { 327. static const char use_thec[] = "Use the command #%s to %s."; 328. static const char monsterc[] = "monster"; 329. if (can_breathe(uasmon)) 330. pline(use_thec,monsterc,"use your breath weapon"); 331. if (attacktype(uasmon, AT_SPIT)) 332. pline(use_thec,monsterc,"spit venom"); 333. if (u.usym == S_NYMPH) 334. pline(use_thec,monsterc,"remove an iron ball"); 335. if (u.usym == S_UMBER) 336. pline(use_thec,monsterc,"confuse monsters"); 337. if (is_hider(uasmon)) 338. pline(use_thec,monsterc,"hide"); 339. if (is_were(uasmon)) 340. pline(use_thec,monsterc,"summon help"); 341. if (webmaker(uasmon)) 342. pline(use_thec,monsterc,"spin a web"); 343. if (u.umonnum == PM_GREMLIN) 344. pline(use_thec,monsterc,"multiply in a fountain"); 345. if (u.usym == S_UNICORN) 346. pline(use_thec,monsterc,"use your horn"); 347. if (u.umonnum == PM_MIND_FLAYER) 348. pline(use_thec,monsterc,"for a mental blast"); 349. if (uasmon->msound == MS_SHRIEK) /* worthless, actually */ 350. pline(use_thec,monsterc,"shriek"); 351. if ((lays_eggs(uasmon) || u.umonnum==PM_QUEEN_BEE) && flags.female) 352. pline(use_thec,"sit","lay an egg"); 353. } 354. find_ac(); 355. if((!Levitation && !u.ustuck && !is_flyer(uasmon) && 356. (is_pool(u.ux,u.uy) || is_lava(u.ux,u.uy))) || 357. (Underwater && !is_swimmer(uasmon))) 358. spoteffects(); 359. if (passes_walls(uasmon) && u.utrap && u.utraptype == TT_INFLOOR) { 360. u.utrap = 0; 361. pline("The rock seems to no longer trap you."); 362. } 363. flags.botl = 1; 364. vision_full_recalc = 1; 365. exercise(A_CON, FALSE); 366. exercise(A_WIS, TRUE); 367. (void) encumber_msg(); 368. return(1); 369. } 370. 371. static void 372. break_armor() 373. { 374. struct obj *otmp; 375. 376. if (breakarm(uasmon)) { 377. if (otmp = uarm) { 378. if (donning(otmp)) cancel_don(); 379. You("break out of your armor!"); 380. exercise(A_STR, FALSE); 381. (void) Armor_gone(); 382. useup(otmp); 383. } 384. if (otmp = uarmc) { 385. if(otmp->oartifact) { 386. Your("cloak falls off!"); 387. (void) Cloak_off(); 388. dropx(otmp); 389. } else { 390. Your("cloak tears apart!"); 391. (void) Cloak_off(); 392. useup(otmp); 393. } 394. } 395. #ifdef TOURIST 396. if (uarmu) { 397. Your("shirt rips to shreds!"); 398. useup(uarmu); 399. } 400. #endif 401. } else if (sliparm(uasmon)) { 402. if (otmp = uarm) { 403. if (donning(otmp)) cancel_don(); 404. Your("armor falls around you!"); 405. (void) Armor_gone(); 406. dropx(otmp); 407. } 408. if (otmp = uarmc) { 409. if (is_whirly(uasmon)) 410. Your("cloak falls, unsupported!"); 411. else You("shrink out of your cloak!"); 412. (void) Cloak_off(); 413. dropx(otmp); 414. } 415. #ifdef TOURIST 416. if (otmp = uarmu) { 417. if (is_whirly(uasmon)) 418. You("seep right through your shirt!"); 419. else You("become much too small for your shirt!"); 420. setworn((struct obj *)0, otmp->owornmask & W_ARMU); 421. dropx(otmp); 422. } 423. #endif 424. } 425. if (nohands(uasmon) || verysmall(uasmon)) { 426. if (otmp = uarmg) { 427. if (donning(otmp)) cancel_don(); 428. /* Drop weapon along with gloves */ 429. You("drop your gloves%s!", uwep ? " and weapon" : ""); 430. drop_weapon(0); 431. (void) Gloves_off(); 432. dropx(otmp); 433. } 434. if (otmp = uarms) { 435. You("can no longer hold your shield!"); 436. (void) Shield_off(); 437. dropx(otmp); 438. } 439. if (otmp = uarmh) { 440. if (donning(otmp)) cancel_don(); 441. Your("helmet falls to the floor!"); 442. (void) Helmet_off(); 443. dropx(otmp); 444. } 445. if (otmp = uarmf) { 446. if (donning(otmp)) cancel_don(); 447. if (is_whirly(uasmon)) 448. Your("boots fall away!"); 449. else Your("boots %s off your feet!", 450. verysmall(uasmon) ? "slide" : "are pushed"); 451. (void) Boots_off(); 452. dropx(otmp); 453. } 454. } 455. } 456. 457. static void 458. drop_weapon(alone) 459. int alone; 460. { 461. struct obj *otmp; 462. if (otmp = uwep) { 463. /* !alone check below is currently superfluous but in the 464. * future it might not be so if there are monsters which cannot 465. * wear gloves but can wield weapons 466. */ 467. if (!alone || cantwield(uasmon)) { 468. if (alone) You("find you must drop your weapon!"); 469. uwepgone(); 470. dropx(otmp); 471. } 472. } 473. } 474. 475. void 476. rehumanize() 477. { 478. polyman(); 479. You("return to %sn form!", (pl_character[0] == 'E')? "elve" : "huma"); 480. 481. if (u.uhp < 1) done(DIED); 482. if (!uarmg) selftouch("No longer petrify-resistant, you"); 483. nomul(0); 484. 485. flags.botl = 1; 486. vision_full_recalc = 1; 487. (void) encumber_msg(); 488. } 489. 490. int 491. dobreathe() { 492. if (Strangled) { 493. You("can't breathe. Sorry."); 494. return(0); 495. } 496. if (!getdir(NULL)) return(0); 497. if (rn2(4)) 498. You("produce a loud and noxious belch."); 499. else { 500. register struct attack *mattk; 501. register int i; 502. 503. for(i = 0; i < NATTK; i++) { 504. mattk = &(uasmon->mattk[i]); 505. if(mattk->aatyp == AT_BREA) break; 506. } 507. buzz((int) (20 + mattk->adtyp-1), (int)mattk->damn, 508. u.ux, u.uy, u.dx, u.dy); 509. } 510. return(1); 511. } 512. 513. int 514. dospit() { 515. struct obj *otmp; 516. 517. if (!getdir(NULL)) return(0); 518. otmp = mksobj(u.umonnum==PM_COBRA ? BLINDING_VENOM : ACID_VENOM, TRUE, FALSE); 519. otmp->spe = 1; /* to indicate it's yours */ 520. (void) throwit(otmp); 521. return(1); 522. } 523. 524. int 525. doremove() { 526. if (!Punished) { 527. You("are not chained to anything!"); 528. return(0); 529. } 530. unpunish(); 531. return(1); 532. } 533. 534. int 535. dospinweb() 536. { 537. register struct trap *ttmp = t_at(u.ux,u.uy); 538. 539. if (Levitation || Is_airlevel(&u.uz) 540. || Underwater || Is_waterlevel(&u.uz)) { 541. You("must be on the ground to spin a web."); 542. return(0); 543. } 544. if (u.uswallow) { 545. You("release web fluid inside %s.", mon_nam(u.ustuck)); 546. if (is_animal(u.ustuck->data)) { 547. expels(u.ustuck, u.ustuck->data, TRUE); 548. return(0); 549. } 550. if (is_whirly(u.ustuck->data)) { 551. int i; 552. 553. for (i = 0; i < NATTK; i++) 554. if (u.ustuck->data->mattk[i].aatyp == AT_ENGL) 555. break; 556. if (i == NATTK) 557. impossible("Swallower has no engulfing attack?"); 558. else { 559. char sweep[30]; 560. 561. sweep[0] = '\0'; 562. switch(u.ustuck->data->mattk[i].adtyp) { 563. case AD_FIRE: 564. Strcpy(sweep, "ignites and "); 565. break; 566. case AD_ELEC: 567. Strcpy(sweep, "fries and "); 568. break; 569. case AD_COLD: 570. Strcpy(sweep, 571. "freezes, shatters and "); 572. break; 573. } 574. pline("The web %sis swept away!", sweep); 575. } 576. return(0); 577. } /* default: a nasty jelly-like creature */ 578. pline("The web dissolves into %s.", mon_nam(u.ustuck)); 579. return(0); 580. } 581. if (u.utrap) { 582. You("cannot spin webs while stuck in a trap."); 583. return(0); 584. } 585. exercise(A_DEX, TRUE); 586. if (ttmp) switch (ttmp->ttyp) { 587. case PIT: 588. case SPIKED_PIT: You("spin a web, covering up the pit."); 589. deltrap(ttmp); 590. delallobj(u.ux, u.uy); 591. if (Invisible) newsym(u.ux, u.uy); 592. return(1); 593. case SQKY_BOARD: pline("The squeaky board is muffled."); 594. deltrap(ttmp); 595. if (Invisible) newsym(u.ux, u.uy); 596. return(1); 597. case TELEP_TRAP: 598. case LEVEL_TELEP: 599. Your("webbing vanishes!"); 600. return(0); 601. case WEB: You("make the web thicker."); 602. return(1); 603. case TRAPDOOR: 604. You("web over the trap door."); 605. deltrap(ttmp); 606. if (Invisible) newsym(u.ux, u.uy); 607. return 1; 608. case ARROW_TRAP: 609. case DART_TRAP: 610. case BEAR_TRAP: 611. case LANDMINE: 612. case SLP_GAS_TRAP: 613. case RUST_TRAP: 614. case MAGIC_TRAP: 615. case ANTI_MAGIC: 616. case POLY_TRAP: 617. You("have triggered a trap!"); 618. dotrap(ttmp); 619. return(1); 620. default: 621. impossible("Webbing over trap type %d?", ttmp->ttyp); 622. return(0); 623. } 624. ttmp = maketrap(u.ux, u.uy, WEB); 625. ttmp->tseen = 1; 626. if (Invisible) newsym(u.ux, u.uy); 627. return(1); 628. } 629. 630. int 631. dosummon() 632. { 633. You("call upon your brethren for help!"); 634. exercise(A_WIS, TRUE); 635. if (!were_summon(uasmon,TRUE)) 636. pline("But none arrive."); 637. return(1); 638. } 639. 640. int 641. doconfuse() 642. { 643. register struct monst *mtmp; 644. int looked = 0; 645. char qbuf[QBUFSZ]; 646. 647. if (Blind) { 648. You("can't see anything to gaze at."); 649. return 0; 650. } 651. for (mtmp = fmon; mtmp; mtmp = mtmp->nmon) { 652. if (canseemon(mtmp)) { 653. looked = 1; 654. if (Invis && !perceives(mtmp->data)) 655. pline("%s seems not to notice your gaze.", Monnam(mtmp)); 656. else if (mtmp->minvis && !See_invisible) 657. You("can't see where to gaze at %s.", Monnam(mtmp)); 658. else if (mtmp->m_ap_type == M_AP_FURNITURE 659. || mtmp->m_ap_type == M_AP_OBJECT) 660. continue; 661. else if (flags.safe_dog && !Confusion && !Hallucination 662. && mtmp->mtame) { 663. if (mtmp->mnamelth) 664. You("avoid gazing at %s.", NAME(mtmp)); 665. else 666. You("avoid gazing at your %s.", 667. mtmp->data->mname); 668. } else { 669. if (flags.confirm && mtmp->mpeaceful && !Confusion 670. && !Hallucination) { 671. Sprintf(qbuf, "Really confuse %s?", mon_nam(mtmp)); 672. if (yn(qbuf) != 'y') continue; 673. setmangry(mtmp); 674. } 675. if (!mtmp->mcanmove || mtmp->mstun || mtmp->msleep || 676. !mtmp->mcansee || !haseyes(mtmp->data)) 677. continue; 678. if (!mtmp->mconf) 679. Your("gaze confuses %s!", mon_nam(mtmp)); 680. else 681. pline("%s is getting more and more confused.", 682. Monnam(mtmp)); 683. mtmp->mconf = 1; 684. if ((mtmp->data==&mons[PM_FLOATING_EYE]) && !mtmp->mcan) { 685. You("are frozen by %s gaze!", 686. s_suffix(mon_nam(mtmp))); 687. nomul((u.ulevel > 6 || rn2(4)) ? 688. -d((int)mtmp->m_lev+1, 689. (int)mtmp->data->mattk[0].damd) 690. : -200); 691. return 1; 692. } 693. if ((mtmp->data==&mons[PM_MEDUSA]) && !mtmp->mcan) { 694. pline("Gazing at the awake Medusa is not a very good idea."); 695. /* as if gazing at a sleeping anything is fruitful... */ 696. You("turn to stone..."); 697. done(STONING); 698. } 699. } 700. } 701. } 702. if (!looked) You("gaze at no place in particular."); 703. return 1; 704. } 705. 706. int 707. dohide() 708. { 709. if (u.uundetected || u.usym == S_MIMIC_DEF) { 710. You("are already hiding."); 711. return(0); 712. } 713. if (u.usym == S_MIMIC) { 714. u.usym = S_MIMIC_DEF; 715. } else { 716. u.uundetected = 1; 717. } 718. newsym(u.ux,u.uy); 719. return(1); 720. } 721. 722. int 723. domindblast() 724. { 725. struct monst *mtmp, *nmon; 726. 727. You("concentrate."); 728. if (rn2(3)) return 0; 729. pline("A wave of psychic energy pours out."); 730. for(mtmp=fmon; mtmp; mtmp = nmon) { 731. int u_sen; 732. 733. nmon = mtmp->nmon; 734. if (distu(mtmp->mx, mtmp->my) > BOLT_LIM * BOLT_LIM) 735. continue; 736. if(mtmp->mpeaceful) 737. continue; 738. u_sen = telepathic(mtmp->data) && !mtmp->mcansee; 739. if (u_sen || (telepathic(mtmp->data) && rn2(2)) || !rn2(10)) { 740. pline("You lock in on %s's %s.", mon_nam(mtmp), 741. u_sen ? "telepathy" : 742. telepathic(mtmp->data) ? "latent telepathy" : 743. "mind"); 744. mtmp->mhp -= rnd(15); 745. if (mtmp->mhp <= 0) 746. killed(mtmp); 747. } 748. } 749. return 1; 750. } 751. 752. static void 753. uunstick() 754. { 755. pline("%s is no longer in your clutches.", Monnam(u.ustuck)); 756. u.ustuck = 0; 757. } 758. 759. static void 760. skinback() 761. { 762. if (uskin) { 763. Your("skin returns to its original form."); 764. uarm = uskin; 765. uskin = (struct obj *)0; 766. } 767. } 768. #endif 769. 770. #endif /* OVLB */ 771. #ifdef OVL1 772. const char * 773. body_part(part) 774. int part; 775. { 776. /* Note: it is assumed these will never be >22 characters long, 777. * plus the trailing null, after pluralizing (since sometimes a 778. * buffer is made a fixed size and must be able to hold it) 779. */ 780. static const char NEARDATA *humanoid_parts[] = { "arm", "eye", "face", "finger", 781. "fingertip", "foot", "hand", "handed", "head", "leg", 782. "light headed", "neck", "spine", "toe" }; 783. #ifdef POLYSELF 784. static const char NEARDATA *jelly_parts[] = { "pseudopod", "dark spot", "front", 785. "pseudopod extension", "pseudopod extremity", 786. "pseudopod root", "grasp", "grasped", "cerebral area", 787. "lower pseudopod", "viscous", "middle", "surface", 788. "pseudopod extremity" }, 789. NEARDATA *animal_parts[] = { "forelimb", "eye", "face", "foreclaw", "claw tip", 790. "rear claw", "foreclaw", "clawed", "head", "rear limb", 791. "light headed", "neck", "spine", "rear claw tip" }, 792. NEARDATA *horse_parts[] = { "forelimb", "eye", "face", "forehoof", "hoof tip", 793. "rear hoof", "foreclaw", "hooved", "head", "rear limb", 794. "light headed", "neck", "backbone", "rear hoof tip" }, 795. NEARDATA *sphere_parts[] = { "appendage", "optic nerve", "body", "tentacle", 796. "tentacle tip", "lower appendage", "tentacle", "tentacled", 797. "body", "lower tentacle", "rotational", "equator", "body", 798. "lower tentacle tip" }, 799. NEARDATA *fungus_parts[] = { "mycelium", "visual area", "front", "hypha", 800. "hypha", "root", "strand", "stranded", "cap area", 801. "rhizome", "sporulated", "stalk", "root", "rhizome tip" }, 802. NEARDATA *vortex_parts[] = { "region", "eye", "front", "minor current", 803. "minor current", "lower current", "swirl", "swirled", 804. "central core", "lower current", "addled", "center", 805. "currents", "edge" }, 806. NEARDATA *snake_parts[] = { "vestigial limb", "eye", "face", "large scale", 807. "large scale tip", "rear region", "scale gap", "scale gapped", 808. "head", "rear region", "light headed", "neck", "length", 809. "rear scale" }; 810. 811. if (humanoid(uasmon) && (part==ARM || part==FINGER || part==FINGERTIP 812. || part==HAND || part==HANDED)) return humanoid_parts[part]; 813. if (u.usym==S_CENTAUR || u.usym==S_UNICORN) return horse_parts[part]; 814. if (slithy(uasmon)) return snake_parts[part]; 815. if (u.usym==S_EYE) return sphere_parts[part]; 816. if (u.usym==S_JELLY || u.usym==S_PUDDING || u.usym==S_BLOB) 817. return jelly_parts[part]; 818. if (u.usym==S_VORTEX || u.usym==S_ELEMENTAL) return vortex_parts[part]; 819. if (u.usym==S_FUNGUS) return fungus_parts[part]; 820. if (humanoid(uasmon)) return humanoid_parts[part]; 821. return animal_parts[part]; 822. #else 823. return humanoid_parts[part]; 824. #endif 825. } 826. 827. #endif /* OVL1 */ 828. #ifdef OVL0 829. 830. int 831. poly_gender() 832. { 833. /* Returns gender of polymorphed player; 0/1=same meaning as flags.female, 834. * 2=none. 835. * Used in: 836. * - Seduction by succubus/incubus 837. * - Talking to nymphs (sounds.c) 838. * Not used in: 839. * - Messages given by nymphs stealing armor (they can't steal from 840. * incubi/succubi/nymphs, and nonhumanoids can't wear armor). 841. * - Amulet of change (must refer to real gender no matter what 842. * polymorphed into). 843. * - Priest/Priestess, Caveman/Cavewoman (ditto) 844. * - Polymorph self (only happens when human) 845. * - Shopkeeper messages (since referred to as "creature" and not "sir" 846. * or "lady" when polymorphed) 847. */ 848. #ifdef POLYSELF 849. if (!humanoid(uasmon)) return 2; 850. #endif 851. return flags.female; 852. } 853. 854. #endif /* OVL0 */ 855. #ifdef OVLB 856. 857. #if defined(POLYSELF) 858. void 859. ugolemeffects(damtype, dam) 860. int damtype, dam; 861. { 862. int heal = 0; 863. /* We won't bother with "slow"/"haste" since players do not 864. * have a monster-specific slow/haste so there is no way to 865. * restore the old velocity once they are back to human. 866. */ 867. if (u.umonnum != PM_FLESH_GOLEM && u.umonnum != PM_IRON_GOLEM) 868. return; 869. switch (damtype) { 870. case AD_ELEC: if (u.umonnum == PM_IRON_GOLEM) 871. heal = dam / 6; /* Approx 1 per die */ 872. break; 873. case AD_FIRE: if (u.umonnum == PM_IRON_GOLEM) 874. heal = dam; 875. break; 876. } 877. if (heal && (u.mh < u.mhmax)) { 878. u.mh += heal; 879. if (u.mh > u.mhmax) u.mh = u.mhmax; 880. flags.botl = 1; 881. pline("Strangely, you feel better than before."); 882. exercise(A_STR, TRUE); 883. } 884. } 885. 886. static int 887. armor_to_dragon(atyp) 888. int atyp; 889. { 890. switch(atyp) { 891. case GRAY_DRAGON_SCALE_MAIL: 892. case GRAY_DRAGON_SCALES: 893. return PM_GRAY_DRAGON; 894. case RED_DRAGON_SCALE_MAIL: 895. case RED_DRAGON_SCALES: 896. return PM_RED_DRAGON; 897. case ORANGE_DRAGON_SCALE_MAIL: 898. case ORANGE_DRAGON_SCALES: 899. return PM_ORANGE_DRAGON; 900. case WHITE_DRAGON_SCALE_MAIL: 901. case WHITE_DRAGON_SCALES: 902. return PM_WHITE_DRAGON; 903. case BLACK_DRAGON_SCALE_MAIL: 904. case BLACK_DRAGON_SCALES: 905. return PM_BLACK_DRAGON; 906. case BLUE_DRAGON_SCALE_MAIL: 907. case BLUE_DRAGON_SCALES: 908. return PM_BLUE_DRAGON; 909. case GREEN_DRAGON_SCALE_MAIL: 910. case GREEN_DRAGON_SCALES: 911. return PM_GREEN_DRAGON; 912. case YELLOW_DRAGON_SCALE_MAIL: 913. case YELLOW_DRAGON_SCALES: 914. return PM_YELLOW_DRAGON; 915. default: 916. return -1; 917. } 918. } 919. #endif /* POLYSELF */ 920. 921. #endif /* OVLB */ 922. 923. /*polyself.c*/