Fandom

Wikihack

Source:NetHack 3.2.0/mcastu.c

2,034pages on
this wiki
Add New Page
Talk0

Ad blocker interference detected!


Wikia is a free-to-use site that makes money from advertising. We have a modified experience for viewers using ad blockers

Wikia is not accessible if you’ve made further modifications. Remove the custom ad blocker rule(s) and the page will load as expected.

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

Also on Fandom

Random Wiki