billr@saab.CNA.TEK.COM (Bill Randle) (06/05/90)
Submitted-by: wilson@ernie.Berkeley.EDU (Jim Wilson) Posting-number: Volume 10, Issue 16 Archive-name: umoria3/Patch1b Patch-To: umoria3: Volume 9, Issue 55-86 #! /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 2 (of 3)." # Contents: mac/MakeFile.hqx mac/dumpres/MakeFile.hqx # mac/scrnmgr/ScrnMgr.doc source/player.c # Wrapped by wilson@atlas on Wed May 30 14:20:00 1990 PATH=/bin:/usr/bin:/usr/ucb ; export PATH if test -f 'mac/MakeFile.hqx' -a "${1}" != "-c" ; then mv -f mac/MakeFile.hqx mac/MakeFile.hqx.old fi echo shar: Extracting \"'mac/MakeFile.hqx'\" \(8517 characters\) sed "s/^X//" >'mac/MakeFile.hqx' <<'END_OF_FILE' X(This file must be converted with BinHex 4.0) X:#%eKDf9'D@aP!&4&@&408&-J!3!!!"E0!!!"IRGE3dp`G'P[ER-J23N*,@)b)#e Xc)(Y%C@CKG@adI5!YC#"038-J,@eLCb"[EL!YFhPY)'pZ$3e5Fh*M6h"dD@pZFb! Xp#5eL-L!YE5!YC#"58e*$)#eN)%e"3`d0,Q-ZE`N*#F3*,Q-0#AY$I5"l3dp`G'P X[ER0p)(Y%CA"%DA*pHd4PCQ&eE(4p,Q-J,@mJHe4KFQG%DA*pHd4PCQ&eE(4p,Q- XZE`d*$5jbFh*M,Qm*#3R%#5jM$3Pl3hdJHe*cFQ02F(4TEfjcI5"l4'9`4'PbIAY X%C@CKG@adI5jM)#e[)(Y8BA*R4'PbIAY%C@CKG@adI5jbFh*M,Qm0#3e2BQTPBh4 Xc)$d*#@eKBbjM,QmJYJd*#3N*E@&MBfpZCLjM,QmJYJd*#3N*E@&MD'9XF#jM,Qm XJYJd*#3N*E@&MFf0[FQ8ZBbj[),B0#3N*#@eKBh*cFQ-ZBbj[),B0#3N*#@eKD@i XZBbj[),B0#3N*#@0bC@&dC5jM,QmJYJd*#3N*Bh*PBA4eFQ8ZBbj[),B0#3N*#@4 XPBA4S,Q-ZEb#f$3N*#3PNCA0M,Q-ZEb#f$3N*#3PNG@jRC@pZ,Q-ZEb#f$3N*#3P XPBA3ZBbj[),B0#3N*#@CTE'9c,Q-ZEb#f$3N*#3PRC@jPFQ&dC5jM,QmJYJd*#3N X*D'9XF#jM,QmJYJd*#3N*E@&MD@mZBbj[),B0#3N*#@eKCfPM,Q-ZEb#f$3N*#3P XYDA0M-5jM,QmJYJd*#3N*E@PcBc)ZBbj[),B0#3N*#@e[ER0dCA*c,Q-ZEb#f$3N X*#3PYEh*TB6%ZBbj[),B0#3N*#@e[FQPK-LjM,QmJYJd*#3N*F'aKH@9b,Q-ZEb# Xf$3N*#3P`Eh4TEfjc,Q-ZEb#f$3N*#3P`FQ&jCA)ZBbj[),B0#3N*#A*PBf&XE#j XM,QmJYJd*#3N*FQjN,Q-ZEb#f$3N*#3PcBACP,Q-ZEb#f$3N*#3PcBh*[E'ac,Q- XZEb#f$3N*#3PcCA4c,Q-ZEb#f$3N*#3PcD@GZB@ac,Q-ZEb#f$3N*#3PcF'9XE(- XZBbj[),B0#3N*#A0dB@CQFbjM,QmJYJd*#3N*Fh4[FQ8a,Q-ZEb#f$3N*#3PcG'p XbC6)ZBbj[),B0#3N*#A4KBQaPFbjM,QmJYJd*#3N*G(*PBA0eFQ8ZBbj[),B0#3N X*#A9ZC'9Q,Q-ZEb#f$3N*#3PfBA*TB@*XC5jM,QmJYJd*#3N*Gf&ZC(-ZBbj[),B X0#3N*#AGTHQ&bC#jM,Qm0#3N*#3e5Fh*MFb!p#3N*E@&MC'&dB5jbFh*M,QmJYJd X*#3N*E@&MFR0bBbjbFh*M,QmJYJd*#3N*E@pZFh4PFR-ZFR0bBbj[),B0#3N*#A" XXBAPPFLjbFh*M,QmJYJd*#3N*G'&LE'9c,R*cFQ-ZEb#f$3N*#3PdFQ9KFh9bC5j XbFh*M,QmJYJd*#3N*GQ&bD@&LE'8ZFR0bBbj[$3N*#3N09'9iG(-J23N*#@jPGh- XJYJd*#3N*Eh*TCf0YC(-ZD'a`),B0#3N*#@phDATME@4c,QKXF##f$3N*#3PbEfG XXBfeNFbjSE(!JYJd*#3N*FRGTHQ0YC(-ZD'a`),B0#3N*#ACPFR0TEfiZD'a`),B X0#3N*#AGPE'0[E@8ZD'a`$3N*#3N0)b"+9cSJ3e*eER4TE@8ZEb"KEQ3J3dPZG'9 XbCQ&MC5j[)'4PE'9dC@3JBA-J55"hBA-JG'pXC#"dD'&d)(4SCANJBA*P)'pLFfp XXCA4P$8e[FQPK#3N*a-3*He*cFQ0cI3d*6'PZDb!YE@&`)#eh)#ed)#G08&08*b! XYBb!R69"6)#Hf$3N*,A0c)$)`-$!`-#!YFh*d),B0#3Pl8R0bBh0p),B0#3NLHd0 X-D@*bBA*TCA0p)N4eEA"5CA-ZEb#f$3N*)RY-D@*bBA*TCA0p)R0dG@*c,QmJYJd X*#5*l6'PLFQ&bD@9cI5*5G@jdD@eP,QmJYJd*#5*l6'PLFQ&bD@9cI5**ER4PFQC XKBf8ZEb#f$3N*)RY$6'PLFQ&bD@9cI5*6G'4$6'PL,QmJYJd*#5*l3daTBR*KFQP XPFhdL3e0"6N9-D@)ZEb#f$3N*)RY$6'PLFQ&bD@9cI5*0BA4S,QmJYJd*#5*l6'P XLFQ&bD@9cI5*8EfpX6'PLFbj[),B0#3Nq)'eKBf4KG'%ZE@&`$3P-D@jV,NpeG#" X0Eh*TB3d*4'9XCA4P)%aTEQXZ6h9d$3e0Eh*TB5!*#3R%a#!*HdpLDQ9MG(0p$3P X-D@jV)#eYBA!J,AFJ,A3J*d&38%`R)#eM)#G08NP"*lB0#3NYH#"YEh*TB5jiFQ9 XQ),B0#3NYFhPY)'pZ),B0#3NYEb"0Eh*TB5#f$3N*,A*K)$de-L#f$3N*,A0R)%e XKD@ipE@&M,'eKD@iXFQjN,(0TCfjKE(-XG@jNC@BXE@&MFR0bBb#f$3N*,A*K)%e XKD@ip06)JYJd*#5ecCb"*6ceYB@0TEb#f$3N*,A*K)%P2268b),B0#3NYFfFJ3A" X`6@9ZG6eYB@0SC@a`,'eKBf0[EQBXE@&MFf0[FQ8JYJd*#5ebB5""F("0C@je26- Xb),B0#3NYFfFJ3h*PBA4P2@0bC@&dC5#f$3N*,A*K)%0bC@&dC6dc-L#f$3N*,A0 XR)%0bC@&dGA*P2@0bC@&dGA*P),B0#3NYFQ%J3h*PBA4eFQ8p-c)JYJd*#5ecCb" X%C@&dD$eNC@&dD##f$3N*,A*K)%4PBA4S26-b),B0#3NYFfFJ4(9ZCf9[EMeNG@j XRC@pZ),B0#3NYFQ%J4(9ZCf9[EMde-L#f$3N*,A0R)%9KG$ePBA3JYJd*#5ebB5" X&BA3p-c)JYJd*#5ecCb"'D@aPFceQD@aPFb#f$3N*,A*K)%CTE'9c26-b),B0#3N XYFfFJ4f9ZCA*KG'8pCf9ZCA*KG'8JYJd*#5ebB5"(C@jPFQ&dC6dc-L#f$3N*,A0 XR)%KPE(!pD'9XF##f$3N*,A*K)%KPE(!p-c)JYJd*#5ecCb"0B@GTBceYB@GTBb# Xf$3N*,A*K)%eKCfPM26-b),B0#3NYFfFJ6@PcBc%pE@PcBc%XC'9cBbacCA4c),B X0#3NYFQ%J6@PcBc%p06)JYJd*#5ecCb"0DA0M-MeYDA0M-L#f$3N*,A*K)%eTFf- Xb268b),B0#3NYFfFJ6@pbD@%a2@e[FQPK-5#f$3N*,A*K)%e[FQPK-6de-L#f$3N X*,A0R)%e[FQPK-MeYEh*TB6)JYJd*#5ebB5"0Eh*TB6)p06)JYJd*#5ecCb"3FQ& XjCA)pF(*KH@9b),B0#3NYFQ%J8(*KH@9b26-b),B0#3NYFfFJ8'pdD@pZFce`Eh4 XTEfjc),B0#3NYFQ%J8'pdD@pZFcdc-L#f$3N*,A0R)&*PBf&XE$ebC@0KE'`JYJd X*#5ebB5"5C@0KE'`p-c)JYJd*#5ecCb"6BACP2A0KGQ8JYJd*#5ebB5"6BACP26- Xb),B0#3NYFfFJ8f0bEfaXFcecBh*[E'ac),B0#3NYFQ%J8f0bEfaXFcdc-L#f$3N X*,A0R)&0`C@aXFcecF'9XE(-JYJd*#5ebB5"6F'9XE(-p06)JYJd*#5ecCb"6G'& XQCR-pFh4KCQCc),B0#3NYFQ%J8h4KCQCc26-b),B0#3NYFfFJ8h4[FQ8pFh4[FQ8 Xa,(0dEh*P-L#f$3N*,A*K)&0dEh*P26-b),B0#3NYFfFJ9f&ZC(-pGf&ZC(-JYJd X*#5ebB5"AB@jNFcdc-L#f$3N*,A0R)>HQ&bC$ehDATKFQ3JYJd*#5ebB5"ADAT XKFQ3p-c)JYJd*#AY2BQTPBh4cI5#f$3N*)RY$6'PLFQ&bD@9cI5*6Bh*Z6@Gb,Qm XJYJd*#5*l3daTBR*KFQPPFhdL4(9YF&*PFbj[),B0#3NLHd0-D@*bBA*TCA0p)N0 X5G@jdD@eP,QmJYJd*#5*l6'PLFQ&bD@9cI5**ER4PFQCKBf8ZEb#f$3N*)RY$6'P XLFQ&bD@9cI5*6G'4$6'PL,QmJYJd*#5*l3daTBR*KFQPPFhdL3e0"6N9-D@)ZEb# Xf$3N*)RY$6'PLFQ&bD@9cI5*0BA4S,QmJYJd*#5*l3daTBR*KFQPPFhdL3dPZG'9 XbCQ&MC5j[),B0#3Nq)'e[FQPK,QeKF!d*8f9d4QPXC5!YB5"#)%e[FQPK$3e0Eh* XTB3N*#F6%#@e[FQPK,R)0#9*PHL"YEh*TB5jb)#eKF("PEQ3J,@mJ6@pbD@%J,A- XJHe**EQ0XG@4PFhd0#3e0Eh*TB3N*#F6%#AY8CAKdFhd0#8C[FL"'D@aP6Q&YC5" XTEL"l9'9iG(0p$3N*5@BJ)RY'D@aP6Q&YCAdL)$eq)#r&1LM&+DJa,`d*#3P&BfK X[)#)MHkJaI5)0#3P&E(0P$3N*#89MD'mJ)L0l4QPXC8jKE@9p)Jd*#89ZC!d*#80 XKG'9ZBA4P)#*l4QPXC8jKE@9p)Jd*4@jN)(`J4@jdB@)J,@3J1#!YG#!`)$iJ6@p XbD@%0#90PG%CTE'8J,@-J*de558%R)#ed)#G"8&"-*b"0Eh*TB3d*$5-J4QPXCA- XJGbp[)#)ZD#)JC'9`C@jNC@jMD@9c)#dY$5-*E@&MBfpZCLjM$5-*E@&MD'9XF#j XM$3eYB@-ZBbj[#3N*#F3*BfpZFh4KER3ZD#"MEfjQD@FZD#"dHA"PFbjS)'9iG'9 XbER-ZD#"YB@0bFh*M,QJ0E@&MFf0[FQ8ZBbj[#3R%#@0[ER0dB@jd,QJJBfpZCQP XR,QJJG(P`CA-ZD#"PH(4PFQjc,QJ0E@&MFR0bBbjM,Qm*#3R%#@0[ER0dB@jd,QJ XJBfpZCQPR,QJJG(P`CA-ZD#"PH(4PFQjc,QJJE@&MFR0bBbjS$3eYB@PZ,Q-ZE`N X*#F3*BfpZFh4KER3ZD#"MEfjQD@FZD#"dHA"PFbjS)'9iG'9bER-ZD!eMFQ9KG'8 XZBbj[#3N*a!PMEfjcG'&ZG#jS)'0[EQCTCbjS)(4jF'9c,QJJCAKdCA*ZFbjS$@0 XbC@&dGA*P,Q-ZE`N*a!PMEfjcG'&ZG#jS)'0[EQCTCbjS)(4jF'9c,QJJCAKdCA* XZFbjS$@4PBA4S,Q-ZE`N*#F3*BfpZFh4KER3ZD#"MEfjQD@FZD#"dHA"PFbjS)'9 XiG'9bER-ZD!eNCA0M,Q-ZE`N*#F3*BfpZFh4KER3ZD#"MEfjQD@FZD#"dHA"PFbj XS)'9iG'9bER-ZD!eNG@jRC@pZ,Q-ZE`N*#F3*BfpZFh4KER3ZD#"MEfjQD@FZD#" XdHA"PFbjS)'9iG'9bER-ZD!ePBA3ZBbj[#3N*#F3*BfpZFh4KER3ZD#"MEfjQD@F XZD#"dHA"PFbjS)'9iG'9bER-ZD!eQD@aPFbjM,Qm*#3R%#@0[ER0dB@jd,QJJBfp XZCQPR,QJJG(P`CA-ZD#"PH(4PFQjc,QJ0Cf9ZCA*KG'8ZBbj[#3R%#@0[ER0dB@j Xd,QJJBfpZCQPR,QJJG(P`CA-ZD#"PH(4PFQjc,QJ0D'9XF#jM,Qm*#3R%#@0[ER0 XdB@jd,QJJBfpZCQPR,QJJG(P`CA-ZD#"PH(4PFQjc,QJ0E@&MD@mZBbj[#3N*a!P XMEfjcG'&ZG#jS)'0[EQCTCbjS)(4jF'9c,QJJCAKdCA*ZFbjS$@eKCfPM,Q-ZE`N X*#F3*BfpZFh4KER3ZD#"MEfjQD@FZD#"dHA"PFbjS)'9iG'9bER-ZD!eYDA0M-5j XM,Qm*#3R%#@0[ER0dB@jd,QJJBfpZCQPR,QJJG(P`CA-ZD#"PH(4PFQjc,QJ0E@P XcBc)ZBbj[#3N*a!PMEfjcG'&ZG#jS)'0[EQCTCbjS)(4jF'9c,QJJCAKdCA*ZFbj XS$@e[ER0dCA*c,Q-ZE`N*a!PMEfjcG'&ZG#jS)'0[EQCTCbjS)(4jF'9c,QJ0E@p XbD@%a,Q-ZE`N*#F3*BfpZFh4KER3ZD#"MEfjQD@FZD#"dHA"PFbjS)'9iG'9bER- XZD!eYEh*TB6)ZBbj[#3N*a!PMEfjcG'&ZG#jS)'0[EQCTCbjS)(4jF'9c,QJJCAK XdCA*ZFbjS$A"XBAPPFLjM,Qm*#3R%#@0[ER0dB@jd,QJJBfpZCQPR,QJJG(P`CA- XZD!e`Eh4TEfjc,Q-ZE`N*#F3*BfpZFh4KER3ZD#"MEfjQD@FZD#"dHA"PFbjS)'9 XiG'9bER-ZD!e`FQ&jCA)ZBbj[#3N*a!PMEfjcG'&ZG#jS)'0[EQCTCbjS)(4jF'9 Xc,QJJCAKdCA*ZFbjS$A*PBf&XE#jM,Qm*#3R%#@0[ER0dB@jd,QJJBfpZCQPR,QJ XJG(P`CA-ZD#"PH(4PFQjc,QJ0FQjN,Q-ZE`N*#3R%#@0[ER0dB@jd,QJJ)#!J)#! XJ)#!JG(P`CA-ZD!ecBACP,Q-ZE`N*#F3*BfpZFh4KER3ZD#"MEfjQD@FZD#"dHA" XPFbjS)'9iG'9bER-ZD!ecBh*[E'ac,Q-ZE`N*#F3*BfpZFh4KER3ZD#"MEfjQD@F XZD#"dHA"PFbjS)'9iG'9bER-ZD!ecCA4c,Q-ZE`N*#F3*BfpZFh4KER3ZD#"MEfj XQD@FZD!ecD@GZB@ac,Q-ZE`N*#F3*BfpZFh4KER3ZD#"MEfjQD@FZD#"dHA"PFbj XS)'9iG'9bER-ZD!ecF'9XE(-ZBbj[#3N*a!PMEfjcG'&ZG#jS)'0[EQCTCbjS)(4 XjF'9c,QJJCAKdCA*ZFbjS$A0dB@CQFbjM,Qm*#3R%#@0[ER0dB@jd,QJJBfpZCQP XR,QJJG(P`CA-ZD#"PH(4PFQjc,QJ0Fh4[FQ8a,Q-ZE`N*#F3*BfpZFh4KER3ZD#" XMEfjQD@FZD#"dHA"PFbjS)'9iG'9bER-ZD!ecG'pbC6)ZBbj[#3N*a!PMEfjcG'& XZG#jS)'0[EQCTCbjS)(4jF'9c,QJJCAKdCA*ZFbjS$A4KBQaPFbjM,Qm*#3R%#@0 X[ER0dB@jd,QJJBfpZCQPR,QJJG(P`CA-ZD!edFQ9KFh9bC5jM,Qm*#F3*BfpZFh4 XKER3ZD#"MEfjQD@FZD#"dHA"PFbjS$A9ZC'9Q,Q-ZE`N*#F3*BfpZFh4KER3ZD#" XMEfjQD@FZD#"dHA"PFbjS)'9iG'9bER-ZD!efBA*TB@*XC5jM,Qm*#F3*BfpZFh4 XKER3ZD#"MEfjQD@FZD#"dHA"PFbjS$AGKEQ4c,Q-ZE`N*#F3*BfpZFh4KER3ZD#" XMEfjQD@FZD#"dHA"PFbjS)'9iG'9bER-ZD!ehDATKFQ3ZBbj[#3N*a!PMEfjcG'& XZG#jS)'0[EQCTCbjS)(4jF'9c,QJJCAKdCA*ZFbjS$3eYB@0NBA4K,R*cFQ-ZE`N X*a!NJ)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)#!J)'eKBh*cFQ- XZD!eYB@0bFh*M,R*cFQ-ZE`N*a!PMEfjcG'&ZG#jS)'0[EQCTCbjS)(4jF'9c,QJ XJCAKdCA*ZFbjS)'eKBh*cFQ-ZD!eYEfjcG'9bFbjbFh*M,Qm*#F3*BfpZFh4KER3 XZD#"MEfjQD@FZD#"dHA"PFbjS$A"XBAPPFLjbFh*M,Qm*#F3*BfpZFh4KER3ZD#" XMEfjQD@FZD#"dHA"PFbjS$A4KBQaPFbjbFh*M,Qm*#F3*BfpZFh4KER3ZD#"MEfj XQD@FZD#"dHA"PFbjS$A4bC@&cGA*P,R*cFQ-ZE`N*a!PMEfjcG'&ZG#jS)'0[EQC XTCbjS)(4jF'9c,QJ0GQ&bD@&LE'8ZFR0bBbj[#3R%#@0[ER0dB@jd,QJJBfpZCQP XR,QJJG(P`CA-ZD!fU&J!!!3!!!!&-!!!!6!!!!$)!!!!F!%!!3!#D!F3!!3%!!!! X!!!!!!))(3fpZCQPbE3K0B@YP4QPXC5d#!!!!9%9B9%e38b!"!!!!!%!!!!!!!!" X849K869"6)!%!!!!!3!!!!!!!!!!!!!!!!!!!!!!!!++&Jjm!!"E0!!!"IJ#$!!! X!!*3!"`!!!!!!M!%!!*i"4J3$6Q9h!!!!!!!!TJ%!!,J"4J3'3f&ZBf9X!!!!!!# X0!!i!R3#kL!Y1CAFJ9fPZC'ph1J!!!!!!!"S!h`!Z!9Z!!!!!!!!!0!%!!%B"4J3 X&4@TPBh3!!!!!!!"1!3!!B!&'"!9%FQPfC3!!!!!!!!")!!P0EfjKBfm!!!!!!!! X!!!!!!!!!!!!!!!!!!!!!!!!!!!!'!!3!2J!2!G-#F`!q!!m"d`*cSS@5q3!!&Xd X!!"E0!!!6e`%!!!!"!!!!!8`!!!"-!!!!-J!Z#8!)&J!!!"`!-J!!69"68J!!!!S X$lIrr!!!!!!![$)42eJ: END_OF_FILE if test 8517 -ne `wc -c <'mac/MakeFile.hqx'`; then echo shar: \"'mac/MakeFile.hqx'\" unpacked with wrong size! fi # end of 'mac/MakeFile.hqx' if test -f 'mac/dumpres/MakeFile.hqx' -a "${1}" != "-c" ; then mv -f mac/dumpres/MakeFile.hqx mac/dumpres/MakeFile.hqx.old fi echo shar: Extracting \"'mac/dumpres/MakeFile.hqx'\" \(1515 characters\) sed "s/^X//" >'mac/dumpres/MakeFile.hqx' <<'END_OF_FILE' X(This file must be converted with BinHex 4.0) X:#%eKDf9'D@aP!&4&@&408&-J!3!!!!+E!!!"IV2*3dp`G'P[ER-J25!YE@*R)'p XZ$8a2F(4TEfjc)$d0$84eEA"5CA-ZEb$%)%4eEA"5CA-ZB`d*3b"l3dp`G'P[ER0 Xp)#e[)%4eEA"5CA-ZEb"%G@e`8Q9c,Q-0$84eEA"5CA08CA0d,Q-ZEb$%)%4eEA" X5CA08CA0d,Q-0#8-JHd02F(4TEfjcI5"%G@e`8Q9c9'9cG#jM$3N06f*UC@0dFb! Xp)%4eEA"5CA08CA0d,Q-ZEb"%G@e`8Q9c,Qm0$5-J5PFk)%05G@jdD@eP,QmJB@j XN)%0*ER4PFQCKBf8ZEb"bC@e[GQ9N)(0TEQ0P)%NJGf&c)(4[E'3JG'KKG#"dD'9 Xj)'&bC5"[BR0[E'9dC3e%G@e`8Q9c9'9cG#$%a#"l6f*UC@0dFhd0#8aTEQXJHda X2F(4TEfjcI5!YGb!YBb!R69"6)#FJ,A3J69"69##f$3N*HdpLDQ9MG(0p),B0#3N XLHdaTBR*KFQPPFhdLFh4eBR-ZEb#f$3N*)RY-D@*bBA*TCA0p)P*eER4TE@8ZEb# Xf$3N*)RY-D@*bBA*TCA0p)NPZG'9bCQ&MC5j[),B0#3NLHd0-D@*bBA*TCA0p)P0 XdC%0-D@)ZEb#f$3N*)RY$6'PLFQ&bD@9cI5*$8d&148aTBLj[),B0#3NLHd0-D@* XbBA*TCA0p)NeKG'JZEb#f$3N*)RY-D@*bBA*TCA0p)P4[Efa-D@*c,QmJYJd*#5e X[)%4eEA"5CA08CA0d$3e*ER0dB@aX)-3J4(9YF&*PFbjS)%4eEA"5CA-ZE`d*4(9 X`E'PMBA4P)#ej)%4eEA"5CA-ZD#!LHd0*EQ0XG@4PFhdL$3P%GA"XD@0KG'8J,AN XJ4(9YF&*PFbj[)#*l3daTBR*KFQPPFhdL$6Yi!!!"!!!!!8`!!!"-!!!!-N4eEA" X5CA08CA0d,QeKDf80)b!J)&4KFQGPG$SJ)#!J$8eKDf9'D@aP,Q4eEA!#!!!!9%9 XB9%e38b!!!!!!!!!!!&4&@&408&-J!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!SS@ X$J3!!!TX!!!&qBA*MD#!e,#!a16Jj)$%b1M)a1M3d$3e%G@e`8Q9c9'9cG#jM,Qm XJa#"%G@e`8Q9c9'9cG#jYB@YP)%4eEA"5CA08CA0d,Q-0#8-J4(9YF&*PFe4PFh3 XZB`e%G@e`8Q9c,Q-ZEb$%)%4eEA"5CA08CA0d,QeKDf8J4(9YF&*PFbjM$3!!!%J X!#8e[EQ&ME`##!!-!#3!+Irm!$J!*!!Trr`#(!)%!JRrr!!B!"!!q!!m"d`*c!$i X!$`(6!R1LKBLX!!!#!J!!!J)!!!!!!3!!!!%!!!!"6!!!!%`!!!!b!#eT3!Kd!!! X!(!!b!!"08&05!!!!#J2Yrrm!!!!!!#jV*$e,: END_OF_FILE if test 1515 -ne `wc -c <'mac/dumpres/MakeFile.hqx'`; then echo shar: \"'mac/dumpres/MakeFile.hqx'\" unpacked with wrong size! fi # end of 'mac/dumpres/MakeFile.hqx' if test -f 'mac/scrnmgr/ScrnMgr.doc' -a "${1}" != "-c" ; then mv -f mac/scrnmgr/ScrnMgr.doc mac/scrnmgr/ScrnMgr.doc.old fi echo shar: Extracting \"'mac/scrnmgr/ScrnMgr.doc'\" \(20464 characters\) sed "s/^X//" >'mac/scrnmgr/ScrnMgr.doc' <<'END_OF_FILE' XCopyright (C) Curtis McCauley, 1989. All rights reserved. X XYou may copy this subroutine package freely, modify it as you desire, Xand distribute it at will, as long as the copyright notice in the Xsource material is not disturbed, excepting that no one may use this Xpackage or any part of it for commercial purposes of any kind without Xthe express written consent of its author. X XThis document describes a package of subroutines I have decided to Xcall the Screen Manager. X XEnclosed files: X XScrnMgr.doc What you are reading X XScrnMgr.c The source for the subroutine package XScrnMgr.r Resources used by the subroutines XScrnMgr.h Include file for applications X XScrnMgr.rsrc The Rez output from ScrnMgr.r (if you do not have Rez) X XScrnTest.c A test application XScrnTest.r Resources used by the test application X XMakeFile What the name implies X XThe package is pretty heavily built around MPW. It is specifically Xtailored for version 3.0, but should work with 2.0.2. The only thing XI think you would have to modify for the older version is the SIZE Xresource. Porting the package to other environments is not something XI would recommend. X XThe make file recognizes two primary targets: ScrnTest - which will Xbuild the test application along with the subroutine package object Xfile, and Install - which will copy the object files to appropriate Xdirectories. If you have a non-standard MPW directory structure, you Xwill want to modify the rules for Install. X XI initially built the subroutine package around a model of the IBM PC Xscreen BIOS calls. The idea was to take a public domain curses Xpackage for the PC and replace all the BIOS calls with calls to my Xpackage. Since my ultimate goal was to port the UNIX moria program Xwhich relied on curses, and the only copy of curses I had was the PC Xversion, this strategy initially seemed to make sense. Moria, as it Xturns out, only calls a few of the curses routines, so I never had to Xactually port the whole PC curses package. It was a lot easier to Xjust replace the curses calls in moria with direct calls to my Xsubroutine package. By reducing the number of software layers I Xachieved better performance, anyway. X XStill, the internal structure of the package resembles the PC BIOS. I Xkeep two large byte arrays to hold the entire screen, one with the Xcharacters, the other with the attributes. The attributes are Xforeground and background color (the eight original quickdraw colors), Xunderlined, and italicized. The bulk of the package, at least in Xnumber of functions, is taken up with routines to manipulate these Xbuffers, either to put data in or take data out. Whenever the Xcontents of the buffers are changed, the window is not immediately Xupdated to reflect the change. Instead, I "invalidate" the portion of Xthe window changed. This is done by using InvalRect(), which causes Xthe area to be accumulated in the update region of the window, or by Xadding the area to an internal representation of the dirty area of the Xscreen. This internal representation is less precise than the region Xwhich is kept by quickdraw calls to InvalRect(). It consists of the Xbeginning and ending dirty area on each screen line. The latter Xmethod is faster, but the screen changes will only be noticed when a Xcall to update the screen is explicitly made, as opposed to the idle Xroutine (see below) catching an update event. There are two sets of Xroutines, then, to change the screen buffers. The ones prefixed with Xa 'D' (for delayed update) use the later method. X XA program which uses this package, at a minimum, has to call XInitScreenMgr() at the beginning to open the window, call XIdleScreenMgr() frequently in the middle to handle all the standard Xmac events (mouse and keyboard events, especially, but also the XMultiFinder stuff as well), and call CloseScreenMgr() at the end. The Xbest time to call the idle routine is whenever your program is waiting Xfor a keystroke. Another good time is at regular intervals in a heavy Xcompute loop. If you do this, you can actually get your program to Xrun in the background, but all the idle calls will, of course, slow Xthings down some. In heavy compute passages, then, you might instead Xwant to bracket the code with calls to BeginScreenWait() and XEndScreenWait() to change the mouse cursor to a spinning watch. X XA description of each routine in the package follows -- X Xint InitScreenMgr(int h, int v, char *title, X char *resFile, OSType rfCreator, OSType rfType, X void (*fileMenuProc)(int item), X void (*appMenuProc)(int item), X int multiColorFlag); X XThis routine initializes the package, allocates buffers, and puts the Xwindow on the monitor. H and v are the dimensions of the screen in Xcharacters. Title is the window title. ResFile, rfCreator, and XrfType describe the file to contain the configuration information. XThis file will be maintained in the system folder. It remembers the Xposition and size of the window, the font size selected, and, if the Xscreen is only two colors, the user's choices for foreground and Xbackground color. FileMenuProc points to a routine to be called when Xa selection from the file menu is made. A click in the window's close Xbox is considered like a selection from the menu, resulting in a call Xto fileMenuProc with the item number equal to the constant XcloseBoxItem. AppMenuProc points to a routine to be called when a Xselection from the application menu is made. Both can be NULL, in Xwhich case the subroutine package will handle them as best it can. XMultiColorFlag is non-zero when more than two colors will be displayed Xon the screen. X Xvoid IdleScreenMgr(void); X XThis routine handles the macintosh event queue. It must be called Xfrequently, or the user will not be able to select from menus, switch Xto another program or desk accessory, etc. It also blinks the screen Xcursor. X Xvoid ShowScreen(int visible); X XShows or hides the screen window, depending upon the visible flag. X Xvoid CloseScreenMgr(void); X XCloses the window, deallocates buffers. X Xvoid SetScreenQuitProc(void (*quitProc)(void), int willReturnFlag); X XTells the package what routine to call when quit is chosen. If the Xroutine pointed to by quitProc will always return (as opposed to doing Xsomething like ExitToShell()), willReturnFlag should be non-zero. X Xvoid SetScreenAboutProc(void (*aboutProc)(void)); X XAllows the standard about box to be overridden. AboutProc points to a Xroutine which should be called when the about item is chosen from the Xapple menu. X XThe following routines all manipulate the screen buffers. Calls Xbeginning with 'Set' do not move the screen cursor and need to be told Xwhere to begin the operation. Calls beginning with 'Write' move the Xcursor and begin the operation at the current cursor location. All of Xthese routines can be prefixed with a 'D' to make changes to the Xinternal dirty area instead of calling InvalRect(). The internal Xdirty area is updated only when a call to UpdateScreen() is made or Xsome external update event is generated and caught by the idle Xroutine. X XThe screen cells are indicated by column (h) and row (v) numbers which Xincrease from left to right and top to bottom. Hence the upper left Xof the screen is (0, 0) and the bottom right is (h, v) as set by the Xcall to InitScreenMgr(). X Xvoid SetScreenChar(char c, int h, int v); X Xvoid SetScreenCharAttr(char c, char a, int h, int v); X Xvoid WriteScreenChar(char c); X Xvoid WriteScreenCharAttr(char c, char a); X XSets the character at (h, v) to c and the attribute to a. X Xvoid SetScreenBuffer(char *buffer, int rowBytes, X Rect *area, int h, int v); X Xvoid SetScreenBufferAttr(char *buffer, char a, X int rowBytes, Rect *area, int h, int v); X Xvoid WriteScreenBuffer(char *buffer, int rowBytes, Rect *area); X Xvoid WriteScreenBufferAttr(char *buffer, char a, X int rowBytes, Rect *area); X XSets the block of characters at (h, v) to the contents of buffer and Xall the attributes to a. RowBytes indicates the number of bytes in a Xrow in buffer. Area indicates the block of characters to copy, Xassuming that the first byte in buffer is at (0, 0). Note: This means Xthat the area rectangle is in buffer coordinates, not screen Xcoordinates. X Xvoid SetScreenString(char *str, int h, int v); X Xvoid SetScreenStringAttr(char *str, char a, int h, int v); X Xvoid WriteScreenString(char *str); X Xvoid WriteScreenStringAttr(char *str, char a); X XSets the characters at (h, v) and following to the contents of string Xand all the attributes to a. X Xvoid SetScreenImage(char *c, char *a, int rowBytes, X Rect *area, int h, int v); X Xvoid WriteScreenImage(char *c, char *a, X int rowBytes, Rect *area); X XSets the block of characters at (h, v) to the contents of c and the Xattributes to the contents of a. RowBytes indicates the number of Xbytes in a row in the c and a buffers. Area indicates the block of Xbytes to copy, assuming that the first byte in the buffers is at (0, X0). Note: This means that the area rectangle is in buffer Xcoordinates, not screen coordinates. X Xvoid FillScreen(char c, char a, Rect *area); X XFills the part of the screen indicated by area with the character c Xand the attribute a. Area is in screen coordinates. X Xvoid EraseScreen(Rect *area); X XFills the part of the screen indicated by area with the blank Xcharacter (0x20) and the normal attribute (attrNormal). Area is in Xscreen coordinates. X Xvoid ScrollScreen(int dh, int dv, Rect *area, char a); X XScrolls the part of the screen indicated by area the distance Xindicated by dh and dv (which may be negative). The leftover space is Xfilled with the blank character (0x20) and the normal attribute X(attrNormal). Area is in screen coordinates. X Xvoid MoveScreenCursor(int dh, int dv); X XMoves the screen cursor by the number of character cells indicated by Xdh and dv (which may be negative). X Xvoid SetScreenCursor(int h, int v); X XPositions the screen cursor at the character cell indicated by h and v. X Xvoid DefineScreenCursor(int color, int lines, int blinkRate); X XDefines the screen cursor. Color indicates what you would expect, Xlines indicates the height of the cursor in pixels (up to the height Xof the character cell, so lines = 32767 will probably give you a block Xcursor), and blinkRate indicates the number of clock ticks between Xcursor blinks or zero for a non-blinking cursor (a really friendly Xprogram will use GetCaretTime() to set this). The default cursor uses Xblack, 2 lines, and no blinks. It is initially hidden. X Xvoid HideScreenCursor(void); X Xvoid ShowScreenCursor(void); X XAn internal counter is used to keep track of whether the cursor is to Xbe shown on the screen. When it is less than or equal to zero, the Xcursor is hidden. Otherwise it is shown. The hide routine decrements Xthis counter. Show increments it. X Xvoid UpdateScreen(void); X XImmediately draws the dirty portion of the screen. The dirty portion Xincludes the update region of the window and the internal dirty area Xmaintained by the 'D' buffer manipulation routines. X XIn addition to the macintosh event queue, this package maintains a Xbuffer of keystrokes and mouse clicks. Whenever the idle routine is Xcalled, the events are pulled out of the macintosh queue and put into Xthe internal buffer. X Xvoid FlushScreenKeys(void); X XFlushes the internal buffer of keystrokes and the macintosh event queue. X Xint CountScreenKeys(void); X XCounts the number of entries in the internal keystroke buffer. X Xint GetScreenKeys(char *keyCode, char *modifiers, char *ascii, X int *h, int *v); X XPulls the top element off the internal buffer. KeyCode contains the Xkeycode as described in the IM Event Manager documentation. Modifiers Xcontains bits which indicate the state of the control keys (command, Xshift, caps lock, option, and control) and whether the event is a Xmouse click. There are masks defined in ScrnMgr.h that indicate the Xexact bit for each. In the case of a mouse click, h and v will be Xset. If you are not interested in mouse clicks, you can pass NULLs Xfor both. Ascii will get the ascii code of the key hit. If the Xkeyboard in use has a control key, the ascii value is taken right from Xthe event which will contain the appropriate control code. If the Xkeyboard does not have a control key, a test is made to see if the Xcommand modifier key is down. If so, the ascii value is converted to Xthe appropriate control code. See the discussion on MENU resources Xbelow to see how command key equivalents work on machines without a Xcontrol key. X Xvoid EnableScreenMouse(int flag); X XEnables or disables the queuing of mouse clicks in the internal Xbuffer, according to flag. Initially, mouse clicks are disabled. X Xvoid ClipScreenMouse(Rect *clip); X XLimits the detection of mouse clicks to the area indicated by clip, Xmeasured in character cells on the screen. X Xvoid GetScreenCharAttr(char *c, char *a, int h, int v); X XReturns in c and a the character and attribute at (h, v). X Xvoid GetScreenImage(char *c, char *a, int rowBytes, X Rect *area, int h, int v); X XReturns in c and a the block of characters and attributes beginning at X(h, v). RowBytes indicates the number of bytes in a row in the c and Xa buffers. Area indicates the block of bytes to copy, assuming that Xthe first byte in the buffers is at (0, 0). Note: This means that the Xarea rectangle is in buffer coordinates, not screen coordinates. X Xvoid GetScreenCursor(int *h, int *v); X XReturns the screen coordinates of the cursor. X XThe next few routines help with dialogs. They are designed to work Xwith multi-monitor systems. On such systems, the active monitor is Xchosen by the current mouse location, arguably not a good choice, but Xprobably a choice as good as any other. X Xint YesOrNo(char *question); X XPuts up a dialog box with the string pointed to by question, a button Xfor yes (the default), and a button for no. Returns true if yes is Xselected. The box will be centered horizontally on the active Xmonitor, one-third of the way from the top. X Xint DoScreenALRT(int id, int kind, Fixed hRatio, Fixed vRatio); X XPuts up the alert indicated by id. Kind specifies the type of alert X(normal, stop, note, or caution). There are constants defined in XScrnMgr.h for each of these kinds. The alert will be centered hRatio Xof the way from the left and vRatio of the way from the top of the Xactive monitor. (I.e., if hRatio = vRatio = .5, the alert will be Xexactly in the middle of the screen.) ScrnMgr.h contains fixed Xconstants for common ratios. See IM for a general discussion of fixed Xnumbers. Returns the item number of the button pressed. X Xvoid CenterScreenDLOG(int id, Fixed hRatio, Fixed vRatio, X int *h, int *v); X XGiven a DLOG, which does not have to be currently shown on the screen, Xindicated by id, and hRatio and vRatio, returns where to position its Xtop left corner in h and v. See DoScreenALRT for an explanation of XhRatio and vRatio. This routine is generally used prior to calling XGetNewDialog(). You should declare your DLOG to be invisible, call XMoveWindow() using h and v to center it, and then call ShowWindow(). X Xvoid GetScreenBounds(Rect *bounds); X XReturns the bounds in global coordinates of the active monitor, less Xthe menu bar if it is on this monitor. X Xpascal void DrawDefaultBorder(); X Xpascal void DrawGroupRect(); X XTwo handy routines for installing in dialog userItems. X Xvoid ConfigScreenMgr(int force, ResType theType, int theID, X int (*configProc)(Handle theData)); X XA routine to manipulate resources in the configuration file. Checks Xfor the presence of the resource indicated by theType and theID. If Xthis resource is not found, it does nothing. If the resource is found Xsomewhere other than in the configuration file (see InitScreenMgr()), Xthis routine assumes that some action needs to be taken. The usual Xplace other the the configuration file to find this kind of resource Xis in the program file itself and logically represents default values. XIf some action needs to be taken or force is non-zero, the routine Xpointed to by configProc is called. TheData contains a handle to the Xresource found as described above. ConfigProc should generally put up Xa dialog box to change the data in theHandle. If it does change the Xdata, configProc should return true. Otherwise, false. If configProc Xreturns true, the handle is marked changed so that it is added to the Xconfiguration file. A nice time to call this routine is at the start Xof your program with force false, so that initial configuration Xinformation can be obtained from the user. Then provide a menu item Xin the application menu to allow the user to change it later, calling Xthis routine with force true. X Xvoid BeginScreenWait(int rate); X XChanges the cursor to a spinning wristwatch. Rate indicates the Xnumber of ticks between each spin. X Xvoid EndScreenWait(void); X XReturns the cursor to the standard arrow. X XHandle GetFileMHandle(void); X XHandle GetAppMHandle(void); X XReturns a handle to the file or application menu. X Xint PushScreen(); X XSaves the current screen buffer (characters, attributes, and cursor Xlocation) on a stack. Allocates a significant amount of memory. XReturns 0 if successful. X Xvoid PopScreen() X XSets the screen contents to the last screen saved by PushScreen(). If Xthere are no saved screens on the stack, does nothing. X XYou should include in your application all the resources found in the Xfile ScrnMgr.rsrc. This file is produced from ScrnMgr.r by the MPW Xtool Rez. The best way to do this, assuming you have Rez, is to Xinclude at the beginning of your program's .r file, the line 'include X"ScrnMgr.rsrc";' X XThis package assumes that your program will have 4 or 5 menus: the XApple, File, Edit, Screen (FontSize), and optionally an "application" Xmenu. You can override the standard file menu, if you provide a XfileMenuProc in the InitScreenMgr() call. If you do override, you Xshould provide two menu resources to replace the default ones in XScrnMgr.rsrc. The first must be MENU(129). The second, MENU(229), Xmust be a copy of the first, except for not having any command key Xequivalents. It will be used on machines without a control key. In Xother words, machines without a control key on the keyboard cannot use Xcommand key equivalents. If you want to implement an application Xmenu, you must provide an appMenuProc to the initialization routine, Xalong with MENU(133) and MENU(233). The first menu is the application Xmenu with command key equivalents, the second without. X XYou will probably want to override the STR(128) resource which Xcontains the title of the first item in the apple menu (i.e, the about Xitem). If you override the DLOG(128) and DITL(128) resources, you can Xrely on the package to put up your customized about box. Otherwise, Xyou can call SetScreenAboutProc() to really customize things. The Xdefault about box mentions the version of this package and its Xprogrammer. X XThe STR(129) resource contains the name of the font the package should Xuse. Any true monospaced font should work. Be forewarned that very Xfew fonts are completely monospaced. Many have a few odd characters Xwhose width is not the same as most others. Since this package relies Xon GetFontInfo() and the returned widMax to setup the screen, even the Xpresence of one extra wide character in the font will cause funny Xthings to happen. X XYou will probably want to override the INFO(1) resource. This Xresource contains the window size, position, font size, and colors. A Xcopy of it is made the first time your program is run in the Xconfiguration file and is thereafter kept up to date. Hence, the copy Xyou keep in you application file should contain the default initial Xvalues. The window size and position are indicated by a rectangle in Xglobal coordinates. Since ResEdit does not provide a template for Xthis kind of resource, you will have to at least look at the ScrnMgr.r Xfile to see the format of the resource if you want to use ResEdit to Xmodify it. X XFinally, you will want to supply a SIZE resource to make your program XMultiFinder friendly. X XI am somewhat ambivalent about releasing this package to the public. XI do not think that it is particularly well-written. And I certainly Xdo not think that it does justice to what the mac is all about. It is Xprobably full of bugs. The only real testing that it has had is in Xthe moria port, which doesn't call all of the routines available. XHence, I do not provide an express or implied warranty of any kind. XYou use the package at your own risk. If you have any questions, I Xcan be reached at 73230.224@compuserve.com or at 73230,224 on CIS. X XCurtis McCauley X22 July 1989 END_OF_FILE if test 20464 -ne `wc -c <'mac/scrnmgr/ScrnMgr.doc'`; then echo shar: \"'mac/scrnmgr/ScrnMgr.doc'\" unpacked with wrong size! fi # end of 'mac/scrnmgr/ScrnMgr.doc' if test -f 'source/player.c' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'source/player.c'\" else echo shar: Extracting \"'source/player.c'\" \(19680 characters\) sed "s/^X//" >'source/player.c' <<'END_OF_FILE' X/* player.c: player specific variable definitions X X Copyright (c) 1989 James E. Wilson, Robert A. Koeneke X X This software may be copied and distributed for educational, research, and X not for profit purposes provided that this copyright and statement are X included in all such copies. */ X X#include "constant.h" X#include "config.h" X#include "types.h" X X/* Player record for most player related info */ Xplayer_type py; X/* player location in dungeon */ Xint16 char_row; Xint16 char_col; X/* calculated base hp values for player at each level, store them so that X drain life + restore life does not affect hit points */ Xint16u player_hp[MAX_PLAYER_LEVEL]; X X/* Class titles for different levels */ X#ifdef MACGAME Xchar *(*player_title)[MAX_PLAYER_LEVEL]; X#else Xchar *player_title[MAX_CLASS][MAX_PLAYER_LEVEL] = { X /* Warrior */ X{"Rookie","Private","Soldier","Mercenary","Veteran(1st)","Veteran(2nd)", X"Veteran(3rd)","Warrior(1st)","Warrior(2nd)","Warrior(3rd)","Warrior(4th)", X"Swordsman-1","Swordsman-2","Swordsman-3","Hero","Swashbuckler","Myrmidon", X"Champion-1","Champion-2","Champion-3","Superhero","Knight","Superior Knt", X"Gallant Knt","Knt Errant","Guardian Knt","Baron","Duke","Lord (1st)", X"Lord (2nd)","Lord (3rd)","Lord (4th)","Lord (5th)","Lord (6th)","Lord (7th)", X"Lord (8th)","Lord (9th)","Lord Gallant","Lord Keeper","Lord Noble"}, X /* Mage */ X{"Novice","Apprentice","Trickster-1","Trickster-2","Trickster-3","Cabalist-1", X"Cabalist-2","Cabalist-3","Visionist","Phantasmist","Shadowist","Spellbinder", X"Illusionist","Evoker (1st)","Evoker (2nd)","Evoker (3rd)","Evoker (4th)", X"Conjurer","Theurgist","Thaumaturge","Magician","Enchanter","Warlock", X"Sorcerer","Necromancer","Mage (1st)","Mage (2nd)","Mage (3rd)","Mage (4th)", X"Mage (5th)","Wizard (1st)","Wizard (2nd)","Wizard (3rd)","Wizard (4th)", X"Wizard (5th)","Wizard (6th)","Wizard (7th)","Wizard (8th)","Wizard (9th)", X"Wizard Lord"}, X /* Priests */ X{"Believer","Acolyte(1st)","Acolyte(2nd)","Acolyte(3rd)","Adept (1st)", X"Adept (2nd)","Adept (3rd)","Priest (1st)","Priest (2nd)","Priest (3rd)", X"Priest (4th)","Priest (5th)","Priest (6th)","Priest (7th)","Priest (8th)", X"Priest (9th)","Curate (1st)","Curate (2nd)","Curate (3rd)","Curate (4th)", X"Curate (5th)","Curate (6th)","Curate (7th)","Curate (8th)","Curate (9th)", X"Canon (1st)","Canon (2nd)","Canon (3rd)","Canon (4th)","Canon (5th)", X"Low Lama","Lama-1","Lama-2","Lama-3","High Lama","Great Lama","Patriarch", X"High Priest","Great Priest","Noble Priest"}, X /* Rogues */ X{"Vagabond","Footpad","Cutpurse","Robber","Burglar","Filcher","Sharper", X"Magsman","Common Rogue","Rogue (1st)","Rogue (2nd)","Rogue (3rd)", X"Rogue (4th)","Rogue (5th)","Rogue (6th)","Rogue (7th)","Rogue (8th)", X"Rogue (9th)","Master Rogue","Expert Rogue","Senior Rogue","Chief Rogue", X"Prime Rogue","Low Thief","Thief (1st)","Thief (2nd)","Thief (3rd)", X"Thief (4th)","Thief (5th)","Thief (6th)","Thief (7th)","Thief (8th)", X"Thief (9th)","High Thief","Master Thief","Executioner","Low Assassin", X"Assassin","High Assassin","Guildsmaster"}, X /* Rangers */ X{"Runner (1st)","Runner (2nd)","Runner (3rd)","Strider (1st)","Strider (2nd)", X"Strider (3rd)","Scout (1st)","Scout (2nd)","Scout (3rd)","Scout (4th)", X"Scout (5th)","Courser (1st)","Courser (2nd)","Courser (3rd)","Courser (4th)", X"Courser (5th)","Tracker (1st)","Tracker (2nd)","Tracker (3rd)", X"Tracker (4th)","Tracker (5th)","Tracker (6th)","Tracker (7th)", X"Tracker (8th)","Tracker (9th)","Guide (1st)","Guide (2nd)","Guide (3rd)", X"Guide (4th)","Guide (5th)","Guide (6th)","Guide (7th)","Guide (8th)", X"Guide (9th)","Pathfinder-1","Pathfinder-2","Pathfinder-3","Ranger", X"High Ranger","Ranger Lord"}, X /* Paladins */ X{"Gallant","Keeper (1st)","Keeper (2nd)","Keeper (3rd)","Keeper (4th)", X"Keeper (5th)","Keeper (6th)","Keeper (7th)","Keeper (8th)","Keeper (9th)", X"Protector-1","Protector-2","Protector-3","Protector-4","Protector-5", X"Protector-6","Protector-7","Protector-8","Defender-1","Defender-2", X"Defender-3","Defender-4","Defender-5","Defender-6","Defender-7","Defender-8", X"Warder (1st)","Warder (2nd)","Warder (3rd)","Warder (4th)","Warder (5th)", X"Warder (6th)","Warder (7th)","Warder (8th)","Warder (9th)","Guardian", X"Chevalier","Justiciar","Paladin","High Lord"} X}; X#endif X X/* Base experience levels, may be adjusted up for race and/or class*/ Xint32u player_exp[MAX_PLAYER_LEVEL] = { X 10, 25, 45, 70, 100, 140, 200, 280, X 380, 500, 650, 850, 1100, 1400, 1800, 2300, X 2900, 3600, 4400, 5400, 6800, 8400, 10200, 12500, X 17500, 25000, 35000L, 50000L, 75000L, 100000L, 150000L, 200000L, X 300000L, 400000L, 500000L, 750000L, 1500000L, 2500000L, 5000000L, 10000000L X}; X X/*Race STR,INT,WIS,DEX,CON,CHR, X Ages, heights, and weights (male then female) X Racial Bases for: dis,srh,stl,fos,bth,bthb,bsav,hitdie, X infra, exp base, choice-classes */ X#ifdef MACGAME Xrace_type *race; X#else Xrace_type race[MAX_RACES] = { X {"Human", 0, 0, 0, 0, 0, 0, X 14, 6, 72, 6,180, 25, 66, 4,150, 20, X 0, 0, 0, 0, 0, 0, 0, 10, 0, 100, 0x3F, X }, X {"Half-Elf", -1, 1, 0, 1, -1, 1, X 24, 16, 66, 6,130, 15, 62, 6,100, 10, X 2, 6, 1, -1, -1, 5, 3, 9, 2, 110, 0x3F, X }, X {"Elf", -1, 2, 1, 1, -2, 1, X 75, 75, 60, 4,100, 6, 54, 4, 80, 6, X 5, 8, 1, -2, -5, 15, 6, 8, 3, 120, 0x1F, X }, X {"Halfling", -2, 2, 1, 3, 1, 1, X 21, 12, 36, 3, 60, 3, 33, 3, 50, 3, X 15, 12, 4, -5,-10, 20, 18, 6, 4, 110, 0x0B, X }, X {"Gnome", -1, 2, 0, 2, 1, -2, X 50, 40, 42, 3, 90, 6, 39, 3, 75, 3, X 10, 6, 3, -3, -8, 12, 12, 7, 4, 125, 0x0F, X }, X {"Dwarf", 2, -3, 1, -2, 2, -3, X 35, 15, 48, 3,150, 10, 46, 3,120, 10, X 2, 7, -1, 0, 15, 0, 9, 9, 5, 120, 0x05, X }, X {"Half-Orc", 2, -1, 0, 0, 1, -4, X 11, 4, 66, 1,150, 5, 62, 1,120, 5, X -3, 0, -1, 3, 12, -5, -3, 10, 3, 110, 0x0D, X }, X {"Half-Troll",4, -4, -2, -4, 3, -6, X 20, 10, 96, 10,255, 50, 84, 8,225, 40, X -5, -1, -2, 5, 20,-10, -8, 12, 3, 120, 0x05, X } X }; X#endif X X/* 5 char race for printing scores. */ Xchar *dsp_race[MAX_RACES] = { X "Human", X "H-Elf", X "Elf ", X "Hobbt", X "Gnome", X "Dwarf", X "H-Orc", X "H-Tro" X}; X X/* Background information */ X#ifdef MACGAME Xbackground_type *background; X#else Xbackground_type background[MAX_BACKGROUND] = { X{"You are the illegitimate and unacknowledged child ", 10, 1, 2, 25}, X{"You are the illegitimate but acknowledged child ", 20, 1, 2, 35}, X{"You are one of several children ", 95, 1, 2, 45}, X{"You are the first child ", 100, 1, 2, 50}, X{"of a Serf. ", 40, 2, 3, 65}, X{"of a Yeoman. ", 65, 2, 3, 80}, X{"of a Townsman. ", 80, 2, 3, 90}, X{"of a Guildsman. ", 90, 2, 3,105}, X{"of a Landed Knight. ", 96, 2, 3,120}, X{"of a Titled Noble. ", 99, 2, 3,130}, X{"of a Royal Blood Line. ", 100, 2, 3,140}, X{"You are the black sheep of the family. ", 20, 3,50, 20}, X{"You are a credit to the family. ", 80, 3,50, 55}, X{"You are a well liked child. ", 100, 3,50, 60}, X{"Your mother was a Green-Elf. ", 40, 4, 1, 50}, X{"Your father was a Green-Elf. ", 75, 4, 1, 55}, X{"Your mother was a Grey-Elf. ", 90, 4, 1, 55}, X{"Your father was a Grey-Elf. ", 95, 4, 1, 60}, X{"Your mother was a High-Elf. ", 98, 4, 1, 65}, X{"Your father was a High-Elf. ", 100, 4, 1, 70}, X{"You are one of several children ", 60, 7, 8, 50}, X{"You are the only child ", 100, 7, 8, 55}, X{"of a Green-Elf ", 75, 8, 9, 50}, X{"of a Grey-Elf ", 95, 8, 9, 55}, X{"of a High-Elf ", 100, 8, 9, 60}, X{"Ranger. ", 40, 9,54, 80}, X{"Archer. ", 70, 9,54, 90}, X{"Warrior. ", 87, 9,54,110}, X{"Mage. ", 95, 9,54,125}, X{"Prince. ", 99, 9,54,140}, X{"King. ", 100, 9,54,145}, X{"You are one of several children of a Halfling ", 85,10,11, 45}, X{"You are the only child of a Halfling ", 100,10,11, 55}, X{"Bum. ", 20,11, 3, 55}, X{"Tavern Owner. ", 30,11, 3, 80}, X{"Miller. ", 40,11, 3, 90}, X{"Home Owner. ", 50,11, 3,100}, X{"Burglar. ", 80,11, 3,110}, X{"Warrior. ", 95,11, 3,115}, X{"Mage. ", 99,11, 3,125}, X{"Clan Elder. ", 100,11, 3,140}, X{"You are one of several children of a Gnome ", 85,13,14, 45}, X{"You are the only child of a Gnome ", 100,13,14, 55}, X{"Beggar. ", 20,14, 3, 55}, X{"Braggart. ", 50,14, 3, 70}, X{"Prankster. ", 75,14, 3, 85}, X{"Warrior. ", 95,14, 3,100}, X{"Mage. ", 100,14, 3,125}, X{"You are one of two children of a Dwarven ", 25,16,17, 40}, X{"You are the only child of a Dwarven ", 100,16,17, 50}, X{"Thief. ", 10,17,18, 60}, X{"Prison Guard. ", 25,17,18, 75}, X{"Miner. ", 75,17,18, 90}, X{"Warrior. ", 90,17,18,110}, X{"Priest. ", 99,17,18,130}, X{"King. ", 100,17,18,150}, X{"You are the black sheep of the family. ", 15,18,57, 10}, X{"You are a credit to the family. ", 85,18,57, 50}, X{"You are a well liked child. ", 100,18,57, 55}, X{"Your mother was an Orc, but it is unacknowledged. ", 25,19,20, 25}, X{"Your father was an Orc, but it is unacknowledged. ", 100,19,20, 25}, X{"You are the adopted child ", 100,20, 2, 50}, X{"Your mother was a Cave-Troll ", 30,22,23, 20}, X{"Your father was a Cave-Troll ", 60,22,23, 25}, X{"Your mother was a Hill-Troll ", 75,22,23, 30}, X{"Your father was a Hill-Troll ", 90,22,23, 35}, X{"Your mother was a Water-Troll ", 95,22,23, 40}, X{"Your father was a Water-Troll ", 100,22,23, 45}, X{"Cook. ", 5,23,62, 60}, X{"Warrior. ", 95,23,62, 55}, X{"Shaman. ", 99,23,62, 65}, X{"Clan Chief. ", 100,23,62, 80}, X{"You have dark brown eyes, ", 20,50,51, 50}, X{"You have brown eyes, ", 60,50,51, 50}, X{"You have hazel eyes, ", 70,50,51, 50}, X{"You have green eyes, ", 80,50,51, 50}, X{"You have blue eyes, ", 90,50,51, 50}, X{"You have blue-gray eyes, ", 100,50,51, 50}, X{"straight ", 70,51,52, 50}, X{"wavy ", 90,51,52, 50}, X{"curly ", 100,51,52, 50}, X{"black hair, ", 30,52,53, 50}, X{"brown hair, ", 70,52,53, 50}, X{"auburn hair, ", 80,52,53, 50}, X{"red hair, ", 90,52,53, 50}, X{"blond hair, ", 100,52,53, 50}, X{"and a very dark complexion.", 10,53, 0, 50}, X{"and a dark complexion.", 30,53, 0, 50}, X{"and an average complexion.", 80,53, 0, 50}, X{"and a fair complexion.", 90,53, 0, 50}, X{"and a very fair complexion.", 100,53, 0, 50}, X{"You have light grey eyes, ", 85,54,55, 50}, X{"You have light blue eyes, ", 95,54,55, 50}, X{"You have light green eyes, ", 100,54,55, 50}, X{"straight ", 75,55,56, 50}, X{"wavy ", 100,55,56, 50}, X{"black hair, and a fair complexion.", 75,56, 0, 50}, X{"brown hair, and a fair complexion.", 85,56, 0, 50}, X{"blond hair, and a fair complexion.", 95,56, 0, 50}, X{"silver hair, and a fair complexion.", 100,56, 0, 50}, X{"You have dark brown eyes, ", 99,57,58, 50}, X{"You have glowing red eyes, ", 100,57,58, 60}, X{"straight ", 90,58,59, 50}, X{"wavy ", 100,58,59, 50}, X{"black hair, ", 75,59,60, 50}, X{"brown hair, ", 100,59,60, 50}, X{"a one foot beard, ", 25,60,61, 50}, X{"a two foot beard, ", 60,60,61, 51}, X{"a three foot beard, ", 90,60,61, 53}, X{"a four foot beard, ", 100,60,61, 55}, X{"and a dark complexion.", 100,61, 0, 50}, X{"You have slime green eyes, ", 60,62,63, 50}, X{"You have puke yellow eyes, ", 85,62,63, 50}, X{"You have blue-bloodshot eyes, ", 99,62,63, 50}, X{"You have glowing red eyes, ", 100,62,63, 55}, X{"dirty ", 33,63,64, 50}, X{"mangy ", 66,63,64, 50}, X{"oily ", 100,63,64, 50}, X{"sea-weed green hair, ", 33,64,65, 50}, X{"bright red hair, ", 66,64,65, 50}, X{"dark purple hair, ", 100,64,65, 50}, X{"and green ", 25,65,66, 50}, X{"and blue ", 50,65,66, 50}, X{"and white ", 75,65,66, 50}, X{"and black ", 100,65,66, 50}, X{"ulcerous skin.", 33,66, 0, 50}, X{"scabby skin.", 66,66, 0, 50}, X{"leprous skin.", 100,66, 0, 50} X}; X#endif X X/* Classes. */ Xclass_type class[MAX_CLASS] = { X/* HP Dis Src Stl Fos bth btb sve S I W D Co Ch Spell Exp spl */ X{"Warrior",9, 25, 14, 1, 38, 70, 55, 18, 5,-2,-2, 2, 2,-1, NONE, 0, 0}, X{"Mage", 0, 30, 16, 2, 20, 34, 20, 36,-5, 3, 0, 1,-2, 1, MAGE, 30, 1}, X{"Priest", 2, 25, 16, 2, 32, 48, 35, 30,-3,-3, 3,-1, 0, 2, PRIEST, 20, 1}, X{"Rogue", 6, 45, 32, 5, 16, 60, 66, 30, 2, 1,-2, 3, 1,-1, MAGE, 0, 5}, X{"Ranger", 4, 30, 24, 3, 24, 56, 72, 30, 2, 2, 0, 1, 1, 1, MAGE, 40, 3}, X{"Paladin",6, 20, 12, 1, 38, 68, 40, 24, 3,-3, 1, 0, 2, 2, PRIEST, 35, 1} X}; X X/* making it 16 bits wastes a little space, but saves much signed/unsigned X headaches in its use */ X/* CLA_MISC_HIT is identical to CLA_SAVE, which takes advantage of X the fact that the save values are independent of the class */ Xint16 class_level_adj[MAX_CLASS][MAX_LEV_ADJ] = { X/* bth bthb device disarm save/misc hit */ X/* Warrior */ { 4, 4, 2, 2, 3 }, X/* Mage */ { 2, 2, 4, 3, 3 }, X/* Priest */ { 2, 2, 4, 3, 3 }, X/* Rogue */ { 3, 4, 3, 4, 3 }, X/* Ranger */ { 3, 4, 3, 3, 3 }, X/* Paladin */ { 3, 3, 3, 2, 3 } X}; X Xint32u spell_learned = 0; /* bit mask of spells learned */ Xint32u spell_worked = 0; /* bit mask of spells tried and worked */ Xint32u spell_forgotten = 0; /* bit mask of spells learned but forgotten */ Xint8u spell_order[32]; /* order spells learned/remembered/forgotten */ X X/* Warriors don't have spells, so there is no entry for them. Note that X this means you must always subtract one from the py.misc.pclass before X indexing into magic_spell[]. */ X#ifdef MACGAME Xspell_type (*magic_spell)[31]; X#else Xspell_type magic_spell[MAX_CLASS-1][31] = { X { /* Mage */ X { 1, 1, 22, 1}, X { 1, 1, 23, 1}, X { 1, 2, 24, 1}, X { 1, 2, 26, 1}, X { 3, 3, 25, 2}, X { 3, 3, 25, 1}, X { 3, 3, 27, 2}, X { 3, 4, 30, 1}, X { 5, 4, 30, 6}, X { 5, 5, 30, 8}, X { 5, 5, 30, 5}, X { 5, 5, 35, 6}, X { 7, 6, 35, 9}, X { 7, 6, 50, 10}, X { 7, 6, 40, 12}, X { 9, 7, 44, 19}, X { 9, 7, 45, 19}, X { 9, 7, 75, 22}, X { 9, 7, 45, 19}, X { 11, 7, 45, 25}, X { 11, 7, 99, 19}, X { 13, 7, 50, 22}, X { 15, 9, 50, 25}, X { 17, 9, 50, 31}, X { 19, 12, 55, 38}, X { 21, 12, 90, 44}, X { 23, 12, 60, 50}, X { 25, 12, 65, 63}, X { 29, 18, 65, 88}, X { 33, 21, 80, 125}, X { 37, 25, 95, 200} X }, X { /* Priest */ X { 1, 1, 10, 1}, X { 1, 2, 15, 1}, X { 1, 2, 20, 1}, X { 1, 2, 25, 1}, X { 3, 2, 25, 1}, X { 3, 3, 27, 2}, X { 3, 3, 27, 2}, X { 3, 3, 28, 3}, X { 5, 4, 29, 4}, X { 5, 4, 30, 5}, X { 5, 4, 32, 5}, X { 5, 5, 34, 5}, X { 7, 5, 36, 6}, X { 7, 5, 38, 7}, X { 7, 6, 38, 9}, X { 7, 7, 38, 9}, X { 9, 6, 38, 10}, X { 9, 7, 38, 10}, X { 9, 7, 40, 10}, X { 11, 8, 42, 10}, X { 11, 8, 42, 12}, X { 11, 9, 55, 15}, X { 13, 10, 45, 15}, X { 13, 11, 45, 16}, X { 15, 12, 50, 20}, X { 15, 14, 50, 22}, X { 17, 14, 55, 32}, X { 21, 16, 60, 38}, X { 25, 20, 70, 75}, X { 33, 24, 90, 125}, X { 39, 32, 99, 200} X }, X { /* Rogue */ X { 99, 99, 0, 0}, X { 5, 1, 50, 1}, X { 7, 2, 55, 1}, X { 9, 3, 60, 2}, X { 11, 4, 65, 2}, X { 13, 5, 70, 3}, X { 99, 99, 0, 0}, X { 15, 6, 75, 3}, X { 99, 99, 0, 0}, X { 17, 7, 80, 4}, X { 19, 8, 85, 5}, X { 21, 9, 90, 6}, X { 99, 99, 0, 0}, X { 23, 10, 95, 7}, X { 99, 99, 0, 0}, X { 99, 99, 0, 0}, X { 25, 12, 95, 9}, X { 27, 15, 99, 11}, X { 99, 99, 0, 0}, X { 99, 99, 0, 0}, X { 29, 18, 99, 19}, X { 99, 99, 0, 0}, X { 99, 99, 0, 0}, X { 99, 99, 0, 0}, X { 99, 99, 0, 0}, X { 99, 99, 0, 0}, X { 99, 99, 0, 0}, X { 99, 99, 0, 0}, X { 99, 99, 0, 0}, X { 99, 99, 0, 0}, X { 99, 99, 0, 0}, X }, X { /* Ranger */ X { 3, 1, 30, 1}, X { 3, 2, 35, 2}, X { 3, 2, 35, 2}, X { 5, 3, 35, 2}, X { 5, 3, 40, 2}, X { 5, 4, 45, 3}, X { 7, 5, 40, 6}, X { 7, 6, 40, 5}, X { 9, 7, 40, 7}, X { 9, 8, 45, 8}, X { 11, 8, 40, 10}, X { 11, 9, 45, 10}, X { 13, 10, 45, 12}, X { 13, 11, 55, 13}, X { 15, 12, 50, 15}, X { 15, 13, 50, 15}, X { 17, 17, 55, 15}, X { 17, 17, 90, 17}, X { 21, 17, 55, 17}, X { 21, 19, 60, 18}, X { 23, 25, 95, 20}, X { 23, 20, 60, 20}, X { 25, 20, 60, 20}, X { 25, 21, 65, 20}, X { 27, 21, 65, 22}, X { 29, 23, 95, 23}, X { 31, 25, 70, 25}, X { 33, 25, 75, 38}, X { 35, 25, 80, 50}, X { 37, 30, 95, 100}, X { 99, 99, 0, 0} X }, X { /* Paladin */ X { 1, 1, 30, 1}, X { 2, 2, 35, 2}, X { 3, 3, 35, 3}, X { 5, 3, 35, 5}, X { 5, 4, 35, 5}, X { 7, 5, 40, 6}, X { 7, 5, 40, 6}, X { 9, 7, 40, 7}, X { 9, 7, 40, 8}, X { 9, 8, 40, 8}, X { 11, 9, 40, 10}, X { 11, 10, 45, 10}, X { 11, 10, 45, 10}, X { 13, 10, 45, 12}, X { 13, 11, 45, 13}, X { 15, 13, 45, 15}, X { 15, 15, 50, 15}, X { 17, 15, 50, 17}, X { 17, 15, 50, 18}, X { 19, 15, 50, 19}, X { 19, 15, 50, 19}, X { 21, 17, 50, 20}, X { 23, 17, 50, 20}, X { 25, 20, 50, 20}, X { 27, 21, 50, 22}, X { 29, 22, 50, 24}, X { 31, 24, 60, 25}, X { 33, 28, 60, 31}, X { 35, 32, 70, 38}, X { 37, 36, 90, 50}, X { 39, 38, 95, 100} X } X }; X#endif X Xchar *spell_names[62] = { X /* Mage Spells */ X "Magic Missile", "Detect Monsters", "Phase Door", "Light Area", X "Cure Light Wounds", "Find Hidden Traps/Doors", "Stinking Cloud", X "Confusion", "Lightning Bolt", "Trap/Door Destruction", "Sleep I", X "Cure Poison", "Teleport Self", "Remove Curse", "Frost Bolt", X "Turn Stone to Mud", "Create Food", "Recharge Item I", "Sleep II", X "Polymorph Other", "Identify", "Sleep III", "Fire Bolt", "Slow Monster", X "Frost Ball", "Recharge Item II", "Teleport Other", "Haste Self", X "Fire Ball", "Word of Destruction", "Genocide", X /* Priest Spells, start at index 31 */ X "Detect Evil", "Cure Light Wounds", "Bless", "Remove Fear", "Call Light", X "Find Traps", "Detect Doors/Stairs", "Slow Poison", "Blind Creature", X "Portal", "Cure Medium Wounds", "Chant", "Sanctuary", "Create Food", X "Remove Curse", "Resist Heat and Cold", "Neutralize Poison", X "Orb of Draining", "Cure Serious Wounds", "Sense Invisible", X "Protection from Evil", "Earthquake", "Sense Surroundings", X "Cure Critical Wounds", "Turn Undead", "Prayer", "Dispel Undead", X "Heal", "Dispel Evil", "Glyph of Warding", "Holy Word" X}; X X/* Each type of character starts out with a few provisions. */ X/* Note that the entries refer to elements of the object_list[] array*/ X/* 344 = Food Ration, 365 = Wooden Torch, 123 = Cloak, 30 = Stiletto, X 103 = Soft Leather Armor, 318 = Beginners-Majik, 322 = Beginners Handbook */ Xint16u player_init[MAX_CLASS][5] = { X { 344, 365, 123, 30, 103}, /* Warrior */ X { 344, 365, 123, 30, 318}, /* Mage */ X { 344, 365, 123, 30, 322}, /* Priest */ X { 344, 365, 30, 103, 318}, /* Rogue */ X { 344, 365, 123, 30, 318}, /* Ranger */ X { 344, 365, 123, 30, 322} /* Paladin */ X}; END_OF_FILE if test 19680 -ne `wc -c <'source/player.c'`; then echo shar: \"'source/player.c'\" unpacked with wrong size! fi # end of 'source/player.c' fi echo shar: End of archive 2 \(of 3\). cp /dev/null ark2isdone MISSING="" for I in 1 2 3 ; do if test ! -f ark${I}isdone ; then MISSING="${MISSING} ${I}" fi done if test "${MISSING}" = "" ; then echo You have unpacked all 3 archives. echo "Please read the file NOTES01." rm -f ark[1-9]isdone else echo You still need to unpack the following archives: echo " " ${MISSING} fi ## End of shell archive. exit 0