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

From NetHackWiki
Jump to navigation Jump to search
m (Automated source code upload)
 
m (Semi-redirect to 1.3d versions)
Line 1: Line 1:
Below is the full text to '''objnam.c''' from the [[NetHack 1.4f source code|source code]] of [[NetHack 1.4f]]. To link to a particular line, write [[NetHack 1.4f/objnam.c#line123|<nowiki>[[NetHack 1.4f/objnam.c#line123]]</nowiki>]], for example.
+
The source code file '''objnam.c''' in [[NetHack 1.4f source code|NetHack 1.4f]] is unchanged from [[NetHack 1.3d/objnam.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: @(#)objnam.c 1.3 87/07/14</span>
 
<span id="line2">2.    /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */</span>
 
<span id="line3">3.    /* objnam.c - version 1.0.2 */</span>
 
<span id="line4">4.    </span>
 
<span id="line5">5.    #include "hack.h"</span>
 
<span id="line6">6.    #define Sprintf (void) sprintf</span>
 
<span id="line7">7.    #define Strcat  (void) strcat</span>
 
<span id="line8">8.    #define Strcpy (void) strcpy</span>
 
<span id="line9">9.    #define PREFIX 15</span>
 
<span id="line10">10.  extern char *eos();</span>
 
<span id="line11">11.  extern int bases[];</span>
 
<span id="line12">12.  </span>
 
<span id="line13">13.  char *</span>
 
<span id="line14">14.  strprepend(s,pref) register char *s, *pref; {</span>
 
<span id="line15">15.  register int i = strlen(pref);</span>
 
<span id="line16">16.  if(i > PREFIX) {</span>
 
<span id="line17">17.  pline("WARNING: prefix too short.");</span>
 
<span id="line18">18.  return(s);</span>
 
<span id="line19">19.  }</span>
 
<span id="line20">20.  s -= i;</span>
 
<span id="line21">21.  (void) strncpy(s, pref, i); /* do not copy trailing 0 */</span>
 
<span id="line22">22.  return(s);</span>
 
<span id="line23">23.  }</span>
 
<span id="line24">24.  </span>
 
<span id="line25">25.  char *</span>
 
<span id="line26">26.  sitoa(a) int a; {</span>
 
<span id="line27">27.  static char buf[13];</span>
 
<span id="line28">28.  Sprintf(buf, (a < 0) ? "%d" : "+%d", a);</span>
 
<span id="line29">29.  return(buf);</span>
 
<span id="line30">30.  }</span>
 
<span id="line31">31.  </span>
 
<span id="line32">32.  char *</span>
 
<span id="line33">33.  typename(otyp)</span>
 
<span id="line34">34.  register int otyp;</span>
 
<span id="line35">35.  {</span>
 
<span id="line36">36.  static char buf[BUFSZ];</span>
 
<span id="line37">37.  register struct objclass *ocl = &objects[otyp];</span>
 
<span id="line38">38.  register char *an = ocl->oc_name;</span>
 
<span id="line39">39.  register char *dn = ocl->oc_descr;</span>
 
<span id="line40">40.  register char *un = ocl->oc_uname;</span>
 
<span id="line41">41.  register int nn = ocl->oc_name_known;</span>
 
<span id="line42">42.  switch(ocl->oc_olet) {</span>
 
<span id="line43">43.  case POTION_SYM:</span>
 
<span id="line44">44.  Strcpy(buf, "potion");</span>
 
<span id="line45">45.  break;</span>
 
<span id="line46">46.  case SCROLL_SYM:</span>
 
<span id="line47">47.  Strcpy(buf, "scroll");</span>
 
<span id="line48">48.  break;</span>
 
<span id="line49">49.  case WAND_SYM:</span>
 
<span id="line50">50.  Strcpy(buf, "wand");</span>
 
<span id="line51">51.  break;</span>
 
<span id="line52">52.  #ifdef SPELLS</span>
 
<span id="line53">53.  case SPBOOK_SYM:</span>
 
<span id="line54">54.  Strcpy(buf, "spellbook");</span>
 
<span id="line55">55.  break;</span>
 
<span id="line56">56.  #endif</span>
 
<span id="line57">57.  case RING_SYM:</span>
 
<span id="line58">58.  Strcpy(buf, "ring");</span>
 
<span id="line59">59.  break;</span>
 
<span id="line60">60.  default:</span>
 
<span id="line61">61.  if(nn) {</span>
 
<span id="line62">62.  Strcpy(buf, an);</span>
 
<span id="line63">63.  if(otyp >= TURQUOISE && otyp <= JADE)</span>
 
<span id="line64">64.  Strcat(buf, " stone");</span>
 
<span id="line65">65.  if(un)</span>
 
<span id="line66">66.  Sprintf(eos(buf), " called %s", un);</span>
 
<span id="line67">67.  if(dn)</span>
 
<span id="line68">68.  Sprintf(eos(buf), " (%s)", dn);</span>
 
<span id="line69">69.  } else {</span>
 
<span id="line70">70.  Strcpy(buf, dn ? dn : an);</span>
 
<span id="line71">71.  if(ocl->oc_olet == GEM_SYM)</span>
 
<span id="line72">72.  Strcat(buf, " gem");</span>
 
<span id="line73">73.  if(un)</span>
 
<span id="line74">74.  Sprintf(eos(buf), " called %s", un);</span>
 
<span id="line75">75.  }</span>
 
<span id="line76">76.  return(buf);</span>
 
<span id="line77">77.  }</span>
 
<span id="line78">78.  /* here for ring/scroll/potion/wand */</span>
 
<span id="line79">79.  if(nn)</span>
 
<span id="line80">80.  Sprintf(eos(buf), " of %s", an);</span>
 
<span id="line81">81.  if(un)</span>
 
<span id="line82">82.  Sprintf(eos(buf), " called %s", un);</span>
 
<span id="line83">83.  if(dn)</span>
 
<span id="line84">84.  Sprintf(eos(buf), " (%s)", dn);</span>
 
<span id="line85">85.  return(buf);</span>
 
<span id="line86">86.  }</span>
 
<span id="line87">87.  </span>
 
<span id="line88">88.  char *</span>
 
<span id="line89">89.  xname(obj)</span>
 
<span id="line90">90.  register struct obj *obj;</span>
 
<span id="line91">91.  {</span>
 
<span id="line92">92.  static char bufr[BUFSZ];</span>
 
<span id="line93">93.  register char *buf = &(bufr[PREFIX]); /* leave room for "17 -3 " */</span>
 
<span id="line94">94.  register int nn = objects[obj->otyp].oc_name_known;</span>
 
<span id="line95">95.  register char *an = objects[obj->otyp].oc_name;</span>
 
<span id="line96">96.  register char *dn = objects[obj->otyp].oc_descr;</span>
 
<span id="line97">97.  register char *un = objects[obj->otyp].oc_uname;</span>
 
<span id="line98">98.  register int pl = (obj->quan != 1);</span>
 
<span id="line99">99.  #ifdef KAA</span>
 
<span id="line100">100.  if(!obj->dknown && !Blind && obj->olet != WEAPON_SYM) obj->dknown=1;</span>
 
<span id="line101">101.  #else</span>
 
<span id="line102">102.  if(!obj->dknown && !Blind) obj->dknown = 1; /* %% doesnt belong here */</span>
 
<span id="line103">103.  #endif</span>
 
<span id="line104">104.  switch(obj->olet) {</span>
 
<span id="line105">105.  case AMULET_SYM:</span>
 
<span id="line106">106.  Strcpy(buf, (obj->spe < 0 && obj->known)</span>
 
<span id="line107">107.  ? "cheap plastic imitation of the " : "");</span>
 
<span id="line108">108.  Strcat(buf,"Amulet of Yendor");</span>
 
<span id="line109">109.  break;</span>
 
<span id="line110">110.  case TOOL_SYM:</span>
 
<span id="line111">111.  if(!nn) {</span>
 
<span id="line112">112.  Strcpy(buf, dn);</span>
 
<span id="line113">113.  break;</span>
 
<span id="line114">114.  }</span>
 
<span id="line115">115.  Strcpy(buf,an);</span>
 
<span id="line116">116.  break;</span>
 
<span id="line117">117.  case FOOD_SYM:</span>
 
<span id="line118">118.  if(obj->otyp == DEAD_HOMUNCULUS && pl) {</span>
 
<span id="line119">119.  pl = 0;</span>
 
<span id="line120">120.  Strcpy(buf, "dead homunculi");</span>
 
<span id="line121">121.  break;</span>
 
<span id="line122">122.  }</span>
 
<span id="line123">123.  /* fungis ? */</span>
 
<span id="line124">124.  #ifdef KAA /* The fungus mistake was a D&D holdover. */</span>
 
<span id="line125">125.  if(obj->otyp == DEAD_VIOLET_FUNGUS && pl) {</span>
 
<span id="line126">126.  pl = 0;</span>
 
<span id="line127">127.  Strcpy(buf, "dead violet fungi");</span>
 
<span id="line128">128.  break;</span>
 
<span id="line129">129.  }</span>
 
<span id="line130">130.  #endif</span>
 
<span id="line131">131.  /* fall into next case */</span>
 
<span id="line132">132.  case WEAPON_SYM:</span>
 
<span id="line133">133.  if(obj->otyp == WORM_TOOTH && pl) {</span>
 
<span id="line134">134.  pl = 0;</span>
 
<span id="line135">135.  Strcpy(buf, "worm teeth");</span>
 
<span id="line136">136.  break;</span>
 
<span id="line137">137.  }</span>
 
<span id="line138">138.  if(obj->otyp == CRYSKNIFE && pl) {</span>
 
<span id="line139">139.  pl = 0;</span>
 
<span id="line140">140.  Strcpy(buf, "crysknives");</span>
 
<span id="line141">141.  break;</span>
 
<span id="line142">142.  }</span>
 
<span id="line143">143.  /* fall into next case */</span>
 
<span id="line144">144.  case ARMOR_SYM:</span>
 
<span id="line145">145.  case CHAIN_SYM:</span>
 
<span id="line146">146.  case ROCK_SYM:</span>
 
<span id="line147">147.  Strcpy(buf,an);</span>
 
<span id="line148">148.  break;</span>
 
<span id="line149">149.  case BALL_SYM:</span>
 
<span id="line150">150.  Sprintf(buf, "%sheavy iron ball",</span>
 
<span id="line151">151.    (obj->owt > objects[obj->otyp].oc_weight) ? "very " : "");</span>
 
<span id="line152">152.  break;</span>
 
<span id="line153">153.  case POTION_SYM:</span>
 
<span id="line154">154.  if(nn || un || !obj->dknown) {</span>
 
<span id="line155">155.  Strcpy(buf, "potion");</span>
 
<span id="line156">156.  if(pl) {</span>
 
<span id="line157">157.  pl = 0;</span>
 
<span id="line158">158.  Strcat(buf, "s");</span>
 
<span id="line159">159.  }</span>
 
<span id="line160">160.  if(!obj->dknown) break;</span>
 
<span id="line161">161.  if(un) {</span>
 
<span id="line162">162.  Strcat(buf, " called ");</span>
 
<span id="line163">163.  Strcat(buf, un);</span>
 
<span id="line164">164.  } else {</span>
 
<span id="line165">165.  Strcat(buf, " of ");</span>
 
<span id="line166">166.  Strcat(buf, an);</span>
 
<span id="line167">167.  }</span>
 
<span id="line168">168.  } else {</span>
 
<span id="line169">169.  Strcpy(buf, dn);</span>
 
<span id="line170">170.  Strcat(buf, " potion");</span>
 
<span id="line171">171.  }</span>
 
<span id="line172">172.  break;</span>
 
<span id="line173">173.  case SCROLL_SYM:</span>
 
<span id="line174">174.  Strcpy(buf, "scroll");</span>
 
<span id="line175">175.  if(pl) {</span>
 
<span id="line176">176.  pl = 0;</span>
 
<span id="line177">177.  Strcat(buf, "s");</span>
 
<span id="line178">178.  }</span>
 
<span id="line179">179.  if(!obj->dknown) break;</span>
 
<span id="line180">180.  if(nn) {</span>
 
<span id="line181">181.  Strcat(buf, " of ");</span>
 
<span id="line182">182.  Strcat(buf, an);</span>
 
<span id="line183">183.  } else if(un) {</span>
 
<span id="line184">184.  Strcat(buf, " called ");</span>
 
<span id="line185">185.  Strcat(buf, un);</span>
 
<span id="line186">186.  } else {</span>
 
<span id="line187">187.  Strcat(buf, " labeled ");</span>
 
<span id="line188">188.  Strcat(buf, dn);</span>
 
<span id="line189">189.  }</span>
 
<span id="line190">190.  break;</span>
 
<span id="line191">191.  case WAND_SYM:</span>
 
<span id="line192">192.  if(!obj->dknown)</span>
 
<span id="line193">193.  Sprintf(buf, "wand");</span>
 
<span id="line194">194.  else if(nn)</span>
 
<span id="line195">195.  Sprintf(buf, "wand of %s", an);</span>
 
<span id="line196">196.  else if(un)</span>
 
<span id="line197">197.  Sprintf(buf, "wand called %s", un);</span>
 
<span id="line198">198.  else</span>
 
<span id="line199">199.  Sprintf(buf, "%s wand", dn);</span>
 
<span id="line200">200.  break;</span>
 
<span id="line201">201.  #ifdef SPELLS</span>
 
<span id="line202">202.  case SPBOOK_SYM:</span>
 
<span id="line203">203.  if(!obj->dknown)</span>
 
<span id="line204">204.  Sprintf(buf, "spellbook");</span>
 
<span id="line205">205.  else if(nn)</span>
 
<span id="line206">206.  Sprintf(buf, "spellbook of %s", an);</span>
 
<span id="line207">207.  else if(un)</span>
 
<span id="line208">208.  Sprintf(buf, "spellbook called %s", un);</span>
 
<span id="line209">209.  else</span>
 
<span id="line210">210.  Sprintf(buf, "%s spellbook", dn);</span>
 
<span id="line211">211.  break;</span>
 
<span id="line212">212.  #endif</span>
 
<span id="line213">213.  case RING_SYM:</span>
 
<span id="line214">214.  if(!obj->dknown)</span>
 
<span id="line215">215.  Sprintf(buf, "ring");</span>
 
<span id="line216">216.  else if(nn)</span>
 
<span id="line217">217.  Sprintf(buf, "ring of %s", an);</span>
 
<span id="line218">218.  else if(un)</span>
 
<span id="line219">219.  Sprintf(buf, "ring called %s", un);</span>
 
<span id="line220">220.  else</span>
 
<span id="line221">221.  Sprintf(buf, "%s ring", dn);</span>
 
<span id="line222">222.  break;</span>
 
<span id="line223">223.  case GEM_SYM:</span>
 
<span id="line224">224.  if(!obj->dknown) {</span>
 
<span id="line225">225.  Strcpy(buf, "gem");</span>
 
<span id="line226">226.  break;</span>
 
<span id="line227">227.  }</span>
 
<span id="line228">228.  if(!nn) {</span>
 
<span id="line229">229.  #ifdef KAA</span>
 
<span id="line230">230.  if(un) {</span>
 
<span id="line231">231.  if (!pl)  Sprintf(buf,"gem called %s",un);</span>
 
<span id="line232">232.  else   Sprintf(buf,"gems called %s",un);</span>
 
<span id="line233">233.  pl=0;</span>
 
<span id="line234">234.  } else</span>
 
<span id="line235">235.  #endif</span>
 
<span id="line236">236.  Sprintf(buf, "%s gem", dn);</span>
 
<span id="line237">237.  break;</span>
 
<span id="line238">238.  }</span>
 
<span id="line239">239.  Strcpy(buf, an);</span>
 
<span id="line240">240.  if(obj->otyp >= TURQUOISE && obj->otyp <= JADE)</span>
 
<span id="line241">241.  Strcat(buf, " stone");</span>
 
<span id="line242">242.  break;</span>
 
<span id="line243">243.  default:</span>
 
<span id="line244">244.  Sprintf(buf,"glorkum %c (0%o) %u %d",</span>
 
<span id="line245">245.  obj->olet,obj->olet,obj->otyp,obj->spe);</span>
 
<span id="line246">246.  }</span>
 
<span id="line247">247.  if(pl) {</span>
 
<span id="line248">248.  register char *p;</span>
 
<span id="line249">249.  </span>
 
<span id="line250">250.  for(p = buf; *p; p++) {</span>
 
<span id="line251">251.  if(!strncmp(" of ", p, 4)) {</span>
 
<span id="line252">252.  /* pieces of, cloves of, lumps of */</span>
 
<span id="line253">253.  register int c1, c2 = 's';</span>
 
<span id="line254">254.  </span>
 
<span id="line255">255.  do {</span>
 
<span id="line256">256.  c1 = c2; c2 = *p; *p++ = c1;</span>
 
<span id="line257">257.  } while(c1);</span>
 
<span id="line258">258.  goto nopl;</span>
 
<span id="line259">259.  }</span>
 
<span id="line260">260.  }</span>
 
<span id="line261">261.  p = eos(buf)-1;</span>
 
<span id="line262">262.  if(*p == 's' || *p == 'z' || *p == 'x' ||</span>
 
<span id="line263">263.      (*p == 'h' && p[-1] == 's'))</span>
 
<span id="line264">264.  Strcat(buf, "es"); /* boxes */</span>
 
<span id="line265">265.  else if(*p == 'y' && !index(vowels, p[-1]))</span>
 
<span id="line266">266.  Strcpy(p, "ies"); /* rubies, zruties */</span>
 
<span id="line267">267.  else</span>
 
<span id="line268">268.  Strcat(buf, "s");</span>
 
<span id="line269">269.  }</span>
 
<span id="line270">270.  nopl:</span>
 
<span id="line271">271.  if(obj->onamelth) {</span>
 
<span id="line272">272.  Strcat(buf, " named ");</span>
 
<span id="line273">273.  Strcat(buf, ONAME(obj));</span>
 
<span id="line274">274.  }</span>
 
<span id="line275">275. return(buf);</span>
 
<span id="line276">276.  }</span>
 
<span id="line277">277.  </span>
 
<span id="line278">278.  char *</span>
 
<span id="line279">279.  doname(obj)</span>
 
<span id="line280">280.  register struct obj *obj;</span>
 
<span id="line281">281.  {</span>
 
<span id="line282">282.  char prefix[PREFIX];</span>
 
<span id="line283">283.  register char *bp = xname(obj);</span>
 
<span id="line284">284.  if(obj->quan != 1)</span>
 
<span id="line285">285.  Sprintf(prefix, "%u ", obj->quan);</span>
 
<span id="line286">286.  else</span>
 
<span id="line287">287.  Strcpy(prefix, "a ");</span>
 
<span id="line288">288.  switch(obj->olet) {</span>
 
<span id="line289">289.  case AMULET_SYM:</span>
 
<span id="line290">290.  if(strncmp(bp, "cheap ", 6))</span>
 
<span id="line291">291.  Strcpy(prefix, "the ");</span>
 
<span id="line292">292.  break;</span>
 
<span id="line293">293.  case ARMOR_SYM:</span>
 
<span id="line294">294.  if(obj->owornmask & W_ARMOR)</span>
 
<span id="line295">295.  Strcat(bp, " (being worn)");</span>
 
<span id="line296">296.  /* fall into next case */</span>
 
<span id="line297">297.  case WEAPON_SYM:</span>
 
<span id="line298">298.  if(obj->known) {</span>
 
<span id="line299">299.  #ifdef KAA</span>
 
<span id="line300">300.  /* dknown is special for weapons */</span>
 
<span id="line301">301.  if(obj->dknown && obj->olet == WEAPON_SYM)</span>
 
<span id="line302">302.  Strcat(prefix,"blessed ");</span>
 
<span id="line303">303.  #endif</span>
 
<span id="line304">304.  Strcat(prefix, sitoa(obj->spe));</span>
 
<span id="line305">305.  Strcat(prefix, " ");</span>
 
<span id="line306">306.  }</span>
 
<span id="line307">307.  break;</span>
 
<span id="line308">308.  #ifdef MARKER</span>
 
<span id="line309">309.  case TOOL_SYM: /* temp. hack by GAN 11/18/86 */</span>
 
<span id="line310">310.  if(obj->otyp != MAGIC_MARKER) break;</span>
 
<span id="line311">311.  #endif</span>
 
<span id="line312">312.  case WAND_SYM:</span>
 
<span id="line313">313.  if(obj->known)</span>
 
<span id="line314">314.  Sprintf(eos(bp), " (%d)", obj->spe);</span>
 
<span id="line315">315.  break;</span>
 
<span id="line316">316.  case RING_SYM:</span>
 
<span id="line317">317.  if(obj->owornmask & W_RINGR) Strcat(bp, " (on right hand)");</span>
 
<span id="line318">318.  if(obj->owornmask & W_RINGL) Strcat(bp, " (on left hand)");</span>
 
<span id="line319">319.  if(obj->known && (objects[obj->otyp].bits & SPEC)) {</span>
 
<span id="line320">320.  Strcat(prefix, sitoa(obj->spe));</span>
 
<span id="line321">321.  Strcat(prefix, " ");</span>
 
<span id="line322">322.  }</span>
 
<span id="line323">323.  break;</span>
 
<span id="line324">324.  }</span>
 
<span id="line325">325.  if(obj->owornmask & W_WEP)</span>
 
<span id="line326">326.  Strcat(bp, " (weapon in hand)");</span>
 
<span id="line327">327.  if(obj->unpaid)</span>
 
<span id="line328">328.  Strcat(bp, " (unpaid)");</span>
 
<span id="line329">329.  if(!strcmp(prefix, "a ") && index(vowels, *bp))</span>
 
<span id="line330">330.  Strcpy(prefix, "an ");</span>
 
<span id="line331">331.  bp = strprepend(bp, prefix);</span>
 
<span id="line332">332.  return(bp);</span>
 
<span id="line333">333.  }</span>
 
<span id="line334">334.  </span>
 
<span id="line335">335.  /* used only in fight.c (thitu) */</span>
 
<span id="line336">336.  setan(str,buf)</span>
 
<span id="line337">337.  register char *str,*buf;</span>
 
<span id="line338">338.  {</span>
 
<span id="line339">339.  if(index(vowels,*str))</span>
 
<span id="line340">340.  Sprintf(buf, "an %s", str);</span>
 
<span id="line341">341.  else</span>
 
<span id="line342">342.  Sprintf(buf, "a %s", str);</span>
 
<span id="line343">343.  }</span>
 
<span id="line344">344.  </span>
 
<span id="line345">345.  char *</span>
 
<span id="line346">346.  aobjnam(otmp,verb) register struct obj *otmp; register char *verb; {</span>
 
<span id="line347">347.  register char *bp = xname(otmp);</span>
 
<span id="line348">348.  char prefix[PREFIX];</span>
 
<span id="line349">349.  if(otmp->quan != 1) {</span>
 
<span id="line350">350.  Sprintf(prefix, "%u ", otmp->quan);</span>
 
<span id="line351">351.  bp = strprepend(bp, prefix);</span>
 
<span id="line352">352.  }</span>
 
<span id="line353">353.  </span>
 
<span id="line354">354.  if(verb) {</span>
 
<span id="line355">355.  /* verb is given in plural (i.e., without trailing s) */</span>
 
<span id="line356">356.  Strcat(bp, " ");</span>
 
<span id="line357">357.  if(otmp->quan != 1)</span>
 
<span id="line358">358.  Strcat(bp, verb);</span>
 
<span id="line359">359.  else if(!strcmp(verb, "are"))</span>
 
<span id="line360">360.  Strcat(bp, "is");</span>
 
<span id="line361">361.  else {</span>
 
<span id="line362">362.  Strcat(bp, verb);</span>
 
<span id="line363">363.  Strcat(bp, "s");</span>
 
<span id="line364">364.  }</span>
 
<span id="line365">365.  }</span>
 
<span id="line366">366.  return(bp);</span>
 
<span id="line367">367.  }</span>
 
<span id="line368">368.  </span>
 
<span id="line369">369.  char *</span>
 
<span id="line370">370.  Doname(obj)</span>
 
<span id="line371">371.  register struct obj *obj;</span>
 
<span id="line372">372.  {</span>
 
<span id="line373">373.  register char *s = doname(obj);</span>
 
<span id="line374">374.  </span>
 
<span id="line375">375.  if('a' <= *s && *s <= 'z') *s -= ('a' - 'A');</span>
 
<span id="line376">376.  return(s);</span>
 
<span id="line377">377.  }</span>
 
<span id="line378">378.  </span>
 
<span id="line379">379.  char *wrp[] = { "wand", "ring", "potion", "scroll", "gem"</span>
 
<span id="line380">380.  #ifdef SPELLS</span>
 
<span id="line381">381.  , "spellbook"</span>
 
<span id="line382">382.  #endif</span>
 
<span id="line383">383.        };</span>
 
<span id="line384">384.  char wrpsym[] = { WAND_SYM, RING_SYM, POTION_SYM, SCROLL_SYM, GEM_SYM</span>
 
<span id="line385">385.  #ifdef SPELLS</span>
 
<span id="line386">386.    , SPBOOK_SYM</span>
 
<span id="line387">387.  #endif</span>
 
<span id="line388">388.  };</span>
 
<span id="line389">389.  </span>
 
<span id="line390">390.  struct obj *</span>
 
<span id="line391">391.  readobjnam(bp) register char *bp; {</span>
 
<span id="line392">392.  register char *p;</span>
 
<span id="line393">393.  register int i;</span>
 
<span id="line394">394.  int cnt, spe, spesgn, typ, heavy;</span>
 
<span id="line395">395.  char let;</span>
 
<span id="line396">396.  char *un, *dn, *an;</span>
 
<span id="line397">397.  #ifdef KAA</span>
 
<span id="line398">398.  int blessed=0;</span>
 
<span id="line399">399.  #endif</span>
 
<span id="line400">400.  /* int the = 0; char *oname = 0; */</span>
 
<span id="line401">401.  cnt = spe = spesgn = typ = heavy = 0;</span>
 
<span id="line402">402.  let = 0;</span>
 
<span id="line403">403.  an = dn = un = 0;</span>
 
<span id="line404">404.  for(p = bp; *p; p++) /* set the string to lower case */</span>
 
<span id="line405">405.  if('A' <= *p && *p <= 'Z') *p += 'a'-'A';</span>
 
<span id="line406">406.  if(!strncmp(bp, "the ", 4)){</span>
 
<span id="line407">407.  /* the = 1; */</span>
 
<span id="line408">408.  bp += 4;</span>
 
<span id="line409">409.  } else if(!strncmp(bp, "an ", 3)){</span>
 
<span id="line410">410.  cnt = 1;</span>
 
<span id="line411">411.  bp += 3;</span>
 
<span id="line412">412.  } else if(!strncmp(bp, "a ", 2)){</span>
 
<span id="line413">413.  cnt = 1;</span>
 
<span id="line414">414.  bp += 2;</span>
 
<span id="line415">415.  }</span>
 
<span id="line416">416.  #ifdef KAA</span>
 
<span id="line417">417.  if(!strncmp(bp,"blessed ",8)) {</span>
 
<span id="line418">418.  blessed=1;</span>
 
<span id="line419">419.  bp += 8;</span>
 
<span id="line420">420.  }</span>
 
<span id="line421">421.  #endif</span>
 
<span id="line422">422.  if(!cnt && digit(*bp)){</span>
 
<span id="line423">423.  cnt = atoi(bp);</span>
 
<span id="line424">424.  while(digit(*bp)) bp++;</span>
 
<span id="line425">425.  while(*bp == ' ') bp++;</span>
 
<span id="line426">426.  }</span>
 
<span id="line427">427.  if(!cnt) cnt = 1; /* %% what with "gems" etc. ? */</span>
 
<span id="line428">428.  </span>
 
<span id="line429">429.  if(*bp == '+' || *bp == '-'){</span>
 
<span id="line430">430.  spesgn = (*bp++ == '+') ? 1 : -1;</span>
 
<span id="line431">431.  spe = atoi(bp);</span>
 
<span id="line432">432.  while(digit(*bp)) bp++;</span>
 
<span id="line433">433.  while(*bp == ' ') bp++;</span>
 
<span id="line434">434.  } else {</span>
 
<span id="line435">435.  p = rindex(bp, '(');</span>
 
<span id="line436">436.  if(p) {</span>
 
<span id="line437">437.  if(p > bp && p[-1] == ' ') p[-1] = 0;</span>
 
<span id="line438">438.  else *p = 0;</span>
 
<span id="line439">439.  p++;</span>
 
<span id="line440">440.  spe = atoi(p);</span>
 
<span id="line441">441.  while(digit(*p)) p++;</span>
 
<span id="line442">442.  if(strcmp(p, ")")) spe = 0;</span>
 
<span id="line443">443.  else spesgn = 1;</span>
 
<span id="line444">444.  }</span>
 
<span id="line445">445.  }</span>
 
<span id="line446">446.  /* now we have the actual name, as delivered by xname, say</span>
 
<span id="line447">447.  green potions called whisky</span>
 
<span id="line448">448.  scrolls labeled "QWERTY"</span>
 
<span id="line449">449.  egg</span>
 
<span id="line450">450.  dead zruties</span>
 
<span id="line451">451.  fortune cookies</span>
 
<span id="line452">452.  very heavy iron ball named hoei</span>
 
<span id="line453">453.  wand of wishing</span>
 
<span id="line454">454.  elven cloak</span>
 
<span id="line455">455.  */</span>
 
<span id="line456">456.  for(p = bp; *p; p++) if(!strncmp(p, " named ", 7)) {</span>
 
<span id="line457">457.  *p = 0;</span>
 
<span id="line458">458.  /* oname = p+7; */</span>
 
<span id="line459">459.  }</span>
 
<span id="line460">460.  for(p = bp; *p; p++) if(!strncmp(p, " called ", 8)) {</span>
 
<span id="line461">461.  *p = 0;</span>
 
<span id="line462">462.  un = p+8;</span>
 
<span id="line463">463.  }</span>
 
<span id="line464">464.  for(p = bp; *p; p++) if(!strncmp(p, " labeled ", 9)) {</span>
 
<span id="line465">465.  *p = 0;</span>
 
<span id="line466">466.  dn = p+9;</span>
 
<span id="line467">467.  }</span>
 
<span id="line468">468.  </span>
 
<span id="line469">469.  /* first change to singular if necessary */</span>
 
<span id="line470">470.  if(cnt != 1) {</span>
 
<span id="line471">471.  /* find "cloves of garlic", "worthless pieces of blue glass" */</span>
 
<span id="line472">472.  for(p = bp; *p; p++) if(!strncmp(p, "s of ", 5)){</span>
 
<span id="line473">473.  while(*p = p[1]) p++;</span>
 
<span id="line474">474.  goto sing;</span>
 
<span id="line475">475.  }</span>
 
<span id="line476">476.  /* remove -s or -es (boxes) or -ies (rubies, zruties) */</span>
 
<span id="line477">477.  p = eos(bp);</span>
 
<span id="line478">478.  if(p[-1] == 's') {</span>
 
<span id="line479">479.  if(p[-2] == 'e') {</span>
 
<span id="line480">480.  if(p[-3] == 'i') {</span>
 
<span id="line481">481.  #ifdef KAA</span>
 
<span id="line482">482.  if(!strcmp(p-7, "cookies") || !strcmp(p-4, "pies"))</span>
 
<span id="line483">483.  #else</span>
 
<span id="line484">484.  if(!strcmp(p-7, "cookies"))</span>
 
<span id="line485">485.  #endif</span>
 
<span id="line486">486.  goto mins;</span>
 
<span id="line487">487.  Strcpy(p-3, "y");</span>
 
<span id="line488">488.  goto sing;</span>
 
<span id="line489">489.  }</span>
 
<span id="line490">490.  </span>
 
<span id="line491">491.  /* note: cloves / knives from clove / knife */</span>
 
<span id="line492">492.  if(!strcmp(p-6, "knives")) {</span>
 
<span id="line493">493.  Strcpy(p-3, "fe");</span>
 
<span id="line494">494.  goto sing;</span>
 
<span id="line495">495.  }</span>
 
<span id="line496">496.  </span>
 
<span id="line497">497.  /* note: nurses, axes but boxes */</span>
 
<span id="line498">498.  if(!strcmp(p-5, "boxes")) {</span>
 
<span id="line499">499.  p[-2] = 0;</span>
 
<span id="line500">500.  goto sing;</span>
 
<span id="line501">501.  }</span>
 
<span id="line502">502.  }</span>
 
<span id="line503">503.  mins:</span>
 
<span id="line504">504.  p[-1] = 0;</span>
 
<span id="line505">505.  } else {</span>
 
<span id="line506">506.  if(!strcmp(p-9, "homunculi")</span>
 
<span id="line507">507.  #ifdef KAA</span>
 
<span id="line508">508.  || !strcmp(p-5, "fungi")</span>
 
<span id="line509">509.  #endif</span>
 
<span id="line510">510.  ) {</span>
 
<span id="line511">511.  Strcpy(p-1, "us"); /* !! makes string longer */</span>
 
<span id="line512">512.  goto sing;</span>
 
<span id="line513">513.  }</span>
 
<span id="line514">514.  if(!strcmp(p-5, "teeth")) {</span>
 
<span id="line515">515.  Strcpy(p-5, "tooth");</span>
 
<span id="line516">516.  goto sing;</span>
 
<span id="line517">517.  }</span>
 
<span id="line518">518.  /* here we cannot find the plural suffix */</span>
 
<span id="line519">519.  }</span>
 
<span id="line520">520.  }</span>
 
<span id="line521">521.  sing:</span>
 
<span id="line522">522.  if(!strcmp(bp, "amulet of yendor")) {</span>
 
<span id="line523">523.  typ = AMULET_OF_YENDOR;</span>
 
<span id="line524">524.  goto typfnd;</span>
 
<span id="line525">525.  }</span>
 
<span id="line526">526.  if(!strcmp(bp, "ring mail")){ /* Note: ring mail is not a ring ! */</span>
 
<span id="line527">527.  let = ARMOR_SYM;</span>
 
<span id="line528">528.  an = bp;</span>
 
<span id="line529">529.  goto srch;</span>
 
<span id="line530">530.  }</span>
 
<span id="line531">531.  </span>
 
<span id="line532">532.  p = eos(bp);</span>
 
<span id="line533">533.  #ifdef KOPS /* kluge to re-capitalize "dead Kop" */</span>
 
<span id="line534">534.  if (!strcmp(p-3, "kop")) {</span>
 
<span id="line535">535.  *(p-3) = 'K';</span>
 
<span id="line536">536.  an = bp;</span>
 
<span id="line537">537.  goto srch;</span>
 
<span id="line538">538.  }</span>
 
<span id="line539">539.  #endif</span>
 
<span id="line540">540.  </span>
 
<span id="line541">541.  for(i = 0; i < sizeof(wrpsym); i++) {</span>
 
<span id="line542">542.  register int j = strlen(wrp[i]);</span>
 
<span id="line543">543.  if(!strncmp(bp, wrp[i], j)){</span>
 
<span id="line544">544.  let = wrpsym[i];</span>
 
<span id="line545">545.  bp += j;</span>
 
<span id="line546">546.  if(!strncmp(bp, " of ", 4)) an = bp+4;</span>
 
<span id="line547">547.  /* else if(*bp) ?? */</span>
 
<span id="line548">548.  goto srch;</span>
 
<span id="line549">549.  }</span>
 
<span id="line550">550.  if(!strcmp(p-j, wrp[i])){</span>
 
<span id="line551">551.  let = wrpsym[i];</span>
 
<span id="line552">552.  p -= j;</span>
 
<span id="line553">553.  *p = 0;</span>
 
<span id="line554">554.  if(p[-1] == ' ') p[-1] = 0;</span>
 
<span id="line555">555.  dn = bp;</span>
 
<span id="line556">556.  goto srch;</span>
 
<span id="line557">557.  }</span>
 
<span id="line558">558.  }</span>
 
<span id="line559">559.  if(!strcmp(p-6, " stone")){</span>
 
<span id="line560">560.  p[-6] = 0;</span>
 
<span id="line561">561.  let = GEM_SYM;</span>
 
<span id="line562">562.  an = bp;</span>
 
<span id="line563">563.  goto srch;</span>
 
<span id="line564">564.  }</span>
 
<span id="line565">565.  #ifdef KAA</span>
 
<span id="line566">566.  if(!strcmp(p-10, "gold piece") || !strcmp(p-7, "zorkmid")) {</span>
 
<span id="line567">567.  if (cnt > 5000) cnt=5000;</span>
 
<span id="line568">568.  if (cnt < 1) cnt=1;</span>
 
<span id="line569">569.  pline("%d gold piece%s.", cnt, cnt==1 ? "" : "s");</span>
 
<span id="line570">570.  u.ugold += cnt;</span>
 
<span id="line571">571.  flags.botl=1;</span>
 
<span id="line572">572.  return(0);</span>
 
<span id="line573">573.  }</span>
 
<span id="line574">574.  #endif</span>
 
<span id="line575">575.  if(!strcmp(bp, "very heavy iron ball")){</span>
 
<span id="line576">576.  heavy = 1;</span>
 
<span id="line577">577.  typ = HEAVY_IRON_BALL;</span>
 
<span id="line578">578.  goto typfnd;</span>
 
<span id="line579">579.  }</span>
 
<span id="line580">580.  an = bp;</span>
 
<span id="line581">581.  srch:</span>
 
<span id="line582">582.  if(!an && !dn && !un)</span>
 
<span id="line583">583.  goto any;</span>
 
<span id="line584">584.  i = 1;</span>
 
<span id="line585">585.  if(let) i = bases[letindex(let)];</span>
 
<span id="line586">586.  while(i <= NROFOBJECTS && (!let || objects[i].oc_olet == let)){</span>
 
<span id="line587">587.  register char *zn = objects[i].oc_name;</span>
 
<span id="line588">588.  </span>
 
<span id="line589">589.  if(!zn) goto nxti;</span>
 
<span id="line590">590.  if(an && strcmp(an, zn))</span>
 
<span id="line591">591.  goto nxti;</span>
 
<span id="line592">592.  if(dn && (!(zn = objects[i].oc_descr) || strcmp(dn, zn)))</span>
 
<span id="line593">593.  goto nxti;</span>
 
<span id="line594">594.  if(un && (!(zn = objects[i].oc_uname) || strcmp(un, zn)))</span>
 
<span id="line595">595.  goto nxti;</span>
 
<span id="line596">596.  typ = i;</span>
 
<span id="line597">597.  goto typfnd;</span>
 
<span id="line598">598.  nxti:</span>
 
<span id="line599">599.  i++;</span>
 
<span id="line600">600.  }</span>
 
<span id="line601">601.  any:</span>
 
<span id="line602">602.  if(!let) let = wrpsym[rn2(sizeof(wrpsym))];</span>
 
<span id="line603">603.  typ = probtype(let);</span>
 
<span id="line604">604.  typfnd:</span>
 
<span id="line605">605.  { register struct obj *otmp;</span>
 
<span id="line606">606.    extern struct obj *mksobj();</span>
 
<span id="line607">607.  let = objects[typ].oc_olet;</span>
 
<span id="line608">608.  otmp = mksobj(typ);</span>
 
<span id="line609">609.  if(heavy)</span>
 
<span id="line610">610.  otmp->owt += 15;</span>
 
<span id="line611">611.  if(cnt > 0 && index("%?!*)", let) &&</span>
 
<span id="line612">612.  #ifdef KAA</span>
 
<span id="line613">613.  (cnt < 4 || (let == WEAPON_SYM && typ <= ROCK && cnt <= 20)))</span>
 
<span id="line614">614.  #else</span>
 
<span id="line615">615.  (cnt < 4 || (let == WEAPON_SYM && typ <= ROCK && cnt < 20)))</span>
 
<span id="line616">616.  #endif</span>
 
<span id="line617">617.  otmp->quan = cnt;</span>
 
<span id="line618">618.  </span>
 
<span id="line619">619.  if(spe > 3 && spe > otmp->spe)</span>
 
<span id="line620">620.  spe = 0;</span>
 
<span id="line621">621.  else if(let == WAND_SYM)</span>
 
<span id="line622">622.  spe = otmp->spe;</span>
 
<span id="line623">623.  #ifdef KAA</span>
 
<span id="line624">624.  if(let==WEAPON_SYM && blessed) {</span>
 
<span id="line625">625.  if(u.uluck < 0) otmp->cursed=1;</span>
 
<span id="line626">626.  else otmp->dknown=1;</span>
 
<span id="line627">627.  }</span>
 
<span id="line628">628.  #endif</span>
 
<span id="line629">629.  if(spe == 3 && u.uluck < 0)</span>
 
<span id="line630">630.  spesgn = -1;</span>
 
<span id="line631">631.  if(let != WAND_SYM && spesgn == -1)</span>
 
<span id="line632">632.  spe = -spe;</span>
 
<span id="line633">633.  if(let == BALL_SYM)</span>
 
<span id="line634">634.  spe = 0;</span>
 
<span id="line635">635.  else if(let == AMULET_SYM)</span>
 
<span id="line636">636.  spe = -1;</span>
 
<span id="line637">637.  else if(typ == WAN_WISHING && rn2(10))</span>
 
<span id="line638">638.  spe = (rn2(10) ? -1 : 0);</span>
 
<span id="line639">639.  #ifdef MARKER</span>
 
<span id="line640">640.  else if(typ == MAGIC_MARKER)</span>
 
<span id="line641">641.  spe = rn1(50,50);</span>
 
<span id="line642">642.  #endif</span>
 
<span id="line643">643.  otmp->spe = spe;</span>
 
<span id="line644">644.  </span>
 
<span id="line645">645.  if(spesgn == -1)</span>
 
<span id="line646">646.  otmp->cursed = 1;</span>
 
<span id="line647">647.  </span>
 
<span id="line648">648.  return(otmp);</span>
 
<span id="line649">649.      }</span>
 
<span id="line650">650.  }</span>
 
[[Category:NetHack 1.4f source code|objnam.c]]
 

Revision as of 20:50, 3 September 2006

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