abstract
| - Below is the full text to apply.c from the source code of SLASH'EM 0.0.7E7F2. To link to a particular line, write [[SLASH'EM 0.0.7E7F2/apply.c#line123]], for example. The latest source code for vanilla NetHack is at Source code. 1. /* SCCS Id: @(#)apply.c 3.4 2003/11/18 */ 2. /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ 3. /* NetHack may be freely redistributed. See license for details. */ 4. 5. #include "hack.h" 6. #include "edog.h" 7. 8. #ifdef OVLB 9. 10. static const char tools[] = { TOOL_CLASS, WEAPON_CLASS, WAND_CLASS, 0 }; 11. static const char all_count[] = { ALLOW_COUNT, ALL_CLASSES, 0 }; 12. static const char tools_too[] = { ALL_CLASSES, TOOL_CLASS, POTION_CLASS, 13. WEAPON_CLASS, WAND_CLASS, GEM_CLASS, 0 }; 14. static const char tinnables[] = { ALLOW_FLOOROBJ, FOOD_CLASS, 0 }; 15. 16. #ifdef TOURIST 17. STATIC_DCL int FDECL(use_camera, (struct obj *)); 18. #endif 19. STATIC_DCL int FDECL(use_towel, (struct obj *)); 20. STATIC_DCL boolean FDECL(its_dead, (int,int,int *)); 21. STATIC_DCL int FDECL(use_stethoscope, (struct obj *)); 22. STATIC_DCL void FDECL(use_whistle, (struct obj *)); 23. STATIC_DCL void FDECL(use_magic_whistle, (struct obj *)); 24. STATIC_DCL void FDECL(use_leash, (struct obj *)); 25. STATIC_DCL int FDECL(use_mirror, (struct obj *)); 26. STATIC_DCL void FDECL(use_bell, (struct obj **)); 27. STATIC_DCL void FDECL(use_candelabrum, (struct obj *)); 28. STATIC_DCL void FDECL(use_candle, (struct obj **)); 29. STATIC_DCL void FDECL(use_lamp, (struct obj *)); 30. STATIC_DCL int FDECL(use_torch, (struct obj *)); 31. STATIC_DCL void FDECL(light_cocktail, (struct obj *)); 32. STATIC_DCL void FDECL(use_tinning_kit, (struct obj *)); 33. STATIC_DCL void FDECL(use_figurine, (struct obj **)); 34. STATIC_DCL void FDECL(use_grease, (struct obj *)); 35. STATIC_DCL void FDECL(use_trap, (struct obj *)); 36. STATIC_DCL void FDECL(use_stone, (struct obj *)); 37. STATIC_PTR int NDECL(set_trap); /* occupation callback */ 38. STATIC_DCL int FDECL(use_whip, (struct obj *)); 39. STATIC_DCL int FDECL(use_pole, (struct obj *)); 40. STATIC_DCL int FDECL(use_cream_pie, (struct obj *)); 41. STATIC_DCL int FDECL(use_grapple, (struct obj *)); 42. STATIC_DCL int FDECL(do_break_wand, (struct obj *)); 43. STATIC_DCL boolean FDECL(figurine_location_checks, 44. (struct obj *, coord *, BOOLEAN_P)); 45. STATIC_DCL boolean NDECL(uhave_graystone); 46. STATIC_DCL void FDECL(add_class, (char *, CHAR_P)); 47. 48. #ifdef AMIGA 49. void FDECL( amii_speaker, ( struct obj *, char *, int ) ); 50. #endif 51. 52. const char no_elbow_room[] = "don't have enough elbow-room to maneuver."; 53. 54. #ifdef TOURIST 55. STATIC_OVL int 56. use_camera(obj) 57. struct obj *obj; 58. { 59. register struct monst *mtmp; 60. 61. if(Underwater) { 62. pline("Using your camera underwater would void the warranty."); 63. return(0); 64. } 65. if(!getdir((char *)0)) return(0); 66. 67. if (obj->spe <= 0) { 68. pline(nothing_happens); 69. return (1); 70. } 71. consume_obj_charge(obj, TRUE); 72. 73. if (obj->cursed && !rn2(2)) { 74. (void) zapyourself(obj, TRUE); 75. } else if (u.uswallow) { 76. You("take a picture of %s %s.", s_suffix(mon_nam(u.ustuck)), 77. mbodypart(u.ustuck, STOMACH)); 78. } else if (u.dz) { 79. You("take a picture of the %s.", 80. (u.dz > 0) ? surface(u.ux,u.uy) : ceiling(u.ux,u.uy)); 81. } else if (!u.dx && !u.dy) { 82. (void) zapyourself(obj, TRUE); 83. } else if ((mtmp = bhit(u.dx,u.dy,COLNO,FLASHED_LIGHT, 84. (int FDECL((*),(MONST_P,OBJ_P)))0, 85. (int FDECL((*),(OBJ_P,OBJ_P)))0, 86. &obj)) != 0) { 87. obj->ox = u.ux, obj->oy = u.uy; 88. (void) flash_hits_mon(mtmp, obj); 89. } 90. return 1; 91. } 92. #endif 93. 94. STATIC_OVL int 95. use_towel(obj) 96. struct obj *obj; 97. { 98. if(!freehand()) { 99. You("have no free %s!", body_part(HAND)); 100. return 0; 101. } else if (obj->owornmask) { 102. You("cannot use it while you're wearing it!"); 103. return 0; 104. } else if (obj->cursed) { 105. long old; 106. switch (rn2(3)) { 107. case 2: 108. old = Glib; 109. incr_itimeout(&Glib, rn1(10, 3)); 110. Your("%s %s!", makeplural(body_part(HAND)), 111. (old ? "are filthier than ever" : "get slimy")); 112. return 1; 113. case 1: 114. if (!ublindf) { 115. old = u.ucreamed; 116. u.ucreamed += rn1(10, 3); 117. pline("Yecch! Your %s %s gunk on it!", body_part(FACE), 118. (old ? "has more" : "now has")); 119. make_blinded(Blinded + (long)u.ucreamed - old, TRUE); 120. } else { 121. const char *what = (ublindf->otyp == LENSES) ? 122. "lenses" : "blindfold"; 123. if (ublindf->cursed) { 124. You("push your %s %s.", what, 125. rn2(2) ? "cock-eyed" : "crooked"); 126. } else { 127. struct obj *saved_ublindf = ublindf; 128. You("push your %s off.", what); 129. Blindf_off(ublindf); 130. dropx(saved_ublindf); 131. } 132. } 133. return 1; 134. case 0: 135. break; 136. } 137. } 138. 139. if (Glib) { 140. Glib = 0; 141. You("wipe off your %s.", makeplural(body_part(HAND))); 142. return 1; 143. } else if(u.ucreamed) { 144. Blinded -= u.ucreamed; 145. u.ucreamed = 0; 146. 147. if (!Blinded) { 148. pline("You've got the glop off."); 149. Blinded = 1; 150. make_blinded(0L,TRUE); 151. } else { 152. Your("%s feels clean now.", body_part(FACE)); 153. } 154. return 1; 155. } 156. 157. Your("%s and %s are already clean.", 158. body_part(FACE), makeplural(body_part(HAND))); 159. 160. return 0; 161. } 162. 163. /* maybe give a stethoscope message based on floor objects */ 164. STATIC_OVL boolean 165. its_dead(rx, ry, resp) 166. int rx, ry, *resp; 167. { 168. struct obj *otmp; 169. struct trap *ttmp; 170. 171. if (!can_reach_floor()) return FALSE; 172. 173. /* additional stethoscope messages from jyoung@apanix.apana.org.au */ 174. if (Hallucination && sobj_at(CORPSE, rx, ry)) { 175. /* (a corpse doesn't retain the monster's sex, 176. so we're forced to use generic pronoun here) */ 177. You_hear("a voice say, \"It's dead, Jim.\""); 178. *resp = 1; 179. return TRUE; 180. } else if (Role_if(PM_HEALER) && ((otmp = sobj_at(CORPSE, rx, ry)) != 0 || 181. (otmp = sobj_at(STATUE, rx, ry)) != 0)) { 182. /* possibly should check uppermost {corpse,statue} in the pile 183. if both types are present, but it's not worth the effort */ 184. if (vobj_at(rx, ry)->otyp == STATUE) otmp = vobj_at(rx, ry); 185. if (otmp->otyp == CORPSE) { 186. You("determine that %s unfortunate being is dead.", 187. (rx == u.ux && ry == u.uy) ? "this" : "that"); 188. } else { 189. ttmp = t_at(rx, ry); 190. pline("%s appears to be in %s health for a statue.", 191. The(mons[otmp->corpsenm].mname), 192. (ttmp && ttmp->ttyp == STATUE_TRAP) ? 193. "extraordinary" : "excellent"); 194. } 195. return TRUE; 196. } 197. return FALSE; 198. } 199. 200. static const char hollow_str[] = "a hollow sound. This must be a secret %s!"; 201. 202. /* Strictly speaking it makes no sense for usage of a stethoscope to 203. not take any time; however, unless it did, the stethoscope would be 204. almost useless. As a compromise, one use per turn is free, another 205. uses up the turn; this makes curse status have a tangible effect. */ 206. STATIC_OVL int 207. use_stethoscope(obj) 208. register struct obj *obj; 209. { 210. static long last_used_move = -1; 211. static short last_used_movement = 0; 212. struct monst *mtmp; 213. struct rm *lev; 214. int rx, ry, res; 215. boolean interference = (u.uswallow && is_whirly(u.ustuck->data) && 216. !rn2(Role_if(PM_HEALER) ? 10 : 3)); 217. 218. if (nohands(youmonst.data)) { /* should also check for no ears and/or deaf */ 219. You("have no hands!"); /* not `body_part(HAND)' */ 220. return 0; 221. } else if (!freehand()) { 222. You("have no free %s.", body_part(HAND)); 223. return 0; 224. } 225. if (!getdir((char *)0)) return 0; 226. 227. res = (moves == last_used_move) && 228. (youmonst.movement == last_used_movement); 229. last_used_move = moves; 230. last_used_movement = youmonst.movement; 231. 232. #ifdef STEED 233. if (u.usteed && u.dz > 0) { 234. if (interference) { 235. pline("%s interferes.", Monnam(u.ustuck)); 236. mstatusline(u.ustuck); 237. } else 238. mstatusline(u.usteed); 239. return res; 240. } else 241. #endif 242. if (u.uswallow && (u.dx || u.dy || u.dz)) { 243. mstatusline(u.ustuck); 244. return res; 245. } else if (u.uswallow && interference) { 246. pline("%s interferes.", Monnam(u.ustuck)); 247. mstatusline(u.ustuck); 248. return res; 249. } else if (u.dz) { 250. if (Underwater) 251. You_hear("faint splashing."); 252. else if (u.dz < 0 || !can_reach_floor()) 253. You_cant("reach the %s.", 254. (u.dz > 0) ? surface(u.ux,u.uy) : ceiling(u.ux,u.uy)); 255. else if (its_dead(u.ux, u.uy, &res)) 256. ; /* message already given */ 257. else if (Is_stronghold(&u.uz)) 258. You_hear("the crackling of hellfire."); 259. else 260. pline_The("%s seems healthy enough.", surface(u.ux,u.uy)); 261. return res; 262. } else if (obj->cursed && !rn2(2)) { 263. You_hear("your heart beat."); 264. return res; 265. } 266. if (Stunned || (Confusion && !rn2(5))) confdir(); 267. if (!u.dx && !u.dy) { 268. ustatusline(); 269. return res; 270. } 271. rx = u.ux + u.dx; ry = u.uy + u.dy; 272. if (!isok(rx,ry)) { 273. You_hear("a faint typing noise."); 274. return 0; 275. } 276. if ((mtmp = m_at(rx,ry)) != 0) { 277. mstatusline(mtmp); 278. if (mtmp->mundetected) { 279. mtmp->mundetected = 0; 280. if (cansee(rx,ry)) newsym(mtmp->mx,mtmp->my); 281. } 282. if (!canspotmon(mtmp)) 283. map_invisible(rx,ry); 284. return res; 285. } 286. if (memory_is_invisible(rx, ry)) { 287. unmap_object(rx, ry); 288. newsym(rx, ry); 289. pline_The("invisible monster must have moved."); 290. } 291. lev = &levl[rx][ry]; 292. switch(lev->typ) { 293. case SDOOR: 294. You_hear(hollow_str, "door"); 295. cvt_sdoor_to_door(lev); /* ->typ = DOOR */ 296. if (Blind) feel_location(rx,ry); 297. else newsym(rx,ry); 298. return res; 299. case SCORR: 300. You_hear(hollow_str, "passage"); 301. lev->typ = CORR; 302. unblock_point(rx,ry); 303. if (Blind) feel_location(rx,ry); 304. else newsym(rx,ry); 305. return res; 306. } 307. 308. if (!its_dead(rx, ry, &res)) 309. You("hear nothing special."); /* not You_hear() */ 310. return res; 311. } 312. 313. static const char whistle_str[] = "produce a %s whistling sound."; 314. 315. STATIC_OVL void 316. use_whistle(obj) 317. struct obj *obj; 318. { 319. You(whistle_str, obj->cursed ? "shrill" : "high"); 320. wake_nearby(); 321. } 322. 323. STATIC_OVL void 324. use_magic_whistle(obj) 325. struct obj *obj; 326. { 327. register struct monst *mtmp, *nextmon; 328. 329. if(obj->cursed && !rn2(2)) { 330. You("produce a high-pitched humming noise."); 331. wake_nearby(); 332. } else { 333. int pet_cnt = 0; 334. You(whistle_str, Hallucination ? "normal" : "strange"); 335. for(mtmp = fmon; mtmp; mtmp = nextmon) { 336. nextmon = mtmp->nmon; /* trap might kill mon */ 337. if (DEADMONSTER(mtmp)) continue; 338. if (mtmp->mtame) { 339. if (mtmp->mtrapped) { 340. /* no longer in previous trap (affects mintrap) */ 341. mtmp->mtrapped = 0; 342. fill_pit(mtmp->mx, mtmp->my); 343. } 344. mnexto(mtmp); 345. if (canspotmon(mtmp)) ++pet_cnt; 346. if (mintrap(mtmp) == 2) change_luck(-1); 347. } 348. } 349. if (pet_cnt > 0) makeknown(obj->otyp); 350. } 351. } 352. 353. boolean 354. um_dist(x,y,n) 355. register xchar x, y, n; 356. { 357. return((boolean)(abs(u.ux - x) > n || abs(u.uy - y) > n)); 358. } 359. 360. int 361. number_leashed() 362. { 363. register int i = 0; 364. register struct obj *obj; 365. 366. for(obj = invent; obj; obj = obj->nobj) 367. if(obj->otyp == LEASH && obj->leashmon != 0) i++; 368. return(i); 369. } 370. 371. void 372. o_unleash(otmp) /* otmp is about to be destroyed or stolen */ 373. register struct obj *otmp; 374. { 375. register struct monst *mtmp; 376. 377. for(mtmp = fmon; mtmp; mtmp = mtmp->nmon) 378. if(mtmp->m_id == (unsigned)otmp->leashmon) 379. mtmp->mleashed = 0; 380. otmp->leashmon = 0; 381. } 382. 383. void 384. m_unleash(mtmp, feedback) /* mtmp is about to die, or become untame */ 385. register struct monst *mtmp; 386. boolean feedback; 387. { 388. register struct obj *otmp; 389. 390. if (feedback) { 391. if (canseemon(mtmp)) 392. pline("%s pulls free of %s leash!", Monnam(mtmp), mhis(mtmp)); 393. else 394. Your("leash falls slack."); 395. } 396. for(otmp = invent; otmp; otmp = otmp->nobj) 397. if(otmp->otyp == LEASH && 398. otmp->leashmon == (int)mtmp->m_id) 399. otmp->leashmon = 0; 400. mtmp->mleashed = 0; 401. } 402. 403. void 404. unleash_all() /* player is about to die (for bones) */ 405. { 406. register struct obj *otmp; 407. register struct monst *mtmp; 408. 409. for(otmp = invent; otmp; otmp = otmp->nobj) 410. if(otmp->otyp == LEASH) otmp->leashmon = 0; 411. for(mtmp = fmon; mtmp; mtmp = mtmp->nmon) 412. mtmp->mleashed = 0; 413. } 414. 415. #define MAXLEASHED 2 416. 417. /* ARGSUSED */ 418. STATIC_OVL void 419. use_leash(obj) 420. struct obj *obj; 421. { 422. coord cc; 423. register struct monst *mtmp; 424. int spotmon; 425. 426. if(!obj->leashmon && number_leashed() >= MAXLEASHED) { 427. You("cannot leash any more pets."); 428. return; 429. } 430. 431. if(!get_adjacent_loc((char *)0, (char *)0, u.ux, u.uy, &cc)) return; 432. 433. if((cc.x == u.ux) && (cc.y == u.uy)) { 434. #ifdef STEED 435. if (u.usteed && u.dz > 0) { 436. mtmp = u.usteed; 437. spotmon = 1; 438. goto got_target; 439. } 440. #endif 441. pline("Leash yourself? Very funny..."); 442. return; 443. } 444. 445. if(!(mtmp = m_at(cc.x, cc.y))) { 446. There("is no creature there."); 447. return; 448. } 449. 450. spotmon = canspotmon(mtmp); 451. #ifdef STEED 452. got_target: 453. #endif 454. 455. /* KMH, balance patch -- This doesn't work properly. 456. * Pets need extra memory for their edog structure. 457. * Normally, this is handled by tamedog(), but that 458. * rejects all demons. Our other alternative would 459. * be to duplicate tamedog()'s functionality here. 460. * Yuck. So I've merged it into the nymph code below. 461. if (((mtmp->data == &mons[PM_SUCCUBUS]) || (mtmp->data == &mons[PM_INCUBUS])) 462. && (!mtmp->mtame) && (spotmon) && (!mtmp->mleashed)) { 463. pline("%s smiles seductively at the sight of this prop!", Monnam(mtmp)); 464. mtmp->mtame = 10; 465. mtmp->mpeaceful = 1; 466. set_malign(mtmp); 467. }*/ 468. if ((mtmp->data->mlet == S_NYMPH || mtmp->data == &mons[PM_SUCCUBUS] 469. || mtmp->data == &mons[PM_INCUBUS]) 470. && (spotmon) && (!mtmp->mleashed)) { 471. pline("%s looks shocked! \"I'm not that way!\"", Monnam(mtmp)); 472. mtmp->mtame = 0; 473. mtmp->mpeaceful = 0; 474. mtmp->msleeping = 0; 475. } 476. if(!mtmp->mtame) { 477. if(!spotmon) 478. There("is no creature there."); 479. else 480. pline("%s %s leashed!", Monnam(mtmp), (!obj->leashmon) ? 481. "cannot be" : "is not"); 482. return; 483. } 484. if(!obj->leashmon) { 485. if(mtmp->mleashed) { 486. pline("This %s is already leashed.", 487. spotmon ? l_monnam(mtmp) : "monster"); 488. return; 489. } 490. You("slip the leash around %s%s.", 491. spotmon ? "your " : "", l_monnam(mtmp)); 492. mtmp->mleashed = 1; 493. obj->leashmon = (int)mtmp->m_id; 494. mtmp->msleeping = 0; 495. return; 496. } 497. if(obj->leashmon != (int)mtmp->m_id) { 498. pline("This leash is not attached to that creature."); 499. return; 500. } else { 501. if(obj->cursed) { 502. pline_The("leash would not come off!"); 503. obj->bknown = TRUE; 504. return; 505. } 506. mtmp->mleashed = 0; 507. obj->leashmon = 0; 508. You("remove the leash from %s%s.", 509. spotmon ? "your " : "", l_monnam(mtmp)); 510. /* KMH, balance patch -- this is okay */ 511. if ((mtmp->data == &mons[PM_SUCCUBUS]) || 512. (mtmp->data == &mons[PM_INCUBUS])) 513. { 514. pline("%s is infuriated!", Monnam(mtmp)); 515. mtmp->mtame = 0; 516. mtmp->mpeaceful = 0; 517. } 518. 519. } 520. return; 521. } 522. 523. struct obj * 524. get_mleash(mtmp) /* assuming mtmp->mleashed has been checked */ 525. register struct monst *mtmp; 526. { 527. register struct obj *otmp; 528. 529. otmp = invent; 530. while(otmp) { 531. if(otmp->otyp == LEASH && otmp->leashmon == (int)mtmp->m_id) 532. return(otmp); 533. otmp = otmp->nobj; 534. } 535. return((struct obj *)0); 536. } 537. 538. #endif /* OVLB */ 539. #ifdef OVL1 540. 541. boolean 542. next_to_u() 543. { 544. register struct monst *mtmp; 545. register struct obj *otmp; 546. 547. for(mtmp = fmon; mtmp; mtmp = mtmp->nmon) { 548. if (DEADMONSTER(mtmp)) continue; 549. if(mtmp->mleashed) { 550. if (distu(mtmp->mx,mtmp->my) > 2) mnexto(mtmp); 551. if (distu(mtmp->mx,mtmp->my) > 2) { 552. for(otmp = invent; otmp; otmp = otmp->nobj) 553. if(otmp->otyp == LEASH && 554. otmp->leashmon == (int)mtmp->m_id) { 555. if(otmp->cursed) return(FALSE); 556. You_feel("%s leash go slack.", 557. (number_leashed() > 1) ? "a" : "the"); 558. mtmp->mleashed = 0; 559. otmp->leashmon = 0; 560. } 561. } 562. } 563. } 564. #ifdef STEED 565. /* no pack mules for the Amulet */ 566. if (u.usteed && mon_has_amulet(u.usteed)) return FALSE; 567. #endif 568. return(TRUE); 569. } 570. 571. #endif /* OVL1 */ 572. #ifdef OVL0 573. 574. void 575. check_leash(x, y) 576. register xchar x, y; 577. { 578. register struct obj *otmp; 579. register struct monst *mtmp; 580. 581. for (otmp = invent; otmp; otmp = otmp->nobj) { 582. if (otmp->otyp != LEASH || otmp->leashmon == 0) continue; 583. for (mtmp = fmon; mtmp; mtmp = mtmp->nmon) { 584. if (DEADMONSTER(mtmp)) continue; 585. if ((int)mtmp->m_id == otmp->leashmon) break; 586. } 587. if (!mtmp) { 588. impossible("leash in use isn't attached to anything?"); 589. otmp->leashmon = 0; 590. continue; 591. } 592. if (dist2(u.ux,u.uy,mtmp->mx,mtmp->my) > 593. dist2(x,y,mtmp->mx,mtmp->my)) { 594. if (!um_dist(mtmp->mx, mtmp->my, 3)) { 595. ; /* still close enough */ 596. } else if (otmp->cursed && !breathless(mtmp->data)) { 597. if (um_dist(mtmp->mx, mtmp->my, 5) || 598. (mtmp->mhp -= rnd(2)) <= 0) { 599. long save_pacifism = u.uconduct.killer; 600. 601. Your("leash chokes %s to death!", mon_nam(mtmp)); 602. /* hero might not have intended to kill pet, but 603. that's the result of his actions; gain experience, 604. lose pacifism, take alignment and luck hit, make 605. corpse less likely to remain tame after revival */ 606. xkilled(mtmp, 0); /* no "you kill it" message */ 607. /* life-saving doesn't ordinarily reset this */ 608. if (mtmp->mhp > 0) u.uconduct.killer = save_pacifism; 609. } else { 610. pline("%s chokes on the leash!", Monnam(mtmp)); 611. /* tameness eventually drops to 1 here (never 0) */ 612. if (mtmp->mtame && rn2(mtmp->mtame)) mtmp->mtame--; 613. } 614. } else { 615. if (um_dist(mtmp->mx, mtmp->my, 5)) { 616. pline("%s leash snaps loose!", s_suffix(Monnam(mtmp))); 617. m_unleash(mtmp, FALSE); 618. } else { 619. You("pull on the leash."); 620. if (mtmp->data->msound != MS_SILENT) 621. switch (rn2(3)) { 622. case 0: growl(mtmp); break; 623. case 1: yelp(mtmp); break; 624. default: whimper(mtmp); break; 625. } 626. } 627. } 628. } 629. } 630. } 631. 632. #endif /* OVL0 */ 633. #ifdef OVLB 634. 635. #define WEAK 3 /* from eat.c */ 636. 637. static const char look_str[] = "look %s."; 638. 639. STATIC_OVL int 640. use_mirror(obj) 641. struct obj *obj; 642. { 643. register struct monst *mtmp; 644. register char mlet; 645. #ifdef INVISIBLE_OBJECTS 646. boolean vis = !Blind && (!obj->oinvis || See_invisible); 647. #else 648. boolean vis = !Blind; 649. #endif 650. 651. if(!getdir((char *)0)) return 0; 652. if(obj->cursed && !rn2(2)) { 653. if (vis) 654. pline_The("mirror fogs up and doesn't reflect!"); 655. return 1; 656. } 657. if(!u.dx && !u.dy && !u.dz) { 658. if(vis && !Invisible) { 659. if (u.umonnum == PM_FLOATING_EYE) { 660. if (!Free_action) { 661. pline(Hallucination ? 662. "Yow! The mirror stares back!" : 663. "Yikes! You've frozen yourself!"); 664. nomul(-rnd((MAXULEV+6) - u.ulevel)); 665. nomovemsg = 0; 666. } else You("stiffen momentarily under your gaze."); 667. } else if (is_vampire(youmonst.data)) 668. You("don't have a reflection."); 669. else if (u.umonnum == PM_UMBER_HULK) { 670. pline("Huh? That doesn't look like you!"); 671. make_confused(HConfusion + d(3,4),FALSE); 672. } else if (Hallucination) 673. You(look_str, hcolor((char *)0)); 674. else if (Sick) 675. You(look_str, "peaked"); 676. else if (u.uhs >= WEAK) 677. You(look_str, "undernourished"); 678. else You("look as %s as ever.", 679. ACURR(A_CHA) > 14 ? 680. (poly_gender()==1 ? "beautiful" : "handsome") : 681. "ugly"); 682. } else { 683. You_cant("see your %s %s.", 684. ACURR(A_CHA) > 14 ? 685. (poly_gender()==1 ? "beautiful" : "handsome") : 686. "ugly", 687. body_part(FACE)); 688. } 689. return 1; 690. } 691. if(u.uswallow) { 692. if (vis) You("reflect %s %s.", s_suffix(mon_nam(u.ustuck)), 693. mbodypart(u.ustuck, STOMACH)); 694. return 1; 695. } 696. if(Underwater) { 697. #ifdef INVISIBLE_OBJECTS 698. if (!obj->oinvis) 699. #endif 700. You(Hallucination ? 701. "give the fish a chance to fix their makeup." : 702. "reflect the murky water."); 703. return 1; 704. } 705. if(u.dz) { 706. if (vis) 707. You("reflect the %s.", 708. (u.dz > 0) ? surface(u.ux,u.uy) : ceiling(u.ux,u.uy)); 709. return 1; 710. } 711. mtmp = bhit(u.dx, u.dy, COLNO, INVIS_BEAM, 712. (int FDECL((*),(MONST_P,OBJ_P)))0, 713. (int FDECL((*),(OBJ_P,OBJ_P)))0, 714. &obj); 715. if (!mtmp || !haseyes(mtmp->data)) 716. return 1; 717. 718. vis = canseemon(mtmp); 719. mlet = mtmp->data->mlet; 720. if (mtmp->msleeping) { 721. if (vis) 722. pline ("%s is too tired to look at your mirror.", 723. Monnam(mtmp)); 724. } else if (!mtmp->mcansee) { 725. if (vis) 726. pline("%s can't see anything right now.", Monnam(mtmp)); 727. #ifdef INVISIBLE_OBJECTS 728. } else if (obj->oinvis && !perceives(mtmp->data)) { 729. if (vis) 730. pline("%s can't see your mirror.", Monnam(mtmp)); 731. #endif 732. /* some monsters do special things */ 733. } else if (is_vampire(mtmp->data) || mlet == S_GHOST) { 734. if (vis) 735. pline ("%s doesn't have a reflection.", Monnam(mtmp)); 736. } else if(!mtmp->mcan && !mtmp->minvis && 737. mtmp->data == &mons[PM_MEDUSA]) { 738. if (mon_reflects(mtmp, "The gaze is reflected away by %s %s!")) 739. return 1; 740. if (vis) 741. pline("%s is turned to stone!", Monnam(mtmp)); 742. stoned = TRUE; 743. killed(mtmp); 744. } else if(!mtmp->mcan && !mtmp->minvis && 745. mtmp->data == &mons[PM_FLOATING_EYE]) { 746. int tmp = d((int)mtmp->m_lev, (int)mtmp->data->mattk[0].damd); 747. if (!rn2(4)) tmp = 120; 748. if (vis) 749. pline("%s is frozen by its reflection.", Monnam(mtmp)); 750. else You_hear("%s stop moving.",something); 751. mtmp->mcanmove = 0; 752. if ( (int) mtmp->mfrozen + tmp > 127) 753. mtmp->mfrozen = 127; 754. else mtmp->mfrozen += tmp; 755. } else if(!mtmp->mcan && !mtmp->minvis && 756. mtmp->data == &mons[PM_UMBER_HULK]) { 757. if (vis) 758. pline ("%s confuses itself!", Monnam(mtmp)); 759. mtmp->mconf = 1; 760. } else if(!mtmp->mcan && !mtmp->minvis && (mlet == S_NYMPH 761. || mtmp->data==&mons[PM_SUCCUBUS])) { 762. if (vis) { 763. pline ("%s admires herself in your mirror.", Monnam(mtmp)); 764. pline ("She takes it!"); 765. } else pline ("It steals your mirror!"); 766. setnotworn(obj); /* in case mirror was wielded */ 767. freeinv(obj); 768. (void) mpickobj(mtmp,obj); 769. if (!tele_restrict(mtmp)) (void) rloc(mtmp, FALSE); 770. } else if (!is_unicorn(mtmp->data) && !humanoid(mtmp->data) && 771. (!mtmp->minvis || perceives(mtmp->data)) && rn2(5)) { 772. if (vis) 773. pline("%s is frightened by its reflection.", Monnam(mtmp)); 774. monflee(mtmp, d(2,4), FALSE, FALSE); 775. } else if (!Blind) { 776. if (mtmp->minvis && !See_invisible) 777. ; 778. else if ((mtmp->minvis && !perceives(mtmp->data)) 779. || !haseyes(mtmp->data)) 780. pline("%s doesn't seem to notice its reflection.", 781. Monnam(mtmp)); 782. else 783. pline("%s ignores %s reflection.", 784. Monnam(mtmp), mhis(mtmp)); 785. } 786. return 1; 787. } 788. 789. STATIC_OVL void 790. use_bell(optr) 791. struct obj **optr; 792. { 793. register struct obj *obj = *optr; 794. struct monst *mtmp; 795. boolean wakem = FALSE, learno = FALSE, 796. ordinary = (obj->otyp != BELL_OF_OPENING || !obj->spe), 797. invoking = (obj->otyp == BELL_OF_OPENING && 798. invocation_pos(u.ux, u.uy) && !On_stairs(u.ux, u.uy)); 799. 800. You("ring %s.", the(xname(obj))); 801. 802. if (Underwater || (u.uswallow && ordinary)) { 803. #ifdef AMIGA 804. amii_speaker( obj, "AhDhGqEqDhEhAqDqFhGw", AMII_MUFFLED_VOLUME ); 805. #endif 806. pline("But the sound is muffled."); 807. 808. } else if (invoking && ordinary) { 809. /* needs to be recharged... */ 810. pline("But it makes no sound."); 811. learno = TRUE; /* help player figure out why */ 812. 813. } else if (ordinary) { 814. #ifdef AMIGA 815. amii_speaker( obj, "ahdhgqeqdhehaqdqfhgw", AMII_MUFFLED_VOLUME ); 816. #endif 817. if (obj->cursed && !rn2(4) && 818. /* note: once any of them are gone, we stop all of them */ 819. !(mvitals[PM_WOOD_NYMPH].mvflags & G_GONE) && 820. !(mvitals[PM_WATER_NYMPH].mvflags & G_GONE) && 821. !(mvitals[PM_MOUNTAIN_NYMPH].mvflags & G_GONE) && 822. (mtmp = makemon(mkclass(S_NYMPH, 0), 823. u.ux, u.uy, NO_MINVENT)) != 0) { 824. You("summon %s!", a_monnam(mtmp)); 825. if (!obj_resists(obj, 93, 100)) { 826. pline("%s shattered!", Tobjnam(obj, "have")); 827. useup(obj); 828. *optr = 0; 829. } else switch (rn2(3)) { 830. default: 831. break; 832. case 1: 833. mon_adjust_speed(mtmp, 2, (struct obj *)0); 834. break; 835. case 2: /* no explanation; it just happens... */ 836. nomovemsg = ""; 837. nomul(-rnd(2)); 838. break; 839. } 840. } 841. wakem = TRUE; 842. 843. } else { 844. /* charged Bell of Opening */ 845. consume_obj_charge(obj, TRUE); 846. 847. if (u.uswallow) { 848. if (!obj->cursed) 849. (void) openit(); 850. else 851. pline(nothing_happens); 852. 853. } else if (obj->cursed) { 854. coord mm; 855. 856. mm.x = u.ux; 857. mm.y = u.uy; 858. mkundead(&mm, FALSE, NO_MINVENT); 859. wakem = TRUE; 860. 861. } else if (invoking) { 862. pline("%s an unsettling shrill sound...", 863. Tobjnam(obj, "issue")); 864. #ifdef AMIGA 865. amii_speaker( obj, "aefeaefeaefeaefeaefe", AMII_LOUDER_VOLUME ); 866. #endif 867. obj->age = moves; 868. learno = TRUE; 869. wakem = TRUE; 870. 871. } else if (obj->blessed) { 872. int res = 0; 873. 874. #ifdef AMIGA 875. amii_speaker( obj, "ahahahDhEhCw", AMII_SOFT_VOLUME ); 876. #endif 877. if (uchain) { 878. unpunish(); 879. res = 1; 880. } 881. res += openit(); 882. switch (res) { 883. case 0: pline(nothing_happens); break; 884. case 1: pline("%s opens...", Something); 885. learno = TRUE; break; 886. default: pline("Things open around you..."); 887. learno = TRUE; break; 888. } 889. 890. } else { /* uncursed */ 891. #ifdef AMIGA 892. amii_speaker( obj, "AeFeaeFeAefegw", AMII_OKAY_VOLUME ); 893. #endif 894. if (findit() != 0) learno = TRUE; 895. else pline(nothing_happens); 896. } 897. 898. } /* charged BofO */ 899. 900. if (learno) { 901. makeknown(BELL_OF_OPENING); 902. obj->known = 1; 903. } 904. if (wakem) wake_nearby(); 905. } 906. 907. STATIC_OVL void 908. use_candelabrum(obj) 909. register struct obj *obj; 910. { 911. const char *s = (obj->spe != 1) ? "candles" : "candle"; 912. 913. if(Underwater) { 914. You("cannot make fire under water."); 915. return; 916. } 917. if(obj->lamplit) { 918. You("snuff the %s.", s); 919. end_burn(obj, TRUE); 920. return; 921. } 922. if(obj->spe <= 0) { 923. pline("This %s has no %s.", xname(obj), s); 924. return; 925. } 926. if(u.uswallow || obj->cursed) { 927. if (!Blind) 928. pline_The("%s %s for a moment, then %s.", 929. s, vtense(s, "flicker"), vtense(s, "die")); 930. return; 931. } 932. if(obj->spe < 7) { 933. There("%s only %d %s in %s.", 934. vtense(s, "are"), obj->spe, s, the(xname(obj))); 935. if (!Blind) 936. pline("%s lit. %s dimly.", 937. obj->spe == 1 ? "It is" : "They are", 938. Tobjnam(obj, "shine")); 939. } else { 940. pline("%s's %s burn%s", The(xname(obj)), s, 941. (Blind ? "." : " brightly!")); 942. } 943. if (!invocation_pos(u.ux, u.uy)) { 944. pline_The("%s %s being rapidly consumed!", s, vtense(s, "are")); 945. obj->age /= 2; 946. } else { 947. if(obj->spe == 7) { 948. if (Blind) 949. pline("%s a strange warmth!", Tobjnam(obj, "radiate")); 950. else 951. pline("%s with a strange light!", Tobjnam(obj, "glow")); 952. } 953. obj->known = 1; 954. } 955. begin_burn(obj, FALSE); 956. } 957. 958. STATIC_OVL void 959. use_candle(optr) 960. struct obj **optr; 961. { 962. register struct obj *obj = *optr; 963. register struct obj *otmp; 964. const char *s = (obj->quan != 1) ? "candles" : "candle"; 965. char qbuf[QBUFSZ]; 966. 967. if(u.uswallow) { 968. You(no_elbow_room); 969. return; 970. } 971. if(Underwater) { 972. pline("Sorry, fire and water don't mix."); 973. return; 974. } 975. 976. otmp = carrying(CANDELABRUM_OF_INVOCATION); 977. /* [ALI] Artifact candles can't be attached to candelabrum 978. * (magic candles still can be). 979. */ 980. if(obj->oartifact || !otmp || otmp->spe == 7) { 981. use_lamp(obj); 982. return; 983. } 984. 985. Sprintf(qbuf, "Attach %s", the(xname(obj))); 986. Sprintf(eos(qbuf), " to %s?", 987. safe_qbuf(qbuf, sizeof(" to ?"), the(xname(otmp)), 988. the(simple_typename(otmp->otyp)), "it")); 989. if(yn(qbuf) == 'n') { 990. if (!obj->lamplit) 991. You("try to light %s...", the(xname(obj))); 992. use_lamp(obj); 993. return; 994. } else { 995. if ((long)otmp->spe + obj->quan > 7L) 996. obj = splitobj(obj, 7L - (long)otmp->spe); 997. else *optr = 0; 998. You("attach %ld%s %s to %s.", 999. obj->quan, !otmp->spe ? "" : " more", 1000. s, the(xname(otmp))); 1001. if (obj->otyp == MAGIC_CANDLE) { 1002. if (obj->lamplit) 1003. pline_The("new %s %s very ordinary.", s, 1004. vtense(s, "look")); 1005. else 1006. pline("%s very ordinary.", 1007. (obj->quan > 1L) ? "They look" : "It looks"); 1008. if (!otmp->spe) 1009. otmp->age = 600L; 1010. } else 1011. if (!otmp->spe || otmp->age > obj->age) 1012. otmp->age = obj->age; 1013. otmp->spe += (int)obj->quan; 1014. if (otmp->lamplit && !obj->lamplit) 1015. pline_The("new %s magically %s!", s, vtense(s, "ignite")); 1016. else if (!otmp->lamplit && obj->lamplit) 1017. pline("%s out.", (obj->quan > 1L) ? "They go" : "It goes"); 1018. if (obj->unpaid) 1019. verbalize("You %s %s, you bought %s!", 1020. otmp->lamplit ? "burn" : "use", 1021. (obj->quan > 1L) ? "them" : "it", 1022. (obj->quan > 1L) ? "them" : "it"); 1023. if (obj->quan < 7L && otmp->spe == 7) 1024. pline("%s now has seven%s candles attached.", 1025. The(xname(otmp)), otmp->lamplit ? " lit" : ""); 1026. /* candelabrum's light range might increase */ 1027. if (otmp->lamplit) obj_merge_light_sources(otmp, otmp); 1028. /* candles are no longer a separate light source */ 1029. if (obj->lamplit) end_burn(obj, TRUE); 1030. /* candles are now gone */ 1031. useupall(obj); 1032. } 1033. } 1034. 1035. boolean 1036. snuff_candle(otmp) /* call in drop, throw, and put in box, etc. */ 1037. register struct obj *otmp; 1038. { 1039. register boolean candle = Is_candle(otmp); 1040. 1041. if (((candle && otmp->oartifact != ART_CANDLE_OF_ETERNAL_FLAME) 1042. || otmp->otyp == CANDELABRUM_OF_INVOCATION) && 1043. otmp->lamplit) { 1044. char buf[BUFSZ]; 1045. xchar x, y; 1046. register boolean many = candle ? otmp->quan > 1L : otmp->spe > 1; 1047. 1048. (void) get_obj_location(otmp, &x, &y, 0); 1049. if (otmp->where == OBJ_MINVENT ? cansee(x,y) : !Blind) 1050. pline("%s %scandle%s flame%s extinguished.", 1051. Shk_Your(buf, otmp), 1052. (candle ? "" : "candelabrum's "), 1053. (many ? "s'" : "'s"), (many ? "s are" : " is")); 1054. end_burn(otmp, TRUE); 1055. return(TRUE); 1056. } 1057. return(FALSE); 1058. } 1059. 1060. /* called when lit lamp is hit by water or put into a container or 1061. you've been swallowed by a monster; obj might be in transit while 1062. being thrown or dropped so don't assume that its location is valid */ 1063. boolean 1064. snuff_lit(obj) 1065. struct obj *obj; 1066. { 1067. xchar x, y; 1068. 1069. if (obj->lamplit) { 1070. if (artifact_light(obj)) return FALSE; /* Artifact lights are never snuffed */ 1071. if (obj->otyp == OIL_LAMP || obj->otyp == MAGIC_LAMP || 1072. obj->otyp == BRASS_LANTERN || obj->otyp == POT_OIL || 1073. obj->otyp == TORCH) { 1074. (void) get_obj_location(obj, &x, &y, 0); 1075. if (obj->where == OBJ_MINVENT ? cansee(x,y) : !Blind) 1076. pline("%s %s out!", Yname2(obj), otense(obj, "go")); 1077. end_burn(obj, TRUE); 1078. return TRUE; 1079. } 1080. if (snuff_candle(obj)) return TRUE; 1081. } 1082. return FALSE; 1083. } 1084. 1085. /* Called when potentially lightable object is affected by fire_damage(). 1086. Return TRUE if object was lit and FALSE otherwise --ALI */ 1087. boolean 1088. catch_lit(obj) 1089. struct obj *obj; 1090. { 1091. xchar x, y; 1092. 1093. if (!obj->lamplit && (obj->otyp == MAGIC_LAMP || ignitable(obj))) { 1094. if ((obj->otyp == MAGIC_LAMP || 1095. obj->otyp == CANDELABRUM_OF_INVOCATION) && 1096. obj->spe == 0) 1097. return FALSE; 1098. else if (obj->otyp != MAGIC_LAMP && obj->age == 0) 1099. return FALSE; 1100. if (!get_obj_location(obj, &x, &y, 0)) 1101. return FALSE; 1102. if (obj->otyp == CANDELABRUM_OF_INVOCATION && obj->cursed) 1103. return FALSE; 1104. if ((obj->otyp == OIL_LAMP || obj->otyp == MAGIC_LAMP || 1105. obj->otyp == BRASS_LANTERN) && obj->cursed && !rn2(2)) 1106. return FALSE; 1107. if (obj->where == OBJ_MINVENT ? cansee(x,y) : !Blind) 1108. pline("%s %s light!", Yname2(obj), otense(obj, "catch")); 1109. if (obj->otyp == POT_OIL) makeknown(obj->otyp); 1110. if (obj->unpaid && costly_spot(u.ux, u.uy) && (obj->where == OBJ_INVENT)) { 1111. /* if it catches while you have it, then it's your tough luck */ 1112. check_unpaid(obj); 1113. verbalize("That's in addition to the cost of %s %s, of course.", 1114. Yname2(obj), obj->quan == 1 ? "itself" : "themselves"); 1115. bill_dummy_object(obj); 1116. } 1117. begin_burn(obj, FALSE); 1118. return TRUE; 1119. } 1120. return FALSE; 1121. } 1122. 1123. STATIC_OVL void 1124. use_lamp(obj) 1125. struct obj *obj; 1126. { 1127. char buf[BUFSZ]; 1128. char qbuf[QBUFSZ]; 1129. 1130. if(Underwater) { 1131. pline("This is not a diving lamp."); 1132. return; 1133. } 1134. if(obj->lamplit) { 1135. if(obj->otyp == OIL_LAMP || obj->otyp == MAGIC_LAMP || 1136. obj->otyp == BRASS_LANTERN) { 1137. pline("%s lamp is now off.", Shk_Your(buf, obj)); 1138. #ifdef LIGHTSABERS 1139. } else if(is_lightsaber(obj)) { 1140. if (obj->otyp == RED_DOUBLE_LIGHTSABER) { 1141. /* Do we want to activate dual bladed mode? */ 1142. if (!obj->altmode && (!obj->cursed || rn2(4))) { 1143. You("ignite the second blade of %s.", yname(obj)); 1144. obj->altmode = TRUE; 1145. return; 1146. } else obj->altmode = FALSE; 1147. } 1148. lightsaber_deactivate(obj, TRUE); 1149. return; 1150. #endif 1151. } else if (artifact_light(obj)) { 1152. You_cant("snuff out %s.", yname(obj)); 1153. return; 1154. } else { 1155. You("snuff out %s.", yname(obj)); 1156. } 1157. end_burn(obj, TRUE); 1158. return; 1159. } 1160. /* magic lamps with an spe == 0 (wished for) cannot be lit */ 1161. if ((!Is_candle(obj) && obj->age == 0) 1162. || (obj->otyp == MAGIC_LAMP && obj->spe == 0)) { 1163. if ((obj->otyp == BRASS_LANTERN) 1164. #ifdef LIGHTSABERS 1165. || is_lightsaber(obj) 1166. #endif 1167. ) 1168. Your("%s has run out of power.", xname(obj)); 1169. else if (obj->otyp == TORCH) { 1170. Your("torch has burnt out and cannot be relit."); 1171. } 1172. else pline("This %s has no oil.", xname(obj)); 1173. return; 1174. } 1175. if (obj->cursed && !rn2(2)) { 1176. pline("%s for a moment, then %s.", 1177. Tobjnam(obj, "flicker"), otense(obj, "die")); 1178. } else { 1179. if(obj->otyp == OIL_LAMP || obj->otyp == MAGIC_LAMP || 1180. obj->otyp == BRASS_LANTERN) { 1181. check_unpaid(obj); 1182. pline("%s lamp is now on.", Shk_Your(buf, obj)); 1183. } else if (obj->otyp == TORCH) { 1184. check_unpaid(obj); 1185. pline("%s flame%s burn%s%s", 1186. s_suffix(Yname2(obj)), 1187. plur(obj->quan), 1188. obj->quan > 1L ? "" : "s", 1189. Blind ? "." : " brightly!"); 1190. #ifdef LIGHTSABERS 1191. } else if (is_lightsaber(obj)) { 1192. /* WAC -- lightsabers */ 1193. /* you can see the color of the blade */ 1194. 1195. if (!Blind) makeknown(obj->otyp); 1196. You("ignite %s.", yname(obj)); 1197. unweapon = FALSE; 1198. #endif 1199. } else { /* candle(s) */ 1200. Sprintf(qbuf, "Light all of %s?", the(xname(obj))); 1201. if (obj->quan > 1L && (yn(qbuf) == 'n')) { 1202. /* Check if player wants to light all the candles */ 1203. struct obj *rest; /* the remaining candles */ 1204. rest = splitobj(obj, obj->quan - 1L); 1205. obj_extract_self(rest); /* free from inv */ 1206. obj->spe++; /* this prevents merging */ 1207. (void)hold_another_object(rest, "You drop %s!", 1208. doname(rest), (const char *)0); 1209. obj->spe--; 1210. } 1211. pline("%s flame%s %s%s", 1212. s_suffix(Yname2(obj)), 1213. plur(obj->quan), otense(obj, "burn"), 1214. Blind ? "." : " brightly!"); 1215. if (obj->unpaid && costly_spot(u.ux, u.uy) && 1216. obj->otyp != MAGIC_CANDLE) { 1217. const char *ithem = obj->quan > 1L ? "them" : "it"; 1218. verbalize("You burn %s, you bought %s!", ithem, ithem); 1219. bill_dummy_object(obj); 1220. } 1221. } 1222. begin_burn(obj, FALSE); 1223. } 1224. } 1225. 1226. /* MRKR: Torches */ 1227. 1228. STATIC_OVL int 1229. use_torch(obj) 1230. struct obj *obj; 1231. { 1232. struct obj *otmp = NULL; 1233. if (u.uswallow) { 1234. You(no_elbow_room); 1235. return 0; 1236. } 1237. if (Underwater) { 1238. pline("Sorry, fire and water don't mix."); 1239. return 0; 1240. } 1241. if (obj->quan > 1L) { 1242. otmp = obj; 1243. obj = splitobj(otmp, 1L); 1244. obj_extract_self(otmp); /* free from inv */ 1245. } 1246. /* You can use a torch in either wielded weapon slot */ 1247. if (obj != uwep && (obj != uswapwep || !u.twoweap)) 1248. if (!wield_tool(obj, (const char *)0)) return 0; 1249. use_lamp(obj); 1250. /* shouldn't merge */ 1251. if (otmp) 1252. otmp = hold_another_object(otmp, "You drop %s!", 1253. doname(otmp), (const char *)0); 1254. return 1; 1255. } 1256. 1257. STATIC_OVL void 1258. light_cocktail(obj) 1259. struct obj *obj; /* obj is a potion of oil or a stick of dynamite */ 1260. { 1261. char buf[BUFSZ]; 1262. const char *objnam = 1263. #ifdef FIREARMS 1264. obj->otyp == POT_OIL ? "potion" : "stick"; 1265. #else 1266. "potion"; 1267. #endif 1268. 1269. if (u.uswallow) { 1270. You(no_elbow_room); 1271. return; 1272. } 1273. 1274. if(Underwater) { 1275. You("can't light this underwater!"); 1276. return; 1277. } 1278. 1279. if (obj->lamplit) { 1280. You("snuff the lit %s.", objnam); 1281. end_burn(obj, TRUE); 1282. /* 1283. * Free & add to re-merge potion. This will average the 1284. * age of the potions. Not exactly the best solution, 1285. * but its easy. 1286. */ 1287. freeinv(obj); 1288. (void) addinv(obj); 1289. return; 1290. } else if (Underwater) { 1291. There("is not enough oxygen to sustain a fire."); 1292. return; 1293. } 1294. 1295. You("light %s %s.%s", shk_your(buf, obj), objnam, 1296. Blind ? "" : " It gives off a dim light."); 1297. if (obj->unpaid && costly_spot(u.ux, u.uy)) { 1298. /* Normally, we shouldn't both partially and fully charge 1299. * for an item, but (Yendorian Fuel) Taxes are inevitable... 1300. */ 1301. #ifdef FIREARMS 1302. if (obj->otyp != STICK_OF_DYNAMITE) { 1303. #endif 1304. check_unpaid(obj); 1305. verbalize("That's in addition to the cost of the potion, of course."); 1306. #ifdef FIREARMS 1307. } else { 1308. const char *ithem = obj->quan > 1L ? "them" : "it"; 1309. verbalize("You burn %s, you bought %s!", ithem, ithem); 1310. } 1311. #endif 1312. bill_dummy_object(obj); 1313. } 1314. makeknown(obj->otyp); 1315. #ifdef FIREARMS 1316. if (obj->otyp == STICK_OF_DYNAMITE) obj->yours=TRUE; 1317. #endif 1318. 1319. if (obj->quan > 1L) { 1320. obj = splitobj(obj, 1L); 1321. begin_burn(obj, FALSE); /* burn before free to get position */ 1322. obj_extract_self(obj); /* free from inv */ 1323. 1324. /* shouldn't merge */ 1325. obj = hold_another_object(obj, "You drop %s!", 1326. doname(obj), (const char *)0); 1327. } else 1328. begin_burn(obj, FALSE); 1329. } 1330. 1331. static NEARDATA const char cuddly[] = { TOOL_CLASS, GEM_CLASS, 0 }; 1332. 1333. int 1334. dorub() 1335. { 1336. struct obj *obj = getobj(cuddly, "rub"); 1337. 1338. if (obj && obj->oclass == GEM_CLASS) { 1339. if (is_graystone(obj)) { 1340. use_stone(obj); 1341. return 1; 1342. } else { 1343. pline("Sorry, I don't know how to use that."); 1344. return 0; 1345. } 1346. } 1347. 1348. if (!obj || !wield_tool(obj, "rub")) return 0; 1349. 1350. /* now uwep is obj */ 1351. if (uwep->otyp == MAGIC_LAMP) { 1352. if (uwep->spe > 0 && !rn2(3)) { 1353. check_unpaid_usage(uwep, TRUE); /* unusual item use */ 1354. djinni_from_bottle(uwep); 1355. makeknown(MAGIC_LAMP); 1356. uwep->otyp = OIL_LAMP; 1357. uwep->spe = 0; /* for safety */ 1358. uwep->age = rn1(500,1000); 1359. if (uwep->lamplit) begin_burn(uwep, TRUE); 1360. update_inventory(); 1361. } else if (rn2(2) && !Blind) 1362. You("see a puff of smoke."); 1363. else pline(nothing_happens); 1364. } else if (obj->otyp == BRASS_LANTERN) { 1365. /* message from Adventure */ 1366. pline("Rubbing the electric lamp is not particularly rewarding."); 1367. pline("Anyway, nothing exciting happens."); 1368. } else pline(nothing_happens); 1369. return 1; 1370. } 1371. 1372. int 1373. dojump() 1374. { 1375. /* Physical jump */ 1376. return jump(0); 1377. } 1378. 1379. int 1380. jump(magic) 1381. int magic; /* 0=Physical, otherwise skill level */ 1382. { 1383. coord cc; 1384. 1385. if (!magic && (nolimbs(youmonst.data) || slithy(youmonst.data))) { 1386. /* normally (nolimbs || slithy) implies !Jumping, 1387. but that isn't necessarily the case for knights */ 1388. You_cant("jump; you have no legs!"); 1389. return 0; 1390. } else if (!magic && !Jumping) { 1391. You_cant("jump very far."); 1392. return 0; 1393. } else if (u.uswallow) { 1394. if (magic) { 1395. You("bounce around a little."); 1396. return 1; 1397. } else { 1398. pline("You've got to be kidding!"); 1399. return 0; 1400. } 1401. return 0; 1402. } else if (u.uinwater) { 1403. if (magic) { 1404. You("swish around a little."); 1405. return 1; 1406. } else { 1407. pline("This calls for swimming, not jumping!"); 1408. return 0; 1409. } 1410. return 0; 1411. } else if (u.ustuck) { 1412. if (u.ustuck->mtame && !Conflict && !u.ustuck->mconf) { 1413. You("pull free from %s.", mon_nam(u.ustuck)); 1414. setustuck(0); 1415. return 1; 1416. } 1417. if (magic) { 1418. You("writhe a little in the grasp of %s!", mon_nam(u.ustuck)); 1419. return 1; 1420. } else { 1421. You("cannot escape from %s!", mon_nam(u.ustuck)); 1422. return 0; 1423. } 1424. 1425. return 0; 1426. } else if (Levitation || Is_airlevel(&u.uz) || Is_waterlevel(&u.uz)) { 1427. if (magic) { 1428. You("flail around a little."); 1429. return 1; 1430. } else { 1431. You("don't have enough traction to jump."); 1432. return 0; 1433. } 1434. } else if (!magic && near_capacity() > UNENCUMBERED) { 1435. You("are carrying too much to jump!"); 1436. return 0; 1437. } else if (!magic && (u.uhunger <= 100 || ACURR(A_STR) < 6)) { 1438. You("lack the strength to jump!"); 1439. return 0; 1440. } else if (Wounded_legs) { 1441. long wl = (EWounded_legs & BOTH_SIDES); 1442. const char *bp = body_part(LEG); 1443. 1444. if (wl == BOTH_SIDES) bp = makeplural(bp); 1445. #ifdef STEED 1446. if (u.usteed) 1447. pline("%s is in no shape for jumping.", Monnam(u.usteed)); 1448. else 1449. #endif 1450. Your("%s%s %s in no shape for jumping.", 1451. (wl == LEFT_SIDE) ? "left " : 1452. (wl == RIGHT_SIDE) ? "right " : "", 1453. bp, (wl == BOTH_SIDES) ? "are" : "is"); 1454. return 0; 1455. } 1456. #ifdef STEED 1457. else if (u.usteed && u.utrap) { 1458. pline("%s is stuck in a trap.", Monnam(u.usteed)); 1459. return (0); 1460. } 1461. #endif 1462. 1463. pline("Where do you want to jump?"); 1464. cc.x = u.ux; 1465. cc.y = u.uy; 1466. if (getpos(&cc, TRUE, "the desired position") < 0) 1467. return 0; /* user pressed ESC */ 1468. if (!magic && !(HJumping & ~INTRINSIC) && !EJumping && 1469. distu(cc.x, cc.y) != 5) { 1470. /* The Knight jumping restriction still applies when riding a 1471. * horse. After all, what shape is the knight piece in chess? 1472. */ 1473. pline("Illegal move!"); 1474. return 0; 1475. } else if (distu(cc.x, cc.y) > (magic ? 6+magic*3 : 9)) { 1476. pline("Too far!"); 1477. return 0; 1478. } else if (!cansee(cc.x, cc.y)) { 1479. You("cannot see where to land!"); 1480. return 0; 1481. } else if (!isok(cc.x, cc.y)) { 1482. You("cannot jump there!"); 1483. return 0; 1484. } else { 1485. coord uc; 1486. int range, temp; 1487. 1488. if(u.utrap) 1489. switch(u.utraptype) { 1490. case TT_BEARTRAP: { 1491. register long side = rn2(3) ? LEFT_SIDE : RIGHT_SIDE; 1492. You("rip yourself free of the bear trap! Ouch!"); 1493. #ifdef STEED 1494. if (!u.usteed) 1495. #endif 1496. losehp(rnd(10), "jumping out of a bear trap", KILLED_BY); 1497. set_wounded_legs(side, rn1(1000,500)); 1498. break; 1499. } 1500. case TT_PIT: 1501. You("leap from the pit!"); 1502. break; 1503. case TT_WEB: 1504. You("tear the web apart as you pull yourself free!"); 1505. deltrap(t_at(u.ux,u.uy)); 1506. break; 1507. case TT_LAVA: 1508. You("pull yourself above the lava!"); 1509. u.utrap = 0; 1510. return 1; 1511. case TT_INFLOOR: 1512. You("strain your %s, but you're still stuck in the floor.", 1513. makeplural(body_part(LEG))); 1514. set_wounded_legs(LEFT_SIDE, rn1(10, 11)); 1515. set_wounded_legs(RIGHT_SIDE, rn1(10, 11)); 1516. return 1; 1517. } 1518. 1519. /* 1520. * Check the path from uc to cc, calling hurtle_step at each 1521. * location. The final position actually reached will be 1522. * in cc. 1523. */ 1524. uc.x = u.ux; 1525. uc.y = u.uy; 1526. /* calculate max(abs(dx), abs(dy)) as the range */ 1527. range = cc.x - uc.x; 1528. if (range < 0) range = -range; 1529. temp = cc.y - uc.y; 1530. if (temp < 0) temp = -temp; 1531. if (range < temp) 1532. range = temp; 1533. (void) walk_path(&uc, &cc, hurtle_step, (genericptr_t)&range); 1534. 1535. /* A little Sokoban guilt... */ 1536. if (In_sokoban(&u.uz)) 1537. change_luck(-1); 1538. 1539. teleds(cc.x, cc.y, TRUE); 1540. nomul(-1); 1541. nomovemsg = ""; 1542. morehungry(rnd(25)); 1543. return 1; 1544. } 1545. } 1546. 1547. boolean 1548. tinnable(corpse) 1549. struct obj *corpse; 1550. { 1551. if (corpse->otyp != CORPSE) return 0; 1552. if (corpse->oeaten) return 0; 1553. if (corpse->odrained) return 0; 1554. if (!mons[corpse->corpsenm].cnutrit) return 0; 1555. return 1; 1556. } 1557. 1558. STATIC_OVL void 1559. use_tinning_kit(obj) 1560. register struct obj *obj; 1561. { 1562. register struct obj *corpse, *can; 1563. /* 1564. char *badmove; 1565. */ 1566. /* This takes only 1 move. If this is to be changed to take many 1567. * moves, we've got to deal with decaying corpses... 1568. */ 1569. if (obj->spe <= 0) { 1570. You("seem to be out of tins."); 1571. return; 1572. } 1573. if (!(corpse = getobj((const char *)tinnables, "tin"))) return; 1574. if (corpse->otyp == CORPSE && (corpse->oeaten || corpse->odrained)) { 1575. You("cannot tin %s which is partly eaten.",something); 1576. return; 1577. } 1578. if (!tinnable(corpse)) { 1579. You_cant("tin that!"); 1580. return; 1581. } 1582. if (touch_petrifies(&mons[corpse->corpsenm]) 1583. && !Stone_resistance && !uarmg) { 1584. char kbuf[BUFSZ]; 1585. 1586. if (poly_when_stoned(youmonst.data)) 1587. You("tin %s without wearing gloves.", 1588. an(mons[corpse->corpsenm].mname)); 1589. else { 1590. pline("Tinning %s without wearing gloves is a fatal mistake...", 1591. an(mons[corpse->corpsenm].mname)); 1592. Sprintf(kbuf, "trying to tin %s without gloves", 1593. an(mons[corpse->corpsenm].mname)); 1594. } 1595. instapetrify(kbuf); 1596. } 1597. if (is_rider(&mons[corpse->corpsenm])) { 1598. (void) revive_corpse(corpse, FALSE); 1599. verbalize("Yes... But War does not preserve its enemies..."); 1600. return; 1601. } 1602. if (mons[corpse->corpsenm].cnutrit == 0) { 1603. pline("That's too insubstantial to tin."); 1604. return; 1605. } 1606. consume_obj_charge(obj, TRUE); 1607. 1608. if ((can = mksobj(TIN, FALSE, FALSE)) != 0) { 1609. static const char you_buy_it[] = "You tin it, you bought it!"; 1610. 1611. can->corpsenm = corpse->corpsenm; 1612. can->cursed = obj->cursed; 1613. can->blessed = obj->blessed; 1614. can->owt = weight(can); 1615. can->known = 1; 1616. #ifdef EATEN_MEMORY 1617. /* WAC You know the type of tinned corpses */ 1618. if (mvitals[corpse->corpsenm].eaten < 255) 1619. mvitals[corpse->corpsenm].eaten++; 1620. #endif 1621. can->spe = -1; /* Mark tinned tins. No spinach allowed... */ 1622. if (carried(corpse)) { 1623. if (corpse->unpaid) 1624. verbalize(you_buy_it); 1625. useup(corpse); 1626. } else if (mcarried(corpse)) { 1627. m_useup(corpse->ocarry, corpse); 1628. } else { 1629. if (costly_spot(corpse->ox, corpse->oy) && !corpse->no_charge) 1630. verbalize(you_buy_it); 1631. useupf(corpse, 1L); 1632. } 1633. can = hold_another_object(can, "You make, but cannot pick up, %s.", 1634. doname(can), (const char *)0); 1635. } else impossible("Tinning failed."); 1636. } 1637. 1638. 1639. void 1640. use_unicorn_horn(obj) 1641. struct obj *obj; 1642. { 1643. #define PROP_COUNT 6 /* number of properties we're dealing with */ 1644. #define ATTR_COUNT (A_MAX*3) /* number of attribute points we might fix */ 1645. int idx, val, val_limit, 1646. trouble_count, unfixable_trbl, did_prop, did_attr; 1647. int trouble_list[PROP_COUNT + ATTR_COUNT]; 1648. int chance; /* KMH */ 1649. 1650. if (obj && obj->cursed) { 1651. long lcount = (long) rnd(100); 1652. 1653. switch (rn2(6)) { 1654. case 0: make_sick(Sick ? Sick/3L + 1L : (long)rn1(ACURR(A_CON),20), 1655. xname(obj), TRUE, SICK_NONVOMITABLE); 1656. break; 1657. case 1: make_blinded(Blinded + lcount, TRUE); 1658. break; 1659. case 2: if (!Confusion) 1660. You("suddenly feel %s.", 1661. Hallucination ? "trippy" : "confused"); 1662. make_confused(HConfusion + lcount, TRUE); 1663. break; 1664. case 3: make_stunned(HStun + lcount, TRUE); 1665. break; 1666. case 4: (void) adjattrib(rn2(A_MAX), -1, FALSE); 1667. break; 1668. case 5: (void) make_hallucinated(HHallucination + lcount, TRUE, 0L); 1669. break; 1670. } 1671. return; 1672. } 1673. 1674. /* 1675. * Entries in the trouble list use a very simple encoding scheme. 1676. */ 1677. #define prop2trbl(X) ((X) + A_MAX) 1678. #define attr2trbl(Y) (Y) 1679. #define prop_trouble(X) trouble_list[trouble_count++] = prop2trbl(X) 1680. #define attr_trouble(Y) trouble_list[trouble_count++] = attr2trbl(Y) 1681. 1682. trouble_count = unfixable_trbl = did_prop = did_attr = 0; 1683. 1684. /* collect property troubles */ 1685. if (Sick) prop_trouble(SICK); 1686. if (Blinded > (long)u.ucreamed) prop_trouble(BLINDED); 1687. if (HHallucination) prop_trouble(HALLUC); 1688. if (Vomiting) prop_trouble(VOMITING); 1689. if (HConfusion) prop_trouble(CONFUSION); 1690. if (HStun) prop_trouble(STUNNED); 1691. 1692. unfixable_trbl = unfixable_trouble_count(TRUE); 1693. 1694. /* collect attribute troubles */ 1695. for (idx = 0; idx < A_MAX; idx++) { 1696. val_limit = AMAX(idx); 1697. /* don't recover strength lost from hunger */ 1698. if (idx == A_STR && u.uhs >= WEAK) val_limit--; 1699. /* don't recover more than 3 points worth of any attribute */ 1700. if (val_limit > ABASE(idx) + 3) val_limit = ABASE(idx) + 3; 1701. 1702. for (val = ABASE(idx); val < val_limit; val++) 1703. attr_trouble(idx); 1704. /* keep track of unfixed trouble, for message adjustment below */ 1705. unfixable_trbl += (AMAX(idx) - val_limit); 1706. } 1707. 1708. if (trouble_count == 0) { 1709. pline(nothing_happens); 1710. return; 1711. } else if (trouble_count > 1) { /* shuffle */ 1712. int i, j, k; 1713. 1714. for (i = trouble_count - 1; i > 0; i--) 1715. if ((j = rn2(i + 1)) != i) { 1716. k = trouble_list[j]; 1717. trouble_list[j] = trouble_list[i]; 1718. trouble_list[i] = k; 1719. } 1720. } 1721. 1722. #if 0 /* Old NetHack success rate */ 1723. /* 1724. * Chances for number of troubles to be fixed 1725. * 0 1 2 3 4 5 6 7 1726. * blessed: 22.7% 22.7% 19.5% 15.4% 10.7% 5.7% 2.6% 0.8% 1727. * uncursed: 35.4% 35.4% 22.9% 6.3% 0 0 0 0 1728. */ 1729. val_limit = rn2( d(2, (obj && obj->blessed) ? 4 : 2) ); 1730. if (val_limit > trouble_count) val_limit = trouble_count; 1731. #else /* KMH's new success rate */ 1732. /* 1733. * blessed: Tries all problems, each with chance given below. 1734. * uncursed: Tries one problem, with chance given below. 1735. * ENCHANT +0 or less +1 +2 +3 +4 +5 +6 or more 1736. * CHANCE 30% 40% 50% 60% 70% 80% 90% 1737. */ 1738. val_limit = (obj && obj->blessed) ? trouble_count : 1; 1739. if (obj && obj->spe > 0) 1740. chance = (obj->spe < 6) ? obj->spe+3 : 9; 1741. else 1742. chance = 3; 1743. #endif 1744. 1745. /* fix [some of] the troubles */ 1746. for (val = 0; val < val_limit; val++) { 1747. idx = trouble_list[val]; 1748. 1749. if (rn2(10) < chance) /* KMH */ 1750. switch (idx) { 1751. case prop2trbl(SICK): 1752. make_sick(0L, (char *) 0, TRUE, SICK_ALL); 1753. did_prop++; 1754. break; 1755. case prop2trbl(BLINDED): 1756. make_blinded((long)u.ucreamed, TRUE); 1757. did_prop++; 1758. break; 1759. case prop2trbl(HALLUC): 1760. (void) make_hallucinated(0L, TRUE, 0L); 1761. did_prop++; 1762. break; 1763. case prop2trbl(VOMITING): 1764. make_vomiting(0L, TRUE); 1765. did_prop++; 1766. break; 1767. case prop2trbl(CONFUSION): 1768. make_confused(0L, TRUE); 1769. did_prop++; 1770. break; 1771. case prop2trbl(STUNNED): 1772. make_stunned(0L, TRUE); 1773. did_prop++; 1774. break; 1775. default: 1776. if (idx >= 0 && idx < A_MAX) { 1777. ABASE(idx) += 1; 1778. did_attr++; 1779. } else 1780. panic("use_unicorn_horn: bad trouble? (%d)", idx); 1781. break; 1782. } 1783. } 1784. 1785. if (did_attr) 1786. pline("This makes you feel %s!", 1787. (did_prop + did_attr) == (trouble_count + unfixable_trbl) ? 1788. "great" : "better"); 1789. else if (!did_prop) 1790. pline("Nothing seems to happen."); 1791. 1792. flags.botl = (did_attr || did_prop); 1793. #undef PROP_COUNT 1794. #undef ATTR_COUNT 1795. #undef prop2trbl 1796. #undef attr2trbl 1797. #undef prop_trouble 1798. #undef attr_trouble 1799. } 1800. 1801. /* 1802. * Timer callback routine: turn figurine into monster 1803. */ 1804. void 1805. fig_transform(arg, timeout) 1806. genericptr_t arg; 1807. long timeout; 1808. { 1809. struct obj *figurine = (struct obj *)arg; 1810. struct monst *mtmp; 1811. coord cc; 1812. boolean cansee_spot, silent, okay_spot; 1813. boolean redraw = FALSE; 1814. char monnambuf[BUFSZ], carriedby[BUFSZ]; 1815. 1816. if (!figurine) { 1817. #ifdef DEBUG 1818. pline("null figurine in fig_transform()"); 1819. #endif 1820. return; 1821. } 1822. silent = (timeout != monstermoves); /* happened while away */ 1823. okay_spot = get_obj_location(figurine, &cc.x, &cc.y, 0); 1824. if (figurine->where == OBJ_INVENT || 1825. figurine->where == OBJ_MINVENT) 1826. okay_spot = enexto(&cc, cc.x, cc.y, 1827. &mons[figurine->corpsenm]); 1828. if (!okay_spot || 1829. !figurine_location_checks(figurine,&cc, TRUE)) { 1830. /* reset the timer to try again later */ 1831. (void) start_timer((long)rnd(5000), TIMER_OBJECT, 1832. FIG_TRANSFORM, (genericptr_t)figurine); 1833. return; 1834. } 1835. 1836. cansee_spot = cansee(cc.x, cc.y); 1837. mtmp = make_familiar(figurine, cc.x, cc.y, TRUE); 1838. if (mtmp) { 1839. Sprintf(monnambuf, "%s",an(m_monnam(mtmp))); 1840. switch (figurine->where) { 1841. case OBJ_INVENT: 1842. if (Blind) 1843. You_feel("%s %s from your pack!", something, 1844. locomotion(mtmp->data,"drop")); 1845. else 1846. You("see %s %s out of your pack!", 1847. monnambuf, 1848. locomotion(mtmp->data,"drop")); 1849. break; 1850. 1851. case OBJ_FLOOR: 1852. if (cansee_spot && !silent) { 1853. You("suddenly see a figurine transform into %s!", 1854. monnambuf); 1855. redraw = TRUE; /* update figurine's map location */ 1856. } 1857. break; 1858. 1859. case OBJ_MINVENT: 1860. if (cansee_spot && !silent) { 1861. struct monst *mon; 1862. mon = figurine->ocarry; 1863. /* figurine carring monster might be invisible */ 1864. if (canseemon(figurine->ocarry)) { 1865. Sprintf(carriedby, "%s pack", 1866. s_suffix(a_monnam(mon))); 1867. } 1868. else if (is_pool(mon->mx, mon->my)) 1869. Strcpy(carriedby, "empty water"); 1870. else 1871. Strcpy(carriedby, "thin air"); 1872. You("see %s %s out of %s!", monnambuf, 1873. locomotion(mtmp->data, "drop"), carriedby); 1874. } 1875. break; 1876. #if 0 1877. case OBJ_MIGRATING: 1878. break; 1879. #endif 1880. 1881. default: 1882. impossible("figurine came to life where? (%d)", 1883. (int)figurine->where); 1884. break; 1885. } 1886. } 1887. /* free figurine now */ 1888. obj_extract_self(figurine); 1889. obfree(figurine, (struct obj *)0); 1890. if (redraw) newsym(cc.x, cc.y); 1891. } 1892. 1893. STATIC_OVL boolean 1894. figurine_location_checks(obj, cc, quietly) 1895. struct obj *obj; 1896. coord *cc; 1897. boolean quietly; 1898. { 1899. xchar x,y; 1900. 1901. if (carried(obj) && u.uswallow) { 1902. if (!quietly) 1903. You("don't have enough room in here."); 1904. return FALSE; 1905. } 1906. x = cc->x; y = cc->y; 1907. if (!isok(x,y)) { 1908. if (!quietly) 1909. You("cannot put the figurine there."); 1910. return FALSE; 1911. } 1912. if (IS_ROCK(levl[x][y].typ) && 1913. !(passes_walls(&mons[obj->corpsenm]) && may_passwall(x,y))) { 1914. if (!quietly) 1915. You("cannot place a figurine in %s!", 1916. IS_TREE(levl[x][y].typ) ? "a tree" : "solid rock"); 1917. return FALSE; 1918. } 1919. if (sobj_at(BOULDER,x,y) && !passes_walls(&mons[obj->corpsenm]) 1920. && !throws_rocks(&mons[obj->corpsenm])) { 1921. if (!quietly) 1922. You("cannot fit the figurine on the boulder."); 1923. return FALSE; 1924. } 1925. return TRUE; 1926. } 1927. 1928. STATIC_OVL void 1929. use_figurine(optr) 1930. struct obj **optr; 1931. { 1932. register struct obj *obj = *optr; 1933. xchar x, y; 1934. coord cc; 1935. 1936. if (u.uswallow) { 1937. /* can't activate a figurine while swallowed */ 1938. if (!figurine_location_checks(obj, (coord *)0, FALSE)) 1939. return; 1940. } 1941. if(!getdir((char *)0)) { 1942. flags.move = multi = 0; 1943. return; 1944. } 1945. x = u.ux + u.dx; y = u.uy + u.dy; 1946. cc.x = x; cc.y = y; 1947. /* Passing FALSE arg here will result in messages displayed */ 1948. if (!figurine_location_checks(obj, &cc, FALSE)) return; 1949. You("%s and it transforms.", 1950. (u.dx||u.dy) ? "set the figurine beside you" : 1951. (Is_airlevel(&u.uz) || Is_waterlevel(&u.uz) || 1952. is_pool(cc.x, cc.y)) ? 1953. "release the figurine" : 1954. (u.dz < 0 ? 1955. "toss the figurine into the air" : 1956. "set the figurine on the ground")); 1957. (void) make_familiar(obj, cc.x, cc.y, FALSE); 1958. (void) stop_timer(FIG_TRANSFORM, (genericptr_t)obj); 1959. useup(obj); 1960. *optr = 0; 1961. } 1962. 1963. static NEARDATA const char lubricables[] = { ALL_CLASSES, ALLOW_NONE, 0 }; 1964. static NEARDATA const char need_to_remove_outer_armor[] = 1965. "need to remove your %s to grease your %s."; 1966. 1967. STATIC_OVL void 1968. use_grease(obj) 1969. struct obj *obj; 1970. { 1971. struct obj *otmp; 1972. char buf[BUFSZ]; 1973. 1974. if (Glib) { 1975. pline("%s from your %s.", Tobjnam(obj, "slip"), 1976. makeplural(body_part(FINGER))); 1977. dropx(obj); 1978. return; 1979. } 1980. 1981. if (obj->spe > 0) { 1982. if ((obj->cursed || Fumbling) && !rn2(2)) { 1983. consume_obj_charge(obj, TRUE); 1984. 1985. pline("%s from your %s.", Tobjnam(obj, "slip"), 1986. makeplural(body_part(FINGER))); 1987. dropx(obj); 1988. return; 1989. } 1990. otmp = getobj(lubricables, "grease"); 1991. if (!otmp) return; 1992. if ((otmp->owornmask & WORN_ARMOR) && uarmc) { 1993. Strcpy(buf, xname(uarmc)); 1994. You(need_to_remove_outer_armor, buf, xname(otmp)); 1995. return; 1996. } 1997. #ifdef TOURIST 1998. if ((otmp->owornmask & WORN_SHIRT) && (uarmc || uarm)) { 1999. Strcpy(buf, uarmc ? xname(uarmc) : ""); 2000. if (uarmc && uarm) Strcat(buf, " and "); 2001. Strcat(buf, uarm ? xname(uarm) : ""); 2002. You(need_to_remove_outer_armor, buf, xname(otmp)); 2003. return; 2004. } 2005. #endif 2006. consume_obj_charge(obj, TRUE); 2007. 2008. if (otmp != &zeroobj) { 2009. You("cover %s with a thick layer of grease.", 2010. yname(otmp)); 2011. otmp->greased = 1; 2012. if (obj->cursed && !nohands(youmonst.data)) { 2013. incr_itimeout(&Glib, rnd(15)); 2014. pline("Some of the grease gets all over your %s.", 2015. makeplural(body_part(HAND))); 2016. } 2017. } else { 2018. Glib += rnd(15); 2019. You("coat your %s with grease.", 2020. makeplural(body_part(FINGER))); 2021. } 2022. } else { 2023. if (obj->known) 2024. pline("%s empty.", Tobjnam(obj, "are")); 2025. else 2026. pline("%s to be empty.", Tobjnam(obj, "seem")); 2027. } 2028. update_inventory(); 2029. } 2030. 2031. static struct trapinfo { 2032. struct obj *tobj; 2033. xchar tx, ty; 2034. int time_needed; 2035. boolean force_bungle; 2036. } trapinfo; 2037. 2038. void 2039. reset_trapset() 2040. { 2041. trapinfo.tobj = 0; 2042. trapinfo.force_bungle = 0; 2043. } 2044. 2045. static struct whetstoneinfo { 2046. struct obj *tobj, *wsobj; 2047. int time_needed; 2048. } whetstoneinfo; 2049. 2050. void 2051. reset_whetstone() 2052. { 2053. whetstoneinfo.tobj = 0; 2054. whetstoneinfo.wsobj = 0; 2055. } 2056. 2057. /* occupation callback */ 2058. STATIC_PTR 2059. int 2060. set_whetstone() 2061. { 2062. struct obj *otmp = whetstoneinfo.tobj, *ows = whetstoneinfo.wsobj; 2063. int chance; 2064. 2065. if (!otmp || !ows) { 2066. reset_whetstone(); 2067. return 0; 2068. } else 2069. if (!carried(otmp) || !carried(ows)) { 2070. You("seem to have mislaid %s.", 2071. !carried(otmp) ? yname(otmp) : yname(ows)); 2072. reset_whetstone(); 2073. return 0; 2074. } 2075. 2076. if (--whetstoneinfo.time_needed > 0) { 2077. int adj = 2; 2078. if (Blind) adj--; 2079. if (Fumbling) adj--; 2080. if (Confusion) adj--; 2081. if (Stunned) adj--; 2082. if (Hallucination) adj--; 2083. if (adj > 0) 2084. whetstoneinfo.time_needed -= adj; 2085. return 1; 2086. } 2087. 2088. chance = 4 - (ows->blessed) + (ows->cursed*2) + (otmp->oartifact ? 3 : 0); 2089. 2090. if (!rn2(chance) && (ows->otyp == WHETSTONE)) { 2091. /* Remove rust first, then sharpen dull edges */ 2092. if (otmp->oeroded) { 2093. otmp->oeroded--; 2094. pline("%s %s%s now.", Yname2(otmp), 2095. (Blind ? "probably " : (otmp->oeroded ? "almost " : "")), 2096. otense(otmp, "shine")); 2097. } else 2098. if (otmp->spe < 0) { 2099. otmp->spe++; 2100. pline("%s %s %ssharper now.%s", Yname2(otmp), 2101. otense(otmp, Blind ? "feel" : "look"), 2102. (otmp->spe >= 0 ? "much " : ""), 2103. Blind ? " (Ow!)" : ""); 2104. } 2105. makeknown(WHETSTONE); 2106. reset_whetstone(); 2107. } else { 2108. if (Hallucination) 2109. pline("%s %s must be faulty!", 2110. is_plural(ows) ? "These" : "This", xname(ows)); 2111. else pline("%s", Blind ? "Pheww! This is hard work!" : 2112. "There are no visible effects despite your efforts."); 2113. reset_whetstone(); 2114. } 2115. 2116. return 0; 2117. } 2118. 2119. /* use stone on obj. the stone doesn't necessarily need to be a whetstone. */ 2120. STATIC_OVL void 2121. use_whetstone(stone, obj) 2122. struct obj *stone, *obj; 2123. { 2124. boolean fail_use = TRUE; 2125. const char *occutext = "sharpening"; 2126. int tmptime = 130 + (rnl(13) * 5); 2127. 2128. if (u.ustuck && sticks(youmonst.data)) { 2129. You("should let go of %s first.", mon_nam(u.ustuck)); 2130. } else 2131. if ((welded(uwep) && (uwep != stone)) || 2132. (uswapwep && u.twoweap && welded(uswapwep) && (uswapwep != obj))) { 2133. You("need both hands free."); 2134. } else 2135. if (nohands(youmonst.data)) { 2136. You("can't handle %s with your %s.", 2137. an(xname(stone)), makeplural(body_part(HAND))); 2138. } else 2139. if (verysmall(youmonst.data)) { 2140. You("are too small to use %s effectively.", an(xname(stone))); 2141. } else 2142. #ifdef GOLDOBJ 2143. if (obj == &goldobj) { 2144. pline("Shopkeepers would spot the lighter coin%s immediately.", 2145. obj->quan > 1 ? "s" : ""); 2146. } else 2147. #endif 2148. if (!is_pool(u.ux, u.uy) && !IS_FOUNTAIN(levl[u.ux][u.uy].typ) 2149. #ifdef SINKS 2150. && !IS_SINK(levl[u.ux][u.uy].typ) && !IS_TOILET(levl[u.ux][u.uy].typ) 2151. #endif 2152. ) { 2153. if (carrying(POT_WATER) && objects[POT_WATER].oc_name_known) { 2154. pline("Better not waste bottled water for that."); 2155. } else 2156. You("need some water when you use that."); 2157. } else 2158. if (Levitation && !Lev_at_will && !u.uinwater) { 2159. You("can't reach the water."); 2160. } else 2161. fail_use = FALSE; 2162. 2163. if (fail_use) { 2164. reset_whetstone(); 2165. return; 2166. } 2167. 2168. if (stone == whetstoneinfo.wsobj && obj == whetstoneinfo.tobj && 2169. carried(obj) && carried(stone)) { 2170. You("resume %s %s.", occutext, yname(obj)); 2171. set_occupation(set_whetstone, occutext, 0); 2172. return; 2173. } 2174. 2175. if (obj) { 2176. int ttyp = obj->otyp; 2177. boolean isweapon = (obj->oclass == WEAPON_CLASS || is_weptool(obj)); 2178. boolean isedged = (is_pick(obj) || 2179. (objects[ttyp].oc_dir & (PIERCE|SLASH))); 2180. if (obj == &zeroobj) { 2181. You("file your nails."); 2182. } else 2183. if (!isweapon || !isedged) { 2184. pline("%s sharp enough already.", 2185. is_plural(obj) ? "They are" : "It is"); 2186. } else 2187. if (stone->quan > 1) { 2188. pline("Using one %s is easier.", singular(stone, xname)); 2189. } else 2190. if (obj->quan > 1) { 2191. You("can apply %s only on one %s at a time.", 2192. the(xname(stone)), 2193. (obj->oclass == WEAPON_CLASS ? "weapon" : "item")); 2194. } else 2195. if (!is_metallic(obj)) { 2196. pline("That would ruin the %s %s.", 2197. materialnm[objects[ttyp].oc_material], 2198. xname(obj)); 2199. } else 2200. if (((obj->spe >= 0) || !obj->known) && !obj->oeroded) { 2201. pline("%s %s sharp and pointy enough.", 2202. is_plural(obj) ? "They" : "It", 2203. otense(obj, Blind ? "feel" : "look")); 2204. } else { 2205. if (stone->cursed) tmptime *= 2; 2206. whetstoneinfo.time_needed = tmptime; 2207. whetstoneinfo.tobj = obj; 2208. whetstoneinfo.wsobj = stone; 2209. You("start %s %s.", occutext, yname(obj)); 2210. set_occupation(set_whetstone, occutext, 0); 2211. if (IS_FOUNTAIN(levl[u.ux][u.uy].typ)) whetstone_fountain_effects(obj); 2212. #ifdef SINKS 2213. else if (IS_SINK(levl[u.ux][u.uy].typ)) whetstone_sink_effects(obj); 2214. else if (IS_TOILET(levl[u.ux][u.uy].typ)) whetstone_toilet_effects(obj); 2215. #endif 2216. } 2217. } else You("wave %s in the %s.", the(xname(stone)), 2218. (IS_POOL(levl[u.ux][u.uy].typ) && Underwater) ? "water" : "air"); 2219. } 2220. 2221. /* touchstones - by Ken Arnold */ 2222. STATIC_OVL void 2223. use_stone(tstone) 2224. struct obj *tstone; 2225. { 2226. struct obj *obj; 2227. boolean do_scratch; 2228. const char *streak_color, *choices; 2229. char stonebuf[QBUFSZ]; 2230. static const char scritch[] = "\"scritch, scritch\""; 2231. static const char allowall[3] = { COIN_CLASS, ALL_CLASSES, 0 }; 2232. static const char justgems[3] = { ALLOW_NONE, GEM_CLASS, 0 }; 2233. #ifndef GOLDOBJ 2234. struct obj goldobj; 2235. #endif 2236. 2237. /* in case it was acquired while blinded */ 2238. if (!Blind) tstone->dknown = 1; 2239. /* when the touchstone is fully known, don't bother listing extra 2240. junk as likely candidates for rubbing */ 2241. choices = (tstone->otyp == TOUCHSTONE && tstone->dknown && 2242. objects[TOUCHSTONE].oc_name_known) ? justgems : allowall; 2243. Sprintf(stonebuf, "rub on the stone%s", plur(tstone->quan)); 2244. if ((obj = getobj(choices, stonebuf)) == 0) 2245. return; 2246. #ifndef GOLDOBJ 2247. if (obj->oclass == COIN_CLASS) { 2248. u.ugold += obj->quan; /* keep botl up to date */ 2249. goldobj = *obj; 2250. dealloc_obj(obj); 2251. obj = &goldobj; 2252. } 2253. #endif 2254. 2255. if (obj == tstone && obj->quan == 1) { 2256. You_cant("rub %s on itself.", the(xname(obj))); 2257. return; 2258. } 2259. 2260. if (tstone->otyp == TOUCHSTONE && tstone->cursed && 2261. obj->oclass == GEM_CLASS && !is_graystone(obj) && 2262. !obj_resists(obj, 80, 100)) { 2263. if (Blind) 2264. pline("You feel something shatter."); 2265. else if (Hallucination) 2266. pline("Oh, wow, look at the pretty shards."); 2267. else 2268. pline("A sharp crack shatters %s%s.", 2269. (obj->quan > 1) ? "one of " : "", the(xname(obj))); 2270. #ifndef GOLDOBJ 2271. /* assert(obj != &goldobj); */ 2272. #endif 2273. useup(obj); 2274. return; 2275. } 2276. 2277. if (Blind) { 2278. pline(scritch); 2279. return; 2280. } else if (Hallucination) { 2281. pline("Oh wow, man: Fractals!"); 2282. return; 2283. } 2284. 2285. do_scratch = FALSE; 2286. streak_color = 0; 2287. 2288. switch (obj->oclass) { 2289. case WEAPON_CLASS: 2290. case TOOL_CLASS: 2291. use_whetstone(tstone, obj); 2292. return; 2293. case GEM_CLASS: /* these have class-specific handling below */ 2294. case RING_CLASS: 2295. if (tstone->otyp != TOUCHSTONE) { 2296. do_scratch = TRUE; 2297. } else if (obj->oclass == GEM_CLASS && (tstone->blessed || 2298. (!tstone->cursed && 2299. (Role_if(PM_ARCHEOLOGIST) || Race_if(PM_GNOME))))) { 2300. makeknown(TOUCHSTONE); 2301. makeknown(obj->otyp); 2302. prinv((char *)0, obj, 0L); 2303. return; 2304. } else { 2305. /* either a ring or the touchstone was not effective */ 2306. if (objects[obj->otyp].oc_material == GLASS) { 2307. do_scratch = TRUE; 2308. break; 2309. } 2310. } 2311. streak_color = c_obj_colors[objects[obj->otyp].oc_color]; 2312. break; /* gem or ring */ 2313. 2314. default: 2315. switch (objects[obj->otyp].oc_material) { 2316. case CLOTH: 2317. pline("%s a little more polished now.", Tobjnam(tstone, "look")); 2318. return; 2319. case LIQUID: 2320. if (!obj->known) /* note: not "whetstone" */ 2321. You("must think this is a wetstone, do you?"); 2322. else 2323. pline("%s a little wetter now.", Tobjnam(tstone, "are")); 2324. return; 2325. case WAX: 2326. streak_color = "waxy"; 2327. break; /* okay even if not touchstone */ 2328. case WOOD: 2329. streak_color = "wooden"; 2330. break; /* okay even if not touchstone */ 2331. case GOLD: 2332. do_scratch = TRUE; /* scratching and streaks */ 2333. streak_color = "golden"; 2334. break; 2335. case SILVER: 2336. do_scratch = TRUE; /* scratching and streaks */ 2337. streak_color = "silvery"; 2338. break; 2339. default: 2340. /* Objects passing the is_flimsy() test will not 2341. scratch a stone. They will leave streaks on 2342. non-touchstones and touchstones alike. */ 2343. if (is_flimsy(obj)) 2344. streak_color = c_obj_colors[objects[obj->otyp].oc_color]; 2345. else 2346. do_scratch = (tstone->otyp != TOUCHSTONE); 2347. break; 2348. } 2349. break; /* default oclass */ 2350. } 2351. 2352. Sprintf(stonebuf, "stone%s", plur(tstone->quan)); 2353. if (do_scratch) 2354. pline("You make %s%sscratch marks on the %s.", 2355. streak_color ? streak_color : (const char *)"", 2356. streak_color ? " " : "", stonebuf); 2357. else if (streak_color) 2358. pline("You see %s streaks on the %s.", streak_color, stonebuf); 2359. else 2360. pline(scritch); 2361. return; 2362. } 2363. 2364. /* Place a landmine/bear trap. Helge Hafting */ 2365. STATIC_OVL void 2366. use_trap(otmp) 2367. struct obj *otmp; 2368. { 2369. int ttyp, tmp; 2370. const char *what = (char *)0; 2371. char buf[BUFSZ]; 2372. const char *occutext = "setting the trap"; 2373. 2374. if (nohands(youmonst.data)) 2375. what = "without hands"; 2376. else if (Stunned) 2377. what = "while stunned"; 2378. else if (u.uswallow) 2379. what = is_animal(u.ustuck->data) ? "while swallowed" : 2380. "while engulfed"; 2381. else if (Underwater) 2382. what = "underwater"; 2383. else if (Levitation) 2384. what = "while levitating"; 2385. else if (is_pool(u.ux, u.uy)) 2386. what = "in water"; 2387. else if (is_lava(u.ux, u.uy)) 2388. what = "in lava"; 2389. else if (On_stairs(u.ux, u.uy)) 2390. what = (u.ux == xdnladder || u.ux == xupladder) ? 2391. "on the ladder" : "on the stairs"; 2392. else if (IS_FURNITURE(levl[u.ux][u.uy].typ) || 2393. IS_ROCK(levl[u.ux][u.uy].typ) || 2394. closed_door(u.ux, u.uy) || t_at(u.ux, u.uy)) 2395. what = "here"; 2396. if (what) { 2397. You_cant("set a trap %s!",what); 2398. reset_trapset(); 2399. return; 2400. } 2401. ttyp = (otmp->otyp == LAND_MINE) ? LANDMINE : BEAR_TRAP; 2402. if (otmp == trapinfo.tobj && 2403. u.ux == trapinfo.tx && u.uy == trapinfo.ty) { 2404. You("resume setting %s %s.", 2405. shk_your(buf, otmp), 2406. defsyms[trap_to_defsym(what_trap(ttyp))].explanation); 2407. set_occupation(set_trap, occutext, 0); 2408. return; 2409. } 2410. trapinfo.tobj = otmp; 2411. trapinfo.tx = u.ux, trapinfo.ty = u.uy; 2412. tmp = ACURR(A_DEX); 2413. trapinfo.time_needed = (tmp > 17) ? 2 : (tmp > 12) ? 3 : 2414. (tmp > 7) ? 4 : 5; 2415. if (Blind) trapinfo.time_needed *= 2; 2416. tmp = ACURR(A_STR); 2417. if (ttyp == BEAR_TRAP && tmp < 18) 2418. trapinfo.time_needed += (tmp > 12) ? 1 : (tmp > 7) ? 2 : 4; 2419. /*[fumbling and/or confusion and/or cursed object check(s) 2420. should be incorporated here instead of in set_trap]*/ 2421. #ifdef STEED 2422. if (u.usteed && P_SKILL(P_RIDING) < P_BASIC) { 2423. boolean chance; 2424. 2425. if (Fumbling || otmp->cursed) chance = (rnl(10) > 3); 2426. else chance = (rnl(10) > 5); 2427. You("aren't very skilled at reaching from %s.", 2428. mon_nam(u.usteed)); 2429. Sprintf(buf, "Continue your attempt to set %s?", 2430. the(defsyms[trap_to_defsym(what_trap(ttyp))].explanation)); 2431. if(yn(buf) == 'y') { 2432. if (chance) { 2433. switch(ttyp) { 2434. case LANDMINE: /* set it off */ 2435. trapinfo.time_needed = 0; 2436. trapinfo.force_bungle = TRUE; 2437. break; 2438. case BEAR_TRAP: /* drop it without arming it */ 2439. reset_trapset(); 2440. You("drop %s!", 2441. the(defsyms[trap_to_defsym(what_trap(ttyp))].explanation)); 2442. dropx(otmp); 2443. return; 2444. } 2445. } 2446. } else { 2447. reset_trapset(); 2448. return; 2449. } 2450. } 2451. #endif 2452. You("begin setting %s %s.", 2453. shk_your(buf, otmp), 2454. defsyms[trap_to_defsym(what_trap(ttyp))].explanation); 2455. set_occupation(set_trap, occutext, 0); 2456. return; 2457. } 2458. 2459. STATIC_PTR 2460. int 2461. set_trap() 2462. { 2463. struct obj *otmp = trapinfo.tobj; 2464. struct trap *ttmp; 2465. int ttyp; 2466. 2467. if (!otmp || !carried(otmp) || 2468. u.ux != trapinfo.tx || u.uy != trapinfo.ty) { 2469. /* ?? */ 2470. reset_trapset(); 2471. return 0; 2472. } 2473. 2474. if (--trapinfo.time_needed > 0) return 1; /* still busy */ 2475. 2476. ttyp = (otmp->otyp == LAND_MINE) ? LANDMINE : BEAR_TRAP; 2477. ttmp = maketrap(u.ux, u.uy, ttyp); 2478. if (ttmp) { 2479. ttmp->tseen = 1; 2480. ttmp->madeby_u = 1; 2481. newsym(u.ux, u.uy); /* if our hero happens to be invisible */ 2482. if (*in_rooms(u.ux,u.uy,SHOPBASE)) { 2483. add_damage(u.ux, u.uy, 0L); /* schedule removal */ 2484. } 2485. if (!trapinfo.force_bungle) 2486. You("finish arming %s.", 2487. the(defsyms[trap_to_defsym(what_trap(ttyp))].explanation)); 2488. if (((otmp->cursed || Fumbling) && (rnl(10) > 5)) || trapinfo.force_bungle) 2489. dotrap(ttmp, 2490. (unsigned)(trapinfo.force_bungle ? FORCEBUNGLE : 0)); 2491. } else { 2492. /* this shouldn't happen */ 2493. Your("trap setting attempt fails."); 2494. } 2495. useup(otmp); 2496. reset_trapset(); 2497. return 0; 2498. } 2499. 2500. STATIC_OVL int 2501. use_whip(obj) 2502. struct obj *obj; 2503. { 2504. char buf[BUFSZ]; 2505. struct monst *mtmp; 2506. struct obj *otmp; 2507. int rx, ry, proficient, res = 0; 2508. const char *msg_slipsfree = "The bullwhip slips free."; 2509. const char *msg_snap = "Snap!"; 2510. 2511. if (obj != uwep) { 2512. if (!wield_tool(obj, "lash")) return 0; 2513. else res = 1; 2514. } 2515. if (!getdir((char *)0)) return res; 2516. 2517. if (Stunned || (Confusion && !rn2(5))) confdir(); 2518. rx = u.ux + u.dx; 2519. ry = u.uy + u.dy; 2520. mtmp = m_at(rx, ry); 2521. 2522. /* fake some proficiency checks */ 2523. proficient = 0; 2524. if (Role_if(PM_ARCHEOLOGIST)) ++proficient; 2525. if (ACURR(A_DEX) < 6) proficient--; 2526. else if (ACURR(A_DEX) >= 14) proficient += (ACURR(A_DEX) - 14); 2527. if (Fumbling) --proficient; 2528. if (proficient > 3) proficient = 3; 2529. if (proficient < 0) proficient = 0; 2530. 2531. if (u.uswallow && attack(u.ustuck)) { 2532. There("is not enough room to flick your bullwhip."); 2533. 2534. } else if (Underwater) { 2535. There("is too much resistance to flick your bullwhip."); 2536. 2537. } else if (u.dz < 0) { 2538. You("flick a bug off of the %s.",ceiling(u.ux,u.uy)); 2539. 2540. } else if ((!u.dx && !u.dy) || (u.dz > 0)) { 2541. int dam; 2542. 2543. #ifdef STEED 2544. /* Sometimes you hit your steed by mistake */ 2545. if (u.usteed && !rn2(proficient + 2)) { 2546. You("whip %s!", mon_nam(u.usteed)); 2547. kick_steed(); 2548. return 1; 2549. } 2550. #endif 2551. if (Levitation 2552. #ifdef STEED 2553. || u.usteed 2554. #endif 2555. ) { 2556. /* Have a shot at snaring something on the floor */ 2557. otmp = level.objects[u.ux][u.uy]; 2558. if (otmp && otmp->otyp == CORPSE && otmp->corpsenm == PM_HORSE) { 2559. pline("Why beat a dead horse?"); 2560. return 1; 2561. } 2562. if (otmp && proficient) { 2563. You("wrap your bullwhip around %s on the %s.", 2564. an(singular(otmp, xname)), surface(u.ux, u.uy)); 2565. if (rnl(6) || pickup_object(otmp, 1L, TRUE) < 1) 2566. pline(msg_slipsfree); 2567. return 1; 2568. } 2569. } 2570. dam = rnd(2) + dbon() + obj->spe; 2571. if (dam <= 0) dam = 1; 2572. You("hit your %s with your bullwhip.", body_part(FOOT)); 2573. Sprintf(buf, "killed %sself with %s bullwhip", uhim(), uhis()); 2574. losehp(dam, buf, NO_KILLER_PREFIX); 2575. flags.botl = 1; 2576. return 1; 2577. 2578. } else if ((Fumbling || Glib) && !rn2(5)) { 2579. pline_The("bullwhip slips out of your %s.", body_part(HAND)); 2580. dropx(obj); 2581. 2582. } else if (u.utrap && u.utraptype == TT_PIT) { 2583. /* 2584. * Assumptions: 2585. * 2586. * if you're in a pit 2587. * - you are attempting to get out of the pit 2588. * - or, if you are applying it towards a small 2589. * monster then it is assumed that you are 2590. * trying to hit it. 2591. * else if the monster is wielding a weapon 2592. * - you are attempting to disarm a monster 2593. * else 2594. * - you are attempting to hit the monster 2595. * 2596. * if you're confused (and thus off the mark) 2597. * - you only end up hitting. 2598. * 2599. */ 2600. const char *wrapped_what = (char *)0; 2601. 2602. if (mtmp) { 2603. if (bigmonst(mtmp->data)) { 2604. wrapped_what = strcpy(buf, mon_nam(mtmp)); 2605. } else if (proficient) { 2606. if (attack(mtmp)) return 1; 2607. else pline(msg_snap); 2608. } 2609. } 2610. if (!wrapped_what) { 2611. if (IS_FURNITURE(levl[rx][ry].typ)) 2612. wrapped_what = something; 2613. else if (sobj_at(BOULDER, rx, ry)) 2614. wrapped_what = "a boulder"; 2615. } 2616. if (wrapped_what) { 2617. coord cc; 2618. 2619. cc.x = rx; cc.y = ry; 2620. You("wrap your bullwhip around %s.", wrapped_what); 2621. if (proficient && rn2(proficient + 2)) { 2622. if (!mtmp || enexto(&cc, rx, ry, youmonst.data)) { 2623. You("yank yourself out of the pit!"); 2624. teleds(cc.x, cc.y, TRUE); 2625. u.utrap = 0; 2626. vision_full_recalc = 1; 2627. } 2628. } else { 2629. pline(msg_slipsfree); 2630. } 2631. if (mtmp) wakeup(mtmp); 2632. } else pline(msg_snap); 2633. 2634. } else if (mtmp) { 2635. if (!canspotmon(mtmp) && 2636. !memory_is_invisible(rx, ry)) { 2637. pline("A monster is there that you couldn't see."); 2638. map_invisible(rx, ry); 2639. } 2640. otmp = MON_WEP(mtmp); /* can be null */ 2641. if (otmp) { 2642. char onambuf[BUFSZ]; 2643. const char *mon_hand; 2644. boolean gotit = proficient && (!Fumbling || !rn2(10)); 2645. 2646. Strcpy(onambuf, cxname(otmp)); 2647. if (gotit) { 2648. mon_hand = mbodypart(mtmp, HAND); 2649. if (bimanual(otmp)) mon_hand = makeplural(mon_hand); 2650. } else 2651. mon_hand = 0; /* lint suppression */ 2652. 2653. You("wrap your bullwhip around %s %s.", 2654. s_suffix(mon_nam(mtmp)), onambuf); 2655. if (gotit && otmp->cursed) { 2656. pline("%s welded to %s %s%c", 2657. (otmp->quan == 1L) ? "It is" : "They are", 2658. mhis(mtmp), mon_hand, 2659. !otmp->bknown ? '!' : '.'); 2660. otmp->bknown = 1; 2661. gotit = FALSE; /* can't pull it free */ 2662. } 2663. if (gotit) { 2664. obj_extract_self(otmp); 2665. possibly_unwield(mtmp, FALSE); 2666. setmnotwielded(mtmp,otmp); 2667. 2668. switch (rn2(proficient + 1)) { 2669. case 2: 2670. /* to floor near you */ 2671. You("yank %s %s to the %s!", s_suffix(mon_nam(mtmp)), 2672. onambuf, surface(u.ux, u.uy)); 2673. place_object(otmp, u.ux, u.uy); 2674. stackobj(otmp); 2675. break; 2676. case 3: 2677. /* right to you */ 2678. #if 0 2679. if (!rn2(25)) { 2680. /* proficient with whip, but maybe not 2681. so proficient at catching weapons */ 2682. int hitu, hitvalu; 2683. 2684. hitvalu = 8 + otmp->spe; 2685. hitu = thitu(hitvalu, 2686. dmgval(otmp, &youmonst), 2687. otmp, (char *)0); 2688. if (hitu) { 2689. pline_The("%s hits you as you try to snatch it!", 2690. the(onambuf)); 2691. } 2692. place_object(otmp, u.ux, u.uy); 2693. stackobj(otmp); 2694. break; 2695. } 2696. #endif /* 0 */ 2697. /* right into your inventory */ 2698. You("snatch %s %s!", s_suffix(mon_nam(mtmp)), onambuf); 2699. if (otmp->otyp == CORPSE && 2700. touch_petrifies(&mons[otmp->corpsenm]) && 2701. !uarmg && !Stone_resistance && 2702. !(poly_when_stoned(youmonst.data) && 2703. polymon(PM_STONE_GOLEM))) { 2704. char kbuf[BUFSZ]; 2705. 2706. Sprintf(kbuf, "%s corpse", 2707. an(mons[otmp->corpsenm].mname)); 2708. pline("Snatching %s is a fatal mistake.", kbuf); 2709. instapetrify(kbuf); 2710. } 2711. otmp = hold_another_object(otmp, "You drop %s!", 2712. doname(otmp), (const char *)0); 2713. break; 2714. default: 2715. /* to floor beneath mon */ 2716. You("yank %s from %s %s!", the(onambuf), 2717. s_suffix(mon_nam(mtmp)), mon_hand); 2718. obj_no_longer_held(otmp); 2719. place_object(otmp, mtmp->mx, mtmp->my); 2720. stackobj(otmp); 2721. break; 2722. } 2723. } else { 2724. pline(msg_slipsfree); 2725. } 2726. wakeup(mtmp); 2727. } else { 2728. if (mtmp->m_ap_type && 2729. !Protection_from_shape_changers && !sensemon(mtmp)) 2730. stumble_onto_mimic(mtmp); 2731. else You("flick your bullwhip towards %s.", mon_nam(mtmp)); 2732. if (proficient) { 2733. if (attack(mtmp)) return 1; 2734. else pline(msg_snap); 2735. } 2736. } 2737. 2738. } else if (Is_airlevel(&u.uz) || Is_waterlevel(&u.uz)) { 2739. /* it must be air -- water checked above */ 2740. You("snap your whip through thin air."); 2741. 2742. } else { 2743. pline(msg_snap); 2744. 2745. } 2746. return 1; 2747. } 2748. 2749. 2750. /* KMH, balance patch -- Distance attacks by pole-weapons */ 2751. /* WAC -- Range limited by skill */ 2752. static int 2753. use_pole(obj) 2754. struct obj *obj; 2755. { 2756. int res = 0, max_range = 8, min_range; 2757. coord cc; 2758. struct monst *mtmp; 2759. struct obj *otmp; 2760. boolean fishing; 2761. 2762. 2763. /* Are you allowed to use the pole? */ 2764. if (u.uswallow) { 2765. pline("There's not enough room here to use that."); 2766. return (0); 2767. } 2768. if (obj != uwep) { 2769. if (!wield_tool(obj, "swing")) return(0); 2770. else res = 1; 2771. } 2772. 2773. /* Prompt for a location */ 2774. pline("Where do you want to hit?"); 2775. cc.x = u.ux; 2776. cc.y = u.uy; 2777. getpos(&cc, TRUE, "the spot to hit"); 2778. if (cc.x == -10) return (0); /* user pressed esc */ 2779. 2780. #ifdef WEAPON_SKILLS 2781. /* WAC -- range depends on skill. Default is 8 */ 2782. if (weapon_type(obj) == P_NONE) max_range = 4; 2783. else if (P_SKILL(weapon_type(obj)) <= P_BASIC) max_range = 4; 2784. else if (P_SKILL(weapon_type(obj)) <= P_SKILLED) max_range = 5; 2785. #endif 2786. 2787. min_range = ((obj->otyp == FISHING_POLE) ? 1 : 4); 2788. 2789. if (distu(cc.x, cc.y) > max_range) { 2790. pline("Too far!"); 2791. return (res); 2792. } else if (distu(cc.x, cc.y) < min_range) { 2793. pline("Too close!"); 2794. return (res); 2795. } else if (!cansee(cc.x, cc.y)) { 2796. You("won't hit anything if you can't see that spot."); 2797. return (res); 2798. } 2799. 2800. /* What is there? */ 2801. mtmp = m_at(cc.x, cc.y); 2802. fishing = (obj->otyp == FISHING_POLE) && is_pool(cc.x, cc.y); 2803. 2804. /* Try a random effect */ 2805. switch (rnd(6)) 2806. { 2807. case 1: 2808. /* Snag yourself */ 2809. if (obj->otyp == FISHING_POLE) { 2810. You("hook yourself!"); 2811. losehp(rn1(10,10), "a fishing hook", KILLED_BY); 2812. return (1); 2813. } 2814. break; 2815. case 2: 2816. /* Reel in a fish */ 2817. if (fishing && mtmp) { 2818. if ((bigmonst(mtmp->data) || strongmonst(mtmp->data)) 2819. && !rn2(2)) { 2820. You("are yanked toward the %s", 2821. surface(cc.x, cc.y)); 2822. hurtle(sgn(cc.x-u.ux), sgn(cc.y-u.uy), 1, TRUE); 2823. return (1); 2824. } else if (enexto(&cc, u.ux, u.uy, 0)) { 2825. You("reel in %s!", mon_nam(mtmp)); 2826. mtmp->mundetected = 0; 2827. rloc_to(mtmp, cc.x, cc.y); 2828. return (1); 2829. } 2830. } 2831. break; 2832. case 3: 2833. /* Snag an existing object */ 2834. if (obj->otyp == FISHING_POLE && 2835. (otmp = level.objects[cc.x][cc.y]) != 2836. (struct obj *)0) { 2837. You("snag an object from the %s!", surface(cc.x, cc.y)); 2838. pickup_object(otmp, 1, FALSE); 2839. /* If pickup fails, leave it alone */ 2840. newsym(cc.x, cc.y); 2841. return (1); 2842. } 2843. break; 2844. case 4: 2845. /* Snag some garbage */ 2846. if (fishing && flags.boot_count < 1 && 2847. (otmp = mksobj(LOW_BOOTS, TRUE, FALSE)) != 2848. (struct obj *)0) { 2849. flags.boot_count++; 2850. You("snag some garbage from the %s!", 2851. surface(cc.x, cc.y)); 2852. if (pickup_object(otmp, 1, FALSE) <= 0) { 2853. obj_extract_self(otmp); 2854. place_object(otmp, u.ux, u.uy); 2855. newsym(u.ux, u.uy); 2856. } 2857. return (1); 2858. } 2859. #ifdef SINKS 2860. /* Or a rat in the sink/toilet */ 2861. if (obj->otyp == FISHING_POLE && 2862. !(mvitals[PM_SEWER_RAT].mvflags & G_GONE) && 2863. (IS_SINK(levl[cc.x][cc.y].typ) || 2864. IS_TOILET(levl[cc.x][cc.y].typ))) { 2865. mtmp = makemon(&mons[PM_SEWER_RAT], 2866. cc.x, cc.y, NO_MM_FLAGS); 2867. pline("Eek! There's %s there!", 2868. Blind ? "something squirmy" : 2869. a_monnam(mtmp)); 2870. return (1); 2871. } 2872. #endif 2873. break; 2874. case 5: 2875. /* Catch your dinner */ 2876. if (fishing && 2877. (otmp = mksobj(CRAM_RATION, TRUE, FALSE)) != 2878. (struct obj *)0) { 2879. You("catch tonight's dinner!"); 2880. if (pickup_object(otmp, 1, FALSE) <= 0) { 2881. obj_extract_self(otmp); 2882. place_object(otmp, u.ux, u.uy); 2883. newsym(u.ux, u.uy); 2884. } 2885. return (1); 2886. } 2887. break; 2888. default: 2889. case 6: 2890. /* Untrap */ 2891. /* FIXME -- needs to deal with non-adjacent traps */ 2892. break; 2893. } 2894. 2895. /* The effect didn't apply. Attack whatever is there. */ 2896. if (mtmp) { 2897. (void) thitmonst(mtmp, uwep, 1); 2898. return (1); 2899. } 2900. 2901. pline(nothing_happens); 2902. return (1); 2903. } 2904. 2905. 2906. static const char 2907. not_enough_room[] = "There's not enough room here to use that.", 2908. where_to_hit[] = "Where do you want to hit?", 2909. cant_see_spot[] = "won't hit anything if you can't see that spot.", 2910. cant_reach[] = "can't reach that spot from here."; 2911. 2912. #if 0 2913. /* Distance attacks by pole-weapons */ 2914. STATIC_OVL int 2915. use_pole (obj) 2916. struct obj *obj; 2917. { 2918. int res = 0, typ, max_range = 4, min_range = 4; 2919. coord cc; 2920. struct monst *mtmp; 2921. 2922. 2923. /* Are you allowed to use the pole? */ 2924. if (u.uswallow) { 2925. pline(not_enough_room); 2926. return (0); 2927. } 2928. if (obj != uwep) { 2929. if (!wield_tool(obj, "swing")) return(0); 2930. else res = 1; 2931. } 2932. /* assert(obj == uwep); */ 2933. 2934. /* Prompt for a location */ 2935. pline(where_to_hit); 2936. cc.x = u.ux; 2937. cc.y = u.uy; 2938. if (getpos(&cc, TRUE, "the spot to hit") < 0) 2939. return 0; /* user pressed ESC */ 2940. 2941. /* Calculate range */ 2942. typ = uwep_skill_type(); 2943. if (typ == P_NONE || P_SKILL(typ) <= P_BASIC) max_range = 4; 2944. else if (P_SKILL(typ) == P_SKILLED) max_range = 5; 2945. else max_range = 8; 2946. if (distu(cc.x, cc.y) > max_range) { 2947. pline("Too far!"); 2948. return (res); 2949. } else if (distu(cc.x, cc.y) < min_range) { 2950. pline("Too close!"); 2951. return (res); 2952. } else if (!cansee(cc.x, cc.y) && 2953. ((mtmp = m_at(cc.x, cc.y)) == (struct monst *)0 || 2954. !canseemon(mtmp))) { 2955. You(cant_see_spot); 2956. return (res); 2957. } else if (!couldsee(cc.x, cc.y)) { /* Eyes of the Overworld */ 2958. You(cant_reach); 2959. return res; 2960. } else if (!couldsee(cc.x, cc.y)) { /* Eyes of the Overworld */ 2961. You(cant_reach); 2962. return res; 2963. } 2964. 2965. /* Attack the monster there */ 2966. if ((mtmp = m_at(cc.x, cc.y)) != (struct monst *)0) { 2967. int oldhp = mtmp->mhp; 2968. 2969. bhitpos = cc; 2970. check_caitiff(mtmp); 2971. (void) thitmonst(mtmp, uwep, 1); 2972. /* check the monster's HP because thitmonst() doesn't return 2973. * an indication of whether it hit. Not perfect (what if it's a 2974. * non-silver weapon on a shade?) 2975. */ 2976. if (mtmp->mhp < oldhp) 2977. u.uconduct.weaphit++; 2978. } else 2979. /* Now you know that nothing is there... */ 2980. pline(nothing_happens); 2981. return (1); 2982. } 2983. #endif 2984. 2985. STATIC_OVL int 2986. use_cream_pie(obj) 2987. struct obj *obj; 2988. { 2989. boolean wasblind = Blind; 2990. boolean wascreamed = u.ucreamed; 2991. boolean several = FALSE; 2992. 2993. if (obj->quan > 1L) { 2994. several = TRUE; 2995. obj = splitobj(obj, 1L); 2996. } 2997. if (Hallucination) 2998. You("give yourself a facial."); 2999. else 3000. pline("You immerse your %s in %s%s.", body_part(FACE), 3001. several ? "one of " : "", 3002. several ? makeplural(the(xname(obj))) : the(xname(obj))); 3003. if(can_blnd((struct monst*)0, &youmonst, AT_WEAP, obj)) { 3004. int blindinc = rnd(25); 3005. u.ucreamed += blindinc; 3006. make_blinded(Blinded + (long)blindinc, FALSE); 3007. if (!Blind || (Blind && wasblind)) 3008. pline("There's %ssticky goop all over your %s.", 3009. wascreamed ? "more " : "", 3010. body_part(FACE)); 3011. else /* Blind && !wasblind */ 3012. You_cant("see through all the sticky goop on your %s.", 3013. body_part(FACE)); 3014. } 3015. if (obj->unpaid) { 3016. verbalize("You used it, you bought it!"); 3017. bill_dummy_object(obj); 3018. } 3019. obj_extract_self(obj); 3020. delobj(obj); 3021. return(0); 3022. } 3023. 3024. STATIC_OVL int 3025. use_grapple (obj) 3026. struct obj *obj; 3027. { 3028. int res = 0, typ, max_range = 4, tohit; 3029. coord cc; 3030. struct monst *mtmp; 3031. struct obj *otmp; 3032. 3033. /* Are you allowed to use the hook? */ 3034. if (u.uswallow) { 3035. pline(not_enough_room); 3036. return (0); 3037. } 3038. if (obj != uwep) { 3039. if (!wield_tool(obj, "cast")) return(0); 3040. else res = 1; 3041. } 3042. /* assert(obj == uwep); */ 3043. 3044. /* Prompt for a location */ 3045. pline(where_to_hit); 3046. cc.x = u.ux; 3047. cc.y = u.uy; 3048. if (getpos(&cc, TRUE, "the spot to hit") < 0) 3049. return 0; /* user pressed ESC */ 3050. 3051. /* Calculate range */ 3052. typ = uwep_skill_type(); 3053. if (typ == P_NONE || P_SKILL(typ) <= P_BASIC) max_range = 4; 3054. else if (P_SKILL(typ) == P_SKILLED) max_range = 5; 3055. else max_range = 8; 3056. if (distu(cc.x, cc.y) > max_range) { 3057. pline("Too far!"); 3058. return (res); 3059. } else if (!cansee(cc.x, cc.y)) { 3060. You(cant_see_spot); 3061. return (res); 3062. } 3063. 3064. /* What do you want to hit? */ 3065. tohit = rn2(5); 3066. if (typ != P_NONE && P_SKILL(typ) >= P_SKILLED) { 3067. winid tmpwin = create_nhwindow(NHW_MENU); 3068. anything any; 3069. char buf[BUFSZ]; 3070. menu_item *selected; 3071. 3072. any.a_void = 0; /* set all bits to zero */ 3073. any.a_int = 1; /* use index+1 (cant use 0) as identifier */ 3074. start_menu(tmpwin); 3075. any.a_int++; 3076. Sprintf(buf, "an object on the %s", surface(cc.x, cc.y)); 3077. add_menu(tmpwin, NO_GLYPH, &any, 0, 0, ATR_NONE, 3078. buf, MENU_UNSELECTED); 3079. any.a_int++; 3080. add_menu(tmpwin, NO_GLYPH, &any, 0, 0, ATR_NONE, 3081. "a monster", MENU_UNSELECTED); 3082. any.a_int++; 3083. Sprintf(buf, "the %s", surface(cc.x, cc.y)); 3084. add_menu(tmpwin, NO_GLYPH, &any, 0, 0, ATR_NONE, 3085. buf, MENU_UNSELECTED); 3086. end_menu(tmpwin, "Aim for what?"); 3087. tohit = rn2(4); 3088. if (select_menu(tmpwin, PICK_ONE, &selected) > 0 && 3089. rn2(P_SKILL(typ) > P_SKILLED ? 20 : 2)) 3090. tohit = selected[0].item.a_int - 1; 3091. free((genericptr_t)selected); 3092. destroy_nhwindow(tmpwin); 3093. } 3094. 3095. /* What did you hit? */ 3096. switch (tohit) { 3097. case 0: /* Trap */ 3098. /* FIXME -- untrap needs to deal with non-adjacent traps */ 3099. break; 3100. case 1: /* Object */ 3101. if ((otmp = level.objects[cc.x][cc.y]) != 0) { 3102. You("snag an object from the %s!", surface(cc.x, cc.y)); 3103. (void) pickup_object(otmp, 1L, FALSE); 3104. /* If pickup fails, leave it alone */ 3105. newsym(cc.x, cc.y); 3106. return (1); 3107. } 3108. break; 3109. case 2: /* Monster */ 3110. if ((mtmp = m_at(cc.x, cc.y)) == (struct monst *)0) break; 3111. if (verysmall(mtmp->data) && !rn2(4) && 3112. enexto(&cc, u.ux, u.uy, (struct permonst *)0)) { 3113. You("pull in %s!", mon_nam(mtmp)); 3114. mtmp->mundetected = 0; 3115. rloc_to(mtmp, cc.x, cc.y); 3116. return (1); 3117. } else if ((!bigmonst(mtmp->data) && !strongmonst(mtmp->data)) || 3118. rn2(4)) { 3119. (void) thitmonst(mtmp, uwep, 1); 3120. return (1); 3121. } 3122. /* FALL THROUGH */ 3123. case 3: /* Surface */ 3124. if (IS_AIR(levl[cc.x][cc.y].typ) || is_pool(cc.x, cc.y)) 3125. pline_The("hook slices through the %s.", surface(cc.x, cc.y)); 3126. else { 3127. You("are yanked toward the %s!", surface(cc.x, cc.y)); 3128. hurtle(sgn(cc.x-u.ux), sgn(cc.y-u.uy), 1, FALSE); 3129. spoteffects(TRUE); 3130. } 3131. return (1); 3132. default: /* Yourself (oops!) */ 3133. if (P_SKILL(typ) <= P_BASIC) { 3134. You("hook yourself!"); 3135. losehp(rn1(10,10), "a grappling hook", KILLED_BY); 3136. return (1); 3137. } 3138. break; 3139. } 3140. pline(nothing_happens); 3141. return (1); 3142. } 3143. 3144. 3145. #define BY_OBJECT ((struct monst *)0) 3146. 3147. /* return 1 if the wand is broken, hence some time elapsed */ 3148. STATIC_OVL int 3149. do_break_wand(obj) 3150. struct obj *obj; 3151. { 3152. char confirm[QBUFSZ], the_wand[BUFSZ]; 3153. 3154. Strcpy(the_wand, yname(obj)); 3155. Sprintf(confirm, "Are you really sure you want to break %s?", 3156. safe_qbuf("", sizeof("Are you really sure you want to break ?"), 3157. the_wand, ysimple_name(obj), "the wand")); 3158. if (yn(confirm) == 'n' ) return 0; 3159. 3160. if (nohands(youmonst.data)) { 3161. You_cant("break %s without hands!", the_wand); 3162. return 0; 3163. } else if (ACURR(A_STR) < 10) { 3164. You("don't have the strength to break %s!", the_wand); 3165. return 0; 3166. } 3167. pline("Raising %s high above your %s, you break it in two!", 3168. the_wand, body_part(HEAD)); 3169. return wand_explode(obj, TRUE); 3170. } 3171. 3172. /* This function takes care of the effects wands exploding, via 3173. * user-specified 'applying' as well as wands exploding by accident 3174. * during use (called by backfire() in zap.c) 3175. * 3176. * If the effect is directly recognisable as pertaining to a 3177. * specific wand, the wand should be makeknown() 3178. * Otherwise, if there is an ambiguous or indirect but visible effect 3179. * the wand should be allowed to be named by the user. 3180. * 3181. * If there is no obvious effect, do nothing. (Should this be changed 3182. * to letting the user call that type of wand?) 3183. * 3184. * hero_broke is nonzero if the user initiated the action that caused 3185. * the wand to explode (zapping or applying). 3186. */ 3187. int 3188. wand_explode(obj, hero_broke) 3189. struct obj *obj; 3190. boolean hero_broke; 3191. { 3192. static const char nothing_else_happens[] = "But nothing else happens..."; 3193. register int i, x, y; 3194. register struct monst *mon; 3195. int dmg, damage; 3196. boolean affects_objects; 3197. boolean shop_damage = FALSE; 3198. int expltype = EXPL_MAGICAL; 3199. char buf[BUFSZ]; 3200. 3201. /* [ALI] Do this first so that wand is removed from bill. Otherwise, 3202. * the freeinv() below also hides it from setpaid() which causes problems. 3203. */ 3204. if (carried(obj) ? obj->unpaid : 3205. !obj->no_charge && costly_spot(obj->ox, obj->oy)) { 3206. if (hero_broke) 3207. check_unpaid(obj); /* Extra charge for use */ 3208. bill_dummy_object(obj); 3209. } 3210. 3211. current_wand = obj; /* destroy_item might reset this */ 3212. freeinv(obj); /* hide it from destroy_item instead... */ 3213. setnotworn(obj); /* so we need to do this ourselves */ 3214. 3215. if (obj->spe <= 0) { 3216. pline(nothing_else_happens); 3217. goto discard_broken_wand; 3218. } 3219. obj->ox = u.ux; 3220. obj->oy = u.uy; 3221. dmg = obj->spe * 4; 3222. affects_objects = FALSE; 3223. 3224. switch (obj->otyp) { 3225. case WAN_WISHING: 3226. case WAN_NOTHING: 3227. case WAN_LOCKING: 3228. case WAN_PROBING: 3229. case WAN_ENLIGHTENMENT: 3230. case WAN_OPENING: 3231. case WAN_SECRET_DOOR_DETECTION: 3232. pline(nothing_else_happens); 3233. goto discard_broken_wand; 3234. case WAN_DEATH: 3235. case WAN_LIGHTNING: 3236. dmg *= 4; 3237. goto wanexpl; 3238. case WAN_COLD: 3239. expltype = EXPL_FROSTY; 3240. dmg *= 2; 3241. case WAN_MAGIC_MISSILE: 3242. wanexpl: 3243. explode(u.ux, u.uy, ZT_MAGIC_MISSILE, dmg, WAND_CLASS, expltype); 3244. makeknown(obj->otyp); /* explode described the effect */ 3245. goto discard_broken_wand; 3246. /*WAC for wands of fireball- no double damage 3247. * As well, effect is the same as fire, so no makeknown 3248. */ 3249. case WAN_FIRE: 3250. dmg *= 2; 3251. case WAN_FIREBALL: 3252. expltype = EXPL_FIERY; 3253. explode(u.ux, u.uy, ZT_FIRE, dmg, WAND_CLASS, expltype); 3254. if (obj->dknown && !objects[obj->otyp].oc_name_known && 3255. !objects[obj->otyp].oc_uname) 3256. docall(obj); 3257. goto discard_broken_wand; 3258. case WAN_STRIKING: 3259. /* we want this before the explosion instead of at the very end */ 3260. pline("A wall of force smashes down around you!"); 3261. dmg = d(1 + obj->spe,6); /* normally 2d12 */ 3262. case WAN_CANCELLATION: 3263. case WAN_POLYMORPH: 3264. case WAN_UNDEAD_TURNING: 3265. case WAN_DRAINING: /* KMH */ 3266. affects_objects = TRUE; 3267. break; 3268. case WAN_TELEPORTATION: 3269. /* WAC make tele trap if you broke a wand of teleport */ 3270. /* But make sure the spot is valid! */ 3271. if ((obj->spe > 2) && rn2(obj->spe - 2) && !level.flags.noteleport && 3272. !u.uswallow && !On_stairs(u.ux, u.uy) && (!IS_FURNITURE(levl[u.ux][u.uy].typ) && 3273. !IS_ROCK(levl[u.ux][u.uy].typ) && 3274. !closed_door(u.ux, u.uy) && !t_at(u.ux, u.uy))) { 3275. 3276. struct trap *ttmp; 3277. 3278. ttmp = maketrap(u.ux, u.uy, TELEP_TRAP); 3279. if (ttmp) { 3280. ttmp->madeby_u = 1; 3281. newsym(u.ux, u.uy); /* if our hero happens to be invisible */ 3282. if (*in_rooms(u.ux,u.uy,SHOPBASE)) { 3283. /* shopkeeper will remove it */ 3284. add_damage(u.ux, u.uy, 0L); 3285. } 3286. } 3287. } 3288. affects_objects = TRUE; 3289. break; 3290. case WAN_CREATE_HORDE: /* More damage than Create monster */ 3291. dmg *= 2; 3292. break; 3293. case WAN_HEALING: 3294. case WAN_EXTRA_HEALING: 3295. dmg = 0; 3296. break; 3297. default: 3298. break; 3299. } 3300. 3301. /* magical explosion and its visual effect occur before specific effects */ 3302. explode(obj->ox, obj->oy, ZT_MAGIC_MISSILE, dmg ? rnd(dmg) : 0, WAND_CLASS, 3303. EXPL_MAGICAL); 3304. 3305. /* this makes it hit us last, so that we can see the action first */ 3306. for (i = 0; i <= 8; i++) { 3307. bhitpos.x = x = obj->ox + xdir[i]; 3308. bhitpos.y = y = obj->oy + ydir[i]; 3309. if (!isok(x,y)) continue; 3310. 3311. if (obj->otyp == WAN_DIGGING) { 3312. if(dig_check(BY_OBJECT, FALSE, x, y)) { 3313. if (IS_WALL(levl[x][y].typ) || IS_DOOR(levl[x][y].typ)) { 3314. /* normally, pits and holes don't anger guards, but they 3315. * do if it's a wall or door that's being dug */ 3316. watch_dig((struct monst *)0, x, y, TRUE); 3317. if (*in_rooms(x,y,SHOPBASE)) shop_damage = TRUE; 3318. } 3319. digactualhole(x, y, BY_OBJECT, 3320. (rn2(obj->spe) < 3 || !Can_dig_down(&u.uz)) ? 3321. PIT : HOLE); 3322. } 3323. continue; 3324. /* WAC catch Create Horde wands too */ 3325. /* MAR make the monsters around you */ 3326. } else if(obj->otyp == WAN_CREATE_MONSTER 3327. || obj->otyp == WAN_CREATE_HORDE) { 3328. /* u.ux,u.uy creates it near you--x,y might create it in rock */ 3329. (void) makemon((struct permonst *)0, u.ux, u.uy, NO_MM_FLAGS); 3330. continue; 3331. } else { 3332. if (x == u.ux && y == u.uy) { 3333. /* teleport objects first to avoid race with tele control and 3334. autopickup. Other wand/object effects handled after 3335. possible wand damage is assessed */ 3336. if (obj->otyp == WAN_TELEPORTATION && 3337. affects_objects && level.objects[x][y]) { 3338. (void) bhitpile(obj, bhito, x, y); 3339. if (flags.botl) bot(); /* potion effects */ 3340. /* makeknown is handled in zapyourself */ 3341. } 3342. damage = zapyourself(obj, FALSE); 3343. if (damage) { 3344. if (hero_broke) { 3345. Sprintf(buf, "killed %sself by breaking a wand", uhim()); 3346. losehp(damage, buf, NO_KILLER_PREFIX); 3347. } else 3348. losehp(damage, "exploding wand", KILLED_BY_AN); 3349. } 3350. if (flags.botl) bot(); /* blindness */ 3351. } else if ((mon = m_at(x, y)) != 0 && !DEADMONSTER(mon)) { 3352. (void) bhitm(mon, obj); 3353. /* if (flags.botl) bot(); */ 3354. } 3355. if (affects_objects && level.objects[x][y]) { 3356. (void) bhitpile(obj, bhito, x, y); 3357. if (flags.botl) bot(); /* potion effects */ 3358. } 3359. } 3360. } 3361. 3362. /* Note: if player fell thru, this call is a no-op. 3363. Damage is handled in digactualhole in that case */ 3364. if (shop_damage) pay_for_damage("dig into", FALSE); 3365. 3366. if (obj->otyp == WAN_LIGHT) 3367. litroom(TRUE, obj); /* only needs to be done once */ 3368. 3369. discard_broken_wand: 3370. obj = current_wand; /* [see dozap() and destroy_item()] */ 3371. current_wand = 0; 3372. if (obj) 3373. delobj(obj); 3374. nomul(0); 3375. return 1; 3376. } 3377. 3378. STATIC_OVL boolean 3379. uhave_graystone() 3380. { 3381. register struct obj *otmp; 3382. 3383. for(otmp = invent; otmp; otmp = otmp->nobj) 3384. if(is_graystone(otmp)) 3385. return TRUE; 3386. return FALSE; 3387. } 3388. 3389. STATIC_OVL void 3390. add_class(cl, class) 3391. char *cl; 3392. char class; 3393. { 3394. char tmp[2]; 3395. tmp[0] = class; 3396. tmp[1] = '\0'; 3397. Strcat(cl, tmp); 3398. } 3399. 3400. int 3401. doapply() 3402. { 3403. struct obj *obj; 3404. register int res = 1; 3405. register boolean can_use = FALSE; 3406. char class_list[MAXOCLASSES+2]; 3407. 3408. if(check_capacity((char *)0)) return (0); 3409. 3410. if (carrying(POT_OIL) || uhave_graystone()) 3411. Strcpy(class_list, tools_too); 3412. else 3413. Strcpy(class_list, tools); 3414. if (carrying(CREAM_PIE) || carrying(EUCALYPTUS_LEAF)) 3415. add_class(class_list, FOOD_CLASS); 3416. 3417. obj = getobj(class_list, "use or apply"); 3418. if(!obj) return 0; 3419. 3420. if (obj->oartifact && !touch_artifact(obj, &youmonst)) 3421. return 1; /* evading your grasp costs a turn; just be 3422. grateful that you don't drop it as well */ 3423. 3424. if (obj->oclass == WAND_CLASS) 3425. return do_break_wand(obj); 3426. 3427. switch(obj->otyp){ 3428. case BLINDFOLD: 3429. case LENSES: 3430. if (obj == ublindf) { 3431. if (!cursed(obj)) Blindf_off(obj); 3432. } else if (!ublindf) 3433. Blindf_on(obj); 3434. else You("are already %s.", 3435. ublindf->otyp == TOWEL ? "covered by a towel" : 3436. ublindf->otyp == BLINDFOLD ? "wearing a blindfold" : 3437. "wearing lenses"); 3438. break; 3439. case CREAM_PIE: 3440. res = use_cream_pie(obj); 3441. break; 3442. case BULLWHIP: 3443. res = use_whip(obj); 3444. break; 3445. case GRAPPLING_HOOK: 3446. res = use_grapple(obj); 3447. break; 3448. case LARGE_BOX: 3449. case CHEST: 3450. case ICE_BOX: 3451. case SACK: 3452. case BAG_OF_HOLDING: 3453. case OILSKIN_SACK: 3454. res = use_container(&obj, 1); 3455. break; 3456. case BAG_OF_TRICKS: 3457. bagotricks(obj); 3458. break; 3459. case CAN_OF_GREASE: 3460. use_grease(obj); 3461. break; 3462. #ifdef TOURIST 3463. case CREDIT_CARD: 3464. #endif 3465. case LOCK_PICK: 3466. case SKELETON_KEY: 3467. (void) pick_lock(&obj); 3468. break; 3469. case PICK_AXE: 3470. case DWARVISH_MATTOCK: /* KMH, balance patch -- the mattock is a pick, too */ 3471. res = use_pick_axe(obj); 3472. break; 3473. case FISHING_POLE: 3474. res = use_pole(obj); 3475. break; 3476. case TINNING_KIT: 3477. use_tinning_kit(obj); 3478. break; 3479. case LEASH: 3480. use_leash(obj); 3481. break; 3482. #ifdef STEED 3483. case SADDLE: 3484. res = use_saddle(obj); 3485. break; 3486. #endif 3487. case MAGIC_WHISTLE: 3488. use_magic_whistle(obj); 3489. break; 3490. case TIN_WHISTLE: 3491. use_whistle(obj); 3492. break; 3493. case EUCALYPTUS_LEAF: 3494. /* MRKR: Every Australian knows that a gum leaf makes an */ 3495. /* excellent whistle, especially if your pet is a */ 3496. /* tame kangaroo named Skippy. */ 3497. if (obj->blessed) { 3498. use_magic_whistle(obj); 3499. /* sometimes the blessing will be worn off */ 3500. if (!rn2(49)) { 3501. if (!Blind) { 3502. char buf[BUFSZ]; 3503. 3504. pline("%s %s %s.", Shk_Your(buf, obj), 3505. aobjnam(obj, "glow"), hcolor("brown")); 3506. obj->bknown = 1; 3507. } 3508. unbless(obj); 3509. } 3510. } else { 3511. use_whistle(obj); 3512. } 3513. break; 3514. case STETHOSCOPE: 3515. res = use_stethoscope(obj); 3516. break; 3517. case MIRROR: 3518. res = use_mirror(obj); 3519. break; 3520. # ifdef P_SPOON 3521. case SPOON: 3522. pline("It's a finely crafted antique spoon; what do you want to do with it?"); 3523. break; 3524. # endif /* P_SPOON */ 3525. case BELL: 3526. case BELL_OF_OPENING: 3527. use_bell(&obj); 3528. break; 3529. case CANDELABRUM_OF_INVOCATION: 3530. use_candelabrum(obj); 3531. break; 3532. case WAX_CANDLE: 3533. /* STEPHEN WHITE'S NEW CODE */ 3534. case MAGIC_CANDLE: 3535. case TALLOW_CANDLE: 3536. use_candle(&obj); 3537. break; 3538. #ifdef LIGHTSABERS 3539. case GREEN_LIGHTSABER: 3540. #ifdef D_SABER 3541. case BLUE_LIGHTSABER: 3542. #endif 3543. case RED_LIGHTSABER: 3544. case RED_DOUBLE_LIGHTSABER: 3545. if (uwep != obj && !wield_tool(obj, (const char *)0)) break; 3546. /* Fall through - activate via use_lamp */ 3547. #endif 3548. case OIL_LAMP: 3549. case MAGIC_LAMP: 3550. case BRASS_LANTERN: 3551. use_lamp(obj); 3552. break; 3553. case TORCH: 3554. res = use_torch(obj); 3555. break; 3556. case POT_OIL: 3557. light_cocktail(obj); 3558. break; 3559. #ifdef TOURIST 3560. case EXPENSIVE_CAMERA: 3561. res = use_camera(obj); 3562. break; 3563. #endif 3564. case TOWEL: 3565. res = use_towel(obj); 3566. break; 3567. case CRYSTAL_BALL: 3568. use_crystal_ball(obj); 3569. break; 3570. /* STEPHEN WHITE'S NEW CODE */ 3571. /* KMH, balance patch -- source of abuse */ 3572. #if 0 3573. case ORB_OF_ENCHANTMENT: 3574. if(obj->spe > 0) { 3575. 3576. check_unpaid(obj); 3577. if(uwep && (uwep->oclass == WEAPON_CLASS || 3578. uwep->otyp == PICK_AXE || 3579. uwep->otyp == UNICORN_HORN)) { 3580. if (uwep->spe < 5) { 3581. if (obj->blessed) { 3582. if (!Blind) pline("Your %s glows silver.",xname(uwep)); 3583. uwep->spe += rnd(2); 3584. } else if (obj->cursed) { 3585. if (!Blind) pline("Your %s glows black.",xname(uwep)); 3586. uwep->spe -= rnd(2); 3587. } else { 3588. if (rn2(3)) { 3589. if (!Blind) pline("Your %s glows bright for a moment." ,xname(uwep)); 3590. uwep->spe += 1; 3591. } else { 3592. if (!Blind) pline("Your %s glows dark for a moment." ,xname(uwep)); 3593. uwep->spe -= 1; 3594. } 3595. } 3596. } else pline("Nothing seems to happen."); 3597. 3598. if (uwep->spe > 5) uwep->spe = 5; 3599. 3600. } else pline("The orb glows for a moment, then fades."); 3601. consume_obj_charge(obj, FALSE); 3602. 3603. } else pline("This orb is burnt out."); 3604. break; 3605. case ORB_OF_CHARGING: 3606. if(obj->spe > 0) { 3607. register struct obj *otmp; 3608. makeknown(ORB_OF_CHARGING); 3609. consume_obj_charge(obj, TRUE); 3610. otmp = getobj(all_count, "charge"); 3611. if (!otmp) break; 3612. recharge(otmp, obj->cursed ? -1 : (obj->blessed ? 1 : 0)); 3613. } else pline("This orb is burnt out."); 3614. break; 3615. case ORB_OF_DESTRUCTION: 3616. useup(obj); 3617. pline("As you activate the orb, it explodes!"); 3618. explode(u.ux, u.uy, ZT_SPELL(ZT_MAGIC_MISSILE), d(12,6), WAND_CLASS); 3619. check_unpaid(obj); 3620. break; 3621. #endif 3622. case MAGIC_MARKER: 3623. res = dowrite(obj); 3624. break; 3625. case TIN_OPENER: 3626. if(!carrying(TIN)) { 3627. You("have no tin to open."); 3628. goto xit; 3629. } 3630. You("cannot open a tin without eating or discarding its contents."); 3631. if(flags.verbose) 3632. pline("In order to eat, use the 'e' command."); 3633. if(obj != uwep) 3634. pline("Opening the tin will be much easier if you wield the tin opener."); 3635. goto xit; 3636. 3637. case FIGURINE: 3638. use_figurine(&obj); 3639. break; 3640. case UNICORN_HORN: 3641. use_unicorn_horn(obj); 3642. break; 3643. case WOODEN_FLUTE: 3644. case MAGIC_FLUTE: 3645. case TOOLED_HORN: 3646. case FROST_HORN: 3647. case FIRE_HORN: 3648. case WOODEN_HARP: 3649. case MAGIC_HARP: 3650. case BUGLE: 3651. case LEATHER_DRUM: 3652. case DRUM_OF_EARTHQUAKE: 3653. /* KMH, balance patch -- removed 3654. case PAN_PIPE_OF_SUMMONING: 3655. case PAN_PIPE_OF_THE_SEWERS: 3656. case PAN_PIPE:*/ 3657. res = do_play_instrument(obj); 3658. break; 3659. case MEDICAL_KIT: 3660. if (Role_if(PM_HEALER)) can_use = TRUE; 3661. else if ((Role_if(PM_PRIEST) || Role_if(PM_MONK) || 3662. Role_if(PM_UNDEAD_SLAYER) || Role_if(PM_SAMURAI)) && 3663. !rn2(2)) can_use = TRUE; 3664. else if(!rn2(4)) can_use = TRUE; 3665. 3666. if (obj->cursed && rn2(3)) can_use = FALSE; 3667. if (obj->blessed && rn2(3)) can_use = TRUE; 3668. 3669. makeknown(MEDICAL_KIT); 3670. if (obj->cobj) { 3671. struct obj *otmp; 3672. for (otmp = obj->cobj; otmp; otmp = otmp->nobj) 3673. if (otmp->otyp == PILL) 3674. break; 3675. if (!otmp) 3676. You_cant("find any more pills in %s.", yname(obj)); 3677. else if (!is_edible(otmp)) 3678. You("find, but cannot eat, a white pill in %s.", 3679. yname(obj)); 3680. else { 3681. check_unpaid(obj); 3682. if (otmp->quan > 1L) 3683. otmp->quan--; 3684. else { 3685. obj_extract_self(otmp); 3686. obfree(otmp, (struct obj *)0); 3687. } 3688. /* 3689. * Note that while white and pink pills share the 3690. * same otyp value, they are quite different. 3691. */ 3692. You("take a white pill from %s and swallow it.", 3693. yname(obj)); 3694. if (can_use) { 3695. if (Sick) make_sick(0L, (char *) 0,TRUE ,SICK_ALL); 3696. else if (Blinded > (long)(u.ucreamed+1)) 3697. make_blinded(u.ucreamed ? 3698. (long)(u.ucreamed+1) : 0L, TRUE); 3699. else if (HHallucination) 3700. make_hallucinated(0L, TRUE, 0L); 3701. else if (Vomiting) make_vomiting(0L, TRUE); 3702. else if (HConfusion) make_confused(0L, TRUE); 3703. else if (HStun) make_stunned(0L, TRUE); 3704. else if (u.uhp < u.uhpmax) { 3705. u.uhp += rn1(10,10); 3706. if (u.uhp > u.uhpmax) u.uhp = u.uhpmax; 3707. You_feel("better."); 3708. flags.botl = TRUE; 3709. } else pline(nothing_happens); 3710. } else if (!rn2(3)) 3711. pline("Nothing seems to happen."); 3712. else if (!Sick) 3713. make_sick(rn1(10,10), "bad pill", TRUE, 3714. SICK_VOMITABLE); 3715. else { 3716. You("seem to have made your condition worse!"); 3717. losehp(rn1(10,10), "a drug overdose", KILLED_BY); 3718. } 3719. } 3720. } else You("seem to be out of medical supplies"); 3721. break; 3722. case HORN_OF_PLENTY: /* not a musical instrument */ 3723. if (obj->spe > 0) { 3724. struct obj *otmp; 3725. const char *what; 3726. 3727. consume_obj_charge(obj, TRUE); 3728. if (!rn2(13)) { 3729. otmp = mkobj(POTION_CLASS, FALSE); 3730. /* KMH, balance patch -- rewritten */ 3731. while ((otmp->otyp == POT_SICKNESS) || 3732. objects[otmp->otyp].oc_magic) 3733. otmp->otyp = rnd_class(POT_BOOZE, POT_WATER); 3734. what = "A potion"; 3735. } else { 3736. otmp = mkobj(FOOD_CLASS, FALSE); 3737. if (otmp->otyp == FOOD_RATION && !rn2(7)) 3738. otmp->otyp = LUMP_OF_ROYAL_JELLY; 3739. what = "Some food"; 3740. } 3741. pline("%s spills out.", what); 3742. otmp->blessed = obj->blessed; 3743. otmp->cursed = obj->cursed; 3744. otmp->owt = weight(otmp); 3745. otmp = hold_another_object(otmp, u.uswallow ? 3746. "Oops! %s out of your reach!" : 3747. (Is_airlevel(&u.uz) || 3748. Is_waterlevel(&u.uz) || 3749. levl[u.ux][u.uy].typ < IRONBARS || 3750. levl[u.ux][u.uy].typ >= ICE) ? 3751. "Oops! %s away from you!" : 3752. "Oops! %s to the floor!", 3753. The(aobjnam(otmp, "slip")), 3754. (const char *)0); 3755. makeknown(HORN_OF_PLENTY); 3756. } else 3757. pline(nothing_happens); 3758. break; 3759. case LAND_MINE: 3760. case BEARTRAP: 3761. use_trap(obj); 3762. break; 3763. case FLINT: 3764. case LUCKSTONE: 3765. case LOADSTONE: 3766. case TOUCHSTONE: 3767. case HEALTHSTONE: 3768. case WHETSTONE: 3769. use_stone(obj); 3770. break; 3771. #ifdef FIREARMS 3772. case ASSAULT_RIFLE: 3773. /* Switch between WP_MODE_SINGLE, WP_MODE_BURST and WP_MODE_AUTO */ 3774. 3775. if (obj->altmode == WP_MODE_AUTO) { 3776. obj->altmode = WP_MODE_BURST; 3777. } else if (obj->altmode == WP_MODE_BURST) { 3778. obj->altmode = WP_MODE_SINGLE; 3779. } else { 3780. obj->altmode = WP_MODE_AUTO; 3781. } 3782. 3783. You("switch %s to %s mode.", yname(obj), 3784. ((obj->altmode == WP_MODE_SINGLE) ? "single shot" : 3785. ((obj->altmode == WP_MODE_BURST) ? "burst" : 3786. "full automatic"))); 3787. break; 3788. case AUTO_SHOTGUN: 3789. case SUBMACHINE_GUN: 3790. if (obj->altmode == WP_MODE_AUTO) obj-> altmode = WP_MODE_SINGLE; 3791. else obj->altmode = WP_MODE_AUTO; 3792. You("switch %s to %s mode.", yname(obj), 3793. (obj->altmode ? "semi-automatic" : "full automatic")); 3794. break; 3795. case FRAG_GRENADE: 3796. case GAS_GRENADE: 3797. if (!obj->oarmed) { 3798. You("arm %s.", yname(obj)); 3799. arm_bomb(obj, TRUE); 3800. } else pline("It's already armed!"); 3801. break; 3802. case STICK_OF_DYNAMITE: 3803. light_cocktail(obj); 3804. break; 3805. #endif 3806. default: 3807. /* KMH, balance patch -- polearms can strike at a distance */ 3808. if (is_pole(obj)) { 3809. res = use_pole(obj); 3810. break; 3811. } else if (is_pick(obj) || is_axe(obj)) { 3812. res = use_pick_axe(obj); 3813. break; 3814. } 3815. pline("Sorry, I don't know how to use that."); 3816. xit: 3817. nomul(0); 3818. return 0; 3819. } 3820. if (res && obj && obj->oartifact) arti_speak(obj); 3821. nomul(0); 3822. return res; 3823. } 3824. 3825. /* Keep track of unfixable troubles for purposes of messages saying you feel 3826. * great. 3827. */ 3828. int 3829. unfixable_trouble_count(is_horn) 3830. boolean is_horn; 3831. { 3832. int unfixable_trbl = 0; 3833. 3834. if (Stoned) unfixable_trbl++; 3835. if (Strangled) unfixable_trbl++; 3836. if (Wounded_legs 3837. #ifdef STEED 3838. && !u.usteed 3839. #endif 3840. ) unfixable_trbl++; 3841. if (Slimed) unfixable_trbl++; 3842. /* lycanthropy is not desirable, but it doesn't actually make you feel 3843. bad */ 3844. 3845. /* we'll assume that intrinsic stunning from being a bat/stalker 3846. doesn't make you feel bad */ 3847. if (!is_horn) { 3848. if (Confusion) unfixable_trbl++; 3849. if (Sick) unfixable_trbl++; 3850. if (HHallucination) unfixable_trbl++; 3851. if (Vomiting) unfixable_trbl++; 3852. if (HStun) unfixable_trbl++; 3853. } 3854. return unfixable_trbl; 3855. } 3856. 3857. #endif /* OVLB */ 3858. 3859. /*apply.c*/
|