abstract
| - Below is the full text to trap.c from the source code of NetHack 2.2a. To link to a particular line, write [[NetHack 2.2a/trap.c#line123]], for example. Warning! This is the source code from an old release. For the latest release, see Source code 1. /* SCCS Id: @(#)trap.c 2.1 87/10/18 2. /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ 3. 4. #include 5. #include "hack.h" 6. 7. extern struct monst *makemon(); 8. #ifdef KAA 9. extern char *Xmonnam(); 10. extern char *nomovemsg; 11. #endif 12. 13. char vowels[] = "aeiou"; 14. 15. char *traps[] = { 16. "", 17. " bear trap", 18. "n arrow trap", 19. " dart trap", 20. " trapdoor", 21. " teleportation trap", 22. " pit", 23. " sleeping gas trap", 24. " piercer", 25. " mimic" 26. #ifdef NEWTRAPS 27. ," magic trap" 28. ," squeaky board" 29. #endif 30. #ifdef SPIDERS 31. ," web" 32. #endif 33. #ifdef NEWCLASS 34. ," spiked pit" 35. ," level teleporter" 36. #endif 37. #ifdef SPELLS 38. ," anti-magic field" 39. #endif 40. #ifdef KAA 41. ," rust trap" 42. # ifdef RPH 43. ,"polymorph trap" 44. # endif 45. #endif 46. }; 47. 48. struct trap * 49. maketrap(x,y,typ) 50. register x,y,typ; 51. { 52. register struct trap *ttmp; 53. 54. ttmp = newtrap(); 55. ttmp->ttyp = typ; 56. ttmp->tseen = 0; 57. ttmp->once = 0; 58. ttmp->tx = x; 59. ttmp->ty = y; 60. ttmp->ntrap = ftrap; 61. ftrap = ttmp; 62. return(ttmp); 63. } 64. 65. dotrap(trap) register struct trap *trap; { 66. register int ttype = trap->ttyp; 67. register struct monst *mtmp; 68. 69. nomul(0); 70. if(trap->tseen && !rn2(5) && !(ttype == PIT 71. #ifdef NEWCLASS 72. || ttype == SPIKED_PIT 73. #endif 74. #ifdef SPELLS 75. || ttype == ANTI_MAGIC 76. #endif 77. )) 78. pline("You escape a%s.", traps[ttype]); 79. else { 80. trap->tseen = 1; 81. switch(ttype) { 82. case SLP_GAS_TRAP: 83. pline("A cloud of gas puts you to sleep!"); 84. nomul(-rnd(25)); 85. break; 86. case BEAR_TRAP: 87. if(Levitation) { 88. pline("You float over a bear trap."); 89. break; 90. } 91. u.utrap = 4 + rn2(4); 92. u.utraptype = TT_BEARTRAP; 93. pline("A bear trap closes on your foot!"); 94. if(u.usym=='o') pline("You howl in anger!"); 95. break; 96. case PIERC: 97. deltrap(trap); 98. if(mtmp=makemon(PM_PIERCER,u.ux,u.uy)) { 99. pline("%s suddenly drops from the ceiling!", Xmonnam(mtmp)); 100. if(uarmh) 101. pline("Its blow glances off your helmet."); 102. else 103. (void) thitu(3,d(4,6),"falling piercer"); 104. } 105. break; 106. case ARROW_TRAP: 107. pline("An arrow shoots out at you!"); 108. if(!thitu(8,rnd(6),"arrow")){ 109. mksobj_at(ARROW, u.ux, u.uy); 110. fobj->quan = 1; 111. } 112. break; 113. case TRAPDOOR: 114. if(!xdnstair) { 115. pline("A trap door in the ceiling opens and a rock falls on your head!"); 116. if(uarmh) pline("Fortunately, you are wearing a helmet!"); 117. losehp(uarmh ? 2 : d(2,10),"falling rock"); 118. mksobj_at(ROCK, u.ux, u.uy); 119. fobj->quan = 1; 120. stackobj(fobj); 121. if(Invisible) newsym(u.ux, u.uy); 122. } else { 123. register int newlevel = dlevel + 1; 124. while(!rn2(4) && newlevel < 29) 125. newlevel++; 126. pline("A trap door opens up under you!"); 127. if(Levitation || u.ustuck) { 128. pline("For some reason you don't fall in."); 129. break; 130. } 131. fflush(stdout); 132. goto_level(newlevel, FALSE); 133. } 134. break; 135. case DART_TRAP: 136. pline("A little dart shoots out at you!"); 137. if(thitu(7,rnd(3),"little dart")) { 138. if(!rn2(6)) 139. poisoned("dart","poison dart"); 140. } else { 141. mksobj_at(DART, u.ux, u.uy); 142. fobj->quan = 1; 143. } 144. break; 145. case TELEP_TRAP: 146. if(trap->once) { 147. deltrap(trap); 148. newsym(u.ux,u.uy); 149. vtele(); 150. } else { 151. newsym(u.ux,u.uy); 152. tele(); 153. } 154. break; 155. #ifdef KAA 156. case RUST_TRAP: 157. switch (rn2(5)) { 158. case 0: 159. pline("A gush of water hits you on the head!"); 160. if (uarmh) { 161. if (uarmh->rustfree) 162. pline("Your helmet is not affected!"); 163. else if (uarmh->spe > -6) { 164. pline("Your helmet rusts!"); 165. uarmh->spe--; 166. } else 167. pline("Your helmet looks quite rusted now."); 168. } 169. break; 170. case 1: 171. pline("A gush of water hits your left arm!"); 172. if (uarms) { 173. pline("Your shield is not affected!"); 174. break; 175. } 176. if (uwep && uwep->otyp == TWO_HANDED_SWORD) goto two_hand; 177. /* Two goto statements in a row--aaarrrgggh! */ 178. glovecheck: if(uarmg) pline("Your gloves are not affected!"); 179. break; 180. case 2: 181. pline("A gush of water hits your right arm!"); 182. two_hand: corrode_weapon(); 183. goto glovecheck; 184. default: 185. pline("A gush of water hits you!"); 186. if (uarm) { 187. if (uarm->rustfree || 188. uarm->otyp >= STUDDED_LEATHER_ARMOR) 189. pline("Your %s not affected!", 190. aobjnam(uarm,"are")); 191. else if(uarm->spe > -6) { 192. pline("Your %s!", 193. aobjnam(uarm,"corrode")); 194. uarm->spe--; 195. } else 196. pline("Your %s quite rusted now.", 197. aobjnam(uarm, "look")); 198. } 199. } 200. break; 201. #endif 202. case PIT: 203. if (Levitation || index("EyBfk'&",u.usym)) { 204. pline("A pit opens up under you!"); 205. pline("You don't fall in!"); 206. break; 207. } 208. pline("You fall into a pit!"); 209. u.utrap = rn1(6,2); 210. u.utraptype = TT_PIT; 211. losehp(rnd(6),"fall into a pit"); 212. selftouch("Falling, you"); 213. break; 214. #ifdef NEWCLASS 215. case SPIKED_PIT: 216. if (Levitation || index("EyBfk'&",u.usym)) { 217. pline("A pit opens up under you!"); 218. pline("You don't fall in!"); 219. pline("There are spikes in that pit!!!"); 220. break; 221. } 222. pline("You fall into a pit!"); 223. pline("You land on a set of sharp iron spikes!"); 224. u.utrap = rn1(6,2); 225. u.utraptype = TT_PIT; 226. losehp(rnd(10),"fall onto iron spikes"); 227. if(!rn2(6)) poisoned("spikes","poison spikes"); 228. selftouch("Falling, you"); 229. break; 230. case LEVEL_TELEP: 231. if (!Blind) pline("You are momentarily blinded by a flash of light"); 232. else pline("You are momentarily disoriented."); 233. deltrap(trap); 234. newsym(u.ux,u.uy); 235. level_tele(); 236. break; 237. #endif 238. #ifdef SPELLS 239. case ANTI_MAGIC: 240. pline("You feel your magical energy drain away!"); 241. u.uen -= (rnd(u.ulevel) + 1); 242. if(u.uen < 0) { 243. u.uenmax += u.uen; 244. if(u.uenmax < 0) u.uenmax = 0; 245. u.uen = 0; 246. } 247. flags.botl = 1; 248. break; 249. #endif 250. #if defined(RPH) && defined(KAA) 251. case POLY_TRAP: 252. pline("You feel a change coming over you."); 253. polyself(); 254. deltrap(trap); 255. break; 256. #endif 257. #ifdef NEWTRAPS 258. case MGTRP: 259. /* A magic trap. */ 260. domagictrap(); 261. break; 262. case SQBRD: { 263. #include "edog.h" 264. register struct monst *mtmp = fmon; 265. /* Stepped on a squeaky board. */ 266. pline("A board underfoot gives off a loud squeak!"); 267. /* Wake up nearby monsters. */ 268. while(mtmp) { 269. if(dist(mtmp->mx,mtmp->my) < u.ulevel*20) { 270. if(mtmp->msleep) 271. mtmp->msleep = 0; 272. if(mtmp->mtame) 273. EDOG(mtmp)->whistletime = moves; 274. } 275. mtmp = mtmp->nmon; 276. } 277. } 278. break; 279. #endif 280. #ifdef SPIDERS 281. case WEB: 282. 283. /* Our luckless adventurer has stepped into a web. */ 284. 285. pline("You've stumbled into a spider web!"); 286. u.utraptype = TT_WEB; 287. 288. /* Time stuck in the web depends on your strength. */ 289. 290. if (u.ustr == 3) u.utrap = rn1(6,6); 291. else if (u.ustr < 6) u.utrap = rn1(6,4); 292. else if (u.ustr < 9) u.utrap = rn1(4,4); 293. else if (u.ustr < 12) u.utrap = rn1(4,2); 294. else if (u.ustr < 15) u.utrap = rn1(2,2); 295. else if (u.ustr < 18) u.utrap = rnd(2); 296. else if (u.ustr < 69) u.utrap = 1; 297. else { 298. u.utrap = 0; 299. pline("You tear through the web!"); 300. deltrap(trap); 301. } 302. break; 303. #endif 304. default: 305. impossible("You hit a trap of type %u", trap->ttyp); 306. } 307. } 308. } 309. 310. mintrap(mtmp) register struct monst *mtmp; { 311. register struct trap *trap = t_at(mtmp->mx, mtmp->my); 312. register int wasintrap = mtmp->mtrapped; 313. 314. if(!trap) { 315. mtmp->mtrapped = 0; /* perhaps teleported? */ 316. } else if(wasintrap) { 317. if(!rn2(40)) mtmp->mtrapped = 0; 318. } else { 319. register int tt = trap->ttyp; 320. #ifdef DGK 321. /* A bug fix for dumb messages by ab@unido. 322. */ 323. int in_sight = cansee(mtmp->mx,mtmp->my) 324. && (!mtmp->minvis || See_invisible); 325. #else 326. int in_sight = cansee(mtmp->mx,mtmp->my); 327. #endif 328. extern char mlarge[]; 329. 330. if(mtmp->mtrapseen & (1 << tt)) { 331. /* he has been in such a trap - perhaps he escapes */ 332. if(rn2(4)) return(0); 333. } 334. mtmp->mtrapseen |= (1 << tt); 335. switch (tt) { 336. case BEAR_TRAP: 337. if(index(mlarge, mtmp->data->mlet)) { 338. if(in_sight) 339. pline("%s is caught in a bear trap!", 340. Monnam(mtmp)); 341. else 342. if(mtmp->data->mlet == 'o') 343. pline("You hear the roaring of an angry bear!"); 344. mtmp->mtrapped = 1; 345. } 346. break; 347. #ifdef KAA 348. # ifdef RPH 349. case POLY_TRAP: 350. if(!resist(mtmp, '/', 0, NOTELL)) 351. newcham(mtmp,&mons[rn2(CMNUM)]); 352. break; 353. # endif 354. case RUST_TRAP: 355. if(in_sight) 356. pline("A gush of water hits %s!",monnam(mtmp)); 357. break; 358. #endif 359. case PIT: 360. #ifdef NEWCLASS 361. case SPIKED_PIT: 362. #endif 363. /* there should be a mtmp/data -> floating */ 364. if(!index("EywBIfk'& ", mtmp->data->mlet)) { /* ab */ 365. mtmp->mtrapped = 1; 366. if(in_sight) 367. pline("%s falls into a pit!", Monnam(mtmp)); 368. } 369. break; 370. case SLP_GAS_TRAP: 371. if(!mtmp->msleep && !mtmp->mfroz) { 372. mtmp->msleep = 1; 373. if(in_sight) 374. pline("%s suddenly falls asleep!", 375. Monnam(mtmp)); 376. } 377. break; 378. case TELEP_TRAP: 379. #ifdef NEWCLASS 380. case LEVEL_TELEP: 381. #endif 382. rloc(mtmp); 383. if(in_sight && !cansee(mtmp->mx,mtmp->my)) 384. pline("%s suddenly disappears!", 385. Monnam(mtmp)); 386. break; 387. case ARROW_TRAP: 388. if(in_sight) 389. pline("%s is hit by an arrow!", Monnam(mtmp)); 390. mtmp->mhp -= 3; 391. break; 392. case DART_TRAP: 393. if(in_sight) 394. pline("%s is hit by a dart!", Monnam(mtmp)); 395. mtmp->mhp -= 2; 396. /* not mondied here !! */ 397. break; 398. case TRAPDOOR: 399. if(!xdnstair) { 400. mtmp->mhp -= 10; 401. if(in_sight) 402. pline("A trap door in the ceiling opens and a rock hits %s!", monnam(mtmp)); 403. break; 404. } 405. if(!index("EywBIfk", mtmp->data->mlet)){ 406. fall_down(mtmp); 407. if(in_sight) 408. pline("Suddenly, %s disappears out of sight.", monnam(mtmp)); 409. return(2); /* no longer on this level */ 410. } 411. break; 412. case PIERC: 413. break; 414. #ifdef NEWTRAPS 415. case MGTRP: 416. /* A magic trap. Monsters immune. */ 417. break; 418. case SQBRD: { 419. register struct monst *ztmp = fmon; 420. 421. if(index("EyBIfk", mtmp->data->mlet)) break; 422. /* Stepped on a squeaky board. */ 423. if (in_sight) 424. pline("%s steps on a squeaky board.", Monnam(mtmp)); 425. else 426. pline("You hear a distant squeak."); 427. /* Wake up nearby monsters. */ 428. while(ztmp) { 429. if(dist2(mtmp->mx,mtmp->my,ztmp->mx,ztmp->my) < 40) 430. if(ztmp->msleep) ztmp->msleep = 0; 431. ztmp = ztmp->nmon; 432. } 433. break; 434. } 435. #endif 436. #ifdef SPIDERS 437. case WEB: 438. /* Monster in a web. */ 439. /* in_sight check and confused bear by Eric Backus */ 440. if(mtmp->data->mlet != 's') { 441. if(in_sight) 442. pline("%s is caught in a web!", Monnam(mtmp)); 443. else 444. if(mtmp->data->mlet == 'o') 445. pline("You hear the roaring of a confused bear!"); 446. mtmp->mtrapped = 1; 447. } 448. break; 449. #endif 450. #ifdef SPELLS 451. case ANTI_MAGIC: break; 452. #endif 453. default: 454. impossible("Some monster encountered a strange trap of type %d.",tt); 455. } 456. } 457. return(mtmp->mtrapped); 458. } 459. 460. selftouch(arg) char *arg; { 461. if(uwep && uwep->otyp == DEAD_COCKATRICE){ 462. pline("%s touch the dead cockatrice.", arg); 463. pline("You turn to stone."); 464. pline("You die..."); 465. killer = objects[uwep->otyp].oc_name; 466. done("died"); 467. } 468. } 469. 470. float_up(){ 471. if(u.utrap) { 472. if(u.utraptype == TT_PIT) { 473. u.utrap = 0; 474. pline("You float up, out of the pit!"); 475. } else { 476. pline("You float up, only your leg is still stuck."); 477. } 478. } else 479. if (Hallucination) 480. pline("Oh wow! You're floating in the air!"); 481. else 482. pline("You start to float in the air!"); 483. } 484. 485. float_down(){ 486. register struct trap *trap; 487. 488. /* check for falling into pool - added by GAN 10/20/86 */ 489. if(IS_POOL(levl[u.ux][u.uy].typ) && !Levitation) 490. drown(); 491. 492. pline("You float gently to the ground."); 493. if(trap = t_at(u.ux,u.uy)) 494. switch(trap->ttyp) { 495. case PIERC: 496. break; 497. case TRAPDOOR: 498. if(!xdnstair || u.ustuck) break; 499. /* fall into next case */ 500. default: 501. dotrap(trap); 502. } 503. pickup(1); 504. } 505. 506. #include "mkroom.h" 507. 508. vtele() { 509. register struct mkroom *croom; 510. 511. for(croom = &rooms[0]; croom->hx >= 0; croom++) 512. if(croom->rtype == VAULT) { 513. register x,y; 514. 515. x = rn2(2) ? croom->lx : croom->hx; 516. y = rn2(2) ? croom->ly : croom->hy; 517. if(teleok(x,y)) { 518. teleds(x,y); 519. return; 520. } 521. } 522. tele(); 523. } 524. 525. #ifdef BVH 526. int has_amulet() { 527. register struct obj *otmp; 528. 529. for(otmp = invent; otmp; otmp = otmp->nobj) 530. if(otmp->olet == AMULET_SYM && otmp->spe >= 0) 531. return(1); 532. return(0); 533. } 534. #endif 535. 536. tele() { 537. coord cc; 538. register int nux,nuy; 539. 540. #ifdef BVH 541. if(has_amulet() && rn2(3)) { 542. pline("You feel disoriented for a moment."); 543. return; 544. } 545. #endif 546. if(Teleport_control) { 547. #ifdef KAA 548. if (multi < 0 && (!nomovemsg || 549. !strncmp(nomovemsg,"You awake", 9) || 550. !strncmp(nomovemsg,"You regain con", 15) || 551. !strncmp(nomovemsg,"You are consci", 15))) 552. 553. pline("Being unconscious, you cannot control your teleport."); 554. else { 555. #endif 556. 557. pline("To what position do you want to be teleported?"); 558. getpos(&cc, 1, "the desired position"); /* 1: force valid */ 559. /* possible extensions: introduce a small error if 560. magic power is low; allow transfer to solid rock */ 561. if(teleok(cc.x, cc.y)){ 562. teleds(cc.x, cc.y); 563. return; 564. } 565. pline("Sorry ..."); 566. #ifdef KAA 567. } 568. #endif 569. } 570. do { 571. nux = rnd(COLNO-1); 572. nuy = rn2(ROWNO); 573. } while(!teleok(nux, nuy)); 574. teleds(nux, nuy); 575. } 576. 577. teleds(nux, nuy) 578. register int nux,nuy; 579. { 580. if(Punished) unplacebc(); 581. unsee(); 582. u.utrap = 0; 583. u.ustuck = 0; 584. u.ux = nux; 585. u.uy = nuy; 586. setsee(); 587. if(Punished) placebc(1); 588. if(u.uswallow){ 589. u.uswldtim = u.uswallow = 0; 590. docrt(); 591. } 592. nomul(0); 593. if(IS_POOL(levl[nux][nuy].typ) && !Levitation) 594. drown(); 595. (void) inshop(); 596. pickup(1); 597. read_engr_at(u.ux,u.uy); 598. } 599. 600. teleok(x,y) register int x,y; { /* might throw him into a POOL 601. * removed by GAN 10/20/86 602. */ 603. #ifdef STUPID 604. boolean tmp1, tmp2, tmp3; 605. tmp1 = isok(x,y) && !IS_ROCK(levl[x][y].typ) && !m_at(x,y); 606. tmp2 = !sobj_at(ENORMOUS_ROCK,x,y) && !t_at(x,y); 607. tmp3 = !(IS_POOL(levl[x][y].typ) && !Levitation); 608. return(tmp1 && tmp2 && tmp3); 609. #else 610. return( isok(x,y) && !IS_ROCK(levl[x][y].typ) && !m_at(x,y) && 611. !sobj_at(ENORMOUS_ROCK,x,y) && !t_at(x,y) && 612. !(IS_POOL(levl[x][y].typ) && !Levitation) 613. ); 614. #endif 615. /* Note: gold is permitted (because of vaults) */ 616. } 617. 618. dotele() { 619. extern char pl_character[]; 620. 621. if((!index("LNt",u.usym)) && 622. #ifdef WIZARD 623. !wizard && 624. #endif 625. (!Teleportation || u.ulevel < 6 || 626. (pl_character[0] != 'W' && u.ulevel < 10))) { 627. pline("You are not able to teleport at will."); 628. return(0); 629. } 630. if(u.uhunger <= 100 || u.ustr < 6) { 631. pline("You miss the strength for a teleport spell."); 632. #ifdef WIZARD 633. if(!wizard) 634. #endif 635. return(1); 636. } 637. tele(); 638. morehungry(100); 639. return(1); 640. } 641. 642. placebc(attach) int attach; { 643. if(!uchain || !uball){ 644. impossible("Where are your chain and ball??"); 645. return; 646. } 647. uball->ox = uchain->ox = u.ux; 648. uball->oy = uchain->oy = u.uy; 649. if(attach){ 650. uchain->nobj = fobj; 651. fobj = uchain; 652. if(!carried(uball)){ 653. uball->nobj = fobj; 654. fobj = uball; 655. } 656. } 657. } 658. 659. unplacebc(){ 660. if(!carried(uball)){ 661. freeobj(uball); 662. unpobj(uball); 663. } 664. freeobj(uchain); 665. unpobj(uchain); 666. } 667. 668. level_tele() { 669. register int newlevel; 670. 671. #ifdef BVH 672. if(has_amulet() && rn2(5)) { 673. pline("You feel very disoriented for a moment."); 674. return; 675. } 676. #endif 677. if(Teleport_control) { 678. char buf[BUFSZ]; 679. 680. do { 681. pline("To what level do you want to teleport? [type a number] "); 682. getlin(buf); 683. } while(!digit(buf[0]) && (buf[0] != '-' || !digit(buf[1]))); 684. newlevel = atoi(buf); 685. } else { 686. #ifdef DGKMOD 687. newlevel = rn2(5) | !Fire_resistance ? rnz(dlevel + 3) : 30; 688. #else 689. newlevel = rnz(dlevel + 3); /* 5 - 24 */ 690. #endif 691. if(dlevel == newlevel) 692. if(!xdnstair) newlevel--; else newlevel++; 693. } 694. if(newlevel >= 30) { 695. if(newlevel > MAXLEVEL) newlevel = MAXLEVEL; 696. pline("You arrive at the center of the earth ..."); 697. pline("Unfortunately it is here that hell is located."); 698. #ifdef DGK 699. fflush(stdout); 700. #endif 701. if(Fire_resistance) { 702. pline("But the fire doesn't seem to harm you."); 703. } else { 704. pline("You burn to a crisp."); 705. pline("You die..."); 706. dlevel = maxdlevel = newlevel; 707. killer = "visit to hell"; 708. done("burned"); 709. } 710. } 711. if(newlevel < 0) { 712. if(newlevel <= -10) { 713. pline("You arrive in heaven."); 714. pline("\"You are here a bit early, but we'll let you in.\""); 715. killer = "visit to heaven"; 716. done("died"); 717. } else if (newlevel == -9) { 718. pline("You feel deliriously happy. "); 719. pline("(In fact, you're on Cloud 9!) "); 720. more(); 721. } else newlevel = 0; 722. pline("You are now high above the clouds ..."); 723. if(Levitation) { 724. pline("You float gently down to earth."); 725. done("escaped"); 726. } 727. pline("Unfortunately, you don't know how to fly."); 728. pline("You plummet a few thousand feet to your death."); 729. dlevel = 0; 730. killer = "long fall"; 731. done("died"); 732. } 733. 734. goto_level(newlevel, FALSE); /* calls done("escaped") if newlevel==0 */ 735. } 736. 737. #ifdef NEWTRAPS 738. 739. domagictrap() 740. { 741. register int fate = rnd(20); 742. 743. /* What happened to the poor sucker? */ 744. 745. if (fate < 10) { 746. 747. /* Most of the time, it creates some monsters. */ 748. register int cnt = rnd(4); 749. 750. /* below checks for blindness added by GAN 10/30/86 */ 751. if (!Blind) { 752. pline("You are momentarily blinded by a flash of light!"); 753. Blinded += rn1(5,10); 754. seeoff(0); 755. } else 756. pline("You hear a deafening roar!"); 757. while(cnt--) 758. (void) makemon((struct permonst *) 0, u.ux, u.uy); 759. } 760. else 761. switch (fate) { 762. 763. case 10: 764. case 11: 765. /* sometimes nothing happens */ 766. break; 767. case 12: 768. /* a flash of fire */ 769. { 770. register int num; 771. 772. /* changed to be in conformance with 773. * SCR_FIRE by GAN 11/02/86 774. */ 775. 776. pline("A tower of flame bursts from the floor!"); 777. if(Fire_resistance) 778. pline("You are uninjured."); 779. else { 780. num = rnd(6); 781. u.uhpmax -= num; 782. losehp(num,"a burst of flame"); 783. break; 784. } 785. } 786. 787. /* odd feelings */ 788. case 13: pline("A shiver runs up and down your spine!"); 789. break; 790. case 14: pline("You hear distant howling."); 791. break; 792. case 15: pline("You suddenly yearn for your distant homeland."); 793. break; 794. case 16: pline("Your pack shakes violently!"); 795. break; 796. 797. /* very occasionally something nice happens. */ 798. 799. case 19: 800. /* tame nearby monsters */ 801. { register int i,j; 802. register boolean confused = (Confusion != 0); 803. register int bd = confused ? 5 : 1; 804. register struct monst *mtmp; 805. 806. /* below pline added by GAN 10/30/86 */ 807. pline("You feel charismatic."); 808. for(i = -bd; i <= bd; i++) for(j = -bd; j <= bd; j++) 809. if(mtmp = m_at(u.ux+i, u.uy+j)) 810. (void) tamedog(mtmp, (struct obj *) 0); 811. break; 812. } 813. 814. case 20: 815. /* uncurse stuff */ 816. { register struct obj *obj; 817. register boolean confused = (Confusion != 0); 818. 819. /* below plines added by GAN 10/30/86 */ 820. if (confused) 821. if (Hallucination) 822. pline("You feel the power of the Force against you!"); 823. else 824. pline("You feel like you need some help."); 825. else 826. if (Hallucination) 827. pline("You feel in touch with the Universal Oneness."); 828. else 829. pline("You feel like someone is helping you."); 830. for(obj = invent; obj ; obj = obj->nobj) 831. if(obj->owornmask) 832. obj->cursed = confused; 833. if(Punished && !confused) { 834. Punished = 0; 835. freeobj(uchain); 836. unpobj(uchain); 837. free((char *) uchain); 838. uball->spe = 0; 839. uball->owornmask &= ~W_BALL; 840. uchain = uball = (struct obj *) 0; 841. } 842. break; 843. } 844. default: break; 845. } 846. } 847. #endif /* NEWTRAPS /**/ 848. 849. drown() 850. { 851. pline("You fall into a pool!"); 852. pline("You can't swim!"); 853. if( 854. #ifdef WIZARD 855. wizard || 856. #endif 857. rn2(3) < u.uluck+2) { 858. /* most scrolls become unreadable */ 859. register struct obj *obj; 860. 861. for(obj = invent; obj; obj = obj->nobj) 862. if(obj->olet == SCROLL_SYM && rn2(12) > u.uluck) 863. obj->otyp = SCR_BLANK_PAPER; 864. /* we should perhaps merge these scrolls ? */ 865. 866. pline("You attempt a teleport spell."); /* utcsri!carroll */ 867. (void) dotele(); 868. if(!IS_POOL(levl[u.ux][u.uy].typ)) return; 869. } 870. pline("You drown."); 871. pline("You die..."); 872. killer = "pool of water"; 873. done("drowned"); 874. }
|