10 REM CAVES.ECB 100 REM ..*** CAVES1 *** Source ??? via EAGAN REH 3-81 110 REM ..*** PROGRAM MAKES A SET OF LINKED ROOMS 120 REM ..for you to explore : Revised 3-10-81 R.E.H. 130 DIM N(127),P(385),L(99) 140 DEF FNP(X)=INT(P(X)/512) 150 DEF FNN(X)=P(X)-INT(P(X)/512)*512 160 LET G=1,G2=1 170 PRINT "&K&J&J" 180 PRINT "WELCOME TO THE CAVES" 190 PRINT : PRINT : PRINT 200 PRINT "IS THIS YOUR FIRST VISIT (Y=YES, N=NO) ---=>"; 210 INPUT (1,0)X$: LET X$=X$+"Y" 220 LET X$=X$(1,1) 230 IF X$(1,1)="Y" THEN 290 235 IF X$(1,1)="y" THEN 290 240 PRINT 250 PRINT " 1 = USUAL, 2 = HARDER, 3 = !!! ---=>"; 260 INPUT G 270 LET G=ABS(G) 280 IF G<4 THEN 290 ELSE LET G=3 290 LET V1=0 300 GOSUB 1850 310 LET R=2 320 LET I=1 325 PRINT "&J+*+ I need a minute to set up the CAVES +*+&J" 330 GOSUB 1280 340 GOSUB 1420 350 LET J=1 360 GOSUB 1370 370 GOSUB 1420 380 LET J=J+1 390 IF J<=G-1 THEN 360 ELSE LET I=I+1 400 IF I<=4 THEN 330 ELSE LET W=R-1 410 IF G2>1 THEN 630 ELSE PRINT 420 PRINT "DO YOU WANT AN INTRODUCTION (Y=YES, N=NO) ---=>"; 430 INPUT (1,0)X$: LET X$=X$+"N" 440 LET X$=X$(1,1) 450 IF X$(1,1)="N" THEN 630 ELSE PRINT 460 PRINT 470 PRINT " IMAGINE YOURSELF AN EXPLORER OF THE FAMOUS" 480 PRINT "DUZZLEDORF CAVES. YOU'VE BEEN UNDERGROUND" 490 PRINT "FOR DAYS, TRIPPING THROUGH THE CAVERNS AND" 500 PRINT "TUNNELS. UNFORTUNATELY, YOU'RE LOST, AND" 510 PRINT "YOUR FOOD HAS RUN OUT." 520 PRINT 530 PRINT " THERE IS ONLY ONE PATH OUT. SEE IF YOU" 540 PRINT "CAN FIND IT." 550 PRINT 560 PRINT "GIVE ME THE NUMBER" 570 PRINT "OF THE CAVERN YOU WANT TO GO TO. LIKE THIS:" 580 PRINT 590 PRINT 600 PRINT "ADVICE: MAKE A MAP AS YOU GO - IN THE HARDER CAVES" 610 PRINT " YOU SOMETIMES HAVE TO GO BACK AND TRY ANOTHER" 620 PRINT " WAY. GOOD LUCK!" 630 LET D1=1 640 LET V1=8 650 GOSUB 1850 660 LET X=9999 670 PRINT 680 PRINT "YOU'RE IN CAVERN #";N1 690 LET D1=9999 700 LET V1=7 710 LET I=1 720 GOSUB 1850 730 PRINT "#";D1;" "; 740 IF D1=W THEN 770 ELSE LET I=I+1 750 IF I<=3 THEN 720 760 IF N1=1 THEN 830 770 LET V1=4 780 GOSUB 1850 790 PRINT "#";N1;" "; 800 LET X=N1 810 LET V1=6 820 GOSUB 1850 830 PRINT "ARE WHERE YOU CAN GO" 840 PRINT "WHERE NEXT ---=>"; 850 INPUT D1 860 IF D1=N1 THEN 840 870 IF D1=X THEN LET V1=4 ELSE 900 880 GOSUB 1850 890 GOTO 670 900 LET V1=6 910 GOSUB 1850 920 IF V2>0 THEN 940 ELSE PRINT "ILLEGAL MOVE" 930 GOTO 840 940 IF N1=W THEN 1010 ELSE LET D1=9999 950 LET V1=7 960 GOSUB 1850 970 IF D1=9999 THEN PRINT "DEADEND" ELSE 670 980 LET V1=4 990 GOSUB 1850 1000 GOTO 840 1010 PRINT "&K" 1020 PRINT 1030 PRINT TAB(10);"!!! SUNLIGHT !!!" 1040 PRINT 1050 PRINT TAB(10);"!!! FRESH AIR !!!" 1060 PRINT 1070 PRINT TAB(10);"... REPORTERS ..." 1080 PRINT 1090 PRINT 1100 PRINT "WELL, AT LEAST YOU'RE OUT" 1110 IF G>1 THEN 1160 ELSE PRINT 1120 PRINT "CONGRATULATIONS, INTREPID EXPLORER" 1130 PRINT "OF THE FEARSOME CAVES. IF YOU WANT TO" 1140 PRINT "EXPLORE AGAIN, YOU CAN CHOOSE A HARDER SET" 1150 PRINT "OF CAVES OR ANOTHER ONE JUST AS DIFFICULT" 1160 PRINT 1170 PRINT "PLAY AGAIN? (Y=YES, N=NO) ---=>"; 1180 INPUT (1,0)X$: LET X$=X$+"Y" 1190 LET X$=X$(1,1) 1195 IF X$(1,1)="n" THEN 1260 1200 IF X$(1,1)="N" THEN 1260 ELSE LET G2=G2+1 1210 IF G=3 THEN 270 1220 PRINT "HARDER GAME? (Y OR N) ---=>"; 1230 INPUT X$: LET X$=X$+"Y" 1240 LET X$=X$(1,1) 1250 IF X$(1,1)="Y" THEN LET G=G+1 ELSE PRINT 1260 IF X$(1,1)="Y" THEN 270 ELSE PRINT "BYE" 1270 GOTO 3790 1280 REM ..*** ADD DAUGHTERS TO CURRENT NODE 1290 LET V1=1 1300 LET J1=1 1310 IF R=50 THEN 1360 ELSE LET D1=R 1320 GOSUB 1850 1330 LET R=R+1 1340 LET J1=J1+1 1350 IF J1<=3 THEN 1310 1360 RETURN 1370 REM ..*** CREATE DAUGHTERS, AND RETURN 1380 GOSUB 1280 1390 LET V1=4 1400 GOSUB 1850 1410 RETURN 1420 REM ..*** PICK A DAUGHTER NODE AT RANDOM AND GO DOWN 1430 LET V1=7 1440 LET J1=1 1450 LET J2=INT(RND(0)*3)+1 1460 GOSUB 1850 1470 IF D1=9999 THEN 1460 ELSE LET J1=J1+1 1480 IF J1<=J2 THEN 1460 ELSE LET V1=6 1490 GOSUB 1850 1500 LET D1=9999 1510 LET V1=7 1520 GOSUB 1850 1530 IF D1=9999 THEN 1560 ELSE LET V1=4 1540 GOSUB 1850 1550 GOTO 1430 1560 RETURN 1570 REM ..*** TREE SUBROUTINES BEGIN *** 1580 REM ..SACRED NAMES: N(127),P(385),L(99),N9,P1,P2,P3,P4,P5,P9, 1590 REM .. L1,FND,FNN,FNU 1600 REM ..ARGUMENT: V1,V2,N1,D1 1610 REM ..N1 IS NAME OF CURRENT NODE (FOR TOP NODE, N1=1) 1620 REM ..D1 IS NAME OF DAUGHTER NODE 1630 REM ..NODE NAMES CAN BE ANY NUMBER EXCEPT 9999 1640 REM .. 1650 REM ..V1= 0 INITIALIZE TREE; MAKE #1 THE CURRENT NODE 1660 REM .. 1 ADD D1 AS NEXT DAUGHTER TO CURRENT NODE 1670 REM .. 2 CUT D1 OFF FROM CURRENT NODE (BUT LEAVE IT AND 1680 REM .. ALL BELOW IT) 1690 REM .. 3 PRUNE D1 (AND ALL BELOW IT) FROM TREE 1700 REM .. 4 GO UP FROM N1 TO MOTHER NODE (UNLESS AT TOP) 1710 REM .. 5 GO UP FROM N1 THE WAY YOU CAME (UNLESS AT TOP) 1720 REM .. 6 GO DOWN TO D1 FROM CURRENT NODE (IF LEGAL) 1730 REM .. 7 RETURN WITH NEXT DAUGHTER NODE (AFTER D1) IN D1 1740 REM .. IF NO MORE, D1=9999 1750 REM .. IF D1 ISN"T A DAUGHTER OF CURRENT NODE, RETURN WITH 1760 REM .. FIRST DAUGHTER NODE 1770 REM .. 8 RESET CURRENT NODE TO D1, WHEREVER IT IS IN TREE 1780 REM .. 1790 REM ..V2= 2 INSTRUCTION CARRIED OUT, BUT D1 IS A NEW NODE NAME 1800 REM .. 1 INSTRUCTION CARRIED OUT 1810 REM .. -1 CANNOT MOVE UP (OR DOWN) BECAUSE ON TOP (BOTTOM) 1820 REM .. -2 MORE THAN 127 NODES 1830 REM .. -3 TOO MANY CONNECTIONS 1840 REM .. -4 D1 IS NOT A NODE NAME 1850 REM ..***ENTRY POINT FOR TREE SUBROUTINES 1860 LET V2=1 1870 ON V1+1 GOTO 1880,1900,1920,1940,1960,1980,2000,2020,2040 1880 GOSUB 2070 1890 GOTO 2050 1900 GOSUB 2240 1910 GOTO 2050 1920 GOSUB 2460 1930 GOTO 2050 1940 GOSUB 2590 1950 GOTO 2050 1960 GOSUB 3120 1970 GOTO 2050 1980 GOSUB 3220 1990 GOTO 2050 2000 GOSUB 3330 2010 GOTO 2050 2020 GOSUB 3460 2030 GOTO 2050 2040 GOSUB 3600 2050 LET N1=N(P1) 2060 RETURN 2070 LET N(1)=1 2080 FOR P1=2 TO 127 2090 LET N(P1)=9999 2100 NEXT P1 2110 REM ..^ 7530-7550=V1=0= INITIALIZE TREE ^ 2120 LET N9=2 2130 FOR P1=2 TO 384 2140 LET P(P1)=P1+1 2150 NEXT P1 2160 LET P(1)=0 2170 LET P(127)=0 2180 LET P(385)=0 2190 LET P1=1 2200 LET P2=1 2210 LET P9=128 2220 LET L1=1 2230 RETURN 2240 REM ..*** V1=1 *** 2250 REM ..*** ADD D1 AS THE NEXT DAUGHTER TO CURRENT NODE 2260 GOSUB 3660 2270 IF P2>0 THEN 2350 2280 IF N9=0 THEN LET V2=-2 ELSE 2300 2290 RETURN 2300 LET V2=2 2310 LET N(N9)=D1 2320 LET P2=N9 2330 LET N9=P(N9) 2340 LET P(P2)=0 2350 LET P3=P1 2360 IF FNN(P3)=0 THEN 2380 ELSE LET P3=FNN(P3) 2370 IF FNP(P3)=P2 THEN 2440 ELSE 2360 2380 IF P9=0 THEN LET V2=-3 ELSE 2400 2390 RETURN 2400 LET P(P3)=P(P3)+P9 2410 LET P3=P9 2420 LET P9=P(P9) 2430 LET P(P3)=P2*512 2440 IF FNP(P2)=0 THEN LET P(P2)=P(P2)+P1*512 ELSE 2450 2450 RETURN 2460 REM ..*** V1=2 *** 2470 REM ..*** CUT D1 OFF FROM CURRENT NODE (BUT LEAVE IT & ALL BELOW) 2480 GOSUB 3660 2490 IF V2<0 THEN 2580 ELSE LET P3=P1 2500 LET P4=P3 2510 LET P3=FNN(P3) 2520 IF FNP(P3)=P2 THEN 2540 2530 IF P3=100 THEN 2580 ELSE 2500 2540 IF FNP(P2)=P1 THEN LET P(P2)=P(P2)-P1*512 ELSE 2550 2550 LET P(P4)=P(P4)+FNN(P3)-P3 2560 LET P(P3)=P9 2570 LET P9=P3 2580 RETURN 2590 REM ..*** V1=3 *** 2600 REM ..*** PRUNE D1 AND ALL BELOW IT 2610 GOSUB 3660 2620 IF V2<0 THEN 3110 2630 REM ..* ADD TO FREE LISTS ALL N AND P ENTRIES IN SUBTREE 2640 IF FNN(P2)=0 THEN LET N(P2)=9999 ELSE 2680 2650 LET P(P2)=N9 2660 LET N9=P2 2670 GOTO 2960 2680 LET P(P2)=FNN(P2) 2690 LET N(P2)=9999 2700 LET P3=FNN(P2) 2710 IF P3=0 THEN 2900 2720 LET P4=FNP(P3) 2730 IF N(P4)=9999 THEN 2820 2740 IF FNP(P4)=0 THEN 2790 2750 REM ..DROP DOWN TO DAUGHTER 2760 LET P(P4)=P(P4)+(P2-FNP(P4))*512 2770 LET P2=P4 2780 GOTO 2690 2790 LET N(P4)=9999 2800 LET P(P4)=N9 2810 LET N9=P4 2820 REM ..MOVE TO NEXT DAUGHTER 2830 LET P4=FNN(P3) 2840 IF P4=0 THEN 2880 ELSE LET P(P3)=P(P4) 2850 LET P(P4)=P9 2860 LET P9=P4 2870 GOTO 2720 2880 LET P(P3)=P9 2890 LET P9=P3 2900 REM ..GO UP TO MOTHER NODE 2910 LET P3=FNP(P2) 2920 LET P(P2)=N9 2930 LET N9=P2 2940 LET P2=P3 2950 IF P2<>0 THEN 2700 2960 REM ..* DELETE ALL REFERENCES TO PRUNED NODES 2970 FOR P2=1 TO 127 2980 IF N(P2)=9999 THEN 3100 2990 REM ..LOOK AT ALL DAUGHTERS 3000 LET P3=P2 3010 LET P4=P3 3020 LET P3=FNN(P3) 3030 IF P3=0 THEN 3100 3040 IF N(FNP(P3))<>9999 THEN 3010 3050 LET P(P4)=P(P4)+FNN(P3)-FNN(P4) 3060 LET P(P3)=P9 3070 LET P9=P3 3080 LET P3=FNN(P4) 3090 GOTO 3030 3100 NEXT P2 3110 RETURN 3120 REM ..*** V1=4 *** 3130 REM ..*** GO UP FROM N1 TO ITS MOTHER NODE (UNLESS AT TOP) 3140 IF FNP(P1)=0 THEN 3200 ELSE LET P2=P1 3150 LET D1=N1 3160 LET P1=FNP(P1) 3170 LET L1=(L1-1) 3180 IF L1>0 THEN 3190 ELSE LET L1=1 3190 RETURN 3200 LET V2=-1 3210 RETURN 3220 REM ..*** V1=5 *** 3230 REM ..*** GO UP THE WAY YOU CAME (UNLESS AT TOP) 3240 IF L1>1 THEN 3270 3250 LET V2=-1 3260 RETURN 3270 LET L1=L1-1 3280 IF N(L(L1))=9999 THEN 3250 3290 LET P2=P1 3300 LET P1=L(L1) 3310 LET D1=N1 3320 RETURN 3330 REM ..*** V1=6 *** 3340 REM ..*** GO DOWN TO D1 FROM CURRENT NODE (IF LEGAL) 3350 GOSUB 3660 3360 IF V2<0 THEN 3410 ELSE LET P3=P1 3370 LET P3=FNN(P3) 3380 IF P3=0 THEN 3400 3390 IF FNP(P3)=P2 THEN 3420 ELSE 3370 3400 LET V2=-1 3410 RETURN 3420 LET L(L1)=P1 3430 LET P1=P2 3440 LET L1=L1+1 3450 RETURN 3460 REM ..*** V1=7 *** 3470 REM ..*** RETURN WITH NEXT DAUGHTER NODE IN D1 (IF NO MORE, D1=9999) 3480 IF FNN(P1)=0 THEN 3580 ELSE GOSUB 3660 3490 LET P3=P1 3500 LET P3=FNN(P3) 3510 IF P3=0 THEN 3530 3520 IF FNP(P3)=P2 THEN 3540 ELSE 3500 3530 LET P3=P1 3540 LET P2=FNN(P3) 3550 IF P2=0 THEN 3580 ELSE LET P2=FNP(P2) 3560 LET D1=N(P2) 3570 RETURN 3580 LET D1=9999 3590 RETURN 3600 REM ..*** V1=8 *** 3610 REM ..**: RESET TO NODE D1 3620 GOSUB 3660 3630 IF V2<0 THEN 3650 ELSE LET P1=P2 3640 LET L1=1 3650 RETURN 3660 REM ..*** FIND POINTER FOR D1 3670 IF D1=9999 THEN 3760 3680 IF P2<1 OR P2>127 THEN 3700 3690 IF N(P2)=D1 THEN 3780 3700 IF D1<1 OR D1>127 THEN 3730 3710 IF N(D1)=D1 THEN LET P2=D1 ELSE 3730 3720 RETURN 3730 FOR P2=1 TO 127 3740 IF N(P2)=D1 THEN EXIT 3780 3750 NEXT P2 3760 LET V2=-4 3770 LET P2=-1 3780 RETURN 3790 PRINT TAB(9);"+*+ The CAVES are closed +*+" 3800 END