10 REM* LUNAR LANDER 20 REM* WRITTEN BY C.A. CALKINS 30 REM* REVISED FOR EBASIC BY DAVID FOX 60 CLEAR 70 DIM D$(1134),M$(37) 80 DIM S(28),F$(23),A$(7) 90 IF INP(2)=13 THEN LET P9=2 ELSE LET P9=252 100 PRINT "&K": CURSOR 6,15: PRINT "* * * L U N A R L A N D E R * * *" 110 CURSOR 15,0: INPUT ,(1,0)"Do you want a briefing? ",Q$ 120 IF Q$="Y" THEN GOSUB 3410 130 PRINT "&K" 140 REM* INITIALIZE ALL VARIABLES 150 LET M$=" " 160 LET A1=0 170 LET X=0,X1=0,X3=-1,X4=.032,X5=.0032,X9=.0032 180 LET L1=15,L2=0,T0=64,T1=4,T2=13,T3=2,T4=10 190 LET M=50,M1=1,V1=-1000,V2=1000 200 LET G=9.76,P=.75 210 LET D=1,D0=0,D1=0,D2=0,D3=0 220 LET Z0=0,O=1 230 LET F=3000,F1=7,F2=0,F5=5,F7=0,F8=0,F9=0 240 LET D$=" " 250 FOR I=1 TO 5 260 LET D$=D$+D$ 270 NEXT I 280 LET F$="-=<|>=-" 290 LET F1$=" " 300 LET Y=20000,Y1=.0075,Y2=.00075,Y3=.00075 310 LET H=1.5,H1=H 320 FOR J=1 TO 3 330 FOR I=Z0 TO 5 340 READ D$(((J-1)*378)+(I+1)*63-62,((J-1)*378)+(I+1)*63) 350 NEXT I 360 NEXT J 370 FOR I=1 TO 28 380 READ S(I) 390 NEXT I 400 LET S=1,S1=64,S2=16,S3=.025,S4=.05,S5=.008,S6=2000,S7=.095 410 LET N0=90,H0=100 420 LET A5=65,D5=68,Z5=90,F6=70,I5=73,O5=49,L5=76,T5=50,R5=82,R6=83 430 READ C0,C1,C2,C3,C4,C5,C6,C7,C8 440 REM* PLACE MODULE ON SCREEN 450 REM* POSITION (X,Y) IN FEET MUST FIRST 460 REM* BE CONVERTED TO (X,Y) ROWS AND COL. 470 REM* SCREEN SIZE IS (20000,17500) FT 480 REM* AND (64,16) CHR. AND LINES 490 GOSUB 2930 500 REM* UPDATE NEW POSITION OF MODULE 510 REM* TIME SINCE LAST UPDATE IS 'D' 520 LET D=D0 530 LET D1=D1+D 540 LET D0=S7+S7+S7+S7 550 LET T=T0*P 560 LET X=X+V2*D+T/T3*S(T1+1)*D*D 570 LET Y=Y+V1*D+(T*S(T2+1)-G)/T3*D*D 580 LET V2=V2+T*S(T1+1)*D 590 LET V1=V1+(T*S(T2+1)-G)*D 600 IF A1=O THEN GOSUB 2760 610 GOSUB 1220 620 LET X1=INT(X*X9+H1) 630 LET L2=S2-INT(Y*Y3+H) 640 GOSUB 1690 650 REM* UPDATE FUEL AVAILABLE 660 LET F=F-D*M*P 670 IF F>Z0 THEN GOTO 760 680 LET T0=Z0 690 LET P=Z0 700 LET F=Z0 710 LET F8=O 720 LET M$="OUT OF FUEL" 730 GOTO 760 740 REM* CHECK BACKGROUND SCALE (X1=COL,L2=ROW) 750 REM*S=1 LONG RANGE,=2 MAIN LANDING SITE,=3 ALTERNATE SITE 760 IF Y>S6 THEN GOTO 990 770 IF S>O THEN GOTO 890 780 LET S=T3 790 LET F7=Z0 800 IF X>C4 THEN LET S=S+O 810 IF XC6 THEN LET H1=H1-C6: IF S=3 THEN 1740 910 IF X1C4 THEN LET S=S+O 960 IF XS0 THEN GOTO 1040 980 GOTO 1060 990 IF S=O THEN GOTO 1060 1000 LET S=O 1010 LET X9=X5 1020 LET H1=Z0 1030 LET Y3=Y2 1040 LET L1=S2-O 1050 LET S0=S,F7=0 1060 IF X11 THEN LET M$="YOU CRASHED INTO THOSE ROCKS" 1130 GOSUB 2930 1140 GOTO 1960 1150 REM* KEYBOARD INPUT ROUTINE 1160 REM* A=AUTOPILOT ON; S=AUTOPILOT OFF 1170 REM* F=FULL THRUST; Z=ZERO THRUST 1180 REM* D=DECREASE THRUST 1190 REM* I=INCREASE THRUST 1200 REM* L=MOVE MODULE TO LEFT 1210 REM* R=MOVE MODULE TO RIGHT 1220 LET D0=D0+S3 1230 LET K=INP(P9) 1240 IF K=R6 THEN GOTO 1660 1250 IF K=A5 THEN GOTO 1630 1260 IF K=D5 THEN GOTO 1360 1270 IF K=I5 THEN GOTO 1400 1280 IF K=L5 THEN GOTO 1430 1290 IF K=R5 THEN GOTO 1470 1300 IF K=Z5 THEN GOTO 1510 1310 IF K=F6 THEN GOTO 1540 1320 IF K=O5 THEN GOTO 1570 1330 IF K=T5 THEN GOTO 1600 1340 RETURN 1350 REM* KEY=D, DECREASE THRUST 1360 LET P=P-S4 1370 IF PZ0 THEN LET T1=T1-O 1440 LET T2=T1+C1 1450 RETURN 1460 REM* KEY=R, MOVE MODULE TOWARD THE RIGHT 1470 IF T1Z0 THEN GOTO 1760 1700 IF X1>Z0 THEN GOTO 1770 1710 GOTO 1740 1720 LET X=0 1730 IF X117500 THEN GOTO 1730 1770 IF YZ0 THEN RETURN 1830 REM* LANDED- CHECK FOR CRASH 1840 LET L2=15 1850 LET Y=0 1860 IF ABS(V2)<5 THEN GOTO 1920 1870 IF V1<-15 THEN GOTO 1900 1880 LET F8=O: LET M$="ROUGH LANDING -- SHIP DAMAGED" 1890 GOTO 3000 1900 LET F8=O: LET M$="YOU CRASHED -- SHIP DESTROYED" 1910 GOTO 1960 1920 IF V1<-25 THEN GOTO 1900 1930 IF V1<-15 THEN GOTO 1880 1940 LET F8=O: LET M$="FANTASTIC LANDING" 1950 GOTO 3000 1960 REM* ROUTINE TO DISPLAY CRASH SCEEN 1970 LET L0=L2 1980 READ F0,F$ 1990 IF F0=Z0 THEN GOTO 2140 2000 LET X1=INT(X*X9+H1)-(F0-7)/T3 2010 IF X1>=Z0 THEN GOTO 2060 2020 LET F$=F$(-X1,LEN(F$)) 2030 LET F0=F0+X1 2040 LET X1=Z0 2050 GOTO 2090 2060 IF X1+F0Z0 THEN GOSUB 2930 2110 LET L2=L2-O 2120 LET L1=Z0 2130 GOTO 1980 2140 LET L2=L0 2150 IF F$<>"*" THEN GOTO 1980 2160 LET F$="-=<|>=-" 2170 LET X1=INT(X*X9+H1) 2180 LET A1=T3 2190 GOTO 3000 2200 REM* DISPLAY MODULE AT LOCATION (X,Y) FT 2210 REM* D$ WILL CONTAIN THE BACKGROUND 2220 IF L1<>L2 THEN GOTO 2240 2230 IF X1=X3 THEN RETURN 2240 IF L2=Z0 THEN GOTO 2420 2250 IF L2<3 THEN GOTO 2330 2260 LET D0=D0+L2*S5 2270 GOTO 2330 2280 REM* PRINT NEW MODULE AND ERASE OLD MODULE 2290 REM* X1=DESIRED STARTING POSITION 2300 REM* F1=LENGTH OF FIGURE 2310 REM* L1=OLD LINE # 2320 REM* L2=NEW LINE # 2330 LET D0=D0+S3 2340 IF L1<1 THEN 2360 2350 CURSOR L1,X3: PRINT F1$;: CURSOR 0,0 2360 LET X3=X1+F1 2370 IF X1>62 THEN LET X1=62 2380 IF X1>C6 THEN LET F$=F$(1,63-X1) 2390 IF X1<0 THEN LET X1=0 2400 IF L2T3 THEN GOTO 2720 2630 PRINT "FUEL";INT(F);TAB(11);"ALT=";INT(Y); 2640 GOTO 2670 2650 REM* PARAMETER OPTION #2 SELECTED 2660 PRINT "TIME";INT(D1);TAB(10);"DIST=";INT(X); 2670 PRINT TAB(22);"H-VEL=";INT(V2);TAB(34);"V-VEL=";INT(V1); 2680 PRINT TAB(46);"ATT=";INT(T1*T4-N0);TAB(54);"PWR=";INT(P*H0) 2690 LET D0=D0+S7 2700 RETURN 2710 REM* PRINT OUT AUTOPILOT PREDICTIONS 2720 PRINT "SOL AUTOPILOT - PREDICTED LANDING AT ";INT(D3); 2730 PRINT TAB(47);"IN ";INT(D2);TAB(55);"SECONDS" 2740 GOTO 2690 2750 REM* AUTOPILOT SECTION 2760 REM* COMPUTE DESIRED THRUST AND ANGLE 2770 IF FZ0 THEN GOTO 1630 2790 LET P=G+(V1*V1-H0)/T3/Y 2800 LET T1=ATN(V2/(V1+T4)*(O-G/P)) 2810 LET T1=T1*C8 2820 IF T1>C7 THEN LET T1=C7 2830 IF T1<-C7 THEN LET T1=-C7 2840 LET T1=INT((T1+N0)/T4+.5) 2850 LET T2=T1+C1 2860 LET P=P/S(T2+1)/T0 2870 IF P>T3 THEN LET P=T3 2880 IF PO THEN GOSUB 2600 2960 IF F8=O THEN CURSOR 2,INT((64-LEN(M$))/2): IF F9=O THEN PRINT M$ ELSE PRINT 2970 IF A1=-/",11,"l l",9,"/ \" 3320 DATA 5," - ",0," " 3330 DATA 13,"\ \-=<|>=-/ /",15,"l l l l" 3340 DATA 15,"l / \ l",13,"/ - \" 3350 DATA 9," - - - ",0," " 3360 DATA 19,"\ \ \-=<|>=-/ / /",21,"\ l l l l /" 3370 DATA 23,"l l / \ l l",23,"l / - \ l" 3380 DATA 21,"/ - - - \",19,"/ \" 3390 DATA 13," - - - - - ",0,"*" 3400 REM* INSTRUCTIONS 3410 PRINT "&K": CURSOR 0,0: PRINT "You will attempt to land your module on the surface of the" 3420 PRINT "moon. You must apply enough thrust to overcome the moon's" 3430 PRINT "gravity without burning up your fuel or going back into orbit." 3440 PRINT : PRINT "These are the commands you may use:" 3450 CURSOR 6,10: PRINT "I - INCREASE thrust" 3460 PRINT TAB(10);"D - DECREASE thrust" 3470 PRINT TAB(10);"L - Move module more to the LEFT" 3480 PRINT TAB(10);"R - Move module more to the RIGHT" 3490 PRINT TAB(10);"F - FULL thrust immediately!" 3500 PRINT TAB(10);"Z - ZERO thrust immediately!" 3510 PRINT TAB(10);"A - Turn AUTOPILOT on" 3520 PRINT TAB(10);"S - Turn AUTOPILOT off" 3530 CURSOR 15,0: INPUT "Press the `RETURN' button to continue ",Q$ 3540 RETURN