abstract
| - Below is the full text to apply.c from the source code of NetHack 3.0.0. To link to a particular line, write [[NetHack 3.0.0/apply.c#line123]], for example. Warning! This is the source code from an old release. For the latest release, see Source code 1. /* SCCS Id: @(#)apply.c 3.0 88/10/24 2. /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ 3. /* NetHack may be freely redistributed. See license for details. */ 4. 5. /* block some unused #defines to avoid overloading some cpp's */ 6. #define MONATTK_H 7. #include "hack.h" 8. #include "edog.h" 9. 10. #ifdef MUSIC 11. #define IS_INSTRUMENT(typ) ((typ) >= FLUTE && (typ) <= DRUM_OF_EARTHQUAKE) 12. #endif /* MUSIC /**/ 13. 14. static const char tools[] = { TOOL_SYM, 0 }; 15. 16. static boolean did_dig_msg; 17. 18. /* version of bhit for cameras and mirrors */ 19. static 20. struct monst * 21. bchit(ddx,ddy,range,sym) register int ddx,ddy,range; char sym; { 22. register struct monst *mtmp = (struct monst *) 0; 23. register int bchx = u.ux, bchy = u.uy; 24. 25. if(sym) { 26. Tmp_at2(-1, sym); /* open call */ 27. #ifdef MSDOSCOLOR 28. Tmp_at2(-3, (int)AT_WHITE); 29. #endif 30. } 31. while(range--) { 32. bchx += ddx; 33. bchy += ddy; 34. if(levl[bchx][bchy].mmask) { 35. mtmp = m_at(bchx,bchy); 36. break; 37. } 38. if(!ZAP_POS(levl[bchx][bchy].typ) || 39. (IS_DOOR(levl[bchx][bchy].typ) && 40. (levl[bchx][bchy].doormask & (D_CLOSED | D_LOCKED))) 41. ) { 42. bchx -= ddx; 43. bchy -= ddy; 44. break; 45. } 46. if(sym) Tmp_at2(bchx, bchy); 47. } 48. if(sym) Tmp_at2(-1, -1); 49. return(mtmp); 50. } 51. 52. static void 53. use_camera(obj) /* register */ struct obj *obj; { 54. register struct monst *mtmp; 55. if(!getdir(1)){ /* ask: in what direction? */ 56. flags.move = multi = 0; 57. return; 58. } 59. if(u.uswallow) { 60. You("take a picture of %s's stomach.", mon_nam(u.ustuck)); 61. return; 62. } 63. if(obj->cursed && !rn2(2)) goto blindu; 64. if(u.dz) { 65. You("take a picture of the %s.", 66. (u.dz > 0) ? "floor" : "ceiling"); 67. return; 68. } 69. if(!u.dx && !u.dy && !u.dz) { 70. blindu: 71. if(!Blind) { 72. You("are blinded by the flash!"); 73. make_blinded((long)rnd(25),FALSE); 74. } 75. return; 76. } 77. if(mtmp = bchit(u.dx, u.dy, COLNO, '!')) { 78. if(mtmp->msleep){ 79. mtmp->msleep = 0; 80. pline("The flash awakens %s.", mon_nam(mtmp)); /* a3 */ 81. } else 82. if(mtmp->data->mlet != S_YLIGHT) 83. if(mtmp->mcansee || mtmp->mblinded){ 84. register int tmp = dist(mtmp->mx,mtmp->my); 85. register int tmp2; 86. if(cansee(mtmp->mx,mtmp->my)) 87. pline("%s is blinded by the flash!", Monnam(mtmp)); 88. if(mtmp->data == &mons[PM_GREMLIN]) { 89. /* Rule #1: Keep them out of the light. */ 90. kludge("%s cries out in pain!", Monnam(mtmp)); 91. if (mtmp->mhp > 1) mtmp->mhp--; 92. } 93. setmangry(mtmp); 94. if(tmp < 9 && !mtmp->isshk && rn2(4)) { 95. mtmp->mflee = 1; 96. if(rn2(4)) mtmp->mfleetim = rnd(100); 97. } 98. if(tmp < 3) mtmp->mcansee = mtmp->mblinded = 0; 99. else { 100. tmp2 = mtmp->mblinded; 101. tmp2 += rnd(1 + 50/tmp); 102. if(tmp2 > 127) tmp2 = 127; 103. mtmp->mblinded = tmp2; 104. mtmp->mcansee = 0; 105. } 106. } 107. } 108. } 109. 110. /* Strictly speaking it makes no sense for usage of a stethoscope to 111. not take any time; however, unless it did, the stethoscope would be 112. almost useless. */ 113. static void 114. use_stethoscope(obj) register struct obj *obj; { 115. register struct monst *mtmp; 116. register struct rm *lev; 117. register int rx, ry; 118. if(!freehand()) { 119. You("have no free %s!", body_part(HAND)); 120. return; 121. } 122. if (!getdir(1)) { 123. flags.move=multi=0; 124. return; 125. } 126. if(u.dz < 0 || (u.dz && Levitation)) { 127. You("can't reach the %s!", u.dz<0 ? "ceiling" : "floor"); 128. return; 129. } 130. if(obj->cursed && !rn2(2)) { 131. You("hear your heart beat."); 132. return; 133. } 134. if(u.dz) { 135. #ifdef STRONGHOLD 136. if (dlevel == stronghold_level) 137. You("hear the crackling of hellfire."); 138. else 139. #endif 140. pline("The floor seems healthy enough."); 141. return; 142. } 143. if (Stunned || (Confusion && !rn2(5))) confdir(); 144. if (!u.dx && !u.dy && !u.dz) { 145. ustatusline(); 146. return; 147. } 148. rx = u.ux + u.dx; ry = u.uy + u.dy; 149. if(u.uswallow) { 150. mstatusline(u.ustuck); 151. return; 152. } 153. if (!isok(rx,ry)) { 154. You("hear a faint typing noise."); 155. return; 156. } 157. lev = &levl[rx][ry]; 158. if(lev->mmask) { 159. mtmp = m_at(rx,ry); 160. mstatusline(mtmp); 161. return; 162. } 163. if(lev->typ == SDOOR) { 164. You("hear a hollow sound! This must be a secret door!"); 165. lev->typ = DOOR; 166. lev->seen = 0; /* force prl */ 167. prl(rx,ry); 168. return; 169. } 170. if(lev->typ == SCORR) { 171. You("hear a hollow sound! This must be a secret passage!"); 172. lev->typ = CORR; 173. lev->seen = 0; /* force prl */ 174. prl(rx,ry); 175. return; 176. } 177. You("hear nothing special."); 178. } 179. 180. /* ARGSUSED */ 181. static void 182. use_whistle(obj) 183. struct obj *obj; { 184. You("produce a high whistling sound."); 185. wake_nearby(); 186. } 187. 188. static void 189. use_magic_whistle(obj) 190. struct obj *obj; { 191. register struct monst *mtmp = fmon; 192. 193. if(obj->cursed && !rn2(2)) { 194. You("produce a high-pitched humming noise."); 195. wake_nearby(); 196. } else { 197. You("produce a %s whistling sound.", Hallucination 198. ? "normal" : "strange"); 199. while(mtmp) { 200. if(mtmp->mtame) mnexto(mtmp); 201. mtmp = mtmp->nmon; 202. } 203. } 204. } 205. 206. boolean 207. um_dist(x,y,n) 208. register xchar x, y, n; 209. { 210. return(abs(u.ux - x) > n || abs(u.uy - y) > n); 211. } 212. 213. #ifdef WALKIES 214. #define MAXLEASHED 2 215. 216. int 217. number_leashed() 218. { 219. register int i = 0; 220. register struct obj *obj; 221. 222. for(obj = invent; obj; obj = obj->nobj) 223. if(obj->otyp == LEASH && obj->leashmon != 0) i++; 224. return(i); 225. } 226. 227. void 228. o_unleash(otmp) /* otmp is about to be destroyed or stolen */ 229. register struct obj *otmp; 230. { 231. register struct monst *mtmp; 232. 233. for(mtmp = fmon; mtmp; mtmp = mtmp->nmon) 234. if(mtmp->m_id == (unsigned)otmp->leashmon) 235. mtmp->mleashed = 0; 236. otmp->leashmon = 0; 237. } 238. 239. void 240. m_unleash(mtmp) /* mtmp is about to die, or become untame */ 241. register struct monst *mtmp; 242. { 243. register struct obj *otmp; 244. 245. for(otmp = invent; otmp; otmp = otmp->nobj) 246. if(otmp->otyp == LEASH && 247. otmp->leashmon == (int)mtmp->m_id) 248. otmp->leashmon = 0; 249. mtmp->mleashed = 0; 250. } 251. 252. void 253. unleash_all() /* player is about to die (for bones) */ 254. { 255. register struct obj *otmp; 256. register struct monst *mtmp; 257. 258. for(otmp = invent; otmp; otmp = otmp->nobj) 259. if(otmp->otyp == LEASH) otmp->leashmon = 0; 260. for(mtmp = fmon; mtmp; mtmp = mtmp->nmon) 261. if(mtmp->mtame) mtmp->mleashed = 0; 262. } 263. 264. /* ARGSUSED */ 265. static void 266. use_leash(obj) 267. struct obj *obj; 268. { 269. register int x, y; 270. register struct monst *mtmp; 271. 272. if(!obj->leashmon && number_leashed() >= MAXLEASHED) { 273. You("can't leash additional pets."); 274. return; 275. } 276. 277. if(!getdir(1)) return; 278. 279. x = u.ux + u.dx; 280. y = u.uy + u.dy; 281. 282. if((x == u.ux) && (y == u.uy)) { 283. pline("Leash yourself? Very funny..."); 284. return; 285. } 286. 287. if(levl[x][y].mmask == 0) { 288. pline("There is no creature here."); 289. return; 290. } 291. 292. mtmp = m_at(x, y); 293. 294. if(!mtmp->mtame) { 295. pline("%s is not %s!", Monnam(mtmp), (!obj->leashmon) ? 296. "leashable" : "leashed"); 297. return; 298. } 299. if(!obj->leashmon) { 300. if(mtmp->mleashed) { 301. pline("This %s is already leashed!", lmonnam(mtmp)+4); 302. return; 303. } 304. You("slip the leash around your %s.", 305. mtmp->data->mname); 306. mtmp->mleashed = 1; 307. obj->leashmon = (int)mtmp->m_id; 308. if(mtmp->msleep) mtmp->msleep = 0; 309. return; 310. } 311. if(obj->leashmon != (int)mtmp->m_id) { 312. pline("This leash is not attached to that creature!"); 313. return; 314. } else { 315. if(obj->cursed) { 316. pline("The leash wouldn't come off!"); 317. return; 318. } 319. mtmp->mleashed = 0; 320. obj->leashmon = 0; 321. You("remove the leash from your %s.", 322. /* a hack to include the dogs full name. +4 eliminates */ 323. /* the 'the' at the start of the name */ 324. lmonnam(mtmp)+4); 325. } 326. return; 327. } 328. 329. boolean 330. next_to_u() 331. { 332. register struct monst *mtmp; 333. register struct obj *otmp; 334. 335. for(mtmp = fmon; mtmp; mtmp = mtmp->nmon) 336. if(mtmp->mleashed) { 337. if(dist(mtmp->mx,mtmp->my) > 2) mnexto(mtmp); 338. if(dist(mtmp->mx,mtmp->my) > 2) { 339. for(otmp = invent; otmp; otmp = otmp->nobj) 340. if(otmp->otyp == LEASH && 341. otmp->leashmon == (int)mtmp->m_id) { 342. if(otmp->cursed) return(FALSE); 343. You("feel %s leash go slack.", 344. (number_leashed() > 1) ? "a" : "the"); 345. mtmp->mleashed = 0; 346. otmp->leashmon = 0; 347. } 348. } 349. } 350. return(TRUE); 351. } 352. 353. struct obj * 354. get_mleash(mtmp) /* assuming mtmp->mleashed has been checked */ 355. register struct monst *mtmp; 356. { 357. register struct obj *otmp; 358. 359. otmp = invent; 360. while(otmp) { 361. if(otmp->otyp == LEASH && otmp->leashmon == (int)mtmp->m_id) 362. return(otmp); 363. otmp = otmp->nobj; 364. } 365. return((struct obj *)0); 366. } 367. 368. void 369. check_leash(x, y) 370. register xchar x, y; 371. { 372. register struct obj *otmp; 373. register struct monst *mtmp = fmon; 374. 375. for(otmp = invent; otmp; otmp = otmp->nobj) 376. if(otmp->otyp == LEASH && otmp->leashmon != 0) { 377. while(mtmp) { 378. if((int)mtmp->m_id == otmp->leashmon && 379. (dist2(u.ux,u.uy,mtmp->mx,mtmp->my) > 380. dist2(x,y,mtmp->mx,mtmp->my)) 381. ) { 382. if(otmp->cursed) { 383. if(um_dist(mtmp->mx, mtmp->my, 5)) { 384. pline("%s chokes to death!",Monnam(mtmp)); 385. mondied(mtmp); 386. } else 387. if(um_dist(mtmp->mx, mtmp->my, 3)) 388. pline("%s chokes on the leash!", 389. Monnam(mtmp)); 390. } else { 391. if(um_dist(mtmp->mx, mtmp->my, 5)) { 392. pline("%s's leash snaps loose!",Monnam(mtmp)); 393. m_unleash(mtmp); 394. } else { 395. if(um_dist(mtmp->mx, mtmp->my, 3)) { 396. You("pull on the leash."); 397. # ifdef SOUNDS 398. if (mtmp->data->msound != MS_SILENT) 399. switch(rn2(3)) { 400. case 0: growl(mtmp); break; 401. case 1: yelp(mtmp); break; 402. default: whimper(mtmp); break; 403. } 404. # endif 405. } 406. } 407. } 408. } 409. mtmp = mtmp->nmon; 410. } 411. } 412. } 413. #endif /* WALKIES */ 414. 415. 416. static int 417. dig() { 418. register struct rm *lev; 419. register int dpx = dig_pos.x, dpy = dig_pos.y; 420. 421. lev = &levl[dpx][dpy]; 422. /* perhaps a nymph stole his pick-axe while he was busy digging */ 423. /* or perhaps he teleported away */ 424. if(u.uswallow || !uwep || uwep->otyp != PICK_AXE || 425. dig_level != dlevel || 426. ((dig_down && (dpx != u.ux || dpy != u.uy)) || 427. (!dig_down && dist(dpx,dpy) > 2))) 428. return(0); 429. 430. if(dig_down && is_maze_lev) { 431. pline("The floor here is too hard to dig in."); 432. return(0); 433. } 434. if(!dig_down && IS_ROCK(lev->typ) && !may_dig(dpx,dpy)) { 435. pline("This wall is too hard to dig into."); 436. return(0); 437. } 438. if(Fumbling && !rn2(3)) { 439. switch(rn2(3)) { 440. case 0: if(!welded(uwep)) { 441. You("fumble and drop your %s", xname(uwep)); 442. dropx(uwep); 443. } else { 444. pline("Ouch! Your %s bounces and hits you!", 445. xname(uwep)); 446. set_wounded_legs(RIGHT_SIDE, 5 + rnd(5)); 447. } 448. break; 449. case 1: pline("Bang! You hit with the broad side of the %s!", 450. xname(uwep)); break; 451. default: Your("swing misses its mark."); 452. break; 453. } 454. return(0); 455. } 456. dig_effort += 10 + abon() + uwep->spe + rn2(5); 457. if(dig_down) { 458. if(dig_effort > 250) { 459. dighole(); 460. dig_level = -1; 461. return(0); /* done with digging */ 462. } 463. if(dig_effort > 50) { 464. register struct trap *ttmp = t_at(dpx,dpy); 465. 466. if(!ttmp) { 467. ttmp = maketrap(dpx,dpy,PIT); 468. ttmp->tseen = 1; 469. if(Invisible) newsym(ttmp->tx,ttmp->ty); 470. You("have dug a pit."); 471. u.utrap = rn1(4,2); 472. u.utraptype = TT_PIT; 473. dig_level = -1; 474. return(0); 475. } 476. } 477. } else 478. if(dig_effort > 100) { 479. register char *digtxt; 480. register struct obj *obj; 481. 482. if(obj = sobj_at(BOULDER, dpx, dpy)) { 483. fracture_rock(obj); 484. digtxt = "The boulder falls apart."; 485. } else if(obj = sobj_at(STATUE, dpx, dpy)) { 486. if (break_statue(obj)) 487. digtxt = "The statue shatters."; 488. else 489. digtxt = "Instead of shattering, the statue suddenly comes alive!"; 490. } else if(!lev->typ || lev->typ == SCORR) { 491. lev->typ = CORR; 492. digtxt = "You succeeded in cutting away some rock."; 493. } else if(IS_WALL(lev->typ)) { 494. lev->typ = is_maze_lev ? ROOM : DOOR; 495. digtxt = "You just made an opening in the wall."; 496. } else if(lev->typ == SDOOR) { 497. lev->typ = DOOR; 498. digtxt = "You just broke through a secret door."; 499. if(!(lev->doormask & D_TRAPPED)) 500. lev->doormask = D_BROKEN; 501. } else if (IS_DOOR(lev->typ) && 502. (lev->doormask & (D_CLOSED | D_LOCKED))) { 503. digtxt = "You just broke a hole through the door."; 504. if(!(lev->doormask & D_TRAPPED)) 505. lev->doormask = D_BROKEN; 506. } else 507. digtxt = "Now what exactly was it that you were digging in?"; 508. mnewsym(dpx, dpy); 509. prl(dpx, dpy); 510. pline(digtxt); /* after mnewsym & prl */ 511. if(IS_DOOR(lev->typ) && (lev->doormask & D_TRAPPED)) { 512. b_trapped("door"); 513. lev->doormask = D_NODOOR; 514. } 515. dig_level = -1; 516. return(0); 517. } else { 518. if(IS_WALL(lev->typ) || 519. (IS_DOOR(lev->typ) && lev->doormask & (D_CLOSED | D_LOCKED))) { 520. register int rno = inroom(dpx,dpy); 521. 522. if(rno >= 0 && rooms[rno].rtype >= SHOPBASE) { 523. pline("This %s seems too hard to dig into.", 524. IS_DOOR(lev->typ) ? "door" : "wall"); 525. return(0); 526. } 527. } 528. if(!did_dig_msg) { 529. You("hit the %s with all your might.", 530. sobj_at(STATUE, dpx, dpy) ? "statue" : 531. sobj_at(BOULDER, dpx, dpy) ? "boulder" : 532. IS_DOOR(lev->typ) ? "door" : "rock"); 533. did_dig_msg = TRUE; 534. } 535. } 536. return(1); 537. } 538. 539. /* When will hole be finished? Very rough indication used by shopkeeper. */ 540. int 541. holetime() { 542. return( (occupation == dig) ? (250 - dig_effort)/20 : -1); 543. } 544. 545. void 546. dighole() 547. { 548. register struct trap *ttmp = t_at(u.ux, u.uy); 549. 550. if(is_maze_lev 551. #ifdef ENDGAME 552. || dlevel == ENDLEVEL 553. #endif 554. ) { 555. pline("The floor here seems too hard to dig in."); 556. } else { 557. if(IS_FURNITURE(levl[u.ux][u.uy].typ)) { 558. #if defined(ALTARS) && defined(THEOLOGY) 559. if(IS_ALTAR(levl[u.ux][u.uy].typ)) { 560. altar_wrath(u.ux, u.uy); 561. if(in_temple(u.ux, u.uy)) angry_priest(); 562. } 563. #endif 564. levl[u.ux][u.uy].typ = ROOM; 565. levl[u.ux][u.uy].altarmask = 0; 566. } 567. if(ttmp) 568. ttmp->ttyp = TRAPDOOR; 569. else 570. ttmp = maketrap(u.ux, u.uy, TRAPDOOR); 571. ttmp->tseen = 1; 572. if(Invisible) newsym(ttmp->tx,ttmp->ty); 573. pline("You've made a hole in the floor."); 574. if(!u.ustuck && !Levitation) { /* KAA */ 575. if(inshop()) 576. shopdig(1); 577. #ifdef WALKIES 578. if(!next_to_u()) 579. You("are jerked back by your pet!"); 580. else { 581. #endif 582. You("fall through..."); 583. if(u.utraptype == TT_PIT) { 584. u.utrap = 0; 585. u.utraptype = 0; 586. } 587. unsee(); 588. goto_level(dlevel+1, FALSE); 589. #ifdef WALKIES 590. } 591. #endif 592. } 593. } 594. } 595. 596. static boolean 597. wield_tool(obj) 598. struct obj *obj; 599. { 600. if(uwep && uwep->cursed) { 601. /* Andreas Bormann - ihnp4!decvax!mcvax!unido!ab */ 602. if(flags.verbose) { 603. pline("Since your weapon is welded to your %s,", 604. bimanual(uwep) ? 605. makeplural(body_part(HAND)) 606. : body_part(HAND)); 607. pline("you cannot wield that %s.", xname(obj)); 608. } 609. return(FALSE); 610. } 611. # ifdef POLYSELF 612. if(cantwield(uasmon)) { 613. You("can't hold it strongly enough."); 614. return(FALSE); 615. } 616. # endif 617. unweapon = TRUE; 618. You("now wield %s.", doname(obj)); 619. setuwep(obj); 620. if (uwep != obj) return(FALSE); /* rewielded old object after dying */ 621. return(TRUE); 622. } 623. 624. static int 625. use_pick_axe(obj) 626. struct obj *obj; 627. { 628. char dirsyms[12]; 629. register char *dsp = dirsyms, *sdp = flags.num_pad ? ndir : sdir; 630. register struct rm *lev; 631. register int rx, ry, res = 0; 632. register boolean isclosedoor = FALSE; 633. 634. if(obj != uwep) 635. if (!wield_tool(obj)) return(0); 636. else res = 1; 637. 638. while(*sdp) { 639. (void) movecmd(*sdp); /* sets u.dx and u.dy and u.dz */ 640. rx = u.ux + u.dx; 641. ry = u.uy + u.dy; 642. if(u.dz > 0 || (u.dz == 0 && isok(rx, ry) && 643. (IS_ROCK(levl[rx][ry].typ) 644. || sobj_at(STATUE, rx, ry) 645. || sobj_at(BOULDER, rx, ry)))) 646. *dsp++ = *sdp; 647. sdp++; 648. } 649. *dsp = 0; 650. pline("In what direction do you want to dig? [%s] ", dirsyms); 651. if(!getdir(0)) /* no txt */ 652. return(res); 653. if(u.uswallow && attack(u.ustuck)) /* return(1) */; 654. else if(u.dz < 0) You("cannot reach the ceiling."); 655. else if(!u.dx && !u.dy && !u.dz) { 656. int dam; 657. 658. dam = rnd(2) + dbon(); 659. if (dam <= 0) dam = 1; 660. You("hit yourself with your own pick-axe."); 661. losehp(dam, "self-inflicted wound"); 662. flags.botl=1; 663. return(1); 664. } else if(u.dz == 0) { 665. if(Stunned || (Confusion && !rn2(5))) confdir(); 666. rx = u.ux + u.dx; 667. ry = u.uy + u.dy; 668. lev = &levl[rx][ry]; 669. if(lev->mmask && attack(m_at(rx, ry))) 670. return(1); 671. if(!isok(rx, ry)) { 672. pline("Clash!"); 673. return(1); 674. } 675. isclosedoor = (IS_DOOR(lev->typ) && 676. (lev->doormask & (D_CLOSED | D_LOCKED))); 677. if(!IS_ROCK(lev->typ) 678. && (!IS_DOOR(lev->typ) || (lev->doormask==D_NODOOR 679. || lev->doormask & (D_ISOPEN | D_BROKEN))) 680. && !sobj_at(STATUE, rx, ry) 681. && !sobj_at(BOULDER, rx, ry)) { 682. /* ACCESSIBLE or POOL */ 683. You("swing your %s through thin air.", 684. aobjnam(obj, NULL)); 685. } else { 686. if(dig_pos.x != rx || dig_pos.y != ry 687. || dig_level != dlevel || dig_down) { 688. dig_down = FALSE; 689. dig_pos.x = rx; 690. dig_pos.y = ry; 691. dig_level = dlevel; 692. dig_effort = 0; 693. You("start %s.", 694. isclosedoor ? "chopping at the door" : 695. sobj_at(STATUE, rx, ry) ? 696. "chipping the statue" : 697. sobj_at(BOULDER, rx, ry) ? 698. "hitting the boulder" : 699. "digging"); 700. } else 701. You("continue %s.", 702. isclosedoor ? "chopping at the door" : 703. sobj_at(STATUE, rx, ry) ? 704. "chipping the statue" : 705. sobj_at(BOULDER, rx, ry) ? 706. "hitting the boulder" : 707. "digging"); 708. did_dig_msg = FALSE; 709. set_occupation(dig, "digging", 0); 710. } 711. } else if(Levitation) { 712. You("cannot reach the floor."); 713. } else { 714. if(dig_pos.x != u.ux || dig_pos.y != u.uy 715. || dig_level != dlevel || !dig_down) { 716. dig_down = TRUE; 717. dig_pos.x = u.ux; 718. dig_pos.y = u.uy; 719. dig_level = dlevel; 720. dig_effort = 0; 721. You("start digging in the floor."); 722. if(inshop()) 723. shopdig(0); 724. } else 725. You("continue digging in the floor."); 726. did_dig_msg = FALSE; 727. set_occupation(dig, "digging", 0); 728. } 729. return(1); 730. } 731. 732. #define WEAK 3 /* from eat.c */ 733. 734. #ifdef MEDUSA 735. static void 736. use_mirror(obj) 737. struct obj *obj; 738. { 739. register struct monst *mtmp; 740. register char mlet; 741. 742. if(!getdir(1)){ /* ask: in what direction? */ 743. flags.move = multi = 0; 744. return; 745. } 746. if(!u.dx && !u.dy && !u.dz) { 747. if(!Blind && !Invisible) 748. #ifdef POLYSELF 749. if(u.umonnum == PM_FLOATING_EYE) { 750. pline("Yikes! You've frozen yourself!"); 751. nomul(-rnd((MAXULEV+6) - (int)u.ulevel)); 752. } else if (u.usym == S_VAMPIRE || u.usym == S_DEMON) 753. You("don't seem to reflect anything."); 754. else if(u.umonnum == PM_UMBER_HULK) { 755. pline("Huh? That doesn't look like you!"); 756. make_confused(HConfusion + d(3,4),FALSE); 757. } else 758. #endif 759. if (Hallucination) You("look %s.", hcolor()); 760. else if (Sick) 761. You("look peakish."); 762. else if (u.uhs >= WEAK) 763. You("look undernourished."); 764. #ifdef POLYSELF 765. else if (u.usym == S_NYMPH 766. #ifdef HARD 767. || u.umonnum==PM_SUCCUBUS 768. #endif 769. ) 770. You("look beautiful in the mirror."); 771. #ifdef HARD 772. else if (u.umonnum == PM_INCUBUS) 773. You("look handsome in the mirror."); 774. #endif 775. #endif 776. else You("look as %s as ever.", 777. ACURR(A_CHA) > 14 ? 778. (poly_gender()==1 ? "beautiful" : "handsome") : 779. "ugly"); 780. else { 781. if (rn2(4-u.uluck/3) || !HTelepat || 782. (u.ukilled_medusa 783. #ifdef HARD 784. && u.udemigod 785. #endif 786. )) { 787. You("can't see your %s %s.", 788. ACURR(A_CHA) > 14 ? 789. (poly_gender()==1 ? "beautiful" : "handsome") : 790. "ugly", 791. body_part(FACE)); 792. } else { 793. static char buf[35]; 794. char *tm, *tl; int ll; 795. if (!u.ukilled_medusa && rn2(4)) { 796. tm = "n ugly snake-headed monster"; 797. ll = dlevel - medusa_level; 798. } 799. else { 800. tm = " powerful wizard"; 801. ll = dlevel - wiz_level; 802. } 803. if (ll < -10) tl = "far below you"; 804. else if (ll < -1) tl = "below you"; 805. else if (ll == -1) { 806. Sprintf(buf, "under your %s", makeplural( 807. body_part(FOOT))); 808. tl = buf; 809. } else if (ll == 0) tl = "very close to you"; 810. else if (ll == 1) { 811. Sprintf(buf, "above your %s", body_part(HEAD)); 812. tl = buf; 813. } else if (ll > 10) tl = "far above you"; 814. else tl = "above you"; 815. You("get an impression that a%s lives %s.", 816. tm, tl); 817. } 818. } 819. return; 820. } 821. if(u.uswallow) { 822. You("reflect %s's stomach.", mon_nam(u.ustuck)); 823. return; 824. } 825. if(u.dz) { 826. You("reflect the %s.", 827. (u.dz > 0) ? "floor" : "ceiling"); 828. return; 829. } 830. if((mtmp = bchit(u.dx, u.dy, COLNO, 0)) && haseyes(mtmp->data)) { 831. mlet = mtmp->data->mlet; 832. if(mtmp->msleep) { 833. if (!Blind) 834. pline ("%s is tired and doesn't look at your mirror.", 835. Monnam(mtmp)); 836. mtmp->msleep = 0; 837. } else if (!mtmp->mcansee) { 838. if (!Blind) 839. pline("%s can't see anything at the moment.", Monnam(mtmp)); 840. } else if (mtmp->minvis || mlet == S_VAMPIRE || 841. mlet == S_DEMON || mlet == S_GHOST) { 842. if (!Blind) 843. pline ("%s doesn't seem to reflect anything.", Monnam(mtmp)); 844. } else if (!mtmp->mcan) { 845. /* some monsters do special things */ 846. if(obj->cursed && !rn2(2)) { 847. if (!Blind) 848. pline("The mirror gets foggy and doesn't reflect!"); 849. return; 850. } else if(mtmp->data == &mons[PM_MEDUSA]) { 851. if (!Blind) 852. pline("%s is turned to stone!", Monnam(mtmp)); 853. stoned = TRUE; 854. killed(mtmp); 855. } else if(mtmp->data == &mons[PM_FLOATING_EYE]) { 856. if (!Blind) 857. pline("%s is frozen by its reflection.",Monnam(mtmp)); 858. mtmp->mfroz = 1; 859. } else if(mtmp->data == &mons[PM_UMBER_HULK]) { 860. if (!Blind) 861. pline ("%s has confused itself!", Monnam(mtmp)); 862. mtmp->mconf = 1; 863. } else if(mlet == S_NYMPH 864. #ifdef HARD 865. || mtmp->data==&mons[PM_SUCCUBUS] 866. #endif 867. ) { 868. if (!Blind) { 869. pline ("%s looks beautiful in your mirror.",Monnam(mtmp)); 870. pline ("She decides to take it!"); 871. } else pline ("It steals your mirror!"); 872. freeinv(obj); 873. mpickobj(mtmp,obj); 874. rloc(mtmp); 875. } 876. } else if (mlet != S_UNICORN && !humanoid(mtmp->data) && rn2(5)) { 877. if (!Blind) 878. pline ("%s is frightened by its reflection.", Monnam(mtmp)); 879. mtmp->mflee = 1; 880. mtmp->mfleetim += d(2,4); 881. } else if (!Blind) 882. pline("%s doesn't seem to mind %s reflection.", Monnam(mtmp), 883. (is_female(mtmp) ? "her" : 884. is_human(mtmp->data) ? "his" : "its")); 885. } 886. }/* use_mirror */ 887. 888. #endif 889. 890. static void 891. use_lamp(obj) 892. struct obj *obj; 893. { 894. if(obj->spe <= 0 || obj->otyp == MAGIC_LAMP ) { 895. pline("This lamp has no oil."); 896. return; 897. } 898. if(obj->cursed && !rn2(2)) 899. pline("The lamp flickers on for a moment and dies."); 900. else litroom(TRUE); 901. obj->spe -= 1; 902. } 903. 904. static void 905. use_crystal_ball(obj) 906. struct obj *obj; 907. { 908. char buf[BUFSZ]; 909. int oops, ret; 910. 911. if (Blind) { 912. pline("Too bad you can't see the crystal ball."); 913. return; 914. } 915. oops = (rnd(20) > ACURR(A_INT) || obj->cursed); 916. if (oops && (obj->spe > 0)) { 917. switch(rnd(5)) { 918. case 1 : pline("The crystal ball is too much to comprehend!"); 919. break; 920. case 2 : pline("The crystal ball confuses you!"); 921. make_confused(HConfusion + rnd(100),FALSE); 922. break; 923. case 3 : pline("The crystal ball damages your vision!"); 924. make_blinded(Blinded + rnd(100),FALSE); 925. break; 926. case 4 : pline("The crystal ball zaps your mind!"); 927. make_hallucinated(Hallucination + rnd(100),FALSE); 928. break; 929. case 5 : pline("The crystal ball explodes!"); 930. useup(obj); 931. losehp(rnd(30), "exploding crystal ball"); 932. break; 933. } 934. obj->spe -= 1; 935. return; 936. } 937. 938. pline("What do you want to look for? "); 939. getlin(buf); 940. clrlin(); 941. if (!buf[0] || buf[0] == '\033') { 942. if(flags.verbose) pline("Never mind."); 943. return; 944. } 945. You("peer into the crystal ball."); 946. nomul(-rnd(10)); 947. nomovemsg = ""; 948. if(obj->spe <= 0) 949. pline("The vision is unclear."); 950. else { 951. obj->spe -= 1; 952. switch(buf[0]) { 953. case GOLD_SYM : ret = gold_detect((struct obj *)0); 954. break; 955. case '^' : ret = trap_detect((struct obj *)0); 956. break; 957. case FOOD_SYM : ret = food_detect((struct obj *)0); 958. break; 959. case POTION_SYM : 960. case GEM_SYM : 961. case TOOL_SYM : 962. case WEAPON_SYM : 963. case WAND_SYM : 964. case SCROLL_SYM : 965. #ifdef SPELLS 966. case SPBOOK_SYM : 967. #endif 968. case ARMOR_SYM : ret = object_detect((struct obj *)0); 969. break; 970. default : lcase(buf); 971. if (!strncmp(buf,"gold",4) || !strncmp(buf,"money",5)) 972. ret = gold_detect((struct obj *)0); 973. else if (!strncmp(buf,"trap",4)) 974. ret = trap_detect((struct obj *)0); 975. else if (!strncmp(buf,"food",4) || 976. !strncmp(buf,"dead",4) || 977. !strncmp(buf,"corpse",6)) 978. ret = food_detect((struct obj *)0); 979. else if (!strncmp(buf,"obj",3) || 980. !strncmp(buf,"the",3) || 981. !strncmp(buf,"a ",2) || 982. !strncmp(buf,"an ",3)) 983. /* || strstr(buf, " of") */ 984. ret = object_detect((struct obj *)0); 985. else ret = monster_detect((struct obj *)0); 986. break; 987. } 988. if (ret) 989. if (!rn2(100)) /* make them nervous */ 990. You("see the Wizard of Yendor gazing out at you."); 991. else pline("The vision is unclear."); 992. } 993. return; 994. } 995. 996. static const char cuddly[] = { TOOL_SYM, 0 }; 997. 998. int 999. dorub() 1000. { 1001. struct obj *obj = getobj(cuddly, "rub"); 1002. 1003. if(!obj || (obj != uwep && !wield_tool(obj))) return 0; 1004. 1005. if (uwep->otyp == MAGIC_LAMP) { 1006. if (uwep->spe > 0 && !rn2(3)) { 1007. uwep->spe = 0; 1008. djinni_from_bottle(uwep); 1009. } else if (rn2(2) && !Blind) 1010. You("see a puff of smoke."); 1011. else pline(nothing_happens); 1012. } else pline(nothing_happens); 1013. return 1; 1014. } 1015. 1016. int 1017. dojump() 1018. { 1019. coord cc; 1020. register struct monst *mtmp; 1021. if (!Jumping) { 1022. You("can't jump very far."); 1023. return 0; 1024. } else if (u.uswallow) { 1025. pline("You've got to be kidding!"); 1026. return 0; 1027. } else if (u.ustuck) { 1028. kludge("You cannot escape from %s!", 1029. mon_nam(u.ustuck)); 1030. return 0; 1031. } else if (inv_weight() > -5) { 1032. You("are carrying too much to jump!"); 1033. return 0; 1034. } else if (u.uhunger <= 100 || ACURR(A_STR) < 6) { 1035. You("lack the strength to jump!"); 1036. return 0; 1037. } 1038. pline("Where do you want to jump?"); 1039. getpos(&cc, 1, "the desired position"); 1040. if (dist(cc.x, cc.y) > 9) { 1041. pline("Too far!"); 1042. return 0; 1043. } else if (!cansee(cc.x, cc.y)) { 1044. You("cannot see where to land!"); 1045. return 0; 1046. } else if (levl[cc.x][cc.y].mmask) { 1047. mtmp = m_at(cc.x, cc.y); 1048. You("cannot trample %s!", mon_nam(mtmp)); 1049. return 0; 1050. } else if (!isok(cc.x, cc.y) || 1051. #ifdef POLYSELF 1052. (IS_ROCK(levl[cc.x][cc.y].typ) && !passes_walls(uasmon)) || 1053. #else 1054. IS_ROCK(levl[cc.x][cc.y].typ) || 1055. #endif 1056. sobj_at(BOULDER, cc.x, cc.x) ) { 1057. You("cannot jump there!"); 1058. return 0; 1059. } else { 1060. teleds(cc.x, cc.y); 1061. nomul(-1); 1062. nomovemsg = ""; 1063. morehungry(rnd(25)); 1064. return 1; 1065. } 1066. } 1067. 1068. static void 1069. use_tinning_kit(obj) 1070. register struct obj *obj; 1071. { 1072. register struct obj *corpse, *can; 1073. 1074. /* This takes only 1 move. If this is to be changed to take many 1075. * moves, we've got to deal with decaying corpses... 1076. */ 1077. if (!(corpse = floorfood("can", 1))) return; 1078. if ((corpse->corpsenm == PM_COCKATRICE) 1079. #ifdef POLYSELF 1080. && !resists_ston(uasmon) 1081. #endif 1082. && !uarmg) { 1083. pline("Tinning a cockatrice corpse without gloves was not a very wise move..."); 1084. You("turn to stone..."); 1085. killer = "unwise tinning decision"; 1086. done("stoned"); 1087. } 1088. can = mksobj(TIN,FALSE); 1089. can->corpsenm = corpse->corpsenm; 1090. can->quan = 1; /* Defeat the occasional creation of pairs of tins */ 1091. can->owt = weight(can); 1092. can->known = 1; 1093. can->spe = 0; /* No spinach allowed... */ 1094. can->cursed = obj->cursed; 1095. can->blessed = obj->blessed; 1096. can = addinv(can); 1097. You("now have %s.", doname(can)); 1098. useup(corpse); 1099. } 1100. 1101. int 1102. doapply() { 1103. register struct obj *obj; 1104. register int res = 1; 1105. 1106. obj = getobj(tools, "use or apply"); 1107. if(!obj) return 0; 1108. 1109. check_unpaid(obj); 1110. 1111. #ifdef MUSIC 1112. if (IS_INSTRUMENT(obj->otyp)) { 1113. res = do_play_instrument(obj); 1114. return (res); 1115. } 1116. #endif /* MUSIC /**/ 1117. 1118. switch(obj->otyp){ 1119. case EXPENSIVE_CAMERA: 1120. use_camera(obj); break; 1121. case CREDIT_CARD: 1122. case LOCK_PICK: 1123. case SKELETON_KEY: 1124. case KEY: 1125. (void) pick_lock(obj); 1126. break; 1127. case BAG_OF_TRICKS: 1128. if(obj->spe > 0) { 1129. register int cnt = 1; 1130. 1131. obj->spe -= 1; 1132. if(!rn2(23)) cnt += rn2(7) + 1; 1133. while(cnt--) 1134. (void) makemon((struct permonst *) 0, u.ux, u.uy); 1135. makeknown(BAG_OF_TRICKS); 1136. } 1137. break; 1138. case LARGE_BOX: 1139. case CHEST: 1140. case ICE_BOX: 1141. case SACK: 1142. case BAG_OF_HOLDING: 1143. use_container(obj, 1); break; 1144. case PICK_AXE: 1145. res = use_pick_axe(obj); 1146. break; 1147. case TINNING_KIT: 1148. use_tinning_kit(obj); 1149. break; 1150. case MAGIC_WHISTLE: 1151. if(pl_character[0] == 'W' || u.ulevel > (MAXULEV/3)) { 1152. use_magic_whistle(obj); 1153. break; 1154. } 1155. /* fall into next case */ 1156. case WHISTLE: 1157. use_whistle(obj); 1158. break; 1159. #ifdef MEDUSA 1160. case MIRROR: 1161. use_mirror(obj); 1162. break; 1163. #endif 1164. case LAMP: 1165. case MAGIC_LAMP: 1166. use_lamp(obj); 1167. break; 1168. case CRYSTAL_BALL: 1169. use_crystal_ball(obj); 1170. break; 1171. #ifdef WALKIES 1172. case LEASH: 1173. use_leash(obj); 1174. break; 1175. #endif 1176. case MAGIC_MARKER: 1177. dowrite(obj); 1178. break; 1179. case TIN_OPENER: 1180. if(!carrying(TIN)) { 1181. You("have no tin to open."); 1182. goto xit; 1183. } 1184. You("cannot open a tin without eating its contents."); 1185. if(flags.verbose) 1186. pline("In order to eat, use the 'e' command."); 1187. if(obj != uwep) 1188. pline("Opening the tin will be much easier if you wield the tin opener."); 1189. goto xit; 1190. 1191. case STETHOSCOPE: 1192. res = 0; 1193. use_stethoscope(obj); 1194. break; 1195. case FIGURINE: 1196. You("set the figurine on the ground and it transforms."); 1197. make_familiar(obj); 1198. useup(obj); 1199. break; 1200. case BLINDFOLD: 1201. if (obj == ublindf) { 1202. if(cursed(obj)) break; 1203. else Blindf_off(obj); 1204. } 1205. else if (!ublindf) Blindf_on(obj); 1206. else You("are already wearing a blindfold!"); 1207. break; 1208. default: 1209. pline("Sorry, I don't know how to use that."); 1210. xit: 1211. nomul(0); 1212. return 0; 1213. } 1214. nomul(0); 1215. return res; 1216. }
|