home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 October / usenetsourcesnewsgroupsinfomagicoctober1994disk2.iso / games / volume10 / nethack3p9 / part13 < prev    next >
Text File  |  1990-07-12  |  60KB  |  1,997 lines

  1. Path: uunet!zephyr.ens.tek.com!tekred!saab!billr
  2. From: billr@saab.CNA.TEK.COM (Bill Randle)
  3. Newsgroups: comp.sources.games
  4. Subject: v10i058:  nethack3p9 -  display oriented dungeons & dragons (Ver. 3.0i), Part13/56
  5. Message-ID: <5914@tekred.CNA.TEK.COM>
  6. Date: 12 Jul 90 00:32:29 GMT
  7. Sender: news@tekred.CNA.TEK.COM
  8. Lines: 1986
  9. Approved: billr@saab.CNA.TEK.COM
  10.  
  11. Submitted-by: Izchak Miller <izchak@linc.cis.upenn.edu>
  12. Posting-number: Volume 10, Issue 58
  13. Archive-name: nethack3p9/Part13
  14. Supersedes: NetHack3: Volume 7, Issue 56-93
  15.  
  16.  
  17.  
  18. #! /bin/sh
  19. # This is a shell archive.  Remove anything before this line, then unpack
  20. # it by saving it into a file and typing "sh file".  To overwrite existing
  21. # files, type "sh file -c".  You can also feed this as standard input via
  22. # unshar, or by typing "sh <file", e.g..  If this archive is complete, you
  23. # will see the following message at the end:
  24. #        "End of archive 13 (of 56)."
  25. # Contents:  mac/MD.proj.hqx src/objnam.c
  26. # Wrapped by billr@saab on Wed Jul 11 17:11:08 1990
  27. PATH=/bin:/usr/bin:/usr/ucb ; export PATH
  28. if test -f 'mac/MD.proj.hqx' -a "${1}" != "-c" ; then 
  29.   echo shar: Will not clobber existing file \"'mac/MD.proj.hqx'\"
  30. else
  31. echo shar: Extracting \"'mac/MD.proj.hqx'\" \(17003 characters\)
  32. sed "s/^X//" >'mac/MD.proj.hqx' <<'END_OF_FILE'
  33. X(This file must be converted with BinHex 4.0)
  34. X
  35. X:$@eKDf9NC@Cc,R"bEfS!8&*25NY"5%`!N!JhP#4S!*!%!3#3!cAk!!!dqJ!!!CS
  36. X!!""G$80bD@0VCA3J4h*KF'J#!*!$39"36%0(8NBK"!eYB@YPC'9QFbj`FQpU!J#
  37. X3!e"56dT,38K-!3#3"&J!!&"56dT,38K-!3#3"&J!!%e9!*!0!U)XCN!!N!BhP!#
  38. X3#K8!N!-3A3pQD@jN)%e')'CKBh4[FR-#!*!$39"36%eZ4Q3K"!!+!#`!N!3L#J#
  39. X3$PN8!!"F!+(@VNLKeUj2SGH0eJ#3(Jc-!!%0KJ!@!*!'!r!!N2m!N2m!N2m!N2,
  40. XF!!!"@!!!F!8!!%459P)"8!!`VH`!!2m`!,B!N!83!$#Yl!!!rc!!YJ#3"4!!-+h
  41. XX!!$r-!#f!*!&%!!`VH`!!2m`!,B!N!83!$#Yl!!!rc!!YJ#3"4!!-+hX!!$r-!#
  42. Xf!*!&%!!`VH`!!2m`!,B!N!83!$#Yl!!!rc!!YJ#3"4!!-+hX!!$r-!#f!*!&%!!
  43. X`VH`!!2m`!,B!N!83!$#Yl!!!rc!!YJ#3"4!!-+hX!!$r-!#f!*!&%!!`VH`!!2m
  44. X`!,B!N!83!$#Yl!!!rc!!YJ#3"4!!-+hX!!$r-!#f!*!&%!!`VH`!!2m`!,B!N!8
  45. X3#'eKDf9NC@CcYJ#3"4!!-+hX!!$r-!#f!*!&%!!`VH`!!2m`!,B!N!83!$#Yl!!
  46. X!rc!!YJ#3"4""8&"-EQK04!J!!B!!N!-+#!!!"J#3!`B!N!9J!*!$F!#3"e!!N!-
  47. XJ!"`r2!!"UI!%#Mmm!!'Tm!3H2c`!!DR`"$)r2!!"UI!%6Mmm!!'Tm!5%2c`!!DR
  48. X`"+3r2!!"UI!%aMmm!!'Tm!6Q2c`!!DR`"air2!!"UI!!N!-%!*!("!#30!&B!!"
  49. X`"3!!4&*@8J&3!$#Yl!!!rc!!YJ#3"4!!-+hX!!$r-!#f!*!&%!!`VH`!!2m`!,B
  50. X!N!83!$#Yl!!!rc!!YJ#3"4!!-+hX!!$r-!#f!*!&%!!`VH`!!2m`!,B!N!83!$#
  51. XYl!!!rc!!YJ#3"4!!-+hX!!$r-!#f!*!&%!!`VH`!!2m`!,B!N!83!$#Yl!!!rc!
  52. X!YJ#3"4!!-+hX!!$r-!#f!*!&%!!`VH`!!2m`!,B!N!83!$#Yl!!!rc!!YJ#3"4!
  53. X!-+hX!!$r-!#f!*!&%!!`VH`!!2m`!,B!N!83!$#Yl!!!rc!!YJ#3"4!!-+hX!!$
  54. Xr-!#f!*!&%!!`VH`!!2m`!,B!N!83!$#Yl!!!rc!!YJ#3"4!!-+hX!!$r-!#f!*!
  55. X&%%&38%aYDf3U!!!"J!#3!`J!!2m`!,B!N!d+!*!-*!!!-iUS!$0Qk!!cCi`!!!+
  56. X)!*!&-J#3&N#!lNi!-fES3!!!d!!cCV3!N!8cC[!!-fEd!$0Qq!!cC[`!-fF!!$0
  57. XR"!!cC`J!-fF-!$0R%!!cCa3!-fFB!$0R(!!cCb!!-fFN!$0R+!!cCb`!-fF`!$0
  58. XR0!!cCcJ!-fFm!$0R3!!cCd3!-fG)!$0R6!!cCe!!-fG8!$0R@!!cCe`!-fGJ!$0
  59. XRC!!cCfJ!-fGX!$0RF!!cCh3!-fGi!$0RI!!cCi!!-fH%!$0RL!!cL!!!-i-N!$0
  60. Xq5!!cIK3!-hhN!$0pY!!cH0J!-h0S!$0YC!!cCm#!!!@N!!!"!!)!#3N!!3!!rj!
  61. X)SL3#2!!D!!%!!#R968&,43!+E@&VC@4PCR-ZB`#3!`'JR-eYS*c0ED#Fc@d!'J!
  62. X#!!!RrNe"3dJ"#NeKBdKPB@4PFR-!N!-"SLaT$U)XD3kL,'N1!"J!!3!!+GC$6dj
  63. X'!!KMEfjQD@FZD!"c!!+L(KlhSKiHpk)H([F!'J!"!!!TeP45383!#R4bB@4cG'4
  64. XM,QJ!N!-#SKiG4D)H(8@L(Ke&!"J!!3!!+GC(6%p#!!KRE'pLB@`ZD!"S!!1Jar@
  65. XhS-IeYk$(pEF!&J!#!!!SB&084%N""h0dC'P[,QJ!!!1L(K[jSKiEqD)H'rN!&J!
  66. X"!!!TeN026e)!"f0[Eh*N,QJ!!!1L*`[LSLF,iU)R#q)!'!!"!!!TeNe"3d-!#@e
  67. XKBf0[EQBZD!!!"+)H(JDL(Ki'SKiH"J!@!!%!!#R@690%6`!(EA0NEh-ZD!!!"+)
  68. XH(Y1L(Kl6SKiHd`!B!!%!!#R@8eP69!!)FhPcG'9Y,QJ!N!-%S*cGjD#FhH@JR0h
  69. XP!"B!!J!!+'"858e&!3CdD@eP,QJ!D!!%S*cG0k#Fh6HJR0dh!"B!!J!!+'"'3dj
  70. X8!3G'BfjdE#jS!!!%S*cGV+#FhDbJR0fX!"J!!J!!+'"69%4%!3K6G'4NC@BZD!#
  71. X3!`5JR0h9S*cGeD#FhG8!'!!#!!!SB&084%`"#&0dC'aTBLjS!*!$"+$(p0QJar6
  72. XCS-Idf3!B!!)!!#KJ8e4553%)8h4bD@jR,QJ!N!-%S*c03k#Fc81JR-e$!"J!!J!
  73. X!+!03390$!3K`BA0MB@`ZD!#3!`5JR-BRS*c'*k#FaLF!'J!#!!!S!e&958-"#e&
  74. XeD@0VC(*KGbjS!!!%S*c&jU#FaHDJR-AQ!"J!!J!!+!0'6dj8!3P'Efjd6@Gb,QJ
  75. X!!!5JR-A9S*c&eD#FaG8!'J!#!!!S!d9@48i"#N9fC@jd6@Gb,QJ!N!-%S*c'Hk#
  76. XFaRZJR-Cl!"S!!J!!+!0A58j%!3YAD@jNEhG0Ch)ZD!!!"+#FaJ5JR-B%S*c'"!!
  77. XB!!)!!#J$689193%*6@9ZG8eRFLjS!!!%S*c'Ak#FaPqJR-CI!"`!!J!!+!069%4
  78. X'!3a6G'4'D@aP8'YR,QJ!E`!%S*c'2k#FaMqJR-Br!"`!!J!!+!0648G0!3a6C@G
  79. XYC@jd6'4b,QJ!E`!%S*c'ED#FaQfJR-CY!"`!!J!!+!086dp-!3e8EfpXBQpi9A4
  80. XTE#jS!!!%S*c'$U#FaJkJR-B1!"J!!J!!+!028e98!3K28e9dD@`ZD!"T!!5JR-A
  81. X$S*c&`k#FaF-!'J!#!!!S!d4*38`"#d4TB@a[CdeRFLjS!!!%S*c&fU#FaGUJR-A
  82. XD!"J!!J!!+!0'58a&!3P'D@aP6@Gb,QJ!!!5JR-AXS*c&l+#FaH`!&!!#!!!S!dK
  83. X'8bi""8K'8bjS!!!%S,%p&D#a24@JX6d9!"B!!J!!+!0$6da2!3G$Efa[FLjS!!!
  84. X%S*c'+k#FaLZJR-BV!"`!!J!!+!054902!3e5CA0[GA*MC8eRFLjS!!!%SLQSeU)
  85. XTU0DL+DM@!"J!!3!!+GC&@&4&!!KPH(4PFQiZD!"R!!5L(KZDSKiEQU)H'jS!'J!
  86. X"!!!TeNe"3d%!#NeKBd&XCA*d,QJ!,J!"SKiHBD)H(Q'L(KjK!"S!!3!!+GC349*
  87. X0!!T`CA*YEfjcG#jS!#i!!U)H(DUL(KfUSKiGUJ!B!!%!!#R@68p133!*E@pZBA4
  88. XdDbjS!!!#SKiGiU)H(H+L(KhL!"J!!3!!+GC06dj'!!PYEfjQE'&R,QJ!!!'L(Ki
  89. XZSKiH,U)H(Li!'J!"!!!TeNp#5N-!#QpLDQ0XBA0c,QJ!,J!"S*c&Sk#FaD1JR-@
  90. XM!"`!!J!!+!0$6dj8!!a$EfjdFQpX6@Gb,QJ!!)!!"J3!N!2m!J!*#3!"!!$rN!L
  91. XL(MID!"B!!3!!+G906dj6!!GYEfjcG#jM!!!"S*c0ED#Fc@fJR-eY!"S!!J!!*rj
  92. X0380)!3T0B@0)C@&NCA*c!#i!!D)XD3kL,'N1SLaT$J!B!!%!!#R@3dp14J!)Bfp
  93. XZCQPR,QJ!F`!#SKiHpk)H([HL(Klh!"S!!3!!+GC88N&%!!TdFQ&NFh4NBbjS!#i
  94. X!!U)H(8@L(Ke&SKiG43!B!!%!!#R@4da23J!)Cfa[BQ&X,QJ!D!!$S-IeYk$(pEH
  95. XJar@h!"B!!J!!+'"69%4*!3GcG'4TEbjS!!!$SKiEqD)H'rQL(K[j!"B!!3!!+GC
  96. X$6dp5!!GMEfpbC#jS!!!$SLF,iU)R#q+L*`[L!"J!!3!!+GC0380$!!PYB@0MEfj
  97. XQ,QJ!!!5L(Ki'SKiH"U)H(JB!&J!"!!!TeNe64%m!"fecC'pc,QJ!!!5L(Kl6SKi
  98. XHdk)H(Y-!'!!"!!!TeP0C8e3!#(0jFh4PE5jS!*!$"+#FhH@JR0hPS*cGj3!@!!)
  99. X!!#KJ9%P043%'G'PYC5jS!'J!"+#Fh6HJR0dhS*cG0`!@!!)!!#KJ4N019!%(4Q0
  100. XZG'`ZD!!!"+#FhDbJR0fXS*cGV!!B!!)!!#KJ8e4%4!%)8h4NC'9Q,QJ!N!-%S*c
  101. XGeD#FhG@JR0h9!"J!!J!!+'"69%4-!3K6G'4XD@)ZD!#3!`5Jar6CS-IdfD$(p0N
  102. X!'!!#!!!SB&088NN"#&0dFQPZCbjS!*!$"+#Fc81JR-e$S*c03`!B!!)!!#J$8%&
  103. X63`%)F'&cBf&X,QJ!N!-%S*c'*k#FaLHJR-BR!"S!!J!!+!0498P$!3Y4G@PMDf4
  104. XbBAFZD!!!"+#FaHDJR-AQS*c&jJ!B!!)!!#J$4Np19!%*4QpZG%eRFLjS!!!%S*c
  105. X&eD#FaG@JR-A9!"S!!J!!+!0&9N91!3T&GQ9ZG%eRFLjS!*!$"+#FaRZJR-ClS*c
  106. X'H`!D!!)!!#J$9dP14!%,9fPZC'ph6@Gb,QJ!!!5JR-B%S*c'"+#FaJ3!'!!#!!!
  107. XS!de&6P8"#8ePER90Ch)ZD!!!"+#FaPqJR-CIS*c'A`!F!!)!!#J$8e4%4J%-8h4
  108. XN4QPXC9"VCbjS!*!$"+#FaMqJR-BrS*c'2`!F!!)!!#J$8d9(63%-8f9RE@9ZG%a
  109. XNFLjS!*!$"+#FaQfJR-CYS*c'E3!F!!)!!#J$9%p26!%09'p[E'*[H&9dD@`ZD!!
  110. X!"+#FaJkJR-B1S*c'$J!B!!)!!#J$6e099!%)6e09G'PX,QJ!D3!%S*c&`k#FaF1
  111. XJR-A$!"S!!J!!+!0%58&-!3Y%D@&XEfG0Ch)ZD!!!"+#FaGUJR-ADS*c&fJ!B!!)
  112. X!!#J$4NP-43%*4QPXC8eRFLjS!!!%S*c&l+#FaHbJR-AX!"3!!J!!+!0)4P-Z!39
  113. X)4P-ZD!!!"+#a24@JX6d9S,%p&3!@!!)!!#J$3dp-6`%(3fpXEh)ZD!!!"+#FaLZ
  114. XJR-BVS*c'+`!F!!)!!#J$8N966`%08Q9cEh9bBf90Ch)ZD!!!"+)TU0DL+DM@SLQ
  115. XSeJ!B!!%!!#R@49K843!)CAKdCA*Z,QJ!C`!%SKiEQU)H'jUL(KZD!"S!!3!!+GC
  116. X0380"!!T0B@0"E'9bG#jS!#i!!D)H(Q'L(KjKSKiHB3!D!!%!!#R@8%9563!+F'9
  117. XbE@pZFh3ZD!!Z!!+L(KfUSKiGUU)H(DS!'!!"!!!TeNe26N%!#@e[EQ&dG'XZD!!
  118. X!!U)H(H+L(KhLSKiGiJ!B!!%!!#R@68p14J!*E@pZCQaKCbjS!!!"SKiH!D)H(J'
  119. XL(Ki"!"J!!3!!+GC06dj6!!KYEfjcH@dZD!#3!`'L(K`hSKiF0k)H($F!&J!"!!!
  120. XTeN965%X!"Q9cD'XZD!"S!!'L(Kp&SKiI4D)H(d8!&J!"!!!TePC"98`!"hCKG@a
  121. Xd,QJ!!!'L(K``SKiF-+)H($!!&J!"!!!TeN938NN!"Q9`FQNZD!#3!`'L(K[$SKi
  122. XE`k)H'm-!&J!"!!!TeN026%m!"f0[E'pb,QJ!JJ!&F!#3!rJ#!!N*!!%!!2q3#+)
  123. XN!Zd!'!!"!!!Te8p#5N8!#@pLDQ9MG(-ZB`!!!D#Fc@fJR-eYS*c0E3!D!!)!!#I
  124. Xq68&$5!%+6@&M5'9KC'9bF`!Z!!'L,'N1SLaT$U)XD3i!'!!"!!!TeN026NB!#'0
  125. X[EQCTCbjS!(-!!U)H([HL(KlhSKiHp`!D!!%!!#R@9&*"4!!+G(*KC(0dC'-ZD!!
  126. XZ!!+L(Ke&SKiG4D)H(88!'!!"!!!TeNG-6d)!#'GXEf*KE#jS!'J!!k$(pEHJar@
  127. XhS-IeY`!@!!)!!#KJ8e4%53%(Fh4ND@mZD!!!!k)H'rQL(K[jSKiEq3!@!!%!!#R
  128. X@3dp28J!(Bfp[FQ3ZD!!!!k)R#q+L*`[LSLF,iJ!B!!%!!#R@68&$3`!*E@&MBfp
  129. XZCLjS!!!%SKiH"U)H(JDL(Ki'!"B!!3!!+GC08d42!!GYFf4[FbjS!!!%SKiHdk)
  130. XH(Y1L(Kl6!"J!!3!!+GC6@908!!KcHA0dC@dZD!#3!`5JR0hPS*cGjD#FhH8!&J!
  131. X#!!!SB&4*688""R4TE@8ZD!"S!!5JR0dhS*cG0k#Fh6F!&J!#!!!SB%C$6P3""dC
  132. XMER4X,QJ!!!5JR0fXS*cGV+#FhD`!'!!#!!!SB&084%3"#&0dC'4PCLjS!*!$"+#
  133. XFhG@JR0h9S*cGe3!B!!)!!#KJ8e4%6!%)8h4NE'PL,QJ!N!-%S-IdfD$(p0QJar6
  134. XC!"J!!J!!+'"69&**!3K6G(*TEQFZD!#3!`5JR-e$S*c03k#Fc8-!'!!#!!!S!e"
  135. X"8d-"#("KFf0KE#jS!*!$"+#FaLHJR-BRS*c'*`!D!!)!!#J$899*3`%,8A9TBfY
  136. XNFQ&h,QJ!!!5JR-AQS*c&jU#FaHB!'!!#!!!S!dC26P3"#8C[ER40Ch)ZD!!!"+#
  137. XFaG@JR-A9S*c&e3!D!!)!!#J$49C&6J%+4ACPER40Ch)ZD!#3!`5JR-ClS*c'Hk#
  138. XFaRX!'J!#!!!S!eG*6N3"#eGTEQ4[GdeRFLjS!!!%S*c'"+#FaJ5JR-B%!"J!!J!
  139. X!+!0048j9!3P0C@je6@Gb,QJ!!!5JR-CIS*c'Ak#FaPm!(!!#!!!S!e084%B"$&0
  140. XdC%CTE'93DfFZD!#3!`5JR-BrS*c'2k#FaMm!(!!#!!!S!e0&4dd"$&0PCfePER4
  141. X-C()ZD!#3!`5JR-CYS*c'ED#FaQd!(!!#!!!S!e426d`"$94[EfaLEhK9G'PX,QJ
  142. X!!!5JR-B1S*c'$U#FaJi!'!!#!!!S!dp6993"#%p69A4TE#jS!'N!"+#FaF1JR-A
  143. X$S*c&``!D!!)!!#J$4%P"6!%,4'PKE'pR6@Gb,QJ!!!5JR-ADS*c&fU#FaGS!'!!
  144. X#!!!S!dC*6%8"#8CTE'90Ch)ZD!!!"+#FaHbJR-AXS*c&l!!8!!)!!#J$5%C6,J%
  145. X&5%C6,QJ!!!5JX6d9S,%p&D#a248!&J!#!!!S!d026%m""d0[E'pb,QJ!!!5JR-B
  146. XVS*c'+k#FaLX!(!!#!!!S!e*&8dm"$9*PFfpeFQ0P6@Gb,QJ!!!5L+DM@SLQSeU)
  147. XTU0B!'!!"!!!TeN9B9%8!#'9iG'9bELjS!'F!"+)H'jUL(KZDSKiEQJ!D!!%!!#R
  148. X@68&$33!+6@&M3@aPFR3ZD!!Z!!'L(KiESKiH'k)H(KX!&!!"!!!TeNp#5Li!"@p
  149. XLDLjS!!!"SKiH,U)H(LkL(KiZ!"S!!3!!+GC23NT$!!T[BQTME'&cFbjS!#i!!D)
  150. XH(QQL(KjTSKiHD3!@!!%!!#R@8&*28!!'F(*[F#jS!(-!!D)H'm1L(K[$SKiE``!
  151. X@!!%!!#R@3dp-6`!(BfpXEh)ZD!!!!B)!"0`!N!2d!J!*#3!"!!$rN!LL(MXi!"B
  152. X!!3!!+G9338j*!!G`B@jTBbjM!!!"S*c0ED#Fc@fJR-eY!"S!!J!!*rj0380)!3T
  153. X0B@0)C@&NCA*c!#i!!D)XD3kL,'N1SLaT$J!B!!%!!#R@3dp14J!)BfpZCQPR,QJ
  154. X!F`!#SKiHpk)H([HL(Klh!"S!!3!!+GC88N&%!!TdFQ&NFh4NBbjS!#i!!U)H(8@
  155. XL(Ke&SKiG43!B!!%!!#R@4da23J!)Cfa[BQ&X,QJ!D!!$S-IeYk$(pEHJar@h!"B
  156. X!!J!!+'"69%4*!3GcG'4TEbjS!!!$SKiEqD)H'rQL(K[j!"B!!3!!+GC$6dp5!!G
  157. XMEfpbC#jS!!!$SLF,iU)R#q+L*`[L!"J!!3!!+GC0380$!!PYB@0MEfjQ,QJ!!!5
  158. XL(Ki'SKiH"U)H(JB!&J!"!!!TeNe64%m!"fecC'pc,QJ!!!5L(Kl6SKiHdk)H(Y-
  159. X!'!!"!!!TeP0C8e3!#(0jFh4PE5jS!*!$"+#FhH@JR0hPS*cGj3!@!!)!!#KJ9%P
  160. X043%'G'PYC5jS!'J!"+#Fh6HJR0dhS*cG0`!@!!)!!#KJ4N019!%(4Q0ZG'`ZD!!
  161. X!"+#FhDbJR0fXS*cGV!!B!!)!!#KJ8e4%4!%)8h4NC'9Q,QJ!N!-%S*cGeD#FhG@
  162. XJR0h9!"J!!J!!+'"69%4-!3K6G'4XD@)ZD!#3!`5Jar6CS-IdfD$(p0N!'!!#!!!
  163. XSB&088NN"#&0dFQPZCbjS!*!$"+#Fc81JR-e$S*c03`!B!!)!!#J$8%&63`%)F'&
  164. XcBf&X,QJ!N!-%S*c'*k#FaLHJR-BR!"S!!J!!+!0498P$!3Y4G@PMDf4bBAFZD!!
  165. X!"+#FaHDJR-AQS*c&jJ!B!!)!!#J$4Np19!%*4QpZG%eRFLjS!!!%S*c&eD#FaG@
  166. XJR-A9!"S!!J!!+!0&9N91!3T&GQ9ZG%eRFLjS!*!$"+#FaRZJR-ClS*c'H`!D!!)
  167. X!!#J$9dP14!%,9fPZC'ph6@Gb,QJ!!!5JR-B%S*c'"+#FaJ3!'!!#!!!S!de&6P8
  168. X"#8ePER90Ch)ZD!!!"+#FaPqJR-CIS*c'A`!F!!)!!#J$8e4%4J%-8h4N4QPXC9"
  169. XVCbjS!*!$"+#FaMqJR-BrS*c'2`!F!!)!!#J$8d9(63%-8f9RE@9ZG%aNFLjS!*!
  170. X$"+#FaQfJR-CYS*c'E3!F!!)!!#J$9%p26!%09'p[E'*[H&9dD@`ZD!!!"+#FaJk
  171. XJR-B1S*c'$J!B!!)!!#J$6e099!%)6e09G'PX,QJ!D3!%S*c&`k#FaF1JR-A$!"S
  172. X!!J!!+!0%58&-!3Y%D@&XEfG0Ch)ZD!!!"+#FaGUJR-ADS*c&fJ!B!!)!!#J$4NP
  173. X-43%*4QPXC8eRFLjS!!!%S*c&l+#FaHbJR-AX!"3!!J!!+!0)4P-Z!39)4P-ZD!!
  174. X!"+#a24@JX6d9S,%p&3!@!!)!!#J$3dp-6`%(3fpXEh)ZD!!!"+#FaLZJR-BVS*c
  175. X'+`!F!!)!!#J$8N966`%08Q9cEh9bBf90Ch)ZD!!!"+)TU0DL+DM@SLQSeJ!B!!%
  176. X!!#R@49K843!)CAKdCA*Z,QJ!C`!%SKiEQU)H'jUL(KZD!"S!!3!!+GC0380"!!T
  177. X0B@0"E'9bG#jS!#jMD)!!!$!!N!2`!!!*#3!"!!$rN!LJb!28!"3!!J!!+&P"6P0
  178. X*!!4"6P0*!#k!!!!`!*!$l!!!#3N!!3!!rj!)S-J0[!!8!!)!!#KC98j*@!!%G@j
  179. XTH!!ZJ!!!0!#3!qJ!!!N*!!%!!2q3#+#Z`J)!'!!#!!!S"8e"3e3!#%eKBe4bBA"
  180. Xc!!##!!6F!*!$j!)!#3N!!3!!rj!)SKiPl`!@!!%!!#R938a-6`!(B@aXEf-ZB`!
  181. X!!D#Fc@fJR-eYS*c0E3!D!!)!!#Iq68&$5!%+6@&M5'9KC'9bF`!Z!!'L,'N1SLa
  182. XT$U)XD3i!'!!"!!!TeN026NB!#'0[EQCTCbjS!(-!!U)H([HL(KlhSKiHp`!D!!%
  183. X!!#R@9&*"4!!+G(*KC(0dC'-ZD!!Z!!+L(Ke&SKiG4D)H(88!'!!"!!!TeNG-6d)
  184. X!#'GXEf*KE#jS!'J!!k$(pEHJar@hS-IeY`!@!!)!!#KJ8e4%53%(Fh4ND@mZD!!
  185. X!!k)H'rQL(K[jSKiEq3!@!!%!!#R@3dp28J!(Bfp[FQ3ZD!!!!k)R#q+L*`[LSLF
  186. X,iJ!B!!%!!#R@68&$3`!*E@&MBfpZCLjS!!!%SKiH"U)H(JDL(Ki'!"B!!3!!+GC
  187. X08d42!!GYFf4[FbjS!!!%SKiHdk)H(Y1L(Kl6!"J!!3!!+GC6@908!!KcHA0dC@d
  188. XZD!#3!`5JR0hPS*cGjD#FhH8!&J!#!!!SB&4*688""R4TE@8ZD!"S!!5JR0dhS*c
  189. XG0k#Fh6F!&J!#!!!SB%C$6P3""dCMER4X,QJ!!!5JR0fXS*cGV+#FhD`!'!!#!!!
  190. XSB&084%3"#&0dC'4PCLjS!*!$"+#FhG@JR0h9S*cGe3!B!!)!!#KJ8e4%6!%)8h4
  191. XNE'PL,QJ!N!-%S-IdfD$(p0QJar6C!"J!!J!!+'"69&**!3K6G(*TEQFZD!#3!`5
  192. XJR-e$S*c03k#Fc8-!'!!#!!!S!e""8d-"#("KFf0KE#jS!*!$"+#FaLHJR-BRS*c
  193. X'*`!D!!)!!#J$899*3`%,8A9TBfYNFQ&h,QJ!!!5JR-AQS*c&jU#FaHB!'!!#!!!
  194. XS!dC26P3"#8C[ER40Ch)ZD!!!"+#FaG@JR-A9S*c&e3!D!!)!!#J$49C&6J%+4AC
  195. XPER40Ch)ZD!#3!`5JR-ClS*c'Hk#FaRX!'J!#!!!S!eG*6N3"#eGTEQ4[GdeRFLj
  196. XS!!!%S*c'"+#FaJ5JR-B%!"J!!J!!+!0048j9!3P0C@je6@Gb,QJ!!!5JR-CIS*c
  197. X'Ak#FaPm!(!!#!!!S!e084%B"$&0dC%CTE'93DfFZD!#3!`5JR-BrS*c'2k#FaMm
  198. X!(!!#!!!S!e0&4dd"$&0PCfePER4-C()ZD!#3!`5JR-CYS*c'ED#FaQd!(!!#!!!
  199. XS!e426d`"$94[EfaLEhK9G'PX,QJ!!!5JR-B1S*c'$U#FaJi!'!!#!!!S!dp6993
  200. X"#%p69A4TE#jS!'N!"+#FaF1JR-A$S*c&``!D!!)!!#J$4%P"6!%,4'PKE'pR6@G
  201. Xb,QJ!!!5JR-ADS*c&fU#FaGS!'!!#!!!S!dC*6%8"#8CTE'90Ch)ZD!!!"+#FaHb
  202. XJR-AXS*c&l!!8!!)!!#J$5%C6,J%&5%C6,QJ!!!5JX6d9S,%p&D#a248!&J!#!!!
  203. XS!d026%m""d0[E'pb,QJ!!!5JR-BVS*c'+k#FaLX!(!!#!!!S!e*&8dm"$9*PFfp
  204. XeFQ0P6@Gb,QJ!!!5L+DM@SLQSeU)TU0B!'!!"!!!TeN9B9%8!#'9iG'9bELjS!'F
  205. X!"+)H'jUL(KZDSKiEQJ!D!!%!!#R@68&$33!+6@&M3@aPFR3ZD!!ZS*b!!!6F!*!
  206. X$i!)!#3N!!3!!rj!)SKj,$3!B!!%!!#R968&$4J!*E@&MCQPXC5jM!!!"S*c0ED#
  207. XFc@fJR-eY!"S!!J!!*rj0380)!3T0B@0)C@&NCA*c!#i!!D)XD3kL,'N1SLaT$J!
  208. XB!!%!!#R@3dp14J!)BfpZCQPR,QJ!F`!#SKiHpk)H([HL(Klh!"S!!3!!+GC88N&
  209. X%!!TdFQ&NFh4NBbjS!#i!!U)H(8@L(Ke&SKiG43!B!!%!!#R@4da23J!)Cfa[BQ&
  210. XX,QJ!D!!$S-IeYk$(pEHJar@h!"B!!J!!+'"69%4*!3GcG'4TEbjS!!!$SKiEqD)
  211. XH'rQL(K[j!"B!!3!!+GC$6dp5!!GMEfpbC#jS!!!$SLF,iU)R#q+L*`[L!"J!!3!
  212. X!+GC0380$!!PYB@0MEfjQ,QJ!!!5L(Ki'SKiH"U)H(JB!&J!"!!!TeNe64%m!"fe
  213. XcC'pc,QJ!!!5L(Kl6SKiHdk)H(Y-!'!!"!!!TeP0C8e3!#(0jFh4PE5jS!*!$"+#
  214. XFhH@JR0hPS*cGj3!@!!)!!#KJ9%P043%'G'PYC5jS!'J!"+#Fh6HJR0dhS*cG0`!
  215. X@!!)!!#KJ4N019!%(4Q0ZG'`ZD!!!"+#FhDbJR0fXS*cGV!!B!!)!!#KJ8e4%4!%
  216. X)8h4NC'9Q,QJ!N!-%S*cGeD#FhG@JR0h9!"J!!J!!+'"69%4-!3K6G'4XD@)ZD!#
  217. X3!`5Jar6CS-IdfD$(p0N!'!!#!!!SB&088NN"#&0dFQPZCbjS!*!$"+#Fc81JR-e
  218. X$S*c03`!B!!)!!#J$8%&63`%)F'&cBf&X,QJ!N!-%S*c'*k#FaLHJR-BR!"S!!J!
  219. X!+!0498P$!3Y4G@PMDf4bBAFZD!!!"+#FaHDJR-AQS*c&jJ!B!!)!!#J$4Np19!%
  220. X*4QpZG%eRFLjS!!!%S*c&eD#FaG@JR-A9!"S!!J!!+!0&9N91!3T&GQ9ZG%eRFLj
  221. XS!*!$"+#FaRZJR-ClS*c'H`!D!!)!!#J$9dP14!%,9fPZC'ph6@Gb,QJ!!!5JR-B
  222. X%S*c'"+#FaJ3!'!!#!!!S!de&6P8"#8ePER90Ch)ZD!!!"+#FaPqJR-CIS*c'A`!
  223. XF!!)!!#J$8e4%4J%-8h4N4QPXC9"VCbjS!*!$"+#FaMqJR-BrS*c'2`!F!!)!!#J
  224. X$8d9(63%-8f9RE@9ZG%aNFLjS!*!$"+#FaQfJR-CYS*c'E3!F!!)!!#J$9%p26!%
  225. X09'p[E'*[H&9dD@`ZD!!!"+#FaJkJR-B1S*c'$J!B!!)!!#J$6e099!%)6e09G'P
  226. XX,QJ!D3!%S*c&`k#FaF1JR-A$!"S!!J!!+!0%58&-!3Y%D@&XEfG0Ch)ZD!!!"+#
  227. XFaGUJR-ADS*c&fJ!B!!)!!#J$4NP-43%*4QPXC8eRFLjS!!!%S*c&l+#FaHbJR-A
  228. XX!"3!!J!!+!0)4P-Z!39)4P-ZD!!!"+#a24@JX6d9S,%p&3!@!!)!!#J$3dp-6`%
  229. X(3fpXEh)ZD!!!"+#FaLZJR-BVS*c'+`!F!!)!!#J$8N966`%08Q9cEh9bBf90Ch)
  230. XZD!!!"+)TU0DL+DM@SLQSeJ!B!!%!!#R@49K843!)CAKdCA*Z,QJ!C`!%SKiEQU)
  231. XH'jUL(KZD!"S!!3!!+GC0380"!!T0B@0"E'9bG#jS!#k!!!!S!*!$h!#3#8B!!3#
  232. X3"4S!N!-"!!J%E@&TEL#3!`!!!SJ!"+#FaMqJR-BrS*c'2`!F!!)!!#J$8d9(63%
  233. X-8f9RE@9ZG%aNFLjS!*!$"+#FaQfJR-CYS*c'E3!F!!)!!#J$9%p26!%09'p[E'*
  234. X[H&9dD@`ZD!!!"+#FaJkJR-B1S*c'$J!B!!)!!#J$6e099!%)6e09G'PX,QJ!D3!
  235. X%S*c&`k#FaF1JR-A$!"S!!J!!+!0%58&-!3Y%D@&XEfG0Ch)ZD!!!"+#FaGUJR-A
  236. XDS*c&fJ!B!!)!!#J$4NP-43%*4QPXC8eRFLjS!!!%S*c&l+#FaHbJR-AX!"3!!J!
  237. X!+!0)4P-Z!39)4P-ZD!!!"+#a24@JX6d9S,%p&3!@!!)!!#J$3dp-6`%(3fpXEh)
  238. XZD!!!"+#FaLZJR-BVS*c'+`!F!!)!!#J$8N966`%08Q9cEh9bBf90Ch)ZD!!!"+)
  239. XTU0DL+DM@SLQSeJ!B!!%!!#R@49K843!)CAKdCA*Z,QJ!C`!%SKiEQU)H'jUL(KZ
  240. XD!"S!!3!!+GC0380"!!T0B@0"E'9bG#jS!#jMD)!!!$!!N!2`!!!*#3!"!!$rN!L
  241. XJb!28!"3!!J!!+&P"6P0*!!4"6P0*!#k!!!!`!*!$l!!!#3N!!3!!rj!)S-J0[!!
  242. X8!!)!!#KC98j*@!!%G@jTH!!ZJ!!!0!#3!qJ!!!N*!!%!!2q3#+#Z`J)!'!!#!!!
  243. XS"8e"3e3!#%eKBe4bBA"c!*!&D!#3!``+6%aKFh4$E'PMDb#!!!!S!!!'D!!!"Q`
  244. X!"J!!!QJ!!3!'!!!,+J!"!*!$#!C-3faTBfXJJ!!!,!!!"Q3!N!8'!!!"L!!"!!B
  245. X!!!UU!!%!N!--#%a6CA4$C@aX)*!$!*!$$!!!"Q!!!!CN!!!#3!!!!3#3"'!!N"-
  246. X%!*!H5-!"!`!(!*!$r!#3!f!!N"-%!*!H5-!"!`!)!*!$q!#3!f!!N"-%!*!J!3-
  247. X!"J#3!r3!N!0J!*!6"!#3(NM!!3-!N!A`!*!$B!#3%`3!N"jNFJ)%!!%!N!2X!*!
  248. X$B!#3%`3!N"m#!3-!!J#3!qJ!N!0J!*!6"!#3(Q4b!3-!!`#3!q3!N!0J!*!6"!#
  249. X3(Lf-!3-!"3#3!q!!N!0J!*!6"!#3(L!)!3-!"!!!"c!!N!-+!*!Eh%*i#NUGcNk
  250. Xk!&41ZJ"Q,$a*6N4B6VS&ENIkrmSQM%IkrmJQK%kk!'C1ZJ+S6VS'*Nkk!0a1ZJ#
  251. XS3QG)H2rr5'm!"%KA2c`!!5)krl*1ZJ1#6V83!#"Y!'a1N!#Tp&(i#Pjq!%kk![T
  252. XR#%U3!'F%#0!!"Nje)$J+H'B-,$aD6dj&6VS&"#!-4rVrCLD!6R9CMbmm4%&838*
  253. XRUD!J9b"3)RJ*##!0N!#*4rVr6LD!S#kTSb`m8e458dkk"-j(q[mf*S`X2%4548a
  254. X1ZJ5q)%`J"'F-6VS"YJ5!!*!$$'Ed6[S&DNj@rpT"q!N3)Np`)+!ZF!(3%9S4dX"
  255. X"qJ!5F!@J,P@25'm!!UQA6Pj1G5jbFh*M!%Ik"HiQZ!Tm,cJ+J'B#@)p1G8MRrrJ
  256. Xq,`!m8IJ+AQ!+@Bm[#+QP)"qJ3%kk!L4R4%IkrVJQL#!3CqBL3%U4CLi!%!$!,$a
  257. X$8N9-6VS%,'FN2Lm!2#"-)!4R$%kk!(J%J!#3!`aQp%kk"0"1ZJ'F60mIrdjeF!q
  258. XTb8kk"Aa1ZJ!)6VS%p%je)(J+l+!P)&!L5#)BB!T"k!!)G!'%'0$#8FRrp*!!L0#
  259. X*CJ*1G5)!S#iJH!VX)!'J*#*36qrr`#"23UJ!%M&T!!3!&U!93UG)D3!-)%qTmM)
  260. XB6VS"RL4BeF%d'#)BEM*R&P*"C`C53@FD6R8b+2rd6VS"Z0056R8b+2rd6VS"L00
  261. X56R8b+2rd6VS"MY1Urrj1G8kk!8ib+3!-5QN!#QBF9%*U$("MUFP53QEide*1G8k
  262. Xk!965U3!1de*1G8kk!@c5U3!18N*Q"0056R9$p4!#[P&Qe!aK2caQcP*#CJB+DJ!
  263. XArrib)9K")RVpI0+4NNV68Nje-KK1ZJ%14I83!0AB0"KR-L)BEL4R$P*"CK3b+2r
  264. Xd6VS"&Q!B-LMrp%kk!1KJ$M)Srr41ZJ$`B!C1ZJ%3dSh6NNje)KK1ZJ%%de*1G5"
  265. Xkr4!J1[d35UJ!!'FS-LJ!+'FL*#J!'&P#3qd!%02S!!69@6,m2ca#'4,S!$dbr+R
  266. X`88&Ql%(S!%!%J!#3!d"QaNje)(Vmc#!kr-abrh3!5UJ!!'FB[LJ!2@B50LJ!+'F
  267. X-e%1bU!!%C33L+!!%3HJ!3!5!!*!$3'E@)(VmUL"3"%%!%$$"jNS``Nje@Bm[2%0
  268. X24%8r"kQJ)&p3q!TH)!K1G5Kkr(BLG"J!Nq`!102-6R8SH[aH`[`!3#)d'"JSH[a
  269. XQdT41G5Kkr%V#r!"!)M3B#*+kr%j1G5Kkr$M#r!"!)M3B%0+kr$K1G5Kkr#E#r!"
  270. X!)M3B"!D"!*!$%%je6VVrSM)T!!a+D3!+CJC1Z[qiB!41Z[r@dUN!$Nje)&mb'$3
  271. XBX&KAbIrk5N*RrNl`)2`JAc)B0"L`Q&I*rrT+3QIq6[!JqL"I-KJd',"#EJU3!%&
  272. XY"Y"!3I!!!M!3Crj1m!!!)#m!"#p"!!3L,`!),em!"%MR2!!N!#B"5%,%`bJ!+J&
  273. X)4FM&e%4)3T!$`-(3JNcI!$`L(dje)#m!"#p"!!3L,`!),em!"%MR-3"1ZJ#F60m
  274. X!M#)I6R8J,`!%,d%!"#)[!!J[A`!%51Fa!%kk!(`J!8cI!)`L(dje)#m!"#p"!!3
  275. XL,`!),em!"%MR-3"1ZJ!X60m!M#)I6R8J,`!%,d%!"#)[!!J[A`!%51Fa!%kk!!`
  276. XJ!8cI!)`L(dje5S"U(%U"DJa%J%5"6VS!)%5"6R9%J%kk!"C%J%5"6R9+J@S+4)&
  277. X1ZJ!'4)"1G5im!!$rrl+!B`BL!(!!6R@`Kf)-J-&)3$)!3N")3%jeXSGL'Li!3N"
  278. X)3)$"5%")4ci!5%H1`6!(5%Fb"dje*!!Q!H+)iSQbKf,iJ-(!Kc)$`X!Z!dK(cX"
  279. X)4p+(C3L5JQ)%4)&1G90!B14q!&(i#PjCMbm'2`HTS#!IC`!!VLC!@Bm[#kQP*Km
  280. XJ#bJ$8NI[4e*(1JGJ&PQ2,`Br"kQJ)"pR!!#)8NF'K!!!Irj9Mbm!UDB`(`J!!!9
  281. XQh&$i#Pl24CT(CK`J!k"!,`ZTSL!6C`!!@Lm,UC)S8b",S#P`!8je)!5K(L!)C`!
  282. X!3LK),`ZTSL!6C`!!0L",)!0J'&Q2,`Br"kQJ)"pR!!!L8NFJ3#!m!!"rrLm))&!
  283. XL60R!S#kTSe(0rpUCa#C-F!&1G5",5N9Q"+!M6R@J(dje-MbTm%2kqXC1ZJ"S-Mb
  284. XTmN2kqbK1ZJ"F-MbTmd2kqaa1ZJ"3-MbTp%2kq`K1qJ"%,`JJE`!),fJ!!J!))(J
  285. X#TR!-d*!!X,J#UQBN6VS!C$)mUI"1ZJ"%-MbTmNkk!$`b2+Rc6VS!0$)mUI41ZJ!
  286. XX)&p1G6!"S8BN5(!-5RJ#MQS%T4jJ!U%H-!'J4c$m6VNJb6$m6[NJbNje-!'K4L*
  287. XS!!LJ(c!")%QJ4dje!*!%6R8J1[riC`3J3%+3!%je!!!"!*!$0IS!!$6k!!!"QJ!
  288. XNEb!$8!#3!a`"NJ!15%&65!#3!hTD6dj&!*!$KNY*6N3!N!159da23`#3!jj*6N4
  289. XB!*!$UN024%8!!`#f4%&833#3!qC69&*6!*!$mN4548`!N!2q8eP08`!!!3T$6NC
  290. X(!!!"&P0*@N8!!!%L3e*&6!!"!5j%3P9(!!%"4PK6@8d!!3&H!!%!N!FQl%`!!2r
  291. Xr!!!(IJ!Ql0J!!2rr!!!$p!!QlG!!!2rr!!!(A!!Ql(3!!2rr!!!VJJ!QlD`!!2r
  292. Xr!!!&AJ!QlI`!!rrr!!!&`J#3"36rr`!!"FS!N!8"rrm8!#h'!#EYi!!!rrm!!!A
  293. X5!#EXh!!!rrm!!!A@!#EXY!!!rrm!!!AD!#EYe!!!rrm!!!AH!#EXe!!#rrm!!!G
  294. X`!#EXl2rr!!B!!!93!#EYj!!$rrm!!!AL!*!&"2rr!!!&jJ#3"32rr`!!"HS!N!8
  295. X%rrm!!!AZ!*!&!rrr!!!&mJ#3"36rr`!!"IB!N!3&E@YKD'`"-N@Q!:
  296. END_OF_FILE
  297. if test 17003 -ne `wc -c <'mac/MD.proj.hqx'`; then
  298.     echo shar: \"'mac/MD.proj.hqx'\" unpacked with wrong size!
  299. fi
  300. # end of 'mac/MD.proj.hqx'
  301. fi
  302. if test -f 'src/objnam.c' -a "${1}" != "-c" ; then 
  303.   echo shar: Will not clobber existing file \"'src/objnam.c'\"
  304. else
  305. echo shar: Extracting \"'src/objnam.c'\" \(39021 characters\)
  306. sed "s/^X//" >'src/objnam.c' <<'END_OF_FILE'
  307. X/*    SCCS Id: @(#)objnam.c    3.0    89/11/15
  308. X/* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
  309. X/* NetHack may be freely redistributed.  See license for details. */
  310. X
  311. X#include    "hack.h"
  312. X#ifdef TUTTI_FRUTTI
  313. X#include <ctype.h>    /* for isalpha() */
  314. X#endif
  315. X
  316. X/* "an uncursed partly eaten guardian naga hatchling corpse" */
  317. X#define    PREFIX    50
  318. X#define SCHAR_MAX 127
  319. X
  320. X#ifndef OVLB
  321. X
  322. XSTATIC_DCL const char *keystr[N_LOX], *lockstr[N_LOX];
  323. X
  324. X#else /* OVLB */
  325. X/*    We want the player to be able to learn what key goes in what lock.  */
  326. XSTATIC_OVL const char NEARDATA *keystr[N_LOX] = { "round", "square", "triangular", "oval",
  327. X                          "octagonal", "hexagonal", "cylindrical",
  328. X                          "irregular", "conical", "wedge-shaped" },
  329. X             NEARDATA *lockstr[N_LOX] = { "round", "square", "triangular", "oval",
  330. X                          "octagonal", "hexagonal", "wide",
  331. X                          "notched", "large round", "large square" };
  332. X#endif /* OVLB */
  333. X
  334. XSTATIC_DCL int FDECL(named_key,(const char *));
  335. XSTATIC_DCL int FDECL(named_box,(const char *));
  336. XSTATIC_DCL char *FDECL(strprepend,(char *,const char *));
  337. X
  338. X#ifdef OVL1
  339. Xstatic char *FDECL(sitoa,(int));
  340. X#endif /* OVL1 */
  341. X
  342. Xstruct Jitem {
  343. X    int item;
  344. X    const char *name;
  345. X};
  346. X
  347. X#ifndef OVLB
  348. X
  349. XSTATIC_DCL struct Jitem Japanese_items[];
  350. X
  351. X#else /* OVLB */
  352. X
  353. XSTATIC_OVL struct Jitem Japanese_items[] = {
  354. X    { SHORT_SWORD, "wakizashi" },
  355. X    { BROADSWORD, "ninja-to" },
  356. X    { GLAIVE, "naginata" },
  357. X    /* { BOW, "yumi" }, */
  358. X    { LOCK_PICK, "osaku" },
  359. X    {0, "" }
  360. X};
  361. X
  362. X#endif /* OVLB */
  363. X
  364. XSTATIC_DCL const char *FDECL(Japanese_item_name,(int));
  365. X
  366. X#ifdef OVL1
  367. X
  368. XSTATIC_OVL int
  369. Xnamed_key(s) register const char *s; {
  370. X    char tc[BUFSZ];
  371. X    register int i;
  372. X
  373. X    for(i=0; i<10; i++) {
  374. X        Strcpy(tc, keystr[i]);
  375. X        Strcat(tc, " key");
  376. X        if(!strcmp(s,tc)) return(i+1);
  377. X    }
  378. X    return(0);
  379. X}
  380. X
  381. XSTATIC_OVL int
  382. Xnamed_box(s)
  383. Xregister const char *s;
  384. X{
  385. X    char tc[BUFSZ];
  386. X    register int i;
  387. X
  388. X    for(i=0; i<10; i++) {
  389. X        Strcpy(tc, lockstr[i]);
  390. X        Strcat(tc, " keyhole)");
  391. X        if(!strcmp(s,tc)) return(i+1);
  392. X    }
  393. X    return(0);
  394. X}
  395. X
  396. XSTATIC_OVL char *
  397. Xstrprepend(s,pref)
  398. Xregister char *s;
  399. Xregister const char *pref; {
  400. Xregister int i = strlen(pref);
  401. X    if(i > PREFIX) {
  402. X        pline("WARNING: prefix too short.");
  403. X        return(s);
  404. X    }
  405. X    s -= i;
  406. X    (void) strncpy(s, pref, i);    /* do not copy trailing 0 */
  407. X    return(s);
  408. X}
  409. X
  410. Xstatic char *
  411. Xsitoa(a) int a; {
  412. X#ifdef LINT    /* static char buf[13]; */
  413. X    char buf[13];
  414. X#else
  415. X    static char NEARDATA buf[13];
  416. X#endif
  417. X    Sprintf(buf, (a < 0) ? "%d" : "+%d", a);
  418. X    return(buf);
  419. X}
  420. X
  421. X#endif /* OVL1 */
  422. X#ifdef OVLB
  423. X
  424. Xchar *
  425. Xtypename(otyp)
  426. Xregister int otyp;
  427. X{
  428. X#ifdef LINT    /* static char buf[BUFSZ]; */
  429. Xchar buf[BUFSZ];
  430. X#else
  431. Xstatic char NEARDATA buf[BUFSZ];
  432. X#endif
  433. Xregister struct objclass *ocl = &objects[otyp];
  434. Xregister const char *actualn = ocl->oc_name;
  435. Xregister const char *dn = ocl->oc_descr;
  436. Xregister const char *un = ocl->oc_uname;
  437. Xregister int nn = ocl->oc_name_known;
  438. X
  439. X    if (pl_character[0] == 'S' && Japanese_item_name(otyp))
  440. X        actualn = Japanese_item_name(otyp);
  441. X    switch(ocl->oc_olet) {
  442. X    case POTION_SYM:
  443. X        Strcpy(buf, "potion");
  444. X        break;
  445. X    case SCROLL_SYM:
  446. X        Strcpy(buf, "scroll");
  447. X        break;
  448. X    case WAND_SYM:
  449. X        Strcpy(buf, "wand");
  450. X        break;
  451. X#ifdef SPELLS
  452. X    case SPBOOK_SYM:
  453. X        Strcpy(buf, "spellbook");
  454. X        break;
  455. X#endif
  456. X    case RING_SYM:
  457. X        Strcpy(buf, "ring");
  458. X        break;
  459. X    case AMULET_SYM:
  460. X        if(nn)
  461. X            Strcpy(buf,actualn);
  462. X        else
  463. X            Strcpy(buf,"amulet");
  464. X        if(un)
  465. X            Sprintf(eos(buf)," called %s",un);
  466. X        if(dn)
  467. X            Sprintf(eos(buf)," (%s)",dn);
  468. X        return(buf);
  469. X    default:
  470. X        if(nn) {
  471. X            Strcpy(buf, actualn);
  472. X            if(otyp >= TURQUOISE && otyp <= JADE)
  473. X                Strcat(buf, " stone");
  474. X            if(un)
  475. X                Sprintf(eos(buf), " called %s", un);
  476. X            if(dn)
  477. X                Sprintf(eos(buf), " (%s)", dn);
  478. X        } else {
  479. X            Strcpy(buf, dn ? dn : actualn);
  480. X            if(ocl->oc_olet == GEM_SYM) {
  481. X                if (otyp == LOADSTONE || otyp == LUCKSTONE)
  482. X                    Strcat(buf, " stone");
  483. X                else
  484. X                    Strcat(buf, " gem");
  485. X            }
  486. X            if(un)
  487. X                Sprintf(eos(buf), " called %s", un);
  488. X        }
  489. X        return(buf);
  490. X    }
  491. X    /* here for ring/scroll/potion/wand */
  492. X    if(nn)
  493. X        Sprintf(eos(buf), " of %s", actualn);
  494. X    if(un)
  495. X        Sprintf(eos(buf), " called %s", un);
  496. X    if(dn)
  497. X        Sprintf(eos(buf), " (%s)", dn);
  498. X    return(buf);
  499. X}
  500. X
  501. X/* Give the name of an object seen at a distance.  Unlike xname/doname,
  502. X * we don't want to set dknown if it's not set already.  The kludge used is
  503. X * to temporarily set Blind so that xname() skips the dknown setting.  This
  504. X * assumes that we don't want to do this too often; if this function becomes
  505. X * frequently used, it'd probably be better to pass a parameter to xname()
  506. X * or doname() instead.
  507. X */
  508. Xchar *
  509. Xdistant_name(obj, func)
  510. Xregister struct obj *obj;
  511. Xchar *FDECL((*func), (struct obj *));
  512. X{
  513. X    char *str;
  514. X
  515. X    long save_Blinded = Blinded;
  516. X    Blinded = 1;
  517. X    str = (*func)(obj);
  518. X    Blinded = save_Blinded;
  519. X    return str;
  520. X}
  521. X
  522. X#endif /* OVLB */
  523. X#ifdef OVL1
  524. X
  525. Xchar *
  526. Xxname(obj)
  527. Xregister struct obj *obj;
  528. X{
  529. X#ifdef LINT    /* lint may handle static decl poorly -- static char bufr[]; */
  530. Xchar bufr[BUFSZ];
  531. X#else
  532. Xstatic char bufr[BUFSZ];
  533. X#endif
  534. Xregister char *buf = &(bufr[PREFIX]);    /* leave room for "17 -3 " */
  535. Xregister int nn = objects[obj->otyp].oc_name_known;
  536. Xregister const char *actualn = objects[obj->otyp].oc_name;
  537. Xregister const char *dn = objects[obj->otyp].oc_descr;
  538. Xregister const char *un = objects[obj->otyp].oc_uname;
  539. X
  540. X    if (pl_character[0] == 'S' && Japanese_item_name((int)obj->otyp))
  541. X        actualn = Japanese_item_name((int)obj->otyp);
  542. X
  543. X    buf[0] = 0;
  544. X    if(!Blind) obj->dknown=1;
  545. X    switch(obj->olet) {
  546. X        case AMULET_SYM:
  547. X        if(obj->otyp == AMULET_OF_YENDOR) {
  548. X            Strcpy(buf, (obj->spe < 0 && obj->known) ?
  549. X               "cheap plastic imitation of the " : "");
  550. X            Strcat(buf, actualn);
  551. X        } else if (!obj->dknown)
  552. X            Strcpy(buf, "amulet");
  553. X        else if (nn)
  554. X            Strcpy(buf, actualn);
  555. X        else if (un)
  556. X            Sprintf(buf,"amulet called %s", un);
  557. X        else
  558. X            Sprintf(buf,"%s amulet", dn);
  559. X        break;
  560. X        case WEAPON_SYM:
  561. X        if(obj->otyp <= SHURIKEN && obj->opoisoned)
  562. X            Strcpy(buf, "poisoned ");
  563. X        case VENOM_SYM:
  564. X        case TOOL_SYM:
  565. X        if(un) {
  566. X            /* un must come first here.  If it does not, they could
  567. X             * tell objects apart by seeing which ones refuse to
  568. X             * accept names.
  569. X             */
  570. X            Sprintf(buf, "%s called %s",
  571. X                nn ? actualn : dn, un);
  572. X        } else if(nn)
  573. X            Strcat(buf, actualn);
  574. X        else
  575. X            Strcat(buf, dn);
  576. X        /* If we use an() here we'd have to remember never to use */
  577. X        /* it whenever calling doname() or xname(). */
  578. X        if(obj->otyp == FIGURINE)
  579. X            Sprintf(eos(buf), " of a%s %s",
  580. X            index(vowels,*(mons[obj->corpsenm].mname)) ? "n" : "",
  581. X            mons[obj->corpsenm].mname);
  582. X        break;
  583. X        case ARMOR_SYM:
  584. X        if(obj->otyp==DRAGON_SCALE_MAIL) {
  585. X            Sprintf(buf, "%s scale mail",
  586. X                        mons[obj->corpsenm].mname);
  587. X            break;
  588. X        }
  589. X
  590. X        if(is_boots(obj) || is_gloves(obj)) Strcpy(buf,"pair of ");
  591. X
  592. X        if(nn)    Strcat(buf, actualn);
  593. X        else if(un) {
  594. X            if(is_boots(obj))
  595. X                Strcat(buf,"boots");
  596. X            else if(is_gloves(obj))
  597. X                Strcat(buf,"gloves");
  598. X            else if(is_cloak(obj))
  599. X                Strcpy(buf,"cloak");
  600. X            else if(is_helmet(obj))
  601. X                Strcpy(buf,"helmet");
  602. X            else if(is_shield(obj))
  603. X                Strcpy(buf,"shield");
  604. X            else
  605. X                Strcpy(buf,"armor");
  606. X            Strcat(buf, " called ");
  607. X            Strcat(buf, un);
  608. X        } else    Strcat(buf, dn);
  609. X        break;
  610. X        case FOOD_SYM:
  611. X#ifdef TUTTI_FRUTTI
  612. X        if (obj->otyp == SLIME_MOLD) {
  613. X            register struct fruit *f;
  614. X
  615. X            for(f=ffruit; f; f = f->nextf) {
  616. X                if(f->fid == obj->spe) {
  617. X                    Strcpy(buf, f->fname);
  618. X                    break;
  619. X                }
  620. X            }
  621. X            if (!f) impossible("Bad fruit #%d?", obj->spe);
  622. X            break;
  623. X        }
  624. X#endif
  625. X        Strcpy(buf, actualn);
  626. X        if(obj->otyp == TIN && obj->known) {
  627. X            if(obj->spe > 0)
  628. X            Strcat(buf, " of spinach");
  629. X            else if (mons[obj->corpsenm].mlet == S_FUNGUS)
  630. X            Sprintf(eos(buf), " of %s", mons[obj->corpsenm].mname);
  631. X            else if(obj->corpsenm >= 0)
  632. X            Sprintf(eos(buf), " of %s meat", mons[obj->corpsenm].mname);
  633. X            else Strcpy(buf, "empty tin");
  634. X        }
  635. X        break;
  636. X        case CHAIN_SYM:
  637. X        Strcpy(buf, actualn);
  638. X        break;
  639. X        case ROCK_SYM:
  640. X        if(obj->otyp == STATUE)
  641. X            Sprintf(buf, "%s of a%s %s", actualn,
  642. X            index(vowels,*(mons[obj->corpsenm].mname)) ? "n" : "",
  643. X            mons[obj->corpsenm].mname);
  644. X        else Strcpy(buf, actualn);
  645. X        break;
  646. X        case BALL_SYM:
  647. X        Sprintf(buf, "%sheavy iron ball",
  648. X          (obj->owt > objects[obj->otyp].oc_weight) ? "very " : "");
  649. X        break;
  650. X        case POTION_SYM:
  651. X        if(nn || un || !obj->dknown) {
  652. X            Strcpy(buf, "potion");
  653. X            if(!obj->dknown) break;
  654. X            if(nn) {
  655. X                Strcat(buf, " of ");
  656. X                if(obj->otyp == POT_WATER &&
  657. X                   objects[POT_WATER].oc_name_known &&
  658. X                   (obj->bknown || pl_character[0] == 'P') &&
  659. X                   (obj->blessed || obj->cursed)) {
  660. X                Strcat(buf, obj->blessed ? "holy " : "unholy ");
  661. X                }
  662. X                Strcat(buf, actualn);
  663. X            } else {
  664. X                Strcat(buf, " called ");
  665. X                Strcat(buf, un);
  666. X            }
  667. X        } else {
  668. X            Strcpy(buf, dn);
  669. X            Strcat(buf, " potion");
  670. X        }
  671. X        break;
  672. X    case SCROLL_SYM:
  673. X        Strcpy(buf, "scroll");
  674. X        if(!obj->dknown) break;
  675. X        if(nn) {
  676. X            Strcat(buf, " of ");
  677. X            Strcat(buf, actualn);
  678. X        } else if(un) {
  679. X            Strcat(buf, " called ");
  680. X            Strcat(buf, un);
  681. X        } else {
  682. X            Strcat(buf, " labeled ");
  683. X            Strcat(buf, dn);
  684. X        }
  685. X        break;
  686. X    case WAND_SYM:
  687. X        if(!obj->dknown)
  688. X            Sprintf(buf, "wand");
  689. X        else if(nn)
  690. X            Sprintf(buf, "wand of %s", actualn);
  691. X        else if(un)
  692. X            Sprintf(buf, "wand called %s", un);
  693. X        else
  694. X            Sprintf(buf, "%s wand", dn);
  695. X        break;
  696. X#ifdef SPELLS
  697. X    case SPBOOK_SYM:
  698. X        if(!obj->dknown)
  699. X            Sprintf(buf, "spellbook");
  700. X        else if(nn)
  701. X            Sprintf(buf, "spellbook of %s", actualn);
  702. X        else if(un)
  703. X            Sprintf(buf, "spellbook called %s", un);
  704. X        else
  705. X            Sprintf(buf, "%s spellbook", dn);
  706. X        break;
  707. X#endif
  708. X    case RING_SYM:
  709. X        if(!obj->dknown)
  710. X            Sprintf(buf, "ring");
  711. X        else if(nn)
  712. X            Sprintf(buf, "ring of %s", actualn);
  713. X        else if(un)
  714. X            Sprintf(buf, "ring called %s", un);
  715. X        else
  716. X            Sprintf(buf, "%s ring", dn);
  717. X        break;
  718. X    case GEM_SYM:
  719. X        if(!obj->dknown) {
  720. X            if (obj->otyp == ROCK || obj->otyp == LOADSTONE
  721. X                    || obj->otyp == LUCKSTONE)
  722. X                Strcpy(buf, "stone");
  723. X            else
  724. X                Strcpy(buf, "gem");
  725. X            break;
  726. X        }
  727. X        if(!nn) {
  728. X            const char *rock=
  729. X    (obj->otyp==LOADSTONE||obj->otyp==LUCKSTONE) ? "stone" : "gem";
  730. X            if(un)    Sprintf(buf,"%s called %s", rock, un);
  731. X            else    Sprintf(buf, "%s %s", dn, rock);
  732. X            break;
  733. X        }
  734. X        Strcpy(buf, actualn);
  735. X        if(obj->otyp >= TURQUOISE && obj->otyp <= JADE)
  736. X            Strcat(buf, " stone");
  737. X        break;
  738. X    default:
  739. X        Sprintf(buf,"glorkum %c (0%o) %u %d",
  740. X            obj->olet,obj->olet,obj->otyp,obj->spe);
  741. X    }
  742. X    if(obj->quan != 1) Strcpy(buf, makeplural(buf));
  743. X
  744. X    if(obj->onamelth) {
  745. X        Strcat(buf, " named ");
  746. X        Strcat(buf, ONAME(obj));
  747. X    }
  748. X    return(buf);
  749. X}
  750. X
  751. X#endif /* OVL1 */
  752. X#ifdef OVL0
  753. X
  754. Xchar *
  755. Xdoname(obj)
  756. Xregister struct obj *obj;
  757. X{
  758. X    boolean ispoisoned = FALSE;
  759. X    char prefix[PREFIX];
  760. X    char tmpbuf[PREFIX+1];
  761. X    /* when we have to add something at the start of prefix instead of the
  762. X     * end (Strcat is used on the end)
  763. X     */
  764. X    register char *bp = xname(obj);
  765. X    /* When using xname, we want "poisoned arrow", and when using
  766. X     * doname, we want "poisoned +0 arrow".  This kludge is about the only
  767. X     * way to do it, at least until someone overhauls xname() and doname(),
  768. X     * combining both into one function taking a parameter.
  769. X     */
  770. X    if (!strncmp(bp, "poisoned ", 9)) {
  771. X        bp += 9;
  772. X        ispoisoned = TRUE;
  773. X    }
  774. X
  775. X    if(obj->quan != 1)
  776. X        Sprintf(prefix, "%u ", obj->quan);
  777. X    else
  778. X        Strcpy(prefix, "a ");
  779. X    if((obj->bknown || pl_character[0] == 'P') &&
  780. X        (obj->otyp != POT_WATER || !objects[POT_WATER].oc_name_known
  781. X        || (!obj->cursed && !obj->blessed))) {
  782. X        /* allow 'blessed clear potion' if we don't know it's holy water;
  783. X         * always allow "uncursed potion of water"
  784. X         */
  785. X        if(obj->cursed)
  786. X        Strcat(prefix, "cursed ");
  787. X        else if(obj->blessed)
  788. X        Strcat(prefix, "blessed ");
  789. X        else if (((obj->olet != ARMOR_SYM
  790. X            && obj->olet != WAND_SYM
  791. X            && obj->olet != WEAPON_SYM
  792. X            && ((obj->olet != TOOL_SYM &&
  793. X                 obj->olet != RING_SYM) ||
  794. X                 !objects[obj->otyp].oc_charged))
  795. X                || !obj->known)
  796. X        /* For items with charges or +/-, knowing the +/- means that
  797. X         * the item has been totally identified, and therefore there
  798. X         * is no doubt as to the object being uncursed if it's
  799. X         * not described as "blessed" or "cursed".
  800. X         *
  801. X         * If the +/- isn't known, "uncursed" must be printed to
  802. X         * avoid ambiguity between an item whose curse status is
  803. X         * unknown, and an item known to be uncursed.
  804. X         */
  805. X#ifdef MAIL
  806. X            && obj->otyp != SCR_MAIL
  807. X#endif
  808. X            && obj->otyp != AMULET_OF_YENDOR &&
  809. X            pl_character[0] != 'P')
  810. X        Strcat(prefix, "uncursed ");
  811. X    }
  812. X    switch(obj->olet) {
  813. X    case AMULET_SYM:
  814. X        if(obj->otyp == AMULET_OF_YENDOR)
  815. X            if(strncmp(bp, "cheap ", 6)) {
  816. X            Strcpy(tmpbuf, "the ");
  817. X            Strcat(tmpbuf, prefix+2); /* skip the "a " */
  818. X            Strcpy(prefix, tmpbuf);
  819. X            }
  820. X        if(obj->owornmask & W_AMUL)
  821. X            Strcat(bp, " (being worn)");
  822. X        break;
  823. X    case WEAPON_SYM:
  824. X        if(ispoisoned)
  825. X            Strcat(prefix, "poisoned ");
  826. Xplus:
  827. X        if(obj->known) {
  828. X            Strcat(prefix, sitoa(obj->spe));
  829. X            Strcat(prefix, " ");
  830. X        }
  831. X        break;
  832. X    case ARMOR_SYM:
  833. X        if(obj->owornmask & W_ARMOR)
  834. X            Strcat(bp, " (being worn)");
  835. X        goto plus;
  836. X    case TOOL_SYM:            /* temp. hack by GAN 11/18/86 */
  837. X        if(obj->owornmask & W_TOOL) { /* blindfold */
  838. X            Strcat(bp, " (being worn)");
  839. X            break;
  840. X        }
  841. X#ifdef WALKIES
  842. X        if(obj->otyp == LEASH && obj->leashmon != 0) {
  843. X            Strcat(bp, " (in use)");
  844. X            break;
  845. X        }
  846. X#endif
  847. X        if(obj->otyp == KEY ||
  848. X           (obj->otyp == SKELETON_KEY &&
  849. X            !objects[obj->otyp].oc_name_known)) {
  850. X            Strcat(prefix, keystr[obj->spe]);
  851. X            Strcat(prefix, " ");
  852. X            break;
  853. X        }
  854. X        if(obj->otyp == LARGE_BOX || obj->otyp == CHEST) {
  855. X            Sprintf(eos(bp), " (%s keyhole)", lockstr[obj->spe]);
  856. X            break;
  857. X        }
  858. X        if(obj->otyp == PICK_AXE || obj->otyp == UNICORN_HORN)
  859. X            goto plus;
  860. X        if(!objects[obj->otyp].oc_charged) break;
  861. X        /* if special tool, fall through to show charges */
  862. X    case WAND_SYM:
  863. X        if(obj->known)
  864. X            Sprintf(eos(bp), " (%d)", obj->spe);
  865. X        break;
  866. X    case RING_SYM:
  867. X        if(obj->owornmask & W_RINGR) Strcat(bp, " (on right ");
  868. X        if(obj->owornmask & W_RINGL) Strcat(bp, " (on left ");
  869. X        if(obj->owornmask & W_RING) {
  870. X            Strcat(bp, body_part(HAND));
  871. X            Strcat(bp, ")");
  872. X        }
  873. X        if(obj->known && objects[obj->otyp].oc_charged) {
  874. X            Strcat(prefix, sitoa(obj->spe));
  875. X            Strcat(prefix, " ");
  876. X        }
  877. X        break;
  878. X    case FOOD_SYM:
  879. X        if(obj->oeaten)
  880. X            Strcat(prefix, "partly eaten ");
  881. X        if(obj->otyp == CORPSE) {
  882. X            Strcat(prefix, mons[obj->corpsenm].mname);
  883. X            Strcat(prefix, " ");
  884. X        } else if(obj->otyp == EGG && obj->known) {
  885. X            if(obj->corpsenm >= 0) {
  886. X            Strcat(prefix, mons[obj->corpsenm].mname);
  887. X            Strcat(prefix, " ");
  888. X#ifdef POLYSELF
  889. X            if (obj->spe)
  890. X                Strcat(bp, " (laid by you)");
  891. X#endif
  892. X            }
  893. X        }
  894. X        break;
  895. X    case BALL_SYM:
  896. X        if(obj->owornmask & W_BALL)
  897. X            Strcat(bp, " (chained to you)");
  898. X            break;
  899. X    }
  900. X
  901. X    if((obj->owornmask & W_WEP) && !mrg_to_wielded) {
  902. X        if (obj->quan != 1)
  903. X            Strcat(bp, " (wielded)");
  904. X        else {
  905. X            Strcat(bp, " (weapon in ");
  906. X            Strcat(bp, body_part(HAND));
  907. X            Strcat(bp, ")");
  908. X        }
  909. X    }
  910. X    if(obj->unpaid)
  911. X        Strcat(bp, " (unpaid)");
  912. X    if (!strncmp(prefix, "a ", 2) &&
  913. X            index(vowels, *(prefix+2) ? *(prefix+2) : *bp)
  914. X            && (*(prefix+2) || (strncmp(bp, "uranium", 7)
  915. X                && strncmp(bp, "unicorn", 7)))) {
  916. X        Strcpy(tmpbuf, prefix);
  917. X        Strcpy(prefix, "an ");
  918. X        Strcpy(prefix+3, tmpbuf+2);
  919. X    }
  920. X    bp = strprepend(bp, prefix);
  921. X    return(bp);
  922. X}
  923. X
  924. X#endif /* OVL0 */
  925. X#ifdef OVLB
  926. X
  927. X/*
  928. X * Used if only one of a collection of objects is named (e.g. in eat.c).
  929. X */
  930. X
  931. Xchar *
  932. Xsingular(otmp, func)
  933. Xregister struct obj *otmp;
  934. Xchar *FDECL((*func), (struct obj *));
  935. X{
  936. X    unsigned savequan;
  937. X    char *nam;
  938. X
  939. X    /* Note: using xname for corpses will not give the monster type */
  940. X    if (otmp->otyp == CORPSE && func == xname) {
  941. X        static char NEARDATA buf[31];
  942. X
  943. X        Sprintf(buf, "%s corpse", mons[otmp->corpsenm].mname);
  944. X        return buf;
  945. X    }
  946. X    savequan = otmp->quan;
  947. X    otmp->quan = 1;
  948. X    nam = (*func)(otmp);
  949. X    otmp->quan = savequan;
  950. X    return nam;
  951. X}
  952. X
  953. Xchar *
  954. Xan(str)
  955. Xregister const char *str;
  956. X{
  957. X    static char NEARDATA buf[BUFSZ];
  958. X
  959. X    buf[0] = '\0';
  960. X
  961. X    if (strncmp(str, "the ", 4))
  962. X        if (index(vowels, *str) &&
  963. X        strncmp(str, "useful", 6) &&
  964. X        strncmp(str, "unicorn", 7) &&
  965. X        strncmp(str, "uranium", 7))
  966. X            Strcpy(buf, "an ");
  967. X        else
  968. X            Strcpy(buf, "a ");
  969. X
  970. X    Strcat(buf, str);
  971. X    return buf;
  972. X}
  973. X
  974. Xchar *
  975. XAn(str)
  976. Xconst char *str;
  977. X{
  978. X    register char *tmp;
  979. X
  980. X    tmp = an(str);
  981. X    if (*tmp == 'a') *tmp = 'A';
  982. X    return tmp;
  983. X}
  984. X
  985. Xchar *
  986. Xaobjnam(otmp,verb)
  987. Xregister struct obj *otmp;
  988. Xregister const char *verb;
  989. X{
  990. X    register char *bp = xname(otmp);
  991. X    char prefix[PREFIX];
  992. X
  993. X    if(otmp->quan != 1) {
  994. X        Sprintf(prefix, "%u ", otmp->quan);
  995. X        bp = strprepend(bp, prefix);
  996. X    }
  997. X
  998. X    if(verb) {
  999. X        /* verb is given in plural (without trailing s) */
  1000. X        Strcat(bp, " ");
  1001. X        if(otmp->quan != 1)
  1002. X            Strcat(bp, verb);
  1003. X        else if(!strcmp(verb, "are"))
  1004. X            Strcat(bp, "is");
  1005. X        else {
  1006. X            Strcat(bp, verb);
  1007. X            Strcat(bp, "s");
  1008. X        }
  1009. X    }
  1010. X    return(bp);
  1011. X}
  1012. X
  1013. Xchar *
  1014. XDoname2(obj)
  1015. Xregister struct obj *obj;
  1016. X{
  1017. X    register char *s = doname(obj);
  1018. X
  1019. X    if('a' <= *s && *s <= 'z') *s -= ('a' - 'A');
  1020. X    return(s);
  1021. X}
  1022. X
  1023. Xconst char *wrp[] = { "wand", "ring", "potion", "scroll", "gem", "amulet",
  1024. X#ifdef SPELLS
  1025. X        "spellbook",
  1026. X#endif
  1027. X        /* for non-specific wishes */
  1028. X        "weapon", "armor", "tool", "food", "comestible",
  1029. X          };
  1030. Xconst char wrpsym[] = {WAND_SYM, RING_SYM, POTION_SYM, SCROLL_SYM, GEM_SYM, AMULET_SYM,
  1031. X#ifdef SPELLS
  1032. X         SPBOOK_SYM,
  1033. X#endif
  1034. X         WEAPON_SYM, ARMOR_SYM, TOOL_SYM, FOOD_SYM, FOOD_SYM
  1035. X        };
  1036. X
  1037. Xvoid
  1038. Xlcase(str)
  1039. Xregister char *str;
  1040. X{
  1041. X    register char *p;
  1042. X    for (p = str; *p; p++)
  1043. X        if('A' <= *p && *p <= 'Z') *p += 'a'-'A';
  1044. X}
  1045. X
  1046. X#endif /* OVLB */
  1047. X#ifdef OVL0
  1048. X
  1049. X/* Plural routine; chiefly used for user-defined fruits.  We have to try to
  1050. X * account for everything reasonable the player has; something unreasonable
  1051. X * can still break the code.  However, it's still a lot more accurate than
  1052. X * "just add an s at the end", which Rogue uses...
  1053. X *
  1054. X * Also used for plural monster names ("Wiped out all homunculi.")
  1055. X * and body parts.
  1056. X */
  1057. Xchar *
  1058. Xmakeplural(oldstr)
  1059. Xconst char *oldstr;
  1060. X{
  1061. X    register char *spot;
  1062. X    static char NEARDATA str[BUFSZ];
  1063. X    const char *excess;
  1064. X    int len;
  1065. X
  1066. X    while (*oldstr==' ') oldstr++;
  1067. X    if (!oldstr || !*oldstr) {
  1068. X        impossible("plural of null?");
  1069. X        Strcpy(str, "s");
  1070. X        return str;
  1071. X    }
  1072. X    Strcpy(str, oldstr);
  1073. X
  1074. X    /* Search for common compounds, ex. lump of royal jelly */
  1075. X    for(excess=(char *)0, spot=str; *spot; spot++) {
  1076. X        if (!strncmp(spot, " of ", 4)
  1077. X                || !strncmp(spot, " labeled ", 9)
  1078. X                || !strncmp(spot, " called ", 8)
  1079. X                || !strncmp(spot, " named ", 7)
  1080. X                || !strcmp(spot, " above") /* lurkers above */
  1081. X                || !strncmp(spot, " versus ", 8)
  1082. X#ifdef TUTTI_FRUTTI
  1083. X                || !strncmp(spot, " from ", 6)
  1084. X                || !strncmp(spot, " in ", 4)
  1085. X                || !strncmp(spot, " on ", 4)
  1086. X                || !strncmp(spot, " a la ", 6)
  1087. X                || !strncmp(spot, " with", 5)
  1088. X                || !strncmp(spot, " de ", 4)
  1089. X                || !strncmp(spot, " d'", 3)
  1090. X                || !strncmp(spot, " du ", 4)
  1091. X#endif
  1092. X                ) {
  1093. X            excess = oldstr + (int) (spot - str);
  1094. X            *spot = 0;
  1095. X            break;
  1096. X        }
  1097. X    }
  1098. X    spot--;
  1099. X    while (*spot==' ') spot--; /* Strip blanks from end */
  1100. X    *(spot+1) = 0;
  1101. X    /* Now spot is the last character of the string */
  1102. X
  1103. X    len = strlen(str);
  1104. X#ifdef TUTTI_FRUTTI
  1105. X    /* Single letters */
  1106. X    if (len==1 || !isalpha(*spot)) {
  1107. X        Strcpy(spot+1, "'s");
  1108. X        goto bottom;
  1109. X    }
  1110. X#endif
  1111. X
  1112. X    /* man/men ("Wiped out all cavemen.") */
  1113. X    if (len >= 3 && !strcmp(spot-2, "man") &&
  1114. X            (len<6 || strcmp(spot-5, "shaman")) &&
  1115. X            (len<5 || strcmp(spot-4, "human"))) {
  1116. X        *(spot-1) = 'e';
  1117. X        goto bottom;
  1118. X    }
  1119. X
  1120. X    /* tooth/teeth */
  1121. X    if (len >= 5 && !strcmp(spot-4, "tooth")) {
  1122. X        Strcpy(spot-3, "eeth");
  1123. X        goto bottom;
  1124. X    }
  1125. X
  1126. X    /* knife/knives, etc... */
  1127. X    if (!strcmp(spot-1, "fe"))
  1128. X        *(spot-1) = 'v';
  1129. X    else if (*spot == 'f')
  1130. X        if (index("lr", *(spot-1)) || index(vowels, *(spot-1)))
  1131. X            *spot = 'v';
  1132. X        else if (!strncmp(spot-4, "staf", 4))
  1133. X            Strcpy(spot-1, "ve");
  1134. X
  1135. X    /* foot/feet (body part) */
  1136. X    if (len >= 4 && !strcmp(spot-3, "foot")) {
  1137. X        Strcpy(spot-2, "eet");
  1138. X        goto bottom;
  1139. X    }
  1140. X
  1141. X    /* ium/ia (mycelia, baluchitheria) */
  1142. X    if (len >= 3 && !strcmp(spot-2, "ium")) {
  1143. X        *(spot--) = (char)0;
  1144. X        *spot = 'a';
  1145. X        goto bottom;
  1146. X    }
  1147. X
  1148. X    /* algae, larvae, hyphae (another fungus part) */
  1149. X#ifdef TUTTI_FRUTTI
  1150. X    if ((len >= 4 && !strcmp(spot-3, "alga")) ||
  1151. X        (len >= 5 &&
  1152. X         (!strcmp(spot-4, "hypha") || !strcmp(spot-4, "larva")))) {
  1153. X#else
  1154. X    if (len >= 5 && (!strcmp(spot-4, "hypha"))) {
  1155. X#endif
  1156. X        Strcpy(spot, "ae");
  1157. X        goto bottom;
  1158. X    }
  1159. X
  1160. X    /* fungus/fungi, homunculus/homunculi, but wumpuses */
  1161. X    if (!strcmp(spot-1, "us") && strcmp(spot-5, "wumpus")) {
  1162. X        *(spot--) = (char)0;
  1163. X        *spot = 'i';
  1164. X        goto bottom;
  1165. X    }
  1166. X
  1167. X    /* vortex/vortices */
  1168. X    if (len >= 6 && !strcmp(spot-3, "rtex")) {
  1169. X        Strcpy(spot-1, "ices");
  1170. X        goto bottom;
  1171. X    }
  1172. X
  1173. X    /* djinni/djinn (note: also efreeti/efreet) */
  1174. X    if (len >= 6 && !strcmp(spot-5, "djinni")) {
  1175. X        *(spot--) = (char)0;
  1176. X        goto bottom;
  1177. X    }
  1178. X
  1179. X    /* same singular and plural */
  1180. X    /* note: also swine, trout, grouse */
  1181. X    if ((len >= 7 && !strcmp(spot-6, "samurai")) ||
  1182. X        (len >= 5 &&
  1183. X#ifdef TUTTI_FRUTTI
  1184. X         (!strcmp(spot-4, "manes") || !strcmp(spot-4, "sheep"))) ||
  1185. X        (len >= 4 &&
  1186. X         (!strcmp(spot-3, "fish") || !strcmp(spot-3, "tuna") ||
  1187. X          !strcmp(spot-3, "deer"))))
  1188. X#else
  1189. X         !strcmp(spot-4, "manes")))
  1190. X#endif
  1191. X        goto bottom;
  1192. X
  1193. X#ifdef TUTTI_FRUTTI
  1194. X    /* mouse/mice,louse/lice (not a monster, but possible in a food name) */
  1195. X    if (len >= 5 && !strcmp(spot-3, "ouse") && index("MmLl", *(spot-4))) {
  1196. X        Strcpy(spot-3, "ice");
  1197. X        goto bottom;
  1198. X    }
  1199. X
  1200. X    /* matzoh/matzot, possible food name */
  1201. X    if (len >= 6 && (!strcmp(spot-5, "matzoh")
  1202. X                    || !strcmp(spot-5, "matzah"))) {
  1203. X        Strcpy(spot-1, "ot");
  1204. X        goto bottom;
  1205. X    }
  1206. X    if (len >= 5 && (!strcmp(spot-4, "matzo")
  1207. X                    || !strcmp(spot-5, "matza"))) {
  1208. X        Strcpy(spot, "ot");
  1209. X        goto bottom;
  1210. X    }
  1211. X
  1212. X    /* child/children (for the wise guys who give their food funny names) */
  1213. X    if (len >= 5 && !strcmp(spot-4, "child")) {
  1214. X        Strcpy(spot, "dren");
  1215. X        goto bottom;
  1216. X    }
  1217. X
  1218. X    /* sis/ses (oasis, nemesis) */
  1219. X    if (len >= 3 && !strcmp(spot-2, "sis")) {
  1220. X        *(spot-1) = 'e';
  1221. X        goto bottom;
  1222. X    }
  1223. X
  1224. X    /* note: -eau/-eaux (gateau, bordeau...) */
  1225. X    /* note: ox/oxen, VAX/VAXen, goose/geese */
  1226. X#endif
  1227. X
  1228. X    /* Ends in z, x, s, ch, sh; add an "es" */
  1229. X    if (index("zxsv", *spot) || (*spot=='h' && index("cs", *(spot-1)))
  1230. X#ifdef TUTTI_FRUTTI
  1231. X    /* Kludge to get "tomatoes" and "potatoes" right */
  1232. X                || (len >= 4 && !strcmp(spot-2, "ato"))
  1233. X#endif
  1234. X                                    ) {
  1235. X        Strcpy(spot+1, "es");
  1236. X        goto bottom;
  1237. X    }
  1238. X
  1239. X    /* Ends in y preceded by consonant (note: also "qu"); change to "ies" */
  1240. X    if (*spot == 'y' &&
  1241. X        (!index(vowels, *(spot-1)))) {
  1242. X        Strcpy(spot, "ies");
  1243. X        goto bottom;
  1244. X    }
  1245. X
  1246. X    /* Default: append an 's' */
  1247. X    Strcpy(spot+1, "s");
  1248. X
  1249. Xbottom:    if (excess) Strcpy(str+strlen(str), excess);
  1250. X    return str;
  1251. X}
  1252. X
  1253. X#endif /* OVL0 */
  1254. X
  1255. Xstruct o_range {
  1256. X    const char *name, osym;
  1257. X    int  f_o_range, l_o_range;
  1258. X};
  1259. X
  1260. X#ifndef OVLB
  1261. X
  1262. XSTATIC_DCL const struct o_range o_ranges[];
  1263. X
  1264. X#else /* OVLB */
  1265. X
  1266. X/* wishable subranges of objects */
  1267. XSTATIC_OVL const struct o_range NEARDATA o_ranges[] = {
  1268. X    { "bag",    TOOL_SYM,   SACK,        BAG_OF_TRICKS },
  1269. X    { "gloves",    ARMOR_SYM,  LEATHER_GLOVES, GAUNTLETS_OF_DEXTERITY },
  1270. X    { "gauntlets",    ARMOR_SYM,  LEATHER_GLOVES, GAUNTLETS_OF_DEXTERITY },
  1271. X    { "boots",    ARMOR_SYM,  LOW_BOOTS,        LEVITATION_BOOTS },
  1272. X    { "shoes",    ARMOR_SYM,  LOW_BOOTS,        IRON_SHOES },
  1273. X    { "cloak",    ARMOR_SYM,  MUMMY_WRAPPING, CLOAK_OF_DISPLACEMENT },
  1274. X    { "shield",    ARMOR_SYM,  SMALL_SHIELD,   SHIELD_OF_REFLECTION },
  1275. X#ifdef TOLKIEN    /* note: "helmet" is a specific item */
  1276. X    { "helm",    ARMOR_SYM,  ELVEN_LEATHER_HELM, HELM_OF_TELEPATHY },
  1277. X#else
  1278. X    { "helm",    ARMOR_SYM,  ORCISH_HELM,    HELM_OF_TELEPATHY },
  1279. X#endif
  1280. X    { "sword",    WEAPON_SYM, SHORT_SWORD,    KATANA }
  1281. X};
  1282. X
  1283. X/*
  1284. X * Singularize a string the user typed in; this helps reduce the complexity
  1285. X * of readobjnam, and is also used in pager.c to singularize the string
  1286. X * for which help is sought.
  1287. X */
  1288. X
  1289. Xchar *
  1290. Xmakesingular(oldstr)
  1291. Xconst char *oldstr;
  1292. X{
  1293. X    char *p, *bp;
  1294. X    static char NEARDATA str[BUFSZ];
  1295. X
  1296. X    if (!oldstr || !*oldstr) {
  1297. X        impossible("singular of null?");
  1298. X        str[0] = 0; return str;
  1299. X    }
  1300. X    Strcpy(str, oldstr);
  1301. X    bp = str;
  1302. X
  1303. X    while (*bp == ' ') bp++;
  1304. X    /* find "cloves of garlic", "worthless pieces of blue glass" */
  1305. X    for(p = bp; *p; p++) 
  1306. X        if(!strncmp(p, "s of ", 5)){
  1307. X        /* but don't singularize "gauntlets" */
  1308. X        if(strncmp(p-8, "gauntlet", 8))
  1309. X            while(*p = p[1]) p++;
  1310. X        return bp;
  1311. X        }
  1312. X
  1313. X    /* remove -s or -es (boxes) or -ies (rubies) */
  1314. X    p = eos(bp);
  1315. X    if(p[-1] == 's') {
  1316. X        if(p[-2] == 'e') {
  1317. X            if(p[-3] == 'i') {
  1318. X                if(!strcmp(p-7, "cookies") ||
  1319. X                   !strcmp(p-4, "pies"))
  1320. X                    goto mins;
  1321. X                Strcpy(p-3, "y");
  1322. X                return bp;
  1323. X            }
  1324. X
  1325. X            /* note: cloves / knives from clove / knife */
  1326. X            if(!strcmp(p-6, "knives")) {
  1327. X                Strcpy(p-3, "fe");
  1328. X                return bp;
  1329. X            }
  1330. X
  1331. X            if(!strcmp(p-6, "staves")) {
  1332. X                Strcpy(p-3, "ff");
  1333. X                return bp;
  1334. X            }
  1335. X
  1336. X            /* note: nurses, axes but boxes */
  1337. X            if(!strcmp(p-5, "boxes")) {
  1338. X                p[-2] = 0;
  1339. X                return bp;
  1340. X            }
  1341. X        }
  1342. X        /* but don't singularize boots or gloves */
  1343. X        else if(!strcmp(p-5, "boots") ||
  1344. X            !strcmp(p-6, "gloves"))
  1345. X                return bp;
  1346. X    mins:
  1347. X        p[-1] = 0;
  1348. X    } else {
  1349. X        if(!strcmp(p-5, "teeth")) {
  1350. X            Strcpy(p-5, "tooth");
  1351. X            return bp;
  1352. X        }
  1353. X        /* here we cannot find the plural suffix */
  1354. X    }
  1355. X    return bp;
  1356. X}
  1357. X
  1358. X/* Return something wished for.  If not an object, return &zeroobj; if an error
  1359. X * (no matching object), return (struct obj *)0.  Giving readobjnam() a null
  1360. X * pointer skips the error return and creates a random object instead.
  1361. X */
  1362. Xstruct obj *
  1363. Xreadobjnam(bp)
  1364. Xregister char *bp;
  1365. X{
  1366. X    register char *p;
  1367. X    register int i;
  1368. X    register struct obj *otmp;
  1369. X    int cnt, spe, spesgn, typ, heavy, blessed, uncursed, halfeaten;
  1370. X    int iscursed, ispoisoned, mntmp, contents;
  1371. X    int iskey, isnamedbox;
  1372. X#ifdef TUTTI_FRUTTI
  1373. X    struct fruit *f;
  1374. X    int ftype = current_fruit;
  1375. X    char fruitbuf[BUFSZ];
  1376. X    /* We want to check for fruits last so that, for example, someone
  1377. X     * who names their fruit "katana" and wishes for a katana gets a real
  1378. X     * one.  But, we have to keep around the old buf since in the meantime
  1379. X     * we have deleted "empty", "+6", etc...
  1380. X     */
  1381. X#endif
  1382. X    char let;
  1383. X    char *un, *dn, *actualn;
  1384. X    char *name=0;
  1385. X#ifdef WIZARD
  1386. X    int fake=0;
  1387. X#endif
  1388. X
  1389. X    cnt = spe = spesgn = typ = heavy = blessed = uncursed = iscursed =
  1390. X        ispoisoned = halfeaten = iskey = isnamedbox = 0;
  1391. X    mntmp = -1;
  1392. X#define UNDEFINED 0
  1393. X#define EMPTY 1
  1394. X#define SPINACH 2
  1395. X    contents = UNDEFINED;
  1396. X    let = 0;
  1397. X    actualn = dn = un = 0;
  1398. X    
  1399. X    for(;;) {
  1400. X        if (!bp) goto any;
  1401. X        if(!strncmp(bp, "an ", 3)) {
  1402. X            cnt = 1;
  1403. X            bp += 3;
  1404. X        } else if(!strncmp(bp, "a ", 2)) {
  1405. X            cnt = 1;
  1406. X            bp += 2;
  1407. X        } else if(!strncmp(bp, "cheap plastic imitation of ", 27)) {
  1408. X#ifdef WIZARD
  1409. X            fake = 1;
  1410. X#endif
  1411. X            bp += 27;
  1412. X        } else if(!strncmp(bp, "the ", 4)){
  1413. X    /*        the = 1; */
  1414. X            bp += 4;
  1415. X        } else if(!cnt && digit(*bp)){
  1416. X            cnt = atoi(bp);
  1417. X            while(digit(*bp)) bp++;
  1418. X            while(*bp == ' ') bp++;
  1419. X        } else if(!strncmp(bp, "partly eaten ", 13)) {
  1420. X            halfeaten = 1;
  1421. X            bp += 13;
  1422. X        } else if(!strncmp(bp,"blessed ",8)) {
  1423. X            blessed=1;
  1424. X            bp += 8;
  1425. X        } else if(!strncmp(bp,"holy ",5)) {
  1426. X            blessed=1;
  1427. X            bp += 5;
  1428. X        } else if(!strncmp(bp,"cursed ",7) || !strncmp(bp,"unholy ",7)){
  1429. X            iscursed=1;
  1430. X            bp += 7;
  1431. X        } else if(!strncmp(bp, "uncursed ",9)) {
  1432. X            uncursed=1;
  1433. X            bp += 9;
  1434. X        } else break;
  1435. X    }
  1436. X    if(!cnt) cnt = 1;        /* %% what with "gems" etc. ? */
  1437. X#ifdef TUTTI_FRUTTI
  1438. X    Strcpy(fruitbuf, bp);
  1439. X#endif
  1440. X    if(!strncmp(bp, "empty ", 6)) {
  1441. X        contents = EMPTY;
  1442. X        bp += 6;
  1443. X    } else if(!strncmp(bp, "poisoned ",9)) {
  1444. X        ispoisoned=1;
  1445. X        bp += 9;
  1446. X#ifdef WIZARD
  1447. X    } else if(wizard && !strncmp(bp, "trapped ",8)) {
  1448. X        ispoisoned=1;
  1449. X        bp += 8;
  1450. X#endif
  1451. X    }
  1452. X    if(*bp == '+' || *bp == '-'){
  1453. X        spesgn = (*bp++ == '+') ? 1 : -1;
  1454. X        spe = atoi(bp);
  1455. X        while(digit(*bp)) bp++;
  1456. X        while(*bp == ' ') bp++;
  1457. X    } else {
  1458. X        p = rindex(bp, '(');
  1459. X        if(p) {
  1460. X            if(p > bp && p[-1] == ' ') p[-1] = 0;
  1461. X            else *p = 0;
  1462. X            p++;
  1463. X            if (!(isnamedbox = named_box(p))) {
  1464. X                spe = atoi(p);
  1465. X                while(digit(*p)) p++;
  1466. X                if (*p != ')') spe = 0;
  1467. X                else {
  1468. X                    spesgn = 1;
  1469. X                    p++; 
  1470. X                    if (*p) Strcat(bp, p);
  1471. X                }
  1472. X            }
  1473. X        }
  1474. X    }
  1475. X/*
  1476. X   otmp->spe is type schar; so we don't want spe to be any bigger or smaller.
  1477. X   also, spe should always be positive  -- some cheaters may try to confuse
  1478. X   atoi()
  1479. X*/
  1480. X    if (spe < 0) {
  1481. X        spesgn = -1;    /* cheaters get what they deserve */
  1482. X        spe = abs(spe);
  1483. X    }
  1484. X    if (spe > SCHAR_MAX)
  1485. X        spe = SCHAR_MAX;
  1486. X
  1487. X    /* now we have the actual name, as delivered by xname, say
  1488. X        green potions called whisky
  1489. X        scrolls labeled "QWERTY"
  1490. X        egg
  1491. X        fortune cookies
  1492. X        very heavy iron ball named hoei
  1493. X        wand of wishing
  1494. X        elven cloak
  1495. X    */
  1496. X    for(p = bp; *p; p++) if(!strncmp(p, " named ", 7)) {
  1497. X        *p = 0;
  1498. X        name = p+7;
  1499. X    }
  1500. X    for(p = bp; *p; p++) if(!strncmp(p, " called ", 8)) {
  1501. X        *p = 0;
  1502. X        un = p+8;
  1503. X        /* "helmet called telepathy" is not "helmet" (a specific type)
  1504. X         * "shield called reflection" is not "shield" (a general type)
  1505. X         */
  1506. X        for(i = 0; i < SIZE(o_ranges); i++)
  1507. X            if(!strcmp(bp, o_ranges[i].name)) {
  1508. X            let = o_ranges[i].osym;
  1509. X            goto srch;
  1510. X            }
  1511. X    }
  1512. X    for(p = bp; *p; p++) if(!strncmp(p, " labeled ", 9)) {
  1513. X        *p = 0;
  1514. X        dn = p+9;
  1515. X    }
  1516. X    for(p = bp; *p; p++) if(!strncmp(p, " labelled ", 10)) {
  1517. X        *p = 0;
  1518. X        dn = p+10;
  1519. X    }
  1520. X    for(p = bp; *p; p++) if(!strncmp(p, " of spinach", 11)) {
  1521. X        *p = 0;
  1522. X        contents = SPINACH;
  1523. X    }
  1524. X
  1525. X    /* Skip over "pair of ", then jump to the singular so we don't
  1526. X       try to convert "gloves" or "boots". */
  1527. X    if(cnt == 1 && !strncmp(bp, "pair of ",8)) {
  1528. X        bp += 8;
  1529. X        cnt = 2;
  1530. X        goto sing;
  1531. X        /* cnt is ignored for armor and other non-stackable objects;
  1532. X           DTRT for stackable objects */
  1533. X    } else if(cnt > 1 && !strncmp(bp, "pairs of ",9)) {
  1534. X        bp += 9;
  1535. X        cnt *= 2;
  1536. X    }
  1537. X
  1538. X    /* Find corpse type using "of" (figurine of an orc, tin of orc meat) */
  1539. X    for(p = bp; *p; p++)
  1540. X        if (!strncmp(p, " of ", 4) && (mntmp = name_to_mon(p+4)) >= 0) {
  1541. X            *p = 0;
  1542. X            break;
  1543. X    }
  1544. X    /* Find corpse type w/o "of" (red dragon scale mail, yeti corpse) */
  1545. X    if (strncmp(bp, "samurai sword", 13)) /* not the "samurai" monster! */
  1546. X    if (strncmp(bp, "wizard lock", 11)) /* not the "wizard" monster! */
  1547. X    if (strncmp(bp, "orcish", 6)) /* not the "orc" monster! */
  1548. X    if (mntmp < 0) if ((mntmp = name_to_mon(bp)) >= 0) {
  1549. X        bp += strlen(mons[mntmp].mname);
  1550. X        if (*bp==' ') bp++;
  1551. X    }
  1552. X
  1553. X    /* first change to singular if necessary */
  1554. X    if(cnt != 1 && *bp)
  1555. X        Strcpy(bp, makesingular(bp));
  1556. X
  1557. Xsing:
  1558. X    /* Maybe we need a special strcmp() which ignores capitalization and
  1559. X     * dashes/spaces/underscores, so some of the below special cases would
  1560. X     * be unnecessary.
  1561. X     */
  1562. X    /* Alternate spellings (two-handed sword vs. two handed sword) */
  1563. X    if(!strcmp(bp, "two handed sword")) {
  1564. X        typ = TWO_HANDED_SWORD;
  1565. X        goto typfnd;
  1566. X    }
  1567. X    /* pick-axe vs. pick axe */
  1568. X    if(!strcmp(bp, "pick axe")) {
  1569. X        typ = PICK_AXE;
  1570. X        goto typfnd;
  1571. X    }
  1572. X    if(!strcmp(bp, "luck stone")){
  1573. X        typ = LUCKSTONE;
  1574. X        goto typfnd;
  1575. X    }
  1576. X    if(!strcmp(bp, "load stone")){
  1577. X        typ = LOADSTONE;
  1578. X        goto typfnd;
  1579. X    }
  1580. X    /* Alternate capitalizations (Amulet of Yendor, amulet of esp) */
  1581. X    if(!strcmp(bp, "amulet of Yendor")) {
  1582. X        typ = AMULET_OF_YENDOR;
  1583. X        goto typfnd;
  1584. X    }
  1585. X    if(!strcmp(bp, "amulet of ESP")) {
  1586. X        typ = AMULET_OF_ESP;
  1587. X        goto typfnd;
  1588. X    }
  1589. X    if(!strcmp(bp, "ring mail") ||    /* Note: ring mail is not a ring ! */
  1590. X       !strcmp(bp, "leather armor") || /* Prevent falling to 'armor'. */
  1591. X       !strcmp(bp, "studded leather armor")) {
  1592. X        let = ARMOR_SYM;
  1593. X        actualn = bp;
  1594. X        goto srch;
  1595. X    }
  1596. X    if(!strcmp(bp, "food ration")){
  1597. X        let = FOOD_SYM;
  1598. X        actualn = bp;
  1599. X        goto srch;
  1600. X    }
  1601. X    if((iskey = named_key(bp)) > 0) {
  1602. X        typ = KEY;
  1603. X        goto typfnd;
  1604. X    }
  1605. X    p = eos(bp);
  1606. X    if(!strcmp(p-10, "holy water")) {
  1607. X        typ = POT_WATER;
  1608. X        if (*(p-12) == 'u') iscursed = 1; /* unholy water */
  1609. X        else blessed = 1;
  1610. X        goto typfnd;
  1611. X    }
  1612. X#ifdef SHIRT
  1613. X    if (!strcmp(p-5, "shirt")) {
  1614. X        typ = HAWAIIAN_SHIRT;
  1615. X        goto typfnd;
  1616. X    }
  1617. X#endif
  1618. X    if (strlen(bp) == 1 && index(obj_symbols, *bp) && *bp != ILLOBJ_SYM) {
  1619. X        let = *bp;
  1620. X        goto any;
  1621. X    }
  1622. X    if(strncmp(bp, "enchant ", 8) &&
  1623. X       strncmp(bp, "destroy ", 8) &&
  1624. X       strncmp(bp, "food detection", 14))
  1625. X    /* allow wishes for "enchant weapon" and "food detection" */
  1626. X    for(i = 0; i < sizeof(wrpsym); i++) {
  1627. X        register int j = strlen(wrp[i]);
  1628. X        if(!strncmp(bp, wrp[i], j)){
  1629. X            let = wrpsym[i];
  1630. X            if(let != AMULET_SYM) {
  1631. X                bp += j;
  1632. X                if(!strncmp(bp, " of ", 4)) actualn = bp+4;
  1633. X                /* else if(*bp) ?? */
  1634. X            } else
  1635. X                actualn = bp;
  1636. X            goto srch;
  1637. X        }
  1638. X        if(!strcmp(p-j, wrp[i])){
  1639. X            let = wrpsym[i];
  1640. X            p -= j;
  1641. X            *p = 0;
  1642. X            if(p[-1] == ' ') p[-1] = 0;
  1643. X            dn = bp;
  1644. X            goto srch;
  1645. X        }
  1646. X    }
  1647. X    if(!strcmp(p-6, " stone")){
  1648. X        p[-6] = 0;
  1649. X        let = GEM_SYM;
  1650. X        dn = actualn = bp;
  1651. X        goto srch;
  1652. X    }
  1653. X    if(!strcmp(p-10, "gold piece") || !strcmp(p-7, "zorkmid") ||
  1654. X           !strcmp(bp, "Zorkmid") ||
  1655. X           !strcmp(bp, "gold") || !strcmp(bp, "money") || *bp == GOLD_SYM) {
  1656. X            if (cnt > 5000
  1657. X#ifdef WIZARD
  1658. X                    && !wizard
  1659. X#endif
  1660. X                        ) cnt=5000;
  1661. X        if (cnt < 1) cnt=1;
  1662. X        pline("%d gold piece%s.", cnt, plur((long)cnt));
  1663. X        u.ugold += cnt;
  1664. X        flags.botl=1;
  1665. X        return (&zeroobj);
  1666. X    }
  1667. X#ifdef WIZARD
  1668. X    /* Let wizards wish for traps --KAA */
  1669. X    if (wizard) {
  1670. X        int trap;
  1671. X        char *tname;
  1672. X
  1673. X        for (trap = NO_TRAP+1; trap < TRAPNUM; trap++) {
  1674. X            tname = index(traps[trap], ' ');
  1675. X            if (tname) {
  1676. X                if (!strncmp(tname+1, bp, strlen(tname+1))) {
  1677. X                    (void) maketrap(u.ux, u.uy, trap);
  1678. X                    pline("A%s.", traps[trap]);
  1679. X                    if (Invisible) newsym(u.ux,u.uy);
  1680. X                    return(&zeroobj);
  1681. X                }
  1682. X            }
  1683. X        }
  1684. X    }
  1685. X#endif
  1686. X    if(!strcmp(bp, "very heavy iron ball")) {
  1687. X        heavy = 1;
  1688. X        typ = HEAVY_IRON_BALL;
  1689. X        goto typfnd;
  1690. X    }
  1691. X    for (i = 0; i < SIZE(o_ranges); i++)
  1692. X        if(!strcmp(bp, o_ranges[i].name)) {
  1693. X        typ = rnd_class(o_ranges[i].f_o_range, o_ranges[i].l_o_range);
  1694. X        goto typfnd;
  1695. X        }
  1696. X
  1697. X    actualn = bp;
  1698. X    if (!dn) dn = actualn; /* ex. "black cap" */
  1699. Xsrch:
  1700. X    i = 1;
  1701. X    if(let) i = bases[letindex(let)];
  1702. X    while(i <= NROFOBJECTS && (!let || objects[i].oc_olet == let)){
  1703. X        register const char *zn;
  1704. X
  1705. X        if(actualn && (zn = objects[i].oc_name) && !strcmp(actualn, zn)) {
  1706. X            typ = i;
  1707. X            goto typfnd;
  1708. X        }
  1709. X        if(dn && (zn = objects[i].oc_descr) && !strcmp(dn, zn)) {
  1710. X            typ = i;
  1711. X            goto typfnd;
  1712. X        }
  1713. X        if(un && (zn = objects[i].oc_uname) && !strcmp(un, zn)) {
  1714. X            typ = i;
  1715. X            goto typfnd;
  1716. X        }
  1717. X        i++;
  1718. X    }
  1719. X    if (actualn) {
  1720. X        struct Jitem *j = Japanese_items;
  1721. X        while(j->item) {
  1722. X            if (actualn && !strcmp(actualn, j->name)) {
  1723. X                typ = j->item;
  1724. X                goto typfnd;
  1725. X            }
  1726. X            j++;
  1727. X        }
  1728. X    }
  1729. X#ifdef TUTTI_FRUTTI
  1730. X    for(f=ffruit; f; f = f->nextf) {
  1731. X        char *f1 = f->fname, *f2 = makeplural(f->fname);
  1732. X
  1733. X        if(!strncmp(fruitbuf, f1, strlen(f1)) ||
  1734. X                    !strncmp(fruitbuf, f2, strlen(f2))) {
  1735. X            typ = SLIME_MOLD;
  1736. X            ftype = f->fid;
  1737. X            goto typfnd;
  1738. X        }
  1739. X    }
  1740. X#endif
  1741. X    if(!let) return((struct obj *)0);
  1742. Xany:
  1743. X    if(!let) let = wrpsym[rn2(sizeof(wrpsym))];
  1744. Xtypfnd:
  1745. X    if(typ) {
  1746. X        let = objects[typ].oc_olet;
  1747. X        otmp = mksobj(typ,FALSE);
  1748. X    } else {
  1749. X        otmp = mkobj(let,FALSE);
  1750. X        typ = otmp->otyp;
  1751. X    }
  1752. X
  1753. X    /* venom isn't really an object and can't be wished for; but allow
  1754. X     * wizards to wish for it since it's faster than polymorphing and
  1755. X     * spitting.
  1756. X     */
  1757. X    if(otmp->olet==VENOM_SYM) {
  1758. X#ifdef WIZARD
  1759. X        if (!wizard) {
  1760. X#endif
  1761. X            free((genericptr_t) otmp);
  1762. X            return((struct obj *)0);
  1763. X#ifdef WIZARD
  1764. X        } else otmp->spe = 1;
  1765. X#endif
  1766. X    }
  1767. X    if(iskey) otmp->spe = (iskey-1);
  1768. X    if(isnamedbox && (otmp->otyp==LARGE_BOX || otmp->otyp==CHEST))
  1769. X        otmp->spe = (isnamedbox-1);
  1770. X
  1771. X    if(cnt > 0 && objects[typ].oc_merge && 
  1772. X#ifdef SPELLS
  1773. X            let != SPBOOK_SYM &&
  1774. X#endif
  1775. X        (cnt < rnd(6) ||
  1776. X#ifdef WIZARD
  1777. X        wizard ||
  1778. X#endif
  1779. X         (cnt <= 20 &&
  1780. X          ((let == WEAPON_SYM && typ <= SHURIKEN) || (typ == ROCK)))))
  1781. X            otmp->quan = cnt;
  1782. X
  1783. X    if (spesgn == 0) spe = otmp->spe;
  1784. X#ifdef WIZARD
  1785. X    else if (wizard) /* no alteration to spe */ ;
  1786. X#endif
  1787. X    else if (let == ARMOR_SYM || let == WEAPON_SYM || typ == PICK_AXE ||
  1788. X            typ == UNICORN_HORN ||
  1789. X            (let==RING_SYM && objects[typ].oc_charged)) {
  1790. X        if(spe > rnd(5) && spe > otmp->spe) spe = 0;
  1791. X        if(spe > 2 && Luck < 0) spesgn = -1;
  1792. X    } else {
  1793. X        if (let == WAND_SYM) {
  1794. X            if (spe > 1 && spesgn == -1) spe = 1;
  1795. X        } else {
  1796. X            if (spe > 0 && spesgn == -1) spe = 0;
  1797. X        }
  1798. X        if (spe > otmp->spe) spe = otmp->spe;
  1799. X    }
  1800. X
  1801. X    if (spesgn == -1) spe = -spe;
  1802. X
  1803. X    /* set otmp->spe.  This may, or may not, use spe... */
  1804. X    switch (typ) {
  1805. X        case TIN: if (contents==EMPTY) {
  1806. X                otmp->corpsenm = -1;
  1807. X                otmp->spe = 0;
  1808. X            } else if (contents==SPINACH) {
  1809. X                otmp->corpsenm = -1;
  1810. X                otmp->spe = 1;
  1811. X            }
  1812. X            break;
  1813. X#ifdef TUTTI_FRUTTI
  1814. X        case SLIME_MOLD: otmp->spe = ftype;
  1815. X            /* Fall through */
  1816. X#endif
  1817. X        case SKELETON_KEY: case KEY: case CHEST: case LARGE_BOX:
  1818. X        case HEAVY_IRON_BALL: case IRON_CHAIN: case STATUE:
  1819. X            /* otmp->spe already done in mksobj() */
  1820. X                break;
  1821. X#ifdef MAIL
  1822. X        case SCR_MAIL: otmp->spe = 1; break;
  1823. X#endif
  1824. X        case AMULET_OF_YENDOR:
  1825. X#ifdef WIZARD
  1826. X            if (fake || !wizard)
  1827. X#endif
  1828. X                otmp->spe = -1;
  1829. X#ifdef WIZARD
  1830. X            else otmp->spe = 0;
  1831. X#endif
  1832. X            break;
  1833. X        case WAN_WISHING:
  1834. X#ifdef WIZARD
  1835. X            if (!wizard) {
  1836. X#endif
  1837. X                otmp->spe = (rn2(10) ? -1 : 0);
  1838. X                break;
  1839. X#ifdef WIZARD
  1840. X            }
  1841. X            /* fall through (twice), if wizard */
  1842. X#endif
  1843. X        case MAGIC_LAMP:
  1844. X#ifdef WIZARD
  1845. X            if (!wizard) {
  1846. X#endif
  1847. X                otmp->spe = 0;
  1848. X                break;
  1849. X#ifdef WIZARD
  1850. X            }
  1851. X            /* fall through, if wizard */
  1852. X#endif
  1853. X        default: otmp->spe = spe;
  1854. X    }
  1855. X
  1856. X    /* set otmp->corpsenm */
  1857. X    if (mntmp > -1) switch(typ) {
  1858. X        case TIN:
  1859. X            otmp->spe = 0; /* No spinach */
  1860. X        case CORPSE:
  1861. X            if (!(mons[mntmp].geno & G_NOCORPSE))
  1862. X                otmp->corpsenm = mntmp;
  1863. X            break;
  1864. X        case FIGURINE:
  1865. X            if (!(mons[mntmp].geno & G_UNIQ)
  1866. X                && !is_human(&mons[mntmp]))
  1867. X                otmp->corpsenm = mntmp;
  1868. X            break;
  1869. X        case EGG: if (lays_eggs(&mons[mntmp]) || mntmp==PM_KILLER_BEE)
  1870. X                otmp->corpsenm = mntmp;
  1871. X            break;
  1872. X        case STATUE: otmp->corpsenm = mntmp;
  1873. X            break;
  1874. X        case DRAGON_SCALE_MAIL: /* Not actually possible unless they
  1875. X                   typed "red dragon dragon scale mail" */
  1876. X        case SCALE_MAIL:
  1877. X            if (mntmp >= PM_GRAY_DRAGON &&
  1878. X                mntmp <= PM_YELLOW_DRAGON)
  1879. X                otmp->corpsenm = mntmp;
  1880. X            if (otmp->corpsenm >= 0)
  1881. X                otmp->otyp = DRAGON_SCALE_MAIL;
  1882. X            break;
  1883. X    }
  1884. X
  1885. X    /* set blessed/cursed */
  1886. X    if (iscursed) {
  1887. X        curse(otmp);
  1888. X    } else if (uncursed) {
  1889. X        otmp->blessed = 0;
  1890. X        otmp->cursed = (Luck < 0
  1891. X#ifdef WIZARD
  1892. X                     && !wizard
  1893. X#endif
  1894. X                            );
  1895. X    } else if (blessed) {
  1896. X        otmp->blessed = (Luck >= 0
  1897. X#ifdef WIZARD
  1898. X                     || wizard
  1899. X#endif
  1900. X                            );
  1901. X        otmp->cursed = (Luck < 0
  1902. X#ifdef WIZARD
  1903. X                     && !wizard
  1904. X#endif
  1905. X                            );
  1906. X    } else if (spesgn < 0) {
  1907. X        curse(otmp);
  1908. X    }
  1909. X
  1910. X    /* prevent wishing abuse */
  1911. X    if (
  1912. X#ifdef WIZARD
  1913. X        !wizard &&
  1914. X#endif
  1915. X        (otmp->otyp == WAN_WISHING || otmp->otyp == MAGIC_LAMP))
  1916. X        otmp->recharged = 1;
  1917. X
  1918. X    /* set poisoned */
  1919. X    if (ispoisoned) {
  1920. X        if (let == WEAPON_SYM && typ <= SHURIKEN)
  1921. X        otmp->opoisoned = (Luck >= 0);
  1922. X#ifdef WIZARD
  1923. X        else if (Is_box(otmp))
  1924. X        otmp->otrapped = 1;
  1925. X        else if (let == FOOD_SYM)
  1926. X        /* try to taint by making it as old as possible */
  1927. X            otmp->age = 1L;
  1928. X#endif
  1929. X    }
  1930. X
  1931. X    if (name) otmp = oname(otmp, name, 0);
  1932. X    otmp->owt = weight(otmp);
  1933. X    if (heavy) otmp->owt += 15;
  1934. X    if (halfeaten && otmp->olet == FOOD_SYM) {
  1935. X        if (otmp->otyp == CORPSE)
  1936. X            otmp->oeaten = mons[otmp->corpsenm].cnutrit;
  1937. X        else otmp->oeaten = objects[otmp->otyp].nutrition;
  1938. X        otmp->owt /= 2;
  1939. X        otmp->oeaten /= 2;
  1940. X        if (!otmp->owt) otmp->owt = 1;
  1941. X        if (!otmp->oeaten) otmp->oeaten = 1;
  1942. X    }
  1943. X    return(otmp);
  1944. X}
  1945. X
  1946. Xint
  1947. Xrnd_class(first,last)
  1948. Xint first,last;
  1949. X{
  1950. X    int i, x, sum=0;
  1951. X    for(i=first; i<=last; i++)
  1952. X        sum += objects[i].oc_prob;
  1953. X    x = rnd(sum);
  1954. X    for(i=first; i<=last; i++)
  1955. X        if (objects[i].oc_prob && (x -= objects[i].oc_prob) <= 0)
  1956. X            return i;
  1957. X    return 0;
  1958. X}
  1959. X
  1960. XSTATIC_OVL const char *
  1961. XJapanese_item_name(i)
  1962. Xint i;
  1963. X{
  1964. X    struct Jitem *j = Japanese_items;
  1965. X
  1966. X    while(j->item) {
  1967. X        if (i == j->item)
  1968. X            return j->name;
  1969. X        j++;
  1970. X    }
  1971. X    return (const char *)0;
  1972. X}
  1973. X#endif /* OVLB */
  1974. END_OF_FILE
  1975. if test 39021 -ne `wc -c <'src/objnam.c'`; then
  1976.     echo shar: \"'src/objnam.c'\" unpacked with wrong size!
  1977. fi
  1978. # end of 'src/objnam.c'
  1979. fi
  1980. echo shar: End of archive 13 \(of 56\).
  1981. cp /dev/null ark13isdone
  1982. MISSING=""
  1983. for I in 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 ; do
  1984.     if test ! -f ark${I}isdone ; then
  1985.     MISSING="${MISSING} ${I}"
  1986.     fi
  1987. done
  1988. if test "${MISSING}" = "" ; then
  1989.     echo You have unpacked all 56 archives.
  1990.     rm -f ark[1-9]isdone ark[1-9][0-9]isdone
  1991. else
  1992.     echo You still need to unpack the following archives:
  1993.     echo "        " ${MISSING}
  1994. fi
  1995. ##  End of shell archive.
  1996. exit 0
  1997.