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(R)=(3.14159*R)/180 130 DEF FNN(R)=FND((ATN(R)*180)/3.14159) 140 DEF FNR(R)=((R >= 315)+(R <= 45))+((R >= 45)*(R <= 135)*2) 150 DEF FNS(R)=FNR(R)+((R >= 135)*(R <= 225)*3)+((R >= 225)*(R<315)*4) 160 DEF FNA(R)=((R >= 300)+(R <= 60))+((R <= 180)*(R >= 60)*2)+((R >= 180)*(R <= 300)*3) 170 DEF FNE(R)=R-((R>360)*360) 180 DEF FND(R)=R+((R<0)*360) 190 DEF FNV(R)=FND(ABS(R-((R>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*1000) 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