REM * 96&97 = PLAYER SHIP REM * 104&105 = PLAYER MISSILES LEFT & RIGHT REM * 106 = WATER REM * 107 = SUBMARINE >>> LEFT SIDE REM * 108 = SUBMARINE >>> RIGHT SIDE REM * 109 = SUBMARINE <<< LEFT SIDE REM * 110 = SUBMARINE <<< RIGHT SIDE REM * 111 = ENEMY MISSILE REM * 112 = EXPLOSION REM * 120 = GROUND #1 REM * 121 = GROUND #2 REM * 128 = CLOUD LEFT REM * 129 = CLOUD MIDDLE REM * 130 = CLOUD RIGHT REM * 131 = CLOUD TOP ( ABOVE MIDDLE ) REM ******************** REM * VARIABLES FOR GAME REM *******PLAYER******* REM * X = PLAYER X !ARE THESE BACKWARDS? REM * Y = PLAYER Y !SHOULDN'T IT BE Y=ROW X=COL? REM * F1 = PLAYER FIRE 1 OFF REM * F2 = PLAYER FIRE 2 OFF REM * PFX1= PLAYER FIRE X 1 REM * PFX2= PLAYER FIRE X 2 REM * PFY1= PLAYER FIRE Y 1 REM * PFY2= PLAYER FIRE Y 2 REM ********ENEMY******** REM * E = ENEMY PRESENT OR NOT REM * EX = ENEMY X REM * EY = ENEMY Y REM * EF = ENEMY FIRED REM * EFX=ENEMY FIRE X REM * EFY= ENEMY FIRE Y REM ********OTHER******** REM * S = PLAYER SCORE DECLARED AS NULL REM * VI = VAR INCR SUB FIRES EVEN IF SHIP MOVES 1 RANDOMIZE 2 FOR L=1 TO 20 3 READ Z,Z$ 4 CALL CHAR(Z,Z$) 5 NEXT L 10 CALL CLEAR 11 PRINT "DEFINE YOUR CONTROLS"::: 12 INPUT "KEY FOR LEFT MOVE ":Z$ 13 K$=Z$ 14 INPUT "KEY FOR RIGHT MOVE ":Z$ 15 K$=K$&Z$ 16 INPUT "KEY FOR FIRE 1 ":Z$ 17 K$=K$&Z$ 18 INPUT "KEY FOR FIRE 2 ":Z$ 19 K$=K$&Z$ 20 CALL CLEAR 21 CALL SCREEN(16) 25 PRINT :::::::: 30 PRINT TAB(10);"SUBKILLER":::: 35 PRINT " A TI BASIC GAME":" BY RETROSPECT"::: 40 PRINT " PRESS SPACE TO START"::::::: 45 CALL KEY(0,K,ST) 50 IF K=32 THEN 900 ELSE 45 900 GOSUB 32150 REM * PLACE CLOUDS 1000 FOR Q=1 TO 32 1001 CX=INT(10*RND)+2 1002 CY=INT(26*RND)+3 1003 GOSUB 32220 1004 NEXT Q REM * PLACE SEA & GROUND 1050 CALL HCHAR(14,1,106,320) 1051 FOR Q=1 TO 31 STEP 2 1052 CALL HCHAR(24,Q,120) 1053 CALL HCHAR(24,Q+1,121) 1054 NEXT Q REM * PLACE PLAYER 1055 X=13 1056 Y=15 1057 CALL HCHAR(X,Y,96) 1058 CALL HCHAR(X,Y+1,97) REM * COLOURS ON 1060 GOSUB 32190 1065 E=0 1070 EF=0 1075 F1=0 1080 F2=0 1085 S=0 REM * MAIN LOOP 1100 GOSUB 4400 1110 GOSUB 4600 1120 GOSUB 3000 1160 GOSUB 4800 1170 GOSUB 4700 1180 IF K<>0 THEN 1200 1190 GOSUB 3000 1200 GOSUB 5000 1210 GOSUB 4900 1220 GOTO 1100 REM * PLAYER INPUT 3000 CALL KEY(0,K,V) 3005 IF V=0 THEN 3040 3010 K=POS(K$,CHR$(K),1) 3020 IF K=0 THEN 3040 3030 ON K GOSUB 4100,4200,4300,4500 3040 RETURN REM * PLAYER LEFT? 4100 CALL HCHAR(X,Y+1,32) 4111 Y=Y-1 4115 IF Y>=2 THEN 4126 4116 Y=2 4126 CALL HCHAR(X,Y+1,97) 4130 CALL HCHAR(X,Y,96) 4199 RETURN REM * PLAYER RIGHT? 4200 CALL HCHAR(X,Y,32) 4211 Y=Y+1 4215 IF Y<=30 THEN 4226 4216 Y=30 4226 CALL HCHAR(X,Y,96) 4230 CALL HCHAR(X,Y+1,97) 4299 RETURN REM * FIRE 1 ACTIVATE? 4300 IF F1=1 THEN 4399 4315 F1=1 4320 PFX1=X+1 4321 PFY1=Y-1 4322 CALL HCHAR(PFX1,PFY1,104) 4323 CALL SOUND(-100,110,30,110,30,3000,30,-4,0) 4399 RETURN REM * FIRE 1 INCREMENT? 4400 IF F1=0 THEN 4499 4405 CALL HCHAR(PFX1,PFY1,106) 4415 PFX1=PFX1+1 4425 IF PFX1<24 THEN 4445 4430 F1=0 4435 RETURN 4445 CALL HCHAR(PFX1,PFY1,104) 4499 RETURN REM * FIRE 2 ACTIVATE? 4500 IF F2=1 THEN 4599 4515 F2=1 4520 PFX2=X+1 4521 PFY2=Y+2 4522 CALL HCHAR(PFX2,PFY2,105) 4523 CALL SOUND(-100,110,30,110,30,6000,30,-4,0) 4599 RETURN REM * FIRE 2 INCREMENT? 4600 IF F2=0 THEN 4699 4605 CALL HCHAR(PFX2,PFY2,106) 4615 PFX2=PFX2+1 4625 IF PFX2<24 THEN 4645 4630 F2=0 4635 RETURN 4645 CALL HCHAR(PFX2,PFY2,105) 4699 RETURN REM * IS THERE AN ENEMY? 4700 IF E>0 THEN 4799 4716 CALL HCHAR(14,1,106,320) 4720 E=1 4725 ET=INT(2*RND)+1 4730 ON ET GOTO 4734,4744 4734 VI=1 4735 Z=INT(7*RND)+15 4736 EX=Z 4737 EY=1 4738 CALL HCHAR(EX,EY,107) 4739 CALL HCHAR(EX,EY+1,108) 4740 RETURN 4744 VI=-1 4745 Z=INT(7*RND)+15 4746 EX=Z 4747 EY=32 4748 CALL HCHAR(EX,EY,110) 4749 CALL HCHAR(EX,EY-1,109) 4799 RETURN REM * IF THERE'S AN ENEMY, MOVE IT 4800 IF E<1 THEN 4899 4805 ON ET GOTO 4810,4850 REM >>> 4810 CALL HCHAR(EX,EY,106) 4812 EY=EY+1 4813 IF EY<=31 THEN 4817 4814 E=0 4816 RETURN 4817 CALL HCHAR(EX,EY,107) 4819 CALL HCHAR(EX,EY+1,108) 4820 IF ((F1<1)+(PFX1<>EX))<0 THEN 4825 4822 IF ((PFY1=EY)+(PFY1=EY+1))<0 THEN 31400 4825 IF ((F2<1)+(PFX2<>EX))<0 THEN 4899 4827 IF ((PFY2=EY)+(PFY2=EY+1))<0 THEN 31500 4849 RETURN REM <<< 4850 CALL HCHAR(EX,EY,106) 4852 EY=EY-1 4853 IF EY<2 THEN 4814 4856 CALL HCHAR(EX,EY,110) 4857 CALL HCHAR(EX,EY-1,109) 4860 IF ((F1<1)+(PFX1<>EX))<0 THEN 4865 4862 IF ((PFY1=EY)+(PFY1=EY-1))<0 THEN 31400 4865 IF ((F2<1)+(PFX2<>EX))<0 THEN 4899 4867 IF ((PFY2=EY)+(PFY2=EY-1))<0 then 31500 4899 RETURN REM * CAN ENEMY FIRE? 4900 IF ((E<1)+(EF>0))<0 THEN 4999 4910 IF ((EY=Y)+(EY=Y+VI))=0 THEN 4999 4915 EF=1 4920 EFX=EX-1 4925 EFY=EY 4930 CALL HCHAR(EFX,EFY,111) 4935 CALL SOUND(-100,110,30,110,30,1000,30,-4,0) 4999 RETURN REM * ENEMY FIRE INCREMENT? 5000 IF EF<1 THEN 5099 5020 CALL HCHAR(EFX,EFY,106) 5030 EFX=EFX-1 5040 IF EFX=13 THEN 31200 5050 CALL HCHAR(EFX,EFY,111) 5099 RETURN REM * THIS SECTION IS NO LONGER USED REM * CHECK FOR ENEMY COLLISION REM * PLAYER TORP 1 31100 IF ((F1<1)+(E<1)+(EY<>PFY1)+(EX<>PFX1))<0 THEN 31150 31105 IF E=0 THEN 31199 31110 CALL GCHAR(PFX1,PFY1,CH) 31111 IF CH<=106 THEN 31150 31112 CALL HCHAR(14,1,106,320) 31113 CALL SOUND(250,110,30,110,30,950,30,-8,0) 31114 CALL SOUND(150,110,30,110,30,775,30,-8,0) 31115 CALL SOUND(500,110,30,110,30,1250,30,-8,0) 31116 S=S+1 31117 F1=0 31118 E=0 REM * PLAYER TORP 2 31150 IF ((F2<1)+(E<1)+(EY<>PFY2)+(EX<>PFX2))<0 THEN 31199 31160 CALL GCHAR(PFX2,PFY2,CH) 31161 IF CH<=106 THEN 31199 31162 CALL HCHAR(14,1,106,320) 31163 CALL SOUND(250,110,30,110,30,950,30,-8,0) 31164 CALL SOUND(150,110,30,110,30,775,30,-8,0) 31165 CALL SOUND(500,110,30,110,30,1250,30,-8,0) 31166 S=S+1 31167 F2=0 31168 E=0 31199 RETURN REM * ENEMY BOMB EXPLODES AT SURFACE 31200 CALL HCHAR(EFX,EFY,112) 31205 CALL SOUND(-500,110,30,110,30,1250,30,-8,0) REM * SHIP WAS HIT!!! 31210 IF ((EFY<>Y)+(EFY<>Y+1))<-1 THEN 31230 31215 CALL HCHAR(EFX,Y-1,112,3) 31216 CALL HCHAR(EFX-1,Y-1,112,3) 31217 CALL SOUND(500,110,30,110,30,2000,30,-8,0) 31218 CALL SOUND(500,110,30,110,30,1750,30,-8,0) 31219 CALL SOUND(500,110,30,110,30,1500,30,-8,0) 31220 CALL SOUND(1000,110,30,110,30,1250,30,-8,0) 31221 FOR DELAY=1 TO 500 31222 NEXT DELAY 31223 GOTO 31300 31230 CALL HCHAR(EFX,EFY,32) 31240 EF=0 31250 RETURN REM * GAME OVER AND SCORE 31300 CALL CLEAR 31305 PRINT "YOU WERE KILLED":"BY AN ENEMY MISSILE"::"YOU SCORED";S:: 31310 INPUT "ANOTHER GAME Y OR N: ":YN$ 31315 IF YN$="Y" THEN 20 31320 END REM * EN MVS INTO PLAYER MISSILE 1 31400 CALL HCHAR(PFX1,PFY1,112,1) 31410 CALL SOUND(250,110,30,110,30,950,30,-8,0) 31420 CALL SOUND(150,110,30,110,30,775,30,-8,0) 31430 CALL SOUND(500,110,30,110,30,1250,30,-8,0) 31440 S=S+1 31450 F1=0 31460 E=0 31470 CALL HCHAR(EX,EY-1,106,3) 31480 RETURN REM * EN MVS INTO PLAYER MISSILE 2 31500 CALL HCHAR(PFX2,PFY2,112,1) 31510 CALL SOUND(250,110,30,110,30,950,30,-8,0) 31520 CALL SOUND(150,110,30,110,30,775,30,-8,0) 31530 CALL SOUND(500,110,30,110,30,1250,30,-8,0) 31540 S=S+1 31550 F2=0 31560 E=0 31570 CALL HCHAR(EX,EY-1,106,3) 31580 RETURN REM * GRAPHICS DATA 32100 DATA 96,010B2BFFFF7F3F0F,97,80D0D4FFFFFEFCF,98,0000183C3C18,99,0000183C3C18,100,0000002A1C3E1C2A 32110 DATA 104,0000183C3C18,105,0000183C3C18,106,000000000000,107,0202BFFFFFFFBF,108,6070FCFEFEFEFC 32120 DATA 109,060E3F7F7F7F3F,110,4040FDFFFFFFFD,111,002A1C3E1C2A,112,492A0063002A49 32130 DATA 120,00E0F0FCFFFFFFFF,121,00070F3FFFFFFFFF 32140 DATA 128,020D2F79D7FFFF4C,129,EEFFF7FFFBF7C76E,130,40B0F49EEBFFFF32,131,000000083C7E6BFC REM * COLOURS OFF 32150 FOR L=9 TO 13 32160 CALL COLOR(L,2,2) 32165 NEXT L 32170 CALL SCREEN(2) 32175 CALL CLEAR 32180 RETURN REM * COLOURS ON 32190 CALL SCREEN(8) 32192 CALL COLOR(9,2,8) 32195 CALL COLOR(10,2,5) 32200 CALL COLOR(11,12,5) 32205 CALL COLOR(12,13,5) 32210 CALL COLOR(13,16,8) 32215 RETURN REM * PLACE A CLOUD @ CX,CY 32220 CALL HCHAR(CX,CY,128) 32225 CALL HCHAR(CX,CY+1,129) 32230 CALL HCHAR(CX,CY+2,130) 32235 CALL HCHAR(CX-1,CY+1,131) 32340 RETURN