1 SUB NEWTRS(CHN$) 10 REM DNDTRS & \ TREASURE PROGRAM FOR DND & 20 REM WRITTEN MAY 1976 BY D LAWRENCE & 30 REM VERSION 3.0 & 40 REM COPYWRITE JUNE 7,1978 BY DANIEL M LAWRENCE & 50 ! V2A & ! Changed stat changer to make it fair (RSB) & ! V2B & ! Fixed line 295 swapper & ! V3 DAS Convert to one task (overlaid) & ! Various modifications for VAX compatibility & ! & 105 DIM #5,D$(20)=16,S1%(20),L1%(23999) !LEVEL DATA & 110 COM (DNDA) N$(1)=64,C(64),L%(21,21),I(8),I1(8) & 115 DIM #8,N2$(100,1)=64,C2(100,64) !PERM CHAR STORAGE & 120 DIM #9,N3$(1000)=32 !ORB FILE & 200 COM (MEM) M(20),Q(4,2),V$(4)=8,P%(4,4),M$(20)=12,S$(8,6)=32,S$=18, & MINDUNLVL(20),MAXDUNLVL(20),MINMONLVL(20) 205 DEF FNT$(A) !2 CHAR A & 210 Z$=FNN1$(A) & \ IF LEN(Z$)=1 THEN & Z$="0"+Z$ & 215 FNT$=Z$ & 220 FNEND & 225 DEF FNC$ !SINGLE CHAR INPUT SYS FUNCTION VERSION & 230 CALL IN1CHR(CHAR%) & \ FNC$=CHR$(CHAR%) & 235 FNEND 240 DEF FNS$(U)=MID(S$,3*U-2,3) !STAT NAMES & 245 DEF FNP !POPULATE & 250 IF RND>.4 THEN & FNP=0 & \ GOTO 285 & 255 IF RND>.5 THEN & GO TO 275 & 260 FNP=256 & \ IF RND>.5 THEN & GO TO 285 & 265 FNP=768 & \ IF RND>.05 THEN & GO TO 285 & 270 FNP=1792 & \ GOTO 285 & 275 FNP=512 & \ IF RND>.2 THEN & GO TO 285 & 280 FNP=1536 & 285 FNEND & 290 DEF FNS%(A%,Z) & 295 IF Z=1 THEN & a%=swap%(a%) & 300 FNS%=A% AND 255% & 305 FNEND & 310 DEF FNM%(A%,B%)=A%*256%+B% !MERGE & 315 DEF FNE$(E$,P) !EQUIPMENT PRINT & 320 IF P<0 THEN & FNE$="" & \ GOTO 335 & 325 IF P<>0 THEN & E$="Magic "+E$+" +"+FNN1$(P) & 330 FNE$=E$+CHR$(13)+CHR$(10) & 335 FNEND & 340 DEF FNI(R%) !ANALYZE ROOM & 345 I(1),I(3)=R% AND 3% & \ R%=R%/4% & \ I(2),I(4)=R% AND 3% & \ R%=R%/4% & 350 IF C(37)>0 THEN & GO TO 365 & 355 IF RND<.85 AND I(3)=3 THEN & I(3)=1 & 360 IF RND<.85 AND I(4)=3 THEN & I(4)=1 & 365 I(5)=R% AND 15% & \ R%=R%/16% & \ I(6)=R% AND 1% & \ R%=R%/2% & \ I(7)=R% AND 1% & \ R%=R%/2% & 370 I(8)=R% & \ FNI=I(5) & 375 FNEND & 380 DEF FNP$(A$,B$,P) !PUT B$ AT P IN A$ & 385 IF P=1 THEN & FNP$=B$+RIGHT(A$,P+LEN(B$)) & \ GOTO 395 & 390 FNP$=LEFT(A$,P-1)+B$+RIGHT(A$,P+LEN(B$)) & 395 FNEND & 400 DEF FNO(A$) !FAST OUTPUT A$ & 405 Z5$=Z5$+CHR$(10) & \ FOR Z1=1 TO LEN(A$) & \ Z2$=MID(A$,Z1,1) & \ IF Z2$=" " THEN & GO TO 430 & 410 IF C9/2>Z1 THEN & Z5$=Z5$+CHR$(13) & \ C9=0 & 415 IF C9>Z1 THEN & Z5$=Z5$+STRING$(C9-Z1,8) & \ C9=Z1 & 420 WHILE C90 THEN & GO TO 530 & 520 IF RND<.85 AND I1(3)=3 THEN & I1(3)=1 & 525 IF RND<.85 AND I1(4)=3 THEN & I1(4)=1 & 530 I1(5)=R% AND 15% & \ R%=R%/16% & \ I1(6)=R% AND 1% & \ R%=R%/2% & 535 I1(7)=R% AND 1% & \ R%=R%/2% & \ I1(8)=R% & 540 IF T<9 THEN & FNI1=I1(T) & ELSE & IF I1(5)+I1(6)+I1(7)=0 THEN & FNI1=0 & ELSE & FNI1=1 & 545 FNEND & 550 DEF FND1$(X,Y) !DISPLAY FUNCTIONS & 555 IF FNI1(P%(X,Y),3)=0 THEN & FND1$=" " & ELSE & FND1$="I" & 560 FNEND & 565 DEF FND2$(X,Y)=MID(V$(0),FNI1(P%(X,Y),3)+1,1) & 570 DEF FND3$(X,Y)=V$(FNI1(P%(X,Y),4)+1) & 575 DEF FNO$(A$,B$)="Press to "+A$+", or to "+B$+":" !OPTION PRINT & 600 DEF FNE(L) !EXPERIENCE FOR LEVEL L & 602 IF L>10 THEN & Z2=L-10 \ Z2=Z2^1.5 & \ Z=FNE(10)+INT(FNE(10)*Z2) & \ GOTO 608 & 604 IF C(7)=0 THEN & Z=2000 & ELSE & IF C(7)=2 THEN & Z=2500 & ELSE & Z=1500 & 606 Z=Z*2 FOR Z1=3 TO L & \ IF L=1 THEN & Z=0 & 608 FNE=Z & 610 FNEND & 630 DEF FNR(A,B) !ROLL A B SIDED DICE & 635 Z=0 & \ Z=Z+INT(RND*B+1) FOR Z1=1 TO A & \ FNR=Z & 640 FNEND & 645 DEF FNN1$(N) & 650 Z$="" & 655 IF N=0 THEN & GO TO 675 & 660 Z1=INT(N/10)*10 & 665 Z$=MID("0123456789",N-Z1+1,1)+Z$ & 670 N=Z1/10 & \ GOTO 655 & 675 FNN1$=Z$ & 680 FNEND & 999 GOSUB 20050 & \ GOTO 7005 & 3000 REM *NEW POSITION* & 3001 C(63)=I & 3005 CHN$ = "NEWDGN" & \ GOTO 32767 & 4070 REM *MONSTER* & 4075 CHN$ = "NEWCBT" & \ GOTO 32767 & 7000 REM *TREASURE* & 7001 C(63)=L & \ IF I(7)=0 THEN & C(64)=1 & \ GOTO 8000 & 7005 L=C(63) & 7010 R=FNR(1,100) & \ IF R>30 THEN & GO TO 7020 & 7015 PRINT "You see a pile of silver..." & \ T=INT(100*RND*L+10) & \ GOTO 7090 & 7020 IF R>40 THEN & GO TO 7030 & 7025 PRINT "You see a pile of gold..." & \ T=INT(500*RND*L+50) & \ GOTO 7090 & 7030 IF R>60 THEN & GO TO 7040 & 7035 PRINT "You see a pile of platinum..." & \ T=INT(1000*RND*L+100) & \ GOTO 7090 & 7040 IF R>72 THEN & GO TO 7050 & 7045 PRINT "You see some gems..." & \ T=INT(500*(RND^.5)*L+150) & \ GOTO 7090 & 7050 IF R>80 THEN & GO TO 7060 & 7055 PRINT "You see a jewel..." & \ T=INT(6000*(RND^3)*L+500) & \ GOTO 7090 & 7060 IF R>90 THEN & GO TO 7500 & 7065 PRINT "You have discovered a chest..." & \ PRINT FNO$("open it","leave it"); & 7070 GOSUB 20800 & \ A$=FNC$ & \ PRINT & 7075 IF A$=CHR$(10) THEN & C(64)=1 & \ GOTO 8000 & 7077 IF A$<>CHR$(13) THEN & PRINT "STUPID DOLT!" & \ GOTO 7065 & 7080 SLEEP 2 & \ IF I(8)=1 AND RND>.5 THEN & PRINT "CHEST EXPLODES!" & \ IF FND(L+5)=-1 THEN & GO TO 13000 & 7085 T=INT(3000*RND*L+500) & \ PRINT "It holds";T;"in gold" & \ GOTO 7110 & 7090 PRINT FNO$("pick it up","leave it behind"); & \ GOSUB 20800 & \ A$=FNC$ & \ PRINT & 7095 IF A$=CHR$(10) THEN & C(64)=1 & \ GOTO 8000 & 7097 IF A$<>CHR$(13) THEN & PRINT "DUMMY!" & \ GOTO 7090 & 7100 IF I(8)=1 THEN & IF FND(C(15)/1.2)=-1 THEN & GO TO 13000 & 7105 PRINT "The treasure is worth";T;"gold" & 7110 C(12)=C(12)+T & \ I=C(15)/C(8) & \ IF I>1 THEN & I=1 & 7115 C(21)=C(21)+INT(T*I) & \ IF R<81 OR R>90 THEN & C(64)=1 & \ GOTO 8000 & 7500 REM *MAGIC ITEMS* & 7505 R=FNR(1,8) & \ ON R GOTO 7510,7555,7585,7615,7645,7665,7700,7735 & 7510 REM *MAGIC WEAPON* & 7515 V$=MID("Sword Mace Dagger",C(7)*6+1,6) & 7520 PRINT "You have found a magic ";V$;"!" & \ PRINT FNO$("pick it up","leave it behind"); & 7525 A$=FNC$ & \ PRINT & \ IF A$=CHR$(10) THEN & GO TO 7770 & 7530 IF A$<>CHR$(13) THEN & PRINT "THINK STUPID!" & \ GOTO 7520 & 7535 IF RND>.833 THEN & GO TO 7550 & 7540 IF C(22)>L THEN & PRINT "You already have a ";V$;" +";L+1 & \ GOTO 7770 & 7545 C(22)=C(22)+1 & \ PRINT "You have found a ";FNE$(V$,C(22)) & \ GOTO 7770 & 7550 PRINT "It's a hostile ";V$;"!" & \ IF FND(C(22))=-1 THEN & GO TO 13000 & ELSE & GO TO 7770 & 7555 REM *MAGIC ARMOR* & 7560 V$=MID("Plate Chain Leather",C(7)*7+1,7)+" Armor" & 7565 IF C(23)CHR$(13) THEN & PRINT "BRAINLESS!" & \ GOTO 7625 & 7635 IF RND>.5 THEN & GOSUB 21100 & \ GOTO 7770 & 7640 GOSUB 21000 & \ GOTO 7770 & 7645 REM *MAGIC TORCH* & 7650 PRINT "You found a magic torch." & \ PRINT "It starts burning" & \ SLEEP 2 & 7655 IF C(37)<0 THEN & C(37)=0 & 7660 C(37)=C(37)+FNR(3,10) & \ I(7)=0 & \ GOSUB 15000 & \ C(64)=1 & \ GOTO 8000 & 7665 REM *RING OF REGENERATION* & 7670 PRINT "You have found a Ring of Regeneration +"; & 7675 I=INT(RND^3*L+1) & \ PRINT FNN1$(I) & 7677 IF C(51)>=I THEN & PRINT "You already have a better one" & \ GOTO 7770 7680 PRINT FNO$("pick it up","leave it behind"); & \ A$=FNC$ & \ PRINT & 7685 IF A$=CHR$(13) THEN & C(51)=I & \ GOTO 7770 & 7690 IF A$=CHR$(10) THEN & GO TO 7770 & 7695 PRINT "TRY AGAIN CHOWDERHEAD!" & \ GOTO 7680 & 7700 REM *ELVEN CLOAK* & 7705 PRINT "You have found an Elven Cloak +"; & 7710 I=INT(RND^2*L+2) & \ IF RND<.05*(I-1) THEN & GO TO 7710 & ELSE & PRINT FNN1$(I) & 7715 PRINT FNO$("put it on","leave it behind"); & \ A$=FNC$ & \ PRINT & 7720 IF A$=CHR$(13) THEN & C(52)=I & \ GOTO 7770 & 7725 IF A$=CHR$(10) THEN & GO TO 7770 & 7730 PRINT "Ever try a hearing aid?" & \ GOTO 7715 & 7735 REM *ELVEN BOOTS* & 7740 PRINT "You have found a pair of Elven Boots +"; & 7745 I=INT(RND^2*L+2) & \ IF RND<.05*(I-1) THEN & GO TO 7745 & ELSE & PRINT FNN1$(I) & 7750 PRINT FNO$("put them on","leave them behind"); & \ A$=FNC$ & \ PRINT & 7755 IF A$=CHR$(13) THEN & C(53)=I & \ GOTO 7770 & 7760 IF A$=CHR$(10) THEN & GO TO 7770 & 7765 PRINT "HEY, LISTEN STUPID!" & \ GOTO 7750 & 7770 IF RND>.8-.02*(C(15)-1) THEN & GO TO 7500 & ELSE & C(64)=1 & \ GOTO 8000 & 8000 REM *SPECIALS* & 8001 IF C(64)<>1 THEN & GO TO 8005 & 8002 I(6)=0 & \ I(7)=0 & \ I(8)=0 & 8003 L%(C(16),C(17))=1024*I(8)+512*I(7)+256*I(6)+16*I(5)+4*I(2)+I(1) & 8004 IF I(5)=0 THEN & C(64)=2 & \ GOTO 3000 & 8005 CHN$ = "NEWSPC" & \ GOTO 32767 & 13000 REM *DEATH* & 13010 IF C(7)=1 AND C(34)>0 THEN & GO TO 13070 & 13020 PRINT CHR$(10);CHR$(10);CHR$(10);"Another "; & \ IF C(8)<4 THEN & PRINT "not so "; & 13030 PRINT "mighty ";MID("Warrior Cleric Magician",C(7)*8+1,8);" bites the dust" & \ PRINT & \ PRINT & \ PRINT & \ PRINT & 13040 C(I)=0 FOR I=0 TO 64 & 13050 PRINT "Do you wish to try again:"; & \ A$=FNC$ & \ PRINT & \ IF A$<>"Y" THEN & GO TO 14000 & 13060 C(64)=2 & \ CHN$ = "NEWDND" & \ GOTO 32767 & 13070 REM *RAISE DEAD* & 13080 PRINT "RAISE DEAD!!!!" & \ SLEEP 2 & 13090 C(34)=C(34)-1 & 13100 C(4)=C(4)-1 & 13110 IF C(4)=0 OR FNR(1,10)>C(4) THEN & PRINT "It failed!!" & \ GOTO 13000 & 13120 C(11)=FNR(1,C(10)) & \ PRINT "You're alive with";C(11);"hit points," & 13130 PRINT "and a constitution of ";C(4) & \ C(64)=2 & \ GOTO 3000 & 14000 REM *STOP HERE* & 14010 PRINT "Fare well, brave Sir" & \ CHN$ = "EXIT" & \ GOTO 32767 & 14020 STOP & 15000 ! *POSITION PLOT* & ! 15005 PRINT CHR$(10);CHR$(10);CHR$(10); & \ X=C(16) & \ Y=C(17) & \ FOR I=1 TO 11 & \ IF C(36+I)<=0 THEN & GO TO 15015 & 15010 PRINT MID("LGHTPROTSHLDPRAYDTRPSLNCLEVTSTRGFEARINVSTMST",I*4-3,4)+":"; & 15015 NEXT I & \ PRINT & \ PRINT & \ Z9=1 & \ Z0=0 & \ FOR R=-1 TO 2 & \ FOR C=-1 TO 2 & 15020 IF X+R>21 OR Y+C>21 THEN & P%(R+2,C+2)=0 & ELSE & P%(R+2,C+2)=L%(X+R,Y+C) & 15025 NEXT C & \ NEXT R & \ C9=0 & \ Z5$="" & \ IF X=1 THEN & GO TO 15055 & ELSE & IF FNI1(P%(2,2),4)<>0 THEN & GO TO 15055 & 15030 I=FNO(" "+FND3$(1,2)) & 15035 Y1$=" "+FND1$(1,2)+" "+FND1$(1,2+1) & 15040 Y2$=" "+FND2$(1,2)+" "+FND2$(1,2+1) & 15045 IF C(37)>0 THEN & IF FNI1(P%(1,2),9)<>0 THEN & Y2$=FNP$(Y2$,"*",10) & 15050 I=FNO(Y1$) & \ I=FNO(Y2$) & \ I=FNO(Y1$) & 15055 IF Y<>1 THEN & IF FNI1(P%(2,2),3)=0 THEN & Y1$=FND3$(2,2-1) & \ GOTO 15065 & 15060 Y1$=" " & 15065 Y1$=FNP1$(Y1$,FND3$(2,2),7) & 15070 IF FNI1(P%(2,2+1),3)=0 THEN & Y1$=FNP$(Y1$,FND3$(2,2+1),13) & 15075 IF I(4)<>0 THEN & GO TO 15085 & 15080 Y1$=FNP1$(Y1$,FND1$(1,2),7) & \ Y1$=FNP1$(Y1$,FND1$(1,2+1),13) & 15085 I=FNO(Y1$) & \ Y1$,Y2$=SPACE$(19) & \ IF Y=1 THEN & GO TO 15105 & 15090 IF FNI1(P%(2,2),3)<>0 THEN & GO TO 15105 & 15095 Y1$=FNP1$(Y1$,FND1$(2,2-1),1) & \ Y2$=FNP1$(Y2$,FND2$(2,2-1),1) & 15100 IF C(37)>0 THEN & IF FNI1(P%(2,2-1),9)<>0 THEN & Y2$=FNP$(Y2$,"*",4) & 15105 Y1$=FNP1$(Y1$,FND1$(2,2),7) & \ Y2$=FNP1$(Y2$,FND2$(2,2),7) & 15110 Y1$=FNP1$(Y1$,FND1$(2,2+1),13) & \ Y2$=FNP1$(Y2$,FND2$(2,2+1),13) & 15115 IF MID(Y1$,13,1)<>" " THEN & GO TO 15130 & 15120 Y1$=FNP1$(Y1$,FND1$(2,2+2),19) & \ Y2$=FNP1$(Y2$,FND2$(2,2+2),19) & 15125 IF C(37)>0 THEN & IF FNI1(P%(2,2+1),9)<>0 THEN & Y2$=FNP$(Y2$,"*",16) & 15130 Y2$=FNP1$(Y2$,"X",10) & \ Y3$=Y1$ & \ IF I(7)=1 THEN & Y1$=FNP$(Y1$,"$",11) & 15135 IF I(6)=1 THEN & Y1$=FNP$(Y1$,"#",11) & 15140 IF I(6)+I(7)<>0 THEN & GO TO 15150 & 15145 IF I(5)<>0 THEN & Y1$=FNP$(Y1$,MID(" \ /\ /EXCPITTPTFNTALTDGNDGNORBELVTHRTRVRCK",I(5)*3-2,3),9) & 15150 I=FNO(Y1$) & \ I=FNO(Y2$) & \ I=FNO(Y3$) & 15155 IF MID(Y3$,7,1)=" " THEN & Y1$=FND3$(2+1,2-1) & ELSE & Y1$=" " & 15160 Y1$=FNP1$(Y1$,FND3$(2+1,2),7) & 15165 IF MID(Y3$,13,1)=" " THEN & Y1$=FNP1$(Y1$,FND3$(2+1,2+1),13) & 15170 IF MID(Y1$,10,1)<>" " THEN & GO TO 15180 & 15175 Y1$=FNP1$(Y1$,FND1$(2+1,2),7) & \ Y1$=FNP1$(Y1$,FND1$(2+1,2+1),13) & 15180 I=FNO(Y1$) & \ IF MID(Y1$,10,1)<>" " THEN & GO TO 15205 & 15185 Y1$=" "+FND1$(2+1,2)+" "+FND1$(2+1,2+1) & 15190 Y2$=" "+FND2$(2+1,2)+" "+FND2$(2+1,2+1) & 15195 IF C(37)>0 THEN & IF FNI1(P%(2+1,2),9)<>0 THEN & Y2$=FNP$(Y2$,"*",10) & 15200 Y3$=" "+FND3$(2+2,2) & \ I=FNO(Y1$) & \ I=FNO(Y2$) & \ I=FNO(Y1$) & \ I=FNO(Y3$) & 15205 PRINT Z5$ & \ RETURN & 20000 REM *LIST SPELLS* & 20005 IF C(7)=1 THEN & I=4 & ELSE & I=0 & 20010 I=I+A & \ PRINT & 20015 PRINT FNN1$(I1);". ";TRM$(S$(I,I1)) FOR I1=1 TO 4-2*(I<5) & 20020 RETURN & 20025 PRINT & \ RETURN & 20050 ! *INITIALIZE DATA* & 20100 REM *INITALIZE JOB DATA & 20105 J=1 !JOB# 20110 P1,P2=0 !PPN 20115 RETURN & 20600 REM *LEVEL?* & 20605 IF C(9)>=FNE(C(8)) THEN & GO TO 20635 & 20610 PRINT "You went down a level!" & \ I1=FNR(1,4+2*(2-C(7))) & 20615 IF C(4)>14 THEN & I1=I1-14+C(4) & 20620 PRINT "You lost";I1;"hit points" & \ C(10)=C(10)-I1 & \ C(11)=C(11)-I1 & \ C(8)=C(8)-1 & 20625 IF C(8)<1 OR C(11)<1 THEN & PRINT "You died!" & \ SLEEP 2 & \ GOTO 13000 & 20630 GOSUB 20700 & \ RETURN & 20635 IF C(9)14 THEN & I1=I1-14+C(4) & 20650 PRINT "You gain";I1;"hit point(s)" & \ C(10)=C(10)+I1 & \ C(11)=C(11)+I1 & \ C(8)=C(8)+1 & 20655 IF C(9)>=FNE(C(8)+1) THEN & C(9)=FNE(C(8)+1)-1 & 20660 GOSUB 20700 & \ RETURN & 20700 REM *SPELL PROGRESSION* & 20705 IF C(7)=0 THEN & RETURN & 20710 FOR I7=1 TO 4 & \ IF C(7)=1 THEN & I8=C(8)-INT((I7+1)/.75)+1 & 20715 IF C(7)=2 THEN & I8=C(8)-INT(I7/.8)+1 & 20720 IF I8<0 THEN & I8=0 & 20725 IF I7=1 THEN & I8=I8+2 & 20730 C(30+I7)=C(30+I7)+I8-C(24+I7) & \ C(24+I7)=I8 & \ NEXT I7 & \ RETURN & 20800 REM *DETECT TRAPS* & 20805 IF C(41)>0 AND I(8)=1 AND RND>.10 THEN & PRINT & \ PRINT "You detect traps"; & 20810 RETURN & 20900 DEF FND(L) !DAMAGE TAKEN & 20905 I1=INT(RND*(L*(4-C(7)))+1) & \ IF RND>.7 THEN & I1=I1+1 & \ GOTO 20905 & 20910 PRINT "You suffer";I1;"hit points" & \ C(11)=C(11)-I1 & 20915 IF C(11)>0 THEN & FND=1 & ELSE & PRINT "Your life has been terminated" & \ FND=-1 & 20920 FNEND & 21000 REM *EXPERIENCE CHANGE* & 21005 I1=FNR(1,2) & \ I2=INT(RND*500+1)*C(15) & \ PRINT "You just "; & 21010 IF I1=1 THEN & PRINT "lost"; & ELSE & PRINT "gained"; & 21015 PRINT I2;"experience points" & \ C(9)=C(9)+SGN(I1-1.5)*I2 & \ GOSUB 20600 & \ RETURN & 21100 REM *STAT CHANGE* & 21105 I1=FNR(1,2) & \ I2=FNR(1,6) & \ I3=1 & 21110 IF RND+C(15)*.02>.9 THEN & I3=I3+1 & \ GOTO 21110 & 21115 I3=I3-1 WHILE (C(I2)+SGN(I1-1.5)*I3<1) & 21120 PRINT "Your ";FNS$(I2);" just went "; & \ IF I1=1 THEN & PRINT "down"; & ELSE & PRINT "up"; & 21125 PRINT " by";I3 & \ C(I2)=C(I2)+SGN(I1-1.5)*I3 & \ PRINT "It is now";C(I2) & \ RETURN & 32767 SUBEND