Difference between revisions of "Source:NetHack 1.4f/worm.c"

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

Latest revision as of 01:51, 4 March 2008

The source code file worm.c in NetHack 1.4f is unchanged from NetHack 1.3d/worm.c.