! ****************************** ! * INITIALIZE THE SCREEN MODE * ! ****************************** 1 CALL LINK("SCRN2") :: CALL LINK("SCREEN",2) :: CALL CLEAR:: CALL MAGNIFY(3) ! ********************* ! * ASTEROID PATTERNS * ! ********************* 10 FOR L=1 TO 7::READ X,X$::CALL CHAR(X,X$)::NEXT L 20 DATA 76,000F191032434964504C23100C0700000000C020501098CC1272941CF0000000,80,000000050A10121410181C13110D03000000F008104844CC9A12648418600000 30 DATA 84,00000001020509181F10100E07000000000000F02804E4063EE2020CF0000000,88,00000000031C382E212018070000000000000070888C5262828C90E000000000 40 DATA 92,0000000007182F2524150E000000000000000000E01078C4042CD80000000000,96,00000000000F18282F28311E0000000000000000E05844C43C0428F000000000 50 DATA 100,000000000304041D161414181108070000000000789412729A06024438C08000 55 RESTORE 65 ! ***************************************************************************** ! * BILLY-BALL PATTERNS STORED IN ARRAY TO BE UPLOADED TO CHAR 104 ON-THE-FLY * ! ***************************************************************************** 60 DIM BA$(23)::FOR L=1 TO 23::READ A$::BA$(L)=A$::NEXT L 65 DATA 00030F1F3F3C787A787F7F3C3E1F0F0300E0F8FCFE9E8FAF8FFFFF1E3EFCF8E0,00030F1F3F397175717F7F383C1F0F0300E0F8FCFE3E1F5F1FFFFF3E7EFCF8E0 66 DATA 00030F1F3F32626A627F7F30381F0F0300E0F8FCFE7E3FBF3FFFFF7EFEFCF8E0,00030F1F3F244455447F7F20311F0F0300E0F8FCFEFE7F7F7FFFFFFEFEFCF8E0 67 DATA 00030F1F3F09082A087F7F01231F0F0300E0F8FCFEFEFFFFFFFFFFFEFEFCF8E0,00030F1F3F131155117F7F03071F0F0300E0F8FCFEFEFFFFFFFFFFFEFEFCF8E0 68 DATA 00030F1F3F27232B237F7F070F1F0F0300E0F8FCFEFEFFFFFFFFFFFEFEFCF8E0,00030F1F3F0F4757477F7F0F3F1F0F0300E0F8FCFEFEFFFFFFFFFFFEFEFCF8E0 69 DATA 00030F1F3F1F0F2F0F7F7F1F3F1F0F0300E0F8FCFEFEFFFFFFFFFFFEFEFCF8E0,00030F1F3F1F1F5F1F7F7F3F3F1F0F0300E0F8FCFEFEFFFFFFFFFFFEFEFCF8E0 70 DATA 00030F1F3F3F7F7F7F7F7F3F3F1F0F0300E0F8FCFEFEFFFFFFFFFFFEFEFCF8E0,00030F1F3F3F7F7F7F7F7F3F3F1F0F0300E0F8FCFEFEFFFFFFFFFFFEFEFCF8E0 71 DATA 00030F1F3F3F7F7F7F7F7F3F3F1F0F0300E0F8FCFEFEFFFFFFFFFFFEFEFCF8E0,00030F1F3F3F7F7F7F7F7F3F3F1F0F0300E0F8FCFEFEFFFFFFFFFFFEFEFCF8E0 72 DATA 00030F1F3F3F7F7F7F7F7F3F3F1F0F0300E0F8FCFEFCFCFDFCFFFFFEFEFCF8E0,00030F1F3F3F7F7F7F7F7F3F3F1F0F0300E0F8FCFEFCF8FAF8FFFFFCFEFCF8E0 73 DATA 00030F1F3F3F7F7F7F7F7F3F3F1F0F0300E0F8FCFEF8F1F5F1FFFFF8FEFCF8E0,00030F1F3F3F7F7F7F7F7F3F3F1F0F0300E0F8FCFEF2E2EAE2FFFFF0F8FCF8E0 74 DATA 00030F1F3F3F7F7F7F7F7F3F3F1F0F0300E0F8FCFEE4C4D5C4FFFFE0F0FCF8E0,00030F1F3F3F7F7F7F7F7F3F3F1F0F0300E0F8FCFEC888AA88FFFFC0E2FCF8E0 75 DATA 00030F1F3F3F7F7F7F7F7F3F3F1F0F0300E0F8FCFE92115511FFFF82C6FCF8E0,00030F1F3F3F7E7E7E7F7F3F3F1F0F0300E0F8FCFE2623AB23FFFF068EFCF8E0 76 DATA 00030F1F3F3E7C7D7C7F7F3E3F1F0F0300E0F8FCFE4E475747FFFF0E1EFCF8E0 ! ******************************** ! * BILLY BALL'S MAGICAL MISSILE * ! ******************************** 100 CALL CHAR(108,"0000000000000211AF02000000000000000000000034FDDFEFF6280000000000") ! **************************************************************** ! * NOW TO HAVE AN ARRAY WITH 4 ELEMENTS, FOR THE FOUR ASTEROIDS * ! **************************************************************** 120 DIM AST(4) ! THESE WILL KEEP A PATTERN NUMBER IN THEM, AND EACH ONE WILL BE DIFFERENT 125 AST(1)=76::AST(2)=80::AST(3)=84::AST(4)=88 ! ************************ ! * THE GROUND TO SCROLL * ! ************************ 130 CALL LINK("CHAR2",144,"10183C3C7E7EFFFF0000001010387CFF0000000000000FFF08080818387C7EFF") ! ************************* ! * LET'S HAVE SOME STARS * ! ************************* 140 A$="0001"::FOR L=152 TO 208 STEP 8::CALL LINK("CHAR2",L,A$)::NEXT L ! *********************************** ! * AN ARRAY WITH SOME STAR COLOURS * ! *********************************** 150 DIM SC(4)::SC(1)=2::SC(2)=16::SC(3)=5::SC(4)=10 ! ************************************** ! * AN ARRAY WITH THE STAR CHR NUMBERS * ! ************************************** 160 DIM SN(8)::SN(1)=152::SN(2)=160::SN(3)=168::SN(4)=176::SN(5)=184::SN(6)=192::SN(7)=200::SN(8)=208 ! ***************** ! * SCREEN LAYOUT * ! ***************** ! CLEAR THE SCREEN FIRST 200 CALL CLEAR::CALL DELSPRITE(ALL) ! PLACE THE GROUND FOR SCROLLING 205 Z$=CHR$(144)&CHR$(145)&CHR$(146)&CHR$(147)::Z$=RPT$(Z$,8)::CALL LINK("DISPLY",24,1,Z$)::CALL LINK("COLOR2",15,3,1) ! LET'S HAVE A SPLASH OF STARS 210 FOR L=2 TO 23 215 A1=INT(32*RND)+1 :: A2=INT(32*RND)+1 :: IF A1=A2 THEN 215 220 A3=INT(8*RND)+1 :: A4=INT(8*RND)+1 :: IF A3=A4 THEN 220 225 CALL LINK("DISPLY",L,A1,CHR$(SN(A3))) :: CALL LINK("DISPLY",L,A2,CHR$(SN(A4))) 230 NEXT L ! ********************* ! * BILLY BALL SPRITE * ! ********************* 240 BL=1 ! THIS VARIABLE INCREMENTS UP TO 23 THEN BACK TO 1, IT'S BILLY'S PATTERN VARIABLE USING BA$(XX) 250 BX=120 ! THIS IS BILLY'S POSITION ON THE SCREEN 260 CALL CHAR(104,BA$(BL)) ! THAT'S BILLY DEFINED IN CHAR 104 270 CALL SPRITE(#8,104,4,BX,32) ! THERE HE IS, LOOK ! *********************************************************** ! * THE FIRST STAR COLOUR SET NEEDS TO BE INCREMENTED TO 16 * ! *********************************************************** 272 STAR=15 ! WE INCREMENT THIS BEFORE THE COLOUR CHANGE. ! ***************** ! * THE ASTEROIDS * ! ***************** 275 CALL LINK("FREEZE") ! FREEZE ANY SPRITES BEFORE WE DO ANYTHING ELSE ! PLOT THE SPRITES AND SET THEM TO TRAVEL LEFTWARDS AT VARIOUS SPEEDS. 280 CALL SPRITE(#1,AST(1),INT(13*RND)+3,32,255,0,-8,#2,AST(2),INT(13*RND)+3,64,255,0,-12) 290 CALL SPRITE(#3,AST(3),INT(13*RND)+3,96,255,0,-4,#4,AST(4),INT(13*RND)+3,128,255,0,-10) 300 CALL LINK("THAW") ! AND THERE THEY GO .... ! *********************************************************************************** ! * DECLARE THE "ROLL" VARIABLE AS 0 (USED FOR COUNTING THE ASTEROID TO ROLL NEXT ) * ! *********************************************************************************** 310 ROLL=0 ! ******************************************************************************* ! * WE WANT VARIABLE "T1" TO COUNT UP TO 16 AND THEN SCROLL THE STARS LEFTWARDS * ! ******************************************************************************* 320 T1=0 ! ******************************************************************* ! * WE NEED A VARIABLE TO TELL US IF BILLY IS ALREADY FIRING OR NOT * ! ******************************************************************* 330 BF=0 ! ************************************************ ! * BILLY'S SCORE DECLARED AS NILL AND DISPLAYED * ! ************************************************ 340 SCORE=0::GOSUB 20000 ! **************** ! * PROGRAM FLOW * ! **************** 1100 GOSUB 10100 ! TWINKLE TWINKLE LITTLE STAR 1110 GOSUB 10200 ! READ JOYSTICK 1120 GOSUB 10300 ! ROLL AN ASTEROID 1130 GOSUB 10400 ! DID PLAYER PUSH UP? 1140 GOSUB 10500 ! SCROLL THE STARS 1150 GOSUB 10600 ! DID PLAYER PUSH DOWN? 1160 GOSUB 10700 ! SCROLL GROUND 1 PIXEL 1170 GOSUB 10800 ! SPIN THE BALL 1180 GOSUB 10900 ! ASTEROID LEAVING SCREEN? 1190 GOSUB 11000 ! DID PLAYER PRESS FIRE? 1200 GOSUB 11100 ! INCREMENT MISSILE IF SO 1210 GOSUB 11200 ! HAS ANY ASTEROID HIT BILLY? 1220 GOTO 1100 ! ---------------------------------- ! FUNCTIONS FOR THE PROGRAM FLOW ! ---------------------------------- ! ********************************* ! * TWINKLE, TWINKLE, LITTLE STAR * ! ********************************* 10100 STAR=STAR+1 :: IF STAR>23 THEN STAR=16 10110 Z=INT(4*RND)+1 :: CALL LINK("COLOR2",STAR,SC(Z),1) 10120 RETURN ! ********************* ! * READ THE JOYSTICK * ! ********************* 10200 CALL JOYST(1,JY,JX) :: CALL KEY(1,K,ST) 10210 RETURN ! ******************** ! * ROLL AN ASTEROID * ! ******************** 10300 ROLL=ROLL+1 :: IF ROLL>4 THEN ROLL=1 10310 AST(ROLL)=AST(ROLL)+4::IF AST(ROLL)>100 THEN AST(ROLL)=76 10320 CALL PATTERN(#ROLL,AST(ROLL)) 10330 RETURN ! *********************** ! * DID PLAYER PUSH UP? * ! *********************** 10400 IF JX=4 THEN 10405 ELSE 10499 10405 BX=BX-2 :: IF BX<8 THEN BX=8 10410 CALL LOCATE(#8,BX,32) 10499 RETURN ! ************************** ! * SCROLL STARS LEFTWARDS * ! ************************** 10500 T1=T1+1 :: IF T1>15 THEN 10510 ELSE 10599 10510 T1=0::CALL LINK("WINDOW",2,1,23,32) :: CALL LINK("SCRLLF",1) 10599 RETURN ! ************************* ! * DID PLAYER PUSH DOWN? * ! ************************* 10600 IF JX=-4 THEN 10605 ELSE 10699 10605 BX=BX+2 :: IF BX>176 THEN BX=176 10610 CALL LOCATE(#8,BX,32) 10699 RETURN ! *********************************** ! * SCROLL GROUND 1 PIXEL LEFTWARDS * ! *********************************** 10700 CALL LINK("WINDOW",24,1,24,32) :: CALL LINK("SCPXLF",144,4,1) :: RETURN ! ***************** ! * SPIN THE BALL * ! ***************** 10800 BL=BL+1 :: IF BL>23 THEN BL=1 10810 CALL CHAR(104,BA$(BL)) 10820 RETURN ! ****************************************************************** ! * ASTEROID LEAVING THE SCREEN? MAKE IT COME BACK SOMEWHERE ELSE * ! ****************************************************************** 10900 FOR L=1 TO 4::CALL POSITION(#L,P1,P2) :: IF P1<8 THEN 10905 ELSE 10910 10905 z=int(8*rnd)+8::CALL SPRITE(#L,AST(ROLL),INT(13*RND)+3,INT(150*RND)+20,255,0,-z)::GOTO 10920 10910 NEXT L 10920 RETURN ! ************************** ! * DID PLAYER PRESS FIRE? * ! ************************** 11000 IF K=18 THEN 11005 ELSE 11099 11005 IF BF=1 THEN 11099 11010 BF=1 :: MX=BX::MY=36::CALL SPRITE(#9,108,7,MX,MY)::CALL SOUND(-1,110,30)::CALL SOUND(-100,110,30,110,30,900,30,-8,0) 11099 RETURN ! ************************************************************** ! * INCREMENT BILLY MISSILE AND DO A COINC CHECK FOR ASTEROIDS * ! ************************************************************** 11100 IF BF=1 THEN 11105 ELSE 11199 11105 MY=MY+8 :: IF MY>252 THEN 11110 ELSE 11120 11110 BF=0::CALL DELSPRITE(#9)::GOTO 11199 11120 CALL LOCATE(#9,MX,MY)::FOR L=1 TO 4 11130 CALL COINC(#L,#9,8,C)::IF C=-1 THEN 11140 ELSE 11150 11140 CALL DELSPRITE(#9)::BF=0::CALL DELSPRITE(#L)::CALL SOUND(-1,110,30)::CALL SOUND(-150,110,30,110,30,1800,30,-8,0) 11145 CALL LOCATE(#L,INT(150*RND)+20,255)::CALL COLOR(#L,INT(13*RND)+3)::z=int(8*rnd)+8::CALL MOTION(#L,0,-z) 11146 SCORE=SCORE+10::GOSUB 20000::GOTO 11199 11150 NEXT L 11199 RETURN ! ******************************* ! * HAS ANY ASTEROID HIT BILLY? * ! ******************************* 11200 FOR L=1 TO 4 11205 CALL COINC(#L,#8,8,C)::IF C=-1 THEN 20100 11210 NEXT L 11220 RETURN ! ********************* ! * DISPLAY THE SCORE * ! ********************* 20000 CALL LINK("DISPLY",1,1,STR$(SCORE))::RETURN ! **************** ! * BILLY'S DEAD * ! **************** 20100 CALL LINK("FREEZE") 20110 CALL CHAR(104,"00030F1F3F3C787A787F7F3E3C1C0F0300E0F8FCFE9E8FAF8FFFFF3E1E1CF8E0") 20120 SND=660 20130 FOR L=BX TO 184::CALL LOCATE(#8,L,32)::CALL SOUND(-100,SND,1,SND+1,1)::SND=SND-2::NEXT L 20140 CALL DELSPRITE(#8)::CALL LINK("DELAY",2000) 20150 CALL CLEAR::CALL DELSPRITE(ALL) 20160 CALL LINK("DISPLY",12,1,"ANOTHER TURN Y OR N") 20170 CALL KEY(0,K,STATUS) :: IF STATUS=0 THEN 20170 20180 IF K=89 THEN 200 ELSE IF K=121 THEN 200 ELSE 20190 20190 STOP