Difference between revisions of "Source:Hack 1.0/hack.worm.c"

From NetHackWiki
Jump to navigation Jump to search
(Revert vandalism)
 
Line 1: Line 1:
Dangerous content should not be posted!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+
Below is the full text to '''hack.worm.c''' from the [[Hack 1.0 source code|source code]] of [[Hack 1.0]]. To link to a particular line, write [[Hack 1.0/hack.worm.c#line123|<nowiki>[[Hack 1.0/hack.worm.c#line123]]</nowiki>]], for example.
 +
 
 +
'''Warning!''' This is the source code from an old release. For the latest release, see [[Source code]]
 +
 
 +
{{CWI}}
 +
<span id="line1">1.    /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1984. */</span>
 +
<span id="line2">2.    </span>
 +
<span id="line3">3.    #include "hack.h"</span>
 +
<span id="line4">4.    #ifndef NOWORM</span>
 +
<span id="line5">5.    #include "def.wseg.h"</span>
 +
<span id="line6">6.    </span>
 +
<span id="line7">7.    struct wseg *wsegs[32]; /* linked list, tail first */</span>
 +
<span id="line8">8.    struct wseg *wheads[32];</span>
 +
<span id="line9">9.    long wgrowtime[32];</span>
 +
<span id="line10">10.  </span>
 +
<span id="line11">11.  getwn(mtmp) struct monst *mtmp; {</span>
 +
<span id="line12">12.  register tmp;</span>
 +
<span id="line13">13.  for(tmp=1; tmp<32; tmp++) if(!wsegs[tmp]) {</span>
 +
<span id="line14">14.  mtmp->wormno = tmp;</span>
 +
<span id="line15">15.  return(1);</span>
 +
<span id="line16">16.  }</span>
 +
<span id="line17">17.    return(0); /* level infested with worms */</span>
 +
<span id="line18">18.  }</span>
 +
<span id="line19">19.  </span>
 +
<span id="line20">20.  /* called to initialize a worm unless cut in half */</span>
 +
<span id="line21">21.  initworm(mtmp) struct monst *mtmp; {</span>
 +
<span id="line22">22.  register struct wseg *wtmp;</span>
 +
<span id="line23">23.  register tmp = mtmp->wormno;</span>
 +
<span id="line24">24.  if(!tmp) return;</span>
 +
<span id="line25">25.  wheads[tmp] = wsegs[tmp] = wtmp = newseg();</span>
 +
<span id="line26">26.  wgrowtime[tmp] = 0;</span>
 +
<span id="line27">27.  wtmp->wx = mtmp->mx;</span>
 +
<span id="line28">28.  wtmp->wy = mtmp->my;</span>
 +
<span id="line29">29.  /* wtmp->wdispl = 0;*/</span>
 +
<span id="line30">30.  wtmp->nseg = 0;</span>
 +
<span id="line31">31.  }</span>
 +
<span id="line32">32.  </span>
 +
<span id="line33">33.  worm_move(mtmp) struct monst *mtmp; {</span>
 +
<span id="line34">34.  register struct wseg *wtmp, *whd;</span>
 +
<span id="line35">35.  register tmp = mtmp->wormno;</span>
 +
<span id="line36">36.  wtmp = newseg();</span>
 +
<span id="line37">37.  wtmp->wx = mtmp->mx;</span>
 +
<span id="line38">38.  wtmp->wy = mtmp->my;</span>
 +
<span id="line39">39.  wtmp->nseg = 0;</span>
 +
<span id="line40">40.  /* wtmp->wdispl = 0;*/</span>
 +
<span id="line41">41.  (whd = wheads[tmp])->nseg = wtmp;</span>
 +
<span id="line42">42.  wheads[tmp] = wtmp;</span>
 +
<span id="line43">43.  if(cansee(whd->wx,whd->wy)){</span>
 +
<span id="line44">44.  unpmon(mtmp);</span>
 +
<span id="line45">45.  atl(whd->wx, whd->wy, '~');</span>
 +
<span id="line46">46.  whd->wdispl = 1;</span>
 +
<span id="line47">47.  } else whd->wdispl = 0;</span>
 +
<span id="line48">48.  if(wgrowtime[tmp] <= moves) {</span>
 +
<span id="line49">49.  if(!wgrowtime[tmp]) wgrowtime[tmp] = moves + rnd(5);</span>
 +
<span id="line50">50.  else wgrowtime[tmp] += 2+rnd(15);</span>
 +
<span id="line51">51.  mtmp->orig_hp++;</span>
 +
<span id="line52">52.  mtmp->mhp++;</span>
 +
<span id="line53">53.  return;</span>
 +
<span id="line54">54.  }</span>
 +
<span id="line55">55.  whd = wsegs[tmp];</span>
 +
<span id="line56">56.  wsegs[tmp] = whd->nseg;</span>
 +
<span id="line57">57.  remseg(whd);</span>
 +
<span id="line58">58.  }</span>
 +
<span id="line59">59.  </span>
 +
<span id="line60">60.  worm_nomove(mtmp) register struct monst *mtmp; {</span>
 +
<span id="line61">61.  register tmp;</span>
 +
<span id="line62">62.  register struct wseg *wtmp;</span>
 +
<span id="line63">63.  tmp = mtmp->wormno;</span>
 +
<span id="line64">64.  wtmp = wsegs[tmp];</span>
 +
<span id="line65">65.  if(wtmp == wheads[tmp]) return;</span>
 +
<span id="line66">66.  if(wtmp == 0 || wtmp->nseg == 0) panic("worm_nomove?");</span>
 +
<span id="line67">67.  wsegs[tmp] = wtmp->nseg;</span>
 +
<span id="line68">68.  remseg(wtmp);</span>
 +
<span id="line69">69.  mtmp->mhp--; /* orig_hp not changed ! */</span>
 +
<span id="line70">70.  }</span>
 +
<span id="line71">71.  </span>
 +
<span id="line72">72.  wormdead(mtmp) register struct monst *mtmp; {</span>
 +
<span id="line73">73.  register tmp = mtmp->wormno;</span>
 +
<span id="line74">74.  register struct wseg *wtmp, *wtmp2;</span>
 +
<span id="line75">75.  if(!tmp) return;</span>
 +
<span id="line76">76.  mtmp->wormno = 0;</span>
 +
<span id="line77">77.  for(wtmp = wsegs[tmp]; wtmp; wtmp = wtmp2){</span>
 +
<span id="line78">78.  wtmp2 = wtmp->nseg;</span>
 +
<span id="line79">79.  remseg(wtmp);</span>
 +
<span id="line80">80.  }</span>
 +
<span id="line81">81.    wsegs[tmp] = 0;</span>
 +
<span id="line82">82.  }</span>
 +
<span id="line83">83.  </span>
 +
<span id="line84">84.  wormhit(mtmp) register struct monst *mtmp; {</span>
 +
<span id="line85">85.  register tmp = mtmp->wormno;</span>
 +
<span id="line86">86.  register struct wseg *wtmp;</span>
 +
<span id="line87">87.  if(!tmp) return; /* worm without tail */</span>
 +
<span id="line88">88.  for(wtmp = wsegs[tmp]; wtmp; wtmp = wtmp->nseg)</span>
 +
<span id="line89">89.  (void) hitu(mtmp,1);</span>
 +
<span id="line90">90.  }</span>
 +
<span id="line91">91.  </span>
 +
<span id="line92">92.  wormsee(tmp) register unsigned tmp; {</span>
 +
<span id="line93">93.  register struct wseg *wtmp = wsegs[tmp];</span>
 +
<span id="line94">94.  if(!wtmp) panic("wormsee: wtmp==0");</span>
 +
<span id="line95">95.  for(; wtmp->nseg; wtmp = wtmp->nseg)</span>
 +
<span id="line96">96.  if(!cansee(wtmp->wx,wtmp->wy) && wtmp->wdispl){</span>
 +
<span id="line97">97.  newsym(wtmp->wx, wtmp->wy);</span>
 +
<span id="line98">98.  wtmp->wdispl = 0;</span>
 +
<span id="line99">99.  }</span>
 +
<span id="line100">100.  }</span>
 +
<span id="line101">101.  </span>
 +
<span id="line102">102.  pwseg(wtmp) register struct wseg *wtmp; {</span>
 +
<span id="line103">103.  if(!wtmp->wdispl){</span>
 +
<span id="line104">104.  atl(wtmp->wx, wtmp->wy, '~');</span>
 +
<span id="line105">105.  wtmp->wdispl = 1;</span>
 +
<span id="line106">106.  }</span>
 +
<span id="line107">107.  }</span>
 +
<span id="line108">108.  </span>
 +
<span id="line109">109.  cutworm(mtmp,x,y,weptyp)</span>
 +
<span id="line110">110.  register struct monst *mtmp;</span>
 +
<span id="line111">111.  register xchar x,y;</span>
 +
<span id="line112">112.  register uchar weptyp; /* uwep->otyp or 0 */</span>
 +
<span id="line113">113.  {</span>
 +
<span id="line114">114.  register struct wseg *wtmp, *wtmp2;</span>
 +
<span id="line115">115.  register struct monst *mtmp2;</span>
 +
<span id="line116">116.  register tmp,tmp2;</span>
 +
<span id="line117">117.  if(mtmp->mx == x && mtmp->my == y) return; /* hit headon */</span>
 +
<span id="line118">118.  </span>
 +
<span id="line119">119.  /* cutting goes best with axe or sword */</span>
 +
<span id="line120">120.  tmp = rnd(20);</span>
 +
<span id="line121">121.  if(weptyp == LONG_SWORD || weptyp == TWO_HANDED_SWORD ||</span>
 +
<span id="line122">122.  weptyp == AXE) tmp += 5;</span>
 +
<span id="line123">123.  if(tmp < 12) return;</span>
 +
<span id="line124">124.  </span>
 +
<span id="line125">125.  /* if tail then worm just loses a tail segment */</span>
 +
<span id="line126">126.  tmp = mtmp->wormno;</span>
 +
<span id="line127">127.  wtmp = wsegs[tmp];</span>
 +
<span id="line128">128.  if(wtmp->wx == x && wtmp->wy == y){</span>
 +
<span id="line129">129.  wsegs[tmp] = wtmp->nseg;</span>
 +
<span id="line130">130.  remseg(wtmp);</span>
 +
<span id="line131">131.  return;</span>
 +
<span id="line132">132.  }</span>
 +
<span id="line133">133.  </span>
 +
<span id="line134">134.  /* cut the worm in two halves */</span>
 +
<span id="line135">135.  mtmp2 = newmonst(0);</span>
 +
<span id="line136">136.  *mtmp2 = *mtmp;</span>
 +
<span id="line137">137.  mtmp2->mxlth = mtmp2->mnamelth = 0;</span>
 +
<span id="line138">138.  </span>
 +
<span id="line139">139.  /* sometimes the tail end dies */</span>
 +
<span id="line140">140.  if(rn2(3) || !getwn(mtmp2)){</span>
 +
<span id="line141">141.  monfree(mtmp2);</span>
 +
<span id="line142">142.  tmp2 = 0;</span>
 +
<span id="line143">143.  } else {</span>
 +
<span id="line144">144.  tmp2 = mtmp2->wormno;</span>
 +
<span id="line145">145.  wsegs[tmp2] = wsegs[tmp];</span>
 +
<span id="line146">146.  wgrowtime[tmp2] = 0;</span>
 +
<span id="line147">147.  }</span>
 +
<span id="line148">148.  do {</span>
 +
<span id="line149">149.  if(wtmp->nseg->wx == x && wtmp->nseg->wy == y){</span>
 +
<span id="line150">150.  if(tmp2) wheads[tmp2] = wtmp;</span>
 +
<span id="line151">151.  wsegs[tmp] = wtmp->nseg->nseg;</span>
 +
<span id="line152">152.  remseg(wtmp->nseg);</span>
 +
<span id="line153">153.  wtmp->nseg = 0;</span>
 +
<span id="line154">154.  if(tmp2){</span>
 +
<span id="line155">155.  pline("You cut the worm in half.");</span>
 +
<span id="line156">156.  mtmp2->orig_hp = mtmp2->mhp =</span>
 +
<span id="line157">157.  d(mtmp2->data->mlevel, 8);</span>
 +
<span id="line158">158.  mtmp2->mx = wtmp->wx;</span>
 +
<span id="line159">159.  mtmp2->my = wtmp->wy;</span>
 +
<span id="line160">160.  mtmp2->nmon = fmon;</span>
 +
<span id="line161">161.  fmon = mtmp2;</span>
 +
<span id="line162">162.  pmon(mtmp2);</span>
 +
<span id="line163">163.  } else {</span>
 +
<span id="line164">164.  pline("You cut off part of the worm's tail.");</span>
 +
<span id="line165">165.  remseg(wtmp);</span>
 +
<span id="line166">166.  }</span>
 +
<span id="line167">167.  mtmp->mhp /= 2;</span>
 +
<span id="line168">168.  return;</span>
 +
<span id="line169">169.  }</span>
 +
<span id="line170">170.  wtmp2 = wtmp->nseg;</span>
 +
<span id="line171">171.  if(!tmp2) remseg(wtmp);</span>
 +
<span id="line172">172.  wtmp = wtmp2;</span>
 +
<span id="line173">173.  } while(wtmp->nseg);</span>
 +
<span id="line174">174.  panic("Cannot find worm segment");</span>
 +
<span id="line175">175.  }</span>
 +
<span id="line176">176.  </span>
 +
<span id="line177">177.  remseg(wtmp) register struct wseg *wtmp; {</span>
 +
<span id="line178">178.  if(wtmp->wdispl)</span>
 +
<span id="line179">179.  newsym(wtmp->wx, wtmp->wy);</span>
 +
<span id="line180">180.  free((char *) wtmp);</span>
 +
<span id="line181">181.  }</span>
 +
<span id="line182">182.  #endif NOWORM</span>
 +
[[Category:Hack 1.0 source code|hack.worm.c]]

Latest revision as of 10:54, 24 June 2008

Below is the full text to hack.worm.c from the source code of Hack 1.0. To link to a particular line, write [[Hack 1.0/hack.worm.c#line123]], for example.

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

Screenshots and source code from Hack are used under the CWI license.

1.    /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1984. */
2.    
3.    #include "hack.h"
4.    #ifndef NOWORM
5.    #include "def.wseg.h"
6.    
7.    struct wseg *wsegs[32];	/* linked list, tail first */
8.    struct wseg *wheads[32];
9.    long wgrowtime[32];
10.   
11.   getwn(mtmp) struct monst *mtmp; {
12.   register tmp;
13.   	for(tmp=1; tmp<32; tmp++) if(!wsegs[tmp]) {
14.   		mtmp->wormno = tmp;
15.   		return(1);
16.   	}
17.    return(0);	/* level infested with worms */
18.   }
19.   
20.   /* called to initialize a worm unless cut in half */
21.   initworm(mtmp) struct monst *mtmp; {
22.   register struct wseg *wtmp;
23.   register tmp = mtmp->wormno;
24.   	if(!tmp) return;
25.   	wheads[tmp] = wsegs[tmp] = wtmp = newseg();
26.   	wgrowtime[tmp] = 0;
27.   	wtmp->wx = mtmp->mx;
28.   	wtmp->wy = mtmp->my;
29.   /*	wtmp->wdispl = 0;*/
30.   	wtmp->nseg = 0;
31.   }
32.   
33.   worm_move(mtmp) struct monst *mtmp; {
34.   register struct wseg *wtmp, *whd;
35.   register tmp = mtmp->wormno;
36.   	wtmp = newseg();
37.   	wtmp->wx = mtmp->mx;
38.   	wtmp->wy = mtmp->my;
39.   	wtmp->nseg = 0;
40.   /*	wtmp->wdispl = 0;*/
41.   	(whd = wheads[tmp])->nseg = wtmp;
42.   	wheads[tmp] = wtmp;
43.   	if(cansee(whd->wx,whd->wy)){
44.   		unpmon(mtmp);
45.   		atl(whd->wx, whd->wy, '~');
46.   		whd->wdispl = 1;
47.   	} else	whd->wdispl = 0;
48.   	if(wgrowtime[tmp] <= moves) {
49.   		if(!wgrowtime[tmp]) wgrowtime[tmp] = moves + rnd(5);
50.   		else wgrowtime[tmp] += 2+rnd(15);
51.   		mtmp->orig_hp++;
52.   		mtmp->mhp++;
53.   		return;
54.   	}
55.   	whd = wsegs[tmp];
56.   	wsegs[tmp] = whd->nseg;
57.   	remseg(whd);
58.   }
59.   
60.   worm_nomove(mtmp) register struct monst *mtmp; {
61.   register tmp;
62.   register struct wseg *wtmp;
63.   	tmp = mtmp->wormno;
64.   	wtmp = wsegs[tmp];
65.   	if(wtmp == wheads[tmp]) return;
66.   	if(wtmp == 0 || wtmp->nseg == 0) panic("worm_nomove?");
67.   	wsegs[tmp] = wtmp->nseg;
68.   	remseg(wtmp);
69.   	mtmp->mhp--;	/* orig_hp not changed ! */
70.   }
71.   
72.   wormdead(mtmp) register struct monst *mtmp; {
73.   register tmp = mtmp->wormno;
74.   register struct wseg *wtmp, *wtmp2;
75.   	if(!tmp) return;
76.   	mtmp->wormno = 0;
77.   	for(wtmp = wsegs[tmp]; wtmp; wtmp = wtmp2){
78.   		wtmp2 = wtmp->nseg;
79.   		remseg(wtmp);
80.   	}
81.    wsegs[tmp] = 0;
82.   }
83.   
84.   wormhit(mtmp) register struct monst *mtmp; {
85.   register tmp = mtmp->wormno;
86.   register struct wseg *wtmp;
87.   	if(!tmp) return;	/* worm without tail */
88.   	for(wtmp = wsegs[tmp]; wtmp; wtmp = wtmp->nseg)
89.   		(void) hitu(mtmp,1);
90.   }
91.   
92.   wormsee(tmp) register unsigned tmp; {
93.   register struct wseg *wtmp = wsegs[tmp];
94.   	if(!wtmp) panic("wormsee: wtmp==0");
95.   	for(; wtmp->nseg; wtmp = wtmp->nseg)
96.   		if(!cansee(wtmp->wx,wtmp->wy) && wtmp->wdispl){
97.   			newsym(wtmp->wx, wtmp->wy);
98.   			wtmp->wdispl = 0;
99.   		}
100.  }
101.  
102.  pwseg(wtmp) register struct wseg *wtmp; {
103.  	if(!wtmp->wdispl){
104.  		atl(wtmp->wx, wtmp->wy, '~');
105.  		wtmp->wdispl = 1;
106.  	}
107.  }
108.  
109.  cutworm(mtmp,x,y,weptyp)
110.  register struct monst *mtmp;
111.  register xchar x,y;
112.  register uchar weptyp;		/* uwep->otyp or 0 */
113.  {
114.  	register struct wseg *wtmp, *wtmp2;
115.  	register struct monst *mtmp2;
116.  	register tmp,tmp2;
117.  	if(mtmp->mx == x && mtmp->my == y) return;	/* hit headon */
118.  
119.  	/* cutting goes best with axe or sword */
120.  	tmp = rnd(20);
121.  	if(weptyp == LONG_SWORD || weptyp == TWO_HANDED_SWORD ||
122.  		weptyp == AXE) tmp += 5;
123.  	if(tmp < 12) return;
124.  
125.  	/* if tail then worm just loses a tail segment */
126.  	tmp = mtmp->wormno;
127.  	wtmp = wsegs[tmp];
128.  	if(wtmp->wx == x && wtmp->wy == y){
129.  		wsegs[tmp] = wtmp->nseg;
130.  		remseg(wtmp);
131.  		return;
132.  	}
133.  
134.  	/* cut the worm in two halves */
135.  	mtmp2 = newmonst(0);
136.  	*mtmp2 = *mtmp;
137.  	mtmp2->mxlth = mtmp2->mnamelth = 0;
138.  
139.  	/* sometimes the tail end dies */
140.  	if(rn2(3) || !getwn(mtmp2)){
141.  		monfree(mtmp2);
142.  		tmp2 = 0;
143.  	} else {
144.  		tmp2 = mtmp2->wormno;
145.  		wsegs[tmp2] = wsegs[tmp];
146.  		wgrowtime[tmp2] = 0;
147.  	}
148.  	do {
149.  		if(wtmp->nseg->wx == x && wtmp->nseg->wy == y){
150.  			if(tmp2) wheads[tmp2] = wtmp;
151.  			wsegs[tmp] = wtmp->nseg->nseg;
152.  			remseg(wtmp->nseg);
153.  			wtmp->nseg = 0;
154.  			if(tmp2){
155.  				pline("You cut the worm in half.");
156.  				mtmp2->orig_hp = mtmp2->mhp =
157.  					d(mtmp2->data->mlevel, 8);
158.  				mtmp2->mx = wtmp->wx;
159.  				mtmp2->my = wtmp->wy;
160.  				mtmp2->nmon = fmon;
161.  				fmon = mtmp2;
162.  				pmon(mtmp2);
163.  			} else {
164.  				pline("You cut off part of the worm's tail.");
165.  				remseg(wtmp);
166.  			}
167.  			mtmp->mhp /= 2;
168.  			return;
169.  		}
170.  		wtmp2 = wtmp->nseg;
171.  		if(!tmp2) remseg(wtmp);
172.  		wtmp = wtmp2;
173.  	} while(wtmp->nseg);
174.   panic("Cannot find worm segment");
175.  }
176.  
177.  remseg(wtmp) register struct wseg *wtmp; {
178.  	if(wtmp->wdispl)
179.  		newsym(wtmp->wx, wtmp->wy);
180.  	free((char *) wtmp);
181.  }
182.  #endif NOWORM