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