abstract
| - Below is the full text to mhitu.c from the source code of NetHack 3.1.0. To link to a particular line, write [[NetHack 3.1.0/mhitu.c#line123]], for example. Warning! This is the source code from an old release. For the latest release, see Source code 1. /* SCCS Id: @(#)mhitu.c 3.1 92/12/10 */ 2. /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ 3. /* NetHack may be freely redistributed. See license for details. */ 4. 5. #include "hack.h" 6. #include "artifact.h" 7. 8. STATIC_VAR struct obj NEARDATA *otmp; 9. 10. #ifdef POLYSELF 11. STATIC_DCL void FDECL(urustm, (struct monst *, struct obj *)); 12. # ifdef OVL1 13. static int FDECL(passiveum, (struct permonst *,struct monst *,struct attack *)); 14. # endif /* OVL1 */ 15. #endif /* POLYSELF */ 16. 17. #ifdef OVLB 18. # ifdef SEDUCE 19. static void FDECL(mayberem, (struct obj *, const char *)); 20. # endif 21. #endif /* OVLB */ 22. 23. STATIC_DCL boolean FDECL(diseasemu, (struct permonst *)); 24. STATIC_DCL int FDECL(hitmu, (struct monst *,struct attack *)); 25. STATIC_DCL int FDECL(gulpmu, (struct monst *,struct attack *)); 26. STATIC_DCL int FDECL(explmu, (struct monst *,struct attack *,BOOLEAN_P)); 27. STATIC_DCL int FDECL(gazemu, (struct monst *,struct attack *)); 28. STATIC_DCL void FDECL(missmu,(struct monst *,BOOLEAN_P,struct attack *)); 29. STATIC_DCL void FDECL(mswings,(struct monst *,struct obj *)); 30. STATIC_DCL void FDECL(wildmiss,(struct monst *)); 31. 32. STATIC_DCL void FDECL(hurtarmor,(struct permonst *,int)); 33. STATIC_DCL void FDECL(hitmsg,(struct monst *,struct attack *)); 34. 35. /* See comment in mhitm.c. If we use this a lot it probably should be */ 36. /* changed to a parameter to mhitu. */ 37. static int dieroll; 38. 39. #ifdef OVL1 40. 41. 42. STATIC_OVL void 43. hitmsg(mtmp, mattk) 44. register struct monst *mtmp; 45. register struct attack *mattk; 46. { 47. int compat; 48. 49. /* Note: if opposite gender, "seductively" */ 50. /* If same gender, "engagingly" for nymph, normal msg for others */ 51. if((compat = could_seduce(mtmp, &youmonst, mattk)) 52. && !mtmp->mcan && !mtmp->mspec_used) { 53. pline("%s %s you %s.", Monnam(mtmp), 54. Blind ? "talks to" : "smiles at", 55. compat == 2 ? "engagingly" : "seductively"); 56. } else 57. switch (mattk->aatyp) { 58. case AT_BITE: 59. pline("%s bites!", Monnam(mtmp)); 60. break; 61. case AT_KICK: 62. #ifdef POLYSELF 63. pline("%s kicks%c", Monnam(mtmp), thick_skinned(uasmon) ? '.' : '!'); 64. #else 65. pline("%s kicks!", Monnam(mtmp)); 66. #endif 67. break; 68. case AT_STNG: 69. pline("%s stings!", Monnam(mtmp)); 70. break; 71. case AT_BUTT: 72. pline("%s butts!", Monnam(mtmp)); 73. break; 74. case AT_TUCH: 75. pline("%s touches you!", Monnam(mtmp)); 76. break; 77. case AT_TENT: 78. pline("%s tentacles suck you!", 79. s_suffix(Monnam(mtmp))); 80. break; 81. case AT_EXPL: 82. pline("%s explodes!", Monnam(mtmp)); 83. break; 84. default: 85. pline("%s hits!", Monnam(mtmp)); 86. } 87. } 88. 89. STATIC_OVL void 90. missmu(mtmp, nearmiss, mattk) /* monster missed you */ 91. register struct monst *mtmp; 92. register boolean nearmiss; 93. register struct attack *mattk; 94. { 95. if(could_seduce(mtmp, &youmonst, mattk) && !mtmp->mcan) 96. pline("%s pretends to be friendly.", Monnam(mtmp)); 97. else { 98. if (!flags.verbose || !nearmiss) 99. pline("%s misses.", Monnam(mtmp)); 100. else 101. pline("%s just misses!", Monnam(mtmp)); 102. } 103. } 104. 105. STATIC_OVL void 106. mswings(mtmp, otemp) /* monster swings obj */ 107. register struct monst *mtmp; 108. register struct obj *otemp; 109. { 110. if (!flags.verbose || Blind || !mon_visible(mtmp) || 111. otemp->oclass != WEAPON_CLASS) return; 112. pline("%s %s %s %s.", Monnam(mtmp), 113. ((otemp->otyp >= SPEAR && 114. otemp->otyp <= LANCE) || 115. (otemp->otyp >= PARTISAN && 116. otemp->otyp <= SPETUM) || 117. otemp->otyp == TRIDENT) ? "thrusts" : "swings", 118. !humanoid(mtmp->data) ? "its" : mtmp->female ? "her" : "his", 119. xname(otemp)); 120. } 121. 122. #endif /* OVL1 */ 123. #ifdef OVLB 124. 125. STATIC_OVL void 126. wildmiss(mtmp) /* monster attacked your displaced image */ 127. register struct monst *mtmp; 128. { 129. int compat; 130. 131. if (!flags.verbose) return; 132. if (!cansee(mtmp->mx, mtmp->my)) return; 133. /* maybe it's attacking an image around the corner? */ 134. 135. compat = could_seduce(mtmp, &youmonst, (struct attack *)0); 136. /* we really want to have the attack here to pass -- 137. * the previous code checked whether mtmp was a nymph, 138. * which was not correct either since the attack type of 139. * succubi/incubi varies with SEDUCE 140. */ 141. 142. if(Invis && !perceives(mtmp->data)) { 143. if(compat) 144. pline("%s tries to touch you and misses!", Monnam(mtmp)); 145. else 146. switch(rn2(3)) { 147. case 0: pline("%s %s wildly and misses!", Monnam(mtmp), 148. nolimbs(mtmp->data) ? "lunges" : "swings"); 149. break; 150. case 1: pline("%s attacks a spot beside you.", Monnam(mtmp)); 151. break; 152. case 2: pline("%s strikes at %s!", Monnam(mtmp), 153. Underwater ? "empty water" : "thin air"); 154. break; 155. default:pline("%s %s wildly!", Monnam(mtmp), 156. nolimbs(mtmp->data) ? "lunges" : "swings"); 157. break; 158. } 159. } 160. else if(Displaced) { 161. if(compat) 162. pline("%s smiles %s at your %sdisplaced image...", 163. Monnam(mtmp), 164. compat == 2 ? "engagingly" : "seductively", 165. Invis ? "invisible " : ""); 166. else 167. pline("%s strikes at your %sdisplaced image and misses you!", 168. /* Note: if you're both invisible and displaced, 169. * only monsters which see invisible will attack your 170. * displaced image, since the displaced image is also 171. * invisible. 172. */ 173. Monnam(mtmp), 174. Invis ? "invisible " : ""); 175. } 176. /* monsters may miss especially on water level where 177. bubbles shake the player here and there */ 178. else if(Underwater) { 179. if(compat) 180. pline("%s reaches towards your distorted image.",Monnam(mtmp)); 181. else 182. pline("%s is fooled by water reflections and misses!",Monnam(mtmp)); 183. } 184. else impossible("%s attacks you without knowing your location?", 185. Monnam(mtmp)); 186. } 187. 188. void 189. expels(mtmp, mdat, message) 190. register struct monst *mtmp; 191. register struct permonst *mdat; /* if mtmp is polymorphed, mdat != mtmp->data */ 192. boolean message; 193. { 194. if (message) 195. if (is_animal(mdat)) 196. You("get regurgitated!"); 197. else { 198. char blast[40]; 199. register int i; 200. 201. blast[0] = '\0'; 202. for(i = 0; i < NATTK; i++) 203. if(mdat->mattk[i].aatyp == AT_ENGL) 204. break; 205. if (mdat->mattk[i].aatyp != AT_ENGL) 206. impossible("Swallower has no engulfing attack?"); 207. else { 208. if (is_whirly(mdat)) { 209. switch (mdat->mattk[i].adtyp) { 210. case AD_ELEC: 211. Strcpy(blast, 212. " in a shower of sparks"); 213. break; 214. case AD_COLD: 215. Strcpy(blast, 216. " in a blast of frost"); 217. break; 218. } 219. } else 220. Strcpy(blast, " with a squelch"); 221. You("get expelled from %s%s!", 222. mon_nam(mtmp), blast); 223. } 224. } 225. unstuck(mtmp); /* ball&chain returned in unstuck() */ 226. mnexto(mtmp); 227. newsym(u.ux,u.uy); 228. spoteffects(); 229. /* to cover for a case where mtmp is not in a next square */ 230. if(um_dist(mtmp->mx,mtmp->my,1)) 231. pline("Brrooaa... You land hard at some distance."); 232. } 233. 234. #endif /* OVLB */ 235. #ifdef OVL0 236. 237. /* 238. * mattacku: monster attacks you 239. * returns 1 if monster dies (e.g. "yellow light"), 0 otherwise 240. * Note: if you're displaced or invisible the monster might attack the 241. * wrong position... 242. * Assumption: it's attacking you or an empty square; if there's another 243. * monster which it attacks by mistake, the caller had better 244. * take care of it... 245. */ 246. int 247. mattacku(mtmp) 248. register struct monst *mtmp; 249. { 250. struct attack *mattk; 251. int i, j, tmp, sum[NATTK]; 252. struct permonst *mdat = mtmp->data; 253. boolean ranged = (distu(mtmp->mx, mtmp->my) > 3); 254. /* Is it near you? Affects your actions */ 255. boolean range2 = !monnear(mtmp, mtmp->mux, mtmp->muy); 256. /* Does it think it's near you? Affects its actions */ 257. boolean foundyou = (mtmp->mux==u.ux && mtmp->muy==u.uy); 258. /* Is it attacking you or your image? */ 259. boolean youseeit = canseemon(mtmp); 260. /* Might be attacking your image around the corner, or 261. * invisible, or you might be blind.... 262. */ 263. 264. if(!ranged) nomul(0); 265. if(mtmp->mhp <= 0 || (Underwater && !is_swimmer(mtmp->data))) 266. return(0); 267. 268. /* If swallowed, can only be affected by u.ustuck */ 269. if(u.uswallow) { 270. if(mtmp != u.ustuck) 271. return(0); 272. u.ustuck->mux = u.ux; 273. u.ustuck->muy = u.uy; 274. range2 = 0; 275. foundyou = 1; 276. if(u.uinvulnerable) return (0); /* stomachs can't hurt you! */ 277. /* This is not impossible! */ 278. /* If the swallowing monster changes into a monster 279. * that is not capable of swallowing you, you get 280. * regurgitated - dgk 281. * 282. * This code is obsolete: newcham() will handle this contingency 283. * as soon as it occurs in the course of a round. - kcd 284. * 285. * for(i = 0; i < NATTK; i++) 286. * if(mdat->mattk[i].aatyp == AT_ENGL) goto doattack; 287. * 288. * You("get regurgitated!"); 289. * regurgitates(mtmp); 290. * return(0); 291. */ 292. } 293. /* doattack: use commented out above */ 294. #ifdef POLYSELF 295. if (u.uundetected && !range2 && foundyou && !u.uswallow) { 296. u.uundetected = 0; 297. if (is_hider(uasmon)) { 298. coord cc; /* maybe we need a unexto() function? */ 299. 300. You("fall from the ceiling!"); 301. if (enexto(&cc, u.ux, u.uy, &playermon)) { 302. remove_monster(mtmp->mx, mtmp->my); 303. newsym(mtmp->mx,mtmp->my); 304. place_monster(mtmp, u.ux, u.uy); 305. if(mtmp->wormno) worm_move(mtmp); 306. teleds(cc.x, cc.y); 307. set_apparxy(mtmp); 308. newsym(u.ux,u.uy); 309. } else { 310. pline("%s is killed by a falling %s (you)!", 311. Monnam(mtmp), uasmon->mname); 312. killed(mtmp); 313. newsym(u.ux,u.uy); 314. return(0); 315. } 316. if (u.usym != S_PIERCER) 317. return(0); /* trappers don't attack */ 318. #ifdef MUSE 319. if (which_armor(mtmp, WORN_HELMET)) { 320. #else 321. if (is_mercenary(mtmp->data) && m_carrying(mtmp,HELMET)) { 322. #endif 323. Your("blow glances off %s helmet.", 324. s_suffix(mon_nam(mtmp))); 325. } else { 326. if (3 + find_mac(mtmp) <= rnd(20)) { 327. pline("%s is hit by a falling piercer (you)!", 328. Monnam(mtmp)); 329. if ((mtmp->mhp -= d(3,6)) < 1) 330. killed(mtmp); 331. } else 332. pline("%s is almost hit by a falling piercer (you)!", 333. Monnam(mtmp)); 334. } 335. } else { 336. if (!youseeit) 337. pline("It tries to move where you are hiding."); 338. else { 339. /* Ugly kludge for eggs. The message is phrased so as 340. * to be directed at the monster, not the player, 341. * which makes "laid by you" wrong. For the 342. * parallelism to work, we can't rephrase it, so we 343. * zap the "laid by you" momentarily instead. 344. */ 345. struct obj *obj = level.objects[u.ux][u.uy]; 346. 347. if (obj) { 348. int save_spe = obj->spe; 349. if (obj->otyp == EGG) obj->spe = 0; 350. pline("Wait, %s! There's a %s named %s hiding under %s!", 351. mtmp->mnamelth ? (const char *)NAME(mtmp) 352. : mtmp->data->mname, 353. uasmon->mname, plname, 354. doname(level.objects[u.ux][u.uy])); 355. obj->spe = save_spe; 356. } else 357. impossible("hiding under nothing?"); 358. } 359. newsym(u.ux,u.uy); 360. } 361. return(0); 362. } 363. if (u.usym == S_MIMIC_DEF && !range2 && foundyou && !u.uswallow) { 364. if (!youseeit) pline("It gets stuck on you."); 365. else pline("Wait, %s! That's a %s named %s!", 366. mtmp->mnamelth ? (const char *)NAME(mtmp) : mtmp->data->mname, 367. uasmon->mname, plname); 368. u.ustuck = mtmp; 369. u.usym = S_MIMIC; 370. newsym(u.ux,u.uy); 371. return(0); 372. } 373. #endif 374. /* Work out the armor class differential */ 375. tmp = u.uac + 10; /* tmp ~= 0 - 20 */ 376. /* give people with Ac < -9 at least some vulnerability */ 377. /* negative AC gives an actual AC of somewhere from -1 to the AC */ 378. if (tmp < 10) tmp = 10 - rnd(10-tmp); 379. tmp += mtmp->m_lev; 380. if(multi < 0) tmp += 4; 381. if((Invis && !perceives(mdat)) || !mtmp->mcansee) 382. tmp -= 2; 383. if(mtmp->mtrapped) tmp -= 2; 384. if(tmp <= 0) tmp = 1; 385. 386. /* make eels visible the moment they hit/miss us */ 387. if(mdat->mlet == S_EEL && mtmp->minvis && cansee(mtmp->mx,mtmp->my)) { 388. mtmp->minvis = 0; 389. newsym(mtmp->mx,mtmp->my); 390. } 391. 392. /* Special demon handling code */ 393. if(!mtmp->cham && is_demon(mdat) && !range2 394. && mtmp->data != &mons[PM_BALROG] 395. && mtmp->data != &mons[PM_SUCCUBUS] 396. && mtmp->data != &mons[PM_INCUBUS]) 397. if(!mtmp->mcan && !rn2(13)) msummon(mdat); 398. 399. /* Special lycanthrope handling code */ 400. if(!mtmp->cham && is_were(mdat) && !range2) { 401. 402. if(is_human(mdat)) { 403. if(!rn2(5 - (night() * 2)) && !mtmp->mcan) new_were(mtmp); 404. } else if(!rn2(30) && !mtmp->mcan) new_were(mtmp); 405. 406. if(!rn2(10) && !mtmp->mcan) { 407. if(youseeit) { 408. pline("%s summons help!",youseeit ? 409. Monnam(mtmp) : "It"); 410. } else 411. You("feel hemmed in."); 412. /* Technically wrong; we really should check if you can see the 413. * help, but close enough... 414. */ 415. if (!were_summon(mdat,FALSE) && youseeit) 416. pline("But none comes."); 417. } 418. } 419. 420. if(u.uinvulnerable) { 421. /* monster's won't attack you */ 422. if(mtmp == u.ustuck) 423. pline("%s loosens its grip slightly.", Monnam(mtmp)); 424. else if(!range2) { 425. if(youseeit) 426. pline("%s starts to attack you, but pulls back.", 427. Monnam(mtmp)); 428. else 429. You("feel something move nearby."); 430. } 431. return (0); 432. } 433. #ifdef MUSE 434. /* Unlike defensive stuff, don't let them use item _and_ attack. */ 435. /* Exception: Medusa; her gaze is automatic. (We actually kludge 436. * by permitting a full attack sequence, not just a gaze attack.) 437. */ 438. if(find_offensive(mtmp)) { 439. int foo = use_offensive(mtmp); 440. 441. if (mtmp->data != &mons[PM_MEDUSA] && foo != 0) return(foo==1); 442. } 443. #endif 444. 445. for(i = 0; i < NATTK; i++) { 446. 447. sum[i] = 0; 448. mattk = &(mdat->mattk[i]); 449. if (u.uswallow && (mattk->aatyp != AT_ENGL)) 450. continue; 451. switch(mattk->aatyp) { 452. case AT_CLAW: /* "hand to hand" attacks */ 453. case AT_KICK: 454. case AT_BITE: 455. case AT_STNG: 456. case AT_TUCH: 457. case AT_BUTT: 458. case AT_TENT: 459. if(!range2) { 460. if (foundyou) { 461. if(tmp > (j = rnd(20+i))) { 462. #ifdef POLYSELF 463. if (mattk->aatyp != AT_KICK || 464. !thick_skinned(uasmon)) 465. #endif 466. sum[i] = hitmu(mtmp, mattk); 467. } else 468. missmu(mtmp, (tmp == j), mattk); 469. } else 470. wildmiss(mtmp); 471. } 472. break; 473. 474. case AT_HUGS: /* automatic if prev two attacks succeed */ 475. /* Note: if displaced, prev attacks never succeeded */ 476. if((!range2 && i>=2 && sum[i-1] && sum[i-2]) 477. || mtmp == u.ustuck) 478. sum[i]= hitmu(mtmp, mattk); 479. break; 480. 481. case AT_GAZE: /* can affect you either ranged or not */ 482. if (youseeit) 483. /* not displaced around a corner so not visible */ 484. sum[i] = gazemu(mtmp, mattk); 485. /* if gazemu returns, the player isn't dead. 486. * can't put this in gazemu() because youseeit might 487. * not be set 488. */ 489. if(Reflecting && m_canseeu(mtmp) && 490. !mtmp->mcan && mtmp->data == &mons[PM_MEDUSA]) { 491. if(!Blind) { 492. if(Reflecting & W_AMUL) 493. makeknown(AMULET_OF_REFLECTION); 494. else 495. makeknown(SHIELD_OF_REFLECTION); 496. pline("%s gaze is reflected by your %s.", 497. s_suffix(Monnam(mtmp)), 498. (Reflecting & W_AMUL) ? 499. "medallion" : "shield"); 500. pline("%s is turned to stone!", Monnam(mtmp)); 501. } 502. stoned = TRUE; 503. killed(mtmp); 504. sum[i] = 2; 505. } 506. break; 507. 508. case AT_EXPL: /* automatic hit if next to, and aimed at you */ 509. if(!range2) sum[i] = explmu(mtmp, mattk, foundyou); 510. break; 511. 512. case AT_ENGL: 513. if (!range2) { 514. if(foundyou) { 515. if(u.uswallow || tmp > (j = rnd(20+i))) { 516. /* Force swallowing monster to be 517. * displayed even when player is 518. * moving away */ 519. flush_screen(1); 520. sum[i] = gulpmu(mtmp, mattk); 521. } else { 522. missmu(mtmp, (tmp == j), mattk); 523. } 524. } else if (is_animal(mtmp->data)) 525. pline("%s gulps some air!", youseeit ? 526. Monnam(mtmp) : "It"); 527. else 528. if (youseeit) 529. pline("%s lunges forward and recoils!", 530. Monnam(mtmp)); 531. else 532. You("hear a %s nearby.", 533. is_whirly(mtmp->data)? 534. "rushing noise" : 535. "splat"); 536. } 537. break; 538. case AT_BREA: 539. if(range2) sum[i] = breamu(mtmp, mattk); 540. /* Note: breamu takes care of displacement */ 541. break; 542. case AT_SPIT: 543. if(range2) sum[i] = spitmu(mtmp, mattk); 544. /* Note: spitmu takes care of displacement */ 545. break; 546. case AT_WEAP: 547. if(range2) { 548. #ifdef REINCARNATION 549. if (!Is_rogue_level(&u.uz)) 550. #endif 551. thrwmu(mtmp); 552. } else { 553. #ifdef MUSE 554. /* Rare but not impossible. Normally the monster 555. * wields when 2 spaces away, but it can be 556. * teleported or whatever.... 557. */ 558. if (mtmp->weapon_check == NEED_WEAPON || !MON_WEP(mtmp)) { 559. mtmp->weapon_check = NEED_HTH_WEAPON; 560. /* mon_wield_item resets weapon_check as appropriate */ 561. if (mon_wield_item(mtmp) != 0) break; 562. } 563. #endif 564. if (foundyou) { 565. set_uasmon(); 566. #ifdef MUSE 567. otmp = MON_WEP(mtmp); 568. #else 569. otmp = select_hwep(mtmp); 570. #endif 571. if(otmp) { 572. tmp += hitval(otmp, uasmon); 573. mswings(mtmp, otmp); 574. } 575. if(tmp > (j = dieroll = rnd(20+i))) 576. sum[i] = hitmu(mtmp, mattk); 577. else 578. missmu(mtmp, (tmp == j), mattk); 579. } else 580. wildmiss(mtmp); 581. } 582. break; 583. case AT_MAGC: 584. if (range2) 585. sum[i] = buzzmu(mtmp, mattk); 586. else 587. if (foundyou) 588. sum[i] = castmu(mtmp, mattk); 589. else 590. pline("%s casts a spell at thin air!", 591. youseeit ? Monnam(mtmp) : "It"); 592. /* Not totally right since castmu allows other 593. * spells, such as the monster healing itself, 594. * that should work even when not next to you-- 595. * but the previous code was just as wrong. 596. * --KAA 597. */ 598. break; 599. 600. default: /* no attack */ 601. break; 602. } 603. if(flags.botl) bot(); 604. if(sum[i] == 2) return(1); /* attacker dead */ 605. if(sum[i] == 3) break; /* attacker teleported, no more attacks */ 606. /* sum[i] == 1: successful attack */ 607. /* sum[i] == 0: unsuccessful attack */ 608. } 609. return(0); 610. } 611. 612. #endif /* OVL0 */ 613. #ifdef OVLB 614. 615. /* 616. * helper function for some compilers that have trouble with hitmu 617. */ 618. 619. STATIC_OVL void 620. hurtarmor(mdat, attk) 621. struct permonst *mdat; 622. int attk; 623. { 624. boolean getbronze, rusting; 625. int hurt; 626. 627. rusting = (attk == AD_RUST); 628. if (rusting) { 629. hurt = 1; 630. getbronze = (mdat == &mons[PM_BLACK_PUDDING] && 631. uarm && is_corrodeable(uarm)); 632. } 633. else { 634. hurt=2; 635. getbronze = FALSE; 636. } 637. /* What the following code does: it keeps looping until it 638. * finds a target for the rust monster. 639. * Head, feet, etc... not covered by metal, or covered by 640. * rusty metal, are not targets. However, your body always 641. * is, no matter what covers it. 642. */ 643. while (1) { 644. switch(rn2(5)) { 645. case 0: 646. if (!rust_dmg(uarmh, rusting ? "helmet" : "leather helmet", 647. hurt, FALSE)) 648. continue; 649. break; 650. case 1: 651. if (uarmc) break; 652. /* Note the difference between break and continue; 653. * break means it was hit and didn't rust; continue 654. * means it wasn't a target and though it didn't rust 655. * something else did. 656. */ 657. if (getbronze) 658. (void)rust_dmg(uarm, "bronze armor", 3, TRUE); 659. else if (uarm) 660. (void)rust_dmg(uarm, xname(uarm), hurt, TRUE); 661. break; 662. case 2: 663. if (!rust_dmg(uarms, rusting ? "shield" : "wooden shield", 664. hurt, FALSE)) 665. continue; 666. break; 667. case 3: 668. if (!rust_dmg(uarmg, rusting ? "metal gauntlets" : "gloves", 669. hurt, FALSE)) 670. continue; 671. break; 672. case 4: 673. if (!rust_dmg(uarmf, rusting ? "metal boots" : "boots", 674. hurt, FALSE)) 675. continue; 676. break; 677. } 678. break; /* Out of while loop */ 679. } 680. } 681. 682. #endif /* OVLB */ 683. #ifdef OVL1 684. 685. STATIC_OVL boolean 686. diseasemu(mdat) 687. struct permonst *mdat; 688. { 689. if (defends(AD_DISE,uwep) 690. #ifdef POLYSELF 691. || u.usym == S_FUNGUS 692. #endif 693. ) { 694. You("feel a slight illness."); 695. return FALSE; 696. } else { 697. if (!Sick) You("feel very sick."); 698. exercise(A_CON, FALSE); 699. make_sick(Sick + (long)rn1(25-ACURR(A_CON),15),FALSE); 700. u.usick_cause = mdat->mname; 701. return TRUE; 702. } 703. } 704. 705. /* 706. * hitmu: monster hits you 707. * returns 2 if monster dies (e.g. "yellow light"), 1 otherwise 708. * 3 if the monster lives but teleported/paralyzed, so it can't keep 709. * attacking you 710. */ 711. STATIC_OVL int 712. hitmu(mtmp, mattk) 713. register struct monst *mtmp; 714. register struct attack *mattk; 715. { 716. register struct permonst *mdat = mtmp->data; 717. register int ctmp, ptmp; 718. int dmg, armpro; 719. char buf[BUFSZ]; 720. #ifdef POLYSELF 721. struct permonst *olduasmon = uasmon; 722. int res; 723. #endif 724. 725. /* If the monster is undetected & hits you. You should know where 726. * the attack came from. 727. */ 728. if(mtmp->mundetected && hides_under(mdat)) { 729. mtmp->mundetected = 0; 730. if(!(Blind ? Telepat : (HTelepat & (WORN_HELMET|WORN_AMUL)))) { 731. register struct obj *obj; 732. 733. if(OBJ_AT(mtmp->mx, mtmp->my)) { 734. if((obj = level.objects[mtmp->mx][mtmp->my]) != 0) 735. pline("%s was hidden under %s!", 736. Amonnam(mtmp), doname(obj)); 737. } 738. newsym(mtmp->mx, mtmp->my); 739. } 740. } 741. 742. /* First determine the base damage done */ 743. dmg = d((int)mattk->damn, (int)mattk->damd); 744. if(is_undead(mdat) && midnight()) 745. dmg += d((int)mattk->damn, (int)mattk->damd); /* extra damage */ 746. 747. /* Next a cancellation factor */ 748. /* Use ctmp when the cancellation factor takes into account certain 749. * armor's special magic protection. Otherwise just use !mtmp->mcan. 750. */ 751. armpro = 0; 752. if (uarm && armpro < objects[uarm->otyp].a_can) 753. armpro = objects[uarm->otyp].a_can; 754. if (uarmc && armpro < objects[uarmc->otyp].a_can) 755. armpro = objects[uarmc->otyp].a_can; 756. ctmp = !mtmp->mcan && ((rn2(3) >= armpro) || !rn2(50)); 757. 758. /* Now, adjust damages via resistances or specific attacks */ 759. switch(mattk->adtyp) { 760. case AD_PHYS: 761. if(mattk->aatyp == AT_HUGS 762. #ifdef POLYSELF 763. && !sticks(uasmon) 764. #endif 765. ) { 766. if(!u.ustuck && rn2(2)) { 767. u.ustuck = mtmp; 768. pline("%s grabs you!", Monnam(mtmp)); 769. } else if(u.ustuck == mtmp) { 770. exercise(A_STR, FALSE); 771. You("are being %s.", 772. (mtmp->data == &mons[PM_ROPE_GOLEM]) 773. ? "choked" : "crushed"); 774. } 775. } else { /* hand to hand weapon */ 776. if(mattk->aatyp == AT_WEAP && otmp) { 777. dmg += dmgval(otmp, uasmon); 778. if (dmg <= 0) dmg = 1; 779. if (!(otmp->oartifact && 780. artifact_hit(mtmp, &youmonst, otmp, &dmg,dieroll))) 781. hitmsg(mtmp, mattk); 782. #ifdef POLYSELF 783. if (u.mh > 1 && u.mh > ((u.uac>0) ? dmg : dmg+u.uac) && 784. (u.umonnum==PM_BLACK_PUDDING 785. || u.umonnum==PM_BROWN_PUDDING)) { 786. /* This redundancy necessary because you have to 787. * take the damage _before_ being cloned. 788. */ 789. if (u.uac < 0) dmg += u.uac; 790. if (dmg < 1) dmg = 1; 791. if (dmg > 1) exercise(A_STR, FALSE); 792. u.mh -= dmg; 793. flags.botl = 1; 794. dmg = 0; 795. if(cloneu()) 796. You("divide as %s hits you!",mon_nam(mtmp)); 797. } 798. urustm(mtmp, otmp); 799. #endif 800. } else 801. hitmsg(mtmp, mattk); 802. } 803. break; 804. case AD_DISE: 805. hitmsg(mtmp, mattk); 806. if (!diseasemu(mdat)) dmg = 0; 807. break; 808. case AD_FIRE: 809. hitmsg(mtmp, mattk); 810. if(ctmp) { 811. pline("You're on fire!"); 812. if (Fire_resistance) { 813. pline("The fire doesn't feel hot!"); 814. dmg = 0; 815. } 816. if((int) mtmp->m_lev > rn2(20)) 817. destroy_item(SCROLL_CLASS, AD_FIRE); 818. if((int) mtmp->m_lev > rn2(20)) 819. destroy_item(POTION_CLASS, AD_FIRE); 820. if((int) mtmp->m_lev > rn2(25)) 821. destroy_item(SPBOOK_CLASS, AD_FIRE); 822. } else dmg = 0; 823. break; 824. case AD_COLD: 825. hitmsg(mtmp, mattk); 826. if(ctmp) { 827. pline("You're covered in frost!"); 828. if (Cold_resistance) { 829. pline("The frost doesn't seem cold!"); 830. dmg = 0; 831. } 832. if((int) mtmp->m_lev > rn2(20)) 833. destroy_item(POTION_CLASS, AD_COLD); 834. } else dmg = 0; 835. break; 836. case AD_ELEC: 837. hitmsg(mtmp, mattk); 838. if(ctmp) { 839. You("get zapped!"); 840. if (Shock_resistance) { 841. pline("The zap doesn't shock you!"); 842. dmg = 0; 843. } 844. if((int) mtmp->m_lev > rn2(20)) 845. destroy_item(WAND_CLASS, AD_ELEC); 846. if((int) mtmp->m_lev > rn2(20)) 847. destroy_item(RING_CLASS, AD_ELEC); 848. } else dmg = 0; 849. break; 850. case AD_SLEE: 851. hitmsg(mtmp, mattk); 852. if(ctmp && multi >= 0 && !rn2(5)) { 853. if (Sleep_resistance) break; 854. nomul(-rnd(10)); 855. u.usleep = 1; 856. nomovemsg = "You wake up."; 857. if (Blind) You("are put to sleep!"); 858. else You("are put to sleep by %s!",mon_nam(mtmp)); 859. } 860. break; 861. case AD_DRST: 862. ptmp = A_STR; 863. goto dopois; 864. case AD_DRDX: 865. ptmp = A_DEX; 866. goto dopois; 867. case AD_DRCO: 868. ptmp = A_CON; 869. dopois: 870. hitmsg(mtmp, mattk); 871. if(ctmp && !rn2(8)) { 872. Sprintf(buf, "%s %s", 873. !(canseemon(mtmp) || sensemon(mtmp)) ? "Its" : 874. Hallucination ? s_suffix(rndmonnam()) : 875. s_suffix(mdat->mname), 876. (mattk->aatyp == AT_BITE) ? "bite" : "sting"); 877. poisoned(buf, ptmp, mdat->mname, 30); 878. } 879. break; 880. case AD_DRIN: 881. hitmsg(mtmp, mattk); 882. if (defends(AD_DRIN, uwep) 883. #ifdef POLYSELF 884. || !has_head(uasmon) 885. #endif 886. ) { 887. You("don't seem harmed."); 888. break; 889. } 890. if (uarmh && rn2(8)) { 891. Your("helmet blocks the attack to your head."); 892. break; 893. } 894. if (Half_physical_damage) dmg = (dmg+1) / 2; 895. losehp(dmg, mon_nam(mtmp), KILLED_BY_AN); 896. Your("brain is eaten!"); 897. /* No such thing as mindless players... */ 898. if (ABASE(A_INT) <= ATTRMIN(A_INT)) { 899. int lifesaved = 0; 900. while(1) { 901. if (lifesaved) 902. pline("Unfortunately your brain is still gone."); 903. else 904. Your("last thought fades away."); 905. killer = "brainlessness"; 906. killer_format = KILLED_BY; 907. done(DIED); 908. lifesaved = 1; 909. #ifdef WIZARD 910. if (wizard) break; 911. #endif 912. } 913. } 914. (void) adjattrib(A_INT, -rnd(2), FALSE); 915. exercise(A_WIS, FALSE); 916. break; 917. case AD_PLYS: 918. hitmsg(mtmp, mattk); 919. if(ctmp && multi >= 0 && !rn2(3)) { 920. if (Blind) You("are frozen!"); 921. else You("are frozen by %s!", mon_nam(mtmp)); 922. nomul(-rnd(10)); 923. exercise(A_DEX, FALSE); 924. } 925. break; 926. case AD_DRLI: 927. hitmsg(mtmp, mattk); 928. if (ctmp && !rn2(3) 929. #ifdef POLYSELF 930. && !resists_drli(uasmon) 931. #endif 932. && !defends(AD_DRLI, uwep) 933. ) losexp(); 934. break; 935. case AD_LEGS: 936. { register long side = rn2(2) ? RIGHT_SIDE : LEFT_SIDE; 937. if (mtmp->mcan) { 938. pline("%s nuzzles against your %s %s!", Monnam(mtmp), 939. (side == RIGHT_SIDE) ? "right" : "left", 940. body_part(LEG)); 941. } else { 942. if (uarmf) { 943. pline("%s scratches your %s boot!", Monnam(mtmp), 944. (side == RIGHT_SIDE) ? "right" : "left"); 945. break; 946. } 947. pline("%s pricks your %s %s!", Monnam(mtmp), 948. (side == RIGHT_SIDE) ? "right" : "left", 949. body_part(LEG)); 950. set_wounded_legs(side, rnd(60-ACURR(A_DEX))); 951. exercise(A_STR, FALSE); 952. exercise(A_DEX, FALSE); 953. } 954. break; 955. } 956. case AD_STON: /* at present only a cockatrice */ 957. hitmsg(mtmp, mattk); 958. if(!rn2(3) && !Stoned) { 959. if (mtmp->mcan) { 960. if (flags.soundok) 961. You("hear a cough from %s!", mon_nam(mtmp)); 962. } else { 963. if (flags.soundok) 964. You("hear %s hissing!", s_suffix(mon_nam(mtmp))); 965. if((!rn2(10) || 966. (flags.moonphase == NEW_MOON && !have_lizard())) 967. #ifdef POLYSELF 968. && !resists_ston(uasmon) 969. && !(poly_when_stoned(uasmon) && 970. polymon(PM_STONE_GOLEM)) 971. #endif 972. ) { 973. Stoned = 5; 974. return(1); 975. /* You("turn to stone..."); */ 976. /* done_in_by(mtmp); */ 977. } 978. } 979. } 980. break; 981. case AD_STCK: 982. hitmsg(mtmp, mattk); 983. if(ctmp && !u.ustuck 984. #ifdef POLYSELF 985. && !sticks(uasmon) 986. #endif 987. ) u.ustuck = mtmp; 988. break; 989. case AD_WRAP: 990. if(ctmp 991. #ifdef POLYSELF 992. && !sticks(uasmon) 993. #endif 994. ) { 995. if(!u.ustuck && !rn2(10)) { 996. pline("%s swings itself around you!", Monnam(mtmp)); 997. u.ustuck = mtmp; 998. } else if(u.ustuck == mtmp) { 999. if (is_pool(mtmp->mx,mtmp->my) 1000. #ifdef POLYSELF 1001. && !is_swimmer(uasmon) 1002. #endif 1003. && !Magical_breathing 1004. ) { 1005. pline("%s drowns you....", Monnam(mtmp)); 1006. done(DROWNING); 1007. } else if(mattk->aatyp == AT_HUGS) 1008. You("are being crushed."); 1009. } else { 1010. dmg = 0; 1011. if(flags.verbose) 1012. pline("%s brushes against your %s.", Monnam(mtmp), 1013. body_part(LEG)); 1014. } 1015. } else dmg = 0; 1016. break; 1017. case AD_WERE: 1018. hitmsg(mtmp, mattk); 1019. #ifdef POLYSELF 1020. if (ctmp && !rn2(4) && u.ulycn == -1 1021. && !Protection_from_shape_changers 1022. && !defends(AD_WERE,uwep)) { 1023. You("feel feverish."); 1024. exercise(A_CON, FALSE); 1025. u.ulycn = monsndx(mdat); 1026. } 1027. #endif 1028. break; 1029. case AD_SGLD: 1030. hitmsg(mtmp, mattk); 1031. #ifdef POLYSELF 1032. if (u.usym == mdat->mlet) break; 1033. #endif 1034. if(!mtmp->mcan) stealgold(mtmp); 1035. break; 1036. 1037. case AD_SITM: /* for now these are the same */ 1038. case AD_SEDU: 1039. #ifdef POLYSELF 1040. if (dmgtype(uasmon, AD_SEDU) 1041. # ifdef SEDUCE 1042. || dmgtype(uasmon, AD_SSEX) 1043. # endif 1044. ) { 1045. if (mtmp->minvent) 1046. pline("%s brags about the goods some dungeon explorer provided.", 1047. Monnam(mtmp)); 1048. else 1049. pline("%s makes some remarks about how difficult theft is lately.", 1050. Monnam(mtmp)); 1051. rloc(mtmp); 1052. return 3; 1053. } else 1054. #endif 1055. if(mtmp->mcan) { 1056. if (!Blind) { 1057. pline("%s tries to %s you, but you seem %s.", 1058. Adjmonnam(mtmp, "plain"), 1059. flags.female ? "charm" : "seduce", 1060. flags.female ? "unaffected" : "uninterested"); 1061. } 1062. if(rn2(3)) { 1063. rloc(mtmp); 1064. return 3; 1065. } 1066. } else { 1067. switch (steal(mtmp)) { 1068. case -1: 1069. return 2; 1070. case 0: 1071. break; 1072. default: 1073. rloc(mtmp); 1074. mtmp->mflee = 1; 1075. return 3; 1076. } 1077. } 1078. break; 1079. #ifdef SEDUCE 1080. case AD_SSEX: 1081. if(could_seduce(mtmp, &youmonst, mattk) == 1 1082. && !mtmp->mcan) 1083. if (doseduce(mtmp)) 1084. return 3; 1085. break; 1086. #endif 1087. case AD_SAMU: 1088. hitmsg(mtmp, mattk); 1089. /* when the Wiz hits, 1/20 steals the amulet */ 1090. if (!u.uhave.amulet) break; 1091. if (!rn2(20)) stealamulet(mtmp); 1092. break; 1093. 1094. case AD_TLPT: 1095. hitmsg(mtmp, mattk); 1096. if(ctmp) { 1097. if(flags.verbose) 1098. Your("position suddenly seems very uncertain!"); 1099. tele(); 1100. } 1101. break; 1102. case AD_RUST: 1103. hitmsg(mtmp, mattk); 1104. if (mtmp->mcan) break; 1105. #if defined(POLYSELF) 1106. if (u.umonnum == PM_IRON_GOLEM) { 1107. You("rust!"); 1108. rehumanize(); 1109. break; 1110. } 1111. #endif 1112. hurtarmor(mdat, AD_RUST); 1113. break; 1114. case AD_DCAY: 1115. hitmsg(mtmp, mattk); 1116. if (mtmp->mcan) break; 1117. #if defined(POLYSELF) 1118. if (u.umonnum == PM_WOOD_GOLEM || 1119. u.umonnum == PM_LEATHER_GOLEM) { 1120. You("rot!"); 1121. rehumanize(); 1122. break; 1123. } 1124. #endif 1125. hurtarmor(mdat, AD_DCAY); 1126. break; 1127. case AD_HEAL: 1128. if(!uwep 1129. #ifdef TOURIST 1130. && !uarmu 1131. #endif 1132. && !uarm && !uarmh && !uarms && !uarmg && !uarmc && !uarmf) { 1133. pline("%s hits! (I hope you don't mind.)", Monnam(mtmp)); 1134. #ifdef POLYSELF 1135. if (u.mtimedone) { 1136. u.mh += rnd(7); 1137. if(!rn2(7)) u.mhmax++; 1138. if(u.mh > u.mhmax) u.mh = u.mhmax; 1139. if(u.mh == u.mhmax && !rn2(50)) mongone(mtmp); 1140. } else { 1141. #endif 1142. u.uhp += rnd(7); 1143. if(!rn2(7)) u.uhpmax++; 1144. if(u.uhp > u.uhpmax) u.uhp = u.uhpmax; 1145. if(u.uhp == u.uhpmax && !rn2(50)) mongone(mtmp); 1146. #ifdef POLYSELF 1147. } 1148. #endif 1149. exercise(A_STR, TRUE); 1150. exercise(A_CON, TRUE); 1151. flags.botl = 1; 1152. if(!rn2(50)) rloc(mtmp); 1153. dmg = 0; 1154. } else 1155. if(pl_character[0] == 'H') { 1156. if (flags.soundok && !(moves % 5)) 1157. verbalize("Doc, I can't help you unless you cooperate."); 1158. dmg = 0; 1159. } else hitmsg(mtmp, mattk); 1160. break; 1161. case AD_CURS: 1162. hitmsg(mtmp, mattk); 1163. if(!night() && mdat == &mons[PM_GREMLIN]) break; 1164. if(!mtmp->mcan && !rn2(10)) { 1165. if (flags.soundok) 1166. if (Blind) You("hear laughter."); 1167. else pline("%s chuckles.", Monnam(mtmp)); 1168. #ifdef POLYSELF 1169. if (u.umonnum == PM_CLAY_GOLEM) { 1170. pline("Some writing vanishes from your head!"); 1171. rehumanize(); 1172. break; 1173. } 1174. #endif 1175. attrcurse(); 1176. } 1177. break; 1178. case AD_STUN: 1179. hitmsg(mtmp, mattk); 1180. if(!mtmp->mcan && !rn2(4)) { 1181. make_stunned(HStun + dmg, TRUE); 1182. dmg /= 2; 1183. } 1184. break; 1185. case AD_ACID: 1186. hitmsg(mtmp, mattk); 1187. if(!mtmp->mcan && !rn2(3)) 1188. #ifdef POLYSELF 1189. if (resists_acid(uasmon)) { 1190. pline("You're covered in acid, but it seems harmless."); 1191. dmg = 0; 1192. } else 1193. #endif 1194. { 1195. pline("You're covered in acid! It burns!"); 1196. exercise(A_STR, FALSE); 1197. } 1198. else dmg = 0; 1199. break; 1200. case AD_SLOW: 1201. hitmsg(mtmp, mattk); 1202. if(!ctmp && (Fast & (INTRINSIC|TIMEOUT)) && 1203. !defends(AD_SLOW, uwep) && !rn2(4)) { 1204. Fast &= ~(INTRINSIC|TIMEOUT); 1205. You("feel yourself slowing down."); 1206. exercise(A_DEX, FALSE); 1207. } 1208. break; 1209. case AD_DREN: 1210. hitmsg(mtmp, mattk); 1211. if(!ctmp && !rn2(4)) drain_en(dmg); 1212. dmg = 0; 1213. break; 1214. case AD_CONF: 1215. hitmsg(mtmp, mattk); 1216. if(!mtmp->mcan && !rn2(4) && !mtmp->mspec_used) { 1217. mtmp->mspec_used = mtmp->mspec_used + (dmg + rn2(6)); 1218. if(Confusion) 1219. You("are getting even more confused."); 1220. else You("are getting confused."); 1221. make_confused(HConfusion + dmg, FALSE); 1222. } 1223. /* fall through to next case */ 1224. case AD_DETH: 1225. pline("%s reaches out with its deadly touch.", Monnam(mtmp)); 1226. #ifdef POLYSELF 1227. if (is_undead(uasmon)) { 1228. /* Still does normal damage */ 1229. pline("Was that the touch of death?"); 1230. break; 1231. } 1232. #endif 1233. if(!Antimagic && rn2(20) > 16) { 1234. killer_format = KILLED_BY_AN; 1235. killer = "touch of death"; 1236. done(DIED); 1237. } else { 1238. if(!rn2(5)) { 1239. if(Antimagic) shieldeff(u.ux, u.uy); 1240. pline("Lucky for you, it didn't work!"); 1241. dmg = 0; 1242. } else You("feel your life force draining away..."); 1243. } 1244. break; 1245. case AD_PEST: 1246. pline("%s reaches out, and you feel fever and chills.", 1247. Monnam(mtmp)); 1248. (void) diseasemu(mdat); /* plus the normal damage */ 1249. break; 1250. case AD_FAMN: 1251. pline("%s reaches out, and your body shrivels.", 1252. Monnam(mtmp)); 1253. exercise(A_CON, FALSE); 1254. morehungry(rn1(40,40)); 1255. /* plus the normal damage */ 1256. break; 1257. default: dmg = 0; 1258. break; 1259. } 1260. if(u.uhp < 1) done_in_by(mtmp); 1261. 1262. /* Negative armor class reduces damage done instead of fully protecting 1263. * against hits. 1264. */ 1265. if (dmg && u.uac < 0) { 1266. dmg -= rnd(-u.uac); 1267. if (dmg < 1) dmg = 1; 1268. } 1269. 1270. if(dmg) { 1271. if(Half_physical_damage) 1272. dmg = (dmg+1) / 2; 1273. #ifdef MULDGN 1274. else if(pl_character[0] == 'P' && uwep && is_quest_artifact(uwep) 1275. && is_undead(mtmp->data)) 1276. dmg = (dmg+1) / 2; 1277. #endif 1278. mdamageu(mtmp, dmg); 1279. } 1280. 1281. #ifdef POLYSELF 1282. res = passiveum(olduasmon, mtmp, mattk); 1283. stop_occupation(); 1284. return res; 1285. #else 1286. stop_occupation(); 1287. return 1; 1288. #endif 1289. } 1290. 1291. #endif /* OVL1 */ 1292. #ifdef OVLB 1293. 1294. STATIC_OVL int 1295. gulpmu(mtmp, mattk) /* monster swallows you, or damage if u.uswallow */ 1296. register struct monst *mtmp; 1297. register struct attack *mattk; 1298. { 1299. struct trap *t = t_at(u.ux, u.uy); 1300. int tmp = d((int)mattk->damn, (int)mattk->damd); 1301. int tim_tmp; 1302. register struct obj *otmp2; 1303. #ifdef WALKIES 1304. int i; 1305. #endif 1306. 1307. if(!u.uswallow) { /* swallows you */ 1308. #ifdef POLYSELF 1309. if (uasmon->msize >= MZ_HUGE) return(0); 1310. #endif 1311. if ((t && ((t->ttyp == PIT) || (t->ttyp == SPIKED_PIT))) && 1312. sobj_at(BOULDER, u.ux, u.uy)) 1313. return(0); 1314. if (Punished) unplacebc(); /* ball&chain go away */ 1315. remove_monster(mtmp->mx, mtmp->my); 1316. place_monster(mtmp, u.ux, u.uy); 1317. u.ustuck = mtmp; 1318. newsym(mtmp->mx,mtmp->my); 1319. pline("%s engulfs you!", Monnam(mtmp)); 1320. stop_occupation(); 1321. if (u.utrap) { 1322. You("are released from the %s!", 1323. u.utraptype==TT_WEB ? "web" : "trap"); 1324. u.utrap = 0; 1325. } 1326. #ifdef WALKIES 1327. if((i = number_leashed()) > 0) { 1328. pline("The leash%s snap%s loose...", 1329. (i > 1) ? "es" : "", 1330. (i > 1) ? "" : "s"); 1331. unleash_all(); 1332. } 1333. #endif 1334. #ifdef POLYSELF 1335. if (u.umonnum==PM_COCKATRICE && !resists_ston(mtmp->data)) { 1336. pline("%s turns to stone!", Monnam(mtmp)); 1337. stoned = 1; 1338. xkilled(mtmp, 0); 1339. return 2; 1340. } 1341. #endif 1342. display_nhwindow(WIN_MESSAGE, FALSE); 1343. vision_recalc(2); /* hero can't see anything */ 1344. u.uswallow = 1; 1345. /*assume that u.uswldtim always set >=0*/ 1346. u.uswldtim = (tim_tmp = 1347. (-u.uac + 10 + rnd(25 - (int)mtmp->m_lev)) >> 1) > 0 ? 1348. tim_tmp : 0; 1349. swallowed(1); 1350. for(otmp2 = invent; otmp2; otmp2 = otmp2->nobj) { 1351. (void) snuff_lit(otmp2); 1352. } 1353. } else { 1354. 1355. if(mtmp != u.ustuck) return(0); 1356. switch(mattk->adtyp) { 1357. 1358. case AD_DGST: 1359. if(!u.uswldtim) { /* a3 *//*no cf unsigned <=0*/ 1360. pline("%s totally digests you!", Monnam(mtmp)); 1361. tmp = u.uhp; 1362. } else { 1363. pline("%s digests you!", Monnam(mtmp)); 1364. exercise(A_STR, FALSE); 1365. } 1366. break; 1367. case AD_PHYS: 1368. You("are pummeled with debris!"); 1369. exercise(A_STR, FALSE); 1370. break; 1371. case AD_ACID: 1372. #ifdef POLYSELF 1373. if (resists_acid(uasmon)) { 1374. You("are covered with a seemingly harmless goo."); 1375. tmp = 0; 1376. } else 1377. #endif 1378. { 1379. if (Hallucination) pline("Ouch! You've been slimed!"); 1380. else You("are covered in slime! It burns!"); 1381. exercise(A_STR, FALSE); 1382. } 1383. break; 1384. case AD_BLND: 1385. if (!defends(AD_BLND, uwep)) { 1386. if(!Blind) { 1387. You("can't see in here!"); 1388. make_blinded((long)tmp,FALSE); 1389. } else 1390. /* keep him blind until disgorged */ 1391. make_blinded(Blinded+1,FALSE); 1392. } 1393. tmp = 0; 1394. break; 1395. case AD_ELEC: 1396. if(!mtmp->mcan && rn2(2)) { 1397. pline("The air around you crackles with electricity."); 1398. if (Shock_resistance) { 1399. shieldeff(u.ux, u.uy); 1400. You("seem unhurt."); 1401. #if defined(POLYSELF) 1402. ugolemeffects(AD_ELEC,tmp); 1403. #endif 1404. tmp = 0; 1405. } 1406. } else tmp = 0; 1407. break; 1408. case AD_COLD: 1409. if(!mtmp->mcan && rn2(2)) { 1410. if (Cold_resistance) { 1411. shieldeff(u.ux, u.uy); 1412. You("feel mildly chilly."); 1413. #if defined(POLYSELF) 1414. ugolemeffects(AD_COLD,tmp); 1415. #endif 1416. tmp = 0; 1417. } else You("are freezing to death!"); 1418. } else tmp = 0; 1419. break; 1420. case AD_FIRE: 1421. if(!mtmp->mcan && rn2(2)) { 1422. if (Fire_resistance) { 1423. shieldeff(u.ux, u.uy); 1424. You("feel mildly hot."); 1425. #if defined(POLYSELF) 1426. ugolemeffects(AD_FIRE,tmp); 1427. #endif 1428. tmp = 0; 1429. } else You("are burning to a crisp!"); 1430. } else tmp = 0; 1431. break; 1432. case AD_DISE: 1433. if (!diseasemu(mtmp->data)) tmp = 0; 1434. break; 1435. default: tmp = 0; 1436. break; 1437. } 1438. } 1439. 1440. if(Half_physical_damage) tmp = (tmp+1) / 2; 1441. 1442. mdamageu(mtmp, tmp); 1443. if(tmp) stop_occupation(); 1444. if(u.uswldtim) --u.uswldtim; 1445. if(!u.uswldtim 1446. #ifdef POLYSELF 1447. || u.umonnum==PM_COCKATRICE 1448. || uasmon->msize >= MZ_HUGE 1449. #endif 1450. ) { 1451. #ifdef POLYSELF 1452. if (u.umonnum == PM_COCKATRICE) { 1453. pline("%s very hurriedly %s you!", Monnam(mtmp), 1454. is_animal(mtmp->data)? "regurgitates" : "expels"); 1455. u.uswldtim = 0; 1456. } else { 1457. #endif 1458. You("get %s!", 1459. is_animal(mtmp->data)? "regurgitated" : "expelled"); 1460. if(flags.verbose && is_animal(mtmp->data)) 1461. pline("Obviously %s doesn't like your taste.", 1462. mon_nam(mtmp)); 1463. #ifdef POLYSELF 1464. } 1465. #endif 1466. expels(mtmp, mtmp->data, FALSE); 1467. } 1468. return(1); 1469. } 1470. 1471. STATIC_OVL int 1472. explmu(mtmp, mattk, ufound) /* monster explodes in your face */ 1473. register struct monst *mtmp; 1474. register struct attack *mattk; 1475. boolean ufound; 1476. { 1477. if (mtmp->mcan) return(0); 1478. 1479. if (!ufound) 1480. pline("%s explodes at a spot in thin air!", 1481. canseemon(mtmp) ? Monnam(mtmp) : "It"); 1482. else { 1483. register int tmp = d((int)mattk->damn, (int)mattk->damd); 1484. register boolean not_affected = defends((int)mattk->adtyp, uwep); 1485. 1486. hitmsg(mtmp, mattk); 1487. 1488. switch (mattk->adtyp) { 1489. case AD_COLD: 1490. not_affected |= Cold_resistance; 1491. 1492. if (!not_affected) { 1493. if (flags.verbose) You("get blasted!"); 1494. if (ACURR(A_DEX) > rnd(20)) { 1495. You("duck the blast..."); 1496. tmp = (tmp+1) / 2; 1497. } 1498. if (Half_physical_damage) tmp = (tmp+1) / 2; 1499. mdamageu(mtmp, tmp); 1500. } 1501. break; 1502. 1503. case AD_BLND: 1504. not_affected |= 1505. #ifdef POLYSELF 1506. (u.umonnum == PM_YELLOW_LIGHT) || 1507. #endif 1508. Blind; 1509. if (!not_affected) { 1510. if (mon_visible(mtmp)) { 1511. You("are blinded by a blast of light!"); 1512. make_blinded((long)tmp, FALSE); 1513. } else 1514. You("get the impression it was not terribly bright."); 1515. } 1516. break; 1517. 1518. default: 1519. break; 1520. } 1521. if (not_affected) { 1522. You("seem unaffected by it."); 1523. #if defined(POLYSELF) 1524. ugolemeffects((int)mattk->adtyp, tmp); 1525. #endif 1526. } 1527. } 1528. mondead(mtmp); 1529. return(2); /* it dies */ 1530. } 1531. 1532. STATIC_OVL int 1533. gazemu(mtmp, mattk) /* monster gazes at you */ 1534. register struct monst *mtmp; 1535. register struct attack *mattk; 1536. { 1537. switch(mattk->adtyp) { 1538. case AD_STON: 1539. if (mtmp->mcan) { 1540. You("notice that %s isn't all that ugly.",mon_nam(mtmp)); 1541. break; 1542. } 1543. if (canseemon(mtmp)) { 1544. You("look upon %s.", mon_nam(mtmp)); 1545. # ifdef POLYSELF 1546. if (resists_ston(uasmon)) { 1547. pline("So what?"); 1548. break; 1549. } 1550. if(poly_when_stoned(uasmon) && polymon(PM_STONE_GOLEM)) 1551. break; 1552. # endif 1553. You("turn to stone..."); 1554. killer_format = KILLED_BY_AN; 1555. killer = mons[PM_MEDUSA].mname; 1556. done(STONING); 1557. } 1558. break; 1559. case AD_CONF: 1560. if(!mtmp->mcan && canseemon(mtmp) && mtmp->mcansee && 1561. !mtmp->mspec_used && rn2(5)) { 1562. int conf = d(3,4); 1563. 1564. mtmp->mspec_used = mtmp->mspec_used + (conf + rn2(6)); 1565. if(!Confusion) 1566. pline("%s gaze confuses you!", 1567. s_suffix(Monnam(mtmp))); 1568. else 1569. You("are getting more and more confused."); 1570. make_confused(HConfusion + conf, FALSE); 1571. } 1572. break; 1573. case AD_STUN: 1574. if(!mtmp->mcan && canseemon(mtmp) && mtmp->mcansee && 1575. !mtmp->mspec_used && rn2(5)) { 1576. int stun = d(2,6); 1577. 1578. pline("%s stares piercingly at you!", Monnam(mtmp)); 1579. mtmp->mspec_used = mtmp->mspec_used + (stun + rn2(6)); 1580. make_stunned(HStun + stun, TRUE); 1581. } 1582. break; 1583. case AD_BLND: 1584. if(!mtmp->mcan && canseemon(mtmp) && !defends(AD_BLND, uwep) && 1585. distu(mtmp->mx,mtmp->my) <= BOLT_LIM*BOLT_LIM) { 1586. int blnd = d((int)mattk->damn, (int)mattk->damd); 1587. You("are blinded by %s radiance!", 1588. s_suffix(mon_nam(mtmp))); 1589. make_blinded((long)blnd,FALSE); 1590. make_stunned((long)d(1,3),TRUE); 1591. } 1592. break; 1593. default: impossible("Gaze attack %d?", mattk->adtyp); 1594. break; 1595. } 1596. return(1); 1597. } 1598. 1599. #endif /* OVLB */ 1600. #ifdef OVL1 1601. 1602. void 1603. mdamageu(mtmp, n) /* mtmp hits you for n points damage */ 1604. register struct monst *mtmp; 1605. register int n; 1606. { 1607. #ifdef POLYSELF 1608. if (u.mtimedone) { 1609. u.mh -= n; 1610. flags.botl = 1; 1611. if (u.mh < 1) rehumanize(); 1612. return; 1613. } 1614. #endif 1615. u.uhp -= n; 1616. flags.botl = 1; 1617. if(u.uhp < 1) 1618. done_in_by(mtmp); 1619. } 1620. 1621. #endif /* OVL1 */ 1622. #ifdef OVLB 1623. 1624. #ifdef POLYSELF 1625. STATIC_OVL void 1626. urustm(mon, obj) 1627. register struct monst *mon; 1628. register struct obj *obj; 1629. { 1630. boolean vis = cansee(mon->mx, mon->my); 1631. 1632. if (!mon || !obj) return; /* just in case */ 1633. if (u.umonnum == PM_RUST_MONSTER && 1634. is_rustprone(obj) && obj->oeroded < MAX_ERODE) { 1635. if (obj->greased || obj->oerodeproof || (obj->blessed && rn2(3))) { 1636. if (vis) 1637. pline("Somehow, %s weapon is not affected.", 1638. s_suffix(mon_nam(mon))); 1639. if (obj->greased && !rn2(2)) obj->greased = 0; 1640. } else { 1641. if (vis) 1642. pline("%s %s%s!", 1643. s_suffix(Monnam(mon)), aobjnam(obj, "rust"), 1644. obj->oeroded ? " further" : ""); 1645. obj->oeroded++; 1646. } 1647. } 1648. } 1649. #endif 1650. 1651. #endif /* OVLB */ 1652. #ifdef OVL1 1653. 1654. int 1655. could_seduce(magr,mdef,mattk) 1656. struct monst *magr, *mdef; 1657. struct attack *mattk; 1658. /* returns 0 if seduction impossible, 1659. * 1 if fine, 1660. * 2 if wrong gender for nymph */ 1661. { 1662. register struct permonst *pagr; 1663. boolean agrinvis, defperc; 1664. xchar genagr, gendef; 1665. 1666. if(magr == &youmonst) { 1667. pagr = uasmon; 1668. agrinvis = (Invis != 0); 1669. genagr = poly_gender(); 1670. } else { 1671. pagr = magr->data; 1672. agrinvis = magr->minvis; 1673. genagr = gender(magr); 1674. } 1675. if(mdef == &youmonst) { 1676. defperc = (See_invisible != 0); 1677. gendef = poly_gender(); 1678. } else { 1679. defperc = perceives(mdef->data); 1680. gendef = gender(mdef); 1681. } 1682. 1683. if(agrinvis && !defperc 1684. #ifdef SEDUCE 1685. && mattk && mattk->adtyp != AD_SSEX 1686. #endif 1687. ) 1688. return 0; 1689. 1690. if(pagr->mlet != S_NYMPH 1691. && ((pagr != &mons[PM_INCUBUS] && pagr != &mons[PM_SUCCUBUS]) 1692. #ifdef SEDUCE 1693. || (mattk && mattk->adtyp != AD_SSEX) 1694. #endif 1695. )) 1696. return 0; 1697. 1698. if(genagr == 1 - gendef) 1699. return 1; 1700. else 1701. return (pagr->mlet == S_NYMPH) ? 2 : 0; 1702. } 1703. 1704. #endif /* OVL1 */ 1705. #ifdef OVLB 1706. 1707. #ifdef SEDUCE 1708. /* Returns 1 if monster teleported */ 1709. int 1710. doseduce(mon) 1711. register struct monst *mon; 1712. { 1713. register struct obj *ring; 1714. boolean fem = (mon->data == &mons[PM_SUCCUBUS]); /* otherwise incubus */ 1715. char qbuf[QBUFSZ]; 1716. 1717. if (mon->mcan || mon->mspec_used) { 1718. pline("%s acts as though %s has got a %sheadache.", 1719. Monnam(mon), Blind ? "it" : fem ? "she" : "he", 1720. mon->mcan ? "severe " : ""); 1721. return 0; 1722. } 1723. 1724. if (unconscious()) { 1725. pline("%s seems dismayed at your lack of response.", 1726. Monnam(mon)); 1727. return 0; 1728. } 1729. 1730. if (Blind) pline("It caresses you..."); 1731. else You("feel very attracted to %s.", mon_nam(mon)); 1732. 1733. for(ring = invent; ring; ring = ring->nobj) { 1734. if (ring->otyp != RIN_ADORNMENT) continue; 1735. if (fem) { 1736. if (rn2(20) < ACURR(A_CHA)) { 1737. Sprintf(qbuf, "\"That %s looks pretty. May I have it?\"", 1738. xname(ring)); 1739. makeknown(RIN_ADORNMENT); 1740. if (yn(qbuf) == 'n') continue; 1741. } else pline("%s decides she'd like your %s, and takes it.", 1742. Blind ? "She" : Monnam(mon), xname(ring)); 1743. makeknown(RIN_ADORNMENT); 1744. if (ring==uleft || ring==uright) Ring_gone(ring); 1745. if (ring==uwep) setuwep((struct obj *)0); 1746. freeinv(ring); 1747. mpickobj(mon,ring); 1748. } else { 1749. char buf[BUFSZ]; 1750. 1751. if (uleft && uright && uleft->otyp == RIN_ADORNMENT 1752. && uright->otyp==RIN_ADORNMENT) 1753. break; 1754. if (ring==uleft || ring==uright) continue; 1755. if (rn2(20) < ACURR(A_CHA)) { 1756. Sprintf(qbuf,"\"That %s looks pretty. Would you wear it for me?\"", 1757. xname(ring)); 1758. makeknown(RIN_ADORNMENT); 1759. if (yn(qbuf) == 'n') continue; 1760. } else { 1761. pline("%s decides you'd look prettier wearing your %s,", 1762. Blind ? "He" : Monnam(mon), xname(ring)); 1763. pline("and puts it on your finger."); 1764. } 1765. makeknown(RIN_ADORNMENT); 1766. if (!uright) { 1767. pline("%s puts %s on your right hand.", 1768. Blind ? "He" : Monnam(mon), the(xname(ring))); 1769. setworn(ring, RIGHT_RING); 1770. } else if (!uleft) { 1771. pline("%s puts %s on your left hand.", 1772. Blind ? "He" : Monnam(mon), the(xname(ring))); 1773. setworn(ring, LEFT_RING); 1774. } else if (uright && uright->otyp != RIN_ADORNMENT) { 1775. Strcpy(buf, xname(uright)); 1776. pline("%s replaces your %s with your %s.", 1777. Blind ? "He" : Monnam(mon), buf, xname(ring)); 1778. Ring_gone(uright); 1779. setworn(ring, RIGHT_RING); 1780. } else if (uleft && uleft->otyp != RIN_ADORNMENT) { 1781. Strcpy(buf, xname(uleft)); 1782. pline("%s replaces your %s with your %s.", 1783. Blind ? "He" : Monnam(mon), buf, xname(ring)); 1784. Ring_gone(uleft); 1785. setworn(ring, LEFT_RING); 1786. } else impossible("ring replacement"); 1787. Ring_on(ring); 1788. prinv(NULL, ring, 0L); 1789. } 1790. } 1791. 1792. if (!uarmc && !uarmf && !uarmg && !uarms && !uarmh 1793. #ifdef TOURIST 1794. && !uarmu 1795. #endif 1796. ) 1797. pline("%s murmurs sweet nothings into your ear.", 1798. Blind ? (fem ? "She" : "He") : Monnam(mon)); 1799. else 1800. pline("%s murmurs in your ear, while helping you undress.", 1801. Blind ? (fem ? "She" : "He") : Monnam(mon)); 1802. mayberem(uarmc, "cloak"); 1803. if(!uarmc) 1804. mayberem(uarm, "suit"); 1805. mayberem(uarmf, "boots"); 1806. if(!uwep || !welded(uwep)) 1807. mayberem(uarmg, "gloves"); 1808. mayberem(uarms, "shield"); 1809. mayberem(uarmh, "helmet"); 1810. #ifdef TOURIST 1811. if(!uarmc && !uarm) 1812. mayberem(uarmu, "shirt"); 1813. #endif 1814. 1815. if (uarm || uarmc) { 1816. verbalize("You're such a %s; I wish...", 1817. flags.female ? "sweet lady" : "nice guy"); 1818. rloc(mon); 1819. return 1; 1820. } 1821. if (u.ualign.type == A_CHAOTIC && u.ualign.record < ALIGNLIM) 1822. u.ualign.record++; 1823. 1824. /* by this point you have discovered mon's identity, blind or not... */ 1825. pline("Time stands still while you and %s lie in each other's arms...", 1826. mon_nam(mon)); 1827. if (rn2(35) > ACURR(A_CHA) + ACURR(A_INT)) { 1828. /* Don't bother with mspec_used here... it didn't get tired! */ 1829. pline("%s seems to have enjoyed it more than you...", 1830. Monnam(mon)); 1831. switch (rn2(5)) { 1832. case 0: You("feel drained of energy."); 1833. u.uen = 0; 1834. u.uenmax -= rnd(Half_physical_damage ? 5 : 10); 1835. exercise(A_CON, FALSE); 1836. if (u.uenmax < 0) u.uenmax = 0; 1837. break; 1838. case 1: You("are down in the dumps."); 1839. (void) adjattrib(A_CON, -1, TRUE); 1840. exercise(A_CON, FALSE); 1841. flags.botl = 1; 1842. break; 1843. case 2: Your("senses are dulled."); 1844. (void) adjattrib(A_WIS, -1, TRUE); 1845. exercise(A_WIS, FALSE); 1846. flags.botl = 1; 1847. break; 1848. case 3: 1849. #ifdef POLYSELF 1850. if (resists_drli(uasmon)) 1851. You("have a curious feeling..."); 1852. else { 1853. #endif 1854. You("feel out of shape."); 1855. losexp(); 1856. if(u.uhp <= 0) { 1857. killer_format = KILLED_BY; 1858. killer = "overexertion"; 1859. done(DIED); 1860. } 1861. #ifdef POLYSELF 1862. } 1863. #endif 1864. break; 1865. case 4: { 1866. int tmp; 1867. You("feel exhausted."); 1868. exercise(A_STR, FALSE); 1869. tmp = rn1(10, 6); 1870. if(Half_physical_damage) tmp = (tmp+1) / 2; 1871. losehp(tmp, "exhaustion", KILLED_BY); 1872. break; 1873. } 1874. } 1875. } else { 1876. mon->mspec_used = rnd(100); /* monster is worn out */ 1877. You("seem to have enjoyed it more than %s...", mon_nam(mon)); 1878. switch (rn2(5)) { 1879. case 0: You("feel raised to your full potential."); 1880. exercise(A_CON, TRUE); 1881. u.uen = (u.uenmax += rnd(5)); 1882. break; 1883. case 1: You("feel good enough to do it again."); 1884. (void) adjattrib(A_CON, 1, TRUE); 1885. exercise(A_CON, TRUE); 1886. flags.botl = 1; 1887. break; 1888. case 2: You("will always remember %s...", mon_nam(mon)); 1889. (void) adjattrib(A_WIS, 1, TRUE); 1890. exercise(A_WIS, TRUE); 1891. flags.botl = 1; 1892. break; 1893. case 3: pline("That was a very educational experience."); 1894. pluslvl(); 1895. exercise(A_WIS, TRUE); 1896. break; 1897. case 4: You("feel restored to health!"); 1898. u.uhp = u.uhpmax; 1899. #ifdef POLYSELF 1900. if (u.mtimedone) u.mh = u.mhmax; 1901. #endif 1902. exercise(A_STR, TRUE); 1903. flags.botl = 1; 1904. break; 1905. } 1906. } 1907. 1908. if (mon->mtame) /* don't charge */ ; 1909. else if (rn2(20) < ACURR(A_CHA)) { 1910. pline("%s demands that you pay %s, but you refuse...", 1911. Monnam(mon), (fem ? "her" : "him")); 1912. } 1913. #ifdef POLYSELF 1914. else if (u.umonnum == PM_LEPRECHAUN) 1915. pline("%s tries to take your money, but fails...", 1916. Monnam(mon)); 1917. #endif 1918. else { 1919. long cost; 1920. 1921. if (u.ugold > (long)LARGEST_INT - 10L) 1922. cost = (long) rnd(LARGEST_INT) + 500L; 1923. else 1924. cost = (long) rnd((int)u.ugold + 10) + 500L; 1925. if (mon->mpeaceful) { 1926. cost /= 5L; 1927. if (!cost) cost = 1L; 1928. } 1929. if (cost > u.ugold) cost = u.ugold; 1930. if (!cost) verbalize("It's on the house!"); 1931. else { 1932. pline("%s takes %ld zorkmid%s for services rendered!", 1933. Monnam(mon), cost, plur(cost)); 1934. u.ugold -= cost; 1935. mon->mgold += cost; 1936. flags.botl = 1; 1937. } 1938. } 1939. if (!rn2(25)) mon->mcan = 1; /* monster is worn out */ 1940. rloc(mon); 1941. return 1; 1942. } 1943. 1944. static void 1945. mayberem(obj, str) 1946. register struct obj *obj; 1947. const char *str; 1948. { 1949. char qbuf[QBUFSZ]; 1950. 1951. if (!obj || !obj->owornmask) return; 1952. 1953. if (rn2(20) < ACURR(A_CHA)) { 1954. Sprintf(qbuf,"\"Shall I remove your %s, %s?\"", 1955. str, 1956. (!rn2(2) ? "lover" : !rn2(2) ? "dear" : "sweetheart")); 1957. if (yn(qbuf) == 'n') return; 1958. } else verbalize("Take off your %s; %s.", str, 1959. (obj == uarm) ? "let's get a little closer" : 1960. (obj == uarmc || obj == uarms) ? "it's in the way" : 1961. (obj == uarmf) ? "let me rub your feet" : 1962. (obj == uarmg) ? "they're too clumsy" : 1963. #ifdef TOURIST 1964. (obj == uarmu) ? "let me massage you" : 1965. #endif 1966. /* obj == uarmh */ 1967. "let me run my fingers through your hair"); 1968. 1969. if (donning(obj)) cancel_don(); 1970. if (obj == uarm) (void) Armor_off(); 1971. else if (obj == uarmc) (void) Cloak_off(); 1972. else if (obj == uarmf) (void) Boots_off(); 1973. else if (obj == uarmg) (void) Gloves_off(); 1974. else if (obj == uarmh) (void) Helmet_off(); 1975. else setworn((struct obj *)0, obj->owornmask & W_ARMOR); 1976. } 1977. #endif /* SEDUCE */ 1978. 1979. #endif /* OVLB */ 1980. 1981. #ifdef POLYSELF 1982. 1983. #ifdef OVL1 1984. 1985. static int 1986. passiveum(olduasmon,mtmp,mattk) 1987. struct permonst *olduasmon; 1988. register struct monst *mtmp; 1989. register struct attack *mattk; 1990. { 1991. register struct permonst *mdat = mtmp->data; 1992. int i, tmp; 1993. 1994. for(i = 0; ; i++) { 1995. if(i >= NATTK) return 1; 1996. if(olduasmon->mattk[i].aatyp == AT_NONE) break; 1997. } 1998. if (olduasmon->mattk[i].damn) 1999. tmp = d((int)olduasmon->mattk[i].damn, 2000. (int)olduasmon->mattk[i].damd); 2001. else if(olduasmon->mattk[i].damd) 2002. tmp = d((int)olduasmon->mlevel+1, (int)olduasmon->mattk[i].damd); 2003. else 2004. tmp = 0; 2005. 2006. /* These affect the enemy even if you were "killed" (rehumanized) */ 2007. switch(olduasmon->mattk[i].adtyp) { 2008. case AD_ACID: 2009. if (!rn2(2)) { 2010. pline("%s is splashed by your acid!", Monnam(mtmp)); 2011. if(resists_acid(mdat)) { 2012. pline("%s is not affected.", Monnam(mtmp)); 2013. tmp = 0; 2014. } 2015. } else tmp = 0; 2016. goto assess_dmg; 2017. case AD_STON: /* cockatrice */ 2018. if (!resists_ston(mdat) && 2019. #ifdef MUSE 2020. (mattk->aatyp != AT_WEAP || !MON_WEP(mtmp)) && 2021. #else 2022. (mattk->aatyp != AT_WEAP || !select_hwep(mtmp)) && 2023. #endif 2024. mattk->aatyp != AT_GAZE && mattk->aatyp != AT_EXPL && 2025. mattk->aatyp != AT_MAGC && 2026. #ifdef MUSE 2027. (!which_armor(mtmp, W_ARMG))) { 2028. #else 2029. (!is_mercenary(mdat) || 2030. !m_carrying(mtmp, LEATHER_GLOVES))) { 2031. #endif 2032. if(poly_when_stoned(mdat)) { 2033. mon_to_stone(mtmp); 2034. return (1); 2035. } 2036. pline("%s turns to stone!", Monnam(mtmp)); 2037. stoned = 1; 2038. xkilled(mtmp, 0); 2039. return 2; 2040. } 2041. return 1; 2042. default: 2043. break; 2044. } 2045. if (!u.mtimedone) return 1; 2046. 2047. /* These affect the enemy only if you are still a monster */ 2048. if (rn2(3)) switch(uasmon->mattk[i].adtyp) { 2049. case AD_PLYS: /* Floating eye */ 2050. if (u.umonnum == PM_FLOATING_EYE) { 2051. if (!rn2(4)) tmp = 120; 2052. if (mtmp->mcansee && haseyes(mtmp->data) && rn2(3) && 2053. (perceives(mdat) || !Invis)) { 2054. if (Blind) 2055. pline("As a blind %s, you cannot defend yourself.", 2056. uasmon->mname); 2057. else { 2058. pline("%s is frozen by your gaze!", Monnam(mtmp)); 2059. mtmp->mcanmove = 0; 2060. mtmp->mfrozen = tmp; 2061. return 3; 2062. } 2063. } 2064. } else { /* gelatinous cube */ 2065. pline("%s is frozen by you.", Monnam(mtmp)); 2066. mtmp->mcanmove = 0; 2067. mtmp->mfrozen = tmp; 2068. return 3; 2069. } 2070. return 1; 2071. case AD_COLD: /* Brown mold or blue jelly */ 2072. if(resists_cold(mdat)) { 2073. shieldeff(mtmp->mx, mtmp->my); 2074. pline("%s is mildly chilly.", Monnam(mtmp)); 2075. golemeffects(mtmp, AD_COLD, tmp); 2076. tmp = 0; 2077. break; 2078. } 2079. pline("%s is suddenly very cold!", Monnam(mtmp)); 2080. u.mh += tmp / 2; 2081. if (u.mhmax < u.mh) u.mhmax = u.mh; 2082. if (u.mhmax > ((uasmon->mlevel+1) * 8)) { 2083. register struct monst *mon; 2084. 2085. if ((mon = cloneu()) != 0) { 2086. mon->mhpmax = u.mhmax /= 2; 2087. You("multiply from %s heat!", 2088. s_suffix(mon_nam(mtmp))); 2089. } 2090. } 2091. break; 2092. case AD_STUN: /* Yellow mold */ 2093. if (!mtmp->mstun) { 2094. mtmp->mstun = 1; 2095. pline("%s staggers.", Monnam(mtmp)); 2096. } 2097. tmp = 0; 2098. break; 2099. case AD_FIRE: /* Red mold */ 2100. if(resists_fire(mdat)) { 2101. shieldeff(mtmp->mx, mtmp->my); 2102. pline("%s is mildly warm.", Monnam(mtmp)); 2103. golemeffects(mtmp, AD_FIRE, tmp); 2104. tmp = 0; 2105. break; 2106. } 2107. pline("%s is suddenly very hot!", Monnam(mtmp)); 2108. break; 2109. case AD_ELEC: 2110. if(resists_elec(mdat)) { 2111. shieldeff(mtmp->mx, mtmp->my); 2112. pline("%s is slightly tingled.", Monnam(mtmp)); 2113. golemeffects(mtmp, AD_ELEC, tmp); 2114. tmp = 0; 2115. break; 2116. } 2117. pline("%s is jolted with your electricity!", Monnam(mtmp)); 2118. break; 2119. default: tmp = 0; 2120. break; 2121. } 2122. else tmp = 0; 2123. 2124. assess_dmg: 2125. if((mtmp->mhp -= tmp) <= 0) { 2126. pline("%s dies!", Monnam(mtmp)); 2127. xkilled(mtmp,0); 2128. return 2; 2129. } 2130. return 1; 2131. } 2132. 2133. #endif /* OVL1 */ 2134. #ifdef OVLB 2135. 2136. #include "edog.h" 2137. struct monst * 2138. cloneu() 2139. { 2140. register struct monst *mon; 2141. 2142. if (u.mh <= 1) return(struct monst *)0; 2143. if (uasmon->geno & G_EXTINCT) return(struct monst *)0; 2144. uasmon->pxlth += sizeof(struct edog); 2145. mon = makemon(uasmon, u.ux, u.uy); 2146. uasmon->pxlth -= sizeof(struct edog); 2147. mon = christen_monst(mon, plname); 2148. initedog(mon); 2149. mon->m_lev = uasmon->mlevel; 2150. mon->mhp = u.mh /= 2; 2151. mon->mhpmax = u.mhmax; 2152. return(mon); 2153. } 2154. 2155. #endif /* OVLB */ 2156. 2157. #endif /* POLYSELF */ 2158. 2159. /*mhitu.c*/
|