REM PROGRAM ATREK 1.2 REM PROGRAMMER D. ALLEN REM CREATED APRIL 18, 1984 REM UPDATED DEC 1, 1987 REM COPYRIGHT (C) 1984 ' ' ATREK IS A MODIFIED VERSION OF STAR TREK. IT IS A FAST ' PACED, EXCITING GAME THAT GIVES THE USER MANY LEVELS OF ' DIFFICULITY THUS ENABLING THE USER TO LEARN AND PLAY AT ' HIS OR HER OWN PACE. ' ' VARIABLE TABLE: ' A - COMMAND ' A$ - DUMMY STRING ' A1,A8 - X COORDINATES AROUND ENTERPRISE ' B1,B8 - Y COORDINATES AROUND ENTERPRISE ' B3 - # OF STARBASES IN QUADRANT ' B9 - # OF STARBASES IN GALAXY ' C$ - CONDITION: RED, YELLOW OR GREEN ' C1 - SHIP'S COURSE ' D(7) - ARRAY OF DAMAGE CONTROL ' D,D$ - DUMMY VARIABLES ' E - ENERGY OF YOUR SHIP ' E0 - MAXIMUM ENERGY ' E$(10) - TOP TEN SCORES OF CURRENT LEVEL ' F(4) - ENERGY IN FOUR SHIELDS ' FG - FLAG, FIND GALAXY, ALSO: -1=LOST, -2=WON ' FL - FLAG, 0=FALSE, -1=TRUE ' FQ - FLAG, FIND QUADRANT ' FS - FLAG, FIND STATUS ' G(8,8) - GALAXY: # OF KLINGONS/# OF BASES/# OF STARS ' H - ENERGY HIT FROM A KLINGON ' H0 - TOTAL ENERGY HIT FROM KLINGONS ' HC - FLAG, HELP CLEAR SCREEN ' HI - HELP INDENTATION ' I,J - LOOP INDEXES ' I0,J0 - LOOP INDEXES ' K(9,3) - KLINGONS TABLE ' K(I,1),K(I,2) = COORDINATES ' K(I,3) = ENERGY ' K0 - # OF KLINGONS ' K3 - # OF KLINGONS IN QUADRANT ' K9 - # OF KLINGONS IN GALAXY ' L$(5) - QUADRANT CHARACTERS ' M$ - FLAG, DEFLECTOR SHIELDS ' N - POWER TO WARP ' N(3) - NUMBER OF KLINGONS, BASES, STARS ' O$ - DUMMY STRING ' P - NUMBER OF PHOTONS ' P1,P2 - COORDINATES OF PREVIOUS POSITION ' Q(8,8) - QUADRANT: 0=NOTHING, 1=ENTERPRISE, ' 2=KLINGONS, 3=DOCKED, 4=STARS ' Q1,Q2 - QUADRANT COORDINATES, CURRENT POSITION ' R0 - CURRENT SCORE ' R1,R2 - RANDOM NUMBER COORDINATES ' S1,S2 - SECTOR COORDINATES, CURRENT POSITION ' S3 - # OF STARS ' S4,S5 - TARGET COORDINATES (P.C. FIRING) ' S9 - ENERGY OF EMEMY SHIP ' T - CURRENT TIME ' T0 - STARDATE DEADLINE ' T9 - REAL TIME ' X,Y - CURRENT VALUES OF X AND Y ' X1,X2 - DIFFERENTIAL BETWEEN YOU AND TARGET ' V0 - VARIABLE SIZE OF GALAXY ' W$ - DUMMY VARIABLE ' W1 - WARP SPEED ' Z$(7) - DAMAGE CONTROL HEADINGS ' ' DATA FILES: ' ATREK.DAT - KEEPS TRACK OF THE TOP 10 SCORES ' ACCESS - RANDOM ' # RECS - 5 ' REC 1-5 - LEVELS 0-4 ' LENGTH - :-----------200-------------: ' TOP 10, ' W/SHIELD - :-----100-----: ' NO SHLDS - :-----100-----: ' INITIALS - :5: ' SCORE - :5: ' ' DECLARATIONS. ' DIM E$(10) DIM D(7),F(4) DIM G(8,8),K(9,3) HI=1 : HC=-1 DIM L$(5) L$(0)="." L$(1)="E" L$(2)="K" L$(3)="B" L$(4)="*" L$(5)=" " DIM N(3),Q(8,8) DIM Z$(7) Z$(1)="WARP ENGINES" Z$(2)="S.R. SENSOR " Z$(3)="L.R. SENSOR " Z$(4)="PHASER CNTRL" Z$(5)="PHOTON TUBES" Z$(6)="C.P. FIRING " Z$(7)="Damaged Report" ON ERROR GOTO ERROR.HANDLER GOTO MAIN.ROUTINE REM REM UTILITY ROUTINES SECTION. REM ' INTENSE: ' ' THE PURPOSE OF THIS ROUTINE IS TO TURN ON INTENSE COLORS. ' COLOR 15,1,1 RETURN ' BLINKING: ' ' THE PURPOSE OF THIS ROUTINE IS TO TURN ON BLINKING COLORS. ' COLOR 7+16,4,1 RETURN ' NORMAL: ' ' THE PURPOSE OF THIS ROUTINE IS TO RETURN COLOR TO NORMAL. ' COLOR 7,1,1 RETURN ' PAUSE: ' ' THE PURPOSE OF THIS ROUTINE IS TO HALT OPERATION UNTIL ' PLAYER WANTS TO RESUME. ' PRINT " " GOSUB INTENSE PRINT STRING$(HI,32);"Hit Anything to Continue "; GOSUB NORMAL A$=INPUT$(1) IF HC THEN CLS RETURN ' RANDOM.: ' ' THE PURPOSE OF THIS ROUTINE IS TO GENERATE A RANDOM ' X,Y COORDINATE PAIR. ' RANDOMIZE VAL(RIGHT$(TIME$,2)) DO R1=INT(RND*8)+1 R2=INT(RND*8)+1 LOOP UNTIL Q(R1,R2)=0 RETURN ' COURSE.PLOTTER: ' ' THE PURPOSE OF THIS ROUTINE IS TO CALCULATE A X,Y ' COORDINATES, GIVEN A COMPASS COURSE C1. ' X2=COS((C1-1)*.785398) X1=-SIN((C1-1)*.785398) RETURN ' DEFLECTORS: ' ' THE PURPOSE OF THIS ROUTINE IS TO CALCULATE, AND DISPLAY ' THE DAMAGE TO THE SHIELDS. THE PLAYER IS THEN ASKED IF ' HE WISHES THE SHIELDS RENERGIZED. ' E=E+H0 D=INT(RND*4)+1 I=1 : FL=0 DO WHILE I<= 4 AND NOT FL IF I= D THEN FL=-1 ELSE I=I+1 LOOP IF NOT FL THEN RETURN IF F(I) < 0 THEN GOSUB BLINKING LOCATE (1)+1,(5)+1 : PRINT "Deflector screen "I" is down and has been hit!!"; GOSUB NORMAL FG=-1 : RETURN END IF F(I)=F(I)-H F(I)=INT(F(I)) IF F(I) < 0 THEN GOSUB BLINKING LOCATE (1)+1,(5)+1 : PRINT "Warning: shield "I" is down "; GOSUB NORMAL ELSE IF F(I) < 100 THEN GOSUB INTENSE LOCATE (1)+1,(5)+1 : PRINT "Warning: shield "I" is buckling "; GOSUB NORMAL END IF END IF IF E <= H0 THEN RETURN LOCATE (15)+1,(23)+1 : PRINT "Do you wish to renergize: "; A$=INPUT$(1) IF A$="N" OR A$="n" THEN LOCATE (15)+1,(49)+1 : PRINT "N"; IF A$="Y" OR A$="y" THEN LOCATE (15)+1,(49)+1 : PRINT "Y"; IF A$<>"Y" AND A$ <> "y" THEN RETURN E=E-H0 FOR I = 1 TO 4 F(I)=250 NEXT I RETURN ' KLINGON.ATTACK: ' ' THE PURPOSE OF THIS ROUTINE IS TO CALCULATE THE DAMAGE ' INFLICTED BY A KLINGON ATTACK. IT WILL CALCULATE THE ' ENERGY LOST AND DAMAGE TO THE SHIELDS. ' IF K3=0 THEN RETURN IF C$ = "DOCKED" THEN LOCATE (1)+1,(5)+1 : PRINT "Star base shields protect the Enterprise "; :RETURN END IF H0=0 FOR I = 1 TO 9 IF K(I,3) > 0 THEN IF SQR((K(I,1)-S1)^2+(K(I,2)-S2)^2) = 0 THEN GOSUB INTENSE LOCATE (1)+1,(5)+1 : PRINT "Enterprise landed on cloaked Klingon "; GOSUB NORMAL FG=-1 : RETURN END IF H=K(I,3)*(RND+2) H = H/SQR((K(I,1)-S1)^2+(K(I,2)-S2)^2) H0=H0+H END IF NEXT I E=E-H0 GOSUB INTENSE LOCATE (15)+1,(5)+1 : PRINT "Klingon Attack!!"; GOSUB NORMAL IF M$ = "Y" THEN GOSUB DEFLECTORS E=INT(E) RETURN ' GET.SCORES: ' ' THE PURPOSE OF THIS ROUTINE IS TO RETRIEVE THE TOP 10 ' SCORES IN THE PLAYER'S DIFFICULITY LEVEL. ' CLOSE 1 : OPEN "R", 1, "ATREK.DAT", 200 FIELD 1, 200 AS D$ V1=V0-3 GET 1,V1 IF M$="Y" THEN W$=LEFT$(D$,100) ELSE W$=RIGHT$(D$,100) FOR I = 1 TO 10 E$(I)=MID$(W$,(I-1)*10+1,10) NEXT I RETURN ' DISPLAY.SCORES: ' ' THE PURPOSE OF THIS ROUTINE IS TO DISPLAY THE TOP 10 ' SCORES IN THE PLAYER'S DIFFICULITY LEVEL. ' IF HC THEN CLS PRINT " ":PRINT " " PRINT " ATREK -- TOP 10 SCORES FOR LEVEL"V0-4 IF M$ = "Y" THEN PRINT " with Deflector shields" PRINT " " END IF FOR I = 10 TO 6 STEP -1 PRINT " "E$(I)" - "E$(I-5) NEXT I RETURN ' ERROR.HANDLER: ' ' THE PURPOSE OF THIS ROUTINE IS TO HANDLE ALL PROGRAM, AND ' SYSTEM ERRORS. ENTRY: ON ERROR GOTO ERROR.HANDLER\ ' D$="" IF ERR<50 THEN D$="Syntax Error" IF ERR=53 THEN D$="File not Found" IF ERR=64 THEN D$="Bad File Name" IF D$="" THEN D$="Disk Error" GOSUB INTENSE PRINT "** ";D$;", ERR#";STR$(ERR) IF ERR <= 50 THEN D!=ERL IF D! > 0 THEN PRINT "** Error Line Number";STR$(D!) PRINT " " PRINT "** Restart ATREK." PRINT " If error persists, write down message, contact me." PRINT " Dennis Allen" END IF GOSUB NORMAL RESUME RESUMED RESUMED: RETURN REM REM UTILITY ROUTINES EXIT. REM ' MAIN.ROUTINE: ' ' THE PURPOSE OF THIS ROUTINE IS TO CONTROL THE PROGRAM. ' THIS ROUTINE WILL ASK THE USER FOR INSTRUCTIONS. IT WILL ' THEN PROCEED TO INITIALIZE GALAXY VARIABLES, DISPLAY ' ORDERS, AND WILL SET UP THE PLAYING SCREEN. THE QUADRANT ' VARIABLES ARE INITIALIZED. THE CONDITION STATUS, DAMAGE ' CONTROL, AND SHORT RANGE SENSOR SCAN ARE UPDATED. THE ' PLAYER IS ASKED FOR A COMMAND. DEPENDING ON THE COMMAND ' THE STATUS, QUADRANT, OR GALAXY MAY BE RESET. THE PLAYER ' MAY PLAY AS MANY GAMES AS DESIRED. ENTRY & EXIT: THE ' SYSTEM. ' RANDOMIZE TIMER SCREEN 0,1,0 : COLOR 7,1,1 LOCATE ,,0 IF HC THEN CLS PRINT " Welcome to ATrek 1.2" PRINT " " PRINT " ATrek is a modified version"; PRINT " of the standard Star Trek game." PRINT " " DO GOSUB INSTRUCTIONS GOSUB SET.GALAXY GOSUB ORDERS GOSUB SET.SCREEN FG=0 DO WHILE NOT (FG=-1 OR FG=-2) GOSUB SET.QUADRANT FQ=0 DO WHILE NOT (FG=-1 OR FG=-2 OR FQ) GOSUB CONDITION.STATUS IF NOT (FG=-1 OR FG=-2 OR FQ) THEN GOSUB DAMAGE.CONTROL IF NOT (FG=-1 OR FG=-2 OR FQ) THEN GOSUB S.R.SENSOR FS=0 DO WHILE NOT (FG=-1 OR FG=-2 OR FQ OR FS) GOSUB COMMAND LOOP LOOP LOOP IF FG=-1 THEN GOSUB LOSE ELSE GOSUB WIN PRINT " ":PRINT " " PRINT " Do you wish to play again (Y or N) "; A$=INPUT$(1) : PRINT A$ LOOP UNTIL A$="N" OR A$="n" COLOR 7,0,0 : LOCATE ,,1 SYSTEM REM REM MAIN ROUTINES SECTION. REM ' INSTRUCTIONS: ' ' THE PURPOSE OF THIS ROUTINE IS TO DISPLAY INSTRUCTIONS. ' THIS ROUTINE WILL FIRST DISPLAY THE INSTRUCTIONS FROM ' THE ATREK HELP FILE. IT WILL THEN ASK THE PLAYER IF ' HE WISHES USE DEFLECTOR SCREENS. FINALLY, THE USER IS ' ASKED WHAT LEVEL OF DIFFICULITY TO PLAY. ENTRY & EXIT: ' THE MAIN ROUTINE. ' PRINT " " PRINT " Do you wish to receive instructions (Y or N) "; A$=INPUT$(1) : PRINT A$ IF A$ = "Y" OR A$ = "y" THEN O$="Y" ELSE O$="" IF O$="Y" THEN IF HC THEN CLS CLOSE 1 : OPEN "I", 1, "ATREK.HLP" DO WHILE NOT EOF(1) LINE INPUT#1, D$ IF MID$(D$,1,1)="." THEN IF MID$(D$,2,4)="CONT" THEN GOSUB PAUSE ELSE PRINT STRING$(HI,32);D$ END IF LOOP END IF PRINT " " PRINT " Do you wish to play with deflector screens (Y or N) "; A$=INPUT$(1) : PRINT A$ IF A$<>"N" AND A$<>"n" THEN M$="Y" ELSE M$="" IF O$="Y" THEN IF HC THEN CLS PRINT "Level of difficulty:" PRINT " " PRINT " In a standard version of Startrek, the galaxy is" PRINT "divided into 8 by 8 quadrants. In ATrek, the player has" PRINT "the option of choosing the size of the galaxy." PRINT " " PRINT " Level of difficulty" PRINT " 0 a 4 by 4 quadrant galaxy." PRINT " 1 a 5 by 5 quadrant galaxy." PRINT " 2 a 6 by 6 quadrant galaxy." PRINT " 3 a 7 by 7 quadrant galaxy." PRINT " 4 a 8 by 8 quadrant galaxy." END IF PRINT " " DO V0=0 PRINT " What level of difficulty would you prefer "; A$=INPUT$(1) : V0=VAL(A$) LOOP UNTIL V0 >= 0 AND V0 < 5 PRINT STR$(V0) : V0=V0+4 RETURN ' SET.GALAXY: ' ' THE PURPOSE OF THIS ROUTINE IS TO INITIALIZAE GALAXY ' VARIABLES. ENTRY & EXIT: THE MAIN ROUTINE. ' P=10 S9=200 FOR I = 1 TO 7 D(I)=0 NEXT I IF M$ = "Y" THEN E = 2000 : E0 = 2000 FOR I = 1 TO 4 : F(I)=250 : NEXT I ELSE E = 3000 : E0 = 3000 END IF T0=INT(RND*20+20)*100 T=T0 DO T9=INT(RND*V0*V0) LOOP UNTIL T9 >= V0 T9 = V0*V0 + T9 Q1=(RND*((V0)=0)*-1 + (INT(RND*(V0))+1)*((V0)<>0)*-1) Q2=(RND*((V0)=0)*-1 + (INT(RND*(V0))+1)*((V0)<>0)*-1) S1=INT(RND*8)+1 S2=INT(RND*8)+1 B9=0 : K9=0 FOR I = 1 TO V0 FOR J = 1 TO V0 DO R=INT(RND*6.4) LOOP UNTIL R<>0 K3=0 IF R<.001 GOTO MAIN.CASE K3=K3+1 IF R<.01 GOTO MAIN.CASE K3=K3+1 IF R<.08 GOTO MAIN.CASE K3=K3+1 IF R<.28 GOTO MAIN.CASE K3=K3+1 IF R<.68 GOTO MAIN.CASE K3=K3+1 IF R<1.28 GOTO MAIN.CASE K3=K3+1 IF R<2.68 GOTO MAIN.CASE K3=K3+1 IF R<4.28 GOTO MAIN.CASE K3=K3+1 IF R<5.88 GOTO MAIN.CASE K3=K3+1 MAIN.CASE: K9=K9+K3 B3=RND IF B3>.96 THEN B3=.96 B9=B9+B3 S3=INT(RND*8)+1 G(I,J)=INT(K3*100 + B3*10 + S3) NEXT J NEXT I K0=K9 IF B9<=0 THEN I=RND*V0 + .5 J=RND*V0 + .5 G(I,J)=G(I,J)+10 B9=1 END IF RETURN ' ORDERS: ' ' THE PURPOSE OF THIS ROUTINE IS TO DISPLAY THE ORDERS. ' ENTRY & EXIT: THE MAIN ROUTINE. ' IF HC THEN CLS PRINT "Orders: Stardate ="T PRINT " " PRINT " As commander of the United Spaceship Enterprise, your" PRINT "mission is to rid the galaxy of the deadly Klingon menace." PRINT "To do this, you must destroy the Klingon invasion force of" PRINT K9 " battle cruisers. You have "T9" solar years to complete" PRINT "your mission (i.e. until stardate "T0+T9")." PRINT " " PRINT "The Enterprise is currently in quadrant "Q1" - "Q2 PRINT " sector "S1" - "S2 GOSUB PAUSE RETURN ' SET.SCREEN: ' ' THE PURPOSE OF THIS ROUTINE IS TO INITIALIZE THE PLAYING ' SCREEN. ENTRY & EXIT: THE MAIN ROUTINE. ' IF HC THEN CLS GOSUB INTENSE LOCATE (0)+1,(4)+1 : PRINT "ATrek 1.2 by Dennis Allen"; : GOSUB NORMAL PRINT " level "V0-4; LOCATE (0)+1,(49)+1 : PRINT "Deadline Date:" : LOCATE (0)+1,(64)+1 : PRINT USING"####";T0+T9; LOCATE (2)+1,(4)+1 : PRINT "There are Klingons left"; LOCATE (1)+1,(60)+1 : PRINT "432"; : LOCATE (2)+1,(59)+1 : PRINT "5 * 1"; : LOCATE (3)+1,(60)+1 : PRINT "678"; LOCATE (2)+1,(37)+1 : PRINT "Torpedoes:"; : LOCATE (3)+1,(37)+1 : PRINT "Energy:"; LOCATE (4)+1,(5)+1 : PRINT "Date:"; : LOCATE (4)+1,(17)+1 : PRINT "Condition:"; LOCATE (4)+1,(37)+1 : PRINT "Quadrant: -"; LOCATE (5)+1,(37)+1 : PRINT "Position: -"; LOCATE (6)+1,(23)+1 : PRINT "0 = Course"; : LOCATE (6)+1,(46)+1 : PRINT "( - )"; LOCATE (7)+1,(23)+1 : PRINT "1 = Distruct"; LOCATE (8)+1,(23)+1 : PRINT "2 = L.R. Sen"; LOCATE (9)+1,(23)+1 : PRINT "3 = Phasers"; LOCATE (10)+1,(23)+1 : PRINT "4 = Photons"; LOCATE (11)+1,(23)+1 : PRINT "5 = C.P. Fire"; LOCATE (8)+1,(37)+1 : PRINT ": : : :"; LOCATE (9)+1,(37)+1 : PRINT ": : : :"; LOCATE (10)+1,(37)+1 : PRINT ": : : :"; IF M$ = "Y" THEN LOCATE (4)+1,(56)+1 : PRINT "Scrn#1"; LOCATE (5)+1,(56)+1 : PRINT "Scrn#2"; LOCATE (6)+1,(56)+1 : PRINT "Scrn#3"; LOCATE (7)+1,(56)+1 : PRINT "Scrn#4"; END IF FOR I = 1 TO 6 I0 = 612 + 80*I LOCATE INT((I0)/80)+1,((I0) MOD 80)+1 : PRINT Z$(I); NEXT I LOCATE (14)+1,(8)+1 : PRINT "COMMAND:"; RETURN ' SET.QUADRANT: ' ' THE PURPOSE OF THIS ROUTINE IS TO INITIALIZE QUADRANT ' VARIABLES. ENTRY & EXIT: THE MAIN ROUTINE. ' K3=0 : B3=0 : S3=0 IF NOT(Q1 < 1 OR Q1 > V0) THEN IF NOT(Q2 < 1 OR Q2 > V0) THEN IF NOT(Q2 > V0) THEN K3=INT(G(Q1,Q2)/100) B3=INT(G(Q1,Q2)/10)-K3*10 S3=G(Q1,Q2)-INT(G(Q1,Q2)*.1)*10 FOR I0 = 1 TO 9 FOR J0 = 1 TO 3 K(I0,J0)=0 NEXT J0 NEXT I0 END IF END IF END IF FOR I0 = 1 TO 8 FOR J0 = 1 TO 8 Q(I0,J0)=0 NEXT J0 NEXT I0 Q(S1,S2)=1 IF K3 <> 0 THEN FOR I = 1 TO K3 GOSUB RANDOM. Q(R1,R2)=2 K(I,1)=R1 K(I,2)=R2 K(I,3)=S9 NEXT I END IF IF B3 <> 0 THEN FOR I = 1 TO B3 GOSUB RANDOM. Q(R1,R2)=3 NEXT I END IF IF S3 <> 0 THEN FOR I = 1 TO S3 GOSUB RANDOM. Q(R1,R2)=4 NEXT I END IF A=1000 '? RETURN ' CONDITION.STATUS: ' ' THE PURPOSE OF THIS ROUTINE IS TO UPDATE THE ENTERPRISE'S ' CONDITION STATUS. ENTRY & EXIT: THE MAIN ROUTINE. ' LOCATE (2)+1,(14)+1 : PRINT USING"###";K9; A1=S1-1 A8=S1+1 IF A1<1 THEN A1=1 IF A8>8 THEN A8=8 I=A1 : FL=0 DO WHILE I <= A8 AND NOT FL B1=S2-1 B8=S2+1 IF B1<1 THEN B1=1 IF B8>8 THEN B8=8 J=B1 DO WHILE J <= B8 AND NOT FL IF Q(I,J)=3 THEN C$="DOCKED" IF M$ = "Y" THEN FOR O = 1 TO 4 F(O)=250 NEXT O E=2000 ELSE E=3000 END IF P=10 FL=-1 END IF J=J+1 LOOP I=I+1 LOOP IF NOT FL THEN IF K3 > 0 THEN C$=" RED " ELSE IF E"0" THEN LOCATE (14)+1,(16)+1 : PRINT " "; LOCATE (15)+1,(5)+1 : PRINT " Bad command, retype: "; END IF LOOP UNTIL A<>0 OR A$="0" LOCATE (1)+1,(0)+1 : PRINT STRING$(52," "); LOCATE (14)+1,(23)+1 : PRINT STRING$(29," "); LOCATE (15)+1,(0)+1 : PRINT STRING$(52," "); LOCATE (16)+1,(0)+1 : PRINT STRING$(52," "); LOCATE (17)+1,(0)+1 : PRINT STRING$(52," "); ON A+1 GOSUB WARP.DRIVE,DESTRUCT,L.R.SENSOR,PHASERS,PHOTONS,PHOTONS RETURN REM REM COMMAND ROUTINES SECTION. REM ' WARP.DRIVE: ' ' THE PURPOSE OF THIS ROUTINE IS TO REQUEST FOR WARP COURSE ' AND SPEED. IT WILL THEN CALCULATE AND DISPLAY THE ' RESULTING LOCATION OF SHIP. ENTRY & EXIT: COMMAND\ ' DO DO LOCATE (14)+1,(23)+1 : PRINT " "; C1=0 LOCATE (14)+1,(22)+1 : PRINT " "; INPUT "Enter Course ";C1 IF C1=0 THEN RETURN LOOP UNTIL C1>=1 AND C1<9 DO LOCATE (15)+1,(23)+1 : PRINT " "; W1=0 LOCATE (15)+1,(22)+1 : PRINT " "; INPUT " Warp ";W1 LOOP UNTIL W1>=0 AND W1<=8 FL=-1 IF D(1) < 0 AND W1 > .2 THEN GOSUB INTENSE LOCATE (1)+1,(5)+1 : PRINT "Warp engines damaged, max speed = warp .2"; GOSUB NORMAL FL=0 END IF LOOP UNTIL FL IF K3 > 0 THEN GOSUB KLINGON.ATTACK : IF FG THEN RETURN IF E<=0 THEN FG=-1 : RETURN END IF FOR I = 1 TO 7 D(I)=D(I)+1 IF D(I)>0 THEN D(I)=0 NEXT I IF RND<=.2 THEN R1=INT(RND*7)+1 IF RND<=.4 THEN D(R1)=D(R1) - (INT(RND*4)+1) GOSUB INTENSE LOCATE (1)+1,(5)+1 : PRINT "Space storm, ";Z$(R1)" damaged "; GOSUB NORMAL ELSE I=R1 : FL=0 DO WHILE I <= 7 AND NOT FL IF D(I)<0 THEN FL=-1 ELSE I=I+1 LOOP IF NOT FL THEN I=1 DO WHILE I <= R1-1 AND NOT FL IF D(I)<0 THEN FL=-1 ELSE I=I+1 LOOP IF FL THEN R1=I D(I)=D(I) + INT(RND*7)+1 IF D(I)>0 THEN D(I)=0 LOCATE (1)+1,(5)+1 : PRINT "Truce, ";Z$(R1)" being repaired "; END IF END IF END IF IF W1 <.13 THEN W1=.13 N=INT(W1*8) E=E-2*N T=T+1 Q(S1,S2)=0 P1=S1 P2=S2 X=S1 Y=S2 IF T>T0+T9 THEN FG=-1 : RETURN GOSUB COURSE.PLOTTER I=1 : FL=0 DO WHILE I <= N AND NOT FL S1=S1+X1 S2=S2+X2 IF S1<.5 OR S1>=8.5 THEN FL=-1 IF S2<.5 OR S2>=8.5 THEN FL=-1 IF NOT FL THEN IF Q(INT(S1+.5),INT(S2+.5)) <> 0 THEN LOCATE (14)+1,(23)+1 : PRINT "Enterprise blocked at "; LOCATE (15)+1,(23)+1 : PRINT "Sector "INT(S1+.5)" - "INT(S2+.5)" "; S1=S1-X1 S2=S2-X2 I=N END IF I=I+1 END IF LOOP IF NOT FL THEN S1=INT(S1+.5) S2=INT(S2+.5) Q(S1,S2)=1 FS=-1 :RETURN END IF Q1=INT(Q1+W1*X1+(X-.5)/8) IF Q1>8 THEN Q1=8 IF Q1<1 THEN Q1=1 Q2=INT(Q2+W1*X2+(Y-.5)/8) IF Q2>8 THEN Q2=8 IF Q2<1 THEN Q2=1 S1=INT(RND*8)+1 S2=INT(RND*8)+1 FQ=-1 RETURN ' DESTRUCT: ' ' THE PURPOSE OF THIS ROUTINE IS TO INVOKE THE SELF ' DESTRUCT. ENTRY & EXIT: COMMAND\ ' GOSUB BLINKING LOCATE (1)+1,(5)+1 : PRINT "Self Distruct sequence engaged"; GOSUB NORMAL FG=-1 RETURN ' L.R.SENSOR: ' ' THE PURPOSE OF THIS ROUTINE IS TO DISPLAY THE LONG RANGE ' SENSOR SCAN. ENTRY & EXIT: COMMAND\ ' IF D(3) < 0 THEN GOSUB INTENSE LOCATE (1)+1,(5)+1 : PRINT "Long range sensors are inoperable "; GOSUB NORMAL :RETURN END IF FOR I = Q1-1 TO Q1+1 N(1)=0 : N(2)=0 : N(3)=0 FOR J = Q2-1 TO Q2+1 IF I >= 1 AND I <= V0 THEN IF J >= 1 AND J <= V0 THEN N(J-Q2+2)=INT(G(I,J)) END IF END IF NEXT J J= I - Q1 + 2 I0=598 + 80*J LOCATE INT((I0)/80)+1,((I0) MOD 80)+1 : PRINT USING"###";N(1); LOCATE INT((I0+4)/80)+1,((I0+4) MOD 80)+1 : PRINT USING"###";N(2); LOCATE INT((I0+8)/80)+1,((I0+8) MOD 80)+1 : PRINT USING"###";N(3); NEXT I RETURN ' PHASERS: ' ' THE PURPOSE OF THIS ROUTINE IS TO REQUEST AND DISPLAY AN ' ACTION INVOLVING PHASERS. ENTRY & EXIT: COMMAND\ ' IF D(4) < 0 THEN GOSUB INTENSE LOCATE (1)+1,(5)+1 : PRINT "Phaser control is disabled "; GOSUB NORMAL :RETURN END IF DO LOCATE (14)+1,(23)+1 : PRINT " "; LOCATE (14)+1,(23)+1 : PRINT "Of";:LOCATE (14)+1,(26)+1 : PRINT USING"####";E; A$="" LOCATE (14)+1,(30)+1 : PRINT " "; LINE INPUT "units fire ";A$ : X = VAL(A$) IF X <= 0 THEN RETURN LOOP UNTIL E-X >= 0 E=E-X IF K3=0 THEN IF E<=0 THEN FG=-1 : RETURN FS=-1 : RETURN END IF FOR I = 1 TO 9 IF K(I,3) > 0 THEN R0 = SQR((K(I,1)-S1)^2+(K(I,2)-S2)^2) IF INT(R0) = 0 THEN GOSUB BLINKING LOCATE (1)+1,(5)+1 : PRINT "Enterprise landed on cloaked Klingon"; GOSUB NORMAL FG=-1 : RETURN END IF H = X*(RND+2) H=H/R0 K(I,3)=K(I,3)-H IF K(I,3) > 0 THEN K(I,3)=K(I,3)+H ELSE K3=K3-1 K9=K9-1 Q(K(I,1),K(I,2))=0 G(Q1,Q2)=K3*100+B3*10+S3 IF K9<=0 THEN FG=-2 : RETURN IF K3<=0 THEN LOCATE (1)+1,(5)+1 : PRINT "Quadrant Cleared"; FS=-1 : RETURN END IF END IF END IF NEXT I GOSUB KLINGON.ATTACK : IF FG THEN RETURN IF E<=0 THEN FG=-1 : RETURN FS=-1 RETURN ' PHOTONS: ' ' THE PURPOSE OF THIS ROUTINE IS TO REQUEST AND DISPLAY AN ' ACTION INVOLVING PHOTON TORPEDOES. THIS ROUTINE WILL ' ALSO HANDLE COMPUTER CONTROLLED PHOTON FIRING. ENTRY & ' EXIT: COMMAND\ ' IF D(5) < 0 THEN GOSUB INTENSE LOCATE (1)+1,(5)+1 : PRINT "Computer cannot use photon tubes "; GOSUB NORMAL :RETURN END IF IF P <= 0 THEN GOSUB INTENSE LOCATE (1)+1,(5)+1 : PRINT "All photon torpedoes expended "; GOSUB NORMAL :RETURN END IF IF A = 5 THEN GOSUB P.C.FIRE : IF NOT FL THEN RETURN ELSE DO LOCATE (14)+1,(23)+1 : PRINT " "; C1=0 LOCATE (14)+1,(22)+1 : PRINT " "; INPUT "Torpedo Course ";C1 IF C1=0 THEN RETURN LOOP UNTIL C1>=1 AND C1<9 GOSUB COURSE.PLOTTER END IF X=S1 Y=S2 P=P-1 FL=0 DO X=X+X1 Y=Y+X2 IF X<.5 OR X>=8.5 THEN FL=-1 IF Y<.5 OR Y>=8.5 THEN FL=-1 IF NOT FL THEN X0 = INT(X+.5) : Y0 = INT(Y+.5) IF D(2) >= 0 THEN FOR D = 1 TO 1000 : NEXT D J0 = (324+80*X0)+(Y0*2-1) LOCATE INT((J0)/80)+1,((J0) MOD 80)+1 : PRINT " "; END IF END IF LOOP UNTIL Q(X0,Y0)<>0 OR FL IF FL THEN LOCATE (14)+1,(23)+1 : PRINT "Torpedo Missed "; GOSUB KLINGON.ATTACK : IF FG THEN RETURN FS=-1 : RETURN END IF SELECT CASE Q(X0,Y0) CASE 2 LOCATE (14)+1,(23)+1 : PRINT "Klingon Destroyed "; K3=K3-1 K9=K9-1 G(Q1,Q2)=K3*100+B3*10+S3 IF K9<=0 THEN FG=-2 : RETURN IF K3<=0 THEN LOCATE (1)+1,(5)+1 : PRINT "Quadrant Cleared"; END IF I=1 : FL=0 DO WHILE I <= 9 AND NOT FL IF X0 = K(I,1) AND Y0=K(I,2) THEN FL=-1 ELSE I=I+1 LOOP IF NOT FL THEN ERROR 0 K(I,3)=0 Q(K(I,1),K(I,2))=0 I = INT(RND*9)+1 IF K(I,3) > 0 THEN Q(K(I,1),K(I,2)) = 0 CASE 4 LOCATE (14)+1,(23)+1 : PRINT "Star Destroyed "; S3=S3-1 CASE ELSE LOCATE (14)+1,(23)+1 : PRINT "Star Base Destroyed ... "; LOCATE (15)+1,(23)+1 : PRINT "Congratulations "; B3=B3-1 C$=" RED " END SELECT Q(X0,Y0)=0 G(Q1,Q2)=K3*100+B3*10+S3 GOSUB KLINGON.ATTACK : IF FG THEN RETURN IF E<=0 THEN FG=-1 : RETURN FS=-1 RETURN REM REM PHOTON ROUTINES SECTION. REM ' P.C.FIRE: ' ' THE PURPOSE OF THIS ROUTINE IS TO ASK THE PLAYER THE ' COORDINATES OF THE KLINGON TARGET. IT WILL THEN CALCULATE ' THE TORPEDO COURSE BASED UPON THE TARGET COORDINATES. ' ENTRY & EXIT: PHOTONS\ ' FL=0 IF E <= 200 THEN GOSUB INTENSE LOCATE (1)+1,(5)+1 : PRINT "Energy to low "; GOSUB NORMAL :RETURN END IF E = E - 200 IF D(6) < 0 THEN GOSUB INTENSE LOCATE (1)+1,(5)+1 : PRINT "On board computer is damaged "; GOSUB NORMAL :RETURN END IF DO LOCATE (14)+1,(23)+1 : PRINT "In what sector is "; LOCATE (15)+1,(23)+1 : PRINT "target located ? "; A$=INPUT$(1) S4=VAL(A$) : IF S4=0 THEN RETURN ELSE LOCATE (15)+1,(39)+1 : PRINT A$+" -" A$=INPUT$(1) S5=VAL(A$) : IF S5=0 THEN RETURN ELSE LOCATE (15)+1,(43)+1 : PRINT A$ FL=-1 IF S4 < 1 OR S4 > 8 THEN FL=0 IF S5 < 1 OR S5 > 8 THEN FL=0 IF S4=S1 AND S5=S2 THEN FL=0 LOOP UNTIL FL X=S5 - S2 Y=S4 - S1 X2=X/SQR(X*X + Y*Y) X1=Y/SQR(X*X + Y*Y) RETURN REM REM COMMAND ROUTINES EXIT. REM ' LOSE: ' ' THE PURPOSE OF THIS ROUTINE IS TO DISPLAY A MESSAGE TO A ' PLAYER THAT LOST. IT WILL THEN RETRIEVE AND DISPLAY THE ' TOP 10 SCORES IN THE PLAYER'S DIFFICULTY LEVEL. ' ENTRY & EXIT: THE MAIN ROUTINE. ' LOCATE (3)+1,(45)+1 : PRINT USING"#####";E; I0=1 FOR D! = 1 TO 20000 REM NEXT D! IF HC THEN CLS PRINT " ": PRINT " " PRINT " It is stardate "T"." PRINT " The Enterprise has been destroyed!!" PRINT " The Federation will be conquered." PRINT " There are still"K9"klingon battle cruisers left." GOSUB PAUSE GOSUB GET.SCORES GOSUB DISPLAY.SCORES RETURN ' WIN: ' ' THE PURPOSE OF THIS ROUTINE IS TO DISPLAY A MESSAGE TO A ' PLAYER THAT WON. THE TOP TEN SCORES FOR THE PLAYER'S ' DIFFICULITY LEVEL IS THEN RETRIVED FROM ATREK/DAT. IF THE ' PLAYER QUALIFIES IN THE TOP 10, THE PLAYER IS ASKED FOR ' HIS/HER INITIALS. THE TOP 10 SCORES ARE DISPLAYED. ' ENTRY & EXIT: THE MAIN ROUTINE. ' IF HC THEN CLS PRINT " ": PRINT " " R0 = INT(K0/(T-T0)*1000) REM PRINT " It is stardate "T"." PRINT " The Federation has been saved." PRINT " You have been promoted to Admiral!" GOSUB GET.SCORES I = 10 : FL=0 DO WHILE I > 1 AND NOT FL IF R0 > VAL(MID$(E$(I),6,10)) THEN FL=-1 ELSE I=I-1 LOOP IF NOT FL THEN PRINT " "K0" Klingons in "T-T0" years. Rating = "R0 GOSUB PAUSE GOSUB DISPLAY.SCORES :RETURN END IF IF I <> 1 THEN FOR J = 1 TO I-1 E$(J)=E$(J+1) NEXT J END IF MID$(E$(I),6,10)=STR$(R0) PRINT " " PRINT " Your score is in the top 10 for level "V0-4 IF M$="Y" THEN PRINT " With Deflector Shields." A$=" " : MID$(E$(I),1,3)=A$ INPUT " Please give your initials ";A$ MID$(E$(I),1,3)=A$ W$="" IF M$<>"Y" THEN W$=LEFT$(D$,100) FOR I = 1 TO 10 W$=W$+E$(I) IF E$(I)=STRING$(LEN(E$(I)),32) THEN ERROR 0 NEXT I IF M$="Y" THEN W$=W$+RIGHT$(D$,100) LSET D$=W$ PUT 1,V1 GOSUB DISPLAY.SCORES RETURN REM REM MAIN ROUTINES EXIT. REM END '