abstract
| - Below is the full text to hack.mhitu.c from the source code of Hack 1.0. To link to a particular line, write [[Hack 1.0/hack.mhitu.c#line123]], for example. Warning! This is the source code from an old release. For the latest release, see Source code 1. #include "hack.h" 2. extern struct monst *makemon(); 3. 4. /* 5. * mhitu: monster hits you 6. * returns 1 if monster dies (e.g. 'y', 'F'), 0 otherwise 7. */ 8. mhitu(mtmp) 9. register struct monst *mtmp; 10. { 11. register struct permonst *mdat = mtmp->data; 12. register int tmp, ctmp; 13. 14. nomul(0); 15. if(!index("&DuxynNF",mdat->mlet) && !u.uswallow) 16. tmp = hitu(mtmp,d(mdat->damn,mdat->damd)); 17. else tmp = 0; 18. 19. ctmp = tmp && !mtmp->mcan && 20. (!uarm || objects[uarm->otyp].a_can < rnd(3) || !rn2(50)); 21. switch(mdat->mlet) { 22. case '&': 23. if(!mtmp->cham && !mtmp->mcan && !rn2(15)) { 24. (void) makemon(PM_DEMON,u.ux,u.uy); 25. } else { 26. (void) hitu(mtmp,d(2,6)); 27. (void) hitu(mtmp,d(2,6)); 28. (void) hitu(mtmp,rnd(3)); 29. (void) hitu(mtmp,rnd(3)); 30. (void) hitu(mtmp,rn1(4,2)); 31. } 32. break; 33. case ',': 34. if(u.uswallow) 35. youswld(mtmp,4+u.uac,5,"The trapper"); 36. else if(tmp) justswld(mtmp,"The trapper"); 37. break; 38. case '\: 39. if(u.uswallow) 40. youswld(mtmp,rnd(6),7,"The lurker above"); 41. else if(tmp) justswld(mtmp,"The lurker above"); 42. break; 43. case 'A': 44. if(ctmp && rn2(2)) { 45. pline("You feel weaker!"); 46. losestr(1); 47. } 48. break; 49. case 'C': 50. (void) hitu(mtmp,rnd(6)); 51. break; 52. case 'c': 53. if(!rn2(5)) { 54. pline("You hear %s's hissing!", monnam(mtmp)); 55. if(ctmp || !rn2(5)) { 56. pline("You get turned to stone!"); 57. done_in_by(mtmp); 58. } 59. } 60. break; 61. case 'D': 62. if(rn2(6) || mtmp->mcan) { 63. (void) hitu(mtmp,d(3,10)); 64. (void) hitu(mtmp,rnd(8)); 65. (void) hitu(mtmp,rnd(8)); 66. break; 67. } 68. kludge("%s breathes fire!","The dragon"); 69. buzz(-1,mtmp->mx,mtmp->my,u.ux-mtmp->mx,u.uy-mtmp->my); 70. break; 71. case 'd': 72. (void) hitu(mtmp,d(2,4)); 73. break; 74. case 'e': 75. (void) hitu(mtmp,d(3,6)); 76. break; 77. case 'F': 78. if(mtmp->mcan) break; 79. kludge("%s explodes!","The freezing sphere"); 80. if(Cold_resistance) pline("You don't seem affected by it."); 81. else { 82. xchar dn; 83. if(17-(u.ulevel/2) > rnd(20)) { 84. pline("You get blasted!"); 85. dn = 6; 86. } else { 87. pline("You duck the blast..."); 88. dn = 3; 89. } 90. losehp_m(d(dn,6), mtmp); 91. } 92. mondead(mtmp); 93. return(1); 94. case 'g': 95. if(ctmp && multi >= 0 && !rn2(6)) { 96. kludge("You are frozen by %ss juices","the cube'"); 97. nomul(-rnd(10)); 98. } 99. break; 100. case 'h': 101. if(ctmp && multi >= 0 && !rn2(5)) { 102. nomul(-rnd(10)); 103. kludge("You are put to sleep by %ss bite!","the homunculus'"); 104. } 105. break; 106. case 'j': 107. tmp = hitu(mtmp,rnd(3)); 108. tmp &= hitu(mtmp,rnd(3)); 109. if(tmp){ 110. (void) hitu(mtmp,rnd(4)); 111. (void) hitu(mtmp,rnd(4)); 112. } 113. break; 114. case 'k': 115. if((hitu(mtmp,rnd(4)) || !rn2(3)) && ctmp){ 116. poisoned("bee's sting",mdat->mname); 117. } 118. break; 119. case 'L': 120. if(tmp) stealgold(mtmp); 121. break; 122. case 'N': 123. if(mtmp->mcan && !Blind) { 124. pline("%s tries to seduce you, but you seem not interested.", 125. Amonnam(mtmp, "plain")); 126. if(rn2(3)) rloc(mtmp); 127. } else if(steal(mtmp)) { 128. rloc(mtmp); 129. mtmp->mflee = 1; 130. } 131. break; 132. case 'n': 133. if(!uwep && !uarm && !uarmh && !uarms && !uarmg) { 134. pline("%s hits! (I hope you don't mind)", 135. Monnam(mtmp)); 136. u.uhp += rnd(7); 137. if(!rn2(7)) u.uhpmax++; 138. if(u.uhp > u.uhpmax) u.uhp = u.uhpmax; 139. flags.botl = 1; 140. if(!rn2(50)) rloc(mtmp); 141. } else { 142. (void) hitu(mtmp,d(2,6)); 143. (void) hitu(mtmp,d(2,6)); 144. } 145. break; 146. case 'o': 147. tmp = hitu(mtmp,rnd(6)); 148. if(hitu(mtmp,rnd(6)) && ctmp && 149. !u.ustuck && rn2(2)) { 150. u.ustuck = mtmp; 151. kludge("%s has grabbed you!","The owlbear"); 152. u.uhp -= d(2,8); 153. } else if(u.ustuck == mtmp) { 154. u.uhp -= d(2,8); 155. pline("You are being crushed."); 156. } 157. break; 158. case 'P': 159. if(u.uswallow) 160. youswld(mtmp,d(2,4),12,"The purple worm"); 161. else if(ctmp && !rn2(4)) 162. justswld(mtmp,"The purple worm"); 163. else (void) hitu(mtmp,d(2,4)); 164. break; 165. case 'Q': 166. (void) hitu(mtmp,rnd(2)); 167. (void) hitu(mtmp,rnd(2)); 168. break; 169. case 'R': 170. if(tmp && uarmh && !uarmh->rustfree && 171. (int) uarmh->spe >= -1) { 172. pline("Your helmet rusts!"); 173. uarmh->spe--; 174. } else 175. if(ctmp && uarm && !uarmh->rustfree && 176. uarm->otyp < STUDDED_LEATHER_ARMOR && 177. (int)uarm->spe >= -1) { 178. pline("Your armor rusts!"); 179. uarm->spe--; 180. } 181. break; 182. case 'S': 183. if(ctmp && !rn2(8)) { 184. poisoned("snake's bite",mdat->mname); 185. } 186. break; 187. case 's': 188. if(tmp && !rn2(8)) { 189. poisoned("scorpion's sting",mdat->mname); 190. } 191. (void) hitu(mtmp,rnd(8)); 192. (void) hitu(mtmp,rnd(8)); 193. break; 194. case 'T': 195. (void) hitu(mtmp,rnd(6)); 196. (void) hitu(mtmp,rnd(6)); 197. break; 198. case 't': 199. if(!rn2(5)) rloc(mtmp); 200. break; 201. case 'u': 202. mtmp->mflee = 1; 203. break; 204. case 'U': 205. (void) hitu(mtmp,d(3,4)); 206. (void) hitu(mtmp,d(3,4)); 207. break; 208. case 'v': 209. if(ctmp && !u.ustuck) u.ustuck = mtmp; 210. break; 211. case 'V': 212. if(tmp) u.uhp -= 4; 213. if(ctmp && !rn2(3)) losexp(); 214. break; 215. case 'W': 216. if(ctmp && !rn2(5)) losexp(); 217. break; 218. #ifndef NOWORM 219. case 'w': 220. if(tmp) wormhit(mtmp); 221. #endif NOWORM 222. break; 223. case 'X': 224. (void) hitu(mtmp,rnd(3)); 225. (void) hitu(mtmp,rnd(3)); 226. (void) hitu(mtmp,rnd(3)); 227. break; 228. case 'x': 229. { register int side = rn2(2) ? RIGHT_SIDE : LEFT_SIDE; 230. pline("%s pricks in your %s leg!", 231. Monnam(mtmp), (side == RIGHT_SIDE) ? "right" : "left"); 232. Wounded_legs |= side + rnd(5); 233. losehp_m(2, mtmp); 234. break; 235. } 236. case 'y': 237. if(mtmp->mcan) break; 238. mondead(mtmp); 239. if(!Blind) { 240. pline("You are blinded by a blast of light!"); 241. Blind = d(4,12); 242. seeoff(0); 243. } 244. return(1); 245. case 'Y': 246. (void) hitu(mtmp,rnd(6)); 247. break; 248. } 249. if(u.uhp < 1) done_in_by(mtmp); 250. return(0); 251. }
|