10  COM S$[28],N$[72],N,Y,D[3],L[3],I[3],Y[4,2],V[3,2],S[4,2],W[4],E[4],K[4]
20  COM P[4,12],F[4,9],C[4],Q[4,8],T[4,30],O[4],A[4,5],A1,H5,U,W0,F3,O,G
30  COM W,V9,N1,U[4],S
40  REM  ****  $TREK4T  FOUR-TERMINAL STAR TREK GAME  ****
50  REM
60  REM  WRITTEN BY WARD RUTH  MONTEREY HIGH SCHOOL  4-24-78
70  REM
80  REM  FORMATTING BASED ON TREK73 BY W.K. CHAR
90  REM  LOOSLY RELATED TO *TREK BY K.A. MASON  MHS
100  REM  --  WEAPON HIT AND DAMAGE MANAGEMENT
110  REM
120  DEF FNT()=(3.14159*)/180
130  DEF FNN()=FND((ATN()*180)/3.14159)
140  DEF FNR()=(( >= 315)+( <= 45))+(( >= 45)*( <= 135)*2)
150  DEF FNS()=FNR()+(( >= 135)*( <= 225)*3)+(( >= 225)*(<315)*4)
160  DEF FNA()=(( >= 300)+( <= 60))+(( <= 180)*( >= 60)*2)+(( >= 180)*( <= 300)*3)
170  DEF FNE()=-((>360)*360)
180  DEF FND()=+((<0)*360)
190  DEF FNV()=FND(ABS(-((>315)*360)-315)-45)
200  DIM B$[10],H[3],D$[10]
210  D$="0123456789"
220  D9=0
230  REM  ****  HIT MANAGEMENT  ****
240  FOR S1=1 TO N
250  FOR S2=1 TO N
260  IF S2=S1 THEN 1090
270  IF S1=1 THEN 340
280  IF S2=1 THEN 390
290  D=SQR((L[S1-1]-L[S2-1])^2+(I[S1-1]-I[S2-1])^2)
300  V1=FNE(FNN((I[S1-1]-I[S2-1])/(L[S1-1]-L[S2-1]))+(((L[S1-1]-L[S2-1])<0)*180))
310  V2=FNE(FNN((L[S1-1]-L[S2-1])/(I[S1-1]-I[S2-1]))+(((I[S1-1]-I[S2-1])<0)*180))
320  C3=FNS(FND(V2-FNV(Y[S2,1])))
330  GOTO 440
340  D=D[S2-1]
350  V1=V[S2-1,1]
360  V2=V[S2-1,2]
370  C3=FNS(FND(FNV(V2)-FNV(Y[S2,1])))
380  GOTO 440
390  D=D[S1-1]
400  V1=V[S1-1,2]
410  V2=V[S1-1,1]
420  C3=FNS(FND(V2-Y[S2,1]))
430  REM  ****  DESTRUCT CHECK  ****
440  IF D9 THEN 520
450  IF U[S1] THEN 1100
460  PRINT "+"S$[S1*7-6,S1*7]"+ DESTRUCT"
470  D1=P[S1,1]+P[S1,4]+P[S1,7]+T[S1,2]+T[S1,7]+T[S1,12]+T[S1,17]+T[S1,22]+T[S1,27]+E[S1]
480  IF D >= 100*D1 THEN 1090
490  D5=(F/Q[S2,C3*2-1]-1+RND(0)) MAX 0
500  GOTO 850
510  REM  ****  ANYONE HIT BY PHASERS?  ****
520  FOR C=3 TO 9 STEP 3
530  IF F[S1,C] <= 0 THEN 700
540  IF D >= 100000. OR  NOT U[S2] THEN 700
550  F5=FND(V1-F[S1,C-1])
560  IF (F5>180 AND 360-F5>F[S1,C-2]) OR (F5 <= 180 AND F5>F[S1,C-2]) THEN 700
570  F=F[S1,C]*SQR(1-D/100000.)*(45/F[S1,C-2])
580  IF Q[S2,C3*2]<0 THEN 700
590  Q[S2,C3*2]=Q[S2,C3*2]-F[S1,C]/750
600  PRINT "HIT ";
610  N5=INT(F+.5)
620  GOSUB 1910
630  PRINT " TO "S$[S2*7-6,S2*7]"'S SHIELD"C3
640  K[S2]=K[S2]+F/Q[S2,C3*2-1]/10
650  GOSUB 1160
660  IF S2#1 THEN 700
670  D5=F/Q[S2,C3*2-1]*RND(0)
680  C[S2]=C[S2]+INT(((1/Q[S2,C3*2-1])*(F*RND(0)))*15)
690  GOSUB 1340
700  NEXT C
710  REM  ****  ANYONE HIT BY TORPEDOES?  ****
720  FOR C=5 TO 30 STEP 5
730  IF T[S1,C-4]<0 THEN 1070
740  C9=100*T[S1,C-3]
750  IF ABS(SIN(FNT(T[S1,C-2]-V1))*D)>C9 OR  NOT U[S2] OR ABS(T[S1,C-1])^3*100<D THEN 1000
760  IF Q[S2,C3*2]<0 THEN 1050
770  F=50*(SQR(1-ABS(SIN(FNT(T[S1,C-2]-V1))*D)/C9))
780  PRINT ": ";
790  N5=T[S1,C-4]
800  GOSUB 1910
810  PRINT " :"
820  T[S1,C-4]=-1
830  T[S1,C-3]=0
840  T[S1,C-1]=T[S1,C-1]*(T[S1,C-1]>0)
850  PRINT "HIT ";
860  N5=INT(F+.5)
870  GOSUB 1910
880  PRINT " TO "S$[S2*7-6,S2*7]"'S SHIELD"C3
890  IF Q[S2,C3*2] >= 0 THEN 920
900  IF  NOT D9 THEN 1090
910  GOTO 1080
920  Q[S2,C3*2]=Q[S2,C3*2]-F/500
930  K[S2]=K[S2]+F/Q[S2,C3*2-1]/50
940  GOSUB 1160
950  IF S2#1 THEN 990
960  D5=F/1.5/Q[S2,C3*2-1]*RND(0)
970  C[S2]=C[S2]+INT(((1/Q[S2,C3*2-1])*(F*RND(0)))*10)
980  GOSUB 1340
990  IF  NOT D9 THEN 1090
1000  IF (S2#N AND (S2+1#S1 OR S2+1#N)) OR T[S1,C-4]<0 THEN 1080
1010  PRINT ": ";
1020  N5=T[S1,C-4]
1030  GOSUB 1910
1040  PRINT " :"
1050  T[S1,C-4]=-1
1060  T[S1,C-3]=0
1070  T[S1,C-1]=T[S1,C-1]*(T[S1,C-1]>0)
1080  NEXT C
1090  NEXT S2
1100  NEXT S1
1110  IF D9 THEN 1140
1120  D9=1
1130  GOTO 240
1140  CHAIN "*YTREKA"
1150  REM  ****  SHIELD DAMAGE SUBROUTINE  ****
1160  IF Q[S2,C3*2]>.2 THEN 1320
1170  RESTORE 
1180  FOR C5=1 TO C3
1190  READ B$
1200  NEXT C5
1210  IF S2#1 THEN 1240
1220  PRINT "ENGINEERING:  ";
1230  GOTO 1250
1240  PRINT "SCIENCE:  ";
1250  PRINT S$[S2*7-6,S2*7]"'S "B$" DEFLECTORS ";
1260  GOTO 1+Q[S2,C3*2]*10 OF 1270,1290,1310
1270  PRINT "CRUMBLE!"
1280  GOTO 1320
1290  PRINT "BUCKLING!"
1300  GOTO 1320
1310  PRINT "BEGINNING TO BUCKLE!"
1320  RETURN 
1330  REM  ****  DAMAGE SUBROUTINE  ****
1340  V5=FNE(V2+Y[S2,1])
1350  P[S2,FNA(V5)*4-1]=(P[S2,FNA(V5)*4-1]-D5/10) MAX 0
1360  IF C3=3 THEN 1410
1370  FOR C8=5*(1+((V5>180)*3))-1 TO 5*(3+((V5>180)*3))-1 STEP 5
1380  T[S2,C8]=((T[S2,C8]^3-D5*100) MAX 0)^(1/3)
1390  NEXT C8
1400  RETURN 
1410  GOTO D5*10-4 OF 1440,1500,1590,1730,1770
1420  IF D5*10>9 THEN 1770
1430  GOTO 1490
1440  IF A[1,1] OR FNS(V5)=1 OR RND(0)>.75 THEN 1490
1450  A[1,1]=1
1460  S[1,1]=.99*SGN(S[1,1])
1470  S[1,2]=.99*SGN(S[1,2])
1480  PRINT "WARP DRIVE DEAD"
1490  RETURN 
1500  IF P[1,FNA(V5)*4-2]=-1 THEN 1440
1510  P[1,FNA(V5)*4-2]=-1
1520  A[1,2]=1
1530  P[1,FNA(V5)*4-3]=P[1,FNA(V5)*4-1]=0
1540  PRINT "PHASER  ";
1550  N5=FNA(V5)
1560  GOSUB 1910
1570  PRINT "  DAMAGED"
1580  RETURN 
1590  IF V5>90 AND V5<270 THEN 1440
1600  FOR C8=5*(1+((V5>180)*3))-1 TO 5*(3+((V5>180)*3))-1 STEP 5
1610  IF T[1,C8] <= 0 THEN 1500
1620  T[1,C8]=-T[1,C8]
1630  NEXT C8
1640  A[1,3]=1
1650  PRINT "TORPEDOES  ";
1660  FOR C2=3 TO 1 STEP -1
1670  N5=(C8+1)/5-C2
1680  GOSUB 1910
1690  PRINT "  ";
1700  NEXT C2
1710  PRINT "DAMAGED"
1720  RETURN 
1730  IF A[1,4] THEN 1590
1740  A[1,4]=1
1750  PRINT "SENSORS SMASHED"
1760  RETURN 
1770  IF A[1,5] THEN 1730
1780  A[1,5]=1
1790  H5=0
1800  FOR C2=1 TO 3
1810  IF P[1,C2*4] <= 0 THEN 1830
1820  P[1,C2*4]=-120*C2+120
1830  NEXT C2
1840  FOR C2=5 TO 30 STEP 5
1850  IF T[1,C2] <= 0 THEN 1870
1860  T[1,C2]=0
1870  NEXT C2
1880  PRINT "COMPUTER DISABLED"
1890  RETURN 
1900  REM  ****  FORMAT SUBROUTINE  ****
1910  FOR C4=INT(LOG(N5+.1)/LOG(10)) TO 0 STEP -1
1920  PRINT D$[INT(N5/10^C4)-INT(N5/10^(C4+1))*10+1,INT(N5/10^C4)-INT(N5/10^(C4+1))*10+1];
1930  NEXT C4
1940  RETURN 
1950  DATA "FORWARD","PORT","REAR","STARBOARD"
1960  END 
