Source:NetHack 3.0.0/mcastu.c

Below is the full text to mcastu.c from the source code of NetHack 3.0.0. To link to a particular line, write [[NetHack 3.0.0/mcastu.c#line123 ]], for example.

Warning! This is the source code from an old release. For the latest release, see Source code

1.   /*	SCCS Id: @(#)mcastu.c	3.0	88/04/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.   const char *spelltyp[] = { 8.   	"shower of missiles", 9.   	"fireball", 10.  	"sleep ray", 11.  	"cone of cold", 12.  	"finger of death", 13.  	"bolt of lightning", 14.  	"",  15.   	"",  16.   	"",  17.   	""  18.   };  19.    20.   static 21.  void 22.  cursetxt(mtmp) 23.  	register struct monst *mtmp; 24.  {  25.   	if(canseemon(mtmp)) 26.  		pline("%s points at you, then curses.", Monnam(mtmp)); 27.  	else if((!(moves%4) || !rn2(4)) && flags.soundok) 28.  		You("hear a mumbled curse."); 29.  }  30.    31.   int 32.  castmu(mtmp, mattk)	/* monster casts spell at you */ 33.  	register struct monst *mtmp; 34.  	register struct attack *mattk; 35.  {  36.   	int	dmg = 0, ml = mtmp->m_lev; 37.   38.   	if(mtmp->mcan || mtmp->mspec_used) {  /* could not attack */ 39.  	    cursetxt(mtmp); 40.  	    return(0); 41.  	} else { 42.  	    nomul(0); 43.  	    if(rn2(ml*10) < (mtmp->mconf ? 100 : 20)) {	/* fumbled attack */ 44.  		if(canseemon(mtmp)) 45.  		    pline("The air crackles around %s.", mon_nam(mtmp)); 46.  		return(0); 47.  	    }  48.   	}  49.   /*  50.    *	As these are spells, the damage is related to the level 51.   *	of the monster casting the spell. 52.   */  53.   	if (mattk->damd) 54.  		dmg = d((int)((ml/3) + mattk->damn), (int)mattk->damd); 55.  	else dmg = d((int)((ml/3) + 1), 6); 56.   57.   	switch(mattk->adtyp)   { 58.   59.   	    case AD_FIRE: 60.  		pline("You're enveloped in flames."); 61.  		if(Fire_resistance) { 62.  			shieldeff(u.ux, u.uy); 63.  			pline("But you resist the effects."); 64.  			dmg = 0; 65.  		}  66.   		break; 67.  	    case AD_COLD: 68.  		pline("You're covered in frost."); 69.  		if(Cold_resistance) { 70.  			shieldeff(u.ux, u.uy); 71.  			pline("But you resist the effects."); 72.  			dmg = 0; 73.  		}  74.   		break; 75.  #ifdef HARD 76.  	    case AD_MAGM: 77.  		You("are hit by a shower of missiles!"); 78.  		if(Antimagic) { 79.  			shieldeff(u.ux, u.uy); 80.  			pline("The missiles bounce off!"); 81.  			dmg = 0; 82.  		} else dmg = d((int)mtmp->m_lev/2 + 1,6); 83.  		break; 84.  #endif 85.  	    case AD_SPEL:	/* random spell */ 86.   87.   		mtmp->mspec_used = 10 - mtmp->m_lev; 88.  		if (mtmp->mspec_used < 2) mtmp->mspec_used = 2; 89.  		switch(rn2((int)mtmp->m_lev)) { 90.  		    case 22: 91.  		    case 21: 92.  		    case 20: 93.  			pline("Oh no, %s's using the touch of death!",  94.   			      is_female(mtmp) ? "she" :  95.   			      is_human(mtmp->data) ? "he" : "it"  96.   			     ); 97.  #ifdef POLYSELF 98.  			if (is_undead(uasmon)) 99.  			    You("seem no deader than before."); 100. 			else 101. #endif 102. 			if(!Antimagic && rn2(ml) > 12)  { 103.  104.  			    if(Hallucination) 105. 				You("have an out of body experience."); 106. 			    else  { 107. 				killer = "touch of death"; 108. 				done("died"); 109. 			    }  110.  			} else { 111. 				if(Antimagic) shieldeff(u.ux, u.uy); 112. 				pline("Lucky for you, it didn't work!"); 113. 			}  114.  			dmg = 0; 115. 			break; 116. 		    case 19: 117. 		    case 18: 118. 			if(mtmp->iswiz && flags.no_of_wizards == 1) { 119. 				pline("Double Trouble..."); 120. 				clonewiz; 121. 				dmg = 0; 122. 				break; 123. 			} /* else fall into the next case */ 124. 		    case 17: 125. 		    case 16: 126. 		    case 15: 127. 			if(mtmp->iswiz && flags.soundok) 128. 			    pline("\"Destroy the thief, my pets!\""); 129. #ifdef HARD 130. 			nasty;	/* summon something nasty */ 131. #endif 132. 			/* fall into the next case */ 133. 		    case 14:		/* aggravate all monsters */ 134. 		    case 13: 135. 			aggravate; 136. 			dmg = 0; 137. 			break; 138. 		    case 12:		/* curse random items */ 139. 		    case 11: 140. 		    case 10: 141. 			rndcurse; 142. 			dmg = 0; 143. 			break; 144. 		    case 9: 145. 		    case 8:		/* destroy armor */ 146. 			if(Antimagic) { 147. 				shieldeff(u.ux, u.uy); 148. 				pline("A field of force surrounds you!"); 149. 			} else if(!destroy_arm(some_armor)) 150. 				Your("skin itches."); 151. 			dmg = 0; 152. 			break; 153. 		    case 7: 154. 		    case 6:		/* drain strength */ 155. 			if(Antimagic) { 156. 			    shieldeff(u.ux, u.uy); 157. 			    You("feel momentarily weakened."); 158. 			} else { 159. 			    You("suddenly feel weaker!"); 160. 			    losestr(rnd(ml - 6)); 161. 			    if(u.uhp < 1) 162. 				done_in_by(mtmp); 163. 			}  164.  			dmg = 0; 165. 			break; 166. 		    case 5:		/* make invisible if not */ 167. 		    case 4: 168. 			if(!mtmp->minvis) { 169. 			    if(canseemon(mtmp) && !See_invisible) 170. 				pline("%s suddenly disappears!",  171.  				      Monnam(mtmp)); 172. 			    mtmp->minvis = 1; 173. 			    unpmon(mtmp); 174. 			    dmg = 0; 175. 			    break; 176. 			} /* else fall into the next case */ 177. 		    case 3:		/* stun */ 178. 			if(Antimagic) { 179. 			    shieldeff(u.ux, u.uy); 180. 			    if(!Stunned) 181. 				You("feel momentarily disoriented."); 182. 			    make_stunned(1L, FALSE); 183. 			} else { 184. 			    if (Stunned)	You("struggle to keep your balance."); 185. 			    else		You("reel..."); 186. 			    make_stunned(HStun + d(ACURR(A_DEX) < 12 ? 6 : 4, 4), FALSE); 187. 			}  188.  			dmg = 0; 189. 			break; 190. 		    case 2:		/* haste self */ 191. 			if(mtmp->mspeed == MSLOW)	mtmp->mspeed = 0; 192. 			else				mtmp->mspeed = MFAST; 193. 			dmg = 0; 194. 			break; 195. 		    case 1:		/* cure self */ 196. 			if(mtmp->mhp < mtmp->mhpmax) { 197. 			    if((mtmp->mhp += rnd(8)) > mtmp->mhpmax) 198. 				mtmp->mhp = mtmp->mhpmax; 199. 			    dmg = 0; 200. 			    break; 201. 			} /* else fall through to default case */ 202. 		    default:		/* psi bolt */ 203. 			if(Antimagic) { 204. 			    shieldeff(u.ux, u.uy); 205. 			    You("get a slight %sache.",body_part(HEAD)); 206. 			    dmg = 1; 207. 			} else { 208. 			    if (dmg <= 10) 209. 				Your("brain is on fire!"); 210. 			    else Your("%s suddenly aches!", body_part(HEAD)); 211. 			}  212.  			break; 213. 		}  214.  		break; 215. 		  216.  	    case AD_CLRC:	/* clerical spell */ 217.  218.  		mtmp->mspec_used = 10 - mtmp->m_lev; 219. 		if (mtmp->mspec_used < 2) mtmp->mspec_used = 2; 220. 		switch(rn2((int)mtmp->m_lev)) { 221. 		    /* Other ideas: lightning bolts, towers of flame, 222. 				    gush of water  -3. */ 223.   224.  		    default:		/* confuse */ 225. 			if(Antimagic) { 226. 			    shieldeff(u.ux, u.uy); 227. 			    You("feel momentarily dizzy."); 228. 			} else { 229. 			    make_confused(HConfusion + (long)mtmp->m_lev, TRUE); 230. 			}  231.  			dmg = 0; 232. 			break; 233. 		    case 12:		/* curse random items */ 234. 		    case 11: 235. 		    case 10: 236. 			rndcurse; 237. 			dmg = 0; 238. 			break; 239. 		    case 9: 240. 		    case 8:		/* insects */ 241. 			/* Try for insects, and if there are none 242. 			   left, go for (sticks to) snakes. -3. */ 243.  			{  244.  			int i;  245. struct permonst *pm = mkclass(S_ANT); 246. 			struct monst *mtmp2; 247. 			char let = (pm ? S_ANT : S_SNAKE); 248.    249.  			for (i = 0; i <= mtmp->m_lev; i++) 250. 			   if ((pm = mkclass(let)) &&  251.  					(mtmp2 = makemon(pm, u.ux, u.uy))) 252. 				mtmp2->msleep = mtmp2->mpeaceful = 253. 					mtmp2->mtame = 0; 254. 			}			  255.  			dmg = 0; 256. 			break; 257. 		    case 6: 258. 		    case 7:		/* blindness */ 259. 			if (!Blinded) { 260. 			    pline("Scales cover your eyes!"); 261. 			    make_blinded(200L, FALSE); 262. 			    dmg = 0; 263. 			    break; 264. 			}  265.  		    case 4: 266. 		    case 5:		/* wound */ 267. 			if(Antimagic) { 268. 			    shieldeff(u.ux, u.uy); 269. 			    Your("skin itches badly for a moment."); 270. 			    dmg = 0; 271. 			} else { 272. 			    pline("Wounds appear on your body!"); 273. 			    dmg = d(2,8) + 1; 274. 			}  275.  			break; 276. 		    case 3:		/* hold */ 277. 			if(Antimagic) { 278. 			    shieldeff(u.ux, u.uy); 279. 			    if(multi >= 0) 280. 				You("stiffen briefly."); 281. 			    nomul(-1); 282. 		 	} else { 283. 			    if (multi >= 0) 284. 			        You("are frozen in place!"); 285. 			    nomul(-4 - (int)mtmp->m_lev); 286. 			}  287.  			dmg = 0; 288. 			break; 289. 		    case 2: 290. 		    case 1:		/* cure self */ 291. 			if(mtmp->mhp < mtmp->mhpmax) { 292. 			    if((mtmp->mhp += rnd(8)) > mtmp->mhpmax) 293. 				mtmp->mhp = mtmp->mhpmax; 294. 			    dmg = 0; 295. 			    break; 296. 			} /* else fall through to default case */ 297. 		}  298.  	}  299.  	if(dmg) mdamageu(mtmp, dmg); 300. 	return(1); 301. }  302.   303.  int 304. buzzmu(mtmp, mattk)		/* monster uses spell (ranged) */ 305. 	register struct monst *mtmp; 306. 	register struct attack  *mattk; 307. {  308.  	if(mtmp->mcan || mattk->adtyp > AD_SPC2) { 309. 	    cursetxt(mtmp); 310. 	    return(0); 311. 	}  312.  	if(lined_up(mtmp) && rn2(3)) { 313. 	    nomul(0); 314. 	    if(mattk->adtyp && (mattk->adtyp < 11)) { /* no cf unsigned >0 */ 315. 		if(canseemon(mtmp)) 316. 		    pline("%s zaps you with a %s!", Monnam(mtmp),  317.  			  spelltyp[mattk->adtyp-1]); 318. 		buzz((int) (-10 - (mattk->adtyp-1)), (int)mattk->damn,  319.  		     mtmp->mx, mtmp->my, sgn(tbx), sgn(tby)); 320. 	    } else impossible("Monster spell %d cast", mattk->adtyp-1); 321. 	}  322.  	return(1); 323. }  324.