! NOTES; ! "TICKCOUNT" VARIABLE IS INCREMENTED FROM 1 TO 3, THIS IS USED TO INDICATE WHICH ALIEN IS BEING UPDATED, ! RATHER THAN UPDATING ALL THE ALIENS IN ONE HIT, AS I PERCIEVE THIS TO BE A FASTER METHOD. ! A1X(XX), A1Y(XX), A2X(XX),A2Y(XX), A3X(XX), A3Y(XX) ARE ALL ARRAYS FOR THE ALIEN ATTACK PATTERNS ! TM(XX) IS SET TO DIFFERENT ELEMENTS, THE FIRST ELEMENT IS 28, THE OTHER TWO ARE 31, THIS IS AN ARRAY FOR THE MAXIMUM COUNT THAT "TICKCOUNT" CAN GET TO FOR EACH ALIEN. ! ENEMY ATTACK PATTERN ARRAYS (USES "TICKCOUNT" TO TICK THROUGH ON EACH UPDATE) 100 DIM A1Y(28),A1X(28),A2Y(31),A2X(31),A3Y(31),A3X(31) 110 FOR LOOP=1 TO 28 :: READ X :: A1X(LOOP)=X :: NEXT LOOP 120 DATA 4,4,4,4,5,5,6,7,8,9,10,11,12,12 130 DATA 13,13,13,13,12,12,11,10,9,8,7,6,5,5 140 RESTORE 160 150 FOR LOOP=1 TO 28 :: READ Y :: A1Y(LOOP)=Y :: NEXT LOOP 160 DATA 14,15,16,17,18,19,20,21,21,21,21 170 DATA 20,19,18,17,16,15,14,13,12,11 180 DATA 10,10,10,10,11,12,13 190 RESTORE 210 200 FOR LOOP=1 TO 31 :: READ X :: A2X(LOOP)=X :: NEXT LOOP 210 DATA 2,2,2,2,3,3,3,3,4,4,4,4,3,3,3,3 220 DATA 2,2,2,2,3,3,3,3,4,4,4,4,3,3,3 230 RESTORE 250 240 FOR LOOP=1 TO 31 :: READ Y :: A2Y(LOOP)=Y :: NEXT LOOP 250 DATA 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17 260 DATA 18,19,20,21,22,23,24,25,26,27,28,29,30,31 270 RESTORE 290 280 FOR LOOP=1 TO 31 :: READ X :: A3X(LOOP)=X :: NEXT LOOP 290 DATA 8,8,8,8,8,8,8,9,10,11,12,13,14,15,15,15 300 DATA 15,14,13,12,11,10,9,8,8,8,8,8,8,8,8 310 RESTORE 330 320 FOR LOOP=1 TO 31 :: READ Y :: A3Y(LOOP)=Y :: NEXT LOOP 330 DATA 31,30,29,28,27,26,25,24,23,22,21,20,19,18 340 DATA 17,16,15,14,13,12,11,10,9,8,7,6,5,4,3,2,1 ! PLAYER X AND Y ARRAYS (TO MAKE PLAYER CLIMB OVER GROUND TERRAIN LEFT AND RIGHT) 350 DIM PY(64):: N=0 :: FOR Q=1 TO 64 :: PY(Q)=N :: N=N+4 :: NEXT Q :: PY(1)=1 360 DIM PX(64):: FOR Q=1 TO 9 :: PX(Q)=184 :: NEXT Q :: FOR Q=10 TO 15 :: PX(Q)=182 :: NEXT Q 370 FOR Q=16 TO 24 :: PX(Q)=180 :: NEXT Q :: FOR Q=25 TO 40 :: PX(Q)=178 :: NEXT Q :: FOR Q=41 TO 48 :: PX(Q)=180 :: NEXT Q 380 FOR Q=49 TO 56 :: PX(Q)=182 :: NEXT Q :: FOR Q=57 TO 64 :: PX(Q)=184 :: NEXT Q ! CONVERT ATTACK PATTERN VALUES TO SPRITE POSITIONS 390 FOR LOOP=1 TO 28 :: A1X(LOOP)=A1X(LOOP)*8 :: A1Y(LOOP)=A1Y(LOOP)*8 :: NEXT LOOP 400 FOR LOOP=1 TO 31 :: A2X(LOOP)=A2X(LOOP)*8 :: A2Y(LOOP)=A2Y(LOOP)*8 :: NEXT LOOP 410 FOR LOOP=1 TO 31 :: A3X(LOOP)=A3X(LOOP)*8 :: A3Y(LOOP)=A3Y(LOOP)*8 :: NEXT LOOP ! ARRAYS FOR THE FOLLOWING; ! ALIVE(X) = IF ALIEN IS ALIVE OR NOT, 3 ELEMENTS ! ACOUNT(X) = COUNTER FOR ALIEN'S NEXT APPEARANCE AFTER DEATH, 3 ELEMENTS ! AFIRE(X) = ARRAY FOR IF ALIEN IS FIRING OR NOT, 3 ELEMENTS ! AX(X) = ALIEN'S X POSITION ARRAY, 3 ELEMENTS ! AY(X) = ALIEN'S Y POSITION ARRAY, 3 ELEMENTS ! TM(X) = "TICKER MAXIMUM VALUE" FOR INCREMENTING "TICKCOUNT" TO REACH BEFORE GOING BACK TO 1 AGAIN, 3 ELEMENTS 420 DIM ALIVE(3),ACOUNT(3),AFIRE(3),AX(3),AY(3),TM(3) 460 TM(1)=28 :: TM(2)=31 :: TM(3)=31 ! INITIALIZE SCREEN AND SUB TO GRAPHICS 470 CALL LINK("SCRN2"):: CALL SCREEN(2):: GOSUB 1510 :: CALL CLEAR ! ALL ALIENS ARE SWITCHED TO "ALIVE" AND NOT FIRING 480 FOR LOOP=1 TO 3 :: ALIVE(LOOP)=1 :: AFIRE(LOOP)=0 :: ACOUNT(LOOP)=0 :: ADEAD(LOOP)=0 490 AX(LOOP)=1 :: AY(LOOP)=1 :: NEXT LOOP ! PLAYER'S STARTING POSITION CARRIED IN XX AND YY VARIABLES FOR THE PX(X) AND PY(X) ARRAYS ! TICKCOUNT SET TO 1, SCORE SET TO 0, LIVES SET TO 3, GOSUB TO SHOW SCORE AND GROUND 500 YY=15 :: XX=15 :: PFIRE=0 :: T1=0 :: TICKCOUNT=1 :: SCORE=0 :: LIVES=3 :: GOSUB 880 :: GOSUB 910 ! JOYSTICK INPUT AND GOSUB TO UPDATES AT LINE 950 510 CALL JOYST(1,JY,JX):: CALL KEY(1,K,S):: GOSUB 950 520 IF JY=-4 AND K=18 THEN 560 ELSE IF JY=4 AND K=18 THEN 600 530 IF JY=-4 THEN 580 ELSE IF JY=4 THEN 620 540 IF K=18 THEN 640 550 GOTO 510 ! FIRE WHILST MOVING LEFT (LEFT WITHOUT FIRE AT LINE 580) ! IF PLAYER ALREADY FIRING THEN SIMPLY MOVE LEFT 560 IF PFIRE=1 THEN 580 570 GOSUB 640 580 YY=YY-1 :: IF YY<1 THEN YY=64 590 GOTO 510 ! FIRE WHILST MOVING RIGHT (RIGHT WITHOUT FIRE AT LINE 620) ! IF PLAYER ALREADY FIRING THEN SIMPLY MOVE RIGHT) 600 IF PFIRE=1 THEN 620 610 GOSUB 640 620 YY=YY+1 :: IF YY>64 THEN YY=1 630 GOTO 510 ! FIRE (UNLESS PLAYER ALREADY FIRING) 640 GOSUB 650 :: GOTO 510 ! ACTIVATE PLAYER FIRE AT PLAYER'S X AND Y POSITION (UNLESS ALREADY FIRING WHICH THEN GOES BACK TO JOYSTICK CONTROL) 650 IF PFIRE=1 THEN 510 660 PFIRE=1 :: CALL SOUND(-150,110,30,110,30,16500,30,-8,0):: CALL SPRITE(#2,113,16,PX(YY),PY(YY),-48,0) 670 RETURN ! ALIEN 1 DEATH 680 PFIRE=0 :: CALL DELSPRITE(#2) 690 CALL PATTERN(#3,101):: GOSUB 795 700 CALL DELSPRITE(#3):: ADEAD(1)=1 :: ALIVE(1)=0 :: C=0 :: SCORE=SCORE+25 :: GOSUB 880 710 RETURN ! ALIEN 2 DEATH 720 PFIRE=0 :: CALL DELSPRITE(#2) 730 CALL PATTERN(#5,101):: GOSUB 795 740 CALL DELSPRITE(#5):: ADEAD(2)=1 :: ALIVE(2)=0 :: C=0 :: SCORE=SCORE+25 :: GOSUB 880 750 RETURN ! ALIEN 3 DEATH 760 PFIRE=0 :: CALL DELSPRITE(#2) 770 CALL PATTERN(#7,101)::GOSUB 795 780 CALL DELSPRITE(#7):: ADEAD(3)=1 :: ALIVE(3)=0 :: C=0 :: SCORE=SCORE+25 :: GOSUB 880 790 RETURN ! ALIEN DEATH SOUND 795 FOR ZZ=660 TO 600 STEP -8 :: CALL SOUND(4,ZZ,1):: NEXT ZZ::RETURN ! PLAYER DEATH 800 PFIRE=0 :: CALL DELSPRITE(#2):: AFIRE(1)=0 :: CALL DELSPRITE(#4,#6,#8) 810 CALL DELSPRITE(#1):: CALL SPRITE(#11,101,16,176,PY(YY),-4,-16,#12,101,16,176,PY(YY),-4,16) 820 CALL SOUND(750,110,30,110,30,900,30,-8,0) 830 CALL LINK("DELAY",1000) 840 CALL DELSPRITE(#11,#12) 850 FOR LOOP=1 TO 3 :: AX(LOOP)=1 :: AY(LOOP)=1 :: NEXT LOOP :: CALL DELSPRITE(#3,#5,#7) 860 LIVES=LIVES-1 :: GOSUB 880 :: CALL LINK("DELAY",1000):: IF LIVES=0 THEN 900 870 GOTO 510 ! SHOW SCORE AND LIVES ATOP THE SCREEN 880 Z$="SCORE "&STR$(SCORE):: CALL LINK("DISPLY",1,1,Z$):: Z$="LIVES "&STR$(LIVES):: CALL LINK("DISPLY",1,16,Z$):: RETURN ! GAME OVER (JUST STOPS THE GAME, THIS IS TEMPORARY) 900 STOP ! DRAW THE GROUND AT BOTTOM OF SCREEN 910 Z$=CHR$(152)&CHR$(152)&CHR$(152)&CHR$(152)&CHR$(153)&CHR$(153)&CHR$(153)&CHR$(153)&CHR$(154)&CHR$(154)&CHR$(154)&CHR$(154) 920 Z$=Z$&RPT$(CHR$(155),8) 930 X$=CHR$(154)&CHR$(154)&CHR$(154)&CHR$(154)&CHR$(153)&CHR$(153)&CHR$(153)&CHR$(153)&CHR$(152)&CHR$(152)&CHR$(152)&CHR$(152) 940 Z$=Z$&X$ :: CALL LINK("DISPLY",24,1,Z$):: RETURN ! GAME UPDATES SUBBED FROM LINE 510 (JOYSTICK CONTROL) ! IS PLAYER FIRING? IF SO CHECK THE PLAYER MISSILE POSITION 950 IF PFIRE=1 THEN 960 ELSE 980 960 CALL POSITION(#2,P1,P2):: IF P1<16 THEN 970 ELSE 980 970 CALL DELSPRITE(#2):: PFIRE=0 ! IS ALIEN DEAD? (ACCORDING TO "TICKCOUNT" FOR 3 ALIENS) IF SO INCREMENT THE "ACOUNT(XX)" ARRAY 980 IF ADEAD(TICKCOUNT)=1 THEN 990 ELSE 1050 990 ACOUNT(TICKCOUNT)=ACOUNT(TICKCOUNT)+1 :: IF ACOUNT(TICKCOUNT)=50 THEN 1000 ELSE 1050 1000 ACOUNT(TICKCOUNT)=0 :: ADEAD(TICKCOUNT)=0 :: ALIVE(TICKCOUNT)=1 1010 ON TICKCOUNT GOTO 1020,1030,1040 1020 AX(TICKCOUNT)=A1X(1):: AY(TICKCOUNT)=A1Y(1):: GOTO 1050 1030 AX(TICKCOUNT)=A2X(1):: AY(TICKCOUNT)=A2Y(1):: GOTO 1050 1040 AX(TICKCOUNT)=A3X(1):: AY(TICKCOUNT)=A3Y(1) ! IS ALIEN ALIVE (BASED ON "TICKCOUNT") 1050 IF ALIVE(TICKCOUNT)=1 THEN 1070 ELSE 1100 ! YES ALIEN IS ALIVE, INCREMENT IT'S X AND Y ARRAYS 1070 AX(TICKCOUNT)=AX(TICKCOUNT)+1 :: AY(TICKCOUNT)=AY(TICKCOUNT)+1 1080 IF AX(TICKCOUNT)>TM(TICKCOUNT)THEN AX(TICKCOUNT)=1 1090 IF AY(TICKCOUNT)>TM(TICKCOUNT)THEN AY(TICKCOUNT)=1 ! IF ALIEN IS ALIVE THEN SHOW IT'S SPRITE ON SCREEN (BASED ON "TICKCOUNT") 1100 IF ALIVE(TICKCOUNT)=1 THEN 1110 ELSE 1150 1110 ON TICKCOUNT GOTO 1120,1130,1140 1120 Z1=A1X(AX(TICKCOUNT)):: Z2=A1Y(AY(TICKCOUNT)):: CALL SPRITE(#3,100,16,Z1,Z2):: GOTO 1150 1130 Z1=A2X(AX(TICKCOUNT)):: Z2=A2Y(AY(TICKCOUNT)):: CALL SPRITE(#5,102,16,Z1,Z2):: GOTO 1150 1140 Z1=A3X(AX(TICKCOUNT)):: Z2=A3Y(AY(TICKCOUNT)):: CALL SPRITE(#7,114,4,Z1,Z2) ! IF ALIEN IS FIRING THEN CHECK ALIEN MISSILE POSITIONS 1150 IF AFIRE(TICKCOUNT)=1 THEN 1160 ELSE 1230 1160 ON TICKCOUNT GOTO 1170,1190,1210 1170 CALL POSITION(#4,P1,P2):: IF P1>176 THEN 1180 ELSE 1230 1180 CALL DELSPRITE(#4):: AFIRE(TICKCOUNT)=0 :: GOTO 1230 1190 CALL POSITION(#6,P1,P2):: IF P1>176 THEN 1200 ELSE 1230 1200 CALL DELSPRITE(#6):: AFIRE(TICKCOUNT)=0 :: GOTO 1230 1210 CALL POSITION(#8,P1,P2):: IF P1>176 THEN 1220 ELSE 1230 1220 CALL DELSPRITE(#8):: AFIRE(TICKCOUNT)=0 ! IF ALIEN IS ALIVE, THEN LET IT RANDOMLY FIRE A MISSILE UNLESS IT'S ALEADY DOING SO 1230 IF ALIVE(TICKCOUNT)=1 THEN 1240 ELSE 1300 1240 IF AFIRE(TICKCOUNT)=0 THEN 1250 ELSE 1300 1250 RR=INT(1000*RND)+1 :: IF RR>900 THEN 1260 ELSE 1300 1260 ON TICKCOUNT GOTO 1270,1280,1290 1270 CALL POSITION(#3,P1,P2):: AFIRE(TICKCOUNT)=1 :: CALL SPRITE(#4,104,16,P1,P2,42,0):: GOTO 1300 1280 CALL POSITION(#5,P1,P2):: AFIRE(TICKCOUNT)=1 :: CALL SPRITE(#6,104,16,P1,P2,42,0):: GOTO 1300 1290 CALL POSITION(#7,P1,P2):: AFIRE(TICKCOUNT)=1 :: CALL SPRITE(#8,104,16,P1,P2,42,0) ! SHOW PLAYER'S POSITION ON SCREEN 1300 CALL SPRITE(#1,112,6,PX(YY),PY(YY)) ! COINCIDENCE CHECKS FOR ALIEN 1 1310 IF ALIVE(1)=1 THEN 1330 ELSE 1350 1330 CALL COINC(#2,#3,8,C):: IF C=-1 THEN 1340 ELSE 1350 1340 GOSUB 680 :: C=2 1350 CALL COINC(#4,#1,8,C):: IF C=-1 THEN 1360 ELSE 1370 1360 GOSUB 800 ! COINCIDENCE CHECKS FOR ALIEN 2 1370 IF ALIVE(2)=1 THEN 1390 ELSE 1410 1390 CALL COINC(#2,#5,8,C):: IF C=-1 THEN 1400 ELSE 1410 1400 GOSUB 720 :: C=2 1410 CALL COINC(#6,#1,8,C):: IF C=-1 THEN 1420 ELSE 1430 1420 GOSUB 800 ! COINCIDENCE CHECKS FOR ALIEN 3 1430 IF ALIVE(3)=1 THEN 1450 ELSE 1490 1450 CALL COINC(#2,#7,8,C):: IF C=-1 THEN 1460 ELSE 1470 1460 GOSUB 760 :: C=2 1470 CALL COINC(#8,#1,8,C):: IF C=-1 THEN 1480 ELSE 1490 1480 GOSUB 800 ! INCREMENT THE "TICKCOUNT" VARIABLE (IF PAST 3, GO BACK TO 1) 1490 TICKCOUNT=TICKCOUNT+1 :: IF TICKCOUNT>3 THEN TICKCOUNT=1 ! RETURN TO SENDER. GO BACK TO JOYSTICK CONTROL 1500 RETURN ! GRAPHICAL DEFINITIONS ! 100 = ALIEN 1 ! 101 = ALIEN DEATH/PLAYER DEATH ! 102 = ALIEN 2 ! 104 = ALIEN MISSILES ! 113 = PLAYER MISSILE ! 114 = ALIEN 3 ! 144 = STARS (NOT CURRENTLY USED) ! 152 = GROUND 1510 CALL CHAR(100,"81DB7E5A7EE7C366") 1520 CALL CHAR(104,"0000000000181818") 1530 CALL CHAR(112,"1818187EFFFFFFC3") 1540 CALL CHAR(113,"0000000018181818") 1550 CALL CHAR(101,"492A0063002A4900") 1560 CALL CHAR(102,"5A3C66FFDBDBC342") 1570 CALL CHAR(114,"3C7EDBFFFFDB663C") 1580 CALL LINK("CHAR2",144,"1"):: CALL LINK("COLOR2",15,16,2) 1590 CALL LINK("CHAR2",152,"000000000000FFFF00000000FFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF"):: CALL LINK("COLOR2",16,3,2) 1600 RETURN