10 CALL SCREEN(2) :: CALL MAGNIFY(3) 20 CALL CHAR(100,"071F3F333F1930600000000000000000E0F8FCCCFC980C060000000000000000") ! ALIEN 1A 30 CALL CHAR(104,"071F3F333F190C060000000000000000E0F8FCCCFC9830600000000000000000") ! ALIEN 1B 40 CALL CHAR(108,"030F3F795F5F0D180000000000000000C0F0FC9EFAFAB0180000000000000000") ! ALIEN 2A 50 CALL CHAR(112,"434F7F391F1F0D060000000000000000C2F2FE9CF8F8B0600000000000000000") ! ALIEN 2B 60 CALL CHAR(116,"24120820C0081224000000000000000092A408030408A4920000000000000000") ! ALIEN DEATH 70 CALL CHAR(120,"000001030F3F7F7F00000000000000000080C0E0F8FEFFFF0000000000000000") ! PLAYER BASE 80 CALL CHAR(124,"01010101010101010000000000000000C0C0C0C0C0C0C0C00000000000000000") ! PLAYER SHOT 90 CALL CHAR(64,"0102050D1D2077F78040E0D0D804BABBBB00DDDDDD00BBBB") ! PYRAMID OUTER CASINGS AND MIDDLE BITS 100 CALL CHAR(72,"387EFFFFCF81") ! SAND ! ENEMY SCREEN LOCATIONS ARE MAPPED TO X() and Y() 110 DIM X(64),Y(64) 120 N=48 :: FOR LOOP=1 TO 8 :: Y(LOOP)=N :: N=N+8 :: X(LOOP)=16 :: NEXT LOOP 130 N=112 :: FOR LOOP=9 TO 16 :: Y(LOOP)=N :: N=N-8 :: X(LOOP)=24 :: NEXT LOOP 140 N=48 :: FOR LOOP=17 TO 24 :: Y(LOOP)=N :: N=N+8 :: X(LOOP)=32 :: NEXT LOOP 150 N=112 :: FOR LOOP=25 TO 32 :: Y(LOOP)=N :: N=N-8 :: X(LOOP)=40 :: NEXT LOOP 160 N=48 :: FOR LOOP=33 TO 40 :: Y(LOOP)=N :: N=N+8 :: X(LOOP)=48 :: NEXT LOOP 170 N=112 :: FOR LOOP=41 TO 48 :: Y(LOOP)=N :: N=N-8 :: X(LOOP)=56 :: NEXT LOOP 180 N=48 :: FOR LOOP=49 TO 56 :: Y(LOOP)=N :: N=N+8 :: X(LOOP)=64 :: NEXT LOOP 190 N=112 :: FOR LOOP=57 TO 64 :: Y(LOOP)=N :: N=N-8 :: X(LOOP)=72 :: NEXT LOOP ! THE ALIEN SOUNDS ARE HERE STORED IN SN() "HOOMPAH POOMPAH" 195 DIM SN(4) :: SN(1)=825 :: SN(2)=625 :: SN(3)=725 :: SN(4)=525 ! THIS ARRAY TELLS US WHICH ENEMY IS "ALIVE" 196 DIM A(8) :: FOR LOOP=1 TO 8 :: A(LOOP)=1 :: NEXT LOOP ! PATTERN IDENTIFIERS : PA IS ALIEN 1, PB IS ALIEN 2, PY IS PLAYER Y POSITION 200 PA=100 :: PB=108 :: PY=136 ! CLEAR THE SCREEN AND DELETE ALL SPRITES 210 CALL CLEAR :: CALL DELSPRITE(ALL) ! PLACE THE PYRAMID 220 Z$=CHR$(64)&CHR$(65)::DISPLAY AT(10,14):Z$ 230 Q$=CHR$(66) :: N1=11 :: N2=13 :: N3=2 240 Z$=RPT$(Q$,N3) :: X$=CHR$(64)&Z$&CHR$(65) :: DISPLAY AT(N1,N2):X$ 250 N1=N1+1 :: N2=N2-1 :: N3=N3+2 :: IF N1>22 THEN 260 ELSE 240 ! PLACE THE SAND 260 CALL HCHAR(23,1,72,32) ! COLORIZE 270 CALL COLOR(5,12,2,6,4,2) ! SET THE ENEMY MOVEMENT TICKER TO ZERO AND ENEMY PLACEMENT VARIABLES TO 1 AND 1 , SET SOUND TICKER (SQ) TO 0, FIRE TO ZERO, PF (PLAYER FIRE PIXEL) TO 170, NN TO ZERO (NUMBER OF ALIENS) 285 T=0 :: EX=1 :: EY=1 :: SQ=1 :: FIRE=0 :: PF=170 :: NN=0 ! WAIT FOR KEYS, PLACE PLAYER, CHECK IF PLAYER HAS FIRED, INCREASE TICKER FOR ENEMY MOVEMENTS, AND SUB TO ENEMY MOVEMENTS ! IF COMPILING THE CODE, LINE 291 NEEDS IF T=8 CHANGING TO A HIGHER NUMBER, LIKE 64 OR MORE 290 CALL KEY(0,K,ST) :: CALL SPRITE(#9,120,13,184,PY) :: IF FIRE=1 THEN 350 ELSE 291 291 T=T+1 :: IF T=8 THEN 292 ELSE 293 292 GOSUB 1000 293 IF ST=0 THEN 290 ! WHICH KEYS HAVE BEEN PRESSED? 300 IF K=83 THEN 410 310 IF K=68 THEN 420 320 IF K=32 THEN 430 330 GOTO 290 ! PLAYER IS ALREADY FIRING 350 PF=PF-4 :: IF PF<10 THEN 370 355 CALL SPRITE(#10,124,6,PF,FY) ! CHECK FOR COINCIDENCE 360 GOSUB 1097 :: GOTO 291 ! PLAYER FIRE AT TOP OF SCREEN SO DELETE IT 370 CALL DELSPRITE(#10) :: FIRE=0 :: GOTO 291 ! MOVE PLAYER LEFT 410 PY=PY-4 :: IF PY<16 THEN 411 ELSE 290 411 PY=16 :: GOTO 290 ! MOVE PLAYER RIGHT 420 PY=PY+4 :: IF PY>244 THEN 421 ELSE 290 421 PY=244 :: GOTO 290 ! PLAYER FIRED ! HAS PLAYER FIRED ALREADY? 430 IF FIRE=1 THEN 290 ! IF NOT DECLARE VARIABLE FIRE TO 1, KEEP CALM, AND CARRY ON 431 FIRE=1 :: FY=PY 432 CALL SPRITE(#10,124,6,PF,FY) :: CALL SOUND(-440,110,30,110,30,36000,30,-8,0) 433 GOTO 290 ! ENEMY MOVEMENT AND NOISE 1000 IF A(1)=1 THEN 1001 ELSE 1010 1001 CALL SPRITE(#1,PA,6,X(EX),Y(EY)) 1010 IF A(2)=1 THEN 1011 ELSE 1020 1011 CALL SPRITE(#2,PA,6,X(EX),Y(EY)+16) 1020 IF A(3)=1 THEN 1021 ELSE 1030 1021 CALL SPRITE(#3,PA,6,X(EX),Y(EY)+32) 1030 IF A(4)=1 THEN 1031 ELSE 1040 1031 CALL SPRITE(#4,PA,6,X(EX),Y(EY)+48) 1040 IF A(5)=1 THEN 1041 ELSE 1050 1041 CALL SPRITE(#5,PB,5,X(EX)+16,Y(EY)) 1050 IF A(6)=1 THEN 1051 ELSE 1060 1051 CALL SPRITE(#6,PB,5,X(EX)+16,Y(EY)+16) 1060 IF A(7)=1 THEN 1061 ELSE 1070 1061 CALL SPRITE(#7,PB,5,X(EX)+16,Y(EY)+32) 1070 IF A(8)=1 THEN 1071 ELSE 1072 1071 CALL SPRITE(#8,PB,5,X(EX)+16,Y(EY)+48) ! PLAY THE ALIEN'S NOISE 1072 CALL SOUND(-200,110,30,110,30,SN(SQ),30,-4,0) 1073 EX=EX+1 :: IF EX>64 THEN 2100 1074 EY=EY+1 :: IF EY>64 THEN 2100 1080 T=0 :: SQ=SQ+1 :: IF SQ>4 THEN 1081 ELSE 1090 1081 SQ=1 ! ANIMATE THE ALIENS 1090 PA=PA+4 :: IF PA>104 THEN 1091 ELSE 1095 1091 PA=100 1095 PB=PB+4 :: IF PB>112 THEN 1096 ELSE 1097 1096 PB=108 ! HAS ANYONE BEEN SHOT? 1097 FOR L=1 TO 8 :: CALL COINC(#L,#10,2,C) :: IF C=-1 THEN 2000 1098 NEXT L 1099 RETURN ! SOMEONE'S BEEN SHOT! 2000 CALL DELSPRITE(#10) :: CALL PATTERN(#L,116) :: FOR N=880 TO 1220 STEP 100 :: CALL SOUND(-32,N,1) :: NEXT N 2010 A(L)=0 :: FIRE=0 :: CALL DELSPRITE(#L) :: NN=NN+1 :: IF NN=8 THEN 2100 ELSE 290 ! THEY'RE ALL DEAD, DAVE! 2100 FOR LOOP=1 TO 3 2110 FOR SZ=880 TO 1280 STEP 24 :: CALL SOUND(-1,SZ,3) :: NEXT SZ 2120 NEXT LOOP 2130 GOTO 196