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

From NetHackWiki
Jump to navigation Jump to search
m (Automated source code upload)
 
 
(One intermediate revision by one other user not shown)
Line 1: Line 1:
Below is the full text to '''monmove.c''' from the [[NetHack 1.4f source code|source code]] of [[NetHack 1.4f]]. To link to a particular line, write [[NetHack 1.4f/monmove.c#line123|<nowiki>[[NetHack 1.4f/monmove.c#line123]]</nowiki>]], for example.
+
The source code file '''monmove.c''' in [[NetHack 1.4f source code|NetHack 1.4f]] is unchanged from [[NetHack 1.3d/monmove.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: @(#)monmove.c 1.3 87/07/14</span>
 
<span id="line2">2.    /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */</span>
 
<span id="line3">3.    /* monmove.c - version 1.0 */</span>
 
<span id="line4">4.    </span>
 
<span id="line5">5.    #include "hack.h"</span>
 
<span id="line6">6.    #include "mfndpos.h"</span>
 
<span id="line7">7.    #define NULL (char *) 0</span>
 
<span id="line8">8.    </span>
 
<span id="line9">9.    extern int warnlevel; /* defined in mon.c */</span>
 
<span id="line10">10.  </span>
 
<span id="line11">11.  dochugw(mtmp) register struct monst *mtmp; {</span>
 
<span id="line12">12.  register x = mtmp->mx;</span>
 
<span id="line13">13.  register y = mtmp->my;</span>
 
<span id="line14">14.  register d = dochug(mtmp);</span>
 
<span id="line15">15.  register dd;</span>
 
<span id="line16">16.  if(!d) /* monster still alive */</span>
 
<span id="line17">17.  if(Warning)</span>
 
<span id="line18">18.  if(!mtmp->mpeaceful)</span>
 
<span id="line19">19.  if(mtmp->data->mlevel > warnlevel)</span>
 
<span id="line20">20.  if((dd = dist(mtmp->mx,mtmp->my)) < dist(x,y))</span>
 
<span id="line21">21.  if(dd < 100)</span>
 
<span id="line22">22.  if(!canseemon(mtmp))</span>
 
<span id="line23">23.  warnlevel = mtmp->data->mlevel;</span>
 
<span id="line24">24.  return(d);</span>
 
<span id="line25">25.  }</span>
 
<span id="line26">26.  </span>
 
<span id="line27">27.  /* returns 1 if monster died moving, 0 otherwise */</span>
 
<span id="line28">28.  dochug(mtmp)</span>
 
<span id="line29">29.  register struct monst *mtmp;</span>
 
<span id="line30">30.  {</span>
 
<span id="line31">31.  register struct permonst *mdat;</span>
 
<span id="line32">32.  register tmp, nearby, scared, onscary;</span>
 
<span id="line33">33.  </span>
 
<span id="line34">34.  if(mtmp->cham && !rn2(6))</span>
 
<span id="line35">35.  (void) newcham(mtmp, &mons[dlevel+14+rn2(CMNUM-14-dlevel)]);</span>
 
<span id="line36">36.  mdat = mtmp->data;</span>
 
<span id="line37">37.  if(mdat->mlevel < 0)</span>
 
<span id="line38">38.  panic("bad monster %c (%d)",mdat->mlet,mdat->mlevel);</span>
 
<span id="line39">39.  </span>
 
<span id="line40">40.  /* regenerate monsters */</span>
 
<span id="line41">41.  if((!(moves%20) || index(MREGEN, mdat->mlet)) &&</span>
 
<span id="line42">42.      mtmp->mhp < mtmp->mhpmax)</span>
 
<span id="line43">43.  mtmp->mhp++;</span>
 
<span id="line44">44.  </span>
 
<span id="line45">45.  if(mtmp->mfroz) {</span>
 
<span id="line46">46.  if (Hallucination) pmon(mtmp);</span>
 
<span id="line47">47.  return(0); /* frozen monsters don't do anything */</span>
 
<span id="line48">48.  }</span>
 
<span id="line49">49.  </span>
 
<span id="line50">50.  if(mtmp->msleep) /* there is a chance we will wake it */</span>
 
<span id="line51">51.  if(!disturb(mtmp)) return(0);</span>
 
<span id="line52">52.  </span>
 
<span id="line53">53.  /* not frozen or sleeping: wipe out texts written in the dust */</span>
 
<span id="line54">54.  wipe_engr_at(mtmp->mx, mtmp->my, 1);</span>
 
<span id="line55">55.  </span>
 
<span id="line56">56.  /* confused monsters get unconfused with small probability */</span>
 
<span id="line57">57.  if(mtmp->mconf && !rn2(50)) mtmp->mconf = 0;</span>
 
<span id="line58">58.  </span>
 
<span id="line59">59.  /* some monsters teleport */</span>
 
<span id="line60">60.  if(mtmp->mflee && index("tNL", mdat->mlet) && !rn2(40)){</span>
 
<span id="line61">61.  rloc(mtmp);</span>
 
<span id="line62">62.  return(0);</span>
 
<span id="line63">63.  }</span>
 
<span id="line64">64.  if(mdat->mmove < rnd(6)) return(0);</span>
 
<span id="line65">65.  </span>
 
<span id="line66">66.  /* fleeing monsters might regain courage */</span>
 
<span id="line67">67.  if(mtmp->mflee && !mtmp->mfleetim</span>
 
<span id="line68">68.      && mtmp->mhp == mtmp->mhpmax && !rn2(25))</span>
 
<span id="line69">69.  mtmp->mflee = 0;</span>
 
<span id="line70">70.  </span>
 
<span id="line71">71.  nearby = (dist(mtmp->mx, mtmp->my) < 3);</span>
 
<span id="line72">72.  onscary = (sengr_at("Elbereth", u.ux, u.uy) ||</span>
 
<span id="line73">73.  sobj_at(SCR_SCARE_MONSTER, u.ux, u.uy));</span>
 
<span id="line74">74.  scared = (nearby && onscary && !mtmp->mtame && mtmp->mcansee);</span>
 
<span id="line75">75.  if(scared && !mtmp->mflee) {</span>
 
<span id="line76">76.  mtmp->mflee = 1;</span>
 
<span id="line77">77.  mtmp->mfleetim = (rn2(7) ? rnd(10) : rnd(100));</span>
 
<span id="line78">78.  }</span>
 
<span id="line79">79.  </span>
 
<span id="line80">80.  if(!nearby ||</span>
 
<span id="line81">81.  mtmp->mflee || scared ||</span>
 
<span id="line82">82.  mtmp->mconf ||</span>
 
<span id="line83">83.  (mtmp->minvis && !rn2(3)) ||</span>
 
<span id="line84">84.  #ifndef KOPS</span>
 
<span id="line85">85.  (index("BIuy", mdat->mlet) && !rn2(4)) ||</span>
 
<span id="line86">86.  #else</span>
 
<span id="line87">87.  (index("KBIuy", mdat->mlet) && !rn2(4)) ||</span>
 
<span id="line88">88.  #endif</span>
 
<span id="line89">89.  (mdat->mlet == 'L' && !u.ugold && (mtmp->mgold || rn2(2))) ||</span>
 
<span id="line90">90.  (!mtmp->mcansee && !rn2(4)) ||</span>
 
<span id="line91">91.  mtmp->mpeaceful</span>
 
<span id="line92">92.    ) {</span>
 
<span id="line93">93.  tmp = m_move(mtmp,0); /* 2: monster died moving */</span>
 
<span id="line94">94.  if(tmp == 2 || (tmp && mdat->mmove <= 12))</span>
 
<span id="line95">95.  return(tmp == 2);</span>
 
<span id="line96">96.  </span>
 
<span id="line97">97.  if(Hallucination && tmp==0) pmon(mtmp);</span>
 
<span id="line98">98.  /* If 0, this means the monster didn't move.  During hallucination, its</span>
 
<span id="line99">99.      appearance should still change. */</span>
 
<span id="line100">100.  </span>
 
<span id="line101">101.  #ifdef HARD</span>
 
<span id="line102">102.  /* Without this line, fast monsters don't hit you when they've</span>
 
<span id="line103">103.  * caught up to you. -dgk</span>
 
<span id="line104">104.  */</span>
 
<span id="line105">105.  nearby = (dist(mtmp->mx, mtmp->my) < 3);</span>
 
<span id="line106">106.  scared = (nearby && onscary);</span>
 
<span id="line107">107.  if(scared && !mtmp->mflee) {</span>
 
<span id="line108">108.  mtmp->mflee = 1;</span>
 
<span id="line109">109.  mtmp->mfleetim = (rn2(7) ? rnd(10) : rnd(100));</span>
 
<span id="line110">110.  }</span>
 
<span id="line111">111.  #endif</span>
 
<span id="line112">112.  }</span>
 
<span id="line113">113.  #ifdef HARD /* Demonic Blackmail!!! */</span>
 
<span id="line114">114.  if(mdat->mlet == '&' && mtmp->mpeaceful && !mtmp->mtame)</span>
 
<span id="line115">115.  if(demon_talk(mtmp))</span>
 
<span id="line116">116.  return(1); /* you paid it off */</span>
 
<span id="line117">117.  #endif</span>
 
<span id="line118">118.  if(!index("Ea", mdat->mlet) && nearby &&</span>
 
<span id="line119">119.  !mtmp->mpeaceful && u.uhp > 0 && !scared) {</span>
 
<span id="line120">120.  if(mhitu(mtmp))</span>
 
<span id="line121">121.  return(1); /* monster died (e.g. 'y' or 'F') */</span>
 
<span id="line122">122.  }</span>
 
<span id="line123">123.  /* extra movement for fast monsters */</span>
 
<span id="line124">124.  if(mdat->mmove-12 > rnd(12)) tmp = m_move(mtmp,1);</span>
 
<span id="line125">125.  return(tmp == 2);</span>
 
<span id="line126">126.  }</span>
 
<span id="line127">127.  </span>
 
<span id="line128">128.  m_move(mtmp,after)</span>
 
<span id="line129">129.  register struct monst *mtmp;</span>
 
<span id="line130">130.  {</span>
 
<span id="line131">131.  #ifndef REGBUG</span>
 
<span id="line132">132.  register</span>
 
<span id="line133">133.  #endif</span>
 
<span id="line134">134.  struct monst *mtmp2;</span>
 
<span id="line135">135.  #ifndef REGBUG</span>
 
<span id="line136">136.  register</span>
 
<span id="line137">137.  #endif</span>
 
<span id="line138">138.  int nx,ny,omx,omy,appr,nearer,cnt,i,j;</span>
 
<span id="line139">139.  xchar gx,gy,nix,niy,chcnt;</span>
 
<span id="line140">140.  schar chi;</span>
 
<span id="line141">141.  boolean likegold, likegems, likeobjs;</span>
 
<span id="line142">142.  #ifdef KAA</span>
 
<span id="line143">143.  boolean likerock;</span>
 
<span id="line144">144.  #endif</span>
 
<span id="line145">145.  char msym = mtmp->data->mlet;</span>
 
<span id="line146">146.  schar mmoved = 0; /* not strictly nec.: chi >= 0 will do */</span>
 
<span id="line147">147.  coord poss[9];</span>
 
<span id="line148">148.  long info[9];</span>
 
<span id="line149">149.  </span>
 
<span id="line150">150.  if(mtmp->mfroz || mtmp->msleep)</span>
 
<span id="line151">151.  return(0);</span>
 
<span id="line152">152.  if(mtmp->mtrapped) {</span>
 
<span id="line153">153.  i = mintrap(mtmp);</span>
 
<span id="line154">154.  if(i == 2) return(2); /* he died */</span>
 
<span id="line155">155.  if(i == 1) return(0); /* still in trap, so didnt move */</span>
 
<span id="line156">156.  }</span>
 
<span id="line157">157.  if(mtmp->mhide && o_at(mtmp->mx,mtmp->my) && rn2(10))</span>
 
<span id="line158">158.  return(0); /* do not leave hiding place */</span>
 
<span id="line159">159.  </span>
 
<span id="line160">160.  #ifndef NOWORM</span>
 
<span id="line161">161.  if(mtmp->wormno)</span>
 
<span id="line162">162.  goto not_special;</span>
 
<span id="line163">163.  #endif</span>
 
<span id="line164">164.  </span>
 
<span id="line165">165.  /* my dog gets a special treatment */</span>
 
<span id="line166">166.  if(mtmp->mtame) {</span>
 
<span id="line167">167.  return( dog_move(mtmp, after) );</span>
 
<span id="line168">168.  }</span>
 
<span id="line169">169.  </span>
 
<span id="line170">170.  /* likewise for shopkeeper */</span>
 
<span id="line171">171.  if(mtmp->isshk) {</span>
 
<span id="line172">172.  mmoved = shk_move(mtmp);</span>
 
<span id="line173">173.  if(mmoved >= 0)</span>
 
<span id="line174">174.  goto postmov;</span>
 
<span id="line175">175.  mmoved = 0; /* follow player outside shop */</span>
 
<span id="line176">176.  }</span>
 
<span id="line177">177.  </span>
 
<span id="line178">178.  /* and for the guard */</span>
 
<span id="line179">179.  if(mtmp->isgd) {</span>
 
<span id="line180">180.  mmoved = gd_move();</span>
 
<span id="line181">181.  goto postmov;</span>
 
<span id="line182">182.  }</span>
 
<span id="line183">183.  </span>
 
<span id="line184">184.  /* teleport if that lies in our nature ('t') or when badly wounded ('1') */</span>
 
<span id="line185">185.  if((msym == 't' && !rn2(5))</span>
 
<span id="line186">186.  || (msym == '1' && (mtmp->mhp < 7 || (!xdnstair && !rn2(5))</span>
 
<span id="line187">187.  || levl[u.ux][u.uy].typ == STAIRS))) {</span>
 
<span id="line188">188.  if(mtmp->mhp < 7 || (msym == 't' && rn2(2)))</span>
 
<span id="line189">189.  rloc(mtmp);</span>
 
<span id="line190">190.  else</span>
 
<span id="line191">191.  mnexto(mtmp);</span>
 
<span id="line192">192.  mmoved = 1;</span>
 
<span id="line193">193.  goto postmov;</span>
 
<span id="line194">194.  }</span>
 
<span id="line195">195.  </span>
 
<span id="line196">196.  /* spit fire ('D') or use a wand ('1') when appropriate */</span>
 
<span id="line197">197.  #ifdef DGKMOD</span>
 
<span id="line198">198.  /* Add arrow and bolt throwing monsters */</span>
 
<span id="line199">199.  if (index(</span>
 
<span id="line200">200.  # ifdef KAA</span>
 
<span id="line201">201.  #  ifdef KOPS</span>
 
<span id="line202">202.  "D1OKC9",</span>
 
<span id="line203">203.  #  else</span>
 
<span id="line204">204.  "D1KC9",</span>
 
<span id="line205">205.  #  endif</span>
 
<span id="line206">206.  # else</span>
 
<span id="line207">207.  #  ifdef KOPS</span>
 
<span id="line208">208.  "D1OKC",</span>
 
<span id="line209">209.  #  else</span>
 
<span id="line210">210.  "D1KC",</span>
 
<span id="line211">211.  #  endif</span>
 
<span id="line212">212.  # endif</span>
 
<span id="line213">213.    msym)) </span>
 
<span id="line214">214.  </span>
 
<span id="line215">215.  if (!inrange(mtmp)) /* inrange returns 1 if OK for mon */</span>
 
<span id="line216">216.  return(0); /* to move after it zaps or throws */</span>
 
<span id="line217">217.  #else</span>
 
<span id="line218">218.  if(index("D1", msym))</span>
 
<span id="line219">219.  inrange(mtmp);</span>
 
<span id="line220">220.  #endif</span>
 
<span id="line221">221.  </span>
 
<span id="line222">222.  if(msym == 'U' && !mtmp->mcan && canseemon(mtmp) &&</span>
 
<span id="line223">223.      mtmp->mcansee && rn2(5)) {</span>
 
<span id="line224">224.  if(!Confusion)</span>
 
<span id="line225">225.  pline("%s's gaze has confused you!", Monnam(mtmp));</span>
 
<span id="line226">226.  else</span>
 
<span id="line227">227.  pline("You are getting more and more confused.");</span>
 
<span id="line228">228.  if(rn2(3)) mtmp->mcan = 1;</span>
 
<span id="line229">229.  HConfusion += d(3,4); /* timeout */</span>
 
<span id="line230">230.  }</span>
 
<span id="line231">231.  not_special:</span>
 
<span id="line232">232.  if(!mtmp->mflee && u.uswallow && u.ustuck != mtmp) return(1);</span>
 
<span id="line233">233.  appr = 1;</span>
 
<span id="line234">234.  if(mtmp->mflee) appr = -1;</span>
 
<span id="line235">235.  if(mtmp->mconf || Invis ||  !mtmp->mcansee ||</span>
 
<span id="line236">236.  (index("BIy", msym) && !rn2(3)))</span>
 
<span id="line237">237.  appr = 0;</span>
 
<span id="line238">238.  omx = mtmp->mx;</span>
 
<span id="line239">239.  omy = mtmp->my;</span>
 
<span id="line240">240.  gx = u.ux;</span>
 
<span id="line241">241.  gy = u.uy;</span>
 
<span id="line242">242.  if(msym == 'L' && appr == 1 && mtmp->mgold > u.ugold)</span>
 
<span id="line243">243.  appr = -1;</span>
 
<span id="line244">244.  </span>
 
<span id="line245">245.  /* random criterion for 'smell' or track finding ability</span>
 
<span id="line246">246.    should use mtmp->msmell or sth</span>
 
<span id="line247">247.  */</span>
 
<span id="line248">248.  if(msym == '@' ||</span>
 
<span id="line249">249.    ('a' <= msym && msym <= 'z')) {</span>
 
<span id="line250">250.  extern coord *gettrack();</span>
 
<span id="line251">251.  register coord *cp;</span>
 
<span id="line252">252.  schar mroom;</span>
 
<span id="line253">253.  mroom = inroom(omx,omy);</span>
 
<span id="line254">254.  if(mroom < 0 || mroom != inroom(u.ux,u.uy)){</span>
 
<span id="line255">255.      cp = gettrack(omx,omy);</span>
 
<span id="line256">256.      if(cp){</span>
 
<span id="line257">257.  gx = cp->x;</span>
 
<span id="line258">258.  gy = cp->y;</span>
 
<span id="line259">259.      }</span>
 
<span id="line260">260.  }</span>
 
<span id="line261">261.  }</span>
 
<span id="line262">262.  </span>
 
<span id="line263">263.  /* look for gold or jewels nearby */</span>
 
<span id="line264">264.  #ifdef ROCKMOLE</span>
 
<span id="line265">265.  likegold = (index("LODr", msym) != NULL);</span>
 
<span id="line266">266.  likegems = (index("ODu", msym) != NULL);</span>
 
<span id="line267">267.  likeobjs = (mtmp->mhide || msym == 'r');</span>
 
<span id="line268">268.  #else</span>
 
<span id="line269">269.  likegold = (index("LOD", msym) != NULL);</span>
 
<span id="line270">270.  likegems = (index("ODu", msym) != NULL);</span>
 
<span id="line271">271.  likeobjs = mtmp->mhide;</span>
 
<span id="line272">272.  #endif</span>
 
<span id="line273">273.  #ifdef KAA</span>
 
<span id="line274">274.  likerock = (msym == '9');</span>
 
<span id="line275">275.  #endif</span>
 
<span id="line276">276.  #define SRCHRADIUS 25</span>
 
<span id="line277">277.  { xchar mind = SRCHRADIUS; /* not too far away */</span>
 
<span id="line278">278.    register int dd;</span>
 
<span id="line279">279.    if(likegold){</span>
 
<span id="line280">280.  register struct gold *gold;</span>
 
<span id="line281">281.  for(gold = fgold; gold; gold = gold->ngold)</span>
 
<span id="line282">282.    if((dd = DIST(omx,omy,gold->gx,gold->gy)) < mind){</span>
 
<span id="line283">283.      mind = dd;</span>
 
<span id="line284">284.      gx = gold->gx;</span>
 
<span id="line285">285.      gy = gold->gy;</span>
 
<span id="line286">286.  }</span>
 
<span id="line287">287.    }</span>
 
<span id="line288">288.    if(likegems || likeobjs</span>
 
<span id="line289">289.  #ifdef KAA</span>
 
<span id="line290">290.    || likerock</span>
 
<span id="line291">291.  #endif</span>
 
<span id="line292">292.      )  {</span>
 
<span id="line293">293.  register struct obj *otmp;</span>
 
<span id="line294">294.  for(otmp = fobj; otmp; otmp = otmp->nobj)</span>
 
<span id="line295">295.  if(likeobjs</span>
 
<span id="line296">296.    || (likegems && otmp->olet == GEM_SYM)</span>
 
<span id="line297">297.  #ifdef KAA</span>
 
<span id="line298">298.    || (likerock && otmp->olet == ROCK_SYM)</span>
 
<span id="line299">299.  #endif</span>
 
<span id="line300">300.  )  {</span>
 
<span id="line301">301.  if(msym != 'u' || objects[otmp->otyp].g_val != 0)</span>
 
<span id="line302">302.      if((dd = DIST(omx,omy,otmp->ox,otmp->oy)) < mind){</span>
 
<span id="line303">303.  mind = dd;</span>
 
<span id="line304">304.  gx = otmp->ox;</span>
 
<span id="line305">305.  gy = otmp->oy;</span>
 
<span id="line306">306.      }</span>
 
<span id="line307">307.  }</span>
 
<span id="line308">308.      }</span>
 
<span id="line309">309.    if(mind < SRCHRADIUS && appr == -1) {</span>
 
<span id="line310">310.  if(dist(omx,omy) < 10) {</span>
 
<span id="line311">311.      gx = u.ux;</span>
 
<span id="line312">312.      gy = u.uy;</span>
 
<span id="line313">313.  } else</span>
 
<span id="line314">314.      appr = 1;</span>
 
<span id="line315">315.    }</span>
 
<span id="line316">316.  }</span>
 
<span id="line317">317.  nix = omx;</span>
 
<span id="line318">318.  niy = omy;</span>
 
<span id="line319">319.  cnt = mfndpos(mtmp,poss,info,</span>
 
<span id="line320">320.  msym == 'u' ? NOTONL :</span>
 
<span id="line321">321.  #ifdef ROCKMOLE</span>
 
<span id="line322">322.  msym == 'r' ? ALLOW_WALL :</span>
 
<span id="line323">323.  #endif</span>
 
<span id="line324">324.  (msym == '@' || msym == '1') ? (ALLOW_SSM | ALLOW_TRAPS) :</span>
 
<span id="line325">325.  index(UNDEAD, msym) ? NOGARLIC :</span>
 
<span id="line326">326.  #ifdef KAA</span>
 
<span id="line327">327.      (msym == '9') ? (ALLOW_ROCK | ALLOW_TRAPS) : ALLOW_TRAPS);</span>
 
<span id="line328">328.  #else</span>
 
<span id="line329">329.      ALLOW_TRAPS);</span>
 
<span id="line330">330.  #endif</span>
 
<span id="line331">331.  chcnt = 0;</span>
 
<span id="line332">332.  chi = -1;</span>
 
<span id="line333">333.  for(i=0; i<cnt; i++) {</span>
 
<span id="line334">334.  nx = poss[i].x;</span>
 
<span id="line335">335.  ny = poss[i].y;</span>
 
<span id="line336">336.  for(j=0; j<MTSZ && j<cnt-1; j++)</span>
 
<span id="line337">337.  if(nx == mtmp->mtrack[j].x && ny == mtmp->mtrack[j].y)</span>
 
<span id="line338">338.  if(rn2(4*(cnt-j))) goto nxti;</span>
 
<span id="line339">339.  #ifdef STUPID</span>
 
<span id="line340">340.  /* some stupid compilers think that this is too complicated */</span>
 
<span id="line341">341.  { int d1 = DIST(nx,ny,gx,gy);</span>
 
<span id="line342">342.    int d2 = DIST(nix,niy,gx,gy);</span>
 
<span id="line343">343.    nearer = (d1 < d2);</span>
 
<span id="line344">344.  }</span>
 
<span id="line345">345.  #else</span>
 
<span id="line346">346.  nearer = (DIST(nx,ny,gx,gy) < DIST(nix,niy,gx,gy));</span>
 
<span id="line347">347.  #endif</span>
 
<span id="line348">348.  if((appr == 1 && nearer) || (appr == -1 && !nearer) ||</span>
 
<span id="line349">349.  !mmoved ||</span>
 
<span id="line350">350.  (!appr && !rn2(++chcnt))){</span>
 
<span id="line351">351.  nix = nx;</span>
 
<span id="line352">352.  niy = ny;</span>
 
<span id="line353">353.  chi = i;</span>
 
<span id="line354">354.  mmoved = 1;</span>
 
<span id="line355">355.  }</span>
 
<span id="line356">356.  nxti: ;</span>
 
<span id="line357">357.  }</span>
 
<span id="line358">358.  if(mmoved){</span>
 
<span id="line359">359.  if(info[chi] & ALLOW_M){</span>
 
<span id="line360">360.  mtmp2 = m_at(nix,niy);</span>
 
<span id="line361">361.  if(hitmm(mtmp,mtmp2) == 1 && rn2(4) &&</span>
 
<span id="line362">362.    hitmm(mtmp2,mtmp) == 2) return(2);</span>
 
<span id="line363">363.  return(0);</span>
 
<span id="line364">364.  }</span>
 
<span id="line365">365.  if(info[chi] & ALLOW_U){</span>
 
<span id="line366">366.    (void) hitu(mtmp, d(mtmp->data->damn, mtmp->data->damd)+1);</span>
 
<span id="line367">367.    return(0);</span>
 
<span id="line368">368.  }</span>
 
<span id="line369">369.  mtmp->mx = nix;</span>
 
<span id="line370">370.  mtmp->my = niy;</span>
 
<span id="line371">371.  for(j=MTSZ-1; j>0; j--) mtmp->mtrack[j] = mtmp->mtrack[j-1];</span>
 
<span id="line372">372.  mtmp->mtrack[0].x = omx;</span>
 
<span id="line373">373.  mtmp->mtrack[0].y = omy;</span>
 
<span id="line374">374.  #ifndef NOWORM</span>
 
<span id="line375">375.  if(mtmp->wormno) worm_move(mtmp);</span>
 
<span id="line376">376.  #endif</span>
 
<span id="line377">377.  } else {</span>
 
<span id="line378">378.  if(msym == 'u' && rn2(2)){</span>
 
<span id="line379">379.  rloc(mtmp);</span>
 
<span id="line380">380.  return(0);</span>
 
<span id="line381">381.  }</span>
 
<span id="line382">382.  #ifndef NOWORM</span>
 
<span id="line383">383.  if(mtmp->wormno) worm_nomove(mtmp);</span>
 
<span id="line384">384.  #endif</span>
 
<span id="line385">385.  }</span>
 
<span id="line386">386.  postmov:</span>
 
<span id="line387">387.  if(mmoved == 1) {</span>
 
<span id="line388">388.  if(mintrap(mtmp) == 2) /* he died */</span>
 
<span id="line389">389.  return(2);</span>
 
<span id="line390">390.  #ifdef ROCKMOLE</span>
 
<span id="line391">391.        /* Maybe a rock mole just ate something? */</span>
 
<span id="line392">392.        if(msym == 'r' && IS_ROCK(levl[mtmp->mx][mtmp->my].typ) &&</span>
 
<span id="line393">393.    levl[mtmp->mx][mtmp->my].typ != POOL){</span>
 
<span id="line394">394.    register int pile = rnd(25);</span>
 
<span id="line395">395.    /* Just ate something. */</span>
 
<span id="line396">396.    if(levl[mtmp->mx][mtmp->my].typ == 0)</span>
 
<span id="line397">397.      levl[mtmp->mx][mtmp->my].typ = CORR;</span>
 
<span id="line398">398.    else if(IS_WALL(levl[mtmp->mx][mtmp->my].typ))</span>
 
<span id="line399">399.      levl[mtmp->mx][mtmp->my].typ = DOOR;</span>
 
<span id="line400">400.    mnewsym(mtmp->mx,mtmp->my);</span>
 
<span id="line401">401.    /* Left behind a pile? */</span>
 
<span id="line402">402.    if(pile < 5) {</span>
 
<span id="line403">403.        if(pile == 1)</span>
 
<span id="line404">404.  mksobj_at(ENORMOUS_ROCK, mtmp->mx, mtmp->my);</span>
 
<span id="line405">405.        else</span>
 
<span id="line406">406.  mksobj_at(ROCK, mtmp->mx, mtmp->my);</span>
 
<span id="line407">407.    }</span>
 
<span id="line408">408.    if(cansee(mtmp->mx, mtmp->my))</span>
 
<span id="line409">409.      atl(mtmp->mx,mtmp->my,fobj->olet);</span>
 
<span id="line410">410.        }</span>
 
<span id="line411">411.        /* Maybe a rock mole just ate some gold or armor? */</span>
 
<span id="line412">412.        if(msym == 'r') meatgold(mtmp);</span>
 
<span id="line413">413.  #endif /* ROCKMOLE /**/</span>
 
<span id="line414">414.  if(likegold) mpickgold(mtmp);</span>
 
<span id="line415">415.  #ifdef KAA</span>
 
<span id="line416">416.  if(likerock || likegems) mpickgems(mtmp);</span>
 
<span id="line417">417.  #else</span>
 
<span id="line418">418.  if(likegems) mpickgems(mtmp);</span>
 
<span id="line419">419.  #endif</span>
 
<span id="line420">420.  if(mtmp->mhide) mtmp->mundetected = 1;</span>
 
<span id="line421">421.  }</span>
 
<span id="line422">422.  pmon(mtmp);</span>
 
<span id="line423">423.  return(mmoved);</span>
 
<span id="line424">424.  }</span>
 
<span id="line425">425.  </span>
 
[[Category:NetHack 1.4f source code|monmove.c]]
 

Latest revision as of 01:14, 4 March 2008

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