About: Source:NetHack 3.1.0/trap.c   Sponge Permalink

An Entity of Type : owl:Thing, within Data Space : 134.155.108.49:8890 associated with source dataset(s)

Below is the full text to trap.c from the source code of NetHack 3.1.0. To link to a particular line, write [[NetHack 3.1.0/trap.c#line123]], for example. Warning! This is the source code from an old release. For the latest release, see Source code

AttributesValues
rdfs:label
  • Source:NetHack 3.1.0/trap.c
rdfs:comment
  • Below is the full text to trap.c from the source code of NetHack 3.1.0. To link to a particular line, write [[NetHack 3.1.0/trap.c#line123]], for example. Warning! This is the source code from an old release. For the latest release, see Source code
dcterms:subject
dbkwik:nethack/pro...iPageUsesTemplate
abstract
  • Below is the full text to trap.c from the source code of NetHack 3.1.0. To link to a particular line, write [[NetHack 3.1.0/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 3.1 92/12/10 */ 2. /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ 3. /* NetHack may be freely redistributed. See license for details. */ 4. 5. #include "hack.h" 6. 7. #ifdef OVLB 8. const char *traps[TRAPNUM] = { 9. "", 10. "n arrow trap", 11. " dart trap", 12. " falling rock trap", 13. " squeaky board", 14. " bear trap", 15. " land mine", 16. " sleeping gas trap", 17. " rust trap", 18. " fire trap", 19. " pit", 20. " spiked pit", 21. " trapdoor", 22. " teleportation trap", 23. " level teleporter", 24. " magic portal", 25. " web", 26. " statue trap", 27. " magic trap", 28. "n anti-magic field" 29. #ifdef POLYSELF 30. ," polymorph trap" 31. #endif 32. }; 33. 34. #endif /* OVLB */ 35. 36. static void FDECL(domagicportal,(struct trap *)); 37. static void NDECL(dofiretrap); 38. static void NDECL(domagictrap); 39. static boolean FDECL(emergency_disrobe,(boolean *)); 40. STATIC_DCL boolean FDECL(thitm, (int, struct monst *, struct obj *, int)); 41. 42. #ifdef OVLB 43. 44. static int FDECL(teleok, (int,int,BOOLEAN_P)); 45. static void NDECL(vtele); 46. static void FDECL(no_fall_through, (BOOLEAN_P)); 47. 48. /* Generic rust-armor function. Returns TRUE if a message was printed; 49. * "print", if set, means to print a message (and thus to return TRUE) even 50. * if the item could not be rusted; otherwise a message is printed and TRUE is 51. * returned only for rustable items. 52. */ 53. boolean 54. rust_dmg(otmp, ostr, type, print) 55. register struct obj *otmp; 56. register const char *ostr; 57. int type; 58. boolean print; 59. { 60. static const char NEARDATA *action[] = { "smoulder", "rust", "rot", "corrode" }; 61. static const char NEARDATA *msg[] = { "burnt", "rusted", "rotten", "corroded" }; 62. boolean vulnerable = FALSE; 63. boolean plural; 64. boolean grprot = FALSE; 65. 66. if (!otmp) return(FALSE); 67. switch(type) { 68. case 0: 69. case 2: vulnerable = is_flammable(otmp); break; 70. case 1: vulnerable = is_rustprone(otmp); grprot = TRUE; break; 71. case 3: vulnerable = is_corrodeable(otmp); grprot = TRUE; break; 72. } 73. 74. if (!print && (!vulnerable || otmp->oerodeproof || otmp->oeroded == MAX_ERODE)) 75. return FALSE; 76. 77. plural = is_gloves(otmp) || is_boots(otmp); 78. 79. if (!vulnerable) 80. if (flags.verbose) 81. Your("%s %s not affected.", ostr, plural ? "are" : "is"); 82. else if (otmp->oeroded < MAX_ERODE) { 83. if (grprot && otmp->greased) 84. grease_protect(otmp,ostr,plural); 85. else if (otmp->oerodeproof || (otmp->blessed && !rnl(4))) { 86. if (flags.verbose) 87. pline("Somehow, your %s %s not affected.", 88. ostr, plural ? "are" : "is"); 89. } else { 90. Your("%s %s%s%s!", ostr, action[type], 91. plural ? "" : "s", 92. otmp->oeroded+1 == MAX_ERODE ? " completely" : 93. otmp->oeroded ? " further" : ""); 94. otmp->oeroded++; 95. } 96. } else 97. if (flags.verbose) 98. Your("%s %s%s completely %s.", ostr, 99. Blind ? "feel" : "look", 100. plural ? "" : "s", msg[type]); 101. return(TRUE); 102. } 103. 104. void 105. grease_protect(otmp,ostr,plu) 106. register struct obj *otmp; 107. register const char *ostr; 108. register boolean plu; 109. { 110. static const char txt[] = "protected by the layer of grease!"; 111. 112. if (ostr) 113. Your("%s %s %s",ostr,plu ? "are" : "is",txt); 114. else 115. Your("%s %s",aobjnam(otmp,"are"),txt); 116. if (!rn2(2)) { 117. pline("The grease dissolves."); 118. otmp->greased = 0; 119. } 120. } 121. 122. struct trap * 123. maketrap(x,y,typ) 124. register int x, y, typ; 125. { 126. register struct trap *ttmp; 127. register boolean oldplace; 128. 129. if (ttmp = t_at(x,y)) { 130. oldplace = TRUE; 131. if (u.utrap && (x == u.ux) && (y == u.uy) && 132. ((u.utraptype == TT_BEARTRAP && typ != BEAR_TRAP) || 133. (u.utraptype == TT_WEB && typ != WEB) || 134. (u.utraptype == TT_PIT && typ != PIT && typ != SPIKED_PIT))) 135. u.utrap = 0; 136. } else { 137. oldplace = FALSE; 138. ttmp = newtrap(); 139. ttmp->tx = x; 140. ttmp->ty = y; 141. } 142. ttmp->ttyp = typ; 143. switch(typ) { 144. case STATUE_TRAP: /* create a "living" statue */ 145. (void) mkcorpstat(STATUE, &mons[rndmonnum()], x, y, FALSE); 146. break; 147. case PIT: 148. case SPIKED_PIT: 149. case TRAPDOOR: 150. levl[x][y].doormask = 0; /* subsumes altarmask, icedpool... */ 151. if (IS_ROOM(levl[x][y].typ)) 152. levl[x][y].typ = ROOM; 153. break; 154. } 155. ttmp->tseen = 0; 156. ttmp->once = 0; 157. ttmp->dst.dnum = -1; 158. ttmp->dst.dlevel = -1; 159. if (!oldplace) { 160. ttmp->ntrap = ftrap; 161. ftrap = ttmp; 162. } 163. return(ttmp); 164. } 165. 166. static int 167. teleok(x, y, trapok) 168. register int x, y; 169. boolean trapok; 170. { /* might throw him into a POOL 171. * removed by GAN 10/20/86 172. */ 173. #ifdef STUPID 174. boolean tmp1, tmp2, tmp3, tmp4; 175. # ifdef POLYSELF 176. tmp1 = isok(x,y) && (!IS_ROCK(levl[x][y].typ) || 177. passes_walls(uasmon)) && !MON_AT(x, y); 178. # else 179. tmp1 = isok(x,y) && !IS_ROCK(levl[x][y].typ) && !MON_AT(x, y); 180. # endif 181. tmp2 = !sobj_at(BOULDER,x,y) && (trapok || !t_at(x,y)); 182. tmp3 = !(is_pool(x,y) && 183. !(Levitation || Wwalking || Magical_breathing 184. # ifdef POLYSELF 185. || is_flyer(uasmon) || is_swimmer(uasmon) 186. || is_clinger(uasmon) 187. # endif 188. )) && !closed_door(x,y); 189. tmp4 = !is_lava(x,y); 190. return(tmp1 && tmp2 && tmp3 && tmp4); 191. #else 192. return( isok(x,y) && 193. # ifdef POLYSELF 194. (!IS_ROCK(levl[x][y].typ) || passes_walls(uasmon)) && 195. # else 196. !IS_ROCK(levl[x][y].typ) && 197. # endif 198. !MON_AT(x, y) && 199. !sobj_at(BOULDER,x,y) && (trapok || !t_at(x,y)) && 200. !(is_pool(x,y) && 201. !(Levitation || Wwalking || Magical_breathing 202. # ifdef POLYSELF 203. || is_flyer(uasmon) || is_swimmer(uasmon) 204. || is_clinger(uasmon) 205. # endif 206. )) && !is_lava(x,y) && !closed_door(x,y)); 207. #endif 208. /* Note: gold is permitted (because of vaults) */ 209. } 210. 211. boolean 212. safe_teleds() 213. { 214. register int nux, nuy; 215. short tcnt = 0; 216. 217. do { 218. nux = rnd(COLNO-1); 219. nuy = rn2(ROWNO); 220. } while (!teleok(nux, nuy, tcnt>200) && tcnt++ < 400); 221. 222. if (tcnt < 400) { 223. teleds(nux, nuy); 224. return TRUE; 225. } else 226. return FALSE; 227. } 228. 229. static void 230. vtele() 231. { 232. register struct mkroom *croom = search_special(VAULT); 233. coord c; 234. 235. if(croom && somexy(croom, &c) && teleok(c.x,c.y,FALSE)) { 236. teleds(c.x,c.y); 237. return; 238. } 239. tele(); 240. } 241. 242. static void 243. no_fall_through(td) 244. boolean td; 245. { 246. /* floor objects get a chance of falling down. the case 247. * where the hero does NOT fall down is treated here. the 248. * case where the hero does fall down is treated in goto_level(). 249. * reason: the target level of the fall is not determined here, 250. * and it need not be the next level. if we want falling 251. * objects to arrive near the player, we must call impact_drop() 252. * _after_ the target level is determined. 253. */ 254. impact_drop((struct obj *)0, u.ux, u.uy, 0); 255. if (!td) { 256. display_nhwindow(WIN_MESSAGE, FALSE); 257. pline("The opening under you closes up."); 258. } 259. } 260. 261. void 262. fall_through(td) 263. boolean td; /* td == TRUE : trapdoor */ 264. { 265. register int newlevel = dunlev(&u.uz); 266. 267. if(Blind && Levitation) return; 268. 269. do { 270. newlevel++; 271. } while(!rn2(4) && newlevel < dunlevs_in_dungeon(&u.uz)); 272. 273. if(td) pline("A trap door opens up under you!"); 274. else pline("The floor opens up under you!"); 275. 276. if(Levitation || u.ustuck || !Can_fall_thru(&u.uz) 277. #ifdef POLYSELF 278. || is_flyer(uasmon) || is_clinger(uasmon) 279. #endif 280. || (Inhell && !u.uevent.invoked && 281. newlevel == dunlevs_in_dungeon(&u.uz)) 282. ) { 283. You("don't fall in."); 284. no_fall_through(td); 285. return; 286. } 287. #ifdef WALKIES 288. if(!next_to_u()) { 289. You("are jerked back by your pet!"); 290. no_fall_through(td); 291. return; 292. } 293. #endif 294. if(*u.ushops) shopdig(1); 295. if(Is_stronghold(&u.uz)) goto_hell(TRUE, TRUE); 296. else { 297. d_level dtmp; 298. dtmp.dnum = u.uz.dnum; 299. dtmp.dlevel = newlevel; 300. goto_level(&dtmp, FALSE, TRUE, FALSE); 301. if(!td) pline("The hole in the ceiling above you closes up."); 302. } 303. } 304. 305. void 306. dotrap(trap) 307. register struct trap *trap; 308. { 309. register int ttype = trap->ttyp; 310. register struct monst *mtmp; 311. register struct obj *otmp; 312. 313. nomul(0); 314. if(trap->tseen && !Fumbling && 315. #ifdef POLYSELF 316. !((ttype == PIT || ttype == SPIKED_PIT) && !is_clinger(uasmon)) && 317. #else 318. !(ttype == PIT || ttype == SPIKED_PIT) && 319. #endif 320. !(ttype == MAGIC_PORTAL || ttype == ANTI_MAGIC) && !rn2(5)) 321. You("escape a%s.", traps[ttype]); 322. else { 323. seetrap(trap); 324. switch(ttype) { 325. case ARROW_TRAP: 326. pline("An arrow shoots out at you!"); 327. otmp = mksobj(ARROW, TRUE, FALSE); 328. otmp->quan = 1L; 329. otmp->owt = weight(otmp); 330. if(thitu(8,dmgval(otmp,uasmon),otmp,"arrow")) 331. obfree(otmp, (struct obj *)0); 332. else { 333. place_object(otmp, u.ux, u.uy); 334. otmp->nobj = fobj; 335. fobj = otmp; 336. stackobj(otmp); 337. newsym(u.ux, u.uy); 338. } 339. break; 340. case DART_TRAP: 341. pline("A little dart shoots out at you!"); 342. otmp = mksobj(DART, TRUE, FALSE); 343. otmp->quan = 1L; 344. otmp->owt = weight(otmp); 345. if (!rn2(6)) otmp->opoisoned = 1; 346. if(thitu(7,dmgval(otmp,uasmon),otmp,"little dart")) { 347. if (otmp->opoisoned) 348. poisoned("dart",A_CON,"poison dart",10); 349. obfree(otmp, (struct obj *)0); 350. } else { 351. place_object(otmp, u.ux, u.uy); 352. otmp->nobj = fobj; 353. fobj = otmp; 354. stackobj(otmp); 355. newsym(u.ux, u.uy); 356. } 357. break; 358. case ROCKTRAP: 359. { 360. int dmg = d(2,6); /* should be std ROCK dmg? */ 361. 362. otmp = mksobj_at(ROCK, u.ux, u.uy, TRUE); 363. otmp->quan = 1L; 364. otmp->owt = weight(otmp); 365. 366. pline("A trap door in the ceiling opens and a rock falls on your %s!", 367. body_part(HEAD)); 368. 369. if (uarmh) 370. if(is_metallic(uarmh)) { 371. pline("Fortunately, you are wearing a hard helmet."); 372. dmg = 2; 373. } else if (flags.verbose) 374. Your("%s does not protect you.", xname(uarmh)); 375. 376. stackobj(otmp); 377. newsym(u.ux,u.uy); /* map the rock */ 378. 379. losehp(dmg, "falling rock", KILLED_BY_AN); 380. exercise(A_STR, FALSE); 381. } 382. break; 383. 384. case SQKY_BOARD: /* stepped on a squeaky board */ 385. if (Levitation 386. #ifdef POLYSELF 387. || is_flyer(uasmon) || is_clinger(uasmon) 388. #endif 389. ) { 390. if (Hallucination) You("notice a crease in the linoleum."); 391. else You("notice a loose board below you."); 392. } else { 393. pline("A board beneath you squeaks loudly."); 394. wake_nearby(); 395. } 396. break; 397. 398. case BEAR_TRAP: 399. if(Levitation 400. #ifdef POLYSELF 401. || is_flyer(uasmon)) { 402. You("%s over a bear trap.", 403. Levitation ? "float" : "fly"); 404. #else 405. ) { 406. You("float over a bear trap."); 407. #endif 408. break; 409. } 410. #ifdef POLYSELF 411. if(amorphous(uasmon)) { 412. pline("A bear trap closes harmlessly through you."); 413. break; 414. } 415. #endif 416. u.utrap = rn1(4, 4); 417. u.utraptype = TT_BEARTRAP; 418. pline("A bear trap closes on your %s!", 419. body_part(FOOT)); 420. #ifdef POLYSELF 421. if(u.umonnum == PM_OWLBEAR || u.umonnum == PM_BUGBEAR) 422. You("howl in anger!"); 423. #endif 424. exercise(A_DEX, FALSE); 425. break; 426. 427. case SLP_GAS_TRAP: 428. if(Sleep_resistance) { 429. You("are enveloped in a cloud of gas!"); 430. break; 431. } 432. pline("A cloud of gas puts you to sleep!"); 433. flags.soundok = 0; 434. nomul(-rnd(25)); 435. u.usleep = 1; 436. nomovemsg = "You wake up."; 437. afternmv = Hear_again; 438. break; 439. 440. case RUST_TRAP: 441. #ifdef POLYSELF 442. if (u.umonnum == PM_IRON_GOLEM) { 443. pline("A gush of water hits you!"); 444. You("are covered with rust!"); 445. rehumanize(); 446. break; 447. } else 448. if (u.umonnum == PM_GREMLIN && rn2(3)) { 449. pline("A gush of water hits you!"); 450. if(mtmp = cloneu()) { 451. mtmp->mhpmax = (u.mhmax /= 2); 452. You("multiply."); 453. } 454. break; 455. } 456. #endif 457. /* Unlike monsters, traps cannot aim their rust attacks at 458. * you, so instead of looping through and taking either the 459. * first rustable one or the body, we take whatever we get, 460. * even if it is not rustable. 461. */ 462. switch (rn2(5)) { 463. case 0: 464. pline("A gush of water hits you on the %s!", 465. body_part(HEAD)); 466. (void) rust_dmg(uarmh, "helmet", 1, TRUE); 467. break; 468. case 1: 469. pline("A gush of water hits your left %s!", 470. body_part(ARM)); 471. if (rust_dmg(uarms, "shield", 1, TRUE)) break; 472. if (uwep && bimanual(uwep)) 473. goto two_hand; 474. /* Two goto statements in a row--aaarrrgggh! */ 475. glovecheck: (void) rust_dmg(uarmg, "gauntlets", 1, TRUE); 476. /* Not "metal gauntlets" since it gets called 477. * even if it's leather for the message 478. */ 479. break; 480. case 2: 481. pline("A gush of water hits your right %s!", 482. body_part(ARM)); 483. two_hand: erode_weapon(FALSE); 484. goto glovecheck; 485. default: 486. pline("A gush of water hits you!"); 487. if (uarmc) (void) rust_dmg(uarmc, "cloak", 1, TRUE); 488. else if (uarm) 489. (void) rust_dmg(uarm, "armor", 1, TRUE); 490. #ifdef TOURIST 491. else if (uarmu) 492. (void) rust_dmg(uarmu, "shirt", 1, TRUE); 493. #endif 494. } 495. break; 496. 497. case FIRE_TRAP: 498. dofiretrap(); 499. break; 500. 501. case PIT: 502. if (Levitation 503. #ifdef POLYSELF 504. || is_flyer(uasmon) || is_clinger(uasmon) 505. #endif 506. ) { 507. if(Blind) break; 508. if(trap->tseen) 509. You("see a pit below you."); 510. else { 511. pline("A pit opens up under you!"); 512. You("don't fall in!"); 513. } 514. break; 515. } 516. You("fall into a pit!"); 517. #ifdef POLYSELF 518. if (!passes_walls(uasmon)) 519. #endif 520. u.utrap = rn1(6,2); 521. u.utraptype = TT_PIT; 522. losehp(rnd(6),"fell into a pit", NO_KILLER_PREFIX); 523. if (Punished && !carried(uball)) { 524. unplacebc(); 525. ballfall(); 526. placebc(); 527. } 528. selftouch("Falling, you"); 529. exercise(A_STR, FALSE); 530. vision_full_recalc = 1; /* vision limits change */ 531. break; 532. case SPIKED_PIT: 533. if (Levitation 534. #ifdef POLYSELF 535. || is_flyer(uasmon) || is_clinger(uasmon) 536. #endif 537. ) { 538. if(Blind) break; 539. pline("A pit full of spikes opens up under you!"); 540. You("don't fall in!"); 541. break; 542. } 543. You("fall into a pit!"); 544. You("land on a set of sharp iron spikes!"); 545. #ifdef POLYSELF 546. if (!passes_walls(uasmon)) 547. #endif 548. u.utrap = rn1(6,2); 549. u.utraptype = TT_PIT; 550. losehp(rnd(10),"fell into a pit of iron spikes", 551. NO_KILLER_PREFIX); 552. if(!rn2(6)) poisoned("spikes",A_STR,"fall onto poison spikes",8); 553. if (Punished && !carried(uball)) { 554. unplacebc(); 555. ballfall(); 556. placebc(); 557. } 558. selftouch("Falling, you"); 559. vision_full_recalc = 1; /* vision limits change */ 560. exercise(A_STR, FALSE); 561. exercise(A_DEX, FALSE); 562. break; 563. 564. case TRAPDOOR: 565. if(!Can_fall_thru(&u.uz)) 566. panic("Trapdoors cannot exist on this level."); 567. fall_through(TRUE); 568. break; 569. 570. case TELEP_TRAP: 571. if(In_endgame(&u.uz) || Antimagic) { 572. if(Antimagic) 573. shieldeff(u.ux, u.uy); 574. You("feel a wrenching sensation."); 575. #ifdef WALKIES 576. } else if(!next_to_u()) { 577. You(shudder_for_moment); 578. #endif 579. } else if(trap->once) { 580. deltrap(trap); 581. newsym(u.ux,u.uy); /* get rid of trap symbol */ 582. vtele(); 583. } else 584. tele(); 585. break; 586. case LEVEL_TELEP: 587. You("%s onto a level teleport trap!", 588. Levitation ? (const char *)"float" : 589. #ifdef POLYSELF 590. locomotion(uasmon, "step")); 591. #else 592. (const char *)"step"); 593. #endif 594. if(Antimagic) { 595. shieldeff(u.ux, u.uy); 596. } 597. if(Antimagic || In_endgame(&u.uz)) { 598. You("feel a wrenching sensation."); 599. break; 600. } 601. if(!Blind) 602. You("are momentarily blinded by a flash of light."); 603. else 604. You("are momentarily disoriented."); 605. deltrap(trap); 606. newsym(u.ux,u.uy); /* get rid of trap symbol */ 607. level_tele(); 608. break; 609. 610. case WEB: /* Our luckless player has stumbled into a web. */ 611. #ifdef POLYSELF 612. if (amorphous(uasmon)) { 613. if (acidic(uasmon) || u.umonnum == PM_GELATINOUS_CUBE) 614. { 615. deltrap(trap); 616. newsym(u.ux,u.uy);/* update position */ 617. You("dissolve a spider web."); 618. break; 619. } 620. You("flow through a spider web."); 621. break; 622. } 623. if (uasmon->mlet == S_SPIDER) { 624. pline("There is a spider web here."); 625. break; 626. } 627. #endif 628. You("%s into a spider web!", 629. Levitation ? (const char *)"float" : 630. #ifdef POLYSELF 631. locomotion(uasmon, "stumble")); 632. #else 633. (const char *)"stumble"); 634. #endif 635. u.utraptype = TT_WEB; 636. 637. /* Time stuck in the web depends on your strength. */ 638. { 639. register int str = ACURR(A_STR); 640. 641. if (str == 3) u.utrap = rn1(6,6); 642. else if (str < 6) u.utrap = rn1(6,4); 643. else if (str < 9) u.utrap = rn1(4,4); 644. else if (str < 12) u.utrap = rn1(4,2); 645. else if (str < 15) u.utrap = rn1(2,2); 646. else if (str < 18) u.utrap = rnd(2); 647. else if (str < 69) u.utrap = 1; 648. else { 649. u.utrap = 0; 650. You("tear through the web!"); 651. deltrap(trap); 652. newsym(u.ux,u.uy); /* get rid of trap symbol */ 653. } 654. } 655. break; 656. 657. case STATUE_TRAP: 658. deltrap(trap); 659. newsym(u.ux,u.uy); /* get rid of trap symbol */ 660. for(otmp=level.objects[u.ux][u.uy]; 661. otmp; otmp = otmp->nexthere) 662. if(otmp->otyp == STATUE) 663. if(mtmp=makemon(&mons[otmp->corpsenm],u.ux,u.uy)) { 664. pline("The statue comes to life!"); 665. /* mimic statues become seen mimics */ 666. if(mtmp->m_ap_type) seemimic(mtmp); 667. delobj(otmp); 668. break; 669. } 670. break; 671. 672. case MAGIC_TRAP: /* A magic trap. */ 673. if (!rn2(30)) { 674. deltrap(trap); 675. newsym(u.ux,u.uy); /* update position */ 676. You("are caught in a magical explosion!"); 677. losehp(rnd(10), "magical explosion", KILLED_BY_AN); 678. Your("body absorbs some of the magical energy!"); 679. u.uen = (u.uenmax += 2); 680. } else domagictrap(); 681. break; 682. 683. case ANTI_MAGIC: 684. if(Antimagic) { 685. shieldeff(u.ux, u.uy); 686. You("feel momentarily lethargic."); 687. } else drain_en(rnd((int)u.ulevel) + 1); 688. break; 689. 690. #ifdef POLYSELF 691. case POLY_TRAP: 692. if(Antimagic) { 693. shieldeff(u.ux, u.uy); 694. You("feel momentarily different."); 695. /* Trap did nothing; don't remove it --KAA */ 696. } else { 697. deltrap(trap); /* delete trap before polymorph */ 698. newsym(u.ux,u.uy); /* get rid of trap symbol */ 699. You("feel a change coming over you."); 700. polyself(); 701. } 702. break; 703. #endif 704. 705. case LANDMINE: { 706. if (Levitation 707. #ifdef POLYSELF 708. || is_flyer(uasmon) 709. #endif 710. ) { 711. You("see a trigger in a pile of soil below you."); 712. if (rn2(3)) break; 713. pline("KAABLAMM!!! The air currents set it off!"); 714. } else { 715. pline("KAABLAMM!!! You triggered a land mine!"); 716. set_wounded_legs(LEFT_SIDE, rn1(35, 41)); 717. set_wounded_legs(RIGHT_SIDE, rn1(35, 41)); 718. } 719. losehp(rnd(16), "land mine", KILLED_BY_AN); 720. /* wake everything on the level */ 721. for(mtmp = fmon; mtmp; mtmp = mtmp->nmon) { 722. if(mtmp->msleep) mtmp->msleep = 0; 723. } 724. deltrap(t_at(u.ux, u.uy)); /* mines only explode once */ 725. newsym(u.ux,u.uy); /* get rid of trap symbol */ 726. } 727. break; 728. 729. case MAGIC_PORTAL: 730. #ifdef WALKIES 731. if(!next_to_u()) 732. You(shudder_for_moment); 733. else 734. #endif 735. domagicportal(trap); 736. break; 737. 738. default: 739. impossible("You hit a trap of type %u", trap->ttyp); 740. } 741. } 742. } 743. 744. #endif /* OVLB */ 745. 746. #ifdef WALKIES 747. 748. STATIC_DCL boolean FDECL(teleport_pet, (struct monst *)); 749. 750. #ifdef OVLB 751. 752. STATIC_OVL boolean 753. teleport_pet(mtmp) 754. register struct monst *mtmp; 755. { 756. register struct obj *otmp; 757. 758. if(mtmp->mleashed) { 759. otmp = get_mleash(mtmp); 760. if(!otmp) 761. impossible("%s is leashed, without a leash.", Monnam(mtmp)); 762. if(otmp->cursed) { 763. # ifdef SOUNDS 764. yelp(mtmp); 765. # endif 766. return FALSE; 767. } else { 768. Your("leash goes slack."); 769. m_unleash(mtmp); 770. return TRUE; 771. } 772. } 773. return TRUE; 774. } 775. 776. #endif /* OVLB */ 777. 778. #endif /* WALKIES */ 779. 780. #ifdef OVLB 781. 782. void 783. seetrap(trap) 784. register struct trap *trap; 785. { 786. if(!trap->tseen) { 787. trap->tseen = 1; 788. newsym(trap->tx, trap->ty); 789. } 790. } 791. 792. #endif /* OVLB */ 793. #ifdef OVL1 794. 795. int 796. mintrap(mtmp) 797. register struct monst *mtmp; 798. { 799. register struct trap *trap = t_at(mtmp->mx, mtmp->my); 800. boolean trapkilled = FALSE, tdoor = FALSE; 801. struct permonst *mptr = mtmp->data; 802. struct obj *otmp; 803. 804. if(!trap) { 805. mtmp->mtrapped = 0; /* perhaps teleported? */ 806. } else if (mtmp->mtrapped) { /* was in trap */ 807. if(!rn2(40)) 808. if (sobj_at(BOULDER, mtmp->mx, mtmp->my) && 809. ((trap->ttyp == PIT) || 810. (trap->ttyp == SPIKED_PIT))) { 811. if (!rn2(2)) { 812. mtmp->mtrapped = 0; 813. fill_pit(mtmp->mx, mtmp->my); 814. } 815. } else 816. mtmp->mtrapped = 0; 817. } else { 818. register int tt = trap->ttyp; 819. 820. /* A bug fix for dumb messages by ab@unido. 821. */ 822. int in_sight = canseemon(mtmp); 823. 824. if(mtmp->mtrapseen & (1 << tt)) { 825. /* it has been in such a trap - perhaps it escapes */ 826. if(rn2(4)) return(0); 827. } 828. mtmp->mtrapseen |= (1 << tt); 829. switch (tt) { 830. case ARROW_TRAP: 831. otmp = mksobj(ARROW, TRUE, FALSE); 832. otmp->quan = 1L; 833. otmp->owt = weight(otmp); 834. if(in_sight) seetrap(trap); 835. if(thitm(8, mtmp, otmp, 0)) trapkilled = TRUE; 836. break; 837. case DART_TRAP: 838. otmp = mksobj(DART, TRUE, FALSE); 839. otmp->quan = 1L; 840. otmp->owt = weight(otmp); 841. if (!rn2(6)) otmp->opoisoned = 1; 842. if(in_sight) seetrap(trap); 843. if(thitm(7, mtmp, otmp, 0)) trapkilled = TRUE; 844. break; 845. case ROCKTRAP: 846. otmp = mksobj(ROCK, TRUE, FALSE); 847. otmp->quan = 1L; 848. otmp->owt = weight(otmp); 849. if(in_sight) seetrap(trap); 850. if(!is_whirly(mptr) && !passes_walls(mptr) && 851. thitm(0, mtmp, otmp, d(2, 6))) 852. trapkilled = TRUE; 853. break; 854. 855. case SQKY_BOARD: { 856. register struct monst *ztmp = fmon; 857. 858. if(is_flyer(mptr)) break; 859. /* stepped on a squeaky board */ 860. if (in_sight) { 861. pline("A board beneath %s squeaks loudly.", mon_nam(mtmp)); 862. seetrap(trap); 863. } else 864. You("hear a distant squeak."); 865. /* wake up nearby monsters */ 866. while(ztmp) { 867. if(dist2(mtmp->mx,mtmp->my,ztmp->mx,ztmp->my) < 40) 868. if(ztmp->msleep) ztmp->msleep = 0; 869. ztmp = ztmp->nmon; 870. } 871. break; 872. } 873. 874. case BEAR_TRAP: 875. if(mptr->msize > MZ_SMALL && 876. !amorphous(mptr) && !is_flyer(mptr)) { 877. mtmp->mtrapped = 1; 878. if(in_sight) { 879. pline("%s is caught in a bear trap!", 880. Monnam(mtmp)); 881. seetrap(trap); 882. } else 883. if((mptr == &mons[PM_OWLBEAR] 884. || mptr == &mons[PM_BUGBEAR]) 885. && flags.soundok) 886. You("hear the roaring of an angry bear!"); 887. } 888. break; 889. 890. case SLP_GAS_TRAP: 891. if(!resists_sleep(mptr) && 892. !mtmp->msleep && mtmp->mcanmove) { 893. mtmp->mcanmove = 0; 894. mtmp->mfrozen = rnd(25); 895. if (in_sight) { 896. pline("%s suddenly falls asleep!", 897. Monnam(mtmp)); 898. seetrap(trap); 899. } 900. } 901. break; 902. 903. case RUST_TRAP: 904. if (in_sight) { 905. pline("A gush of water hits %s!", mon_nam(mtmp)); 906. seetrap(trap); 907. } 908. if (mptr == &mons[PM_IRON_GOLEM]) { 909. if (in_sight) 910. pline("%s falls to pieces!", Monnam(mtmp)); 911. else if(mtmp->mtame) 912. pline("May %s rust in peace.", 913. mon_nam(mtmp)); 914. mondied(mtmp); 915. trapkilled = TRUE; 916. } else if (mptr == &mons[PM_GREMLIN] && rn2(3)) { 917. struct monst *mtmp2 = clone_mon(mtmp); 918. 919. if (mtmp2) { 920. mtmp2->mhpmax = (mtmp->mhpmax /= 2); 921. if(in_sight) 922. pline("%s multiplies.", Monnam(mtmp)); 923. } 924. } 925. break; 926. 927. case FIRE_TRAP: 928. if (in_sight) 929. pline("A tower of flame bursts from the floor under %s!", 930. mon_nam(mtmp)); 931. if(resists_fire(mptr)) { 932. if (in_sight) { 933. shieldeff(mtmp->mx,mtmp->my); 934. pline("%s is uninjured.", Monnam(mtmp)); 935. } 936. } else { 937. int num=rnd(6); 938. 939. if (thitm(0, mtmp, (struct obj *)0, num)) 940. trapkilled = TRUE; 941. else mtmp->mhpmax -= num; 942. } 943. (void) destroy_mitem(mtmp, SCROLL_CLASS, AD_FIRE); 944. (void) destroy_mitem(mtmp, SPBOOK_CLASS, AD_FIRE); 945. (void) destroy_mitem(mtmp, POTION_CLASS, AD_FIRE); 946. if (in_sight) seetrap(trap); 947. break; 948. 949. case PIT: 950. case SPIKED_PIT: 951. if ( !is_flyer(mptr) && 952. (!mtmp->wormno || (count_wsegs(mtmp) < 6)) && 953. !is_clinger(mptr) ) { 954. if (!passes_walls(mptr)) 955. mtmp->mtrapped = 1; 956. if(in_sight) { 957. pline("%s falls into a pit!", Monnam(mtmp)); 958. seetrap(trap); 959. } 960. if(thitm(0, mtmp, (struct obj *)0, 961. rnd((tt==PIT) ? 6 : 10))) 962. trapkilled = TRUE; 963. } 964. break; 965. 966. case TRAPDOOR: 967. if(!Can_fall_thru(&u.uz)) 968. panic("Trapdoors cannot exist on this level."); 969. 970. if ( (mptr == &mons[PM_WUMPUS]) || 971. (mtmp->wormno && count_wsegs(mtmp) > 5) ) break; 972. tdoor = TRUE; 973. /* Fall through */ 974. case LEVEL_TELEP: 975. /* long worms w/tails can now change levels! - Norm */ 976. if (!is_flyer(mptr)) { 977. register int nlev; 978. d_level tolevel; 979. #ifdef WALKIES 980. if(teleport_pet(mtmp)) { 981. #endif 982. if(tdoor) { 983. if(Is_stronghold(&u.uz)) 984. assign_level(&tolevel, &valley_level); 985. else if(Is_botlevel(&u.uz)) { 986. pline("%s avoids the trap.", 987. Monnam(mtmp)); 988. break; 989. } else get_level(&tolevel,depth(&u.uz)+1); 990. } else { 991. #ifdef MULDGN 992. if(Is_knox(&u.uz)) { 993. rloc(mtmp); 994. break; 995. } 996. #endif 997. nlev = rnd(3); 998. if(!rn2(2)) nlev = -(nlev); 999. nlev = dunlev(&u.uz) + nlev; 1000. if(nlev > dunlevs_in_dungeon(&u.uz)) { 1001. nlev = dunlevs_in_dungeon(&u.uz); 1002. /* teleport up if already on bottom */ 1003. if (Is_botlevel(&u.uz)) 1004. nlev -= rnd(3); 1005. } 1006. if (nlev < 1) { 1007. nlev = 1; 1008. if (dunlev(&u.uz) == 1) { 1009. nlev += rnd(3); 1010. if (nlev > 1011. dunlevs_in_dungeon(&u.uz)) 1012. nlev = 1013. dunlevs_in_dungeon(&u.uz); 1014. } 1015. } 1016. /* can't seem to go anywhere */ 1017. /* (possible in short dungeons) */ 1018. if (nlev == dunlev(&u.uz)) { 1019. rloc(mtmp); 1020. break; 1021. } 1022. nlev = dungeons[u.uz.dnum].depth_start + 1023. nlev; 1024. get_level(&tolevel, nlev); 1025. } 1026. if(in_sight) { 1027. pline("Suddenly, %s disappears out of sight.", mon_nam(mtmp)); 1028. seetrap(trap); 1029. } 1030. migrate_to_level(mtmp, 1031. ledger_no(&tolevel), 0); 1032. return(3); /* no longer on this level */ 1033. #ifdef WALKIES 1034. } 1035. #endif 1036. } 1037. break; 1038. 1039. case TELEP_TRAP: 1040. case MAGIC_PORTAL: 1041. #ifdef WALKIES 1042. if(teleport_pet(mtmp)) { 1043. #endif 1044. /* Note: don't remove the trap if a vault. Other- 1045. * wise the monster will be stuck there, since 1046. * the guard isn't going to come for it... 1047. * Also: don't remove if magic portal. In short, 1048. * don't remove :-) 1049. */ 1050. if (in_sight) { 1051. pline("%s suddenly disappears!", 1052. Monnam(mtmp)); 1053. seetrap(trap); 1054. } 1055. if (trap->once) vloc(mtmp); 1056. else rloc(mtmp); 1057. #ifdef WALKIES 1058. } 1059. #endif 1060. break; 1061. 1062. case WEB: 1063. /* Monster in a web. */ 1064. if (mptr->mlet == S_SPIDER) break; 1065. if (amorphous(mptr)) { 1066. if (acidic(mptr) || 1067. mptr == &mons[PM_GELATINOUS_CUBE]) { 1068. if (in_sight) 1069. pline("%s dissolves a spider web.", 1070. Monnam(mtmp)); 1071. deltrap(trap); 1072. break; 1073. } 1074. if (in_sight) 1075. pline("%s flows through a spider web.", 1076. Monnam(mtmp)); 1077. break; 1078. } 1079. switch (monsndx(mptr)) { 1080. case PM_FIRE_ELEMENTAL: 1081. if (in_sight) 1082. pline("%s burns a spider web!", Monnam(mtmp)); 1083. deltrap(trap); 1084. break; 1085. case PM_OWLBEAR: /* Eric Backus */ 1086. case PM_BUGBEAR: 1087. if (!in_sight) { 1088. You("hear the roaring of a confused bear!"); 1089. mtmp->mtrapped = 1; 1090. break; 1091. } 1092. /* fall though */ 1093. default: 1094. if (in_sight) 1095. pline("%s is caught in a spider web.", 1096. Monnam(mtmp)); 1097. mtmp->mtrapped = 1; 1098. break; 1099. } 1100. break; 1101. 1102. case STATUE_TRAP: 1103. break; 1104. 1105. case MAGIC_TRAP: 1106. /* A magic trap. Monsters immune. */ 1107. break; 1108. case ANTI_MAGIC: 1109. break; 1110. 1111. case LANDMINE: { 1112. register struct monst *mntmp = fmon; 1113. 1114. if(rn2(3)) 1115. break; /* monsters usually don't set it off */ 1116. if(is_flyer(mptr)) { 1117. if (in_sight) { 1118. pline("A trigger appears in a pile of soil below %s.", Monnam(mtmp)); 1119. seetrap(trap); 1120. } 1121. if (rn2(3)) break; 1122. if (in_sight) 1123. pline("The air currents set it off!"); 1124. } else if(in_sight) 1125. pline("KAABLAMM!!! %s triggers a land mine!", 1126. Monnam(mtmp)); 1127. if (!in_sight) 1128. pline("Kaablamm! You hear an explosion in the distance!"); 1129. deltrap(trap); 1130. if(thitm(0, mtmp, (struct obj *)0, rnd(16))) 1131. trapkilled = TRUE; 1132. /* wake everything on the level */ 1133. while(mntmp) { 1134. if(mntmp->msleep) 1135. mntmp->msleep = 0; 1136. mntmp = mntmp->nmon; 1137. } 1138. if (unconscious()) { 1139. multi = -1; 1140. nomovemsg="The explosion awakens you!"; 1141. } 1142. break; 1143. } 1144. 1145. #ifdef POLYSELF 1146. case POLY_TRAP: 1147. if(!resist(mtmp, WAND_CLASS, 0, NOTELL)) { 1148. (void) newcham(mtmp, (struct permonst *)0); 1149. if (in_sight) seetrap(trap); 1150. } 1151. break; 1152. #endif 1153. 1154. default: 1155. impossible("Some monster encountered a strange trap of type %d.", tt); 1156. } 1157. } 1158. if(trapkilled) return 2; 1159. return mtmp->mtrapped; 1160. } 1161. 1162. #endif /* OVL1 */ 1163. #ifdef OVLB 1164. 1165. void 1166. selftouch(arg) 1167. const char *arg; 1168. { 1169. if(uwep && (uwep->otyp == CORPSE && uwep->corpsenm == PM_COCKATRICE) 1170. #ifdef POLYSELF 1171. && !resists_ston(uasmon) 1172. #endif 1173. ){ 1174. pline("%s touch the cockatrice corpse.", arg); 1175. #ifdef POLYSELF 1176. if(poly_when_stoned(uasmon) && polymon(PM_STONE_GOLEM)) 1177. return; 1178. #endif 1179. You("turn to stone..."); 1180. killer_format = KILLED_BY; 1181. killer = "touching a cockatrice corpse"; 1182. done(STONING); 1183. } 1184. } 1185. 1186. void 1187. float_up() 1188. { 1189. if(u.utrap) { 1190. if(u.utraptype == TT_PIT) { 1191. u.utrap = 0; 1192. You("float up, out of the pit!"); 1193. vision_full_recalc = 1; /* vision limits change */ 1194. fill_pit(u.ux, u.uy); 1195. } else if (u.utraptype == TT_INFLOOR) { 1196. Your("body pulls upward, but your %s are still stuck.", 1197. makeplural(body_part(LEG))); 1198. } else { 1199. You("float up, only your %s is still stuck.", 1200. body_part(LEG)); 1201. } 1202. } 1203. else if(Is_waterlevel(&u.uz)) 1204. pline("It feels as though you'd lost some weight."); 1205. else if(u.uinwater) 1206. spoteffects(); 1207. else if (Hallucination) 1208. pline("Up, up, and awaaaay! You're walking on air!"); 1209. else if(Is_airlevel(&u.uz)) 1210. You("gain control over your movements."); 1211. else 1212. You("start to float in the air!"); 1213. } 1214. 1215. void 1216. fill_pit(x, y) 1217. int x, y; 1218. { 1219. struct obj *otmp; 1220. struct trap *t; 1221. 1222. if ((t = t_at(x, y)) && 1223. ((t->ttyp == PIT) || (t->ttyp == SPIKED_PIT)) && 1224. (otmp = sobj_at(BOULDER, x, y))) { 1225. freeobj(otmp); 1226. (void) flooreffects(otmp, x, y, "settle"); 1227. } 1228. } 1229. 1230. int 1231. float_down() 1232. { 1233. register struct trap *trap = (struct trap *)0; 1234. boolean no_msg = FALSE; 1235. 1236. if(Levitation) return(0); /* maybe another ring/potion/boots */ 1237. 1238. if (Punished && !carried(uball) && 1239. (is_pool(uball->ox, uball->oy) || 1240. ((trap = t_at(uball->ox, uball->oy)) && 1241. ((trap->ttyp == PIT) || (trap->ttyp == SPIKED_PIT) || 1242. (trap->ttyp == TRAPDOOR))))) { 1243. u.ux0 = u.ux; 1244. u.uy0 = u.uy; 1245. u.ux = uball->ox; 1246. u.uy = uball->oy; 1247. movobj(uchain, uball->ox, uball->oy); 1248. newsym(u.ux0, u.uy0); 1249. vision_full_recalc = 1; /* in case the hero moved. */ 1250. } 1251. /* check for falling into pool - added by GAN 10/20/86 */ 1252. #ifdef POLYSELF 1253. if(!is_flyer(uasmon)) { 1254. #endif 1255. /* kludge alert: 1256. * drown() and lava_effects() print various messages almost 1257. * every time they're called which conflict with the "fall 1258. * into" message below. Thus, we want to avoid printing 1259. * confusing, duplicate or out-of-order messages. 1260. * Use knowledge of the two routines as a hack -- this 1261. * should really handled differently -dlc 1262. */ 1263. if(is_pool(u.ux,u.uy) && !Wwalking && !u.uinwater) 1264. no_msg = drown(); 1265. 1266. if(is_lava(u.ux,u.uy)) { 1267. (void) lava_effects(); 1268. no_msg = TRUE; 1269. } 1270. #ifdef POLYSELF 1271. } 1272. #endif 1273. if (!trap) { 1274. if(Is_airlevel(&u.uz)) 1275. You("begin to tumble in place."); 1276. if(Is_waterlevel(&u.uz) && !no_msg) 1277. You("feel heavier."); 1278. /* u.uinwater msgs already in spoteffects()/drown() */ 1279. else if (!u.uinwater && !no_msg) { 1280. if (Hallucination) 1281. pline("Bummer! You've %s.", 1282. is_pool(u.ux,u.uy) ? 1283. "splashed down" : "hit the ground"); 1284. else 1285. You("float gently to the %s.", 1286. is_pool(u.ux,u.uy) ? "water" : "ground"); 1287. } 1288. trap = t_at(u.ux,u.uy); 1289. } 1290. 1291. if(trap) 1292. switch(trap->ttyp) { 1293. case STATUE_TRAP: 1294. break; 1295. case TRAPDOOR: 1296. if(!Can_fall_thru(&u.uz) || u.ustuck) 1297. break; 1298. /* fall into next case */ 1299. default: 1300. dotrap(trap); 1301. } 1302. if(!flags.nopick && OBJ_AT(u.ux, u.uy) && 1303. !Is_airlevel(&u.uz) && !Is_waterlevel(&u.uz) && 1304. (!is_pool(u.ux,u.uy) || Underwater)) 1305. pickup(1); 1306. return 0; 1307. } 1308. 1309. 1310. void 1311. tele() 1312. { 1313. coord cc; 1314. 1315. /* Disable teleportation in stronghold && Vlad's Tower */ 1316. if(level.flags.noteleport) { 1317. #ifdef WIZARD 1318. if (!wizard) { 1319. #endif 1320. pline("A mysterious force prevents you from teleporting!"); 1321. return; 1322. #ifdef WIZARD 1323. } 1324. #endif 1325. } 1326. 1327. /* don't show trap if "Sorry..." */ 1328. if(!Blinded) make_blinded(0L,FALSE); 1329. 1330. if((u.uhave.amulet || Is_wiz1_level(&u.uz) || Is_wiz2_level(&u.uz) || 1331. Is_wiz3_level(&u.uz)) && !rn2(3)) { 1332. You("feel disoriented for a moment."); 1333. return; 1334. } 1335. if(Teleport_control 1336. #ifdef WIZARD 1337. || wizard 1338. #endif 1339. ) { 1340. if (unconscious()) 1341. pline("Being unconscious, you cannot control your teleport."); 1342. else { 1343. pline("To what position do you want to be teleported?"); 1344. cc.x = u.ux; 1345. cc.y = u.uy; 1346. getpos(&cc, TRUE, "the desired position");/* force valid*/ 1347. if(cc.x == -10) return; /* abort */ 1348. /* possible extensions: introduce a small error if 1349. magic power is low; allow transfer to solid rock */ 1350. if(teleok(cc.x, cc.y, FALSE)){ 1351. teleds(cc.x, cc.y); 1352. return; 1353. } 1354. pline("Sorry..."); 1355. } 1356. } 1357. 1358. (void) safe_teleds(); 1359. } 1360. 1361. void 1362. teleds(nux, nuy) 1363. register int nux,nuy; 1364. { 1365. if (Punished) unplacebc(); 1366. u.utrap = 0; 1367. u.ustuck = 0; 1368. u.ux0 = u.ux; 1369. u.uy0 = u.uy; 1370. u.ux = nux; 1371. u.uy = nuy; 1372. fill_pit(u.ux0, u.uy0); /* do this now so that cansee() is correct */ 1373. #ifdef POLYSELF 1374. if (hides_under(uasmon)) 1375. u.uundetected = OBJ_AT(nux, nuy); 1376. else 1377. u.uundetected = 0; 1378. if (u.usym == S_MIMIC_DEF) u.usym = S_MIMIC; 1379. #endif 1380. if(Punished) placebc(); 1381. if(u.uswallow){ 1382. u.uswldtim = u.uswallow = 0; 1383. docrt(); 1384. } 1385. initrack(); /* teleports mess up tracking monsters without this */ 1386. /* 1387. * Make sure the hero disappears from the old location. This will 1388. * not happen if she is teleported within sight of her previous 1389. * location. Force a full vision recalculation because the hero 1390. * is now in a new location. 1391. */ 1392. newsym(u.ux0,u.uy0); 1393. vision_full_recalc = 1; 1394. nomul(0); 1395. spoteffects(); 1396. } 1397. 1398. int 1399. dotele() 1400. { 1401. struct trap *trap; 1402. boolean castit = FALSE; 1403. register int sp_no = 0; 1404. 1405. trap = t_at(u.ux, u.uy); 1406. if (trap && (!trap->tseen || trap->ttyp != TELEP_TRAP)) 1407. trap = 0; 1408. 1409. if (trap) { 1410. if (trap->once) { 1411. pline("This is a vault teleport, usable once only."); 1412. if (yn("Jump in?") == 'n') 1413. trap = 0; 1414. else { 1415. deltrap(trap); 1416. newsym(u.ux, u.uy); 1417. } 1418. } 1419. if (trap) 1420. #ifdef POLYSELF 1421. You("%s onto the teleportation trap.", 1422. locomotion(uasmon, "jump")); 1423. #else 1424. You("jump onto the teleportation trap."); 1425. #endif 1426. } 1427. if(!trap && (!Teleportation || 1428. (u.ulevel < (pl_character[0] == 'W' ? 8 : 12) 1429. #ifdef POLYSELF 1430. && !can_teleport(uasmon) 1431. #endif 1432. ) 1433. )) { 1434. /* Try to use teleport away spell. */ 1435. castit = objects[SPE_TELEPORT_AWAY].oc_name_known; 1436. if (castit) { 1437. for (sp_no = 0; sp_no < MAXSPELL && 1438. spl_book[sp_no].sp_id != NO_SPELL && 1439. spl_book[sp_no].sp_id != SPE_TELEPORT_AWAY; sp_no++); 1440. 1441. if (sp_no == MAXSPELL || 1442. spl_book[sp_no].sp_id != SPE_TELEPORT_AWAY) 1443. castit = FALSE; 1444. } 1445. #ifdef WIZARD 1446. if (!wizard) { 1447. #endif 1448. if (!castit) { 1449. if (!Teleportation) 1450. You("don't know that spell."); 1451. else You("are not able to teleport at will."); 1452. return(0); 1453. } 1454. #ifdef WIZARD 1455. } 1456. #endif 1457. } 1458. 1459. if(!trap && (u.uhunger <= 100 || ACURR(A_STR) < 6)) { 1460. You("lack the strength for a teleport spell."); 1461. #ifdef WIZARD 1462. if(!wizard) 1463. #endif 1464. return(1); 1465. } 1466. if(!trap && 1467. check_capacity("Your concentration falters from carrying so much.")) 1468. return 1; 1469. 1470. if (castit) { 1471. exercise(A_WIS, TRUE); 1472. if (spelleffects(++sp_no, TRUE)) 1473. return(1); 1474. else 1475. #ifdef WIZARD 1476. if (!wizard) 1477. #endif 1478. return(0); 1479. } 1480. #ifdef WALKIES 1481. if(next_to_u()) { 1482. #endif 1483. if (trap && trap->once) vtele(); 1484. else tele(); 1485. #ifdef WALKIES 1486. (void) next_to_u(); 1487. } else { 1488. You(shudder_for_moment); 1489. return(0); 1490. } 1491. #endif 1492. if (!trap) morehungry(100); 1493. return(1); 1494. } 1495. 1496. 1497. void 1498. level_tele() 1499. { 1500. register int newlev; 1501. d_level newlevel; 1502. 1503. if((u.uhave.amulet || In_endgame(&u.uz)) 1504. #ifdef WIZARD 1505. && !wizard 1506. #endif 1507. ) { 1508. You("feel very disoriented for a moment."); 1509. return; 1510. } 1511. if(Teleport_control 1512. #ifdef WIZARD 1513. || wizard 1514. #endif 1515. ) { 1516. char buf[BUFSZ]; 1517. 1518. do { 1519. getlin("To what level do you want to teleport? [type a number]", 1520. buf); 1521. } while(!digit(buf[0]) && (buf[0] != '-' || !digit(buf[1]))); 1522. newlev = atoi(buf); 1523. 1524. /* no dungeon escape via this route */ 1525. if(newlev == 0) { 1526. if(ynq("Go to Nowhere. Are you sure?") != 'y') return; 1527. You("scream in agony as your body begins to warp..."); 1528. display_nhwindow(WIN_MESSAGE, FALSE); 1529. You("cease to exist."); 1530. killer_format = NO_KILLER_PREFIX; 1531. killer = "committed suicide"; 1532. done(DIED); 1533. return; 1534. } 1535. #ifdef MULDGN 1536. /* if in Knox and the requested level > 0, stay put. 1537. * we let negative values requests fall into the "heaven" loop. 1538. */ 1539. if(Is_knox(&u.uz) && newlev > 0) { 1540. You(shudder_for_moment); 1541. return; 1542. } 1543. /* if in Quest, the player sees "Home 1", etc., on the status 1544. * line, instead of the logical depth of the level. controlled 1545. * level teleport request is likely to be relativized to the 1546. * status line, and consequently it should be incremented to 1547. * the value of the logical depth of the target level. 1548. * 1549. * we let negative values requests fall into the "heaven" loop. 1550. */ 1551. if(In_quest(&u.uz) && newlev > 0) 1552. newlev = newlev + dungeons[u.uz.dnum].depth_start - 1; 1553. #endif 1554. } else { /* involuntary level tele */ 1555. #ifdef MULDGN 1556. if(Is_knox(&u.uz)) { 1557. You(shudder_for_moment); 1558. return; 1559. } 1560. #endif 1561. if(rn2(5)) newlev = rnd((int)depth(&u.uz) + 3); 1562. else { 1563. You(shudder_for_moment); 1564. return; 1565. } 1566. if(newlev == depth(&u.uz)) { 1567. /* if in a single-level dungeon... */ 1568. if(dunlevs_in_dungeon(&u.uz) == 1) { 1569. You(shudder_for_moment); 1570. return; 1571. } 1572. else if(dunlev(&u.uz) == 1) newlev++; 1573. else if(dunlev(&u.uz) == dunlevs_in_dungeon(&u.uz)) newlev--; 1574. else if(In_hell(&u.uz)) newlev--; 1575. else newlev++; 1576. } 1577. } 1578. 1579. #ifdef WALKIES 1580. if(!next_to_u()) { 1581. You(shudder_for_moment); 1582. return; 1583. } 1584. #endif 1585. if(newlev < 0) { 1586. if(newlev <= -10) { 1587. You("arrive in heaven."); 1588. verbalize("Thou art early, but we'll admit thee."); 1589. killer_format = NO_KILLER_PREFIX; 1590. killer = "went to heaven prematurely"; 1591. done(DIED); 1592. return; 1593. } else if (newlev == -9) { 1594. You("feel deliriously happy. "); 1595. pline("(In fact, you're on Cloud 9!) "); 1596. display_nhwindow(WIN_MESSAGE, FALSE); 1597. } else 1598. You("are now high above the clouds..."); 1599. 1600. if(Levitation || is_floater(uasmon)) { 1601. You("float gently down to earth."); 1602. u.uz.dnum = 0; /* he might have been in another dgn */ 1603. newlev = 1; 1604. } 1605. #ifdef POLYSELF 1606. else if(is_flyer(uasmon)) { 1607. You("fly down to earth."); 1608. u.uz.dnum = 0; /* he might have been in another dgn */ 1609. newlev = 1; 1610. } 1611. #endif 1612. else { 1613. d_level save_dlevel; 1614. 1615. assign_level(&save_dlevel, &u.uz); 1616. pline("Unfortunately, you don't know how to fly."); 1617. You("plummet a few thousand feet to your death."); 1618. u.uz.dnum = 0; 1619. u.uz.dlevel = 0; 1620. killer_format = NO_KILLER_PREFIX; 1621. killer = 1622. self_pronoun("teleported out of the dungeon and fell to %s death","his"); 1623. done(DIED); 1624. assign_level(&u.uz, &save_dlevel); 1625. flags.botl = 1; 1626. return; 1627. } 1628. } 1629. 1630. # ifdef WIZARD 1631. if (In_endgame(&u.uz)) { /* must already be wizard */ 1632. newlevel.dnum = u.uz.dnum; 1633. newlevel.dlevel = newlev; 1634. goto_level(&newlevel, FALSE, FALSE, FALSE); 1635. return; 1636. } 1637. # endif 1638. 1639. /* calls done(ESCAPED) if newlevel==0 */ 1640. if(u.uz.dnum == medusa_level.dnum && 1641. newlev >= dungeons[u.uz.dnum].depth_start + 1642. dunlevs_in_dungeon(&u.uz)) { 1643. 1644. goto_hell(TRUE, FALSE); 1645. } else { 1646. /* if invocation did not yet occur, teleporting into 1647. * the last level of Gehennom is forbidden. 1648. */ 1649. if(Inhell && !u.uevent.invoked && 1650. newlev >= (dungeons[u.uz.dnum].depth_start + 1651. dunlevs_in_dungeon(&u.uz) - 1)) { 1652. newlev = dungeons[u.uz.dnum].depth_start + 1653. dunlevs_in_dungeon(&u.uz) - 2; 1654. pline("Sorry..."); 1655. } 1656. #ifdef MULDGN 1657. /* no teleporting out of quest dungeon */ 1658. if(In_quest(&u.uz) && newlev < depth(&qstart_level)) 1659. newlev = depth(&qstart_level); 1660. #endif 1661. /* the player thinks of levels purely in logical terms, so 1662. * we must translate newlev to a number relative to the 1663. * current dungeon. 1664. */ 1665. get_level(&newlevel, newlev); 1666. goto_level(&newlevel, FALSE, FALSE, FALSE); 1667. } 1668. } 1669. 1670. static void 1671. dofiretrap() 1672. { 1673. 1674. register int num; 1675. 1676. /* changed to be in conformance with 1677. * SCR_FIRE by GAN 11/02/86 1678. */ 1679. 1680. pline("A tower of flame bursts from the floor!"); 1681. if(Fire_resistance) { 1682. shieldeff(u.ux, u.uy); 1683. You("are uninjured."); 1684. } else { 1685. num = rnd(6); 1686. u.uhpmax -= num; 1687. losehp(num,"burst of flame", KILLED_BY_AN); 1688. } 1689. destroy_item(SCROLL_CLASS, AD_FIRE); 1690. destroy_item(SPBOOK_CLASS, AD_FIRE); 1691. destroy_item(POTION_CLASS, AD_FIRE); 1692. } 1693. 1694. static void 1695. domagicportal(ttmp) 1696. register struct trap *ttmp; 1697. { 1698. struct d_level target_level; 1699. 1700. /* if landed from another portal, do nothing */ 1701. /* problem: level teleport landing escapes the check */ 1702. if(!on_level(&u.uz, &u.uz0)) return; 1703. 1704. You("activated a magic portal!"); 1705. You("feel dizzy for a moment, but the sensation passes."); 1706. 1707. /* prevent the poor shnook, whose amulet was stolen */ 1708. /* while in the endgame, from accidently triggering */ 1709. /* the portal to the next level, and thus losing the */ 1710. /* game */ 1711. if(In_endgame(&u.uz) && !u.uhave.amulet) return; 1712. 1713. target_level = ttmp->dst; 1714. goto_level(&target_level, FALSE, FALSE, TRUE); 1715. } 1716. 1717. static void 1718. domagictrap() 1719. { 1720. register int fate = rnd(20); 1721. 1722. /* What happened to the poor sucker? */ 1723. 1724. if (fate < 10) { 1725. 1726. /* Most of the time, it creates some monsters. */ 1727. register int cnt = rnd(4); 1728. 1729. /* below checks for blindness added by GAN 10/30/86 */ 1730. if (!Blind) { 1731. You("are momentarily blinded by a flash of light!"); 1732. make_blinded((long)rn1(5,10),FALSE); 1733. } else 1734. You("hear a deafening roar!"); 1735. while(cnt--) 1736. (void) makemon((struct permonst *) 0, u.ux, u.uy); 1737. } 1738. else 1739. switch (fate) { 1740. 1741. case 10: 1742. case 11: 1743. /* sometimes nothing happens */ 1744. break; 1745. case 12: /* a flash of fire */ 1746. dofiretrap(); 1747. break; 1748. 1749. /* odd feelings */ 1750. case 13: pline("A shiver runs up and down your %s!", 1751. body_part(SPINE)); 1752. break; 1753. case 14: You(Hallucination ? 1754. "hear the moon howling at you." : 1755. "hear distant howling."); 1756. break; 1757. case 15: You("suddenly yearn for %s.", 1758. Hallucination ? "Cleveland" : 1759. "your distant homeland"); 1760. break; 1761. case 16: Your("pack shakes violently!"); 1762. break; 1763. case 17: You(Hallucination ? 1764. "smell hamburgers." : 1765. "smell charred flesh."); 1766. break; 1767. 1768. /* very occasionally something nice happens. */ 1769. 1770. case 19: 1771. /* tame nearby monsters */ 1772. { register int i,j; 1773. register struct monst *mtmp; 1774. 1775. /* below pline added by GAN 10/30/86 */ 1776. (void) adjattrib(A_CHA,1,FALSE); 1777. for(i = -1; i <= 1; i++) for(j = -1; j <= 1; j++) { 1778. if(!isok(u.ux+i, u.uy+j)) continue; 1779. mtmp = m_at(u.ux+i, u.uy+j); 1780. if(mtmp) 1781. (void) tamedog(mtmp, (struct obj *)0); 1782. } 1783. break; 1784. } 1785. 1786. case 20: 1787. /* uncurse stuff */ 1788. { register struct obj *obj; 1789. 1790. /* below plines added by GAN 10/30/86 */ 1791. You(Hallucination ? 1792. "feel in touch with the Universal Oneness." : 1793. "feel like someone is helping you."); 1794. for(obj = invent; obj ; obj = obj->nobj) 1795. if(obj->owornmask || obj->otyp == LOADSTONE) 1796. uncurse(obj); 1797. if(Punished) unpunish(); 1798. break; 1799. } 1800. default: break; 1801. } 1802. } 1803. 1804. void 1805. water_damage(obj,force) 1806. register struct obj *obj; 1807. register boolean force; 1808. { 1809. /* Scrolls, spellbooks, potions, weapons and 1810. pieces of armor may get affected by the water */ 1811. for(; obj; obj = obj->nobj) { 1812. 1813. (void) snuff_lit(obj); 1814. 1815. if(obj->greased) { 1816. if (force || !rn2(2)) obj->greased = 0; 1817. } else if(Is_container(obj) && !Is_box(obj) && 1818. (obj->otyp != OILSKIN_SACK || (obj->cursed && !rn2(3)))) { 1819. water_damage(obj->cobj,force); 1820. } else if(obj->oclass == SCROLL_CLASS && (force || rn2(12) > Luck) 1821. #ifdef MAIL 1822. && obj->otyp != SCR_MAIL 1823. #endif 1824. ) { 1825. obj->otyp = SCR_BLANK_PAPER; 1826. } else if(obj->oclass == SPBOOK_CLASS && (force || rn2(12) > Luck)) { 1827. if (obj->otyp == SPE_BOOK_OF_THE_DEAD) 1828. pline("Steam rises from %s.", the(xname(obj))); 1829. else obj->otyp = SPE_BLANK_PAPER; 1830. } else if(obj->oclass == POTION_CLASS && (force || rn2(12) > Luck)) { 1831. if (obj->spe == -1) { 1832. obj->otyp = POT_WATER; 1833. obj->blessed = obj->cursed = 0; 1834. obj->spe = 0; 1835. } else obj->spe--; 1836. } else if(is_rustprone(obj) && obj->oeroded < MAX_ERODE && 1837. !(obj->oerodeproof || (obj->blessed && !rnl(4))) && 1838. (force || rn2(12) > Luck)) { 1839. /* all metal stuff and armor except body armor 1840. protected by oilskin cloak */ 1841. if(obj->oclass != ARMOR_CLASS || obj != uarm || 1842. !uarmc || uarmc->otyp != OILSKIN_CLOAK || 1843. (uarmc->cursed && !rn2(3))) 1844. obj->oeroded++; 1845. } 1846. } 1847. } 1848. 1849. /* 1850. * This function is potentially expensive - rolling 1851. * inventory list multiple times. Luckily it's seldom needed. 1852. * Returns TRUE if disrobing made player unencumbered enough to 1853. * crawl out of the current predicament. 1854. */ 1855. static boolean 1856. emergency_disrobe(lostsome) 1857. boolean *lostsome; 1858. { 1859. int invc = inv_cnt(); 1860. 1861. while (near_capacity() > (Punished ? UNENCUMBERED : SLT_ENCUMBER)) { 1862. register struct obj *obj, *otmp = (struct obj *)0; 1863. register int i = rn2(invc); 1864. 1865. for (obj = invent; obj; obj = obj->nobj) { 1866. /* 1867. * Undroppables are: body armor, boots, gloves, 1868. * amulets, and rings because of the time and effort 1869. * in removing them + loadstone and other cursed stuff 1870. * for obvious reasons. 1871. */ 1872. if (!(obj->otyp == LOADSTONE || 1873. obj == uamul || obj == uleft || obj == uright || 1874. obj == ublindf || obj == uarm || obj == uarmc || 1875. obj == uarmg || obj == uarmf || 1876. #ifdef TOURIST 1877. obj == uarmu || 1878. #endif 1879. (obj->cursed && (obj == uarmh || obj == uarms)) || 1880. welded(obj))) 1881. otmp = obj; 1882. /* reached the mark and found some stuff to drop? */ 1883. if (--i < 0 && otmp) break; 1884. 1885. /* else continue */ 1886. } 1887. 1888. /* nothing to drop and still overweight */ 1889. if (!otmp) return(FALSE); 1890. 1891. if (otmp == uarmh) (void) Helmet_off(); 1892. else if (otmp == uarms) (void) Shield_off(); 1893. else if (otmp == uwep) setuwep((struct obj *)0); 1894. *lostsome = TRUE; 1895. dropx(otmp); 1896. invc--; 1897. } 1898. return(TRUE); 1899. } 1900. 1901. /* 1902. * return(TRUE) == player relocated 1903. */ 1904. boolean 1905. drown() 1906. { 1907. boolean inpool_ok = FALSE, crawl_ok; 1908. int i, x, y; 1909. 1910. /* happily wading in the same contiguous pool */ 1911. if (u.uinwater && is_pool(u.ux-u.dx,u.uy-u.dy) && 1912. Magical_breathing) { 1913. /* water effects on objects every now and then */ 1914. if (!rn2(5)) inpool_ok = TRUE; 1915. else return(FALSE); 1916. } 1917. 1918. if (!u.uinwater) { 1919. You("%s into the water!", 1920. Is_waterlevel(&u.uz) ? "plunge" : "fall"); 1921. #ifdef POLYSELF 1922. if(!is_swimmer(uasmon)) 1923. #endif 1924. if (!Is_waterlevel(&u.uz)) 1925. You("sink like %s.", 1926. Hallucination ? "the Titanic" : "a rock"); 1927. } 1928. 1929. water_damage(invent,FALSE); 1930. 1931. #ifdef POLYSELF 1932. if(u.umonnum == PM_GREMLIN && rn2(3)) { 1933. struct monst *mtmp; 1934. if(mtmp = cloneu()) { 1935. mtmp->mhpmax = (u.mhmax /= 2); 1936. You("multiply."); 1937. } 1938. } 1939. 1940. if(is_swimmer(uasmon)) return(FALSE); 1941. #endif 1942. if (inpool_ok) return(FALSE); 1943. #ifdef WALKIES 1944. if ((i = number_leashed()) > 0) { 1945. pline("The leash%s slip%s loose.", 1946. (i > 1) ? "es" : "", 1947. (i > 1) ? "" : "s"); 1948. unleash_all(); 1949. } 1950. #endif 1951. if (Magical_breathing) { 1952. pline("But wait!"); 1953. Your("lungs start acting like gills."); 1954. if (!Is_waterlevel(&u.uz)) 1955. Your("%s the bottom.",Hallucination ? "keel hits" : "feet touch"); 1956. if (Punished) placebc(); 1957. u.uinwater = 1; 1958. under_water(1); 1959. return(FALSE); 1960. } 1961. if((Teleportation || can_teleport(uasmon)) && 1962. (Teleport_control || rn2(3) < Luck+2)) { 1963. You("attempt a teleport spell."); /* utcsri!carroll */ 1964. (void) dotele(); 1965. if(!is_pool(u.ux,u.uy)) 1966. return(TRUE); 1967. } 1968. crawl_ok = FALSE; 1969. /* look around for a place to crawl to */ 1970. for (i = 0; i < 100; i++) { 1971. x = rn1(3,u.ux - 1); 1972. y = rn1(3,u.uy - 1); 1973. if (teleok(x,y,TRUE)) { 1974. crawl_ok = TRUE; 1975. goto crawl; 1976. } 1977. } 1978. /* one more scan */ 1979. for (x = u.ux - 1; x <= u.ux + 1; x++) 1980. for (y = u.uy - 1; y <= u.uy + 1; y++) 1981. if (teleok(x,y,TRUE)) { 1982. crawl_ok = TRUE; 1983. goto crawl; 1984. } 1985. crawl:; 1986. if (crawl_ok) { 1987. boolean lost = FALSE; 1988. /* time to do some strip-tease... */ 1989. boolean succ = Is_waterlevel(&u.uz) ? TRUE : 1990. emergency_disrobe(&lost); 1991. 1992. You("try to crawl out of the water."); 1993. if (lost) 1994. You("dump some of your gear to lose weight..."); 1995. if (succ) { 1996. pline("Pheew! That was close."); 1997. teleds(x,y); 1998. return(TRUE); 1999. } 2000. /* still too much weight */ 2001. pline("But in vain."); 2002. } 2003. u.uinwater = 1; 2004. You("drown."); 2005. killer_format = KILLED_BY_AN; 2006. killer = (levl[u.ux][u.uy].typ == POOL || Is_medusa_level(&u.uz)) ? 2007. "pool of water" : "moat"; 2008. done(DROWNING); 2009. /* oops, we're still alive. better get out of the water. */ 2010. if (!safe_teleds()) 2011. while (1) { 2012. pline("You're still drowning."); 2013. done(DROWNING); 2014. } 2015. u.uinwater = 0; 2016. You("find yourself back %s.",Is_waterlevel(&u.uz) ? 2017. "in an air bubble" : "on dry land"); 2018. return(TRUE); 2019. } 2020. 2021. void 2022. drain_en(n) 2023. register int n; 2024. { 2025. if (!u.uenmax) return; 2026. You("feel your magical energy drain away!"); 2027. u.uen -= n; 2028. if(u.uen < 0) { 2029. u.uenmax += u.uen; 2030. if(u.uenmax < 0) u.uenmax = 0; 2031. u.uen = 0; 2032. } 2033. flags.botl = 1; 2034. } 2035. 2036. int 2037. dountrap() /* disarm a trapped object */ 2038. { 2039. #ifdef POLYSELF 2040. if(nohands(uasmon)) { 2041. pline("And just how do you expect to do that?"); 2042. return(0); 2043. } 2044. #endif 2045. return untrap(FALSE); 2046. } 2047. 2048. int 2049. untrap(force) 2050. boolean force; 2051. { 2052. register struct obj *otmp; 2053. register boolean confused = (Confusion > 0 || Hallucination > 0); 2054. register int x,y; 2055. int ch; 2056. struct trap *ttmp; 2057. struct monst *mtmp; 2058. boolean trap_skipped = FALSE; 2059. 2060. if(!getdir(NULL)) return(0); 2061. x = u.ux + u.dx; 2062. y = u.uy + u.dy; 2063. 2064. if(!u.dx && !u.dy) { 2065. for(otmp = level.objects[x][y]; otmp; otmp = otmp->nexthere) 2066. if(Is_box(otmp)) { 2067. pline("There is %s here.", doname(otmp)); 2068. 2069. switch (ynq("Check for traps?")) { 2070. case 'q': return(0); 2071. case 'n': continue; 2072. } 2073. 2074. if((otmp->otrapped && (force || (!confused 2075. && rn2(MAXULEV + 1 - (int)u.ulevel) < 10))) 2076. || (!force && confused && !rn2(3))) { 2077. You("find a trap on %s!", the(xname(otmp))); 2078. exercise(A_WIS, TRUE); 2079. 2080. switch (ynq("Disarm it?")) { 2081. case 'q': return(1); 2082. case 'n': trap_skipped = TRUE; continue; 2083. } 2084. 2085. if(otmp->otrapped) { 2086. exercise(A_DEX, TRUE); 2087. ch = ACURR(A_DEX) + u.ulevel; 2088. if (pl_character[0] == 'R') ch *= 2; 2089. if(!force && (confused || Fumbling || 2090. rnd(75+level_difficulty()/2) > ch)) { 2091. (void) chest_trap(otmp, FINGER, TRUE); 2092. } else { 2093. You("disarm it!"); 2094. otmp->otrapped = 0; 2095. } 2096. } else pline("That %s was not trapped.", doname(otmp)); 2097. return(1); 2098. } else { 2099. You("find no traps on %s.", the(xname(otmp))); 2100. return(1); 2101. } 2102. } 2103. if ((ttmp = t_at(x,y)) && ttmp->tseen) 2104. You("cannot disable this trap."); 2105. else 2106. You(trap_skipped ? "find no other traps here." 2107. : "know of no traps here."); 2108. return(0); 2109. } 2110. 2111. if ((mtmp = m_at(x,y)) && 2112. mtmp->m_ap_type == M_AP_FURNITURE && 2113. (mtmp->mappearance == S_hcdoor || 2114. mtmp->mappearance == S_vcdoor) && 2115. !Protection_from_shape_changers) { 2116. 2117. stumble_onto_mimic(mtmp); 2118. return(1); 2119. } 2120. 2121. if (!IS_DOOR(levl[x][y].typ)) { 2122. if ((ttmp = t_at(x,y)) && ttmp->tseen) 2123. You("cannot disable that trap."); 2124. else 2125. You("know of no traps there."); 2126. return(0); 2127. } 2128. 2129. switch (levl[x][y].doormask) { 2130. case D_NODOOR: 2131. You("%s no door there.", Blind ? "feel" : "see"); 2132. return(0); 2133. case D_ISOPEN: 2134. pline("This door is safely open."); 2135. return(0); 2136. case D_BROKEN: 2137. pline("This door is broken."); 2138. return(0); 2139. } 2140. 2141. if ((levl[x][y].doormask & D_TRAPPED 2142. && (force || 2143. (!confused && rn2(MAXULEV - (int)u.ulevel + 11) < 10))) 2144. || (!force && confused && !rn2(3))) { 2145. You("find a trap on the door!"); 2146. exercise(A_WIS, TRUE); 2147. if (ynq("Disarm it?") != 'y') return(1); 2148. if (levl[x][y].doormask & D_TRAPPED) { 2149. ch = 15 + 2150. (pl_character[0] == 'R') ? u.ulevel*3 : 2151. u.ulevel; 2152. exercise(A_DEX, TRUE); 2153. if(!force && (confused || Fumbling || 2154. rnd(75+level_difficulty()/2) > ch)) { 2155. You("set it off!"); 2156. b_trapped("door"); 2157. } else 2158. You("disarm it!"); 2159. levl[x][y].doormask &= ~D_TRAPPED; 2160. } else pline("This door was not trapped."); 2161. return(1); 2162. } else { 2163. You("find no traps on the door."); 2164. return(1); 2165. } 2166. } 2167. 2168. /* only called when the player is doing something to the chest directly */ 2169. boolean 2170. chest_trap(obj, bodypart, disarm) 2171. register struct obj *obj; 2172. register int bodypart; 2173. boolean disarm; 2174. { 2175. register struct obj *otmp = obj, *otmp2; 2176. char buf[80]; 2177. const char *msg; 2178. 2179. You(disarm ? "set it off!" : "trigger a trap!"); 2180. display_nhwindow(WIN_MESSAGE, FALSE); 2181. if (Luck > -13 && rn2(13+Luck) > 7) { /* saved by luck */ 2182. /* trap went off, but good luck prevents damage */ 2183. switch (rn2(13)) { 2184. case 12: 2185. case 11: msg = "explosive charge is a dud"; break; 2186. case 10: 2187. case 9: msg = "electric charge is grounded"; break; 2188. case 8: 2189. case 7: msg = "flame fizzles out"; break; 2190. case 6: 2191. case 5: 2192. case 4: msg = "poisoned needle misses"; break; 2193. case 3: 2194. case 2: 2195. case 1: 2196. case 0: msg = "gas cloud blows away"; break; 2197. default: impossible("chest disarm bug"); msg = NULL; break; 2198. } 2199. if (msg) pline("But luckily the %s!", msg); 2200. } else { 2201. switch(rn2(20) ? ((Luck >= 13) ? 0 : rn2(13-Luck)) : rn2(26)) { 2202. case 25: 2203. case 24: 2204. case 23: 2205. case 22: 2206. case 21: { 2207. register struct monst *shkp; 2208. long loss = 0L; 2209. boolean costly, insider; 2210. register xchar ox = obj->ox, oy = obj->oy; 2211. 2212. #ifdef GCC_WARN 2213. shkp = (struct monst *) 0; 2214. #endif 2215. /* the obj location need not be that of player */ 2216. costly = (costly_spot(ox, oy) && 2217. (shkp = shop_keeper(*in_rooms(ox, oy, 2218. SHOPBASE))) != (struct monst *)0); 2219. insider = (*u.ushops && inside_shop(u.ux, u.uy) && 2220. *in_rooms(ox, oy, SHOPBASE) == *u.ushops); 2221. 2222. pline("%s explodes!", The(xname(obj))); 2223. Sprintf(buf, "exploding %s", xname(obj)); 2224. 2225. if(costly) 2226. loss += stolen_value(obj, ox, oy, 2227. (boolean)shkp->mpeaceful, TRUE); 2228. delete_contents(obj); 2229. for(otmp = level.objects[u.ux][u.uy]; 2230. otmp; otmp = otmp2) { 2231. otmp2 = otmp->nexthere; 2232. if(costly) 2233. loss += stolen_value(otmp, otmp->ox, 2234. otmp->oy, (boolean)shkp->mpeaceful, 2235. TRUE); 2236. delobj(otmp); 2237. } 2238. exercise(A_STR, FALSE); 2239. losehp(d(6,6), buf, KILLED_BY_AN); 2240. if(costly && loss) { 2241. if(insider) 2242. You("owe %ld zorkmids for objects destroyed.", 2243. loss); 2244. else { 2245. You("caused %ld zorkmids worth of damage!", 2246. loss); 2247. make_angry_shk(shkp, ox, oy); 2248. } 2249. } 2250. wake_nearby(); 2251. return TRUE; 2252. } 2253. case 20: 2254. case 19: 2255. case 18: 2256. case 17: 2257. pline("A cloud of noxious gas billows from %s.", 2258. the(xname(obj))); 2259. poisoned("gas cloud", A_STR, "cloud of poison gas",15); 2260. exercise(A_CON, FALSE); 2261. break; 2262. case 16: 2263. case 15: 2264. case 14: 2265. case 13: 2266. You("feel a needle prick your %s.",body_part(bodypart)); 2267. poisoned("needle", A_CON, "poison needle",10); 2268. exercise(A_CON, FALSE); 2269. break; 2270. case 12: 2271. case 11: 2272. case 10: 2273. case 9: 2274. pline("A tower of flame erupts from %s!", 2275. the(xname(obj))); 2276. if(Fire_resistance) { 2277. shieldeff(u.ux, u.uy); 2278. You("don't seem to be affected."); 2279. } else losehp(d(4, 6), "tower of flame", KILLED_BY_AN); 2280. destroy_item(SCROLL_CLASS, AD_FIRE); 2281. destroy_item(SPBOOK_CLASS, AD_FIRE); 2282. destroy_item(POTION_CLASS, AD_FIRE); 2283. break; 2284. case 8: 2285. case 7: 2286. case 6: 2287. You("are jolted by a surge of electricity!"); 2288. if(Shock_resistance) { 2289. shieldeff(u.ux, u.uy); 2290. You("don't seem to be affected."); 2291. } else losehp(d(4, 4), "electric shock", KILLED_BY_AN); 2292. destroy_item(RING_CLASS, AD_ELEC); 2293. destroy_item(WAND_CLASS, AD_ELEC); 2294. break; 2295. case 5: 2296. case 4: 2297. case 3: 2298. pline("Suddenly you are frozen in place!"); 2299. nomul(-d(5, 6)); 2300. exercise(A_DEX, FALSE); 2301. nomovemsg = "You can move again."; 2302. break; 2303. case 2: 2304. case 1: 2305. case 0: 2306. pline("A cloud of %s gas billows from %s", 2307. hcolor(), the(xname(obj))); 2308. if(!Stunned) 2309. if (Hallucination) 2310. pline("What a groovy feeling!"); 2311. else 2312. You("stagger and your vision blurs..."); 2313. make_stunned(HStun + rn1(7, 16),FALSE); 2314. make_hallucinated(HHallucination + rn1(5, 16),FALSE,0L); 2315. break; 2316. default: impossible("bad chest trap"); 2317. break; 2318. } 2319. bot(); /* to get immediate botl re-display */ 2320. } 2321. otmp->otrapped = 0; /* these traps are one-shot things */ 2322. 2323. return FALSE; 2324. } 2325. 2326. #endif /* OVLB */ 2327. #ifdef OVL0 2328. 2329. struct trap * 2330. t_at(x,y) 2331. register int x, y; 2332. { 2333. register struct trap *trap = ftrap; 2334. while(trap) { 2335. if(trap->tx == x && trap->ty == y) return(trap); 2336. trap = trap->ntrap; 2337. } 2338. return((struct trap *)0); 2339. } 2340. 2341. #endif /* OVL0 */ 2342. #ifdef OVLB 2343. 2344. void 2345. deltrap(trap) 2346. register struct trap *trap; 2347. { 2348. register struct trap *ttmp; 2349. 2350. if(trap == ftrap) 2351. ftrap = ftrap->ntrap; 2352. else { 2353. for(ttmp = ftrap; ttmp->ntrap != trap; ttmp = ttmp->ntrap) ; 2354. ttmp->ntrap = trap->ntrap; 2355. } 2356. dealloc_trap(trap); 2357. } 2358. 2359. /* used for doors. can be used for anything else that opens. */ 2360. void 2361. b_trapped(item) 2362. register const char *item; 2363. { 2364. register int lvl = level_difficulty(); 2365. int dmg = rnd(5 + (lvl<5 ? lvl : 2+lvl/2)); 2366. 2367. pline("KABOOM!! %s was booby-trapped!", The(item)); 2368. if (u.ulevel < 4 && lvl < 3 && !rnl(3)) 2369. You("are shaken, but luckily unhurt."); 2370. else losehp(dmg, "explosion", KILLED_BY_AN); 2371. exercise(A_STR, FALSE); 2372. make_stunned(HStun + dmg, TRUE); 2373. } 2374. 2375. /* Monster is hit by trap. */ 2376. /* Note: doesn't work if both obj and d_override are null */ 2377. STATIC_OVL boolean 2378. thitm(tlev, mon, obj, d_override) 2379. register int tlev; 2380. register struct monst *mon; 2381. register struct obj *obj; 2382. int d_override; 2383. { 2384. register int strike; 2385. register boolean trapkilled = FALSE; 2386. 2387. if (d_override) strike = 1; 2388. else if (obj) strike = (find_mac(mon) + tlev + obj->spe <= rnd(20)); 2389. else strike = (find_mac(mon) + tlev <= rnd(20)); 2390. 2391. /* Actually more accurate than thitu, which doesn't take 2392. * obj->spe into account. 2393. */ 2394. if(!strike) { 2395. if (cansee(mon->mx, mon->my)) 2396. pline("%s is almost hit by %s!", Monnam(mon), 2397. doname(obj)); 2398. } else { 2399. int dam = 1; 2400. 2401. if (obj && cansee(mon->mx, mon->my)) 2402. pline("%s is hit by %s!", Monnam(mon), doname(obj)); 2403. if (d_override) dam = d_override; 2404. else if (obj) { 2405. dam = dmgval(obj, mon->data); 2406. if (dam < 1) dam = 1; 2407. } 2408. if ((mon->mhp -= dam) <= 0) { 2409. int xx = mon->mx; 2410. int yy = mon->my; 2411. 2412. monkilled(mon, "", AD_PHYS); 2413. newsym(xx, yy); 2414. trapkilled = TRUE; 2415. } 2416. } 2417. if (obj && (!strike || d_override)) { 2418. place_object(obj, mon->mx, mon->my); 2419. obj->nobj = fobj; 2420. fobj = obj; 2421. stackobj(fobj); 2422. } else if (obj) dealloc_obj(obj); 2423. 2424. return trapkilled; 2425. } 2426. 2427. boolean 2428. unconscious() 2429. { 2430. return (multi < 0 && (!nomovemsg || 2431. u.usleep || 2432. !strncmp(nomovemsg,"You regain con", 15) || 2433. !strncmp(nomovemsg,"You are consci", 15))); 2434. } 2435. 2436. static char lava_killer[] = "molten lava"; 2437. 2438. boolean 2439. lava_effects() 2440. { 2441. register struct obj *obj, *obj2; 2442. int dmg; 2443. 2444. if (!Fire_resistance) { 2445. if(Wwalking) { 2446. dmg = d(6,6); 2447. pline("The lava here burns you!"); 2448. if(dmg < u.uhp) { 2449. losehp(dmg, lava_killer, KILLED_BY); 2450. goto burn_stuff; 2451. } 2452. } else 2453. You("fall into the lava!"); 2454. 2455. for(obj = invent; obj; obj = obj2) { 2456. obj2 = obj->nobj; 2457. if(is_organic(obj) && !obj->oerodeproof) { 2458. if(obj->owornmask) { 2459. if(obj == uarm) (void) Armor_gone(); 2460. else if(obj == uarmc) (void) Cloak_off(); 2461. else if(obj == uarmh) (void) Helmet_off(); 2462. else if(obj == uarms) (void) Shield_off(); 2463. else if(obj == uarmg) (void) Gloves_off(); 2464. else if(obj == uarmf) (void) Boots_off(); 2465. #ifdef TOURIST 2466. else if(obj == uarmu) setnotworn(obj); 2467. #endif 2468. else if(obj == uleft) Ring_gone(obj); 2469. else if(obj == uright) Ring_gone(obj); 2470. else if(obj == ublindf) Blindf_off(obj); 2471. else if(obj == uwep) uwepgone(); 2472. if(Lifesaved 2473. #ifdef WIZARD 2474. || wizard 2475. #endif 2476. ) Your("%s into flame!", aobjnam(obj, "burst")); 2477. } 2478. useup(obj); 2479. } 2480. } 2481. 2482. /* s/he died... */ 2483. u.uhp = -1; 2484. killer_format = KILLED_BY; 2485. killer = lava_killer; 2486. You("burn to a crisp..."); 2487. done(BURNING); 2488. if (!safe_teleds()) 2489. while (1) { 2490. pline("You're still burning."); 2491. done(BURNING); 2492. } 2493. You("find yourself back on solid ground."); 2494. return(TRUE); 2495. } 2496. 2497. if (!Wwalking) { 2498. u.utrap = rn1(4, 4) + (rn1(4, 12) << 8); 2499. u.utraptype = TT_LAVA; 2500. You("sink into the lava, but it doesn't burn you!"); 2501. } 2502. /* just want to burn boots, not all armor; destroy_item doesn't work on 2503. armor anyway */ 2504. burn_stuff: 2505. if(uarmf && !uarmf->oerodeproof && is_organic(uarmf)) { 2506. /* save uarmf value because Boots_off() sets uarmf to NULL */ 2507. obj = uarmf; 2508. Your("%s burst into flame!", xname(obj)); 2509. (void) Boots_off(); 2510. useup(obj); 2511. } 2512. destroy_item(SCROLL_CLASS, AD_FIRE); 2513. destroy_item(SPBOOK_CLASS, AD_FIRE); 2514. destroy_item(POTION_CLASS, AD_FIRE); 2515. return(FALSE); 2516. } 2517. 2518. #endif /* OVLB */ 2519. 2520. /*trap.c*/
Alternative Linked Data Views: ODE     Raw Data in: CXML | CSV | RDF ( N-Triples N3/Turtle JSON XML ) | OData ( Atom JSON ) | Microdata ( JSON HTML) | JSON-LD    About   
This material is Open Knowledge   W3C Semantic Web Technology [RDF Data] Valid XHTML + RDFa
OpenLink Virtuoso version 07.20.3217, on Linux (x86_64-pc-linux-gnu), Standard Edition
Data on this page belongs to its respective rights holders.
Virtuoso Faceted Browser Copyright © 2009-2012 OpenLink Software