Difference between revisions of "Source:NetHack 1.4f/dothrow.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 '''dothrow.c''' from the [[NetHack 1.4f source code|source code]] of [[NetHack 1.4f]]. To link to a particular line, write [[NetHack 1.4f/dothrow.c#line123|<nowiki>[[NetHack 1.4f/dothrow.c#line123]]</nowiki>]], for example.
+
The source code file '''dothrow.c''' in [[NetHack 1.4f source code|NetHack 1.4f]] is unchanged from [[NetHack 1.3d/dothrow.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: @(#)dothrow.c 1.3 87/07/14</span>
 
<span id="line2">2.    /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */</span>
 
<span id="line3">3.    /* dothrow.c - version 1.0 */</span>
 
<span id="line4">4.    </span>
 
<span id="line5">5.    /* Contains code for 't' (throw) */</span>
 
<span id="line6">6.    </span>
 
<span id="line7">7.    #include "hack.h"</span>
 
<span id="line8">8.    </span>
 
<span id="line9">9.    extern struct obj *splitobj(), *addinv();</span>
 
<span id="line10">10.  extern boolean hmon();</span>
 
<span id="line11">11.  extern struct monst youmonst;</span>
 
<span id="line12">12.  extern char *Doname();</span>
 
<span id="line13">13.  #ifdef KAA</span>
 
<span id="line14">14.  extern char *xname();</span>
 
<span id="line15">15.  #endif</span>
 
<span id="line16">16.  </span>
 
<span id="line17">17.  struct monst *bhit(), *boomhit();</span>
 
<span id="line18">18.  dothrow()</span>
 
<span id="line19">19.  {</span>
 
<span id="line20">20.  register struct obj *obj;</span>
 
<span id="line21">21.  </span>
 
<span id="line22">22.  obj = getobj("#)", "throw");  /* it is also possible to throw food */</span>
 
<span id="line23">23.        /* (or jewels, or iron balls ... ) */</span>
 
<span id="line24">24.  if(!obj || !getdir(1))       /* ask "in what direction?" */</span>
 
<span id="line25">25.  return(0);</span>
 
<span id="line26">26.  if(obj->owornmask & (W_ARMOR | W_RING)){</span>
 
<span id="line27">27.  pline("You can't throw something you are wearing.");</span>
 
<span id="line28">28.  return(0);</span>
 
<span id="line29">29.  }</span>
 
<span id="line30">30.  #ifdef KAA</span>
 
<span id="line31">31.  if(obj->otyp == ENORMOUS_ROCK && u.usym != '9') {</span>
 
<span id="line32">32.  pline("It's too heavy.");</span>
 
<span id="line33">33.  return(1);</span>
 
<span id="line34">34.  }</span>
 
<span id="line35">35.  if(!u.dx && !u.dy && !u.dz) {</span>
 
<span id="line36">36.  pline("You cannot throw an object at yourself.");</span>
 
<span id="line37">37.  return(0);</span>
 
<span id="line38">38.  }</span>
 
<span id="line39">39.  #endif</span>
 
<span id="line40">40.  u_wipe_engr(2);</span>
 
<span id="line41">41.  </span>
 
<span id="line42">42.  if(obj == uwep){</span>
 
<span id="line43">43.  if(obj->cursed){</span>
 
<span id="line44">44.  pline("Your weapon is welded to your hand.");</span>
 
<span id="line45">45.  return(1);</span>
 
<span id="line46">46.  }</span>
 
<span id="line47">47.  if(obj->quan > 1)</span>
 
<span id="line48">48.  setuwep(splitobj(obj, 1));</span>
 
<span id="line49">49.  else</span>
 
<span id="line50">50.  setuwep((struct obj *) 0);</span>
 
<span id="line51">51.  }</span>
 
<span id="line52">52.  else if(obj->quan > 1)</span>
 
<span id="line53">53.  (void) splitobj(obj, 1);</span>
 
<span id="line54">54.  freeinv(obj);</span>
 
<span id="line55">55.  return(throwit(obj));</span>
 
<span id="line56">56.  }</span>
 
<span id="line57">57.  </span>
 
<span id="line58">58.  throwit(obj)</span>
 
<span id="line59">59.  register struct obj *obj;</span>
 
<span id="line60">60.  {</span>
 
<span id="line61">61.  register struct monst *mon;</span>
 
<span id="line62">62.  </span>
 
<span id="line63">63.  if(u.uswallow) {</span>
 
<span id="line64">64.  mon = u.ustuck;</span>
 
<span id="line65">65.  bhitpos.x = mon->mx;</span>
 
<span id="line66">66.  bhitpos.y = mon->my;</span>
 
<span id="line67">67.  } else if(u.dz) {</span>
 
<span id="line68">68.    if(u.dz < 0) {</span>
 
<span id="line69">69.      pline("%s hits the ceiling, then falls back on top of your head.",</span>
 
<span id="line70">70.  Doname(obj)); /* note: obj->quan == 1 */</span>
 
<span id="line71">71.      if(obj->olet == POTION_SYM)</span>
 
<span id="line72">72.  potionhit(&youmonst, obj);</span>
 
<span id="line73">73.      else {</span>
 
<span id="line74">74.  if(uarmh) pline("Fortunately, you are wearing a helmet!");</span>
 
<span id="line75">75.  losehp(uarmh ? 1 : rnd((int)(obj->owt)), "falling object");</span>
 
<span id="line76">76.  dropy(obj);</span>
 
<span id="line77">77.      }</span>
 
<span id="line78">78.    } else hitfloor(obj);</span>
 
<span id="line79">79.    return(1);</span>
 
<span id="line80">80.  </span>
 
<span id="line81">81.  } else if(obj->otyp == BOOMERANG) {</span>
 
<span id="line82">82.  mon = boomhit(u.dx, u.dy);</span>
 
<span id="line83">83.  if(mon == &youmonst) { /* the thing was caught */</span>
 
<span id="line84">84.  (void) addinv(obj);</span>
 
<span id="line85">85.  return(1);</span>
 
<span id="line86">86.  }</span>
 
<span id="line87">87.  } else {</span>
 
<span id="line88">88.  if(obj->otyp == PICK_AXE && shkcatch(obj))</span>
 
<span id="line89">89.      return(1);</span>
 
<span id="line90">90.  </span>
 
<span id="line91">91.  mon = bhit(u.dx, u.dy, (obj->otyp == ICE_BOX) ? 1 :</span>
 
<span id="line92">92.  (!Punished || obj != uball) ? 8 : !u.ustuck ? 5 : 1,</span>
 
<span id="line93">93.  obj->olet,</span>
 
<span id="line94">94.  (int (*)()) 0, (int (*)()) 0, obj);</span>
 
<span id="line95">95.  }</span>
 
<span id="line96">96.  if(mon) {</span>
 
<span id="line97">97.  /* awake monster if sleeping */</span>
 
<span id="line98">98.  wakeup(mon);</span>
 
<span id="line99">99.  if(thitmonst(mon, obj)) return(1);</span>
 
<span id="line100">100.  }</span>
 
<span id="line101">101.  if(!u.uswallow)  {</span>
 
<span id="line102">102.  /* the code following might become part of dropy() */</span>
 
<span id="line103">103.  if(obj->otyp == CRYSKNIFE)</span>
 
<span id="line104">104.  obj->otyp = WORM_TOOTH;</span>
 
<span id="line105">105.  obj->ox = bhitpos.x;</span>
 
<span id="line106">106.  obj->oy = bhitpos.y;</span>
 
<span id="line107">107.  obj->nobj = fobj;</span>
 
<span id="line108">108.  fobj = obj;</span>
 
<span id="line109">109.  /* prevent him from throwing articles to the exit and escaping */</span>
 
<span id="line110">110.  /* subfrombill(obj); */</span>
 
<span id="line111">111.  stackobj(obj);</span>
 
<span id="line112">112.  if(Punished && obj == uball &&</span>
 
<span id="line113">113.  (bhitpos.x != u.ux || bhitpos.y != u.uy)){</span>
 
<span id="line114">114.  freeobj(uchain);</span>
 
<span id="line115">115.  unpobj(uchain);</span>
 
<span id="line116">116.  if(u.utrap){</span>
 
<span id="line117">117.  if(u.utraptype == TT_PIT)</span>
 
<span id="line118">118.  pline("The ball pulls you out of the pit!");</span>
 
<span id="line119">119.  #ifdef SPIDERS</span>
 
<span id="line120">120.  else if(u.utraptype == TT_WEB)  {</span>
 
<span id="line121">121.  pline("The ball pulls you out of the web!");</span>
 
<span id="line122">122.  pline("The web is destroyed!");</span>
 
<span id="line123">123.  deltrap(t_at(u.ux,u.uy));</span>
 
<span id="line124">124.  }</span>
 
<span id="line125">125.  #endif</span>
 
<span id="line126">126.  else  {</span>
 
<span id="line127">127.  register long side =</span>
 
<span id="line128">128.  rn2(3) ? LEFT_SIDE : RIGHT_SIDE;</span>
 
<span id="line129">129.  pline("The ball pulls you out of the bear trap.");</span>
 
<span id="line130">130.  pline("Your %s leg is severely damaged.",</span>
 
<span id="line131">131.  (side == LEFT_SIDE) ? "left" : "right");                                set_wounded_legs(side, 500+rn2(1000));</span>
 
<span id="line132">132.  losehp(2, "thrown ball");</span>
 
<span id="line133">133.  }</span>
 
<span id="line134">134.  u.utrap = 0;</span>
 
<span id="line135">135.  }        </span>
 
<span id="line136">136.  unsee();</span>
 
<span id="line137">137.  uchain->nobj = fobj;</span>
 
<span id="line138">138.  fobj = uchain;</span>
 
<span id="line139">139.  u.ux = uchain->ox = bhitpos.x - u.dx;</span>
 
<span id="line140">140.  u.uy = uchain->oy = bhitpos.y - u.dy;</span>
 
<span id="line141">141.  setsee();</span>
 
<span id="line142">142.  (void) inshop();</span>
 
<span id="line143">143.  }</span>
 
<span id="line144">144.  if(cansee(bhitpos.x, bhitpos.y)) prl(bhitpos.x,bhitpos.y);</span>
 
<span id="line145">145.  }  else  </span>
 
<span id="line146">146.  mpickobj(u.ustuck,obj);</span>
 
<span id="line147">147.  return(1);</span>
 
<span id="line148">148.  }</span>
 
<span id="line149">149.  </span>
 
<span id="line150">150.  hitfloor(obj)</span>
 
<span id="line151">151.  register struct obj *obj;</span>
 
<span id="line152">152.  {</span>
 
<span id="line153">153.  pline("%s hits the floor.", Doname(obj));</span>
 
<span id="line154">154.  if(obj->otyp == EXPENSIVE_CAMERA) {</span>
 
<span id="line155">155.  pline("It is shattered in a thousand pieces!");</span>
 
<span id="line156">156.  obfree(obj, Null(obj));</span>
 
<span id="line157">157.  } else if(obj->otyp == EGG) {</span>
 
<span id="line158">158.  pline("\"Splash!\"");</span>
 
<span id="line159">159.  obfree(obj, Null(obj));</span>
 
<span id="line160">160.  #ifdef KAA</span>
 
<span id="line161">161.  } else if(obj->otyp == CREAM_PIE) {</span>
 
<span id="line162">162.  pline("What a mess!");</span>
 
<span id="line163">163.  obfree(obj, Null(obj));</span>
 
<span id="line164">164.  #endif</span>
 
<span id="line165">165.  } else if(obj->olet == POTION_SYM) {</span>
 
<span id="line166">166.  pline("The flask breaks, and you smell a peculiar odor ...");</span>
 
<span id="line167">167.  potionbreathe(obj);</span>
 
<span id="line168">168.  obfree(obj, Null(obj));</span>
 
<span id="line169">169.  } else</span>
 
<span id="line170">170.  dropy(obj);</span>
 
<span id="line171">171.  }</span>
 
<span id="line172">172.  </span>
 
<span id="line173">173.  thitmonst(mon, obj)</span>
 
<span id="line174">174.  register struct monst *mon;</span>
 
<span id="line175">175.  register struct obj  *obj;</span>
 
<span id="line176">176.  {</span>
 
<span id="line177">177.  register int tmp;</span>
 
<span id="line178">178.  </span>
 
<span id="line179">179.  if(obj->olet == WEAPON_SYM) {</span>
 
<span id="line180">180.  tmp = -1+u.ulevel+mon->data->ac+abon();</span>
 
<span id="line181">181.  if(obj->otyp < DART) {</span>
 
<span id="line182">182.  if(!uwep ||</span>
 
<span id="line183">183.      uwep->otyp != obj->otyp+(BOW-ARROW))</span>
 
<span id="line184">184.  tmp -= 4;</span>
 
<span id="line185">185.  else {</span>
 
<span id="line186">186.  tmp += uwep->spe;</span>
 
<span id="line187">187.  }</span>
 
<span id="line188">188.  } else</span>
 
<span id="line189">189.  if(obj->otyp == BOOMERANG) tmp += 4;</span>
 
<span id="line190">190.  tmp += obj->spe;</span>
 
<span id="line191">191.  if(u.uswallow || tmp >= rnd(20)) {</span>
 
<span id="line192">192.  if(hmon(mon,obj,1) == TRUE){</span>
 
<span id="line193">193.    /* mon still alive */</span>
 
<span id="line194">194.  #ifndef NOWORM</span>
 
<span id="line195">195.    cutworm(mon,bhitpos.x,bhitpos.y,obj->otyp);</span>
 
<span id="line196">196.  #endif</span>
 
<span id="line197">197.  } else mon = 0;</span>
 
<span id="line198">198.  /* weapons thrown disappear sometimes */</span>
 
<span id="line199">199.  if(obj->otyp < BOOMERANG && rn2(3)) {</span>
 
<span id="line200">200.  /* check bill; free */</span>
 
<span id="line201">201.  obfree(obj, (struct obj *) 0);</span>
 
<span id="line202">202.  return(1);</span>
 
<span id="line203">203.  }</span>
 
<span id="line204">204.  } else miss(objects[obj->otyp].oc_name, mon);</span>
 
<span id="line205">205.  } else if(obj->otyp == HEAVY_IRON_BALL) {</span>
 
<span id="line206">206.  tmp = -1+u.ulevel+mon->data->ac+abon();</span>
 
<span id="line207">207.  if(!Punished || obj != uball) tmp += 2;</span>
 
<span id="line208">208.  if(u.utrap) tmp -= 2;</span>
 
<span id="line209">209.  if(u.uswallow || tmp >= rnd(20)) {</span>
 
<span id="line210">210.  if(hmon(mon,obj,1) == FALSE)</span>
 
<span id="line211">211.  mon = 0; /* he died */</span>
 
<span id="line212">212.  } else miss("iron ball", mon);</span>
 
<span id="line213">213.  #ifdef KAA</span>
 
<span id="line214">214.  } else if (obj->otyp == ENORMOUS_ROCK) {</span>
 
<span id="line215">215.  tmp = 15+mon->data->ac;  /* Very likely to hit! */</span>
 
<span id="line216">216.  if (hmon(mon, obj, 1) == FALSE) mon=0;</span>
 
<span id="line217">217.  else miss("enormous rock",mon);</span>
 
<span id="line218">218.  } else if(obj->otyp == CREAM_PIE &&</span>
 
<span id="line219">219.  (u.ulevel > rn2(10)) || u.ustuck == mon) {</span>
 
<span id="line220">220.  pline("The cream pie splashes over %s%s!",monnam(mon),</span>
 
<span id="line221">221.  index("aEfgy",mon->data->mlet) ? "" : "'s face");</span>
 
<span id="line222">222.  obfree(obj, (struct obj *) 0);</span>
 
<span id="line223">223.  if(mon->msleep) mon->msleep = 0;</span>
 
<span id="line224">224.  setmangry(mon);</span>
 
<span id="line225">225.  mon->mcansee = 0;</span>
 
<span id="line226">226.  mon->mblinded += rnd(25);</span>
 
<span id="line227">227.  if (mon->mblinded <= 0) mon->mblinded = 127;</span>
 
<span id="line228">228.  return(1);</span>
 
<span id="line229">229.  #endif</span>
 
<span id="line230">230.  } else if(obj->olet == POTION_SYM && u.ulevel > rn2(15)) {</span>
 
<span id="line231">231.  potionhit(mon, obj);</span>
 
<span id="line232">232.  return(1);</span>
 
<span id="line233">233.  } else {</span>
 
<span id="line234">234.  pline("The %s misses %s.",xname(obj), </span>
 
<span id="line235">235.  cansee(bhitpos.x,bhitpos.y) ? monnam(mon) : "it");</span>
 
<span id="line236">236.  </span>
 
<span id="line237">237.  if(obj->olet == FOOD_SYM && mon->data->mlet == 'd')</span>
 
<span id="line238">238.  if(tamedog(mon,obj)) return(1);</span>
 
<span id="line239">239.  if(obj->olet == GEM_SYM && mon->data->mlet == 'u' &&</span>
 
<span id="line240">240.  !mon->mtame){</span>
 
<span id="line241">241.  char buf[BUFSZ];</span>
 
<span id="line242">242.  char *nogood = " is not interested in your junk.";</span>
 
<span id="line243">243.  char *addluck = " graciously accepts your gift.";</span>
 
<span id="line244">244.  </span>
 
<span id="line245">245.  strcpy(buf,Monnam(mon));</span>
 
<span id="line246">246.  </span>
 
<span id="line247">247.  if(obj->dknown &&</span>
 
<span id="line248">248.    objects[obj->otyp].oc_name_known)  {</span>
 
<span id="line249">249.  if(objects[obj->otyp].g_val > 0)  {</span>
 
<span id="line250">250.  u.uluck += 5;</span>
 
<span id="line251">251.  strcat(buf,addluck);</span>
 
<span id="line252">252.  }  else</span>
 
<span id="line253">253.  strcat(buf,nogood);</span>
 
<span id="line254">254.  }  else  {  /* value unknown to @ */</span>
 
<span id="line255">255.  u.uluck++;</span>
 
<span id="line256">256.  strcat(buf,addluck);</span>
 
<span id="line257">257.  }</span>
 
<span id="line258">258.  if(u.uluck > LUCKMAX)  /* dan@ut-ngp */</span>
 
<span id="line259">259.  u.uluck = LUCKMAX;</span>
 
<span id="line260">260.  pline(buf);</span>
 
<span id="line261">261.  mpickobj(mon, obj);</span>
 
<span id="line262">262.  rloc(mon);</span>
 
<span id="line263">263.  return(1);</span>
 
<span id="line264">264.  }</span>
 
<span id="line265">265.  }</span>
 
<span id="line266">266.  return(0);</span>
 
<span id="line267">267.  }</span>
 
[[Category:NetHack 1.4f source code|dothrow.c]]
 

Latest revision as of 00:54, 4 March 2008

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