! ***************************************** ! * * ! * INITIALIZE SCREEN MODE AND SPRITE MAG * ! * * ! ***************************************** 10 CALL LINK("SCRN2")::CALL CLEAR::CALL SCREEN(2)::CALL MAGNIFY(3) :: RANDOMIZE ! ************** ! * * ! * STAR CHR'S * ! * * ! ************** 20 DIM STAR(7)::FOR L=1 TO 7::READ A::STAR(L)=A::NEXT L 25 DATA 160,168,176,184,192,200,208 30 RESTORE 45 ! **************** ! * * ! * STAR COLOURS * ! * * ! **************** 35 DIM SCOL(4)::SCOL(1)=2::SCOL(2)=16::SCOL(3)=5::SCOL(4)=6 ! ****************** ! * * ! * BALL POSITIONS * ! * * ! ****************** 40 DIM BALL(51)::FOR L=1 TO 51::READ A::BALL(L)=A::NEXT L 45 DATA 76,74,72,70,68,66,64,62,60,58,56,54,52,50,48,46,44,42,40 46 DATA 38,36,35,34,33,32,32,32,32,33,34,35,36,38,40,42,44,46,48 47 DATA 50,52,54,56,58,60,62,64,66,68,70,72,74 48 restore 65 ! ****************** ! * * ! * ENEMY POSITIONS* ! * * ! ****************** 50 DIM EP(150) 51 N=0 :: FOR L=1 TO 76::EP(L)=N :: N=N+1 ::NEXT L::EP(1)=1 52 FOR L=77 TO 150::N=N-1::EP(L)=N::NEXT L ! *********************** ! * * ! * BALL ANIMATION DEFS * ! * * ! *********************** 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 ! "BALLS" ARRAY 80 DIM BALLS(120) 85 N=110::FOR L=1 TO 60::BALLS(L)=N::N=N+1::NEXT L::N=170::FOR L=61 TO 120::N=N-1::BALLS(L)=N::NEXT L ! "BALLS" POSITIONS TO BE KEPT IN ARRAY 5 ELEMENTS 88 DIM ZX(5) ! BALLS Y POSITIONS 89 DIM BALLY(5)::BALLY(1)=32::BALLY(2)=48::BALLY(3)=64::BALLY(4)=80::BALLY(5)=96 ! ********************** ! * * ! * DEMO SCREEN LAYOUT * ! * * ! ********************** 100 CALL CLEAR::CALL DELSPRITE(ALL)::GOSUB 20000 105 Z$=CHR$(144)&CHR$(145)&CHR$(146)&CHR$(147)::Z$=RPT$(Z$,8)::CALL LINK("DISPLY",12,1,Z$) 110 Z$=CHR$(148)&CHR$(149)&CHR$(150)&CHR$(151)::Z$=RPT$(Z$,8)::CALL LINK("DISPLY",13,1,Z$) 115 Z$=CHR$(152)&CHR$(153)&CHR$(154)&CHR$(155)::Z$=RPT$(Z$,8)::CALL LINK("DISPLY",14,1,Z$) 120 Z=0::FOR L=1 TO 11 125 Y1=INT(32*RND)+1::Y2=INT(32*RND)+1::IF Y1=Y2 THEN 125 130 Z=Z+1::IF Z>7 THEN Z=1 135 CALL LINK("DISPLY",L,Y1,CHR$(STAR(Z))) 140 Z=Z+1::IF Z>7 THEN Z=1 145 CALL LINK("DISPLY",L,Y2,CHR$(STAR(Z))) 150 NEXT L ! ********************** ! * * ! * VARIABLES DECLARED * ! * * ! ********************** ! T1 TIMER FOR BALL INCREMENTATION ! T2 TIMER FOR SCROLLING TOP LAYER ! T3 TIMER FOR SCROLLING MID LAYER ! T4 TIMER FOR SCROLLING BOTTOM LAYER ! T5 TIMER FOR STAR SCROLL ! T6 TIMER FOR TEXT SCROLL ! T7 TIMER FOR A NEW ENEMY TO ARRIVE ! PF CARRIES VALUE 1 OR 0 FOR IF BILLY BALL IS FIRING OR NOT ! STA CARRIES VALUE FOR COLOUR SET FOR STARS. INCREMENTS TO 23 THEN BACK TO 17 ! BL CARRIES VALUE FOR POSITION OF BILLY BALL ! EX CARRIES VALUE FOR ENEMY POSITION ! EF CARRIES VALUE 1 OR 0 FOR IS ENEMY IS FIRING OR NOT ! ENEMY CARRIES VALUE 1 OR 0 FOR IF ENEMY IS PRESENT OR NOT ! EFX ENEMY FIRE X POS ! EFY ENEMY FIRE Y POS ! EX1 BILLY BALL'S EXPLOSION CARRIER (NOT USED) ! EXT1 BILLY BALL'S EXPLOSION TIME COUNTER (NOT USED) ! EX2 BOBBY BALL'S EXPLOSION CARRIER ! EXT2 BOBBY BALL'S EXPLOSION TIME COUNTER ! BC "BALLS" WRITING COUNTER 1 TO 5 155 T1=0::T2=0::T3=0::T4=0::T5=0::T6=0::T7=0::ENEMY=0::PF=0::STA=17::BL=1::EX=0::EF=0::EFX=0::EFY=0::ex1=0::ext1=0::ex2=0::ext2=0 156 ZX(1)=1::ZX(2)=16::ZX(3)=32::ZX(4)=48::ZX(5)=32::BC=0 ! **************************** ! * * ! * DISPLAY THE SPRITE FIRST * ! * * ! **************************** 160 CALL SPRITE(#1,36,16,BALL(BL),32) ! * WRITE "BALLS" IN BIG LETTERS 170 CALL SPRITE(#11,64,16,BALLS(1),32,#12,68,16,BALLS(16),48,#13,72,16,BALLS(32),64,#14,72,16,BALLS(48),80) 175 CALL SPRITE(#15,76,16,BALLS(32),96) ! **************** ! * * ! * PROGRAM FLOW * ! * * ! **************** 1100 GOSUB 16100 ! INCREMENT BL 1101 GOSUB 16120 ! CHANGE CHAR 1102 GOSUB 16130 ! CHANGE CHAR 1103 GOSUB 16140 ! INCREMENT "BALLS" WRITING 1105 GOSUB 16200 ! SCROLL TOP LAYER 1107 GOSUB 16500 ! TWINKLE STARS 1110 GOSUB 16300 ! SCROLL MID LAYER 1115 GOSUB 16600 ! SCROLL STARS 1120 GOSUB 16400 ! SCROLL BOT LAYER 1125 GOSUB 16700 ! READ JOYSTICK 1127 GOSUB 17530 ! IS BOBBY DYING? 1130 GOSUB 16800 ! CAN PLAYER FIRE? 1135 GOSUB 16900 ! INCREMENT PLAYER FIRE? 1145 GOSUB 17100 ! IS ENEMY PRESENT? IF NOT INCREMENT T7 TIMER 1150 GOSUB 17200 ! INCREMENT ENEMY POSITION IF PRESENT 1155 GOSUB 17300 ! CAN BOBBY BALL FIRE? 1160 GOSUB 17400 ! IF BOBBY FIRED, INCREMENT IT 1165 GOSUB 17500 ! HAS BILLY SHOT BOBBY? 1170 GOSUB 17600 ! HAS BOBBY SHOT BILLY? 1175 GOTO 1100 ! ---------------------------------- ! INC. BL VARIABLE FOR BALL POSITION ! ---------------------------------- ! ( ALTER LINE 16100 TO MAKE BALL GO FASTER, .... IF T1>1 THEN 16102 ... ! FOR EXAMPLE, OR EVEN GET RID OF THE TIMER ALTOGETHER AND ALTER LINE 1100 TO A REM STATEMENT ) 16100 T1=T1+1::IF T1>0 THEN 16102 ELSE 16110 16102 T1=0::BL=BL+2 :: IF BL>51 THEN BL=1 16105 CALL LOCATE(#1,BALL(BL),32) 16110 RETURN ! ----------------- ! CHANGE BILLY CHAR ! ----------------- 16120 B1=B1+1::IF B1>23 THEN B1=1 16121 CALL CHAR(36,Ba$(B1))::RETURN ! ----------------- ! CHANGE BOBBY CHAR ! ----------------- 16130 B2=B2+1::IF B2>23 THEN B2=1 16131 CALL CHAR(44,Ba$(B2))::RETURN ! ------------------------ ! INCREMENT BALLS WRITING ! ------------------------ 16140 BC=BC+1::IF BC>5 THEN BC=1 16141 ZX(BC)=ZX(BC)+4::IF ZX(BC)>120 THEN ZX(BC)=1 16142 CALL LOCATE(#10+BC,BALLS(ZX(BC)),BALLY(BC)) 16143 RETURN ! ---------------- ! SCROLL TOP LAYER ! ---------------- 16200 T2=T2+1::IF T2>2 THEN 16210 ELSE 16299 16210 T2=0::CALL LINK("WINDOW",12,1,12,32)::CALL LINK("SCPXLF",144,4,1) 16299 RETURN ! ---------------- ! SCROLL MID LAYER ! ---------------- 16300 T3=T3+1::IF T3>1 THEN 16310 ELSE 16399 16310 T3=0::CALL LINK("WINDOW",13,1,13,32)::CALL LINK("SCPXLF",148,4,1) 16399 RETURN ! ---------------- ! SCROLL BOT LAYER ! ---------------- 16400 CALL LINK("WINDOW",14,1,14,32)::CALL LINK("SCPXLF",152,4,1) 16499 RETURN ! ------------- ! TWINKLE STARS ! ------------- 16500 STA=STA+1::IF STA>23 THEN STA=17 16502 CALL LINK("COLOR2",STA,SCOL(INT(4*RND)+1),2) 16510 RETURN ! ------------ ! SCROLL STARS ! ------------ 16600 T5=T5+1::IF T5>100 THEN 16610 ELSE 16699 16610 CALL LINK("WINDOW",1,1,11,32)::CALL LINK("SCRLLF",1)::T5=0 16699 RETURN ! ------------- ! READ JOYSTICK ! ------------- 16700 CALL KEY(1,K,ST)::RETURN ! ---------------- ! CAN PLAYER FIRE? ! ---------------- 16800 IF K=18 THEN 16805 ELSE 16899 16805 IF PF=1 THEN 16899 16810 PF=1::PFX=BALL(BL)+4::PFY=32::CALL SPRITE(#2,40,16,PFX,PFY)::call sound(-1,110,30) 16820 call sound(-200,110,30,110,30,4000,30,-8,0) 16899 RETURN ! ---------------------- ! INCREMENT PLAYER FIRE? ! ---------------------- 16900 IF PF=1 THEN 16905 ELSE 16999 16905 PFY=PFY+8::IF PFY>254 THEN 16910 ELSE 16920 16910 CALL DELSPRITE(#2)::PF=0::GOTO 16999 16920 CALL LOCATE(#2,PFX,PFY) 16999 RETURN ! ------------------------------------------------------------------------ ! IS AN ENEMY ON THE SCREEN? IF NOT INCREMENT THE TIMER BEFORE ONE APPEARS ! ------------------------------------------------------------------------ 17100 IF ENEMY=0 THEN 17105 ELSE 17199 17105 T7=T7+1 :: IF T7>100 THEN 17110 ELSE 17199 17110 T7=0 :: ENEMY=1 :: EX=1::EF=0 :: CALL SPRITE(#3,44,5,EP(EX),232) 17199 RETURN ! ---------------------------------- ! INCREMENT ENEMY POSITION, IF ALIVE ! ---------------------------------- 17200 IF EX2=1 THEN 17299 17201 IF ENEMY=1 THEN 17205 ELSE 17299 17205 EX=EX+1 :: IF EX>150 THEN EX=1 17210 CALL LOCATE(#3,EP(EX),232) 17299 RETURN ! -------------------- ! CAN BOBBY BALL FIRE? ! -------------------- ! ( LINE 17305 CAN BE ALTERED, TO MAKE BOBBY FIRE MORE FREQUENTY BY CHANGING RR>1950 TO SOMETHING LIKE RR>1800 ) ! ( LINE 17302 CHECKS IF BOBBY IS ACTUALLY THERE, OTHERWISE WE WOULD GET AN ERROR! ) 17300 IF EX2=1 THEN 17399 17301 IF EF=0 THEN 17302 ELSE 17399 17302 IF ENEMY=0 THEN 17399 17305 RR=INT(2000*RND)+1::IF RR>1950 THEN 17310 ELSE 17399 17310 EF=1 :: EFX=EP(EX) :: EFY=224 :: CALL SPRITE(#4,40,12,EFX,EFY)::call sound(-1,110,30) 17311 call sound(-200,110,30,110,30,6000,30,-8,0) 17399 RETURN ! ----------------------------------------- ! INCREMENT BOBBY BALL'S MISSILE IF PRESENT ! ----------------------------------------- 17400 IF EF=1 THEN 17405 ELSE 17499 17405 EFY=EFY-8 :: IF EFY<16 THEN 17410 ELSE 17415 17410 CALL DELSPRITE(#4) :: EF=0 :: GOTO 17499 17415 CALL LOCATE(#4,EFX,EFY) 17499 RETURN ! --------------------- ! HAS BILLY SHOT BOBBY? ! --------------------- 17500 IF EX2=1 THEN 17520 17501 IF PF=1 THEN 17505 ELSE 17520 17505 CALL COINC(#2,#3,8,C) :: IF C=-1 THEN 17510 ELSE 17520 17510 PF=0::CALL DELSPRITE(#2) 17515 CALL PATTERN(#3,60)::EX2=1::EXT2=0::V=0::CALL MOTION(#3,-8,8) 17520 RETURN ! ------------------- ! IS BILLY EXPLODING? IF SO INCREMENT THE SOUND AND EXT2 ! ------------------- 17530 IF EX2=1 THEN 17531 ELSE 17539 17531 EXT2=EXT2+1::IF EXT2>10 THEN 17532 ELSE 17533 17532 CALL DELSPRITE(#3)::EX2=0::ENEMY=0::CALL MOTION(#3,0,0)::GOTO 17539 17533 CALL SOUND(-1,110,30)::CALL SOUND(-200,110,30,110,30,900,30,-8,V) 17539 return ! --------------------- ! HAS BOBBY SHOT BILLY? ! --------------------- 17600 IF EF=1 THEN 17605 ELSE 17699 17605 CALL COINC(#4,#1,8,C)::IF C=-1 THEN 17610 ELSE 17699 17610 EF=0::CALL DELSPRITE(#4) 17615 CALL PATTERN(#1,60)::CALL SOUND(-1,110,30)::FOR V=0 TO 30 STEP 2::CALL SOUND(150,110,30,110,30,1800,30,-8,V)::NEXT V 17620 CALL DELSPRITE(#1)::PF=0 17625 CALL LINK("DELAY",2000) :: GOTO 100 17699 RETURN ! ******************* ! * * ! * "SPRINT 2" FONT * ! * * ! ******************* 20000 A$="00384CC6C6C6643800307030303030FC007CC60E3C78E0FE007E0C183C06C67C001C3C6CCCFE0C0C00FCC0FC0606C67C003C60C0FCC6C67C00FEC60C18303030" 20010 CALL LINK("CHAR2",48,A$)::CALL LINK("CHAR2",56,"0078C4E4789E867C007CC6C67E060C78") 20020 A$="FFFFFFFFFFFFFFFF00386CC6C6FEC6C600FCC6C6FCC6C6FC003C66C0C0C0663C00F8CCC6C6C6CCF800FCC0C0F8C0C0FE00FEC0C0FCC0C0C0003E60C0CEC6663E" 20030 CALL LINK("CHAR2",96,A$) 20040 A$="00C6C6C6FEC6C6C600FC3030303030FC000606060606C67C00C6CCD8F0F8DCCE00C0C0C0C0C0C0FC00C6EEFEFED6C6C600C6E6F6FEDECEC6007CC6C6C6C6C67C" 20050 CALL LINK("CHAR2",104,A$) 20060 A$="00FCC6C6C6FCC0C0007CC6C6C6DECC7A00FCC6C6CEF8DCCE0078CCC07C06C67C00FC30303030303000C6C6C6C6C6C67C00C6C6C6EE7C381000C6C6D6FEFEEEC6" 20070 CALL LINK("CHAR2",112,A$)::CALL LINK("CHAR2",120,"00C6EE7C387CEEC600CCCCCC7830303000FE0E1C3870E0FE") ! ************************** ! * * ! * BILLY BALL CHAR 36 * ! * MISSILE CHAR 40 * ! * BOBBY BALL CHAR 44 * ! * EXPLOSION CHAR 60 * ! ************************** 20080 CALL CHAR(60,"0030787C3E1C0070FCF8F83103030100000E1E1C382000071F0F8680C0E08000") 20086 call char(40,"000000000000000000000F1F0F00000000000000000000000000E0F0E0000000") 20090 CALL CHAR(36,BA$(1),44,BA$(10))::B1=1::B2=10 ! ************************* ! * * ! * BACKGROUND CHARACTERS * ! * * ! ************************* 20100 A$="84D5F5BFDFDFF6FB40EA2BBBFFEDDDFB0121737BFEECEADF808090B2B6F7BDCCFF6FDFFDFDF77FFFE277B7BFFFEEF5F772B5EDEBFFDBBFFFB2AE6FDFDFFFFFFF" 20110 CALL LINK("CHAR2",144,A$) ! TOP AND MIDDLE LAYER 20120 A$="527A36D33EDB3F72535AF6D57B6B9FF12F4CDFFCDC9B3F7096075772521D6CC7"::CALL LINK("CHAR2",152,A$) ! BOTTOM LAYER 20130 CALL LINK("COLOR2",15,4,2,16,4,2) ! COLOURS FOR LAYERS 20140 A$="00001"::FOR L=160 TO 208 STEP 8::CALL LINK("CHAR2",L,A$)::NEXT L ! STARS DEFINED ! BALLS SPRITES 20141 CALL CHAR(64,"FF8080808383808080808383808080FFF80402028282040804028282020204F8") 20142 CALL CHAR(68,"3F4080808383808080818181818181FEF80402028282020202020202020202FE") 20143 CALL CHAR(72,"FF8080808080808080808080808080FF808080808080808080FE0202020202FE") 20144 CALL CHAR(76,"3F40808080878040207F80808080807FFC02020202FC080402820202020204F8") 20150 RETURN