0 'CTREK.BAS version 1.1 - released 9008.12 10 'Subroutines: 20 ' 1000 - Read Config File 30 ' 2000 - Select Enemies 40 ' 3000 - Speak 50 ' 4000 - Say (sound effects) 60 ' 5000 - Execute Command 70 ' 6000 - Scan Enemy 80 ' 7000 - Damage Report 90 ' 8000 - Fire Torpedoes 100 ' 9000 - Fire Phasers 110 ' 10000 - Enemy Turn (etc.) 120 KEY OFF 130 CLS:PRINT"Covox Trek 1.1, by T. Wendell Martin, Jr.":PRINT:PRINT 140 GOSUB 1000'Read config 150 'Get vector for STALK program. 160 PROG.NAME$="STALK.EXE" 170 IF INSTR(COVOX.EQUIP$,"ST") THEN GOSUB 60000'Finder 180 DEFINT A-Z 190 IF INSTR(COVOX.EQUIP$,"ST")=0 THEN 240'skip ST init 200 SPEECH.INIT=0:CALL SPEECH.INIT 210 TONE=0:VOLUME=9:PITCH=6:SPEED=7 220 SET.SPEECH=6:CALL SET.SPEECH (TONE,VOLUME,PITCH,SPEED) 230 SPEAK=3'offset for CALLs 240 GOSUB 2000'Select enemies 250 RANDOMIZE(TIMER) 260 OUR.SHIELDS=4 270 OUR.ENGINES=4 280 OUR.PHASERS=4 290 OUR.TORPEDOES=4 300 OUR.SPEED=INT(RND*3) 310 OUR.OLDSPEED=-1'in case we start sublight 320 CLS 330 SPEAK$="Automatic shields triggered; "+ENEMY.TYPE$:IF LEFT$(ENEMY.TYPE$,3)="Rom" THEN SPEAK$=SPEAK$+" decloaking." ELSE SPEAK$=SPEAK$+" approaching." 340 GOSUB 3000'speak 350 'New ship approaches 360 ENEMY.SHIELDS=E.S 370 ENEMY.ENGINES=E.E 380 ENEMY.WEAPONS=E.W 390 ENEMY.RANGE=99'forces start at extreme range 400 IF LEFT$(ENEMY.TYPE$,3)="Rom" THEN ENEMY.RANGE=9'cloak surprise 410 ENEMY.BEARING=INT(RND*4)+1 420 IF ENEMIESKILLED THEN ENEMY.SPEED=3'this isn't the first ship, so it's coming in fast 430 ENEMY.OLDSPEED=-1 440 GOSUB 10000'Enemy turn 450 'main combat loop 460 WHILE NOT ENEMYDESTROYED 470 INPUT "Your orders";A$ 480 GOSUB 5000'Execute command 490 IF GOAGAIN THEN 470'Info commands don't use time 500 GOSUB 10000'Enemy turn 510 IF WEREDESTROYED THEN SPEAK$="We're through...":GOSUB 3000:SAY$="ctexpl":GOSUB 4000:GOSUB 4000:PRINT:PRINT"<< Enterprise destroyed >>":PRINT:END 520 WEND 530 ENEMYDESTROYED=0 540 ENEMIESKILLED=ENEMIESKILLED+1 550 IF ENEMIESKILLED<>ENEMY.NUMBER THEN PRINT:SPEAK$="Another "+ENEMY.TYPE$+" is approaching.":GOSUB 3000 560 CRIPTIMER=0 570 IF ENEMIESKILLED>":PRINT 590 END 1000 ' 1010 'Read Config File 1020 ' 1030 OPEN"i",#1,"ctrek.cfg" 1040 INPUT #1,COVOX.EQUIP$'ST for Speech Thing &/or VM for Voice Master Key 1050 INPUT #1,SAY.PATH$'where SAY.COM is 1060 INPUT #1,COVOX.PORT$'LPT1, VM0, etc 1070 CLOSE #1 1080 RETURN 2000 ' 2010 'Select Enemies 2020 ' 2030 PRINT"Choose enemies:":PRINT 2040 PRINT"1) 3 Klingon Battlecruisers ":PRINT"2) 2 Klingon Battleships " 2050 PRINT"3) 3 Romulan Cruisers ":PRINT"4) 2 Romulan Battleships " 2060 PRINT:INPUT"Choice";CHOICE 2070 IF CHOICE<1 OR CHOICE>4 OR CHOICE<>INT(CHOICE) THEN 2060 2080 IF CHOICE=1 OR CHOICE=3 THEN ENEMY.NUMBER=3 ELSE ENEMY.NUMBER=2 2090 IF CHOICE=1 OR CHOICE=2 THEN ENEMY.WPNTYPE$="disruptors" ELSE ENEMY.WPNTYPE$="plasma weapon" 2100 IF CHOICE=1 THEN ENEMY.TYPE$="Klingon battlecruiser":E.S=3:E.E=4:E.W=4'starting enemy shields, etc. 2110 IF CHOICE=2 THEN ENEMY.TYPE$="Klingon battleship":E.S=4:E.E=4:E.W=4 2120 IF CHOICE=3 THEN ENEMY.TYPE$="Romulan cruiser":E.S=3:E.E=3:E.W=4 2130 IF CHOICE=4 THEN ENEMY.TYPE$="Romulan battleship":E.S=4:E.E=3:E.W=4 2140 RETURN 3000 ' 3010 'Speak 3020 ' 3030 PRINT SPEAK$:SPEAK2$="" 3040 IF INSTR(COVOX.EQUIP$,"ST")=0 THEN 3250'no Speech Thing, so return 3050 'check each word... 3060 FOR SPEAKC=1 TO LEN(SPEAK$) 3070 LETTER$=MID$(SPEAK$,SPEAKC,1) 3080 WORD$=WORD$+LETTER$:IF INSTR(" .!",LETTER$)=0 THEN 3220'next 3090 'if STalk will mispronounce, adjust spelling... 3100 IF WORD$="battleship " THEN WORD$="battl ship " 3110 IF WORD$="battlecruiser " THEN WORD$="battl cruser " 3120 IF WORD$="cruiser " THEN WORD$="cruser " 3130 IF WORD$="photon " OR WORD$="Photon " THEN WORD$="fo ton " 3140 IF WORD$="torpedoes." THEN WORD$="torpeedoes." 3150 IF WORD$="Torpedoes "OR WORD$="torpedoes " THEN WORD$="torpeedoes " 3160 IF WORD$="torpedo " THEN WORD$="torpeedo " 3170 IF WORD$="shields " OR WORD$="Shields " THEN WORD$="sheelds " 3180 IF WORD$="shield " OR WORD$="Shield " THEN WORD$="sheeld " 3190 IF WORD$="disabled." THEN WORD$="diss abled." 3200 IF WORD$="close "THEN WORD$="cloass " 3210 SPEAK2$=SPEAK2$+WORD$:WORD$="" 3220 NEXT SPEAKC 3230 'say adjusted sentence. 3240 CALL SPEAK(SPEAK2$) 3250 RETURN 4000 ' 4010 'Say (sound effects) 4020 ' 4030 IF INSTR(COVOX.EQUIP$,"VM") OR INSTR(COVOX.EQUIP$,"ST") THEN SHELL SAY.PATH$+"say "+SAY$+" /p"+COVOX.PORT$+" >nul" 4040 RETURN 5000 ' 5010 'Execute Command 5020 ' 5030 GOAGAIN=0'commands normally use a turn, but info requests don't, nor do requests for impossible actions. 5040 'convert any upper case letters to lower case. 5050 FOR C=1 TO LEN(A$) 5060 L=ASC(MID$(A$,C,1)) 5070 IF L<96 THEN L=L+32:MID$(A$,C,1)=CHR$(L) 5080 NEXT C 5090 IF LEN(A$)<>2 THEN GOAGAIN=-1:GOTO 5390'return 5100 IF INSTR("se dr ap at fp ft su sd tp ts rs rp rt re dn ",A$+" ")=0 THEN GOAGAIN=-1:GOTO 5390'return since command invalid 5110 IF A$="se" THEN SAY$="ctsensor":GOSUB 4000:GOAGAIN=-1:GOSUB 6000'Scan enemy 5120 IF A$="dr" THEN GOAGAIN=-1:GOSUB 7000'damage report 5125 IF A$="at" AND TORPEDOESARMED THEN SPEAK$="Photon torpedoes already armed.":GOSUB 3000:GOAGAIN=-1 5130 IF A$="at" AND NOT TORPEDOESARMED THEN SPEAK$="Arming photon torpedoes.":GOSUB 3000:SAY$="ctctrl":GOSUB 4000:TORPEDOESARMED=-1 5135 IF A$="ap" AND PHASERSARMED THEN SPEAK$="Phasers already armed.":GOSUB 3000:GOAGAIN=-1 5140 IF A$="ap" AND NOT PHASERSARMED THEN SPEAK$="Arming phasers.":GOSUB 3000:SAY$="ctctrl":GOSUB 4000:PHASERSARMED=-1 5150 IF (A$="ft" AND TORPEDOESARMED AND ENEMY.RANGE>9) OR (A$="fp" AND PHASERSARMED AND ENEMY.RANGE>6) THEN SPEAK$="Enemy out of range.":GOSUB 3000:GOAGAIN=-1:GOTO 5390'return 5160 IF A$="ft" AND TORPEDOESARMED AND ENEMY.RANGE<4 THEN SPEAK$="Too close for torpedoes.":GOSUB 3000:GOAGAIN=-1:GOTO 5390'return 5170 IF A$="ft" AND TORPEDOESARMED AND OUR.TORPEDOES<>0 THEN SAY$="ctrelay":GOSUB 4000:SAY$="cttorp":GOSUB 4000:GOSUB 8000 5180 IF A$="ft" AND TORPEDOESARMED AND OUR.TORPEDOES=0 THEN SPEAK$="Photon torpedo tubes inoperative.":GOSUB 3000:GOAGAIN=-1:GOTO 5390'return 5190 IF A$="ft" AND NOT TORPEDOESARMED THEN SPEAK$="Photon torpedoes not armed.":GOSUB 3000:GOAGAIN=-1:GOTO 5390'return 5200 IF A$="fp" AND OUR.PHASERS<>0 AND PHASERSARMED THEN SAY$="ctrelay":GOSUB 4000:SAY$="ctphaser":GOSUB 4000:GOSUB 9000 5210 IF A$="fp" AND PHASERSARMED AND OUR.PHASERS=0 THEN SPEAK$="Phasers inoperative.":GOSUB 3000:GOAGAIN=-1:GOTO 5390'return 5220 IF A$="fp" AND NOT PHASERSARMED THEN SPEAK$="Phasers not armed.":GOSUB 3000:GOAGAIN=-1:GOTO 5390'return 5230 IF A$="su" AND OUR.SPEED>=OUR.ENGINES THEN SPEAK$="The engines can't take any more.":GOSUB 3000:GOAGAIN=-1 5240 IF A$="su" AND OUR.SPEED0 THEN SAY$="ctdecel.vmf":GOSUB 4000:OUR.SPEED=OUR.SPEED-1 5270 IF A$="tp" THEN ENEMY.BEARING=ENEMY.BEARING+1:SPEAK$="Turning port.":GOSUB 3000 5280 IF A$="ts" THEN ENEMY.BEARING=ENEMY.BEARING-1:SPEAK$="Turning starboard.":GOSUB 3000 5290 IF ENEMY.BEARING<1 THEN ENEMY.BEARING=4 ELSE IF ENEMY.BEARING>4 THEN ENEMY.BEARING=1 5300 REPAIR=INT(RND*2) 5310 IF A$="rs" AND OUR.SHIELDS=4 THEN SPEAK$="Shields undamaged.":GOSUB 3000:GOAGAIN=-1:GOTO 5390'return 5320 IF A$="rs" THEN IF REPAIR THEN SPEAK$="Shield repair successful.":GOSUB 3000:OUR.SHIELDS=OUR.SHIELDS+1 ELSE SPEAK$="Shield repair unsuccessful.":GOSUB 3000 5330 IF A$="re" AND OUR.ENGINES=4 THEN SPEAK$="Engines undamaged.":GOSUB 3000:GOAGAIN=-1:GOTO 5390'return 5340 IF A$="re" THEN IF REPAIR THEN SPEAK$="Engine repair successful.":GOSUB 3000:OUR.ENGINES=OUR.ENGINES+1 ELSE SPEAK$="Engine repair unsuccessful.":GOSUB 3000 5350 IF A$="rp" AND OUR.PHASERS=4 THEN SPEAK$="Phasers undamaged.":GOSUB 3000:GOAGAIN=-1:GOTO 5390'return 5360 IF A$="rp" THEN IF REPAIR THEN SPEAK$="Phaser repair successful.":GOSUB 3000:OUR.PHASERS=OUR.PHASERS+1 ELSE SPEAK$="Phaser repair unsuccessful.":GOSUB 3000 5370 IF A$="rt" AND OUR.TORPEDOES=4 THEN SPEAK$="Photon torpedo tubes undamaged.":GOSUB 3000:GOAGAIN=-1:GOTO 5390'return 5380 IF A$="rt" THEN IF REPAIR THEN SPEAK$="Photon torpedo tube repair successful.":GOSUB 3000:OUR.TORPEDOES=OUR.TORPEDOES+1 ELSE SPEAK$="Photon torpedo tube repair unsuccessful.":GOSUB 3000 5390 RETURN 6000 ' 6010 'Scan Enemy 6020 ' 6030 '(in this routine and in Damage Report, conditions that result in ship destruction (like no engines) are checked for reporting. This is because future versions may kill ships differently) 6040 IF ENEMY.SPEED<>0 THEN SPEAK$="Speed is warp"+STR$(ENEMY.SPEED*2)+".":GOSUB 3000 ELSE SPEAK$="Travelling sublight.":GOSUB 3000 6050 IF ENEMY.ENGINES=E.E AND ENEMY.SHIELDS=E.S AND ENEMY.WEAPONS=E.W THEN SPEAK$="They are fully operational.":GOSUB 3000 6060 IF ENEMY.SHIELDS0 THEN SPEAK$="Shields at"+STR$(100*ENEMY.SHIELDS\E.S)+"%.":GOSUB 3000 6070 IF ENEMY.SHIELDS=0 THEN SPEAK$="Their shields are down.":GOSUB 3000 6080 IF ENEMY.ENGINES0 THEN SPEAK$="Engines are at"+STR$(100*ENEMY.ENGINES\E.E)+"% power.":GOSUB 3000 6090 IF ENEMY.ENGINES=0 THEN SPEAK$="Their engines are disabled.":GOSUB 3000 6100 IF ENEMY.WEAPONS0 THEN SPEAK$="Enemy "+ENEMY.WPNTYPE$+" at"+STR$(100*ENEMY.WEAPONS\E.W)+"% efficiency.":GOSUB 3000 6110 IF ENEMY.WEAPONS=0 THEN SPEAK$=ENEMY.WPNTYPE$+" neutralized.":GOSUB 3000 6120 RETURN 7000 ' 7010 'Damage Report 7020 ' 7030 IF OUR.SPEED<>0 THEN SPEAK$="We're at warp"+STR$(OUR.SPEED*2)+".":GOSUB 3000 ELSE SPEAK$="We are sublight.":GOSUB 3000 7040 IF OUR.ENGINES=4 AND OUR.SHIELDS=4 AND OUR.PHASERS=4 AND OUR.TORPEDOES=4 THEN SPEAK$="We are fully functional.":GOSUB 3000 7050 IF OUR.SHIELDS<4 AND OUR.SHIELDS<>0 THEN SPEAK$="Shields are at"+STR$(100*OUR.SHIELDS/4)+"%.":GOSUB 3000 7060 IF OUR.SHIELDS=0 THEN SPEAK$="Our shields are down.":GOSUB 3000 7070 IF OUR.ENGINES<4 AND OUR.ENGINES<>0 THEN SPEAK$="Engines at"+STR$(100*OUR.ENGINES/4)+"% power.":GOSUB 3000 7080 IF OUR.ENGINES=0 THEN SPEAK$="Engines are completely disabled.":GOSUB 3000 7090 IF OUR.PHASERS<4 AND OUR.PHASERS<>0 THEN SPEAK$="Phaser efficiency is"+STR$(100*OUR.PHASERS/4)+"%.":GOSUB 3000 7100 IF OUR.PHASERS=0 THEN SPEAK$="Our phasers are non-functional.":GOSUB 3000 7110 IF OUR.TORPEDOES<4 AND OUR.TORPEDOES<>0 THEN SPEAK$="Photon torpedo tubes"+STR$(100*OUR.TORPEDOES/4)+"% operational.":GOSUB 3000 7120 IF OUR.TORPEDOES=0 THEN SPEAK$="All photon torpedo tubes destroyed.":GOSUB 3000 7130 RETURN 8000 ' 8010 'Fire Torpedoes 8020 ' 8030 TOHIT=70/(ENEMY.RANGE/4)'to-hit % chance 8040 IF ENEMY.RANGE>9 OR ENEMY.RANGE<4 THEN TOHIT=0 8050 ENEMY.HITS=0:IF RND*100ENEMY.SHIELDS THEN WERE.HURT=-1':SAY$="ctexpl":GOSUB 3000'KA-BOOM! 8090 SHIELDS.BUCKLING=0:IF WERE.HURT AND INT(RND*2)=1 THEN SHIELDS.BUCKLING=-1 8100 IF SHIELDS.BUCKLING THEN IF ENEMY.SHIELDS<>0 THEN ENEMY.SHIELDS=ENEMY.SHIELDS-1:SPEAK$="Their shields are buckling.":GOSUB 3000 8110 IF ENEMY.HITS AND NOT WERE.HURT AND ENEMY.SHIELDS<>0 THEN SPEAK$="Enemy shields held.":GOSUB 3000 8120 SYS=0:IF WERE.HURT THEN SYS=INT(RND*3)+1 8130 IF SYS=1 AND ENEMY.ENGINES=0 OR SYS=2 AND ENEMY.WEAPONS=0 OR SYS=3 AND ENEMY.SHIELDS=0 THEN 8120'can't kill what's already dead 8140 IF SYS=1 THEN ENEMY.ENGINES=ENEMY.ENGINES-1 ELSE IF SYS=2 THEN ENEMY.WEAPONS=ENEMY.WEAPONS-1 ELSE IF SYS=3 THEN ENEMY.SHIELDS=ENEMY.SHIELDS-1 8150 IF ENEMY.ENGINES<0 THEN ENEMY.ENGINES=0 ELSE IF ENEMY.WEAPONS<0 THEN ENEMY.WEAPONS=0 ELSE IF ENEMY.SHIELDS<0 THEN ENEMY.SHIELDS=0 8160 SPEAK$="":IF SYS=1 THEN SPEAK$="We've damaged their engines." ELSE IF SYS=2 THEN SPEAK$="Enemy "+ENEMY.WPNTYPE$+" damaged." ELSE IF SYS=3 THEN SPEAK$="Enemy shields damaged." 8170 IF SPEAK$<>"" THEN GOSUB 3000 8180 RETURN 9000 ' 9010 'Fire Phasers 9020 ' 9030 TOHIT=75/(ENEMY.RANGE/4)'to-hit % chance 9040 IF ENEMY.RANGE>6 THEN TOHIT=0 9050 ENEMY.HITS=0:IF RND*100ENEMY.SHIELDS THEN WERE.HURT=-1':SAY$="ctexpl":GOSUB 3000'KA-BOOM! 9090 SHIELDS.BUCKLING=0:IF WERE.HURT AND INT(RND*2)=1 THEN SHIELDS.BUCKLING=-1 9100 IF SHIELDS.BUCKLING THEN IF ENEMY.SHIELDS<>0 THEN ENEMY.SHIELDS=ENEMY.SHIELDS-1:SPEAK$="Enemy shields buckling.":GOSUB 3000 9110 IF ENEMY.HITS AND NOT WERE.HURT AND ENEMY.SHIELDS<>0 THEN SPEAK$="Their shields held.":GOSUB 3000 9120 SYS=0:IF WERE.HURT THEN SYS=INT(RND*3)+1 9130 IF SYS=1 AND ENEMY.ENGINES=0 OR SYS=2 AND ENEMY.WEAPONS=0 OR SYS=3 AND ENEMY.SHIELDS=0 THEN 9120'can't kill what's already dead 9140 IF SYS=1 THEN ENEMY.ENGINES=ENEMY.ENGINES-1 ELSE IF SYS=2 THEN ENEMY.WEAPONS=ENEMY.WEAPONS-1 ELSE IF SYS=3 THEN ENEMY.SHIELDS=ENEMY.SHIELDS-1 9150 IF ENEMY.ENGINES<0 THEN ENEMY.ENGINES=0 ELSE IF ENEMY.WEAPONS<0 THEN ENEMY.WEAPONS=0 ELSE IF ENEMY.SHIELDS<0 THEN ENEMY.SHIELDS=0 9160 SPEAK$="":IF SYS=1 THEN SPEAK$="Enemy engines damaged." ELSE IF SYS=2 THEN SPEAK$="We've damaged their "+ENEMY.WPNTYPE$+"." ELSE IF SYS=3 THEN SPEAK$="Enemy shields damaged." 9170 IF SPEAK$<>"" THEN GOSUB 3000 9180 RETURN 10000 ' 10010 'Enemy Turn (etc.) 10020 ' 10030 'see if we've killed enemy 10040 IF ENEMY.ENGINES=0 OR ENEMY.WEAPONS=0 THEN SAY$="ctexpl":GOSUB 4000:SPEAK$="Enemy vessel destroyed! ":GOSUB 3000:ENEMYDESTROYED=-1:GOTO 10670'return 10050 'enemy will run if you are much more combat-worthy. They will withdraw in that case, or if their engines or weapons are trashed. Can't withdraw except beyond med. range 10060 ENEMYCRIPPLED=0:IF ENEMY.ENGINES<2 OR ENEMY.WEAPONS<2 OR ENEMY.DISPOSITION=-1 THEN ENEMYCRIPPLED=-1'if they're in sad shape, or a lot worse than us, they're crippled 10070 IF ENEMIESKILLED=ENEMY.NUMBER-1 THEN ENEMYCRIPPLED=0'The last one won't leave 10080 IF ENEMYCRIPPLED THEN CRIPTIMER=CRIPTIMER+1'after a while, they'll decide to split (prevents major repairs by delaying next enemy ship) 10090 IF CRIPTIMER>INT(RND*3)+2 AND ENEMY.RANGE>6 THEN SPEAK$="Enemy vessel is withdrawing.":GOSUB 3000:ENEMYDESTROYED=-1:GOTO 10670'return 10100 ENEMY.DISPOSITION=1'-1=retreat 10110 IF ENEMIESKILLED<(ENEMY.NUMBER-1) AND (ENEMY.WEAPONS<2 AND (OUR.PHASERS>1 OR OUR.TORPEDOES>1 OR OUR.SHIELDS>2))THEN ENEMY.DISPOSITION=-1'if they can't fight and we can, they'll try to run 10120 'special for out-ranged Romulans... 10130 IF ENEMY.RANGE>6 AND LEFT$(ENEMY.TYPE$,3)="Rom" THEN ROMSOUTRANGED=ROMSOUTRANGED+1'after a while, they'll cloak and sneak about 10140 IF ENEMY.RANGE<7 AND LEFT$(ENEMY.TYPE$,3)="Rom" THEN ROMSOUTRANGED=0'reset if in range 10150 ROMSCLOAK=0:IF ROMSOUTRANGED>INT(RND*5)+2 THEN ROMSCLOAK=-1:ROMSOUTRANGED=0:ENEMY.OLDSPEED=0'reset for report 10160 IF ROMSCLOAK THEN SPEAK$="Romulan has cloaked. Attempting to locate.":GOSUB 3000:SAY$="ctsensor":GOSUB 4000:SPEAK$="Romulan has decloaked.":GOSUB 3000:ENEMY.RANGE=INT(RND*2)+8:ENEMY.SPEED=3:ENEMY.BEARING=INT(RND*4)+1 10170 'implement maneuvers 10180 IF ENEMY.BEARING=1 THEN ENEMY.RANGE=ENEMY.RANGE-OUR.SPEED-ENEMY.SPEED*ENEMY.DISPOSITION'close rate depends if they're chasing or running 10190 IF ENEMY.BEARING=3 THEN ENEMY.RANGE=ENEMY.RANGE+OUR.SPEED-ENEMY.SPEED*ENEMY.DISPOSITION'close rate depends if they're chasing or running 10200 IF ENEMY.BEARING=2 OR ENEMY.BEARING=4 THEN ENEMY.RANGE=ENEMY.RANGE-ENEMY.SPEED*ENEMY.DISPOSITION 10210 IF ENEMY.RANGE<1 THEN ENEMY.RANGE=1 ELSE IF ENEMY.RANGE>12 THEN ENEMY.RANGE=12'maybe add disengagement later? 10220 IF ENEMY.RANGE=1 AND OUR.SPEED>1 AND ENEMY.BEARING=1 AND INT(RND*2) THEN ENEMY.RANGE=4:ENEMY.BEARING=3'we zoomed past them 10230 ENEMY.BUSY=0:IF OUR.SPEED>=ENEMY.SPEED AND ENEMY.SPEEDOUR.SPEED AND NOT ENEMY.BUSY AND ENEMY.RANGE<6 AND INT(RND*2) THEN ENEMY.SPEED=ENEMY.SPEED-1:'maybe slow down at "close" ranges 10260 IF ENEMY.SPEED<0 THEN ENEMY.SPEED=0 ELSE IF ENEMY.SPEED>ENEMY.ENGINES THEN ENEMY.SPEED=ENEMY.ENGINES'is it legal? 10270 IF ENEMY.ENGINES<>0 AND INT(RND*ENEMY.RANGE)<1 THEN ENEMY.BEARING=ENEMY.BEARING+(INT(RND*3)-1)'does enemy's bearing shift? (more likely at closer ranges) 10280 IF ENEMY.BEARING<1 THEN ENEMY.BEARING=4 ELSE IF ENEMY.BEARING>4 THEN ENEMY.BEARING=1'do any wrap-around 10290 'report enemy's position 10300 RANGE$="close":IF ENEMY.RANGE>9 THEN RANGE$="extreme" ELSE IF ENEMY.RANGE>6 THEN RANGE$="long" ELSE IF ENEMY.RANGE>3 THEN RANGE$="medium" 10310 IF ENEMY.BEARING=1 THEN BEAR$="ahead of us" ELSE IF ENEMY.BEARING=2 THEN BEAR$="to our starboard" ELSE IF ENEMY.BEARING=3 THEN BEAR$="astern of us" ELSE IF ENEMY.BEARING=4 THEN BEAR$="to port" 10320 SPEAK$="Enemy is at "+RANGE$+" range "+BEAR$+".":GOSUB 3000 10330 'report any speed changes 10340 IF OUR.SPEED<>0 AND OUR.SPEED<>OUR.OLDSPEED THEN SPEAK$="Our speed is warp"+STR$(OUR.SPEED*2)+".":GOSUB 3000:OUR.OLDSPEED=OUR.SPEED 10350 IF OUR.SPEED=0 AND OUR.SPEED<>OUR.OLDSPEED THEN SPEAK$="We are at sublight.":GOSUB 3000:OUR.OLDSPEED=OUR.SPEED 10360 IF ENEMY.SPEED<>0 AND ENEMY.SPEED<>ENEMY.OLDSPEED THEN SPEAK$="Enemy is at warp"+STR$(ENEMY.SPEED*2)+".":GOSUB 3000:ENEMY.OLDSPEED=ENEMY.SPEED 10370 IF ENEMY.SPEED=0 AND ENEMY.SPEED<>ENEMY.OLDSPEED THEN SPEAK$="Enemy is moving sublight.":GOSUB 3000:ENEMY.OLDSPEED=ENEMY.SPEED 10380 'enemy does his combat 10390 ENEMY.FIRING=0:IF (ENEMY.WPNTYPE$="disruptors" AND ENEMY.RANGE<=8) OR (ENEMY.WPNTYPE$="plasma weapon" AND ENEMY.RANGE<=6) AND NOT ENEMY.BUSY AND ENEMY.WEAPONS<>0 THEN ENEMY.FIRING=-1 10400 IF ENEMY.WPNTYPE$="disruptors" THEN TOHIT=60/(ENEMY.RANGE/4) ELSE TOHIT=55/(ENEMY.RANGE/3)'to-hit % chance 10410 IF RIGHT$(ENEMY.TYPE$,5)="eship" THEN TOHIT=TOHIT+5'bonus for battleships 10420 ENEMY.HITS=0:IF ENEMY.FIRING AND RND*100OUR.SHIELDS THEN WERE.HURT=-1:SAY$="ctexpl":GOSUB 4000'KA-BOOM! 10480 SHIELDS.BUCKLING=0:IF WERE.HURT AND INT(RND*4)=1 THEN SHIELDS.BUCKLING=-1 10490 IF SHIELDS.BUCKLING THEN IF OUR.SHIELDS<>0 THEN OUR.SHIELDS=OUR.SHIELDS-1:SPEAK$="Shields buckling!":GOSUB 3000 10500 IF ENEMY.HITS AND NOT WERE.HURT AND OUR.SHIELDS<>0 THEN SPEAK$="Shields holding.":GOSUB 3000 10510 'beat up on our ship 10520 SYS=0:IF WERE.HURT THEN SYS=INT(RND*4)+1 10530 IF SYS=1 AND OUR.ENGINES=0 OR SYS=2 AND OUR.PHASERS=0 OR SYS=3 AND OUR.TORPEDOES=0 OR SYS=4 AND OUR.SHIELDS=0 THEN 10520'can't kill what's already dead 10540 IF SYS=1 THEN OUR.ENGINES=OUR.ENGINES-1 ELSE IF SYS=2 THEN OUR.PHASERS=OUR.PHASERS-1 ELSE IF SYS=3 THEN OUR.TORPEDOES=OUR.TORPEDOES-1 ELSE IF SYS=4 THEN OUR.SHIELDS=OUR.SHIELDS-1 10550 IF OUR.ENGINES<0 THEN OUR.ENGINES=0 ELSE IF OUR.PHASERS<0 THEN OUR.PHASERS=0 ELSE IF OUR.TORPEDOES<0 THEN OUR.TORPEDOES=0 ELSE IF OUR.SHIELDS<0 THEN OUR.SHIELDS=0 10560 SPEAK$="":IF SYS=1 THEN SPEAK$="Engines damaged!" ELSE IF SYS=2 THEN SPEAK$="Phasers damaged!" ELSE IF SYS=3 THEN SPEAK$="Photon torpedo tubes damaged!" ELSE IF SYS=4 THEN SPEAK$="Shield generators damaged!" 10570 IF SPEAK$<>"" THEN GOSUB 3000 10580 'check engines for power loss/overheating 10590 IF OUR.SPEED>OUR.ENGINES THEN OUR.SPEED=OUR.ENGINES:SAY$="ctdecel.vmf":GOSUB 4000 10600 IF OUR.SPEED=4 THEN ENGINETEMP=ENGINETEMP+1 10610 IF ENGINETEMP=2 AND OUR.SPEED=4 THEN SPEAK$="Engines beginning to heat.":GOSUB 3000 10620 IF ENGINETEMP=3 AND OUR.SPEED=4 THEN SPEAK$="Engines becoming critical.":GOSUB 3000 10630 IF ENGINETEMP=4 AND OUR.SPEED=4 THEN SPEAK$="Engines will blow soon!":GOSUB 3000 10640 IF ENGINETEMP>0 AND OUR.SPEED<4 THEN ENGINETEMP=ENGINETEMP-1 10650 IF ENGINETEMP=5 THEN ENGINETEMP=0:OUR.ENGINES=1:SAY$="ctexpl":GOSUB 4000:SAY$="ctdecel.vmf":GOSUB 4000:SPEAK$="Engines overloaded!":GOSUB 3000:OUR.SPEED=0 10660 IF OUR.ENGINES=0 OR (OUR.PHASERS=0 AND OUR.TORPEDOES=0) THEN WEREDESTROYED=-1'set flag for our death 10670 RETURN 10730 ' * program, call it by simply executing a GOSUB 60000. See your * 60000 ' ****************************************************************** 60010 ' * FINDER.BAS - vector finder subroutine * 60020 ' * This is a subroutine that will find the interrupt vector of * 60030 ' * the COVOX TSR program that is specified in the string variable * 60040 ' * PROG.NAME$. After MERGING this subroutine with the main BASIC * 60050 ' * program, call it by simply executing a GOSUB 65000. See your * 60060 ' * "User Manual" for complete details. * 60070 ' ****************************************************************** 60080 ' 60090 'CLS:PRINT:PRINT"One moment please..." 60100 ' On Entry PROG.NAME$ = Name of the COVOX program to search for. 60110 ' 60120 ' Convert any lower case letters of the program name to upper case. 60130 FOR C=1 TO LEN(PROG.NAME$) 60140 L=ASC(MID$(PROG.NAME$,C,1)) 60150 IF L>96 THEN L=L-32:MID$(PROG.NAME$,C,1)=CHR$(L) 60160 NEXT C 60170 ' 60180 ' 60190 ' Search vectors 64 through 127 for the COVOX program address. 60200 FOR VECTOR=(64 * 4) TO (127* 4) STEP 4 60210 DEF SEG=0:' Set to segment zero in order to access vector table. 60220 ' 60230 ' Get the segment & offset values for the vector. 60240 OUR.OFFSET =PEEK(VECTOR + 0) + (256 * PEEK(VECTOR + 1)) 60250 OUR.SEGMENT=PEEK(VECTOR + 2) + (256 * PEEK(VECTOR + 3)) 60260 ' 60270 ' If the value for the segment is not valid then look at the next vector. 60280 IF OUR.SEGMENT=0 OR OUR.SEGMENT >65024! THEN 60430 60290 ' 60300 ' A segment value was found, so set BASIC's data segment accordingly. 60310 DEF SEG=OUR.SEGMENT 60320 ' Now search for the COVOX program name at the offset address. 60330 ' Each character of the program's name is compared and a flag (FOUND) 60340 ' is set to zero if there is not a complete match. 60350 PROG.FOUND=1:FOR C=0 TO LEN(PROG.NAME$)-1 60360 IF PEEK(OUR.OFFSET+C)<> ASC(MID$(PROG.NAME$,C+1,1)) THEN PROG.FOUND=0 60370 NEXT C:' Compare next character. 60380 ' 60390 IF PROG.FOUND=1 THEN 60520:' If this is the vector for the COVOX program, 60400 ' then continue on with the main code of the BASIC program. 60410 ' 60420 ' If this was not the COVOX program's vector then 60430 NEXT VECTOR:' examine the next vector location. 60440 ' 60450 ' If the COVOX program's vector was not found, the following message 60460 ' is displayed and the BASIC program is terminated. 60470 ' 60480 PRINT:PRINT:PRINT PROG.NAME$;" has not been installed in memory." 60490 PRINT"You must exit BASIC and load ";PROG.NAME$;" from the DOS prompt.":PRINT"Then RUN this program again." 60500 END:' Terminate the program. 60510 ' 60520 RETURN :' Go back to the main BASIC program. 60530 ' ********************************************************************