[comp.sources.games] v10i058: nethack3p9 - display oriented dungeons & dragons

billr@saab.CNA.TEK.COM (Bill Randle) (07/12/90)

Submitted-by: Izchak Miller <izchak@linc.cis.upenn.edu>
Posting-number: Volume 10, Issue 58
Archive-name: nethack3p9/Part13
Supersedes: NetHack3: Volume 7, Issue 56-93



#! /bin/sh
# This is a shell archive.  Remove anything before this line, then unpack
# it by saving it into a file and typing "sh file".  To overwrite existing
# files, type "sh file -c".  You can also feed this as standard input via
# unshar, or by typing "sh <file", e.g..  If this archive is complete, you
# will see the following message at the end:
#		"End of archive 13 (of 56)."
# Contents:  mac/MD.proj.hqx src/objnam.c
# Wrapped by billr@saab on Wed Jul 11 17:11:08 1990
PATH=/bin:/usr/bin:/usr/ucb ; export PATH
if test -f 'mac/MD.proj.hqx' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'mac/MD.proj.hqx'\"
else
echo shar: Extracting \"'mac/MD.proj.hqx'\" \(17003 characters\)
sed "s/^X//" >'mac/MD.proj.hqx' <<'END_OF_FILE'
X(This file must be converted with BinHex 4.0)
X
X:$@eKDf9NC@Cc,R"bEfS!8&*25NY"5%`!N!JhP#4S!*!%!3#3!cAk!!!dqJ!!!CS
X!!""G$80bD@0VCA3J4h*KF'J#!*!$39"36%0(8NBK"!eYB@YPC'9QFbj`FQpU!J#
X3!e"56dT,38K-!3#3"&J!!&"56dT,38K-!3#3"&J!!%e9!*!0!U)XCN!!N!BhP!#
X3#K8!N!-3A3pQD@jN)%e')'CKBh4[FR-#!*!$39"36%eZ4Q3K"!!+!#`!N!3L#J#
X3$PN8!!"F!+(@VNLKeUj2SGH0eJ#3(Jc-!!%0KJ!@!*!'!r!!N2m!N2m!N2m!N2,
XF!!!"@!!!F!8!!%459P)"8!!`VH`!!2m`!,B!N!83!$#Yl!!!rc!!YJ#3"4!!-+h
XX!!$r-!#f!*!&%!!`VH`!!2m`!,B!N!83!$#Yl!!!rc!!YJ#3"4!!-+hX!!$r-!#
Xf!*!&%!!`VH`!!2m`!,B!N!83!$#Yl!!!rc!!YJ#3"4!!-+hX!!$r-!#f!*!&%!!
X`VH`!!2m`!,B!N!83!$#Yl!!!rc!!YJ#3"4!!-+hX!!$r-!#f!*!&%!!`VH`!!2m
X`!,B!N!83!$#Yl!!!rc!!YJ#3"4!!-+hX!!$r-!#f!*!&%!!`VH`!!2m`!,B!N!8
X3#'eKDf9NC@CcYJ#3"4!!-+hX!!$r-!#f!*!&%!!`VH`!!2m`!,B!N!83!$#Yl!!
X!rc!!YJ#3"4""8&"-EQK04!J!!B!!N!-+#!!!"J#3!`B!N!9J!*!$F!#3"e!!N!-
XJ!"`r2!!"UI!%#Mmm!!'Tm!3H2c`!!DR`"$)r2!!"UI!%6Mmm!!'Tm!5%2c`!!DR
X`"+3r2!!"UI!%aMmm!!'Tm!6Q2c`!!DR`"air2!!"UI!!N!-%!*!("!#30!&B!!"
X`"3!!4&*@8J&3!$#Yl!!!rc!!YJ#3"4!!-+hX!!$r-!#f!*!&%!!`VH`!!2m`!,B
X!N!83!$#Yl!!!rc!!YJ#3"4!!-+hX!!$r-!#f!*!&%!!`VH`!!2m`!,B!N!83!$#
XYl!!!rc!!YJ#3"4!!-+hX!!$r-!#f!*!&%!!`VH`!!2m`!,B!N!83!$#Yl!!!rc!
X!YJ#3"4!!-+hX!!$r-!#f!*!&%!!`VH`!!2m`!,B!N!83!$#Yl!!!rc!!YJ#3"4!
X!-+hX!!$r-!#f!*!&%!!`VH`!!2m`!,B!N!83!$#Yl!!!rc!!YJ#3"4!!-+hX!!$
Xr-!#f!*!&%!!`VH`!!2m`!,B!N!83!$#Yl!!!rc!!YJ#3"4!!-+hX!!$r-!#f!*!
X&%%&38%aYDf3U!!!"J!#3!`J!!2m`!,B!N!d+!*!-*!!!-iUS!$0Qk!!cCi`!!!+
X)!*!&-J#3&N#!lNi!-fES3!!!d!!cCV3!N!8cC[!!-fEd!$0Qq!!cC[`!-fF!!$0
XR"!!cC`J!-fF-!$0R%!!cCa3!-fFB!$0R(!!cCb!!-fFN!$0R+!!cCb`!-fF`!$0
XR0!!cCcJ!-fFm!$0R3!!cCd3!-fG)!$0R6!!cCe!!-fG8!$0R@!!cCe`!-fGJ!$0
XRC!!cCfJ!-fGX!$0RF!!cCh3!-fGi!$0RI!!cCi!!-fH%!$0RL!!cL!!!-i-N!$0
Xq5!!cIK3!-hhN!$0pY!!cH0J!-h0S!$0YC!!cCm#!!!@N!!!"!!)!#3N!!3!!rj!
X)SL3#2!!D!!%!!#R968&,43!+E@&VC@4PCR-ZB`#3!`'JR-eYS*c0ED#Fc@d!'J!
X#!!!RrNe"3dJ"#NeKBdKPB@4PFR-!N!-"SLaT$U)XD3kL,'N1!"J!!3!!+GC$6dj
X'!!KMEfjQD@FZD!"c!!+L(KlhSKiHpk)H([F!'J!"!!!TeP45383!#R4bB@4cG'4
XM,QJ!N!-#SKiG4D)H(8@L(Ke&!"J!!3!!+GC(6%p#!!KRE'pLB@`ZD!"S!!1Jar@
XhS-IeYk$(pEF!&J!#!!!SB&084%N""h0dC'P[,QJ!!!1L(K[jSKiEqD)H'rN!&J!
X"!!!TeN026e)!"f0[Eh*N,QJ!!!1L*`[LSLF,iU)R#q)!'!!"!!!TeNe"3d-!#@e
XKBf0[EQBZD!!!"+)H(JDL(Ki'SKiH"J!@!!%!!#R@690%6`!(EA0NEh-ZD!!!"+)
XH(Y1L(Kl6SKiHd`!B!!%!!#R@8eP69!!)FhPcG'9Y,QJ!N!-%S*cGjD#FhH@JR0h
XP!"B!!J!!+'"858e&!3CdD@eP,QJ!D!!%S*cG0k#Fh6HJR0dh!"B!!J!!+'"'3dj
X8!3G'BfjdE#jS!!!%S*cGV+#FhDbJR0fX!"J!!J!!+'"69%4%!3K6G'4NC@BZD!#
X3!`5JR0h9S*cGeD#FhG8!'!!#!!!SB&084%`"#&0dC'aTBLjS!*!$"+$(p0QJar6
XCS-Idf3!B!!)!!#KJ8e4553%)8h4bD@jR,QJ!N!-%S*c03k#Fc81JR-e$!"J!!J!
X!+!03390$!3K`BA0MB@`ZD!#3!`5JR-BRS*c'*k#FaLF!'J!#!!!S!e&958-"#e&
XeD@0VC(*KGbjS!!!%S*c&jU#FaHDJR-AQ!"J!!J!!+!0'6dj8!3P'Efjd6@Gb,QJ
X!!!5JR-A9S*c&eD#FaG8!'J!#!!!S!d9@48i"#N9fC@jd6@Gb,QJ!N!-%S*c'Hk#
XFaRZJR-Cl!"S!!J!!+!0A58j%!3YAD@jNEhG0Ch)ZD!!!"+#FaJ5JR-B%S*c'"!!
XB!!)!!#J$689193%*6@9ZG8eRFLjS!!!%S*c'Ak#FaPqJR-CI!"`!!J!!+!069%4
X'!3a6G'4'D@aP8'YR,QJ!E`!%S*c'2k#FaMqJR-Br!"`!!J!!+!0648G0!3a6C@G
XYC@jd6'4b,QJ!E`!%S*c'ED#FaQfJR-CY!"`!!J!!+!086dp-!3e8EfpXBQpi9A4
XTE#jS!!!%S*c'$U#FaJkJR-B1!"J!!J!!+!028e98!3K28e9dD@`ZD!"T!!5JR-A
X$S*c&`k#FaF-!'J!#!!!S!d4*38`"#d4TB@a[CdeRFLjS!!!%S*c&fU#FaGUJR-A
XD!"J!!J!!+!0'58a&!3P'D@aP6@Gb,QJ!!!5JR-AXS*c&l+#FaH`!&!!#!!!S!dK
X'8bi""8K'8bjS!!!%S,%p&D#a24@JX6d9!"B!!J!!+!0$6da2!3G$Efa[FLjS!!!
X%S*c'+k#FaLZJR-BV!"`!!J!!+!054902!3e5CA0[GA*MC8eRFLjS!!!%SLQSeU)
XTU0DL+DM@!"J!!3!!+GC&@&4&!!KPH(4PFQiZD!"R!!5L(KZDSKiEQU)H'jS!'J!
X"!!!TeNe"3d%!#NeKBd&XCA*d,QJ!,J!"SKiHBD)H(Q'L(KjK!"S!!3!!+GC349*
X0!!T`CA*YEfjcG#jS!#i!!U)H(DUL(KfUSKiGUJ!B!!%!!#R@68p133!*E@pZBA4
XdDbjS!!!#SKiGiU)H(H+L(KhL!"J!!3!!+GC06dj'!!PYEfjQE'&R,QJ!!!'L(Ki
XZSKiH,U)H(Li!'J!"!!!TeNp#5N-!#QpLDQ0XBA0c,QJ!,J!"S*c&Sk#FaD1JR-@
XM!"`!!J!!+!0$6dj8!!a$EfjdFQpX6@Gb,QJ!!)!!"J3!N!2m!J!*#3!"!!$rN!L
XL(MID!"B!!3!!+G906dj6!!GYEfjcG#jM!!!"S*c0ED#Fc@fJR-eY!"S!!J!!*rj
X0380)!3T0B@0)C@&NCA*c!#i!!D)XD3kL,'N1SLaT$J!B!!%!!#R@3dp14J!)Bfp
XZCQPR,QJ!F`!#SKiHpk)H([HL(Klh!"S!!3!!+GC88N&%!!TdFQ&NFh4NBbjS!#i
X!!U)H(8@L(Ke&SKiG43!B!!%!!#R@4da23J!)Cfa[BQ&X,QJ!D!!$S-IeYk$(pEH
XJar@h!"B!!J!!+'"69%4*!3GcG'4TEbjS!!!$SKiEqD)H'rQL(K[j!"B!!3!!+GC
X$6dp5!!GMEfpbC#jS!!!$SLF,iU)R#q+L*`[L!"J!!3!!+GC0380$!!PYB@0MEfj
XQ,QJ!!!5L(Ki'SKiH"U)H(JB!&J!"!!!TeNe64%m!"fecC'pc,QJ!!!5L(Kl6SKi
XHdk)H(Y-!'!!"!!!TeP0C8e3!#(0jFh4PE5jS!*!$"+#FhH@JR0hPS*cGj3!@!!)
X!!#KJ9%P043%'G'PYC5jS!'J!"+#Fh6HJR0dhS*cG0`!@!!)!!#KJ4N019!%(4Q0
XZG'`ZD!!!"+#FhDbJR0fXS*cGV!!B!!)!!#KJ8e4%4!%)8h4NC'9Q,QJ!N!-%S*c
XGeD#FhG@JR0h9!"J!!J!!+'"69%4-!3K6G'4XD@)ZD!#3!`5Jar6CS-IdfD$(p0N
X!'!!#!!!SB&088NN"#&0dFQPZCbjS!*!$"+#Fc81JR-e$S*c03`!B!!)!!#J$8%&
X63`%)F'&cBf&X,QJ!N!-%S*c'*k#FaLHJR-BR!"S!!J!!+!0498P$!3Y4G@PMDf4
XbBAFZD!!!"+#FaHDJR-AQS*c&jJ!B!!)!!#J$4Np19!%*4QpZG%eRFLjS!!!%S*c
X&eD#FaG@JR-A9!"S!!J!!+!0&9N91!3T&GQ9ZG%eRFLjS!*!$"+#FaRZJR-ClS*c
X'H`!D!!)!!#J$9dP14!%,9fPZC'ph6@Gb,QJ!!!5JR-B%S*c'"+#FaJ3!'!!#!!!
XS!de&6P8"#8ePER90Ch)ZD!!!"+#FaPqJR-CIS*c'A`!F!!)!!#J$8e4%4J%-8h4
XN4QPXC9"VCbjS!*!$"+#FaMqJR-BrS*c'2`!F!!)!!#J$8d9(63%-8f9RE@9ZG%a
XNFLjS!*!$"+#FaQfJR-CYS*c'E3!F!!)!!#J$9%p26!%09'p[E'*[H&9dD@`ZD!!
X!"+#FaJkJR-B1S*c'$J!B!!)!!#J$6e099!%)6e09G'PX,QJ!D3!%S*c&`k#FaF1
XJR-A$!"S!!J!!+!0%58&-!3Y%D@&XEfG0Ch)ZD!!!"+#FaGUJR-ADS*c&fJ!B!!)
X!!#J$4NP-43%*4QPXC8eRFLjS!!!%S*c&l+#FaHbJR-AX!"3!!J!!+!0)4P-Z!39
X)4P-ZD!!!"+#a24@JX6d9S,%p&3!@!!)!!#J$3dp-6`%(3fpXEh)ZD!!!"+#FaLZ
XJR-BVS*c'+`!F!!)!!#J$8N966`%08Q9cEh9bBf90Ch)ZD!!!"+)TU0DL+DM@SLQ
XSeJ!B!!%!!#R@49K843!)CAKdCA*Z,QJ!C`!%SKiEQU)H'jUL(KZD!"S!!3!!+GC
X0380"!!T0B@0"E'9bG#jS!#i!!D)H(Q'L(KjKSKiHB3!D!!%!!#R@8%9563!+F'9
XbE@pZFh3ZD!!Z!!+L(KfUSKiGUU)H(DS!'!!"!!!TeNe26N%!#@e[EQ&dG'XZD!!
X!!U)H(H+L(KhLSKiGiJ!B!!%!!#R@68p14J!*E@pZCQaKCbjS!!!"SKiH!D)H(J'
XL(Ki"!"J!!3!!+GC06dj6!!KYEfjcH@dZD!#3!`'L(K`hSKiF0k)H($F!&J!"!!!
XTeN965%X!"Q9cD'XZD!"S!!'L(Kp&SKiI4D)H(d8!&J!"!!!TePC"98`!"hCKG@a
Xd,QJ!!!'L(K``SKiF-+)H($!!&J!"!!!TeN938NN!"Q9`FQNZD!#3!`'L(K[$SKi
XE`k)H'm-!&J!"!!!TeN026%m!"f0[E'pb,QJ!JJ!&F!#3!rJ#!!N*!!%!!2q3#+)
XN!Zd!'!!"!!!Te8p#5N8!#@pLDQ9MG(-ZB`!!!D#Fc@fJR-eYS*c0E3!D!!)!!#I
Xq68&$5!%+6@&M5'9KC'9bF`!Z!!'L,'N1SLaT$U)XD3i!'!!"!!!TeN026NB!#'0
X[EQCTCbjS!(-!!U)H([HL(KlhSKiHp`!D!!%!!#R@9&*"4!!+G(*KC(0dC'-ZD!!
XZ!!+L(Ke&SKiG4D)H(88!'!!"!!!TeNG-6d)!#'GXEf*KE#jS!'J!!k$(pEHJar@
XhS-IeY`!@!!)!!#KJ8e4%53%(Fh4ND@mZD!!!!k)H'rQL(K[jSKiEq3!@!!%!!#R
X@3dp28J!(Bfp[FQ3ZD!!!!k)R#q+L*`[LSLF,iJ!B!!%!!#R@68&$3`!*E@&MBfp
XZCLjS!!!%SKiH"U)H(JDL(Ki'!"B!!3!!+GC08d42!!GYFf4[FbjS!!!%SKiHdk)
XH(Y1L(Kl6!"J!!3!!+GC6@908!!KcHA0dC@dZD!#3!`5JR0hPS*cGjD#FhH8!&J!
X#!!!SB&4*688""R4TE@8ZD!"S!!5JR0dhS*cG0k#Fh6F!&J!#!!!SB%C$6P3""dC
XMER4X,QJ!!!5JR0fXS*cGV+#FhD`!'!!#!!!SB&084%3"#&0dC'4PCLjS!*!$"+#
XFhG@JR0h9S*cGe3!B!!)!!#KJ8e4%6!%)8h4NE'PL,QJ!N!-%S-IdfD$(p0QJar6
XC!"J!!J!!+'"69&**!3K6G(*TEQFZD!#3!`5JR-e$S*c03k#Fc8-!'!!#!!!S!e"
X"8d-"#("KFf0KE#jS!*!$"+#FaLHJR-BRS*c'*`!D!!)!!#J$899*3`%,8A9TBfY
XNFQ&h,QJ!!!5JR-AQS*c&jU#FaHB!'!!#!!!S!dC26P3"#8C[ER40Ch)ZD!!!"+#
XFaG@JR-A9S*c&e3!D!!)!!#J$49C&6J%+4ACPER40Ch)ZD!#3!`5JR-ClS*c'Hk#
XFaRX!'J!#!!!S!eG*6N3"#eGTEQ4[GdeRFLjS!!!%S*c'"+#FaJ5JR-B%!"J!!J!
X!+!0048j9!3P0C@je6@Gb,QJ!!!5JR-CIS*c'Ak#FaPm!(!!#!!!S!e084%B"$&0
XdC%CTE'93DfFZD!#3!`5JR-BrS*c'2k#FaMm!(!!#!!!S!e0&4dd"$&0PCfePER4
X-C()ZD!#3!`5JR-CYS*c'ED#FaQd!(!!#!!!S!e426d`"$94[EfaLEhK9G'PX,QJ
X!!!5JR-B1S*c'$U#FaJi!'!!#!!!S!dp6993"#%p69A4TE#jS!'N!"+#FaF1JR-A
X$S*c&``!D!!)!!#J$4%P"6!%,4'PKE'pR6@Gb,QJ!!!5JR-ADS*c&fU#FaGS!'!!
X#!!!S!dC*6%8"#8CTE'90Ch)ZD!!!"+#FaHbJR-AXS*c&l!!8!!)!!#J$5%C6,J%
X&5%C6,QJ!!!5JX6d9S,%p&D#a248!&J!#!!!S!d026%m""d0[E'pb,QJ!!!5JR-B
XVS*c'+k#FaLX!(!!#!!!S!e*&8dm"$9*PFfpeFQ0P6@Gb,QJ!!!5L+DM@SLQSeU)
XTU0B!'!!"!!!TeN9B9%8!#'9iG'9bELjS!'F!"+)H'jUL(KZDSKiEQJ!D!!%!!#R
X@68&$33!+6@&M3@aPFR3ZD!!Z!!'L(KiESKiH'k)H(KX!&!!"!!!TeNp#5Li!"@p
XLDLjS!!!"SKiH,U)H(LkL(KiZ!"S!!3!!+GC23NT$!!T[BQTME'&cFbjS!#i!!D)
XH(QQL(KjTSKiHD3!@!!%!!#R@8&*28!!'F(*[F#jS!(-!!D)H'm1L(K[$SKiE``!
X@!!%!!#R@3dp-6`!(BfpXEh)ZD!!!!B)!"0`!N!2d!J!*#3!"!!$rN!LL(MXi!"B
X!!3!!+G9338j*!!G`B@jTBbjM!!!"S*c0ED#Fc@fJR-eY!"S!!J!!*rj0380)!3T
X0B@0)C@&NCA*c!#i!!D)XD3kL,'N1SLaT$J!B!!%!!#R@3dp14J!)BfpZCQPR,QJ
X!F`!#SKiHpk)H([HL(Klh!"S!!3!!+GC88N&%!!TdFQ&NFh4NBbjS!#i!!U)H(8@
XL(Ke&SKiG43!B!!%!!#R@4da23J!)Cfa[BQ&X,QJ!D!!$S-IeYk$(pEHJar@h!"B
X!!J!!+'"69%4*!3GcG'4TEbjS!!!$SKiEqD)H'rQL(K[j!"B!!3!!+GC$6dp5!!G
XMEfpbC#jS!!!$SLF,iU)R#q+L*`[L!"J!!3!!+GC0380$!!PYB@0MEfjQ,QJ!!!5
XL(Ki'SKiH"U)H(JB!&J!"!!!TeNe64%m!"fecC'pc,QJ!!!5L(Kl6SKiHdk)H(Y-
X!'!!"!!!TeP0C8e3!#(0jFh4PE5jS!*!$"+#FhH@JR0hPS*cGj3!@!!)!!#KJ9%P
X043%'G'PYC5jS!'J!"+#Fh6HJR0dhS*cG0`!@!!)!!#KJ4N019!%(4Q0ZG'`ZD!!
X!"+#FhDbJR0fXS*cGV!!B!!)!!#KJ8e4%4!%)8h4NC'9Q,QJ!N!-%S*cGeD#FhG@
XJR0h9!"J!!J!!+'"69%4-!3K6G'4XD@)ZD!#3!`5Jar6CS-IdfD$(p0N!'!!#!!!
XSB&088NN"#&0dFQPZCbjS!*!$"+#Fc81JR-e$S*c03`!B!!)!!#J$8%&63`%)F'&
XcBf&X,QJ!N!-%S*c'*k#FaLHJR-BR!"S!!J!!+!0498P$!3Y4G@PMDf4bBAFZD!!
X!"+#FaHDJR-AQS*c&jJ!B!!)!!#J$4Np19!%*4QpZG%eRFLjS!!!%S*c&eD#FaG@
XJR-A9!"S!!J!!+!0&9N91!3T&GQ9ZG%eRFLjS!*!$"+#FaRZJR-ClS*c'H`!D!!)
X!!#J$9dP14!%,9fPZC'ph6@Gb,QJ!!!5JR-B%S*c'"+#FaJ3!'!!#!!!S!de&6P8
X"#8ePER90Ch)ZD!!!"+#FaPqJR-CIS*c'A`!F!!)!!#J$8e4%4J%-8h4N4QPXC9"
XVCbjS!*!$"+#FaMqJR-BrS*c'2`!F!!)!!#J$8d9(63%-8f9RE@9ZG%aNFLjS!*!
X$"+#FaQfJR-CYS*c'E3!F!!)!!#J$9%p26!%09'p[E'*[H&9dD@`ZD!!!"+#FaJk
XJR-B1S*c'$J!B!!)!!#J$6e099!%)6e09G'PX,QJ!D3!%S*c&`k#FaF1JR-A$!"S
X!!J!!+!0%58&-!3Y%D@&XEfG0Ch)ZD!!!"+#FaGUJR-ADS*c&fJ!B!!)!!#J$4NP
X-43%*4QPXC8eRFLjS!!!%S*c&l+#FaHbJR-AX!"3!!J!!+!0)4P-Z!39)4P-ZD!!
X!"+#a24@JX6d9S,%p&3!@!!)!!#J$3dp-6`%(3fpXEh)ZD!!!"+#FaLZJR-BVS*c
X'+`!F!!)!!#J$8N966`%08Q9cEh9bBf90Ch)ZD!!!"+)TU0DL+DM@SLQSeJ!B!!%
X!!#R@49K843!)CAKdCA*Z,QJ!C`!%SKiEQU)H'jUL(KZD!"S!!3!!+GC0380"!!T
X0B@0"E'9bG#jS!#jMD)!!!$!!N!2`!!!*#3!"!!$rN!LJb!28!"3!!J!!+&P"6P0
X*!!4"6P0*!#k!!!!`!*!$l!!!#3N!!3!!rj!)S-J0[!!8!!)!!#KC98j*@!!%G@j
XTH!!ZJ!!!0!#3!qJ!!!N*!!%!!2q3#+#Z`J)!'!!#!!!S"8e"3e3!#%eKBe4bBA"
Xc!!##!!6F!*!$j!)!#3N!!3!!rj!)SKiPl`!@!!%!!#R938a-6`!(B@aXEf-ZB`!
X!!D#Fc@fJR-eYS*c0E3!D!!)!!#Iq68&$5!%+6@&M5'9KC'9bF`!Z!!'L,'N1SLa
XT$U)XD3i!'!!"!!!TeN026NB!#'0[EQCTCbjS!(-!!U)H([HL(KlhSKiHp`!D!!%
X!!#R@9&*"4!!+G(*KC(0dC'-ZD!!Z!!+L(Ke&SKiG4D)H(88!'!!"!!!TeNG-6d)
X!#'GXEf*KE#jS!'J!!k$(pEHJar@hS-IeY`!@!!)!!#KJ8e4%53%(Fh4ND@mZD!!
X!!k)H'rQL(K[jSKiEq3!@!!%!!#R@3dp28J!(Bfp[FQ3ZD!!!!k)R#q+L*`[LSLF
X,iJ!B!!%!!#R@68&$3`!*E@&MBfpZCLjS!!!%SKiH"U)H(JDL(Ki'!"B!!3!!+GC
X08d42!!GYFf4[FbjS!!!%SKiHdk)H(Y1L(Kl6!"J!!3!!+GC6@908!!KcHA0dC@d
XZD!#3!`5JR0hPS*cGjD#FhH8!&J!#!!!SB&4*688""R4TE@8ZD!"S!!5JR0dhS*c
XG0k#Fh6F!&J!#!!!SB%C$6P3""dCMER4X,QJ!!!5JR0fXS*cGV+#FhD`!'!!#!!!
XSB&084%3"#&0dC'4PCLjS!*!$"+#FhG@JR0h9S*cGe3!B!!)!!#KJ8e4%6!%)8h4
XNE'PL,QJ!N!-%S-IdfD$(p0QJar6C!"J!!J!!+'"69&**!3K6G(*TEQFZD!#3!`5
XJR-e$S*c03k#Fc8-!'!!#!!!S!e""8d-"#("KFf0KE#jS!*!$"+#FaLHJR-BRS*c
X'*`!D!!)!!#J$899*3`%,8A9TBfYNFQ&h,QJ!!!5JR-AQS*c&jU#FaHB!'!!#!!!
XS!dC26P3"#8C[ER40Ch)ZD!!!"+#FaG@JR-A9S*c&e3!D!!)!!#J$49C&6J%+4AC
XPER40Ch)ZD!#3!`5JR-ClS*c'Hk#FaRX!'J!#!!!S!eG*6N3"#eGTEQ4[GdeRFLj
XS!!!%S*c'"+#FaJ5JR-B%!"J!!J!!+!0048j9!3P0C@je6@Gb,QJ!!!5JR-CIS*c
X'Ak#FaPm!(!!#!!!S!e084%B"$&0dC%CTE'93DfFZD!#3!`5JR-BrS*c'2k#FaMm
X!(!!#!!!S!e0&4dd"$&0PCfePER4-C()ZD!#3!`5JR-CYS*c'ED#FaQd!(!!#!!!
XS!e426d`"$94[EfaLEhK9G'PX,QJ!!!5JR-B1S*c'$U#FaJi!'!!#!!!S!dp6993
X"#%p69A4TE#jS!'N!"+#FaF1JR-A$S*c&``!D!!)!!#J$4%P"6!%,4'PKE'pR6@G
Xb,QJ!!!5JR-ADS*c&fU#FaGS!'!!#!!!S!dC*6%8"#8CTE'90Ch)ZD!!!"+#FaHb
XJR-AXS*c&l!!8!!)!!#J$5%C6,J%&5%C6,QJ!!!5JX6d9S,%p&D#a248!&J!#!!!
XS!d026%m""d0[E'pb,QJ!!!5JR-BVS*c'+k#FaLX!(!!#!!!S!e*&8dm"$9*PFfp
XeFQ0P6@Gb,QJ!!!5L+DM@SLQSeU)TU0B!'!!"!!!TeN9B9%8!#'9iG'9bELjS!'F
X!"+)H'jUL(KZDSKiEQJ!D!!%!!#R@68&$33!+6@&M3@aPFR3ZD!!ZS*b!!!6F!*!
X$i!)!#3N!!3!!rj!)SKj,$3!B!!%!!#R968&$4J!*E@&MCQPXC5jM!!!"S*c0ED#
XFc@fJR-eY!"S!!J!!*rj0380)!3T0B@0)C@&NCA*c!#i!!D)XD3kL,'N1SLaT$J!
XB!!%!!#R@3dp14J!)BfpZCQPR,QJ!F`!#SKiHpk)H([HL(Klh!"S!!3!!+GC88N&
X%!!TdFQ&NFh4NBbjS!#i!!U)H(8@L(Ke&SKiG43!B!!%!!#R@4da23J!)Cfa[BQ&
XX,QJ!D!!$S-IeYk$(pEHJar@h!"B!!J!!+'"69%4*!3GcG'4TEbjS!!!$SKiEqD)
XH'rQL(K[j!"B!!3!!+GC$6dp5!!GMEfpbC#jS!!!$SLF,iU)R#q+L*`[L!"J!!3!
X!+GC0380$!!PYB@0MEfjQ,QJ!!!5L(Ki'SKiH"U)H(JB!&J!"!!!TeNe64%m!"fe
XcC'pc,QJ!!!5L(Kl6SKiHdk)H(Y-!'!!"!!!TeP0C8e3!#(0jFh4PE5jS!*!$"+#
XFhH@JR0hPS*cGj3!@!!)!!#KJ9%P043%'G'PYC5jS!'J!"+#Fh6HJR0dhS*cG0`!
X@!!)!!#KJ4N019!%(4Q0ZG'`ZD!!!"+#FhDbJR0fXS*cGV!!B!!)!!#KJ8e4%4!%
X)8h4NC'9Q,QJ!N!-%S*cGeD#FhG@JR0h9!"J!!J!!+'"69%4-!3K6G'4XD@)ZD!#
X3!`5Jar6CS-IdfD$(p0N!'!!#!!!SB&088NN"#&0dFQPZCbjS!*!$"+#Fc81JR-e
X$S*c03`!B!!)!!#J$8%&63`%)F'&cBf&X,QJ!N!-%S*c'*k#FaLHJR-BR!"S!!J!
X!+!0498P$!3Y4G@PMDf4bBAFZD!!!"+#FaHDJR-AQS*c&jJ!B!!)!!#J$4Np19!%
X*4QpZG%eRFLjS!!!%S*c&eD#FaG@JR-A9!"S!!J!!+!0&9N91!3T&GQ9ZG%eRFLj
XS!*!$"+#FaRZJR-ClS*c'H`!D!!)!!#J$9dP14!%,9fPZC'ph6@Gb,QJ!!!5JR-B
X%S*c'"+#FaJ3!'!!#!!!S!de&6P8"#8ePER90Ch)ZD!!!"+#FaPqJR-CIS*c'A`!
XF!!)!!#J$8e4%4J%-8h4N4QPXC9"VCbjS!*!$"+#FaMqJR-BrS*c'2`!F!!)!!#J
X$8d9(63%-8f9RE@9ZG%aNFLjS!*!$"+#FaQfJR-CYS*c'E3!F!!)!!#J$9%p26!%
X09'p[E'*[H&9dD@`ZD!!!"+#FaJkJR-B1S*c'$J!B!!)!!#J$6e099!%)6e09G'P
XX,QJ!D3!%S*c&`k#FaF1JR-A$!"S!!J!!+!0%58&-!3Y%D@&XEfG0Ch)ZD!!!"+#
XFaGUJR-ADS*c&fJ!B!!)!!#J$4NP-43%*4QPXC8eRFLjS!!!%S*c&l+#FaHbJR-A
XX!"3!!J!!+!0)4P-Z!39)4P-ZD!!!"+#a24@JX6d9S,%p&3!@!!)!!#J$3dp-6`%
X(3fpXEh)ZD!!!"+#FaLZJR-BVS*c'+`!F!!)!!#J$8N966`%08Q9cEh9bBf90Ch)
XZD!!!"+)TU0DL+DM@SLQSeJ!B!!%!!#R@49K843!)CAKdCA*Z,QJ!C`!%SKiEQU)
XH'jUL(KZD!"S!!3!!+GC0380"!!T0B@0"E'9bG#jS!#k!!!!S!*!$h!#3#8B!!3#
X3"4S!N!-"!!J%E@&TEL#3!`!!!SJ!"+#FaMqJR-BrS*c'2`!F!!)!!#J$8d9(63%
X-8f9RE@9ZG%aNFLjS!*!$"+#FaQfJR-CYS*c'E3!F!!)!!#J$9%p26!%09'p[E'*
X[H&9dD@`ZD!!!"+#FaJkJR-B1S*c'$J!B!!)!!#J$6e099!%)6e09G'PX,QJ!D3!
X%S*c&`k#FaF1JR-A$!"S!!J!!+!0%58&-!3Y%D@&XEfG0Ch)ZD!!!"+#FaGUJR-A
XDS*c&fJ!B!!)!!#J$4NP-43%*4QPXC8eRFLjS!!!%S*c&l+#FaHbJR-AX!"3!!J!
X!+!0)4P-Z!39)4P-ZD!!!"+#a24@JX6d9S,%p&3!@!!)!!#J$3dp-6`%(3fpXEh)
XZD!!!"+#FaLZJR-BVS*c'+`!F!!)!!#J$8N966`%08Q9cEh9bBf90Ch)ZD!!!"+)
XTU0DL+DM@SLQSeJ!B!!%!!#R@49K843!)CAKdCA*Z,QJ!C`!%SKiEQU)H'jUL(KZ
XD!"S!!3!!+GC0380"!!T0B@0"E'9bG#jS!#jMD)!!!$!!N!2`!!!*#3!"!!$rN!L
XJb!28!"3!!J!!+&P"6P0*!!4"6P0*!#k!!!!`!*!$l!!!#3N!!3!!rj!)S-J0[!!
X8!!)!!#KC98j*@!!%G@jTH!!ZJ!!!0!#3!qJ!!!N*!!%!!2q3#+#Z`J)!'!!#!!!
XS"8e"3e3!#%eKBe4bBA"c!*!&D!#3!``+6%aKFh4$E'PMDb#!!!!S!!!'D!!!"Q`
X!"J!!!QJ!!3!'!!!,+J!"!*!$#!C-3faTBfXJJ!!!,!!!"Q3!N!8'!!!"L!!"!!B
X!!!UU!!%!N!--#%a6CA4$C@aX)*!$!*!$$!!!"Q!!!!CN!!!#3!!!!3#3"'!!N"-
X%!*!H5-!"!`!(!*!$r!#3!f!!N"-%!*!H5-!"!`!)!*!$q!#3!f!!N"-%!*!J!3-
X!"J#3!r3!N!0J!*!6"!#3(NM!!3-!N!A`!*!$B!#3%`3!N"jNFJ)%!!%!N!2X!*!
X$B!#3%`3!N"m#!3-!!J#3!qJ!N!0J!*!6"!#3(Q4b!3-!!`#3!q3!N!0J!*!6"!#
X3(Lf-!3-!"3#3!q!!N!0J!*!6"!#3(L!)!3-!"!!!"c!!N!-+!*!Eh%*i#NUGcNk
Xk!&41ZJ"Q,$a*6N4B6VS&ENIkrmSQM%IkrmJQK%kk!'C1ZJ+S6VS'*Nkk!0a1ZJ#
XS3QG)H2rr5'm!"%KA2c`!!5)krl*1ZJ1#6V83!#"Y!'a1N!#Tp&(i#Pjq!%kk![T
XR#%U3!'F%#0!!"Nje)$J+H'B-,$aD6dj&6VS&"#!-4rVrCLD!6R9CMbmm4%&838*
XRUD!J9b"3)RJ*##!0N!#*4rVr6LD!S#kTSb`m8e458dkk"-j(q[mf*S`X2%4548a
X1ZJ5q)%`J"'F-6VS"YJ5!!*!$$'Ed6[S&DNj@rpT"q!N3)Np`)+!ZF!(3%9S4dX"
X"qJ!5F!@J,P@25'm!!UQA6Pj1G5jbFh*M!%Ik"HiQZ!Tm,cJ+J'B#@)p1G8MRrrJ
Xq,`!m8IJ+AQ!+@Bm[#+QP)"qJ3%kk!L4R4%IkrVJQL#!3CqBL3%U4CLi!%!$!,$a
X$8N9-6VS%,'FN2Lm!2#"-)!4R$%kk!(J%J!#3!`aQp%kk"0"1ZJ'F60mIrdjeF!q
XTb8kk"Aa1ZJ!)6VS%p%je)(J+l+!P)&!L5#)BB!T"k!!)G!'%'0$#8FRrp*!!L0#
X*CJ*1G5)!S#iJH!VX)!'J*#*36qrr`#"23UJ!%M&T!!3!&U!93UG)D3!-)%qTmM)
XB6VS"RL4BeF%d'#)BEM*R&P*"C`C53@FD6R8b+2rd6VS"Z0056R8b+2rd6VS"L00
X56R8b+2rd6VS"MY1Urrj1G8kk!8ib+3!-5QN!#QBF9%*U$("MUFP53QEide*1G8k
Xk!965U3!1de*1G8kk!@c5U3!18N*Q"0056R9$p4!#[P&Qe!aK2caQcP*#CJB+DJ!
XArrib)9K")RVpI0+4NNV68Nje-KK1ZJ%14I83!0AB0"KR-L)BEL4R$P*"CK3b+2r
Xd6VS"&Q!B-LMrp%kk!1KJ$M)Srr41ZJ$`B!C1ZJ%3dSh6NNje)KK1ZJ%%de*1G5"
Xkr4!J1[d35UJ!!'FS-LJ!+'FL*#J!'&P#3qd!%02S!!69@6,m2ca#'4,S!$dbr+R
X`88&Ql%(S!%!%J!#3!d"QaNje)(Vmc#!kr-abrh3!5UJ!!'FB[LJ!2@B50LJ!+'F
X-e%1bU!!%C33L+!!%3HJ!3!5!!*!$3'E@)(VmUL"3"%%!%$$"jNS``Nje@Bm[2%0
X24%8r"kQJ)&p3q!TH)!K1G5Kkr(BLG"J!Nq`!102-6R8SH[aH`[`!3#)d'"JSH[a
XQdT41G5Kkr%V#r!"!)M3B#*+kr%j1G5Kkr$M#r!"!)M3B%0+kr$K1G5Kkr#E#r!"
X!)M3B"!D"!*!$%%je6VVrSM)T!!a+D3!+CJC1Z[qiB!41Z[r@dUN!$Nje)&mb'$3
XBX&KAbIrk5N*RrNl`)2`JAc)B0"L`Q&I*rrT+3QIq6[!JqL"I-KJd',"#EJU3!%&
XY"Y"!3I!!!M!3Crj1m!!!)#m!"#p"!!3L,`!),em!"%MR2!!N!#B"5%,%`bJ!+J&
X)4FM&e%4)3T!$`-(3JNcI!$`L(dje)#m!"#p"!!3L,`!),em!"%MR-3"1ZJ#F60m
X!M#)I6R8J,`!%,d%!"#)[!!J[A`!%51Fa!%kk!(`J!8cI!)`L(dje)#m!"#p"!!3
XL,`!),em!"%MR-3"1ZJ!X60m!M#)I6R8J,`!%,d%!"#)[!!J[A`!%51Fa!%kk!!`
XJ!8cI!)`L(dje5S"U(%U"DJa%J%5"6VS!)%5"6R9%J%kk!"C%J%5"6R9+J@S+4)&
X1ZJ!'4)"1G5im!!$rrl+!B`BL!(!!6R@`Kf)-J-&)3$)!3N")3%jeXSGL'Li!3N"
X)3)$"5%")4ci!5%H1`6!(5%Fb"dje*!!Q!H+)iSQbKf,iJ-(!Kc)$`X!Z!dK(cX"
X)4p+(C3L5JQ)%4)&1G90!B14q!&(i#PjCMbm'2`HTS#!IC`!!VLC!@Bm[#kQP*Km
XJ#bJ$8NI[4e*(1JGJ&PQ2,`Br"kQJ)"pR!!#)8NF'K!!!Irj9Mbm!UDB`(`J!!!9
XQh&$i#Pl24CT(CK`J!k"!,`ZTSL!6C`!!@Lm,UC)S8b",S#P`!8je)!5K(L!)C`!
X!3LK),`ZTSL!6C`!!0L",)!0J'&Q2,`Br"kQJ)"pR!!!L8NFJ3#!m!!"rrLm))&!
XL60R!S#kTSe(0rpUCa#C-F!&1G5",5N9Q"+!M6R@J(dje-MbTm%2kqXC1ZJ"S-Mb
XTmN2kqbK1ZJ"F-MbTmd2kqaa1ZJ"3-MbTp%2kq`K1qJ"%,`JJE`!),fJ!!J!))(J
X#TR!-d*!!X,J#UQBN6VS!C$)mUI"1ZJ"%-MbTmNkk!$`b2+Rc6VS!0$)mUI41ZJ!
XX)&p1G6!"S8BN5(!-5RJ#MQS%T4jJ!U%H-!'J4c$m6VNJb6$m6[NJbNje-!'K4L*
XS!!LJ(c!")%QJ4dje!*!%6R8J1[riC`3J3%+3!%je!!!"!*!$0IS!!$6k!!!"QJ!
XNEb!$8!#3!a`"NJ!15%&65!#3!hTD6dj&!*!$KNY*6N3!N!159da23`#3!jj*6N4
XB!*!$UN024%8!!`#f4%&833#3!qC69&*6!*!$mN4548`!N!2q8eP08`!!!3T$6NC
X(!!!"&P0*@N8!!!%L3e*&6!!"!5j%3P9(!!%"4PK6@8d!!3&H!!%!N!FQl%`!!2r
Xr!!!(IJ!Ql0J!!2rr!!!$p!!QlG!!!2rr!!!(A!!Ql(3!!2rr!!!VJJ!QlD`!!2r
Xr!!!&AJ!QlI`!!rrr!!!&`J#3"36rr`!!"FS!N!8"rrm8!#h'!#EYi!!!rrm!!!A
X5!#EXh!!!rrm!!!A@!#EXY!!!rrm!!!AD!#EYe!!!rrm!!!AH!#EXe!!#rrm!!!G
X`!#EXl2rr!!B!!!93!#EYj!!$rrm!!!AL!*!&"2rr!!!&jJ#3"32rr`!!"HS!N!8
X%rrm!!!AZ!*!&!rrr!!!&mJ#3"36rr`!!"IB!N!3&E@YKD'`"-N@Q!:
END_OF_FILE
if test 17003 -ne `wc -c <'mac/MD.proj.hqx'`; then
    echo shar: \"'mac/MD.proj.hqx'\" unpacked with wrong size!
fi
# end of 'mac/MD.proj.hqx'
fi
if test -f 'src/objnam.c' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'src/objnam.c'\"
else
echo shar: Extracting \"'src/objnam.c'\" \(39021 characters\)
sed "s/^X//" >'src/objnam.c' <<'END_OF_FILE'
X/*	SCCS Id: @(#)objnam.c	3.0	89/11/15
X/* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
X/* NetHack may be freely redistributed.  See license for details. */
X
X#include	"hack.h"
X#ifdef TUTTI_FRUTTI
X#include <ctype.h>	/* for isalpha() */
X#endif
X
X/* "an uncursed partly eaten guardian naga hatchling corpse" */
X#define	PREFIX	50
X#define SCHAR_MAX 127
X
X#ifndef OVLB
X
XSTATIC_DCL const char *keystr[N_LOX], *lockstr[N_LOX];
X
X#else /* OVLB */
X/*	We want the player to be able to learn what key goes in what lock.  */
XSTATIC_OVL const char NEARDATA *keystr[N_LOX] = { "round", "square", "triangular", "oval",
X			              "octagonal", "hexagonal", "cylindrical",
X			              "irregular", "conical", "wedge-shaped" },
X	         NEARDATA *lockstr[N_LOX] = { "round", "square", "triangular", "oval",
X			              "octagonal", "hexagonal", "wide",
X			              "notched", "large round", "large square" };
X#endif /* OVLB */
X
XSTATIC_DCL int FDECL(named_key,(const char *));
XSTATIC_DCL int FDECL(named_box,(const char *));
XSTATIC_DCL char *FDECL(strprepend,(char *,const char *));
X
X#ifdef OVL1
Xstatic char *FDECL(sitoa,(int));
X#endif /* OVL1 */
X
Xstruct Jitem {
X	int item;
X	const char *name;
X};
X
X#ifndef OVLB
X
XSTATIC_DCL struct Jitem Japanese_items[];
X
X#else /* OVLB */
X
XSTATIC_OVL struct Jitem Japanese_items[] = {
X	{ SHORT_SWORD, "wakizashi" },
X	{ BROADSWORD, "ninja-to" },
X	{ GLAIVE, "naginata" },
X	/* { BOW, "yumi" }, */
X	{ LOCK_PICK, "osaku" },
X	{0, "" }
X};
X
X#endif /* OVLB */
X
XSTATIC_DCL const char *FDECL(Japanese_item_name,(int));
X
X#ifdef OVL1
X
XSTATIC_OVL int
Xnamed_key(s) register const char *s; {
X	char tc[BUFSZ];
X	register int i;
X
X	for(i=0; i<10; i++) {
X		Strcpy(tc, keystr[i]);
X		Strcat(tc, " key");
X		if(!strcmp(s,tc)) return(i+1);
X	}
X	return(0);
X}
X
XSTATIC_OVL int
Xnamed_box(s)
Xregister const char *s;
X{
X	char tc[BUFSZ];
X	register int i;
X
X	for(i=0; i<10; i++) {
X		Strcpy(tc, lockstr[i]);
X		Strcat(tc, " keyhole)");
X		if(!strcmp(s,tc)) return(i+1);
X	}
X	return(0);
X}
X
XSTATIC_OVL char *
Xstrprepend(s,pref)
Xregister char *s;
Xregister const char *pref; {
Xregister int i = strlen(pref);
X	if(i > PREFIX) {
X		pline("WARNING: prefix too short.");
X		return(s);
X	}
X	s -= i;
X	(void) strncpy(s, pref, i);	/* do not copy trailing 0 */
X	return(s);
X}
X
Xstatic char *
Xsitoa(a) int a; {
X#ifdef LINT	/* static char buf[13]; */
X	char buf[13];
X#else
X	static char NEARDATA buf[13];
X#endif
X	Sprintf(buf, (a < 0) ? "%d" : "+%d", a);
X	return(buf);
X}
X
X#endif /* OVL1 */
X#ifdef OVLB
X
Xchar *
Xtypename(otyp)
Xregister int otyp;
X{
X#ifdef LINT	/* static char buf[BUFSZ]; */
Xchar buf[BUFSZ];
X#else
Xstatic char NEARDATA buf[BUFSZ];
X#endif
Xregister struct objclass *ocl = &objects[otyp];
Xregister const char *actualn = ocl->oc_name;
Xregister const char *dn = ocl->oc_descr;
Xregister const char *un = ocl->oc_uname;
Xregister int nn = ocl->oc_name_known;
X
X	if (pl_character[0] == 'S' && Japanese_item_name(otyp))
X		actualn = Japanese_item_name(otyp);
X	switch(ocl->oc_olet) {
X	case POTION_SYM:
X		Strcpy(buf, "potion");
X		break;
X	case SCROLL_SYM:
X		Strcpy(buf, "scroll");
X		break;
X	case WAND_SYM:
X		Strcpy(buf, "wand");
X		break;
X#ifdef SPELLS
X	case SPBOOK_SYM:
X		Strcpy(buf, "spellbook");
X		break;
X#endif
X	case RING_SYM:
X		Strcpy(buf, "ring");
X		break;
X	case AMULET_SYM:
X		if(nn)
X			Strcpy(buf,actualn);
X		else
X			Strcpy(buf,"amulet");
X		if(un)
X			Sprintf(eos(buf)," called %s",un);
X		if(dn)
X			Sprintf(eos(buf)," (%s)",dn);
X		return(buf);
X	default:
X		if(nn) {
X			Strcpy(buf, actualn);
X			if(otyp >= TURQUOISE && otyp <= JADE)
X				Strcat(buf, " stone");
X			if(un)
X				Sprintf(eos(buf), " called %s", un);
X			if(dn)
X				Sprintf(eos(buf), " (%s)", dn);
X		} else {
X			Strcpy(buf, dn ? dn : actualn);
X			if(ocl->oc_olet == GEM_SYM) {
X				if (otyp == LOADSTONE || otyp == LUCKSTONE)
X					Strcat(buf, " stone");
X				else
X					Strcat(buf, " gem");
X			}
X			if(un)
X				Sprintf(eos(buf), " called %s", un);
X		}
X		return(buf);
X	}
X	/* here for ring/scroll/potion/wand */
X	if(nn)
X		Sprintf(eos(buf), " of %s", actualn);
X	if(un)
X		Sprintf(eos(buf), " called %s", un);
X	if(dn)
X		Sprintf(eos(buf), " (%s)", dn);
X	return(buf);
X}
X
X/* Give the name of an object seen at a distance.  Unlike xname/doname,
X * we don't want to set dknown if it's not set already.  The kludge used is
X * to temporarily set Blind so that xname() skips the dknown setting.  This
X * assumes that we don't want to do this too often; if this function becomes
X * frequently used, it'd probably be better to pass a parameter to xname()
X * or doname() instead.
X */
Xchar *
Xdistant_name(obj, func)
Xregister struct obj *obj;
Xchar *FDECL((*func), (struct obj *));
X{
X	char *str;
X
X	long save_Blinded = Blinded;
X	Blinded = 1;
X	str = (*func)(obj);
X	Blinded = save_Blinded;
X	return str;
X}
X
X#endif /* OVLB */
X#ifdef OVL1
X
Xchar *
Xxname(obj)
Xregister struct obj *obj;
X{
X#ifdef LINT	/* lint may handle static decl poorly -- static char bufr[]; */
Xchar bufr[BUFSZ];
X#else
Xstatic char bufr[BUFSZ];
X#endif
Xregister char *buf = &(bufr[PREFIX]);	/* leave room for "17 -3 " */
Xregister int nn = objects[obj->otyp].oc_name_known;
Xregister const char *actualn = objects[obj->otyp].oc_name;
Xregister const char *dn = objects[obj->otyp].oc_descr;
Xregister const char *un = objects[obj->otyp].oc_uname;
X
X	if (pl_character[0] == 'S' && Japanese_item_name((int)obj->otyp))
X		actualn = Japanese_item_name((int)obj->otyp);
X
X	buf[0] = 0;
X	if(!Blind) obj->dknown=1;
X	switch(obj->olet) {
X	    case AMULET_SYM:
X		if(obj->otyp == AMULET_OF_YENDOR) {
X		    Strcpy(buf, (obj->spe < 0 && obj->known) ?
X			   "cheap plastic imitation of the " : "");
X		    Strcat(buf, actualn);
X		} else if (!obj->dknown)
X			Strcpy(buf, "amulet");
X		else if (nn)
X			Strcpy(buf, actualn);
X		else if (un)
X			Sprintf(buf,"amulet called %s", un);
X		else
X			Sprintf(buf,"%s amulet", dn);
X		break;
X	    case WEAPON_SYM:
X		if(obj->otyp <= SHURIKEN && obj->opoisoned)
X			Strcpy(buf, "poisoned ");
X	    case VENOM_SYM:
X	    case TOOL_SYM:
X		if(un) {
X			/* un must come first here.  If it does not, they could
X			 * tell objects apart by seeing which ones refuse to
X			 * accept names.
X			 */
X			Sprintf(buf, "%s called %s",
X				nn ? actualn : dn, un);
X		} else if(nn)
X			Strcat(buf, actualn);
X		else
X			Strcat(buf, dn);
X		/* If we use an() here we'd have to remember never to use */
X		/* it whenever calling doname() or xname(). */
X		if(obj->otyp == FIGURINE)
X		    Sprintf(eos(buf), " of a%s %s",
X			index(vowels,*(mons[obj->corpsenm].mname)) ? "n" : "",
X			mons[obj->corpsenm].mname);
X		break;
X	    case ARMOR_SYM:
X		if(obj->otyp==DRAGON_SCALE_MAIL) {
X			Sprintf(buf, "%s scale mail",
X						mons[obj->corpsenm].mname);
X			break;
X		}
X
X		if(is_boots(obj) || is_gloves(obj)) Strcpy(buf,"pair of ");
X
X		if(nn)	Strcat(buf, actualn);
X		else if(un) {
X			if(is_boots(obj))
X				Strcat(buf,"boots");
X			else if(is_gloves(obj))
X				Strcat(buf,"gloves");
X			else if(is_cloak(obj))
X				Strcpy(buf,"cloak");
X			else if(is_helmet(obj))
X				Strcpy(buf,"helmet");
X			else if(is_shield(obj))
X				Strcpy(buf,"shield");
X			else
X				Strcpy(buf,"armor");
X			Strcat(buf, " called ");
X			Strcat(buf, un);
X		} else	Strcat(buf, dn);
X		break;
X	    case FOOD_SYM:
X#ifdef TUTTI_FRUTTI
X		if (obj->otyp == SLIME_MOLD) {
X			register struct fruit *f;
X
X			for(f=ffruit; f; f = f->nextf) {
X				if(f->fid == obj->spe) {
X					Strcpy(buf, f->fname);
X					break;
X				}
X			}
X			if (!f) impossible("Bad fruit #%d?", obj->spe);
X			break;
X		}
X#endif
X		Strcpy(buf, actualn);
X		if(obj->otyp == TIN && obj->known) {
X		    if(obj->spe > 0)
X			Strcat(buf, " of spinach");
X		    else if (mons[obj->corpsenm].mlet == S_FUNGUS)
X			Sprintf(eos(buf), " of %s", mons[obj->corpsenm].mname);
X		    else if(obj->corpsenm >= 0)
X			Sprintf(eos(buf), " of %s meat", mons[obj->corpsenm].mname);
X		    else Strcpy(buf, "empty tin");
X		}
X		break;
X	    case CHAIN_SYM:
X		Strcpy(buf, actualn);
X		break;
X	    case ROCK_SYM:
X		if(obj->otyp == STATUE)
X		    Sprintf(buf, "%s of a%s %s", actualn,
X			index(vowels,*(mons[obj->corpsenm].mname)) ? "n" : "",
X			mons[obj->corpsenm].mname);
X		else Strcpy(buf, actualn);
X		break;
X	    case BALL_SYM:
X		Sprintf(buf, "%sheavy iron ball",
X		  (obj->owt > objects[obj->otyp].oc_weight) ? "very " : "");
X		break;
X	    case POTION_SYM:
X		if(nn || un || !obj->dknown) {
X			Strcpy(buf, "potion");
X			if(!obj->dknown) break;
X			if(nn) {
X			    Strcat(buf, " of ");
X			    if(obj->otyp == POT_WATER &&
X			       objects[POT_WATER].oc_name_known &&
X			       (obj->bknown || pl_character[0] == 'P') &&
X			       (obj->blessed || obj->cursed)) {
X				Strcat(buf, obj->blessed ? "holy " : "unholy ");
X			    }
X			    Strcat(buf, actualn);
X			} else {
X				Strcat(buf, " called ");
X				Strcat(buf, un);
X			}
X		} else {
X			Strcpy(buf, dn);
X			Strcat(buf, " potion");
X		}
X		break;
X	case SCROLL_SYM:
X		Strcpy(buf, "scroll");
X		if(!obj->dknown) break;
X		if(nn) {
X			Strcat(buf, " of ");
X			Strcat(buf, actualn);
X		} else if(un) {
X			Strcat(buf, " called ");
X			Strcat(buf, un);
X		} else {
X			Strcat(buf, " labeled ");
X			Strcat(buf, dn);
X		}
X		break;
X	case WAND_SYM:
X		if(!obj->dknown)
X			Sprintf(buf, "wand");
X		else if(nn)
X			Sprintf(buf, "wand of %s", actualn);
X		else if(un)
X			Sprintf(buf, "wand called %s", un);
X		else
X			Sprintf(buf, "%s wand", dn);
X		break;
X#ifdef SPELLS
X	case SPBOOK_SYM:
X		if(!obj->dknown)
X			Sprintf(buf, "spellbook");
X		else if(nn)
X			Sprintf(buf, "spellbook of %s", actualn);
X		else if(un)
X			Sprintf(buf, "spellbook called %s", un);
X		else
X			Sprintf(buf, "%s spellbook", dn);
X		break;
X#endif
X	case RING_SYM:
X		if(!obj->dknown)
X			Sprintf(buf, "ring");
X		else if(nn)
X			Sprintf(buf, "ring of %s", actualn);
X		else if(un)
X			Sprintf(buf, "ring called %s", un);
X		else
X			Sprintf(buf, "%s ring", dn);
X		break;
X	case GEM_SYM:
X		if(!obj->dknown) {
X			if (obj->otyp == ROCK || obj->otyp == LOADSTONE
X					|| obj->otyp == LUCKSTONE)
X				Strcpy(buf, "stone");
X			else
X				Strcpy(buf, "gem");
X			break;
X		}
X		if(!nn) {
X			const char *rock=
X	(obj->otyp==LOADSTONE||obj->otyp==LUCKSTONE) ? "stone" : "gem";
X			if(un)	Sprintf(buf,"%s called %s", rock, un);
X			else	Sprintf(buf, "%s %s", dn, rock);
X			break;
X		}
X		Strcpy(buf, actualn);
X		if(obj->otyp >= TURQUOISE && obj->otyp <= JADE)
X			Strcat(buf, " stone");
X		break;
X	default:
X		Sprintf(buf,"glorkum %c (0%o) %u %d",
X			obj->olet,obj->olet,obj->otyp,obj->spe);
X	}
X	if(obj->quan != 1) Strcpy(buf, makeplural(buf));
X
X	if(obj->onamelth) {
X		Strcat(buf, " named ");
X		Strcat(buf, ONAME(obj));
X	}
X	return(buf);
X}
X
X#endif /* OVL1 */
X#ifdef OVL0
X
Xchar *
Xdoname(obj)
Xregister struct obj *obj;
X{
X	boolean ispoisoned = FALSE;
X	char prefix[PREFIX];
X	char tmpbuf[PREFIX+1];
X	/* when we have to add something at the start of prefix instead of the
X	 * end (Strcat is used on the end)
X	 */
X	register char *bp = xname(obj);
X	/* When using xname, we want "poisoned arrow", and when using
X	 * doname, we want "poisoned +0 arrow".  This kludge is about the only
X	 * way to do it, at least until someone overhauls xname() and doname(),
X	 * combining both into one function taking a parameter.
X	 */
X	if (!strncmp(bp, "poisoned ", 9)) {
X		bp += 9;
X		ispoisoned = TRUE;
X	}
X
X	if(obj->quan != 1)
X		Sprintf(prefix, "%u ", obj->quan);
X	else
X		Strcpy(prefix, "a ");
X	if((obj->bknown || pl_character[0] == 'P') &&
X	    (obj->otyp != POT_WATER || !objects[POT_WATER].oc_name_known
X		|| (!obj->cursed && !obj->blessed))) {
X	    /* allow 'blessed clear potion' if we don't know it's holy water;
X	     * always allow "uncursed potion of water"
X	     */
X	    if(obj->cursed)
X		Strcat(prefix, "cursed ");
X	    else if(obj->blessed)
X		Strcat(prefix, "blessed ");
X	    else if (((obj->olet != ARMOR_SYM
X			&& obj->olet != WAND_SYM
X			&& obj->olet != WEAPON_SYM
X			&& ((obj->olet != TOOL_SYM &&
X			     obj->olet != RING_SYM) ||
X			     !objects[obj->otyp].oc_charged))
X			    || !obj->known)
X		/* For items with charges or +/-, knowing the +/- means that
X		 * the item has been totally identified, and therefore there
X		 * is no doubt as to the object being uncursed if it's
X		 * not described as "blessed" or "cursed".
X		 *
X		 * If the +/- isn't known, "uncursed" must be printed to
X		 * avoid ambiguity between an item whose curse status is
X		 * unknown, and an item known to be uncursed.
X		 */
X#ifdef MAIL
X			&& obj->otyp != SCR_MAIL
X#endif
X			&& obj->otyp != AMULET_OF_YENDOR &&
X			pl_character[0] != 'P')
X		Strcat(prefix, "uncursed ");
X	}
X	switch(obj->olet) {
X	case AMULET_SYM:
X		if(obj->otyp == AMULET_OF_YENDOR)
X		    if(strncmp(bp, "cheap ", 6)) {
X			Strcpy(tmpbuf, "the ");
X			Strcat(tmpbuf, prefix+2); /* skip the "a " */
X			Strcpy(prefix, tmpbuf);
X		    }
X		if(obj->owornmask & W_AMUL)
X			Strcat(bp, " (being worn)");
X		break;
X	case WEAPON_SYM:
X		if(ispoisoned)
X			Strcat(prefix, "poisoned ");
Xplus:
X		if(obj->known) {
X			Strcat(prefix, sitoa(obj->spe));
X			Strcat(prefix, " ");
X		}
X		break;
X	case ARMOR_SYM:
X		if(obj->owornmask & W_ARMOR)
X			Strcat(bp, " (being worn)");
X		goto plus;
X	case TOOL_SYM:			/* temp. hack by GAN 11/18/86 */
X		if(obj->owornmask & W_TOOL) { /* blindfold */
X			Strcat(bp, " (being worn)");
X			break;
X		}
X#ifdef WALKIES
X		if(obj->otyp == LEASH && obj->leashmon != 0) {
X			Strcat(bp, " (in use)");
X			break;
X		}
X#endif
X		if(obj->otyp == KEY ||
X		   (obj->otyp == SKELETON_KEY &&
X		    !objects[obj->otyp].oc_name_known)) {
X			Strcat(prefix, keystr[obj->spe]);
X			Strcat(prefix, " ");
X			break;
X		}
X		if(obj->otyp == LARGE_BOX || obj->otyp == CHEST) {
X			Sprintf(eos(bp), " (%s keyhole)", lockstr[obj->spe]);
X			break;
X		}
X		if(obj->otyp == PICK_AXE || obj->otyp == UNICORN_HORN)
X			goto plus;
X		if(!objects[obj->otyp].oc_charged) break;
X		/* if special tool, fall through to show charges */
X	case WAND_SYM:
X		if(obj->known)
X			Sprintf(eos(bp), " (%d)", obj->spe);
X		break;
X	case RING_SYM:
X		if(obj->owornmask & W_RINGR) Strcat(bp, " (on right ");
X		if(obj->owornmask & W_RINGL) Strcat(bp, " (on left ");
X		if(obj->owornmask & W_RING) {
X		    Strcat(bp, body_part(HAND));
X		    Strcat(bp, ")");
X		}
X		if(obj->known && objects[obj->otyp].oc_charged) {
X			Strcat(prefix, sitoa(obj->spe));
X			Strcat(prefix, " ");
X		}
X		break;
X	case FOOD_SYM:
X		if(obj->oeaten)
X		    Strcat(prefix, "partly eaten ");
X		if(obj->otyp == CORPSE) {
X		    Strcat(prefix, mons[obj->corpsenm].mname);
X		    Strcat(prefix, " ");
X		} else if(obj->otyp == EGG && obj->known) {
X		    if(obj->corpsenm >= 0) {
X			Strcat(prefix, mons[obj->corpsenm].mname);
X			Strcat(prefix, " ");
X#ifdef POLYSELF
X			if (obj->spe)
X			    Strcat(bp, " (laid by you)");
X#endif
X		    }
X		}
X		break;
X	case BALL_SYM:
X		if(obj->owornmask & W_BALL)
X			Strcat(bp, " (chained to you)");
X			break;
X	}
X
X	if((obj->owornmask & W_WEP) && !mrg_to_wielded) {
X		if (obj->quan != 1)
X			Strcat(bp, " (wielded)");
X		else {
X			Strcat(bp, " (weapon in ");
X			Strcat(bp, body_part(HAND));
X			Strcat(bp, ")");
X		}
X	}
X	if(obj->unpaid)
X		Strcat(bp, " (unpaid)");
X	if (!strncmp(prefix, "a ", 2) &&
X			index(vowels, *(prefix+2) ? *(prefix+2) : *bp)
X			&& (*(prefix+2) || (strncmp(bp, "uranium", 7)
X				&& strncmp(bp, "unicorn", 7)))) {
X		Strcpy(tmpbuf, prefix);
X		Strcpy(prefix, "an ");
X		Strcpy(prefix+3, tmpbuf+2);
X	}
X	bp = strprepend(bp, prefix);
X	return(bp);
X}
X
X#endif /* OVL0 */
X#ifdef OVLB
X
X/*
X * Used if only one of a collection of objects is named (e.g. in eat.c).
X */
X
Xchar *
Xsingular(otmp, func)
Xregister struct obj *otmp;
Xchar *FDECL((*func), (struct obj *));
X{
X	unsigned savequan;
X	char *nam;
X
X	/* Note: using xname for corpses will not give the monster type */
X	if (otmp->otyp == CORPSE && func == xname) {
X		static char NEARDATA buf[31];
X
X		Sprintf(buf, "%s corpse", mons[otmp->corpsenm].mname);
X		return buf;
X	}
X	savequan = otmp->quan;
X	otmp->quan = 1;
X	nam = (*func)(otmp);
X	otmp->quan = savequan;
X	return nam;
X}
X
Xchar *
Xan(str)
Xregister const char *str;
X{
X	static char NEARDATA buf[BUFSZ];
X
X	buf[0] = '\0';
X
X	if (strncmp(str, "the ", 4))
X	    if (index(vowels, *str) &&
X		strncmp(str, "useful", 6) &&
X		strncmp(str, "unicorn", 7) &&
X		strncmp(str, "uranium", 7))
X		    Strcpy(buf, "an ");
X	    else
X		    Strcpy(buf, "a ");
X
X	Strcat(buf, str);
X	return buf;
X}
X
Xchar *
XAn(str)
Xconst char *str;
X{
X	register char *tmp;
X
X	tmp = an(str);
X	if (*tmp == 'a') *tmp = 'A';
X	return tmp;
X}
X
Xchar *
Xaobjnam(otmp,verb)
Xregister struct obj *otmp;
Xregister const char *verb;
X{
X	register char *bp = xname(otmp);
X	char prefix[PREFIX];
X
X	if(otmp->quan != 1) {
X		Sprintf(prefix, "%u ", otmp->quan);
X		bp = strprepend(bp, prefix);
X	}
X
X	if(verb) {
X		/* verb is given in plural (without trailing s) */
X		Strcat(bp, " ");
X		if(otmp->quan != 1)
X			Strcat(bp, verb);
X		else if(!strcmp(verb, "are"))
X			Strcat(bp, "is");
X		else {
X			Strcat(bp, verb);
X			Strcat(bp, "s");
X		}
X	}
X	return(bp);
X}
X
Xchar *
XDoname2(obj)
Xregister struct obj *obj;
X{
X	register char *s = doname(obj);
X
X	if('a' <= *s && *s <= 'z') *s -= ('a' - 'A');
X	return(s);
X}
X
Xconst char *wrp[] = { "wand", "ring", "potion", "scroll", "gem", "amulet",
X#ifdef SPELLS
X		"spellbook",
X#endif
X		/* for non-specific wishes */
X		"weapon", "armor", "tool", "food", "comestible",
X	      };
Xconst char wrpsym[] = {WAND_SYM, RING_SYM, POTION_SYM, SCROLL_SYM, GEM_SYM, AMULET_SYM,
X#ifdef SPELLS
X		 SPBOOK_SYM,
X#endif
X		 WEAPON_SYM, ARMOR_SYM, TOOL_SYM, FOOD_SYM, FOOD_SYM
X		};
X
Xvoid
Xlcase(str)
Xregister char *str;
X{
X	register char *p;
X	for (p = str; *p; p++)
X		if('A' <= *p && *p <= 'Z') *p += 'a'-'A';
X}
X
X#endif /* OVLB */
X#ifdef OVL0
X
X/* Plural routine; chiefly used for user-defined fruits.  We have to try to
X * account for everything reasonable the player has; something unreasonable
X * can still break the code.  However, it's still a lot more accurate than
X * "just add an s at the end", which Rogue uses...
X *
X * Also used for plural monster names ("Wiped out all homunculi.")
X * and body parts.
X */
Xchar *
Xmakeplural(oldstr)
Xconst char *oldstr;
X{
X	register char *spot;
X	static char NEARDATA str[BUFSZ];
X	const char *excess;
X	int len;
X
X	while (*oldstr==' ') oldstr++;
X	if (!oldstr || !*oldstr) {
X		impossible("plural of null?");
X		Strcpy(str, "s");
X		return str;
X	}
X	Strcpy(str, oldstr);
X
X	/* Search for common compounds, ex. lump of royal jelly */
X	for(excess=(char *)0, spot=str; *spot; spot++) {
X		if (!strncmp(spot, " of ", 4)
X				|| !strncmp(spot, " labeled ", 9)
X				|| !strncmp(spot, " called ", 8)
X				|| !strncmp(spot, " named ", 7)
X				|| !strcmp(spot, " above") /* lurkers above */
X				|| !strncmp(spot, " versus ", 8)
X#ifdef TUTTI_FRUTTI
X				|| !strncmp(spot, " from ", 6)
X				|| !strncmp(spot, " in ", 4)
X				|| !strncmp(spot, " on ", 4)
X				|| !strncmp(spot, " a la ", 6)
X				|| !strncmp(spot, " with", 5)
X				|| !strncmp(spot, " de ", 4)
X				|| !strncmp(spot, " d'", 3)
X				|| !strncmp(spot, " du ", 4)
X#endif
X				) {
X			excess = oldstr + (int) (spot - str);
X			*spot = 0;
X			break;
X		}
X	}
X	spot--;
X	while (*spot==' ') spot--; /* Strip blanks from end */
X	*(spot+1) = 0;
X	/* Now spot is the last character of the string */
X
X	len = strlen(str);
X#ifdef TUTTI_FRUTTI
X	/* Single letters */
X	if (len==1 || !isalpha(*spot)) {
X		Strcpy(spot+1, "'s");
X		goto bottom;
X	}
X#endif
X
X	/* man/men ("Wiped out all cavemen.") */
X	if (len >= 3 && !strcmp(spot-2, "man") &&
X			(len<6 || strcmp(spot-5, "shaman")) &&
X			(len<5 || strcmp(spot-4, "human"))) {
X		*(spot-1) = 'e';
X		goto bottom;
X	}
X
X	/* tooth/teeth */
X	if (len >= 5 && !strcmp(spot-4, "tooth")) {
X		Strcpy(spot-3, "eeth");
X		goto bottom;
X	}
X
X	/* knife/knives, etc... */
X	if (!strcmp(spot-1, "fe"))
X		*(spot-1) = 'v';
X	else if (*spot == 'f')
X		if (index("lr", *(spot-1)) || index(vowels, *(spot-1)))
X			*spot = 'v';
X		else if (!strncmp(spot-4, "staf", 4))
X			Strcpy(spot-1, "ve");
X
X	/* foot/feet (body part) */
X	if (len >= 4 && !strcmp(spot-3, "foot")) {
X		Strcpy(spot-2, "eet");
X		goto bottom;
X	}
X
X	/* ium/ia (mycelia, baluchitheria) */
X	if (len >= 3 && !strcmp(spot-2, "ium")) {
X		*(spot--) = (char)0;
X		*spot = 'a';
X		goto bottom;
X	}
X
X	/* algae, larvae, hyphae (another fungus part) */
X#ifdef TUTTI_FRUTTI
X	if ((len >= 4 && !strcmp(spot-3, "alga")) ||
X	    (len >= 5 &&
X	     (!strcmp(spot-4, "hypha") || !strcmp(spot-4, "larva")))) {
X#else
X	if (len >= 5 && (!strcmp(spot-4, "hypha"))) {
X#endif
X		Strcpy(spot, "ae");
X		goto bottom;
X	}
X
X	/* fungus/fungi, homunculus/homunculi, but wumpuses */
X	if (!strcmp(spot-1, "us") && strcmp(spot-5, "wumpus")) {
X		*(spot--) = (char)0;
X		*spot = 'i';
X		goto bottom;
X	}
X
X	/* vortex/vortices */
X	if (len >= 6 && !strcmp(spot-3, "rtex")) {
X		Strcpy(spot-1, "ices");
X		goto bottom;
X	}
X
X	/* djinni/djinn (note: also efreeti/efreet) */
X	if (len >= 6 && !strcmp(spot-5, "djinni")) {
X		*(spot--) = (char)0;
X		goto bottom;
X	}
X
X	/* same singular and plural */
X	/* note: also swine, trout, grouse */
X	if ((len >= 7 && !strcmp(spot-6, "samurai")) ||
X	    (len >= 5 &&
X#ifdef TUTTI_FRUTTI
X	     (!strcmp(spot-4, "manes") || !strcmp(spot-4, "sheep"))) ||
X	    (len >= 4 &&
X	     (!strcmp(spot-3, "fish") || !strcmp(spot-3, "tuna") ||
X	      !strcmp(spot-3, "deer"))))
X#else
X	     !strcmp(spot-4, "manes")))
X#endif
X		goto bottom;
X
X#ifdef TUTTI_FRUTTI
X	/* mouse/mice,louse/lice (not a monster, but possible in a food name) */
X	if (len >= 5 && !strcmp(spot-3, "ouse") && index("MmLl", *(spot-4))) {
X		Strcpy(spot-3, "ice");
X		goto bottom;
X	}
X
X	/* matzoh/matzot, possible food name */
X	if (len >= 6 && (!strcmp(spot-5, "matzoh")
X					|| !strcmp(spot-5, "matzah"))) {
X		Strcpy(spot-1, "ot");
X		goto bottom;
X	}
X	if (len >= 5 && (!strcmp(spot-4, "matzo")
X					|| !strcmp(spot-5, "matza"))) {
X		Strcpy(spot, "ot");
X		goto bottom;
X	}
X
X	/* child/children (for the wise guys who give their food funny names) */
X	if (len >= 5 && !strcmp(spot-4, "child")) {
X		Strcpy(spot, "dren");
X		goto bottom;
X	}
X
X	/* sis/ses (oasis, nemesis) */
X	if (len >= 3 && !strcmp(spot-2, "sis")) {
X		*(spot-1) = 'e';
X		goto bottom;
X	}
X
X	/* note: -eau/-eaux (gateau, bordeau...) */
X	/* note: ox/oxen, VAX/VAXen, goose/geese */
X#endif
X
X	/* Ends in z, x, s, ch, sh; add an "es" */
X	if (index("zxsv", *spot) || (*spot=='h' && index("cs", *(spot-1)))
X#ifdef TUTTI_FRUTTI
X	/* Kludge to get "tomatoes" and "potatoes" right */
X				|| (len >= 4 && !strcmp(spot-2, "ato"))
X#endif
X									) {
X		Strcpy(spot+1, "es");
X		goto bottom;
X	}
X
X	/* Ends in y preceded by consonant (note: also "qu"); change to "ies" */
X	if (*spot == 'y' &&
X	    (!index(vowels, *(spot-1)))) {
X		Strcpy(spot, "ies");
X		goto bottom;
X	}
X
X	/* Default: append an 's' */
X	Strcpy(spot+1, "s");
X
Xbottom:	if (excess) Strcpy(str+strlen(str), excess);
X	return str;
X}
X
X#endif /* OVL0 */
X
Xstruct o_range {
X	const char *name, osym;
X	int  f_o_range, l_o_range;
X};
X
X#ifndef OVLB
X
XSTATIC_DCL const struct o_range o_ranges[];
X
X#else /* OVLB */
X
X/* wishable subranges of objects */
XSTATIC_OVL const struct o_range NEARDATA o_ranges[] = {
X	{ "bag",	TOOL_SYM,   SACK,	    BAG_OF_TRICKS },
X	{ "gloves",	ARMOR_SYM,  LEATHER_GLOVES, GAUNTLETS_OF_DEXTERITY },
X	{ "gauntlets",	ARMOR_SYM,  LEATHER_GLOVES, GAUNTLETS_OF_DEXTERITY },
X	{ "boots",	ARMOR_SYM,  LOW_BOOTS,	    LEVITATION_BOOTS },
X	{ "shoes",	ARMOR_SYM,  LOW_BOOTS,	    IRON_SHOES },
X	{ "cloak",	ARMOR_SYM,  MUMMY_WRAPPING, CLOAK_OF_DISPLACEMENT },
X	{ "shield",	ARMOR_SYM,  SMALL_SHIELD,   SHIELD_OF_REFLECTION },
X#ifdef TOLKIEN	/* note: "helmet" is a specific item */
X	{ "helm",	ARMOR_SYM,  ELVEN_LEATHER_HELM, HELM_OF_TELEPATHY },
X#else
X	{ "helm",	ARMOR_SYM,  ORCISH_HELM,    HELM_OF_TELEPATHY },
X#endif
X	{ "sword",	WEAPON_SYM, SHORT_SWORD,    KATANA }
X};
X
X/*
X * Singularize a string the user typed in; this helps reduce the complexity
X * of readobjnam, and is also used in pager.c to singularize the string
X * for which help is sought.
X */
X
Xchar *
Xmakesingular(oldstr)
Xconst char *oldstr;
X{
X	char *p, *bp;
X	static char NEARDATA str[BUFSZ];
X
X	if (!oldstr || !*oldstr) {
X		impossible("singular of null?");
X		str[0] = 0; return str;
X	}
X	Strcpy(str, oldstr);
X	bp = str;
X
X	while (*bp == ' ') bp++;
X	/* find "cloves of garlic", "worthless pieces of blue glass" */
X	for(p = bp; *p; p++) 
X	    if(!strncmp(p, "s of ", 5)){
X		/* but don't singularize "gauntlets" */
X		if(strncmp(p-8, "gauntlet", 8))
X			while(*p = p[1]) p++;
X		return bp;
X	    }
X
X	/* remove -s or -es (boxes) or -ies (rubies) */
X	p = eos(bp);
X	if(p[-1] == 's') {
X		if(p[-2] == 'e') {
X			if(p[-3] == 'i') {
X				if(!strcmp(p-7, "cookies") ||
X				   !strcmp(p-4, "pies"))
X					goto mins;
X				Strcpy(p-3, "y");
X				return bp;
X			}
X
X			/* note: cloves / knives from clove / knife */
X			if(!strcmp(p-6, "knives")) {
X				Strcpy(p-3, "fe");
X				return bp;
X			}
X
X			if(!strcmp(p-6, "staves")) {
X				Strcpy(p-3, "ff");
X				return bp;
X			}
X
X			/* note: nurses, axes but boxes */
X			if(!strcmp(p-5, "boxes")) {
X				p[-2] = 0;
X				return bp;
X			}
X		}
X		/* but don't singularize boots or gloves */
X		else if(!strcmp(p-5, "boots") ||
X			!strcmp(p-6, "gloves"))
X				return bp;
X	mins:
X		p[-1] = 0;
X	} else {
X		if(!strcmp(p-5, "teeth")) {
X			Strcpy(p-5, "tooth");
X			return bp;
X		}
X		/* here we cannot find the plural suffix */
X	}
X	return bp;
X}
X
X/* Return something wished for.  If not an object, return &zeroobj; if an error
X * (no matching object), return (struct obj *)0.  Giving readobjnam() a null
X * pointer skips the error return and creates a random object instead.
X */
Xstruct obj *
Xreadobjnam(bp)
Xregister char *bp;
X{
X	register char *p;
X	register int i;
X	register struct obj *otmp;
X	int cnt, spe, spesgn, typ, heavy, blessed, uncursed, halfeaten;
X	int iscursed, ispoisoned, mntmp, contents;
X	int iskey, isnamedbox;
X#ifdef TUTTI_FRUTTI
X	struct fruit *f;
X	int ftype = current_fruit;
X	char fruitbuf[BUFSZ];
X	/* We want to check for fruits last so that, for example, someone
X	 * who names their fruit "katana" and wishes for a katana gets a real
X	 * one.  But, we have to keep around the old buf since in the meantime
X	 * we have deleted "empty", "+6", etc...
X	 */
X#endif
X	char let;
X	char *un, *dn, *actualn;
X	char *name=0;
X#ifdef WIZARD
X	int fake=0;
X#endif
X
X	cnt = spe = spesgn = typ = heavy = blessed = uncursed = iscursed =
X		ispoisoned = halfeaten = iskey = isnamedbox = 0;
X	mntmp = -1;
X#define UNDEFINED 0
X#define EMPTY 1
X#define SPINACH 2
X	contents = UNDEFINED;
X	let = 0;
X	actualn = dn = un = 0;
X	
X	for(;;) {
X		if (!bp) goto any;
X		if(!strncmp(bp, "an ", 3)) {
X			cnt = 1;
X			bp += 3;
X		} else if(!strncmp(bp, "a ", 2)) {
X			cnt = 1;
X			bp += 2;
X		} else if(!strncmp(bp, "cheap plastic imitation of ", 27)) {
X#ifdef WIZARD
X			fake = 1;
X#endif
X			bp += 27;
X		} else if(!strncmp(bp, "the ", 4)){
X	/*		the = 1; */
X			bp += 4;
X		} else if(!cnt && digit(*bp)){
X			cnt = atoi(bp);
X			while(digit(*bp)) bp++;
X			while(*bp == ' ') bp++;
X		} else if(!strncmp(bp, "partly eaten ", 13)) {
X			halfeaten = 1;
X			bp += 13;
X		} else if(!strncmp(bp,"blessed ",8)) {
X			blessed=1;
X			bp += 8;
X		} else if(!strncmp(bp,"holy ",5)) {
X			blessed=1;
X			bp += 5;
X		} else if(!strncmp(bp,"cursed ",7) || !strncmp(bp,"unholy ",7)){
X			iscursed=1;
X			bp += 7;
X		} else if(!strncmp(bp, "uncursed ",9)) {
X			uncursed=1;
X			bp += 9;
X		} else break;
X	}
X	if(!cnt) cnt = 1;		/* %% what with "gems" etc. ? */
X#ifdef TUTTI_FRUTTI
X	Strcpy(fruitbuf, bp);
X#endif
X	if(!strncmp(bp, "empty ", 6)) {
X		contents = EMPTY;
X		bp += 6;
X	} else if(!strncmp(bp, "poisoned ",9)) {
X		ispoisoned=1;
X		bp += 9;
X#ifdef WIZARD
X	} else if(wizard && !strncmp(bp, "trapped ",8)) {
X		ispoisoned=1;
X		bp += 8;
X#endif
X	}
X	if(*bp == '+' || *bp == '-'){
X		spesgn = (*bp++ == '+') ? 1 : -1;
X		spe = atoi(bp);
X		while(digit(*bp)) bp++;
X		while(*bp == ' ') bp++;
X	} else {
X		p = rindex(bp, '(');
X		if(p) {
X			if(p > bp && p[-1] == ' ') p[-1] = 0;
X			else *p = 0;
X			p++;
X			if (!(isnamedbox = named_box(p))) {
X				spe = atoi(p);
X				while(digit(*p)) p++;
X				if (*p != ')') spe = 0;
X				else {
X				    spesgn = 1;
X				    p++; 
X				    if (*p) Strcat(bp, p);
X				}
X			}
X		}
X	}
X/*
X   otmp->spe is type schar; so we don't want spe to be any bigger or smaller.
X   also, spe should always be positive  -- some cheaters may try to confuse
X   atoi()
X*/
X	if (spe < 0) {
X		spesgn = -1;	/* cheaters get what they deserve */
X		spe = abs(spe);
X	}
X	if (spe > SCHAR_MAX)
X		spe = SCHAR_MAX;
X
X	/* now we have the actual name, as delivered by xname, say
X		green potions called whisky
X		scrolls labeled "QWERTY"
X		egg
X		fortune cookies
X		very heavy iron ball named hoei
X		wand of wishing
X		elven cloak
X	*/
X	for(p = bp; *p; p++) if(!strncmp(p, " named ", 7)) {
X		*p = 0;
X		name = p+7;
X	}
X	for(p = bp; *p; p++) if(!strncmp(p, " called ", 8)) {
X		*p = 0;
X		un = p+8;
X		/* "helmet called telepathy" is not "helmet" (a specific type)
X		 * "shield called reflection" is not "shield" (a general type)
X		 */
X		for(i = 0; i < SIZE(o_ranges); i++)
X		    if(!strcmp(bp, o_ranges[i].name)) {
X			let = o_ranges[i].osym;
X			goto srch;
X		    }
X	}
X	for(p = bp; *p; p++) if(!strncmp(p, " labeled ", 9)) {
X		*p = 0;
X		dn = p+9;
X	}
X	for(p = bp; *p; p++) if(!strncmp(p, " labelled ", 10)) {
X		*p = 0;
X		dn = p+10;
X	}
X	for(p = bp; *p; p++) if(!strncmp(p, " of spinach", 11)) {
X		*p = 0;
X		contents = SPINACH;
X	}
X
X	/* Skip over "pair of ", then jump to the singular so we don't
X	   try to convert "gloves" or "boots". */
X	if(cnt == 1 && !strncmp(bp, "pair of ",8)) {
X		bp += 8;
X		cnt = 2;
X		goto sing;
X		/* cnt is ignored for armor and other non-stackable objects;
X		   DTRT for stackable objects */
X	} else if(cnt > 1 && !strncmp(bp, "pairs of ",9)) {
X		bp += 9;
X		cnt *= 2;
X	}
X
X	/* Find corpse type using "of" (figurine of an orc, tin of orc meat) */
X	for(p = bp; *p; p++)
X		if (!strncmp(p, " of ", 4) && (mntmp = name_to_mon(p+4)) >= 0) {
X			*p = 0;
X			break;
X	}
X	/* Find corpse type w/o "of" (red dragon scale mail, yeti corpse) */
X	if (strncmp(bp, "samurai sword", 13)) /* not the "samurai" monster! */
X	if (strncmp(bp, "wizard lock", 11)) /* not the "wizard" monster! */
X	if (strncmp(bp, "orcish", 6)) /* not the "orc" monster! */
X	if (mntmp < 0) if ((mntmp = name_to_mon(bp)) >= 0) {
X		bp += strlen(mons[mntmp].mname);
X		if (*bp==' ') bp++;
X	}
X
X	/* first change to singular if necessary */
X	if(cnt != 1 && *bp)
X		Strcpy(bp, makesingular(bp));
X
Xsing:
X	/* Maybe we need a special strcmp() which ignores capitalization and
X	 * dashes/spaces/underscores, so some of the below special cases would
X	 * be unnecessary.
X	 */
X	/* Alternate spellings (two-handed sword vs. two handed sword) */
X	if(!strcmp(bp, "two handed sword")) {
X		typ = TWO_HANDED_SWORD;
X		goto typfnd;
X	}
X	/* pick-axe vs. pick axe */
X	if(!strcmp(bp, "pick axe")) {
X		typ = PICK_AXE;
X		goto typfnd;
X	}
X	if(!strcmp(bp, "luck stone")){
X		typ = LUCKSTONE;
X		goto typfnd;
X	}
X	if(!strcmp(bp, "load stone")){
X		typ = LOADSTONE;
X		goto typfnd;
X	}
X	/* Alternate capitalizations (Amulet of Yendor, amulet of esp) */
X	if(!strcmp(bp, "amulet of Yendor")) {
X		typ = AMULET_OF_YENDOR;
X		goto typfnd;
X	}
X	if(!strcmp(bp, "amulet of ESP")) {
X		typ = AMULET_OF_ESP;
X		goto typfnd;
X	}
X	if(!strcmp(bp, "ring mail") ||	/* Note: ring mail is not a ring ! */
X	   !strcmp(bp, "leather armor") || /* Prevent falling to 'armor'. */
X	   !strcmp(bp, "studded leather armor")) {
X		let = ARMOR_SYM;
X		actualn = bp;
X		goto srch;
X	}
X	if(!strcmp(bp, "food ration")){
X		let = FOOD_SYM;
X		actualn = bp;
X		goto srch;
X	}
X	if((iskey = named_key(bp)) > 0) {
X		typ = KEY;
X		goto typfnd;
X	}
X	p = eos(bp);
X	if(!strcmp(p-10, "holy water")) {
X		typ = POT_WATER;
X		if (*(p-12) == 'u') iscursed = 1; /* unholy water */
X		else blessed = 1;
X		goto typfnd;
X	}
X#ifdef SHIRT
X	if (!strcmp(p-5, "shirt")) {
X		typ = HAWAIIAN_SHIRT;
X		goto typfnd;
X	}
X#endif
X	if (strlen(bp) == 1 && index(obj_symbols, *bp) && *bp != ILLOBJ_SYM) {
X		let = *bp;
X		goto any;
X	}
X	if(strncmp(bp, "enchant ", 8) &&
X	   strncmp(bp, "destroy ", 8) &&
X	   strncmp(bp, "food detection", 14))
X	/* allow wishes for "enchant weapon" and "food detection" */
X	for(i = 0; i < sizeof(wrpsym); i++) {
X		register int j = strlen(wrp[i]);
X		if(!strncmp(bp, wrp[i], j)){
X			let = wrpsym[i];
X			if(let != AMULET_SYM) {
X			    bp += j;
X			    if(!strncmp(bp, " of ", 4)) actualn = bp+4;
X			    /* else if(*bp) ?? */
X			} else
X			    actualn = bp;
X			goto srch;
X		}
X		if(!strcmp(p-j, wrp[i])){
X			let = wrpsym[i];
X			p -= j;
X			*p = 0;
X			if(p[-1] == ' ') p[-1] = 0;
X			dn = bp;
X			goto srch;
X		}
X	}
X	if(!strcmp(p-6, " stone")){
X		p[-6] = 0;
X		let = GEM_SYM;
X		dn = actualn = bp;
X		goto srch;
X	}
X	if(!strcmp(p-10, "gold piece") || !strcmp(p-7, "zorkmid") ||
X		   !strcmp(bp, "Zorkmid") ||
X		   !strcmp(bp, "gold") || !strcmp(bp, "money") || *bp == GOLD_SYM) {
X			if (cnt > 5000
X#ifdef WIZARD
X					&& !wizard
X#endif
X						) cnt=5000;
X		if (cnt < 1) cnt=1;
X		pline("%d gold piece%s.", cnt, plur((long)cnt));
X		u.ugold += cnt;
X		flags.botl=1;
X		return (&zeroobj);
X	}
X#ifdef WIZARD
X	/* Let wizards wish for traps --KAA */
X	if (wizard) {
X		int trap;
X		char *tname;
X
X		for (trap = NO_TRAP+1; trap < TRAPNUM; trap++) {
X			tname = index(traps[trap], ' ');
X			if (tname) {
X				if (!strncmp(tname+1, bp, strlen(tname+1))) {
X					(void) maketrap(u.ux, u.uy, trap);
X					pline("A%s.", traps[trap]);
X					if (Invisible) newsym(u.ux,u.uy);
X					return(&zeroobj);
X				}
X			}
X		}
X	}
X#endif
X	if(!strcmp(bp, "very heavy iron ball")) {
X		heavy = 1;
X		typ = HEAVY_IRON_BALL;
X		goto typfnd;
X	}
X	for (i = 0; i < SIZE(o_ranges); i++)
X	    if(!strcmp(bp, o_ranges[i].name)) {
X		typ = rnd_class(o_ranges[i].f_o_range, o_ranges[i].l_o_range);
X		goto typfnd;
X	    }
X
X	actualn = bp;
X	if (!dn) dn = actualn; /* ex. "black cap" */
Xsrch:
X	i = 1;
X	if(let) i = bases[letindex(let)];
X	while(i <= NROFOBJECTS && (!let || objects[i].oc_olet == let)){
X		register const char *zn;
X
X		if(actualn && (zn = objects[i].oc_name) && !strcmp(actualn, zn)) {
X			typ = i;
X			goto typfnd;
X		}
X		if(dn && (zn = objects[i].oc_descr) && !strcmp(dn, zn)) {
X			typ = i;
X			goto typfnd;
X		}
X		if(un && (zn = objects[i].oc_uname) && !strcmp(un, zn)) {
X			typ = i;
X			goto typfnd;
X		}
X		i++;
X	}
X	if (actualn) {
X		struct Jitem *j = Japanese_items;
X		while(j->item) {
X			if (actualn && !strcmp(actualn, j->name)) {
X				typ = j->item;
X				goto typfnd;
X			}
X			j++;
X		}
X	}
X#ifdef TUTTI_FRUTTI
X	for(f=ffruit; f; f = f->nextf) {
X		char *f1 = f->fname, *f2 = makeplural(f->fname);
X
X		if(!strncmp(fruitbuf, f1, strlen(f1)) ||
X					!strncmp(fruitbuf, f2, strlen(f2))) {
X			typ = SLIME_MOLD;
X			ftype = f->fid;
X			goto typfnd;
X		}
X	}
X#endif
X	if(!let) return((struct obj *)0);
Xany:
X	if(!let) let = wrpsym[rn2(sizeof(wrpsym))];
Xtypfnd:
X	if(typ) {
X		let = objects[typ].oc_olet;
X		otmp = mksobj(typ,FALSE);
X	} else {
X		otmp = mkobj(let,FALSE);
X		typ = otmp->otyp;
X	}
X
X	/* venom isn't really an object and can't be wished for; but allow
X	 * wizards to wish for it since it's faster than polymorphing and
X	 * spitting.
X	 */
X	if(otmp->olet==VENOM_SYM) {
X#ifdef WIZARD
X		if (!wizard) {
X#endif
X			free((genericptr_t) otmp);
X			return((struct obj *)0);
X#ifdef WIZARD
X		} else otmp->spe = 1;
X#endif
X	}
X	if(iskey) otmp->spe = (iskey-1);
X	if(isnamedbox && (otmp->otyp==LARGE_BOX || otmp->otyp==CHEST))
X		otmp->spe = (isnamedbox-1);
X
X	if(cnt > 0 && objects[typ].oc_merge && 
X#ifdef SPELLS
X	        let != SPBOOK_SYM &&
X#endif
X		(cnt < rnd(6) ||
X#ifdef WIZARD
X		wizard ||
X#endif
X		 (cnt <= 20 &&
X		  ((let == WEAPON_SYM && typ <= SHURIKEN) || (typ == ROCK)))))
X			otmp->quan = cnt;
X
X	if (spesgn == 0) spe = otmp->spe;
X#ifdef WIZARD
X	else if (wizard) /* no alteration to spe */ ;
X#endif
X	else if (let == ARMOR_SYM || let == WEAPON_SYM || typ == PICK_AXE ||
X			typ == UNICORN_HORN ||
X			(let==RING_SYM && objects[typ].oc_charged)) {
X		if(spe > rnd(5) && spe > otmp->spe) spe = 0;
X		if(spe > 2 && Luck < 0) spesgn = -1;
X	} else {
X		if (let == WAND_SYM) {
X			if (spe > 1 && spesgn == -1) spe = 1;
X		} else {
X			if (spe > 0 && spesgn == -1) spe = 0;
X		}
X		if (spe > otmp->spe) spe = otmp->spe;
X	}
X
X	if (spesgn == -1) spe = -spe;
X
X	/* set otmp->spe.  This may, or may not, use spe... */
X	switch (typ) {
X		case TIN: if (contents==EMPTY) {
X				otmp->corpsenm = -1;
X				otmp->spe = 0;
X			} else if (contents==SPINACH) {
X				otmp->corpsenm = -1;
X				otmp->spe = 1;
X			}
X			break;
X#ifdef TUTTI_FRUTTI
X		case SLIME_MOLD: otmp->spe = ftype;
X			/* Fall through */
X#endif
X		case SKELETON_KEY: case KEY: case CHEST: case LARGE_BOX:
X		case HEAVY_IRON_BALL: case IRON_CHAIN: case STATUE:
X			/* otmp->spe already done in mksobj() */
X				break;
X#ifdef MAIL
X		case SCR_MAIL: otmp->spe = 1; break;
X#endif
X		case AMULET_OF_YENDOR:
X#ifdef WIZARD
X			if (fake || !wizard)
X#endif
X				otmp->spe = -1;
X#ifdef WIZARD
X			else otmp->spe = 0;
X#endif
X			break;
X		case WAN_WISHING:
X#ifdef WIZARD
X			if (!wizard) {
X#endif
X				otmp->spe = (rn2(10) ? -1 : 0);
X				break;
X#ifdef WIZARD
X			}
X			/* fall through (twice), if wizard */
X#endif
X		case MAGIC_LAMP:
X#ifdef WIZARD
X			if (!wizard) {
X#endif
X				otmp->spe = 0;
X				break;
X#ifdef WIZARD
X			}
X			/* fall through, if wizard */
X#endif
X		default: otmp->spe = spe;
X	}
X
X	/* set otmp->corpsenm */
X	if (mntmp > -1) switch(typ) {
X		case TIN:
X			otmp->spe = 0; /* No spinach */
X		case CORPSE:
X			if (!(mons[mntmp].geno & G_NOCORPSE))
X				otmp->corpsenm = mntmp;
X			break;
X		case FIGURINE:
X			if (!(mons[mntmp].geno & G_UNIQ)
X			    && !is_human(&mons[mntmp]))
X				otmp->corpsenm = mntmp;
X			break;
X		case EGG: if (lays_eggs(&mons[mntmp]) || mntmp==PM_KILLER_BEE)
X				otmp->corpsenm = mntmp;
X			break;
X		case STATUE: otmp->corpsenm = mntmp;
X			break;
X		case DRAGON_SCALE_MAIL: /* Not actually possible unless they
X				   typed "red dragon dragon scale mail" */
X		case SCALE_MAIL:
X			if (mntmp >= PM_GRAY_DRAGON &&
X			    mntmp <= PM_YELLOW_DRAGON)
X				otmp->corpsenm = mntmp;
X			if (otmp->corpsenm >= 0)
X				otmp->otyp = DRAGON_SCALE_MAIL;
X			break;
X	}
X
X	/* set blessed/cursed */
X	if (iscursed) {
X		curse(otmp);
X	} else if (uncursed) {
X		otmp->blessed = 0;
X		otmp->cursed = (Luck < 0
X#ifdef WIZARD
X					 && !wizard
X#endif
X							);
X	} else if (blessed) {
X		otmp->blessed = (Luck >= 0
X#ifdef WIZARD
X					 || wizard
X#endif
X							);
X		otmp->cursed = (Luck < 0
X#ifdef WIZARD
X					 && !wizard
X#endif
X							);
X	} else if (spesgn < 0) {
X		curse(otmp);
X	}
X
X	/* prevent wishing abuse */
X	if (
X#ifdef WIZARD
X		!wizard &&
X#endif
X		(otmp->otyp == WAN_WISHING || otmp->otyp == MAGIC_LAMP))
X		otmp->recharged = 1;
X
X	/* set poisoned */
X	if (ispoisoned) {
X	    if (let == WEAPON_SYM && typ <= SHURIKEN)
X		otmp->opoisoned = (Luck >= 0);
X#ifdef WIZARD
X	    else if (Is_box(otmp))
X		otmp->otrapped = 1;
X	    else if (let == FOOD_SYM)
X		/* try to taint by making it as old as possible */
X	    	otmp->age = 1L;
X#endif
X	}
X
X	if (name) otmp = oname(otmp, name, 0);
X	otmp->owt = weight(otmp);
X	if (heavy) otmp->owt += 15;
X	if (halfeaten && otmp->olet == FOOD_SYM) {
X		if (otmp->otyp == CORPSE)
X			otmp->oeaten = mons[otmp->corpsenm].cnutrit;
X		else otmp->oeaten = objects[otmp->otyp].nutrition;
X		otmp->owt /= 2;
X		otmp->oeaten /= 2;
X		if (!otmp->owt) otmp->owt = 1;
X		if (!otmp->oeaten) otmp->oeaten = 1;
X	}
X	return(otmp);
X}
X
Xint
Xrnd_class(first,last)
Xint first,last;
X{
X	int i, x, sum=0;
X	for(i=first; i<=last; i++)
X		sum += objects[i].oc_prob;
X	x = rnd(sum);
X	for(i=first; i<=last; i++)
X		if (objects[i].oc_prob && (x -= objects[i].oc_prob) <= 0)
X			return i;
X	return 0;
X}
X
XSTATIC_OVL const char *
XJapanese_item_name(i)
Xint i;
X{
X	struct Jitem *j = Japanese_items;
X
X	while(j->item) {
X		if (i == j->item)
X			return j->name;
X		j++;
X	}
X	return (const char *)0;
X}
X#endif /* OVLB */
END_OF_FILE
if test 39021 -ne `wc -c <'src/objnam.c'`; then
    echo shar: \"'src/objnam.c'\" unpacked with wrong size!
fi
# end of 'src/objnam.c'
fi
echo shar: End of archive 13 \(of 56\).
cp /dev/null ark13isdone
MISSING=""
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
    if test ! -f ark${I}isdone ; then
	MISSING="${MISSING} ${I}"
    fi
done
if test "${MISSING}" = "" ; then
    echo You have unpacked all 56 archives.
    rm -f ark[1-9]isdone ark[1-9][0-9]isdone
else
    echo You still need to unpack the following archives:
    echo "        " ${MISSING}
fi
##  End of shell archive.
exit 0