1 SUB NEWDND(CHN$) 22 COM (DNDA) N$(1)=8,C(64),L%(21,21),I(8),I1(8) & \DIM #9,N3$(1000)=32 !ORB FINDERS FILE & \DIM C1(30) !TEMP HOLD & \DIM #8,N2$(100,1)=8,C2(100,64) !MAIN CHAR FILE & \DIM #5,D$(20)=16,S1%(20),L1%(23999) !LEVEL DATA & 82 DEF FNR(A,B) !ROLL A B SIDED DICE & \Z=0 & \Z=Z+INT(RND*B+1) FOR Z1=1 TO A & \FNR=Z & \FNEND & 86 DEF FNE(L) !EXPERIENCE FOR LEVEL L & 87 IF L>10 THEN & Z2=L-10 \Z2=Z2^1.5 & \Z=FNE(10)+INT(FNE(10)*Z2) & \GOTO 92 & 88 IF C(7)=0 THEN & Z=2000 & ELSE & IF C(7)=2 THEN & Z=2500 & ELSE & Z=1500 & 90 Z=Z*2 FOR Z1=3 TO L & \IF L=1 THEN & Z=0 & 92 FNE=Z & 93 FNEND & 100 GOSUB 10000 & \IF R=2% THEN PRINT "?You are restricted from this program." & \CHN$="EXIT" & \GOTO 32767 & 101 E=C(64) & \IF E<2 OR E>3 THEN 109 & ELSE ON E-1 GOTO 1550,1000 & 109 PRINT CHR$(12); & \PRINT "Welcome to Dungeons and Dragons!" & \PRINT & \PRINT & 110 ON ERROR GOTO 150 & \OPEN "GAME:DNDNOT.DAT/MO:8192" FOR INPUT AS FILE 2% & \PRINT "Current note:" & \PRINT & \WHILE -1% & \INPUT LINE #2%, N1$ & \PRINT N1$; & \NEXT & 150 PRINT CHR$(10%) IF ERR=11% & \RESUME 180 & 160 OPEN "GAME:DNDORB.DAT" FOR OUTPUT AS FILE 9% & \N3$(0%)="0" & \RESUME 180 & 180 CLOSE #2 & \ON ERROR GOTO 160 & \OPEN "Game:DNDORB.dat/MO:8192" FOR INPUT AS FILE #9, VIRTUAL & \GOTO 270 IF VAL(N3$(0%))=0% & \I=RCTRLO(0%) ! CANCEL ^O & \PRINT "DND ORB finding characters are:" & \PRINT & \PRINT N3$(U) FOR U=1 TO VAL(N3$(0)) & 270 CLOSE #9 & \ON ERROR GOTO 0 & \PRINT & 400 DEF FNC$ !SINGLE CHAR INPUT SYS FUNCITON VERSION & \CALL IN1CHR(CHAR%) & \FNC$=CHR$(CHAR%) & \FNEND & 435 DEF FNS$(I)=MID(S$,I*3-2,3) !STAT NAMES & 440 DEF FNT$(J) !2 CHAR NUMBER & \Z1$=FNN1$(J) & \IF LEN(Z1$)<2 THEN & Z1$="0"+Z1$ & 450 FNT$=Z1$ & \FNEND & 600 DEF FNN1$(N)=NUM1$(N) & 1000 PRINT "Hit ";CHR$(34);"L";CHR$(34);" for list of options." & 1020 I=RCTRLO(0%) & \PRINT "Dnd> "; & \C$=FNC$ & \IF C$=CHR$(3) THEN & C$="E" & 1024 IF C$=CHR$(13) THEN & PRINT & \GOTO 1020 & 1030 I=INSTR(1,"RCPKIEOLSF",C$) & \IF I=0 THEN & PRINT & \PRINT "%Illegal option." & \GOTO 1000 & 1050 ON I GOTO 1100,1400,1600,1800,2200,2400,2600,2800,1600,3200 & 1100 REM *RUN* & 1105 PRINT "Run" & \IF R=0 THEN & PRINT "%Restricted option." & \GOTO 1020 & 1107 ON ERROR GOTO 1180 & \OPEN "Game:DNDCHR.dat" FOR INPUT AS FILE #8, VIRTUAL & \GOTO 1205 IF (STATUS AND 1024%)<>0% & 1120 I%=ECHO(0%) & \PRINT "What is your name noble Sir "; & \INPUT LINE N$ & \I%=NOECHO(0%) & \N$=LEFT(N$,LEN(N$)-2) & \N$=LEFT(N$,8%) !8chr only & \I=FNFIND%(N$) & \GOTO 1140 IF I<>0 & \PRINT "%No such character." & \CLOSE #8 & \ON ERROR GOTO 0 & \GOTO 1020 & 1140 PRINT EDIT$(N2$(I,0),136%);"'s SECRET NAME is "; & \INPUT LINE N6$ & \N6$=LEFT(N6$, LEN(N6$)-2%) & \N6$=CVT$$(N6$,-1%) & \N6$=LEFT(N6$,8%) & \PRINT & \PRINT & \IF EDIT$(N6$,39)<>EDIT$(N2$(I,1),39) THEN & PRINT "%Body Snatcher!!!!" & \ON ERROR GOTO 0 & \GOTO 2400 & 1155 N$(0)=N2$(I,0) & \N$(1)=N2$(I,1) & \FOR I1=0 TO 64 & \C(I1)=C2(I,I1) & \C2(I,I1)=0 & \NEXT I1 & \IF C(15)=0 THEN GOSUB 1530 & 1168 C(60)=PEEK(512%) !THE CURRENT DATE & \N2$(I,0)="" & \N2$(I,1)="" & \CLOSE #8 & \ON ERROR GOTO 0 & \GOTO 1510 & 1180 PRINT "%There is no character file (DNDCHR)." IF ERR=5% & \CLOSE 8% & \I%=NOECHO(0%) & \RESUME 1185 & 1185 ON ERROR GOTO 0 & \GOTO 1020 & 1205 PRINT "[File busy - please wait]" & \SLEEP 2 & \GOTO 1107 & 1400 REM *CREATE* & 1405 PRINT "Create" & \IF R=0 THEN & PRINT "%Restricted option." & \GOTO 1020 & 1422 PRINT CHR$(12); & \PRINT "Press to run this character, to try again"; & \PRINT ", or "; CHR$(34);"Q";CHR$(34);" to quit." & 1430 C1(I)=INT(RND*8+1)+INT(RND*6+1)+4 FOR I=1 TO 6 & 1440 PRINT TAB((I-1)*8+1);FNS$(I);" ";FNT$(C1(I)); FOR I=1 TO 6 & \A$=FNC$ & \IF A$="Q" THEN & PRINT & \GOTO 1020 & 1450 IF A$=CHR$(10) THEN & PRINT CHR$(13); & \GOTO 1430 & 1460 IF A$<>CHR$(13) THEN & PRINT & \PRINT "Read the directions!!! ";CHR$(13); & \SLEEP 4 & \GOTO 1440 & 1465 PRINT & \C(I)=C1(I) FOR I=1 TO 6 & \C(0)=1 & 1470 I%=ECHO(0%) & \PRINT "What is your name noble Sir "; & \ON ERROR GOTO 1180 & \INPUT LINE N$ & \I%=NOECHO(0%) & \ON ERROR GOTO 0 & \N$=LEFT(N$,LEN(N$)-2) & \N$=LEFT(N$,8%) & \IF (EDIT$(N$,7%) = "") THEN & PRINT "No-one but a monster has no name." & \GOTO 1470 & 1472 ON ERROR GOTO 1580 & \OPEN "Game:DNDCHR.dat/MO:8192" FOR INPUT AS FILE #8, VIRTUAL & \ON ERROR GOTO 0 & \FOR I%=1% TO 100% & \IF EDIT$(N$,-1%) = EDIT$(N2$(I%,0%),-1%) THEN IF C2(I%,0) > 0 THEN & PRINT '"How dare you steal my name!", quoth the mighty '; & EDIT$(N2$(I%,0%),136%); '.' & \ PRINT "Please choose another name." & \ CLOSE #8 & \ GOTO 1470 & 1473 NEXT I% & \CLOSE #8 & 1475 N$(0)=N$ & \PRINT "What is ";N$;"'s SECRET NAME "; & \ON ERROR GOTO 1180 & \INPUT LINE N1$ & \ON ERROR GOTO 0 & \N1$=LEFT(N1$,LEN(N1$)-2) & \N1$=LEFT(N1$,8%) & \PRINT & \N$(1)=N1$ & 1485 PRINT "What character class--(F)ighter,(C)leric, or (M)agic user?"; & \A$=FNC$ & \IF INSTR(1,"FCM",A$)<>0 THEN & C(7)=INSTR(1,"FCM",A$)-1 & ELSE & PRINT & \PRINT "Wake up, Jose!!" & \GOTO 1485 & 1492 PRINT MID("FighterCleric Magic ",C(7)*7+1,7) & \C(10)=6+2*(2-C(7)) & \C(11)=C(10) & \C(8)=1 & \C(I)=0 FOR I=12 TO 64 & \C(59)=PEEK(512%) & \C(60)=PEEK(512%) !THE CURRENT DATE & \IF C(4)>14 THEN & C(10)=C(10)+C(4)-14 & \C(11)=C(10) & 1498 C(15)=0 & \C(19)=15 & \C(20)=2 & \GOSUB 1530 & \IF C(7)=2 THEN & C(22)=0 & \C(25)=3 & \C(31)=3 & \C(24)=-1 & 1506 IF C(7)=1 THEN & C(25)=2 & \C(31)=2 & 1507 C(48)=P1 & \C(49)=P2 & \C(9)=0 & 1510 PRINT "You are now descending into the dungeon:" & \PRINT "Please wait while we force open the main door..."; & \PRINT & \CHN$ = "NEWDGN" & \C(64)=0 & \GOTO 32767 & 1530 Print 'You may now choose the Dungeon for your adventure.' & 1533 Print "The choices are:" & \FOR D=1 TO 6 & \PRINT " ["; CHR$(D+48); "] "; TRM$(D$(D)) UNLESS S1%(6+D)=-1% & \NEXT D & \Print "Hit the number of the dungeon wanted, or to "; & \IF C(18)=0 & THEN PRINT "let me choose." & ELSE PRINT "continue in the same dungeon." & 1540 PRINT 'Dungeon number ?'; & \D=ASCII(FNC$)-48 & \IF D<>(13-48) AND (D<1 OR D>6) & THEN GOTO 1533 & 1541 IF D=(13-48) & THEN IF C(18)=0 & THEN D=FNR(1,6) & ELSE D=-C(18) & 1542 IF S1%(6+D)=-1% THEN PRINT & \PRINT "%That dungeon is closed for repairs." & \PRINT "-Please select another (sorry)." & \PRINT & \GOTO 1533 & 1543 C(18)=-D & \PRINT TRM$(D$(D)) & \RETURN & 1550 REM CHAR CREATE ENTRY & 1570 PRINT "Dnd> "; & \GOTO 1400 & 1580 STOP IF ERR<>5% & \OPEN "GAME:DNDCHR.DAT" FOR OUTPUT AS FILE 8%, VIRTUAL & \C2(X%,0%)=0% FOR X%=1% TO 100% & \CLOSE 8 & \RESUME 1472 & 1590 PRINT & \PRINT "%No character file." & \RESUME 1595 & 1595 ON ERROR GOTO 0 & \GOTO 1020 & 1597 I.%=(C$="S") & 1598 PRINT "Listing sub-option : "; & \C$=FNC$ & \I=INSTR(1%,"AMWD",C$) & \PRINT LEFT(C$,1%) & \IF I=0 THEN PRINT "%Invalid sub-option" & \PRINT " A - List all players" & \PRINT " M - List only your players" & \PRINT " W - List players in a project group" & \PRINT " D - List players in a dungeon" & \PRINT & \GOTO 1598 & 1599 RETURN & 1600 REM *LIST PLAYERS* & 1605 PRINT "List players" & \ON ERROR GOTO 1590 & \OPEN "Game:DNDCHR.dat/MO:8192" FOR INPUT AS FILE #8, VIRTUAL & \ON ERROR GOTO 0 & \GOSUB 1597 & \I%=ECHO(0%) & \ON ERROR GOTO 1180 & \INPUT "Project number "; PROG% IF C$='W' & \PROG%=P1 IF C$='M' & \INPUT "Dungeon number "; DUNGEON% IF C$='D' & \I%=NOECHO(0%) & \ON ERROR GOTO 0 & \PRINT & \IF I.% THEN GOSUB 3005 & \GOTO 1615 & 1610 PRINT "Character Level Str Int Wis Con Dex Cha Hits Ring DGN #"; & \PRINT " Ppn Type" & \PRINT "--------- ----- --- --- --- --- --- --- ---- ----"; & \PRINT " ----- --------- ----" & & 1615 FOR I=1 TO 100 & \IF C2(I,0)<>1 THEN & GO TO 1618 & ELSE & GOTO 1618 IF C$="M" AND (P1<>C2(I,48) OR P2<>C2(I,49)) & \GOTO 1618 IF C$="W" AND PROG%<>C2(I,48) & \GOTO 1618 IF C$="D" AND C2(I,18)<>-DUNGEON% & \IF I.% THEN GOSUB 3020 ELSE GOSUB 1620 & 1618 NEXT I & \CLOSE 8 & \GOTO 1020 & 1620 PRINT N2$(I,0);TAB(13%); & \PRINT FNN1$(C2(I,8));TAB(18%); & \PRINT FNT$(C2(I,I1));" "; FOR I1=1 TO 6 & \PRINT " ";FNN1$(C2(I,10%));TAB(49%); & \PRINT "none"; IF C2(I,51%)<1% & \PRINT "+";FNN1$(C2(I,51%)); IF C2(I,51%)>0% & \PRINT TAB(57%);FNN1$(ABS(C2(I,18%))); & \PRINT TAB(62);"[";FNN1$(C2(I,48));",";FNN1$(C2(I,49));"]"; & \PRINT TAB(72);"*"; IF (C2(I,15) <> 0) & \PRINT TAB(73);"+"; IF (C2(I,61) <> 0) & 1633 SPELLS=0 & \SPELLS=SPELLS+C2(I,TEMP%) FOR TEMP%=25% TO 30% & \IF ((SPELLS <> 0) AND (C2(I,7) = 0)) THEN & PRINT TAB(74); "F/MU" & ELSE & SPELLS=SPELLS+C2(I,TEMP%) FOR TEMP%=31% TO 36% & \IF ((SPELLS <> 0) AND (C2(I,7) = 0)) THEN & PRINT TAB(74); "HERO" & ELSE & PRINT TAB(74);MID("FGTRCLRCMAGE",4*C2(I,7)+1,4) & 1635 RETURN & 1800 REM *KILL* & 1805 PRINT "Kill" & \IF R=0 THEN & PRINT "%Restricted option." & \GOTO 1020 & 1806 ON ERROR GOTO 1590 & 1807 OPEN "Game:DNDCHR.dat" FOR INPUT AS FILE #8, VIRTUAL & \ON ERROR GOTO 0 & \GOTO 1900 IF ((STATUS AND 1024%) <> 0%) 1810 I%=ECHO(0%) & \ON ERROR GOTO 1180 & \PRINT "What is your name noble Sir"; & \INPUT LINE N$ & \I%=NOECHO(0%) & \N$=LEFT(N$,LEN(N$)-2) & \N$=LEFT(N$,8%) & 1815 I=FNFIND%(N$) & \GOTO 1825 IF I<>0 & 1820 PRINT "%No such character." & \CLOSE #8 & \ON ERROR GOTO 0 & \GOTO 1020 & 1825 GOTO 1840 IF P1=1 & \PRINT N$;"'s SECRET NAME is"; & \INPUT LINE N1$ & \ON ERROR GOTO 0 & 1830 N1$=LEFT(N1$,LEN(N1$)-2) & \N1$=LEFT(N1$,8%) & \PRINT 1835 IF EDIT$(N1$,39)<>EDIT$(N2$(I,1),39) THEN & PRINT "%Grave robber!!!" & \GOTO 2400 & 1840 PRINT "Are you sure you wish to die?"; & \A$=FNC$ & 1845 IF A$<>"Y" THEN & PRINT "No" & \CLOSE #8 & \GOTO 1020 & 1850 PRINT "Yes" & \C2(I,0)=0 & \PRINT "Goodbye life.....ARRRGGG.G..G.. . . ." & 1855 CLOSE #8 & \GOTO 1020 & 1900 ! **no write access** & 1905 PRINT "[File busy - please wait]" & \SLEEP 2 & \GOTO 1806 & 2200 PRINT "Instructions" & \ON ERROR GOTO 2250 & \OPEN "GAME:DND.DOC" FOR INPUT AS FILE 10%, MODE 8192% & \WHILE -1% & \INPUT LINE #10%,N$ & \PRINT N$; UNLESS P1<>1 AND LEFT(N$,1%)="!" & \NEXT & 2250 PRINT "%Can't find instruction file GAME:DND.DOC." IF ERR<>11% & \RESUME 2260 & 2260 ON ERROR GOTO 0 & \GOTO 1020 & 2400 REM *EXIT* & 2405 C(64)=0 & 2410 PRINT "Exit" & \CHN$ = "EXIT" & \GOTO 32767 & 2600 REM *OPERATOR PROGRAM* & 2605 PRINT "Operator" & 2610 IF P1<>1 THEN & PRINT "% 'Operator' is a privileged command." & \GOTO 1020 & 2620 CHN$ = "NEWOP" & \GOTO 32767 & 2800 REM *LIST OPTIONS* & 2810 PRINT "List Options" & \PRINT "Options are:" & \PRINT & \PRINT "R Run a character" & \PRINT "C Create a character" & \PRINT "K Kill a character" & \PRINT "P List character data (attributes, hits, rings, etc...)" & \PRINT "S List character status (dates, gold, exp., etc...)" & \PRINT "F Find experience needed for a level" & \PRINT "I Instructions" & \PRINT "E Exit dungeon" & \PRINT "O Go to operator program (privileged option)" & \PRINT "L List options (this message)" & \GOTO 1020 & 3000 REM *status* & 3005 PRINT "Character Created Last Used Gold Experience"; & \PRINT " Ppn Type" & \PRINT "--------- --------- --------- ------------ ------------"; & \PRINT " --------- ----" & \RETURN & 3020 PRINT N2$(I,0);TAB(11%); & \PRINT DATE$(C2(I,59)); " "; DATE$(C2(I,60));" "; & \PRINT TAB(32%);FNN1$(C2(I,13%)); & \PRINT TAB(46);FNN1$(C2(I,9)); & \PRINT TAB(60);"[";FNN1$(C2(I,48));",";FNN1$(C2(I,49));"]"; & \PRINT TAB(70);"*"; IF (C2(I,15) <> 0) & \PRINT TAB(71);"+"; IF (C2(I,61) <> 0) & \SPELLS=0 & \SPELLS=SPELLS+C2(I,TEMP%) FOR TEMP%=25% TO 30% & \IF ((SPELLS <> 0) AND (C2(I,7) = 0)) THEN & PRINT TAB(72); "F/MU" & ELSE & SPELLS=SPELLS+C2(I,TEMP%) FOR TEMP%=31% TO 36% & \IF ((SPELLS <> 0) AND (C2(I,7) = 0)) THEN & PRINT TAB(72); "HERO" & ELSE & PRINT TAB(72);MID("FGTRCLRCMAGE",4*C2(I,7)+1,4) & 3035 RETURN & 3200 REM *FIND EXPERIENCE FOR LEVEL* & 3205 PRINT "Find experience for level." & 3210 PRINT "For what character class Sire?" & 3220 PRINT " (M)agician, (C)leric, OR (F)ighter ?"; & \A$=FNC$ & \I=INSTR(1,"FCM",A$) & \IF I=0 THEN & PRINT & \PRINT "Come on you jerk!" & \GOTO 3220 & 3240 PRINT MID("Fighter Cleric Magician",8*I-7,8) & 3250 C(7)=I-1 3260 I%=ECHO(0%) & \ON ERROR GOTO 1180 & \PRINT "For level"; & \INPUT L & \ON ERROR GOTO 0 & 3270 I%=NOECHO(0%) & \PRINT "You need ";FNN1$(FNE(L));" experience for level ";NUM1$(L);"." & 3280 GOTO 1020 & 10000 REM *GET PPN AND RESTRICTION* & 10010 PPN%=PEEK(PEEK(PEEK(520%)+8%)+24%) & \P1=SWAP%(PPN%) AND 255% & \P2=PPN% AND 255% & \J=1 & 10040 S$="StrIntWisConDexCha" & 10050 ON ERROR GOTO 11000 & \R=1 & 10060 OPEN "GAME:DNDPPN.DAT" FOR INPUT AS FILE 11%, MODE 8192% & 10070 MATCH%=5% & \WHILE -1% & \INPUT #11%,RP1%,RP2%,R% & \IF RP1%=P1 AND RP2%=P2 THEN R=R% \ MATCH%=1% ELSE & IF RP1%=P1 AND RP2%=255% AND MATCH%>1% THEN R=R% \MATCH%=2% ELSE & IF RP1%=255% AND RP2%=P2 AND MATCH%>2% THEN R=R% \MATCH%=3% ELSE & IF RP1%=255% AND RP2%=255% AND MATCH%>3% THEN R=R% \MATCH%=4% & 10100 NEXT & 11000 RESUME 11100 & 11100 ON ERROR GOTO 0 & \RETURN & 12000 DEF FNFIND%(NAME.$) & \FNFIND%=0% & \GOTO 12020 IF EDIT$(NAME.$,-1%)="" & \FOR I.%=1 TO 100 & \IF EDIT$(NAME.$,-1%)=EDIT$(N2$(I.%,0),-1%) THEN & IF C2(I.%,0)=1 THEN FNFIND%=I.% & \GOTO 12020 & 12010 NEXT I.% & 12020 FNEND & 32767 SUBEND