10 ?TAB(-1,0);"STAR TREK 5B -- DEMARCO-SHATZ CORPORATION 1978" 30 ? TAB(10,29)"* CHARTING GALAXY *" 40 STRSIZ 40:RANDOMIZE 50 RD=.785398:C=INT(8*RND(1)+1):W=INT(8*RND(1)+1) 60 DIM Q(8,8),S(8,8):A$=".E+RKB*M" 100 101 REM SET UP GALAXY 110 E=3000:P=10:A=2:KE=300:R9=0:K9=0:B9=0 120 FOR I=1 TO 8:D(I)=100+RND(1):NEXT 130 GOSUB 10900:Q1=X:Q2=Y 140 X=8:Y=1:X1=.2075:Y1=6.28:X2=3.28:Y2=1.8 160 FOR I=1 TO 8:FOR J=1 TO 8:K=0 170 IF RND(1)<.3 THEN K=-INT(7*RND(1)) 180 K9=K9-K 190 R=(RND(1)>.98)+(RND(1)>.98):R9=R9-R 200 B=(RND(Y)>.97):B9=B9-B 210 Q=V*1E4+R*1E3+K*100+B*10-INT(RND(Y)*X+Y):Q(I,J)=Q 220 NEXT J:NEXT I 230 IF B=0 THEN GOSUB 10900:Q(X,Y)=Q(X,Y)-10 240 T=R9+K9+INT((R9+K9)/4*RND(1)):TT=T:II=R9+K9 300 GOSUB 1600 600 601 REM INTERCHANGE 800 H1=0:H2=0:FOR I=1 TO 10:IF R3(I)<=0 THEN 810 805 H=R3(I)*.5*RND(1):R3(I)=R3(I)-H:H=H/(SQR((R1(I)-S1)^2+(R2(I)-S2)^2)^.4):H1=H1+H 810 IF K3(I)<=0 THEN 820 815 H=K3(I)*.5*RND(1):K3(I)=K3(I)-H:H=H/(SQR((K1(I)-S1)^2+(K2(I)-S2)^2)^.4):H2=H2+H 820 NEXT :IF C$="CLEAR" THEN 900 825 D(4)=D(4)-H1-H2:IF D(4)<0 THEN I=INT(8*RND(1)+1):D(I)=D(I)+D(4):D(4)=0 830 IF H1+H2>0 THEN M$="HIT BY "+STR(H1+H2)+" UNITS" 900 IF E<0 OR T<0 THEN 11000 910 IF K9+R9=0 THEN 12000 920 IF Q(Q1,Q2)>8E4 THEN M$="ACCESSIVE RADATION":D(4)=0:E=E-1E3+RND(1) 930 IF Z=3 THEN GOSUB 3000:GOTO 950 940 GOSUB 2000:IF Z=7 AND A>=0 THEN Q(Q1,Q2)=9E4:GOSUB 1700 950 M$="":? TAB(21,55)SPACE(20);TAB(21,55);:INPUT "COMMAND? ",Z 955 IF Z<1 OR Z>8 THEN GOSUB 9000:GOTO 600 960 ON Z GOSUB 1000,600,600,4000,5000,6000,7000,8000 970 GOTO 600 1000 1001 REM MOVE 1010 ? TAB(21,64)"MOVE" 1020 IF 100*RND(1)>D(1) THEN M$="ENGINE MALFUNCTION":GOSUB MSG:RETURN 1100 ? " 3":? "5 -+- 1":? " 7"; 1110 ? TAB(23,15);:INPUT "COURSE? ",C 1120 ? TAB(23,30);:INPUT "WARP FACTOR? ",W 1200 N=INT(W*8):E=E-N+.5:S(S1,S2)=1:T=T-1 1210 Y=-SIN((C-1)*RD):X=COS((C-1)*RD) 1220 FOR I=1 TO N:S1=S1+Y:S2=S2+X 1230 IF S1<1 OR INT(S1+.5)>8 OR S2<0 OR INT(S2+.5)>8 THEN 1600 1240 IF S(INT(S1+.5) MAX 1,INT(S2+.5) MAX 1)>3 THEN 1300 1250 NEXT :GOTO 1500 1300 M$="COLLIDED WITH " 1320 ON S(INT(S1+.5),INT(S2+.5))-4 GOTO 1340,1350,1360 1330 M$=M$+"ROMULAN":GOTO 1400 1340 M$=M$+"KLINGON":GOTO 1400 1350 M$=M$+"STARBASE":GOTO 1400 1360 M$=M$+"STAR" 1400 REM 1410 S1=S1-Y:S2=S2-X 1500 S1=INT(S1+.5):S2=INT(S2+.5):S(S1 MAX 1,S2 MAX 1)=2:RETURN 1600 REM 1610 Q1=INT(Q1+W*Y+.5):Q2=INT(Q2+W*X+.5) 1620 Q1=Q1-(Q1<1)+(Q1>8):Q2=Q2-(Q2<1)+(Q2>8) 1630 IF Q1<1 OR Q1>8 OR Q2<1 OR Q2>8 THEN GOSUB 10900:Q1=X:Q2=Y 1640 GOSUB 10900:S1=X:S2=Y 1700 FOR I=1 TO 8:R3(I)=0:K3(I)=0:NEXT 1710 FOR I=1 TO 8:FOR J=1 TO 8:S(I,J)=1:NEXT :NEXT :S(S1,S2)=2 1800 GOSUB 10010 1810 IF R>0 THEN GOSUB 10910:S(X,Y)=4:R1(R)=X:R2(R)=Y:R3(R)=KE:R=R-1:GOTO 1810 1820 IF K>0 THEN GOSUB 10910:S(X,Y)=5:K1(K)=X:K2(K)=Y:K3(K)=KE:K=K-1:GOTO 1820 1830 IF B>0 THEN GOSUB 10910:B=B-1:S(X,Y)=6:GOTO 1830 1840 IF S>0 THEN GOSUB 10910:S=S-1:S(X,Y)=7:GOTO 1840 1900 FOR I=Q1-1 TO Q1+1:FOR J=Q2-1 TO Q2+1 1910 IF I>0 AND I<9 AND J>0 AND J<9 THEN Q(I,J)=INT(ABS(Q(I,J))) 1920 NEXT J:NEXT I 1930 IF Q(Q1,Q2)<8E4 THEN RETURN 1940 FOR I=1 TO 8:FOR J=1 TO 8:S(I,J)=3:NEXT J:NEXT I:S(S1,S2)=2 1950 RETURN 2000 2001 REM SHORT RANGE MAP 2010 ? TAB(-1,0); 2015 IF 100*RND(1)>D(2) THEN DX=1:M$="SCANERS DAMAGED" ELSE DX=0 2020 ? TAB(18)"= QUADRANT SCAN =" 2030 ? :? SPACE(6); 2040 FOR I=1 TO 8:? I;SPACE(2);:NEXT :? :? 2050 FOR I=1 TO 8:? I;SPACE(4);:FOR J=1 TO 8 2060 IF DX=1 THEN E$=" " ELSE E$=MID$(A$,S(I,J),1) 2070 ? E$;SPACE(4); 2080 NEXT J:? I:? :NEXT I 2090 ? SPACE(6); 2100 FOR I=1 TO 8:? I;SPACE(2);:NEXT 2110 GOTO REP 3000 3001 REM GALACTIC MAP 3005 ? TAB(-1,0); 3010 IF 100*RND(1)>D(3) THEN DX=1:M$="MAPING MALFUNCTION" ELSE DX=0 3020 ? TAB(18)"= GALACTIC MAP =" 3030 ? :? SPACE(6); 3040 FOR I=1 TO 8:? I;SPACE(2);:NEXT:? :? 3200 FOR I=1 TO 8:? I;SPACE(3);:FOR J=1 TO 8 3210 E$=RIGHT$("00"+ABS(Q(I,J)),3) 3220 IF Q(I,J)<0 THEN E$=" . " 3225 IF Q(I,J)>8E4 THEN E$="+++" 3230 IF DX=0 ? E$;SPACE(2); ELSE ? " ";SPACE(2); 3240 NEXT :? I:? :NEXT 3250 ? SPACE(6); 3260 FOR I=1 TO 8:? I;SPACE(2);:NEXT 3270 GOTO REP 4000 4001 REM REPORT SWITCH 4010 ? TAB(21,64)"REPORTS" 4020 ? TAB(23,1);:INPUT "SET REPORT DISPLAY? (1-STATUS/2-DAMAGE) ",RP 4030 IF RP<1 OR RP>2 THEN 4020 4040 RETURN 5000 5001 REM TORPEDOES 5010 ? TAB(21,64)"TORPEDOES" 5020 IF 100*RND(1)>D(5) THEN M$="PHOTON TUBES BLOCKED":GOSUB MSG:RETURN 5030 IF P=0 THEN M$="WEAPONS SUPPLY GONE":GOSUB MSG:GOTO 950 5040 P=P-1 5100 ? " 3":? "5 -+- 1":? " 7"; 5110 ? TAB(23,15);:INPUT "COURSE? ",C 5120 ? TAB(23,15)"FIRE..."+SPACE(20); 5130 Y1=S1+.5:X1=S2+.5:Y=-SIN((C-1)*RD):X=COS((C-1)*RD) 5140 FOR I=1 TO 10:Y1=Y1+Y:X1=X1+X:Y2=INT(Y1):X2=INT(X1) 5150 IF X2<1 OR X2>8 OR Y2<1 OR Y2>8 ? TAB(23,25)"MISSED!" :RETURN 5170 FOR II=1 TO 300:NEXT II:? TAB(3+Y2*2,3+X2*5); 5180 IF S(Y2,X2)<=3 THEN 5400 5200 ON S(Y2,X2)-4 GOTO 5220,5230,5240 5210 M$="ROMULAN":R9=R9-1:Q(Q1,Q2)=Q(Q1,Q2)-1E3:GOTO 5300 5220 M$="KLINGON":K9=K9-1:Q(Q1,Q2)=Q(Q1,Q2)-100:GOTO 5300 5230 M$="STARBASE":Q(Q1,Q2)=Q(Q1,Q2)-10:GOTO 5300 5240 Q(Q1,Q2)=Q(Q1,Q2)-1:IF RND(1)>.5 THEN M$="STAR" ELSE M$="PLANET" 5300 FOR J=1 TO 8 5310 IF R1(J)=Y2 AND R2(J)=X2 THEN R3(J)=0 5320 IF K1(J)=Y2 AND K2(J)=X2 THEN K3(J)=0 5330 NEXT J:? TAB(23,25);M$;" DESTROYED!" 5340 GOSUB KIL:S(Y2,X2)=1:M$="":RETURN 5400 NEXT I:? TAB(23,25)"MISSED!" :RETURN 6000 6001 REM PHASERS 6010 ? TAB(21,64)"PHASERS" 6020 IF 100*RND(1)>D(6) THEN M$="DUAL PHASERS DAMAGED":GOSUB MSG:RETURN 6030 GOSUB 10010 6040 ? TAB(23,1)"PHASERS LOCKED IN ON";R+K;"ENEMY SHIPS"; 6050 INPUT "- ENERGY UNITS TO FIRE? ",X 6060 IF X<0 OR X>E THEN ? CHR$(7);:GOTO 6040 6100 E=E-X:X=X*2:FOR I=1 TO 8 6110 IF R+K>0 THEN H=X/((R*SQR((R1(I)-S1)^2+(R2(I)-S2)^2)^.5)+(K*SQR((K1(I)-S1)^2+(K2(I)-S2)^2)^.5))+.01 6120 IF R3(I)<=0 THEN 6200 6130 R3(I)=R3(I)-H:IF R3(I)>0 THEN 6200 6140 R3(I)=0:R=R-1:S(R1(I),R2(I))=1:Q(Q1,Q2)=Q(Q1,Q2)-1E3:R9=R9-1 6150 X2=R2(I):Y2=R1(I):GOSUB KIL 6200 IF K3(I)<=0 THEN 6300 6210 K3(I)=K3(I)-H:IF K3(I)>0 THEN 6300 6220 K3(I)=0:K=K-1:S(K1(I),K2(I))=1:Q(Q1,Q2)=Q(Q1,Q2)-100:K9=K9-1 6230 X2=K2(I):Y2=K1(I):GOSUB KIL 6300 NEXT :RETURN 7000 7001 REM ATOMIC BOMB 7010 ? TAB(21,64)"ATOMIC BOMB" 7020 IF 100*RND(1)>D(7) THEN M$="LAUNCHER DAMAGED":GOSUB MSG:RETURN 7030 IF A=0 THEN M$="WEAPON SUPPLY GONE":GOSUB MSG:GOTO 950 7100 ? TAB(23,1)"*** DETONATION SET FOR NEXT TURN!!! ***" 7110 GOSUB 10010 7120 A=A-1:R9=R9-R:K9=K9-K 7130 RETURN 8000 8001 REM REPAIR 8010 ? TAB(21,64)"REPAIR" 8030 ? TAB(23,1);:INPUT "ENTER FUNCTION CODE#, ENERGY DIVERED? ",C,W 8040 IF C<1 OR C>8 OR W>E THEN 8030 8045 IF W THEN W=W MAX -D(C) 8050 E=E-W:D(C)=D(C)+W+RND(1) 8060 RETURN 9000 9001 REM LIST 9010 ? TAB(21,64)"COMMAND LIST" 9020 ? TAB(23,1)"SYSTEM: 1-MOVE 2-QUADRANT SCAN 3-GALACTIC MAP "; 9030 ? "4-REPORTS 8-REPAIR" 9040 ? TAB(24,1)"WEAPON: 5-PHOTON TORPEDOES 6-DUAL PHASERS "; 9050 ? "7-ATOMIC BOMB"; 9060 GOTO 950 10000 REM SUBROUTINES 10010 Q(Q1,Q2)=ABS(Q(Q1,Q2)):N=Q(Q1,Q2):V=INT(N/1E4) 10020 R=INT((N-V*1E4)/1E3):K=INT((N-V*1E4-R*1E3)/100) 10030 B=INT((N-V*1E4-R*1E3-K*100)/10):S=INT(N-V*1E4-R*1E3-K*100-B*10) 10040 RETURN 10900 X=INT(8*RND(1))+1:Y=INT(8*RND(1))+1:RETURN 10910 GOSUB 10900:IF S(X,Y)>1 THEN 10910 10920 RETURN 11000 REM LOST 11010 ? TAB(-1,0);"YOU LOSE..." 11020 ? "ENERGY LEFT= ";E;" ROMULANS LEFT=";R9;" KLINGONS LEFT=";K9 11030 END 12000 ? TAB(-1,0);"MESSAGE FROM STARFLEET...":? 12010 ? "CONGRATULATIONS; YOU DESTROYED";II;"ENEMY SHIPS" 12020 ? " IN";TT-T;"STARDAYS. YOUR EFFICIENCY RATING IS"; 12030 ? (II/(TT-T))*100;"%" 12040 END 13000 13010 MSG: 13020 FOR I=1 TO 10 13030 ? TAB(3,55);TAB(-1,9);TAB(3,55)"** "+M$+" **"; 13040 FOR J=1 TO 100:NEXT 13050 NEXT :M$="":RETURN 14000 14010 KIL: 14020 FOR II=30 TO 127:? CHR$(7);TAB(3+Y2*2,3+X2*5);CHR$(II); :NEXT II 14030 RETURN 15000 15001 REM REPORTS 15010 REP: 15020 IF 100*RND(1)>D(8) THEN M$="COMPUTER BANKS OUT!!!":GOSUB MSG:RETURN 15040 C$="GREEN" 15041 FOR I=1 TO 8:FOR J=1 TO 8 15042 IF S(I,J)=3 THEN C$="YELLOW" 15043 IF S(I,J)=4 OR S(I,J)=5 THEN C$="R E D" 15044 NEXT :NEXT 15050 IF E<500 OR Q(Q1,Q2)>8E4 THEN C$="YELLOW" 15060 FOR I=S1-1 TO S1+1:FOR J=S2-1 TO S2+1 15061 IF I<1 OR I>8 OR J<1 OR J>8 THEN 15065 15062 IF S(I,J)=6 C$="CLEAR":M$="DOCKED AT STARBASE":E=3000:P=10:A=2 15063 IF S(I,J)=6 FOR C=1 TO 8:D(C)=100+RND(1):NEXT 15064 IF S(I,J)=8 THEN M$="SPACE MINE AHEAD" 15065 NEXT :NEXT 15100 IF RP=2 THEN 15500 ELSE ? TAB(1,57)"= STATUS REPORT =" 15105 IF M$#"" THEN GOSUB MSG 15110 ? TAB(5,55)"STARDAYS LEFT-";T 15120 ? TAB(7,55)"CONDITION- ";C$ 15130 ? TAB(9,55)"QUADRANT: ";Q1;"x";Q2 15140 ? TAB(11,55)" SECTOR: ";S1;"x";S2 15150 ? TAB(13,55)"SHIELD LEVEL=";D(4) 15160 ? TAB(15,55)"ENERGY LEVEL=";E 15170 ? TAB(17,55)"WEAPONS: T-";P;" A-";A 15180 IF C$#"R E D" OR Z=3 ? TAB(19,55)"INVADERS LEFT- ";R9+K9:RETURN 15190 GOSUB 10010:? TAB(19,55)"INVADERS PRESENT- ";R+K 15199 RETURN 15500 ? TAB(1,57)"= DAMAGE REPORT =" 15510 IF M$#"" THEN GOSUB MSG 15520 ? TAB(5,60)"- SYSTEM -" 15530 ? TAB(7,55)"1 WARP ENGINES ";D(1)"%" 15540 ? TAB(8,55)"2 QUADRANT SCAN ";D(2);"%" 15550 ? TAB(9,55)"3 GALACTIC MAP ";D(3);"%" 15560 ? TAB(10,55)"4 SHIELD LEVEL ";D(4) 15565 ? TAB(11,55)" SHIP REPORTS ";D(8);"%" 15567 ? TAB(12,55)" ENERGY LEVEL ";E 15570 ? TAB(15,60)"- WEAPONS -" 15580 ? TAB(17,55)"5 PHOTON TORPED ";D(5);"%" 15590 ? TAB(18,55)"6 DUAL PHASERS ";D(6);"%" 15600 ? TAB(19,55)"7 ATOMIC BOMBS ";D(7);"%" 15601 RETURN