Source:Hack 1.0/hack.mhitu.c

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. }