abstract
| - 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 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*/
|