GAMEPAD 1 'GLOBAL VARIABLES SCREENWIDTH = 160 SCREENHEIGHT = 128 PIXELTOCHAR = 8 'GAME VARIABLES PLAYFIELDX = 32 PLAYFIELDY = 8 PLAYFIELDWIDTH = 104 PLAYFIELDHEIGHT = SCREENHEIGHT - 8 PLAYFIELDSTARTX = PLAYFIELDX / PIXELTOCHAR PLAYFIELDENDX = (PLAYFIELDX + PLAYFIELDWIDTH) / PIXELTOCHAR PLAYFIELDSTARTY = 0 PLAYFIELDENDY = SCREENHEIGHT / PIXELTOCHAR BORDERLEFT = PLAYFIELDSTARTX - 1 BORDERRIGHT = PLAYFIELDENDX + 1 BORDERTOP = 0 BORDERBOTTOM = (PLAYFIELDY + PLAYFIELDHEIGHT) / PIXELTOCHAR BARWIDTH = 24 BARX = PLAYFIELDX + ((PLAYFIELDWIDTH / 2) - (BARWIDTH / 2)) BARY = 110 BALLX = BARX + 12 BALLY = BARY - 6 OFFSETX = 0.25 OFFSETY = 0.75 LIVESX = 0 LIVESY = 0 LIMITLEFT = PLAYFIELDX LIMITRIGHT = PLAYFIELDX + PLAYFIELDWIDTH LIMITTOP = PLAYFIELDY LIMITBOTTOM = PLAYFIELDY + PLAYFIELDHEIGHT BALLONBAR = 1 GOTONEXTLEVEL = 0 LIVES = 3 SUMMARYSCREEN = 1 LEVEL = 1 GAMEOVER = 0 'THE LEVEL 6X5 BLOCK DATA, WHICH ARE: '0 = NO BLOCK '1 = RED BLOCK '2 = ORANGE BLOCK '3 = YELLOW BLOCK '4 = GREEN BLOCK '5 = BLUE BLOCK '6 = PURPLE BLOCK '7 = 2 TIME BREAKABLE BLOCK, BROKEN STATE '8 = 2 TIME BREAKABLE BLOCK '9 = UNBREAKABLE BLOCK '10> = UNBREAKABLE BLOCK, BLINKING STATE (UNTIL 15) DIM BLOCKS(30) STARTGAME: DO BALLX = BARX + 12 BALLY = BARY - 6 OFFSETX = 0.25 OFFSETY = 0.75 BALLONBAR = 1 GOTONEXTLEVEL = 0 SUMMARYSCREEN = 1 GOSUB POPULATELEVEL GOSUB GAMELOOP LOOP '*************************************** ' GAME MAIN LOOP '*************************************** GAMELOOP: REPEAT GOSUB MOVEBAR GOSUB MOVEBALL GOSUB DRAWPLAYFIELD GOSUB DRAWLEVEL GOSUB DRAWLIVES GOSUB DRAWBAR GOSUB DRAWBALL GOSUB DRAWMESSAGES GOSUB CHECKLEVELCOMPLETED WAIT VBL UNTIL GOTONEXTLEVEL = 1 RETURN '*************************************** 'POPULATE THE LEVEL DATA '*************************************** POPULATELEVEL: IF LEVEL = 1 THEN FOR I = 0 TO 29 IF I < 6 THEN BLOCKS(I) = 8 ELSE BLOCKS(I) = (I MOD 6) + 1 END IF NEXT I ELSE IF LEVEL = 2 THEN FOR I = 0 TO 4 FOR J = 0 TO I + 1 IF I = 4 THEN BLOCKS((I * 6) + J) = 8 ELSE BLOCKS((I * 6) + J) = I + 1 END IF NEXT J NEXT I ELSE IF LEVEL = 3 THEN FOR I = 1 TO 4 BLOCKS(I) = 9 BLOCKS(12 + I) = 9 BLOCKS(24 + I) = 9 NEXT I BLOCKS(6) = 6 BLOCKS(11) = 5 BLOCKS(18) = 1 BLOCKS(23) = 3 ELSE 'JUST TO CERTIFY THAT BAD THINGS DOESN'T HAPPEN LEVEL = 1 GOSUB POPULATELEVEL END IF RETURN '*************************************** 'MOVE THE BAR IN RESPONSE TO USER INPUT '*************************************** MOVEBAR: 'WAS THE "A" BUTTON HIT? IF BUTTON TAP (0, 0) AND SUMMARYSCREEN = 0 THEN BALLONBAR = 0 GOSUB PLAYREBOUNDONBAR END IF 'LEFT ARROW WAS PRESSED? IF LEFT(0) THEN 'IF THE BAR NOT EXCEEDED THE PLAYFIELD, MOVE IT IF BARX >= LIMITLEFT THEN DEC BARX DEC BARX 'ALSO MOVE THE BALL WITH THE BAR IF STILL ON IT IF BALLONBAR = 1 AND GAMEOVER = 0 THEN DEC BALLX DEC BALLX END IF END IF END IF 'RIGHT ARROW WAS PRESSED? IF RIGHT(0) THEN 'IF THE BAR NOT EXCEEDED THE PLAYFIELD, MOVE IT IF BARX <= LIMITRIGHT - BARWIDTH THEN INC BARX INC BARX 'ALSO MOVE THE BALL WITH THE BAR IS STILL ON IT IF BALLONBAR = 1 AND GAMEOVER = 0 THEN INC BALLX INC BALLX END IF END IF END IF RETURN '*************************************** 'MOVE THE BALL AND TEST ITS COLLISIONS '*************************************** MOVEBALL: 'NOTHING TO DO IF THE BALL IS STILL ON THE BAR, IF THE SUMMARY 'SCREEN IS SHOWN, OR IF GAME IS OVER IF BALLONBAR = 1 OR SUMMARYSCREEN = 1 OR GAMEOVER = 1 THEN RETURN END IF 'MOVE THE BALL TO THE NEXT POSITION BALLX = BALLX + OFFSETX BALLY = BALLY - OFFSETY 'CHECK IF THE BALL EXCEEDS THE PLAYFIELD ON THE X AXIS IF BALLX <= LIMITLEFT THEN BALLX = LIMITLEFT OFFSETX = -OFFSETX GOSUB INCREASEOFFSETX ELSE IF BALLX >= LIMITRIGHT THEN BALLX = LIMITRIGHT OFFSETX = -OFFSETX GOSUB INCREASEOFFSETX END IF 'CHECK IF THE BALL EXCEEDS THE PLAYFIELD ON THE Y AXIS IF BALLY <= LIMITTOP THEN BALLY = LIMITTOP OFFSETY = -OFFSETY GOSUB INCREASEOFFSETY ELSE IF BALLY >= LIMITBOTTOM THEN OFFSETY = -OFFSETY BALLONBAR = 1 DEC LIVES GOSUB PLAYLOOSELIVE WAIT 25 IF LIVES = 0 THEN GAMEOVER = 1 ELSE SUMMARYSCREEN = 1 BALLX = BARX + 12 BALLY = BARY - 6 END IF END IF 'CHECK IF THE BALL HIT THE BAR IF OFFSETY < 0 AND SPRITE HIT(4, 1 TO 3) THEN BALLY = BARY - 6 OFFSETY = -OFFSETY GOSUB INCREASEOFFSETY GOSUB PLAYREBOUNDONBAR END IF GOSUB BALLHITBLOCK RETURN '*************************************** 'DETECT A COLLISION AGAINST A BLOCK '*************************************** BALLHITBLOCK: STARTX = PLAYFIELDSTARTX + ((PLAYFIELDENDX - PLAYFIELDSTARTX) / 2) STARTX = STARTX - 6 STARTY = 2 FOR I = 0 TO 29 RECTLEFT = ((STARTX + ((I MOD 6) * 2)) * 8) + 4 RECTTOP = (STARTY + (I / 6)) * 8 RECTRIGHT = RECTLEFT + 16 RECTBOTTOM = RECTTOP + 8 COLLISION = 0 IF BALLX + 4 >= RECTLEFT THEN IF BALLX - 4 <= RECTRIGHT THEN IF BALLY + 4 >= RECTTOP THEN IF BALLY - 4 <= RECTBOTTOM THEN IF BLOCKS(I) >= 9 THEN BLOCKS(I) = 15 COLLISION = 1 ELSE IF BLOCKS(I) = 8 THEN BLOCKS(I) = 7 COLLISION = 1 ELSE IF BLOCKS(I) <> 0 THEN BLOCKS(I) = 0 COLLISION = 1 END IF END IF END IF END IF IF COLLISION = 1 THEN IF BALLX <= RECTLEFT OR BALLX >= RECTRIGHT THEN OFFSETX = -OFFSETX GOSUB INCREASEOFFSETX END IF IF BALLY <= RECTTOP OR BALLY >= RECTBOTTOM THEN OFFSETY = -OFFSETY GOSUB INCREASEOFFSETY END IF GOSUB PLAYREBOUNDONBLOCK RETURN END IF END IF NEXT I RETURN '*************************************** 'CHECK IF THE LEVEL WAS COMPLETED '*************************************** CHECKLEVELCOMPLETED: 'CHECK IF A BLOCK REMAINS IN THE LEVEL FOR I = 0 TO 29 IF BLOCKS(I) <> 0 AND BLOCKS(I) <> 9 THEN RETURN END IF NEXT I GOTONEXTLEVEL = 1 LEVEL = LEVEL + 1 RETURN '*************************************** 'REGURARLY INCREASE THE OFFSET X SPEED '*************************************** INCREASEOFFSETX: IF OFFSETX >= 2 THEN RETURN END IF IF OFFSETX > 0 THEN OFFSETX = OFFSETX + 0.01 ELSE OFFSETX = OFFSETX - 0.01 END IF RETURN '*************************************** 'REGURARLY INCREASE THE OFFSET Y SPEED '*************************************** INCREASEOFFSETY: IF OFFSETY >= 2 THEN RETURN END IF IF OFFSETY > 0 THEN OFFSETY = OFFSETY + 0.01 ELSE OFFSETY = OFFSETY - 0.01 END IF RETURN '*************************************** 'DRAW THE PALYFIELD BACKGROUND '*************************************** DRAWPLAYFIELD: 'TO DIVERSIFY THE BACKGROUND, TURN IT GREEN ON ODD LEVELS 'AND BLUE ON EVEN (PLEASE FORGIVE THE STRANGE FORMULA BELOW, 'IT'S JUST BECAUSE THE BOTH PALETTES TO USE AREN'T SIDE BY 'SIDE IN MEMORY, BLUE IS 2ND AND GREEN IS 7TH) BP = 7 - ((LEVEL MOD 2) * 5) BG FILL PLAYFIELDSTARTX, 1 TO PLAYFIELDENDX, PLAYFIELDHEIGHT CHAR 5 BG TINT PLAYFIELDSTARTX, 1 TO PLAYFIELDENDX, PLAYFIELDHEIGHT PAL BP BG FILL BORDERLEFT, 1 TO BORDERLEFT, PLAYFIELDHEIGHT CHAR 6 BG TINT BORDERLEFT, 1 TO BORDERLEFT, PLAYFIELDHEIGHT PAL 1 BG FILL BORDERRIGHT, 1 TO BORDERRIGHT, PLAYFIELDHEIGHT CHAR 7 BG TINT BORDERRIGHT, 1 TO BORDERRIGHT, PLAYFIELDHEIGHT PAL 1 BG FILL BORDERLEFT, 0 TO BORDERRIGHT, 0 CHAR 8 BG TINT BORDERLEFT, 0 TO BORDERRIGHT, 0 PAL 1 BG FILL BORDERLEFT, 0 TO BORDERLEFT, 0 CHAR 9 BG TINT BORDERLEFT, 0 TO BORDERLEFT, 0 PAL 1 BG FILL BORDERRIGHT, 0 TO BORDERRIGHT, 0 CHAR 10 BG TINT BORDERRIGHT, 0 TO BORDERRIGHT, 0 PAL 1 RETURN '*************************************** 'DRAW THE LEVEL '*************************************** DRAWLEVEL: STARTX = PLAYFIELDSTARTX + ((PLAYFIELDENDX - PLAYFIELDSTARTX) / 2) STARTX = STARTX - 5 STARTY = 3 FOR I = 0 TO 29 X = STARTX + ((I MOD 6) * 2) Y = STARTY + (I / 6) IF BLOCKS(I) = 1 THEN CALL DRAWBLOCK(X, Y, 12, 3) ELSE IF BLOCKS(I) = 2 THEN CALL DRAWBLOCK(X, Y, 14, 3) ELSE IF BLOCKS(I) = 3 THEN CALL DRAWBLOCK(X, Y, 16, 3) ELSE IF BLOCKS(I) = 4 THEN CALL DRAWBLOCK(X, Y, 12, 4) ELSE IF BLOCKS(I) = 5 THEN CALL DRAWBLOCK(X, Y, 14, 4) ELSE IF BLOCKS(I) = 6 THEN CALL DRAWBLOCK(X, Y, 16, 4) ELSE IF BLOCKS(I) = 7 THEN CALL DRAWBLOCK(X, Y, 20, 5) ELSE IF BLOCKS(I) = 8 THEN CALL DRAWBLOCK(X, Y, 18, 5) ELSE IF BLOCKS(I) = 9 THEN CALL DRAWBLOCK(X, Y, 18, 6) ELSE IF BLOCKS(I) >= 10 THEN BLOCKS(I) = BLOCKS(I) - 1 CALL DRAWBLOCK(X, Y, 18, 5) END IF NEXT I RETURN '*************************************** 'DRAW A BLOCK '*************************************** SUB DRAWBLOCK(X, Y, CHARNB, PALNB) BG FILL X, Y TO X, Y CHAR CHARNB BG TINT X, Y TO X, Y PAL PALNB BG FILL X + 1, Y TO X + 1, Y CHAR CHARNB + 1 BG TINT X + 1, Y TO X + 1, Y PAL PALNB END SUB '*************************************** 'DRAW THE BALL '*************************************** DRAWBALL: SPRITE 4 PAL 1 SPRITE 4, BALLX, BALLY, 4 RETURN '*************************************** 'DRAW THE BAR '*************************************** DRAWBAR: FOR I = 0 TO 2 IF I = 1 OR I = 2 THEN SPRITE I PAL 1 ELSE SPRITE I PAL 0 END IF NEXT I SPRITE 0, BARX, BARY, 1 SPRITE 1, BARX + 8, BARY, 2 SPRITE 2, BARX + 16, BARY, 2 SPRITE 3, BARX + 24, BARY, 3 RETURN '*************************************** 'DRAW THE REMAINING LIVES '*************************************** DRAWLIVES: 'DISABLE ALL LIVE SPRITES SPRITE OFF 5 TO 7 'NO LIVE, NOTHING TO DO IF LIVES = 0 THEN RETURN END IF 'DRAW EACH LIVE FOR I = 0 TO LIVES - 1 SPRITE I + 5 PAL 0 SPRITE I + 5, LIMITLEFT + 8 + (I * 8), LIMITBOTTOM - 10, 11 NEXT I RETURN '*************************************** 'DRAW THE MESSAGES '*************************************** DRAWMESSAGES: 'SHOW THE SUMMARY SCREEN IF SUMMARYSCREEN = 1 THEN MSGX = PLAYFIELDSTARTX + ((PLAYFIELDENDX - PLAYFIELDSTARTX) / 2) MSGY = PLAYFIELDSTARTY + ((PLAYFIELDENDY - PLAYFIELDSTARTY) / 2) LOCATE MSGX - 3, MSGY - 1 PRINT "ROUND:", LEVEL LOCATE MSGX - 3, MSGY PRINT "LIVES:", LIVES 'PLAY THE SUMMARY MUSIC ONCE AND RETURN TO GAME AFTER 'THE PATTERN ENDS IF MUSIC(3) = 0 THEN MUSIC 0 ELSE IF MUSIC(0) > 0 THEN STOP SUMMARYSCREEN = 0 END IF END IF 'SHOW THE GAME OVER SCREEN IF GAMEOVER = 1 THEN MSGX = PLAYFIELDSTARTX + ((PLAYFIELDENDX - PLAYFIELDSTARTX) / 2) MSGY = PLAYFIELDSTARTY + ((PLAYFIELDENDY - PLAYFIELDSTARTY) / 2) LOCATE MSGX - 4, MSGY - 1 PRINT "GAME OVER!" ' PLAY THE GAME OVER MUSIC UNTIL THE PATTERN REACHES THE END IF MUSIC(3) = 0 THEN MUSIC 6 ELSE IF MUSIC(0) > 6 THEN STOP SUMMARYSCREEN = 0 GAMEOVER =0 END IF END IF RETURN '*************************************** 'PLAY THE REBOUND ON BAR SOUND '*************************************** PLAYREBOUNDONBAR: SOUND 0, 2, 8, 25 ENVELOPE 0, 0, 6, 0, 8 LFO 0, 0, 0, 0, 0 PLAY 0, 78, 5 RETURN '*************************************** 'PLAY THE REBOUND ON BLOCKS SOUND '*************************************** PLAYREBOUNDONBLOCK: SOUND 0, 2, 8, 25 ENVELOPE 0, 0, 6, 0, 8 LFO 0, 0, 0, 0, 0 PLAY 0, 68, 5 RETURN '*************************************** 'PLAY THE LOOSE A LIVE SOUND '*************************************** PLAYLOOSELIVE: 'CONFIGURE THE SOUND SOUND 0, 2, 10, 0 ENVELOPE 0, 0, 10, 13, 2 LFO 0, 10, 15, 6, 2 LFO WAVE 0, 1, 0, 1, 1 'PLAY IT 3 TIMES FOR I = 0 TO 2 PLAY 0, 45, 22 WAIT 22 NEXT I RETURN #1:MAIN PALETTES 003E3930003F1B07000702010030383C 00080722003F2A15003E3829000C0804 #2:MAIN CHARACTERS 00000000000000000000000000000000 0F3F70C0C0703F0F00000F3FFF7F3F0F 00FF00000000FF000000FFFFFFFFFF00 F0FC0E03030EFCF00000F0FCFFFEFCF0 0000183C3C18000000183C7E7E3C1800 5D071E3E387273FEFEF9E7DFDF9DAD73 24666666666666241C1E781E1E781E1C 48CCCCCCCCCCCC4870F03CF0F03CF070 007EFF0000FF7E00002424FFFFDB5A00 000F1F3870636766000000070F1F1F1E 00E0F0381C8CCCCC000000C0E0F0F0F0 000042FF8142000000000000FF420000 FFFFFFFFFFFFFF000000000000000000 FEFEFEFEFEFEFE000000000000000000 0000000000000000FFFFFFFFFFFFFF00 0000000000000000FEFEFEFEFEFEFE00 FFFFFFFFFFFFFF00FFFFFFFFFFFFFF00 FEFEFEFEFEFEFE00FEFEFEFEFEFEFE00 FF8080808080807F007F7F7F7F7F7FFF FF010101010101FF00FFFFFFFFFFFFFF FF819B8F8783827F017F7F77797D7FFF FF0161C1E17109FF00FFDFBFFFDFF7FB #15:MAIN SOUND 2600C08F180264001800846C003A0000 08006060000000002800303019FE0000 38002020000000003800505000000000 0800000F000000000800000F00000000 0800000F000000000800000F00000000 0800000F000000000800000F00000000 0800000F000000000800000F00000000 0800000F000000000800000F00000000 00014040020340400405404006074040 080940400A0B40400C0D40400E404040 40404040404040404040404040404040 40404040404040404040404040404040 40404040404040404040404040404040 40404040404040404040404040404040 40404040404040404040404040404040 40404040404040404040404040404040 40404040404040404040404040404040 40404040404040404040404040404040 40404040404040404040404040404040 40404040404040404040404040404040 40404040404040404040404040404040 40404040404040404040404040404040 40404040404040404040404040404040 40404040404040404040404040404040 370F00370F003A0F0000000000000000 0000390F00370F00350F00390F00370F 00000000000000000000000000000000 000000000000000000000000FF000000 00000000000000000000000000000000 00000000000000000000000000000000 2B0F00FF0000270F0000000000000000 0000290F000000000000000000000000 00260F002B0F00260F002B0F00000000 000000000000000000000000FF000000 00000000000000000000000000000000 00000000000000000000000000000000 340F00FF0000360F00370F00360F00FF 0000340F00FF0000360F00FF00003B0F 00FF0000360F00FF0000000000000000 340F00FF0000360F00370F00360F00FF 0000340F00FF0000340F00FF0000330F 00FF0000340F00FF0000360F00FF0000 1C0F00FF0000230F00FF00001C0F00FF 0000230F00FF0F001C0F00FF0F00230F 00FF00001C0F00FF0000230F00FF0000 1C0F00FF0000230F00FF00001C0F00FF 0000230F00FF00001C0F00FF0000230F 00FF00001C0F00FF0000230F00FF0000 340F00FF0000360F00370F00360F00FF 0F00340F00FF0000360F00FF00003B0F 00FF0F00360F00FF0000000000000000 370F00FF0000390F003B0F00390F00FF 0000370F00FF0F00390F00FF0F003E0F 00FF0F00390F00FF0F00000000000000 1C0F00FF0000230F00FF00001C0F00FF 0000230F00FF00001C0F00FF0000230F 00FF00001C0F00FF0000230F00FF0000 1F0F00FF0000260F00FF00001F0F00FF 0000260F00FF00001F0F00FF0000260F 00FF00001F0F00FF0000260F00FF0000 420F00FF0000000000000000420F00FF 0000000000000000420F00FF00000000 00000000420F00400F003E0F00390F00 3B0F00FF000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 1C0F00FF0000230F00FF00001C0F00FF 0000230F00FF00001C0F00FF0000230F 00FF00001C0F00FF0000230F00FF0000 1F0F00FF0F00260F00FF00001F0F00FF 0000260F00FF00001E0F00FF0000250F 00FF00001E0F00FF0000250F00FF0000 420F00FF0000000000000000420F00FF 0000000000000000420F00FF00000000 00000000420F00400F003E0F00390F00 3B0F00FF000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 1C0F00FF0000230F00FF00001C0F00FF 0000230F00FF00001C0F00FF0000230F 00FF00001C0F00FF0000230F00FF0000 1F0F00FF0000260F00FF0F001F0F00FF 0000260F00FF00001E0F00FF0000250F 00FF00001E0F00FF0000250F00FF0000 370F00FF00000000000000003E0F00FF 00000000000000000000003D0F003E0F 00400F003E0F00FF0000000000000000 370F00FF0F000000000000003E0F00FF 0000000000000000000000400F003E0F 003D0F003E0F00400F003E0F00FF0000 1F0F00FF00001A0F00FF00001F0F00FF 00001A0F00FF00001F0F00FF00001A0F 00FF00001F0F001A0F001C0F001E0F00 1F0F00FF0F001A0F00FF0F001F0F00FF 0F001A0F00FF0F001F0F00FF0F001A0F 00FF0F001F0F00FF0F001A0F00FF0F00 320F00FF0000320F00FF0000370F00FF 0000360F00FF0000390F00FF00003B0F 00FF0000370F00320F00320F00FF0000 370F00FF0000360F00FF0000390F00FF 00003B0F00390F003B0F00FF00000000 00000000000000000000000000000000 1A0F00FF0000170F00FF00001F0F00FF 00001A0F00FF0000230F00FF00001F0F 00FF00001A0F00FF00001A0F00FF0000 1A0F00FF0000170F00FF00001F0F00FF 0000230F00210F00230F00FF00000000 00000000000000000000000000000000