Source:NetHack 3.1.0/do wear.c
Jump to navigation
Jump to search
Below is the full text to do_wear.c from the source code of NetHack 3.1.0. To link to a particular line, write [[NetHack 3.1.0/do_wear.c#line123]], for example.
Warning! This is the source code from an old release. For the latest release, see Source code
The NetHack General Public License applies to screenshots, source code and other content from NetHack.
This content was modified from the original NetHack source code distribution (by splitting up NetHack content between wiki pages, and possibly further editing). See the page history for a list of who changed it, and on what dates.
1. /* SCCS Id: @(#)do_wear.c 3.1 92/12/13 */ 2. /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ 3. /* NetHack may be freely redistributed. See license for details. */ 4. 5. #include "hack.h" 6. 7. #ifdef OVLB 8. 9. static int NEARDATA todelay; 10. 11. #endif /*OVLB */ 12. 13. #ifndef OVLB 14. 15. STATIC_DCL long takeoff_mask, taking_off; 16. 17. #else /* OVLB */ 18. 19. STATIC_OVL long NEARDATA takeoff_mask = 0L, NEARDATA taking_off = 0L; 20. 21. static const long NEARDATA takeoff_order[] = { WORN_BLINDF, 1L, /* weapon */ 22. WORN_SHIELD, WORN_GLOVES, LEFT_RING, RIGHT_RING, WORN_CLOAK, 23. WORN_HELMET, WORN_AMUL, WORN_ARMOR, 24. #ifdef TOURIST 25. WORN_SHIRT, 26. #endif 27. WORN_BOOTS, 0L }; 28. 29. static void FDECL(on_msg, (struct obj *)); 30. STATIC_PTR int NDECL(Armor_on); 31. STATIC_PTR int NDECL(Boots_on); 32. static int NDECL(Cloak_on); 33. STATIC_PTR int NDECL(Helmet_on); 34. STATIC_PTR int NDECL(Gloves_on); 35. static void NDECL(Amulet_on); 36. static void FDECL(Ring_off_or_gone, (struct obj *, BOOLEAN_P)); 37. STATIC_PTR int FDECL(select_off, (struct obj *)); 38. static struct obj *NDECL(do_takeoff); 39. STATIC_PTR int NDECL(take_off); 40. static void FDECL(already_wearing, (const char*)); 41. 42. void 43. off_msg(otmp) register struct obj *otmp; { 44. if(flags.verbose) 45. You("were wearing %s.", doname(otmp)); 46. } 47. 48. /* for items that involve no delay */ 49. static void 50. on_msg(otmp) 51. register struct obj *otmp; 52. { 53. if(flags.verbose) 54. You("are now wearing %s.", 55. obj_is_pname(otmp) ? the(xname(otmp)) : an(xname(otmp))); 56. } 57. 58. #endif /* OVLB */ 59. #ifdef OVL2 60. 61. boolean 62. is_boots(otmp) register struct obj *otmp; { 63. return(otmp->otyp >= LOW_BOOTS && 64. otmp->otyp <= LEVITATION_BOOTS); 65. } 66. 67. boolean 68. is_helmet(otmp) register struct obj *otmp; { 69. return(otmp->otyp >= ELVEN_LEATHER_HELM && 70. otmp->otyp <= HELM_OF_TELEPATHY); 71. } 72. 73. #endif /* OVLB */ 74. #ifdef OVL2 75. 76. boolean 77. is_gloves(otmp) register struct obj *otmp; { 78. return(otmp->otyp >= LEATHER_GLOVES && 79. otmp->otyp <= GAUNTLETS_OF_DEXTERITY); 80. } 81. 82. #endif /* OVL2 */ 83. #ifdef OVLB 84. 85. boolean 86. is_cloak(otmp) register struct obj *otmp; { 87. return(otmp->otyp >= MUMMY_WRAPPING && 88. otmp->otyp <= CLOAK_OF_DISPLACEMENT); 89. } 90. 91. boolean 92. is_shield(otmp) register struct obj *otmp; { 93. return(otmp->otyp >= SMALL_SHIELD && 94. otmp->otyp <= SHIELD_OF_REFLECTION); 95. } 96. 97. /* 98. * The Type_on() functions should be called *after* setworn(). 99. * The Type_off() functions call setworn() themselves. 100. */ 101. 102. STATIC_PTR 103. int 104. Boots_on() { 105. long oldprop = u.uprops[objects[uarmf->otyp].oc_oprop].p_flgs & ~WORN_BOOTS; 106. 107. switch(uarmf->otyp) { 108. case LOW_BOOTS: 109. case IRON_SHOES: 110. case HIGH_BOOTS: 111. case JUMPING_BOOTS: 112. break; 113. case WATER_WALKING_BOOTS: 114. if (u.uinwater) spoteffects(); 115. break; 116. case SPEED_BOOTS: 117. /* Speed boots are still better than intrinsic speed, */ 118. /* though not better than potion speed */ 119. if (!(oldprop & TIMEOUT)) { 120. makeknown(uarmf->otyp); 121. You("feel yourself speed up%s.", 122. oldprop ? " a bit more" : ""); 123. } 124. break; 125. case ELVEN_BOOTS: 126. if (!oldprop) { 127. makeknown(uarmf->otyp); 128. You("walk very quietly."); 129. } 130. break; 131. case FUMBLE_BOOTS: 132. if (!(oldprop & ~TIMEOUT)) 133. Fumbling += rnd(20); 134. break; 135. case LEVITATION_BOOTS: 136. if (!oldprop) { 137. makeknown(uarmf->otyp); 138. float_up(); 139. } 140. break; 141. default: impossible("Unknown type of boots (%d)", uarmf->otyp); 142. } 143. return 0; 144. } 145. 146. int 147. Boots_off() { 148. register struct obj *obj = uarmf; 149. /* For levitation, float_down() returns if Levitation, so we 150. * must do a setworn() _before_ the levitation case. 151. */ 152. long oldprop = u.uprops[objects[uarmf->otyp].oc_oprop].p_flgs & ~WORN_BOOTS; 153. 154. setworn((struct obj *)0, W_ARMF); 155. switch(obj->otyp) { 156. case SPEED_BOOTS: 157. if (!(oldprop & TIMEOUT)) { 158. makeknown(obj->otyp); 159. You("feel yourself slow down%s.", 160. oldprop ? " a bit" : ""); 161. } 162. break; 163. case WATER_WALKING_BOOTS: 164. if(is_pool(u.ux,u.uy) && !Levitation 165. #ifdef POLYSELF 166. && !is_flyer(uasmon) && !is_clinger(uasmon) 167. #endif 168. ) { 169. makeknown(obj->otyp); 170. /* make boots known in case you survive the drowning */ 171. spoteffects(); 172. } 173. break; 174. case ELVEN_BOOTS: 175. if (!oldprop) { 176. makeknown(obj->otyp); 177. You("sure are noisy."); 178. } 179. break; 180. case FUMBLE_BOOTS: 181. if (!(oldprop & ~TIMEOUT)) 182. Fumbling = 0; 183. break; 184. case LEVITATION_BOOTS: 185. if (!oldprop) { 186. (void) float_down(); 187. makeknown(obj->otyp); 188. } 189. break; 190. case LOW_BOOTS: 191. case IRON_SHOES: 192. case HIGH_BOOTS: 193. case JUMPING_BOOTS: 194. break; 195. default: impossible("Unknown type of boots (%d)", obj->otyp); 196. } 197. return 0; 198. } 199. 200. static int 201. Cloak_on() { 202. long oldprop = u.uprops[objects[uarmc->otyp].oc_oprop].p_flgs & ~WORN_CLOAK; 203. 204. switch(uarmc->otyp) { 205. case ELVEN_CLOAK: 206. case CLOAK_OF_PROTECTION: 207. case CLOAK_OF_DISPLACEMENT: 208. makeknown(uarmc->otyp); 209. break; 210. case MUMMY_WRAPPING: 211. case ORCISH_CLOAK: 212. case DWARVISH_CLOAK: 213. case CLOAK_OF_MAGIC_RESISTANCE: 214. break; 215. case CLOAK_OF_INVISIBILITY: 216. if (!oldprop && !See_invisible && !Blind) { 217. makeknown(uarmc->otyp); 218. newsym(u.ux,u.uy); 219. pline("Suddenly you cannot see yourself."); 220. } 221. break; 222. case OILSKIN_CLOAK: 223. pline("The %s fits very tightly.",xname(uarmc)); 224. break; 225. default: impossible("Unknown type of cloak (%d)", uarmc->otyp); 226. } 227. return 0; 228. } 229. 230. int 231. Cloak_off() { 232. long oldprop = u.uprops[objects[uarmc->otyp].oc_oprop].p_flgs & ~WORN_CLOAK; 233. 234. switch(uarmc->otyp) { 235. case MUMMY_WRAPPING: 236. case ELVEN_CLOAK: 237. case ORCISH_CLOAK: 238. case DWARVISH_CLOAK: 239. case CLOAK_OF_PROTECTION: 240. case CLOAK_OF_MAGIC_RESISTANCE: 241. case CLOAK_OF_DISPLACEMENT: 242. case OILSKIN_CLOAK: 243. break; 244. case CLOAK_OF_INVISIBILITY: 245. if (!oldprop && !See_invisible && !Blind) { 246. makeknown(uarmc->otyp); 247. setworn((struct obj *)0, W_ARMC); 248. newsym(u.ux,u.uy); 249. pline("Suddenly you can see yourself."); 250. return 0; 251. } 252. break; 253. default: impossible("Unknown type of cloak (%d)", uarmc->otyp); 254. } 255. setworn((struct obj *)0, W_ARMC); 256. return 0; 257. } 258. 259. STATIC_PTR 260. int 261. Helmet_on() 262. { 263. switch(uarmh->otyp) { 264. case FEDORA: 265. case HELMET: 266. case DENTED_POT: 267. case ELVEN_LEATHER_HELM: 268. case DWARVISH_IRON_HELM: 269. case ORCISH_HELM: 270. case HELM_OF_TELEPATHY: 271. break; 272. case HELM_OF_BRILLIANCE: 273. if (uarmh->spe) { 274. ABON(A_INT) += uarmh->spe; 275. ABON(A_WIS) += uarmh->spe; 276. flags.botl = 1; 277. makeknown(uarmh->otyp); 278. } 279. break; 280. case HELM_OF_OPPOSITE_ALIGNMENT: 281. if (u.ualign.type == A_NEUTRAL) 282. u.ualign.type = rn2(2) ? A_CHAOTIC : A_LAWFUL; 283. else u.ualign.type = -(u.ualign.type); 284. makeknown(uarmh->otyp); 285. flags.botl = 1; 286. break; 287. default: impossible("Unknown type of helm (%d)", uarmh->otyp); 288. } 289. return 0; 290. } 291. 292. int 293. Helmet_off() 294. { 295. switch(uarmh->otyp) { 296. case FEDORA: 297. case HELMET: 298. case DENTED_POT: 299. case ELVEN_LEATHER_HELM: 300. case DWARVISH_IRON_HELM: 301. case ORCISH_HELM: 302. break; 303. case HELM_OF_TELEPATHY: 304. /* need to update ability before calling see_monsters() */ 305. setworn((struct obj *)0, W_ARMH); 306. see_monsters(); 307. return 0; 308. case HELM_OF_BRILLIANCE: 309. if (uarmh->spe) { 310. ABON(A_INT) -= uarmh->spe; 311. ABON(A_WIS) -= uarmh->spe; 312. flags.botl = 1; 313. } 314. break; 315. case HELM_OF_OPPOSITE_ALIGNMENT: 316. u.ualign.type = u.ualignbase[0]; 317. flags.botl = 1; 318. break; 319. default: impossible("Unknown type of helm (%d)", uarmh->otyp); 320. } 321. setworn((struct obj *)0, W_ARMH); 322. return 0; 323. } 324. 325. STATIC_PTR 326. int 327. Gloves_on() { 328. long oldprop = 329. u.uprops[objects[uarmg->otyp].oc_oprop].p_flgs & ~(WORN_GLOVES | TIMEOUT); 330. 331. switch(uarmg->otyp) { 332. case LEATHER_GLOVES: 333. break; 334. case GAUNTLETS_OF_FUMBLING: 335. if (!oldprop) 336. Fumbling += rnd(20); 337. break; 338. case GAUNTLETS_OF_POWER: 339. makeknown(uarmg->otyp); 340. flags.botl = 1; /* taken care of in attrib.c */ 341. break; 342. case GAUNTLETS_OF_DEXTERITY: 343. if (uarmg->spe) makeknown(uarmg->otyp); 344. ABON(A_DEX) += uarmg->spe; 345. flags.botl = 1; 346. break; 347. default: impossible("Unknown type of gloves (%d)", uarmg->otyp); 348. } 349. return 0; 350. } 351. 352. int 353. Gloves_off() { 354. long oldprop = 355. u.uprops[objects[uarmg->otyp].oc_oprop].p_flgs & ~(WORN_GLOVES | TIMEOUT); 356. 357. switch(uarmg->otyp) { 358. case LEATHER_GLOVES: 359. break; 360. case GAUNTLETS_OF_FUMBLING: 361. if (!oldprop) 362. Fumbling = 0; 363. break; 364. case GAUNTLETS_OF_POWER: 365. makeknown(uarmg->otyp); 366. flags.botl = 1; /* taken care of in attrib.c */ 367. break; 368. case GAUNTLETS_OF_DEXTERITY: 369. if (uarmg->spe) makeknown(uarmg->otyp); 370. ABON(A_DEX) -= uarmg->spe; 371. flags.botl = 1; 372. break; 373. default: impossible("Unknown type of gloves (%d)", uarmg->otyp); 374. } 375. setworn((struct obj *)0, W_ARMG); 376. if (uwep && uwep->otyp == CORPSE && uwep->corpsenm == PM_COCKATRICE 377. #ifdef POLYSELF 378. && !(poly_when_stoned(uasmon) && polymon(PM_STONE_GOLEM)) 379. #endif 380. ) { 381. /* Prevent wielding cockatrice when not wearing gloves */ 382. You("wield the cockatrice corpse in your bare %s.", 383. makeplural(body_part(HAND))); 384. You("turn to stone..."); 385. killer_format = KILLED_BY_AN; 386. killer = "cockatrice corpse"; 387. done(STONING); 388. } 389. return 0; 390. } 391. 392. /* 393. static int 394. Shield_on() { 395. switch(uarms->otyp) { 396. case SMALL_SHIELD: 397. case ELVEN_SHIELD: 398. case URUK_HAI_SHIELD: 399. case ORCISH_SHIELD: 400. case DWARVISH_ROUNDSHIELD: 401. case LARGE_SHIELD: 402. case SHIELD_OF_REFLECTION: 403. break; 404. default: impossible("Unknown type of shield (%d)", uarms->otyp); 405. } 406. return 0; 407. } 408. */ 409. 410. int 411. Shield_off() { 412. /* 413. switch(uarms->otyp) { 414. case SMALL_SHIELD: 415. case ELVEN_SHIELD: 416. case URUK_HAI_SHIELD: 417. case ORCISH_SHIELD: 418. case DWARVISH_ROUNDSHIELD: 419. case LARGE_SHIELD: 420. case SHIELD_OF_REFLECTION: 421. break; 422. default: impossible("Unknown type of shield (%d)", uarms->otyp); 423. } 424. */ 425. setworn((struct obj *)0, W_ARMS); 426. return 0; 427. } 428. 429. /* This must be done in worn.c, because one of the possible intrinsics conferred 430. * is fire resistance, and we have to immediately set HFire_resistance in worn.c 431. * since worn.c will check it before returning. 432. */ 433. STATIC_PTR 434. int 435. Armor_on() 436. { 437. return 0; 438. } 439. 440. int 441. Armor_off() 442. { 443. setworn((struct obj *)0, W_ARM); 444. return 0; 445. } 446. 447. /* The gone functions differ from the off functions in that if you die from 448. * taking it off and have life saving, you still die. 449. */ 450. int 451. Armor_gone() 452. { 453. setnotworn(uarm); 454. return 0; 455. } 456. 457. static void 458. Amulet_on() 459. { 460. switch(uamul->otyp) { 461. case AMULET_OF_ESP: 462. case AMULET_OF_LIFE_SAVING: 463. case AMULET_VERSUS_POISON: 464. case AMULET_OF_REFLECTION: 465. case AMULET_OF_MAGICAL_BREATHING: 466. case FAKE_AMULET_OF_YENDOR: 467. break; 468. case AMULET_OF_CHANGE: 469. makeknown(AMULET_OF_CHANGE); 470. change_sex(); 471. /* Don't use same message as polymorph */ 472. You("are suddenly very %s!", flags.female ? "feminine" 473. : "masculine"); 474. flags.botl = 1; 475. pline("The amulet disintegrates!"); 476. useup(uamul); 477. break; 478. case AMULET_OF_STRANGULATION: 479. makeknown(AMULET_OF_STRANGULATION); 480. pline("It constricts your throat!"); 481. Strangled = 6; 482. break; 483. case AMULET_OF_RESTFUL_SLEEP: 484. Sleeping = rnd(100); 485. break; 486. case AMULET_OF_YENDOR: 487. break; 488. } 489. } 490. 491. void 492. Amulet_off() 493. { 494. switch(uamul->otyp) { 495. case AMULET_OF_ESP: 496. /* need to update ability before calling see_monsters() */ 497. setworn((struct obj *)0, W_AMUL); 498. see_monsters(); 499. return; 500. case AMULET_OF_LIFE_SAVING: 501. case AMULET_VERSUS_POISON: 502. case AMULET_OF_REFLECTION: 503. case FAKE_AMULET_OF_YENDOR: 504. break; 505. case AMULET_OF_MAGICAL_BREATHING: 506. if (Underwater) { 507. You("suddenly inhale an unhealthy amount of water!"); 508. /* Magical_breathing has to be set 509. off before calling drown() */ 510. setworn((struct obj *)0, W_AMUL); 511. (void) drown(); 512. return; 513. } 514. break; 515. case AMULET_OF_CHANGE: 516. impossible("Wearing an amulet of change?"); 517. break; 518. case AMULET_OF_STRANGULATION: 519. if (Strangled) { 520. You("can breathe more easily!"); 521. Strangled = 0; 522. } 523. break; 524. case AMULET_OF_RESTFUL_SLEEP: 525. Sleeping = 0; 526. break; 527. case AMULET_OF_YENDOR: 528. break; 529. } 530. setworn((struct obj *)0, W_AMUL); 531. } 532. 533. void 534. Ring_on(obj) 535. register struct obj *obj; 536. { 537. long oldprop = u.uprops[objects[obj->otyp].oc_oprop].p_flgs & ~W_RING; 538. 539. /* might put on two rings of the same type */ 540. if((u.uprops[objects[obj->otyp].oc_oprop].p_flgs & W_RING) == W_RING) 541. oldprop = 1; 542. 543. switch(obj->otyp){ 544. case RIN_TELEPORTATION: 545. case RIN_REGENERATION: 546. case RIN_SEARCHING: 547. case RIN_STEALTH: 548. case RIN_HUNGER: 549. case RIN_AGGRAVATE_MONSTER: 550. case RIN_POISON_RESISTANCE: 551. case RIN_FIRE_RESISTANCE: 552. case RIN_COLD_RESISTANCE: 553. case RIN_SHOCK_RESISTANCE: 554. case RIN_CONFLICT: 555. case RIN_WARNING: 556. case RIN_TELEPORT_CONTROL: 557. #ifdef POLYSELF 558. case RIN_POLYMORPH: 559. case RIN_POLYMORPH_CONTROL: 560. #endif 561. break; 562. case RIN_SEE_INVISIBLE: 563. /* can now see invisible monsters */ 564. set_mimic_blocking(); /* do special mimic handling */ 565. see_monsters(); 566. 567. if (Invis && !oldprop 568. #ifdef POLYSELF 569. && !perceives(uasmon) 570. #endif 571. && !Blind) { 572. newsym(u.ux,u.uy); 573. pline("Suddenly you can see yourself."); 574. makeknown(RIN_SEE_INVISIBLE); 575. } 576. break; 577. case RIN_INVISIBILITY: 578. if (!oldprop && !See_invisible && !Blind) { 579. makeknown(RIN_INVISIBILITY); 580. newsym(u.ux,u.uy); 581. Your("body takes on a %s transparency...", 582. Hallucination ? "normal" : "strange"); 583. } 584. break; 585. case RIN_ADORNMENT: 586. ABON(A_CHA) += obj->spe; 587. flags.botl = 1; 588. if (obj->spe || objects[RIN_ADORNMENT].oc_name_known) { 589. makeknown(RIN_ADORNMENT); 590. obj->known = TRUE; 591. } 592. break; 593. case RIN_LEVITATION: 594. if(!oldprop) { 595. float_up(); 596. makeknown(RIN_LEVITATION); 597. obj->known = TRUE; 598. } 599. break; 600. case RIN_GAIN_STRENGTH: 601. ABON(A_STR) += obj->spe; 602. flags.botl = 1; 603. if (obj->spe || objects[RIN_GAIN_STRENGTH].oc_name_known) { 604. makeknown(RIN_GAIN_STRENGTH); 605. obj->known = TRUE; 606. } 607. break; 608. case RIN_INCREASE_DAMAGE: 609. u.udaminc += obj->spe; 610. break; 611. case RIN_PROTECTION_FROM_SHAPE_CHAN: 612. rescham(); 613. break; 614. case RIN_PROTECTION: 615. flags.botl = 1; 616. if (obj->spe || objects[RIN_PROTECTION].oc_name_known) { 617. makeknown(RIN_PROTECTION); 618. obj->known = TRUE; 619. } 620. break; 621. } 622. } 623. 624. static void 625. Ring_off_or_gone(obj,gone) 626. register struct obj *obj; 627. boolean gone; 628. { 629. register long mask = obj->owornmask & W_RING; 630. 631. if(!(u.uprops[objects[obj->otyp].oc_oprop].p_flgs & mask)) 632. impossible("Strange... I didn't know you had that ring."); 633. if(gone) setnotworn(obj); 634. else setworn((struct obj *)0, obj->owornmask); 635. switch(obj->otyp) { 636. case RIN_TELEPORTATION: 637. case RIN_REGENERATION: 638. case RIN_SEARCHING: 639. case RIN_STEALTH: 640. case RIN_HUNGER: 641. case RIN_AGGRAVATE_MONSTER: 642. case RIN_POISON_RESISTANCE: 643. case RIN_FIRE_RESISTANCE: 644. case RIN_COLD_RESISTANCE: 645. case RIN_SHOCK_RESISTANCE: 646. case RIN_CONFLICT: 647. case RIN_WARNING: 648. case RIN_TELEPORT_CONTROL: 649. #ifdef POLYSELF 650. case RIN_POLYMORPH: 651. case RIN_POLYMORPH_CONTROL: 652. #endif 653. break; 654. case RIN_SEE_INVISIBLE: 655. /* Make invisible monsters go away */ 656. if (!See_invisible) { 657. set_mimic_blocking(); /* do special mimic handling */ 658. see_monsters(); 659. } 660. 661. if (Invisible && !Blind) { 662. newsym(u.ux,u.uy); 663. pline("Suddenly you cannot see yourself."); 664. makeknown(RIN_SEE_INVISIBLE); 665. } 666. break; 667. case RIN_INVISIBILITY: 668. if (!(Invisible & ~W_RING) && !See_invisible && !Blind) { 669. newsym(u.ux,u.uy); 670. Your("body seems to unfade..."); 671. makeknown(RIN_INVISIBILITY); 672. } 673. break; 674. case RIN_ADORNMENT: 675. ABON(A_CHA) -= obj->spe; 676. flags.botl = 1; 677. break; 678. case RIN_LEVITATION: 679. (void) float_down(); 680. if (!Levitation) makeknown(RIN_LEVITATION); 681. break; 682. case RIN_GAIN_STRENGTH: 683. ABON(A_STR) -= obj->spe; 684. flags.botl = 1; 685. break; 686. case RIN_INCREASE_DAMAGE: 687. u.udaminc -= obj->spe; 688. break; 689. case RIN_PROTECTION_FROM_SHAPE_CHAN: 690. /* If you're no longer protected, let the chameleons 691. * change shape again -dgk 692. */ 693. restartcham(); 694. break; 695. } 696. } 697. 698. void 699. Ring_off(obj) 700. struct obj *obj; 701. { 702. Ring_off_or_gone(obj,FALSE); 703. } 704. 705. void 706. Ring_gone(obj) 707. struct obj *obj; 708. { 709. Ring_off_or_gone(obj,TRUE); 710. } 711. 712. void 713. Blindf_on(otmp) 714. register struct obj *otmp; 715. { 716. long already_blinded = Blinded; 717. setworn(otmp, W_TOOL); 718. if (otmp->otyp == TOWEL && flags.verbose) 719. You("wrap %s around your %s.", an(xname(otmp)), body_part(HEAD)); 720. on_msg(otmp); 721. if (!already_blinded) { 722. if (Punished) set_bc(0); /* Set ball&chain variables before */ 723. /* the hero goes blind. */ 724. if (Telepat) see_monsters();/* sense monsters */ 725. vision_full_recalc = 1; /* recalc vision limits */ 726. flags.botl = 1; 727. } 728. } 729. 730. void 731. Blindf_off(otmp) 732. register struct obj *otmp; 733. { 734. setworn((struct obj *)0, otmp->owornmask); 735. off_msg(otmp); 736. if (!Blinded) { 737. if (Telepat) see_monsters();/* no longer sense monsters */ 738. vision_full_recalc = 1; /* recalc vision limits */ 739. flags.botl = 1; 740. } else 741. You("still cannot see."); 742. } 743. 744. /* called in main to set intrinsics of worn start-up items */ 745. void 746. set_wear() { 747. if (uarm) (void) Armor_on(); 748. if (uarmc) (void) Cloak_on(); 749. if (uarmf) (void) Boots_on(); 750. if (uarmg) (void) Gloves_on(); 751. if (uarmh) (void) Helmet_on(); 752. /* if (uarms) (void) Shield_on(); */ 753. } 754. 755. boolean 756. donning(otmp) 757. register struct obj *otmp; 758. { 759. return (otmp == uarmf && (afternmv == Boots_on || afternmv == Boots_off)) 760. || (otmp == uarmh && (afternmv == Helmet_on || afternmv == Helmet_off)) 761. || (otmp == uarmg && (afternmv == Gloves_on || afternmv == Gloves_off)) 762. || (otmp == uarm && (afternmv == Armor_on || afternmv == Armor_off)); 763. } 764. 765. void 766. cancel_don() 767. { 768. /* the piece of armor we were donning/doffing has vanished, so stop 769. * wasting time on it (and don't dereference it when donning would 770. * otherwise finish) 771. */ 772. afternmv = 0; 773. nomovemsg = NULL; 774. multi = 0; 775. } 776. 777. static const char NEARDATA clothes[] = {ARMOR_CLASS, 0}; 778. static const char NEARDATA accessories[] = {RING_CLASS, AMULET_CLASS, TOOL_CLASS, 0}; 779. 780. int 781. dotakeoff() 782. { 783. register struct obj *otmp = (struct obj *)0; 784. int armorpieces = 0; 785. 786. #define MOREARM(x) if (x) { armorpieces++; otmp = x; } 787. MOREARM(uarmh); 788. MOREARM(uarms); 789. MOREARM(uarmg); 790. MOREARM(uarmf); 791. if (uarmc) { 792. armorpieces++; 793. otmp = uarmc; 794. } else if (uarm) { 795. armorpieces++; 796. otmp = uarm; 797. #ifdef TOURIST 798. } else if (uarmu) { 799. armorpieces++; 800. otmp = uarmu; 801. #endif 802. } 803. if (!armorpieces) { 804. #ifdef POLYSELF 805. if (uskin) 806. pline("The dragon scale mail is merged with your skin!"); 807. else 808. #endif 809. pline("Not wearing any armor."); 810. return 0; 811. } 812. if (armorpieces > 1) 813. otmp = getobj(clothes, "take off"); 814. if (otmp == 0) return(0); 815. if (!(otmp->owornmask & W_ARMOR)) { 816. You("are not wearing that."); 817. return(0); 818. } 819. if (((otmp == uarm) && (uarmc)) 820. #ifdef TOURIST 821. || ((otmp == uarmu) && (uarmc || uarm)) 822. #endif 823. ) { 824. You("can't take that off."); 825. return(0); 826. } 827. if(otmp == uarmg && welded(uwep)) { 828. You("seem unable to take off the gloves while holding your %s.", 829. is_sword(uwep) ? "sword" : "weapon"); 830. uwep->bknown = TRUE; 831. return(0); 832. } 833. if(otmp == uarmg && Glib) { 834. You("can't remove the slippery gloves with your slippery fingers."); 835. return(0); 836. } 837. if(otmp == uarmf && u.utrap && (u.utraptype == TT_BEARTRAP || 838. u.utraptype == TT_INFLOOR)) { /* -3. */ 839. if(u.utraptype == TT_BEARTRAP) 840. pline("The bear trap prevents you from pulling your %s out.", 841. body_part(FOOT)); 842. else 843. You("are stuck in the floor, and cannot pull your %s out.", 844. makeplural(body_part(FOOT))); 845. return(0); 846. } 847. reset_remarm(); /* since you may change ordering */ 848. (void) armoroff(otmp); 849. return(1); 850. } 851. 852. int 853. doremring() { 854. #ifdef GCC_WARN 855. register struct obj *otmp = (struct obj *)0; 856. /* suppress "may be used uninitialized" warning */ 857. #else 858. register struct obj *otmp; 859. #endif 860. int Accessories = 0; 861. 862. #define MOREACC(x) if (x) { Accessories++; otmp = x; } 863. MOREACC(uleft); 864. MOREACC(uright); 865. MOREACC(uamul); 866. MOREACC(ublindf); 867. 868. if(!Accessories) { 869. pline("Not wearing any accessories."); 870. return(0); 871. } 872. if (Accessories != 1) otmp = getobj(accessories, "take off"); 873. if(!otmp) return(0); 874. if(!(otmp->owornmask & (W_RING | W_AMUL | W_TOOL))) { 875. You("are not wearing that."); 876. return(0); 877. } 878. if(cursed(otmp)) return(0); 879. if(otmp->oclass == RING_CLASS) { 880. #ifdef POLYSELF 881. if (nolimbs(uasmon)) { 882. pline("It seems to be stuck."); 883. return(0); 884. } 885. #endif 886. if (uarmg && uarmg->cursed) { 887. uarmg->bknown = TRUE; 888. You("seem unable to remove your ring without taking off your gloves."); 889. return(0); 890. } 891. if (welded(uwep) && bimanual(uwep)) { 892. uwep->bknown = TRUE; 893. You("seem unable to remove the ring while your hands hold your %s.", 894. is_sword(uwep) ? "sword" : "weapon"); 895. return(0); 896. } 897. if (welded(uwep) && otmp==uright) { 898. uwep->bknown = TRUE; 899. You("seem unable to remove the ring while your right hand holds your %s.", 900. is_sword(uwep) ? "sword" : "weapon"); 901. return(0); 902. } 903. /* Sometimes we want to give the off_msg before removing and 904. * sometimes after; for instance, "you were wearing a moonstone 905. * ring (on right hand)" is desired but "you were wearing a 906. * square amulet (being worn)" is not because of the redundant 907. * "being worn". 908. */ 909. off_msg(otmp); 910. Ring_off(otmp); 911. } else if(otmp->oclass == AMULET_CLASS) { 912. Amulet_off(); 913. off_msg(otmp); 914. } else Blindf_off(otmp); /* does its own off_msg */ 915. return(1); 916. } 917. 918. int 919. cursed(otmp) register struct obj *otmp; { 920. /* Curses, like chickens, come home to roost. */ 921. if(otmp->cursed){ 922. You("can't. %s to be cursed.", 923. (is_boots(otmp) || is_gloves(otmp) || otmp->quan > 1L) 924. ? "They seem" : "It seems"); 925. otmp->bknown = TRUE; 926. return(1); 927. } 928. return(0); 929. } 930. 931. int 932. armoroff(otmp) register struct obj *otmp; { 933. register int delay = -objects[otmp->otyp].oc_delay; 934. 935. if(cursed(otmp)) return(0); 936. if(delay) { 937. nomul(delay); 938. if (is_helmet(otmp)) { 939. nomovemsg = "You finish taking off your helmet."; 940. afternmv = Helmet_off; 941. } 942. else if (is_gloves(otmp)) { 943. nomovemsg = "You finish taking off your gloves."; 944. afternmv = Gloves_off; 945. } 946. else if (is_boots(otmp)) { 947. nomovemsg = "You finish taking off your boots."; 948. afternmv = Boots_off; 949. } 950. else { 951. nomovemsg = "You finish taking off your suit."; 952. afternmv = Armor_off; 953. } 954. } else { 955. /* Be warned! We want off_msg after removing the item to 956. * avoid "You were wearing ____ (being worn)." However, an 957. * item which grants fire resistance might cause some trouble 958. * if removed in Hell and lifesaving puts it back on; in this 959. * case the message will be printed at the wrong time (after 960. * the messages saying you died and were lifesaved). Luckily, 961. * no cloak, shield, or fast-removable armor grants fire 962. * resistance, so we can safely do the off_msg afterwards. 963. * Rings do grant fire resistance, but for rings we want the 964. * off_msg before removal anyway so there's no problem. Take 965. * care in adding armors granting fire resistance; this code 966. * might need modification. 967. */ 968. if(is_cloak(otmp)) 969. (void) Cloak_off(); 970. else if(is_shield(otmp)) 971. (void) Shield_off(); 972. else setworn((struct obj *)0, otmp->owornmask & W_ARMOR); 973. off_msg(otmp); 974. } 975. takeoff_mask = taking_off = 0L; 976. return(1); 977. } 978. 979. static void 980. already_wearing(cc) 981. const char *cc; 982. { 983. You("are already wearing %s", cc); 984. } 985. 986. int 987. dowear() 988. { 989. register struct obj *otmp; 990. register int delay; 991. register int err = 0; 992. long mask = 0; 993. 994. #ifdef POLYSELF 995. /* cantweararm checks for suits of armor */ 996. /* verysmall or nohands checks for shields, gloves, etc... */ 997. if ((verysmall(uasmon) || nohands(uasmon))) { 998. pline("Don't even bother."); 999. return(0); 1000. } 1001. #endif 1002. otmp = getobj(clothes, "wear"); 1003. if(!otmp) return(0); 1004. #ifdef POLYSELF 1005. if (cantweararm(uasmon) && !is_shield(otmp) && 1006. !is_helmet(otmp) && !is_gloves(otmp) && 1007. !is_boots(otmp)) { 1008. pline("The %s will not fit on your body.", 1009. is_cloak(otmp) ? "cloak" : 1010. # ifdef TOURIST 1011. otmp->otyp == HAWAIIAN_SHIRT ? "shirt" : 1012. # endif 1013. "suit"); 1014. return(0); 1015. } 1016. #endif 1017. if(otmp->owornmask & W_ARMOR) { 1018. already_wearing("that!"); 1019. return(0); 1020. } 1021. if(is_helmet(otmp)) { 1022. if(uarmh) { 1023. already_wearing("a helmet."); 1024. err++; 1025. } else 1026. mask = W_ARMH; 1027. } else if(is_shield(otmp)){ 1028. if(uarms) { 1029. already_wearing("a shield."); 1030. err++; 1031. } 1032. if(uwep && bimanual(uwep)) { 1033. You("cannot wear a shield while wielding a two-handed %s.", 1034. is_sword(uwep) ? "sword" : 1035. uwep->otyp == BATTLE_AXE ? "axe" : "weapon"); 1036. err++; 1037. } 1038. if(!err) mask = W_ARMS; 1039. } else if(is_boots(otmp)) { 1040. if(uarmf) { 1041. already_wearing("boots."); 1042. err++; 1043. } if (u.utrap && (u.utraptype == TT_BEARTRAP || 1044. u.utraptype == TT_INFLOOR)) { 1045. if (u.utraptype == TT_BEARTRAP) 1046. Your("%s is trapped!", body_part(FOOT)); 1047. else 1048. Your("%s are stuck in the floor!", 1049. makeplural(body_part(FOOT))); 1050. err++; 1051. } else 1052. mask = W_ARMF; 1053. } else if(is_gloves(otmp)) { 1054. if(uarmg) { 1055. already_wearing("gloves."); 1056. err++; 1057. } else 1058. if (welded(uwep)) { 1059. You("cannot wear gloves over your %s.", 1060. is_sword(uwep) ? "sword" : "weapon"); 1061. err++; 1062. } else 1063. mask = W_ARMG; 1064. #ifdef TOURIST 1065. } else if( otmp->otyp == HAWAIIAN_SHIRT ) { 1066. if (uarm || uarmc || uarmu) { 1067. if(uarmu) 1068. already_wearing("a shirt."); 1069. else 1070. You("can't wear that over your %s.", 1071. (uarm && !uarmc) ? "armor" : "cloak"); 1072. err++; 1073. } else 1074. mask = W_ARMU; 1075. #endif 1076. } else if(is_cloak(otmp)) { 1077. if(uarmc) { 1078. already_wearing("a cloak."); 1079. err++; 1080. } else 1081. mask = W_ARMC; 1082. } else { 1083. if(uarmc) { 1084. You("cannot wear armor over a cloak."); 1085. err++; 1086. } else if(uarm) { 1087. already_wearing("some armor."); 1088. err++; 1089. } 1090. if(!err) mask = W_ARM; 1091. } 1092. /* Unnecessary since now only weapons and special items like pick-axes get 1093. * welded to your hand, not armor 1094. if(welded(otmp)) { 1095. if(!err++) 1096. weldmsg(otmp, FALSE); 1097. } 1098. */ 1099. if(err) return(0); 1100. 1101. otmp->known = TRUE; 1102. if(otmp == uwep) 1103. setuwep((struct obj *)0); 1104. setworn(otmp, mask); 1105. delay = -objects[otmp->otyp].oc_delay; 1106. if(delay){ 1107. nomul(delay); 1108. if(is_boots(otmp)) afternmv = Boots_on; 1109. if(is_helmet(otmp)) afternmv = Helmet_on; 1110. if(is_gloves(otmp)) afternmv = Gloves_on; 1111. if(otmp == uarm) afternmv = Armor_on; 1112. nomovemsg = "You finish your dressing maneuver."; 1113. } else { 1114. if(is_cloak(otmp)) (void) Cloak_on(); 1115. /* if(is_shield(otmp)) (void) Shield_on(); */ 1116. on_msg(otmp); 1117. } 1118. takeoff_mask = taking_off = 0L; 1119. return(1); 1120. } 1121. 1122. int 1123. doputon() { 1124. register struct obj *otmp; 1125. long mask = 0L; 1126. 1127. if(uleft && uright && uamul && ublindf) { 1128. #ifdef POLYSELF 1129. Your("%s%s are full, and you're already wearing an amulet and a blindfold.", 1130. humanoid(uasmon) ? "ring-" : "", 1131. makeplural(body_part(FINGER))); 1132. #else 1133. Your("ring-fingers are full, and you're already wearing an amulet and a blindfold."); 1134. #endif 1135. return(0); 1136. } 1137. otmp = getobj(accessories, "wear"); 1138. if(!otmp) return(0); 1139. if(otmp->owornmask & (W_RING | W_AMUL | W_TOOL)) { 1140. already_wearing("that!"); 1141. return(0); 1142. } 1143. if(welded(otmp)) { 1144. weldmsg(otmp, TRUE); 1145. return(0); 1146. } 1147. if(otmp == uwep) 1148. setuwep((struct obj *)0); 1149. if(otmp->oclass == RING_CLASS) { 1150. #ifdef POLYSELF 1151. if(nolimbs(uasmon)) { 1152. You("cannot make the ring stick to your body."); 1153. return(0); 1154. } 1155. #endif 1156. if(uleft && uright){ 1157. #ifdef POLYSELF 1158. pline("There are no more %s%s to fill.", 1159. humanoid(uasmon) ? "ring-" : "", 1160. makeplural(body_part(FINGER))); 1161. #else 1162. pline("There are no more ring-fingers to fill."); 1163. #endif 1164. return(0); 1165. } 1166. if(uleft) mask = RIGHT_RING; 1167. else if(uright) mask = LEFT_RING; 1168. else do { 1169. char qbuf[QBUFSZ]; 1170. char answer; 1171. 1172. #ifdef POLYSELF 1173. Sprintf(qbuf, "What %s%s, Right or Left?", 1174. humanoid(uasmon) ? "ring-" : "", 1175. body_part(FINGER)); 1176. #else 1177. Strcpy(qbuf, "What ring-finger, Right or Left?"); 1178. #endif 1179. if(!(answer = yn_function(qbuf, "rl", '\0'))) 1180. return(0); 1181. switch(answer){ 1182. case 'l': 1183. case 'L': 1184. mask = LEFT_RING; 1185. break; 1186. case 'r': 1187. case 'R': 1188. mask = RIGHT_RING; 1189. break; 1190. } 1191. } while(!mask); 1192. if (uarmg && uarmg->cursed) { 1193. uarmg->bknown = TRUE; 1194. You("cannot remove your gloves to put on the ring."); 1195. return(0); 1196. } 1197. if (welded(uwep) && bimanual(uwep)) { 1198. /* welded will set bknown */ 1199. You("cannot free your weapon hands to put on the ring."); 1200. return(0); 1201. } 1202. if (welded(uwep) && mask==RIGHT_RING) { 1203. /* welded will set bknown */ 1204. You("cannot free your weapon hand to put on the ring."); 1205. return(0); 1206. } 1207. setworn(otmp, mask); 1208. Ring_on(otmp); 1209. } else if (otmp->oclass == AMULET_CLASS) { 1210. if(uamul) { 1211. already_wearing("an amulet."); 1212. return(0); 1213. } 1214. setworn(otmp, W_AMUL); 1215. if (otmp->otyp == AMULET_OF_CHANGE) { 1216. Amulet_on(); 1217. /* Don't do a prinv() since the amulet is now gone */ 1218. return(1); 1219. } 1220. Amulet_on(); 1221. } else { /* it's a blindfold */ 1222. if (ublindf) { 1223. if (ublindf->otyp == TOWEL) 1224. Your("%s is already covered by a towel.", 1225. body_part(FACE)); 1226. else 1227. already_wearing("a blindfold."); 1228. return(0); 1229. } 1230. if (otmp->otyp != BLINDFOLD && otmp->otyp != TOWEL) { 1231. You("can't wear that!"); 1232. return(0); 1233. } 1234. Blindf_on(otmp); 1235. return(1); 1236. } 1237. prinv(NULL, otmp, 0L); 1238. return(1); 1239. } 1240. 1241. #endif /* OVLB */ 1242. 1243. #ifdef OVL0 1244. 1245. void 1246. find_ac() { 1247. register int uac = 10; 1248. #ifdef POLYSELF 1249. if (u.mtimedone) uac = mons[u.umonnum].ac; 1250. #endif 1251. if(uarm) uac -= ARM_BONUS(uarm); 1252. if(uarmc) uac -= ARM_BONUS(uarmc); 1253. if(uarmh) uac -= ARM_BONUS(uarmh); 1254. if(uarmf) uac -= ARM_BONUS(uarmf); 1255. if(uarms) uac -= ARM_BONUS(uarms); 1256. if(uarmg) uac -= ARM_BONUS(uarmg); 1257. #ifdef TOURIST 1258. if(uarmu) uac -= ARM_BONUS(uarmu); 1259. #endif 1260. if(uleft && uleft->otyp == RIN_PROTECTION) uac -= uleft->spe; 1261. if(uright && uright->otyp == RIN_PROTECTION) uac -= uright->spe; 1262. if (Protection & INTRINSIC) uac -= u.ublessed; 1263. if(uac != u.uac){ 1264. u.uac = uac; 1265. flags.botl = 1; 1266. } 1267. } 1268. 1269. #endif /* OVL0 */ 1270. #ifdef OVLB 1271. 1272. void 1273. glibr() 1274. { 1275. register struct obj *otmp; 1276. int xfl = 0; 1277. boolean leftfall, rightfall; 1278. 1279. leftfall = (uleft && !uleft->cursed && 1280. (!uwep || !welded(uwep) || !bimanual(uwep))); 1281. rightfall = (uright && !uright->cursed && (!welded(uwep))); 1282. if(!uarmg) if(leftfall || rightfall) 1283. #ifdef POLYSELF 1284. if(!nolimbs(uasmon)) 1285. #endif 1286. { 1287. /* changed so cursed rings don't fall off, GAN 10/30/86 */ 1288. Your("%s off your %s.", 1289. (leftfall && rightfall) ? "rings slip" : "ring slips", 1290. makeplural(body_part(FINGER))); 1291. xfl++; 1292. if(leftfall) { 1293. otmp = uleft; 1294. Ring_off(uleft); 1295. dropx(otmp); 1296. } 1297. if(rightfall) { 1298. otmp = uright; 1299. Ring_off(uright); 1300. dropx(otmp); 1301. } 1302. } 1303. otmp = uwep; 1304. if (otmp && !welded(otmp)) { 1305. /* changed so cursed weapons don't fall, GAN 10/30/86 */ 1306. Your("%s %sslips from your %s.", 1307. is_sword(otmp) ? "sword" : 1308. makesingular(oclass_names[otmp->oclass]), 1309. xfl ? "also " : "", 1310. makeplural(body_part(HAND))); 1311. setuwep((struct obj *)0); 1312. dropx(otmp); 1313. } 1314. } 1315. 1316. struct obj * 1317. some_armor(){ 1318. register struct obj *otmph = (uarmc ? uarmc : uarm); 1319. if(uarmh && (!otmph || !rn2(4))) otmph = uarmh; 1320. if(uarmg && (!otmph || !rn2(4))) otmph = uarmg; 1321. if(uarmf && (!otmph || !rn2(4))) otmph = uarmf; 1322. if(uarms && (!otmph || !rn2(4))) otmph = uarms; 1323. #ifdef TOURIST 1324. if(!uarm && !uarmc && uarmu && (!otmph || !rn2(4))) otmph = uarmu; 1325. #endif 1326. return(otmph); 1327. } 1328. 1329. void 1330. erode_armor(acid_dmg) 1331. boolean acid_dmg; 1332. { 1333. register struct obj *otmph = some_armor(); 1334. 1335. if (otmph && otmph != uarmf) { 1336. if (otmph->greased) { 1337. grease_protect(otmph,NULL,FALSE); 1338. return; 1339. } 1340. if (otmph->oerodeproof || 1341. (acid_dmg ? !is_corrodeable(otmph) : !is_rustprone(otmph))) { 1342. if (flags.verbose || !(otmph->oerodeproof && otmph->rknown)) 1343. Your("%s not affected.", aobjnam(otmph, "are")); 1344. if (otmph->oerodeproof) otmph->rknown = TRUE; 1345. return; 1346. } 1347. if (otmph->oeroded < MAX_ERODE) { 1348. Your("%s%s!", aobjnam(otmph, acid_dmg ? "corrode" : "rust"), 1349. otmph->oeroded+1 == MAX_ERODE ? " completely" : 1350. otmph->oeroded ? " further" : ""); 1351. otmph->oeroded++; 1352. return; 1353. } 1354. if (flags.verbose) 1355. Your("%s completely %s.", 1356. aobjnam(otmph, Blind ? "feel" : "look"), 1357. acid_dmg ? "corroded" : "rusty"); 1358. } 1359. } 1360. 1361. STATIC_PTR 1362. int 1363. select_off(otmp) 1364. register struct obj *otmp; 1365. { 1366. if(!otmp) return(0); 1367. if(cursed(otmp)) return(0); 1368. #ifdef POLYSELF 1369. if(otmp->oclass==RING_CLASS && nolimbs(uasmon)) return(0); 1370. #endif 1371. if(welded(uwep) && (otmp==uarmg || otmp==uright || (otmp==uleft 1372. && bimanual(uwep)))) 1373. return(0); 1374. if(uarmg && uarmg->cursed && (otmp==uright || otmp==uleft)) { 1375. uarmg->bknown = TRUE; 1376. return(0); 1377. } 1378. if(otmp == uarmf && u.utrap && (u.utraptype == TT_BEARTRAP || 1379. u.utraptype == TT_INFLOOR)) { 1380. return (0); 1381. } 1382. if((otmp==uarm 1383. #ifdef TOURIST 1384. || otmp==uarmu 1385. #endif 1386. ) && uarmc && uarmc->cursed) { 1387. uarmc->bknown = TRUE; 1388. return(0); 1389. } 1390. #ifdef TOURIST 1391. if(otmp==uarmu && uarm && uarm->cursed) { 1392. uarm->bknown = TRUE; 1393. return(0); 1394. } 1395. #endif 1396. 1397. if(otmp == uarm) takeoff_mask |= WORN_ARMOR; 1398. else if(otmp == uarmc) takeoff_mask |= WORN_CLOAK; 1399. else if(otmp == uarmf) takeoff_mask |= WORN_BOOTS; 1400. else if(otmp == uarmg) takeoff_mask |= WORN_GLOVES; 1401. else if(otmp == uarmh) takeoff_mask |= WORN_HELMET; 1402. else if(otmp == uarms) takeoff_mask |= WORN_SHIELD; 1403. #ifdef TOURIST 1404. else if(otmp == uarmu) takeoff_mask |= WORN_SHIRT; 1405. #endif 1406. else if(otmp == uleft) takeoff_mask |= LEFT_RING; 1407. else if(otmp == uright) takeoff_mask |= RIGHT_RING; 1408. else if(otmp == uamul) takeoff_mask |= WORN_AMUL; 1409. else if(otmp == ublindf) takeoff_mask |= WORN_BLINDF; 1410. else if(otmp == uwep) takeoff_mask |= 1L; /* WIELDED_WEAPON */ 1411. 1412. else impossible("select_off: %s???", doname(otmp)); 1413. 1414. return(0); 1415. } 1416. 1417. static struct obj * 1418. do_takeoff() { 1419. 1420. register struct obj *otmp = (struct obj *)0; 1421. 1422. if (taking_off == 1L) { /* weapon */ 1423. if(!cursed(uwep)) { 1424. setuwep((struct obj *) 0); 1425. You("are empty %s.", body_part(HANDED)); 1426. } 1427. } else if (taking_off == WORN_ARMOR) { 1428. otmp = uarm; 1429. if(!cursed(otmp)) (void) Armor_off(); 1430. } else if (taking_off == WORN_CLOAK) { 1431. otmp = uarmc; 1432. if(!cursed(otmp)) (void) Cloak_off(); 1433. } else if (taking_off == WORN_BOOTS) { 1434. otmp = uarmf; 1435. if(!cursed(otmp)) (void) Boots_off(); 1436. } else if (taking_off == WORN_GLOVES) { 1437. otmp = uarmg; 1438. if(!cursed(otmp)) (void) Gloves_off(); 1439. } else if (taking_off == WORN_HELMET) { 1440. otmp = uarmh; 1441. if(!cursed(otmp)) (void) Helmet_off(); 1442. } else if (taking_off == WORN_SHIELD) { 1443. otmp = uarms; 1444. if(!cursed(otmp)) (void) Shield_off(); 1445. #ifdef TOURIST 1446. } else if (taking_off == WORN_SHIRT) { 1447. otmp = uarmu; 1448. if(!cursed(otmp)) 1449. setworn((struct obj *)0, uarmu->owornmask & W_ARMOR); 1450. #endif 1451. } else if (taking_off == WORN_AMUL) { 1452. otmp = uamul; 1453. if(!cursed(otmp)) Amulet_off(); 1454. } else if (taking_off == LEFT_RING) { 1455. otmp = uleft; 1456. if(!cursed(otmp)) Ring_off(uleft); 1457. } else if (taking_off == RIGHT_RING) { 1458. otmp = uright; 1459. if(!cursed(otmp)) Ring_off(uright); 1460. } else if (taking_off == WORN_BLINDF) { 1461. if(!cursed(ublindf)) { 1462. setworn((struct obj *)0, ublindf->owornmask); 1463. if(!Blinded) make_blinded(1L,FALSE); /* See on next move */ 1464. else You("still cannot see."); 1465. } 1466. } else impossible("do_takeoff: taking off %lx", taking_off); 1467. 1468. return(otmp); 1469. } 1470. 1471. STATIC_PTR 1472. int 1473. take_off() { 1474. 1475. register int i; 1476. register struct obj *otmp; 1477. 1478. if(taking_off) { 1479. if(todelay > 0) { 1480. 1481. todelay--; 1482. return(1); /* still busy */ 1483. } else if((otmp = do_takeoff())) off_msg(otmp); 1484. 1485. takeoff_mask &= ~taking_off; 1486. taking_off = 0L; 1487. } 1488. 1489. for(i = 0; takeoff_order[i]; i++) 1490. if(takeoff_mask & takeoff_order[i]) { 1491. 1492. taking_off = takeoff_order[i]; 1493. break; 1494. } 1495. 1496. otmp = (struct obj *) 0; 1497. 1498. if (taking_off == 0L) { 1499. You("finish disrobing."); 1500. return 0; 1501. } else if (taking_off == 1L) { 1502. todelay = 1; 1503. } else if (taking_off == WORN_ARMOR) { 1504. otmp = uarm; 1505. } else if (taking_off == WORN_CLOAK) { 1506. otmp = uarmc; 1507. } else if (taking_off == WORN_BOOTS) { 1508. otmp = uarmf; 1509. } else if (taking_off == WORN_GLOVES) { 1510. otmp = uarmg; 1511. } else if (taking_off == WORN_HELMET) { 1512. otmp = uarmh; 1513. } else if (taking_off == WORN_SHIELD) { 1514. otmp = uarms; 1515. #ifdef TOURIST 1516. } else if (taking_off == WORN_SHIRT) { 1517. otmp = uarmu; 1518. #endif 1519. } else if (taking_off == WORN_AMUL) { 1520. todelay = 1; 1521. } else if (taking_off == LEFT_RING) { 1522. todelay = 1; 1523. } else if (taking_off == RIGHT_RING) { 1524. todelay = 1; 1525. } else if (taking_off == WORN_BLINDF) { 1526. todelay = 2; 1527. } else { 1528. impossible("take_off: taking off %lx", taking_off); 1529. return 0; /* force done */ 1530. } 1531. 1532. if(otmp) todelay = objects[otmp->otyp].oc_delay; 1533. set_occupation(take_off, "disrobing", 0); 1534. return(1); /* get busy */ 1535. } 1536. 1537. #endif /* OVLB */ 1538. #ifdef OVL1 1539. 1540. void 1541. reset_remarm() { taking_off = takeoff_mask =0L; } 1542. 1543. #endif /* OVL1 */ 1544. #ifdef OVLB 1545. 1546. int 1547. doddoremarm() { 1548. 1549. if(taking_off || takeoff_mask) { 1550. 1551. You("continue disrobing."); 1552. set_occupation(take_off, "disrobing", 0); 1553. return(take_off()); 1554. } 1555. 1556. (void) ggetobj("take off", select_off, 0); 1557. if(takeoff_mask) return(take_off()); 1558. else return(0); 1559. } 1560. 1561. int 1562. destroy_arm(atmp) 1563. register struct obj *atmp; 1564. { 1565. register struct obj *otmp; 1566. 1567. if((otmp = uarmc) && (!atmp || atmp == uarmc)) { 1568. Your("cloak crumbles and turns to dust!"); 1569. (void) Cloak_off(); 1570. useup(otmp); 1571. } else if((otmp = uarm) && (!atmp || atmp == uarm)) { 1572. /* may be disintegrated by spell or dragon breath... */ 1573. if (donning(otmp)) cancel_don(); 1574. Your("armor turns to dust and falls to the floor!"); 1575. (void) Armor_gone(); 1576. useup(otmp); 1577. #ifdef TOURIST 1578. } else if((otmp = uarmu) && (!atmp || atmp == uarmu)) { 1579. Your("shirt crumbles into tiny threads and falls apart!"); 1580. useup(otmp); 1581. #endif 1582. } else if((otmp = uarmh) && (!atmp || atmp == uarmh)) { 1583. if (donning(otmp)) cancel_don(); 1584. Your("helmet turns to dust and is blown away!"); 1585. (void) Helmet_off(); 1586. useup(otmp); 1587. } else if((otmp = uarmg) && (!atmp || atmp == uarmg)) { 1588. if (donning(otmp)) cancel_don(); 1589. Your("gloves vanish!"); 1590. (void) Gloves_off(); 1591. useup(otmp); 1592. selftouch("You"); 1593. } else if((otmp = uarmf) && (!atmp || atmp == uarmf)) { 1594. if (donning(otmp)) cancel_don(); 1595. Your("boots disintegrate!"); 1596. (void) Boots_off(); 1597. useup(otmp); 1598. } else if((otmp =uarms) && (!atmp || atmp == uarms)) { 1599. Your("shield crumbles away!"); 1600. (void) Shield_off(); 1601. useup(otmp); 1602. } else return(0); /* could not destroy anything */ 1603. 1604. return(1); 1605. } 1606. 1607. void 1608. adj_abon(otmp, delta) 1609. register struct obj *otmp; 1610. register schar delta; 1611. { 1612. if (uarmg && otmp->otyp == GAUNTLETS_OF_DEXTERITY) { 1613. ABON(A_DEX) += (delta); 1614. flags.botl = 1; 1615. } 1616. if (uarmh && otmp->otyp == HELM_OF_BRILLIANCE) { 1617. ABON(A_INT) += (delta); 1618. ABON(A_WIS) += (delta); 1619. flags.botl = 1; 1620. } 1621. } 1622. 1623. #endif /* OVLB */ 1624. 1625. /*do_wear.c*/