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