pouët.net

Breakout Adventure by Relational Framework [web]

Breakout Adventure is a demo you can play!

Featuring the Ball as Player1 and the Atari logo as Player2 (or the CPU). 

To start the game/demo move the ball at an angle.

After you clear the first screen (by hitting about 250 bricks) it get's really intense and may be more fun just to watch and listen to. 

Demo or Game?

It's a pure demo if you just watch it, even if you choose to keep playing the demo it feels more demo than game - try and see :)

Demo Tips
If you wait too long to start, the Atari logo will get a big head start collecting the bricks and it will take a long time to clear the screen - you collect extra bricks by going through the moving phrase section of the virtual world whenever the phrase dribbles the ball.

This demo is written in BASIC! The BASIC program, compiled ROM image and BASIC compiler are included with the download - modify the demo with your own phrases or write your own games and scene demo's!

Get BASIC in ROM or load the BASIC from tape!
Virtual World BASIC is a 6K TinyBASIC implementation for the Atari 2600! 
You can get BASIC in ROM for cartridge or emulation play, or load the BASIC from tape. The Atari has switches on the console like an Altair - with a  SuperCharger board, you can load BASIC from tape.

Here is the BASIC listing for Breakout Adventure:

 rem -----------------------------------------
 rem *** BREAKOUT ADVENTURE Version2
 rem *** FEATURING THE BALL AS PLAYER 1
 rem *** AND THE ATARI LOGO AS PLAYER 2
 rem -----------------------------------------
 rem *** Hit enough blocks to clear the board
 rem *** The Camera only follows Player 1,
 rem *** and the AI can control player 2
 rem -----------------------------------------
 rem -----------------------------------------
 rem ---init section, runs once: -------------
 rem -----------------------------------------
 rem -----------------------------------------
 f=0:t=0:g=3:u=5:x=5:y=5:v=6:w=0:z=0:m=0:r=16:p=2:q=2:h=112:l=0:k=0:n=0:score=0
 rem loadplayer0(104)	
 COLUPF=$3A: rem COLUPF=$be
 COLUP0=$54
 rem vwpixel(x,y,bindplayer0):vwpixel(u,v,bindplayer1)
 NUSIZ1=%00011111
setuproutine rem ---- can call this
 scrollvirtualworldtoggle=1:rem refresh cam after drawing on virtual world
 for i = 13 to 19 step 2
 for j = 3 to 5
 vwpixel(i,j,on)
 next j,i
 for i= 91 to 13 step -2
 for j = 7 to 12
 vwpixel (i,j,on)
 next j,i
 rem ------------------------------------------------
 rem end init section (implicit return)--------------
 rem ------------------------------------------------


 rem ------------------------------------------------
 rem ------------------------------------------------
 rem ---:the next comment line is used by the compiler
 rem ---gameloop subroutine, runs every frame:    ---
 rem ------------------------------------------------
 rem ------------------------------------------------


 rem vars t-toggle x,y f-frame g - direction (12345678, 1 is up)
 rem varx u,v (p1 xy), r - marquee in center of virtual world index
 rem w, z dir x/y, : p,q dir p1 x/y,   m - musical pixels p0
 rem i,j,e - temp vars for loops, expressions
 rem l used by scroll, k, n too.
 rem TinyBASIC program
 rem ---------------------------------------------------
 
 t=1-t:rem this expression toggles var t between 0 and 1 
 rem if t=1 then return:rem half speed option

 rem ---------------------------------------------------
 rem ------- four loads, split every 16 frames
 rem can split them again using t for sprite multiplexing
 
 f=f+1
 if f=1 then goto framehandler1 
 if f=2 then goto framehandler2
 if f=3 then goto framehandler3
 if f=4 then f=0: goto framehandler4 

 return:rem never gets here
 rem -------------------------------------------------------------
 rem -------------------------------------------------------------
 rem -------------------------------------------------------------

 rem -------------------------------------------------------------
 rem -------------------------------------------------------------
framehandler1 rem ---------------------------- start framehandler1
 rem -------------------------------------------------------------
 rem -------------------------------------------------------------

 vwpixel(x,y,bindplayer0)
 vwpixel(u,v,bindplayer1)

 rem --- player 1 action/input:
 rem z=0:w=0
 rem COLUP0=$84
 if joy0left=1 then w=1 
 if w=1 and x>0 then x=x-1 
 if joy0right=1 then w=2
 if w=2 and x<91 then x=x+1
 if joy0up=1 then z=1
 if z=1 and y>0 then y=y-1
 if joy0down=1 then z=2
 if z=2 and y<19 then y=y+1
 loadplayer0(104)
 REFP0=0: rem face forward, default incommming

 if x=0 and w=1 then w=2: rem flip direction if at border of virtual world
 if x=91 and w=2 then w=1
 if z=1 and y=0 then z=2
 if z=2 and y=19 then z=1

 if vwpixel(x,y,poll)=0 then return

 if w=1 and z=1 then z=2:goto jmpxif :rem if left and up go down and left
 if w=2 and z=1 then z=2:goto jmpxif:rem if right and up go down and right
 if w=1 and z=2 then z=1:goto jmpxif:rem if left and down go left and up
 if w=2 and z=2 then z=1 : rem if right and down then right and up  
jmpxif

 vwpixel(x,y,flip):rem pixel destroyed, take over one voice; fx with the music:
 AUDC0=ballwaveform(m):rem ball wave
 AUDF0=ballmusic(m):rem ball music
 if m>9 then m=0 else m=m+1
 SUSTAINFORFRAMES=10
 score=score+1 
 rem -------------------------------------------------------------
 rem -------------------------------------------------------------
 return: rem ---------end framehandler1
 rem -------------------------------------------------------------
 rem -------------------------------------------------------------


 rem -------------------------------------------------------------
 rem -------------------------------------------------------------
framehandler2 rem ----------------------------- start framehander2 
 rem -------------------------------------------------------------
 rem -------------------------------------------------------------
  
 rem COLUP0=$64
 REFP0=255:rem player face backwards

 rem COLUP1=68:REFP1=0: rem player face forward


 rem -------------------------------------------------------------
 rem -------------------------------------------------------------
 return : rem -------------end framehandler2
 rem -------------------------------------------------------------
 rem -------------------------------------------------------------

 rem -------------------------------------------------------------
 rem -------------------------------------------------------------
framehandler3 rem ----------------------------- start framehander3
 rem -------------------------------------------------------------
 rem -------------------------------------------------------------
 rem COLUP0=$44
 loadplayer0upsidedown(104): rem player upsidedown


 rem player2 action/input:
 rem q=0:p=0
 if joy1left=1 then p=1 
 if p=1 and u>0 then u=u-1 
 if joy1right=1 then p=2
 if p=2 and u<91 then u=u+1
 if joy1up=1 then q=1
 if q=1 and v>0 then v=v-1
 if joy1down=1 then q=2
 if q=2 and v<19 then v=v+1
 rem REFP1=0: rem face forward, default incommming

 if u=0 and p=1 then p=2: rem flip direction if at border of virtual world
 if u=91 and p=2 then p=1
 if q=1 and v=0 then q=2
 if q=2 and v=19 then q=1

 if vwpixel(u,v,poll)=0 then return

 if p=1 and q=1 then q=2:goto jmpxif2 :rem if left and up go down and left
 if p=2 and q=1 then q=2:goto jmpxif2:rem if right and up go down and right
 if p=1 and q=2 then q=1:goto jmpxif2:rem if left and down go left and up
 if p=2 and q=2 then q=1 : rem if right and down then right and up  
jmpxif2

 vwpixel(u,v,flip):rem pixel destroyed, take over one voice; fx with the music:
 rem unless both players have simultaneous hits - then both fx
 AUDC1=ballwaveform2(m):rem ball wave
 AUDF1=ballmusic2(m):rem ball music
 if m>9 then m=0 else m=m+1
 SUSTAINFORFRAMES=10
 


 rem -------------------------------------------------------------
 rem -------------------------------------------------------------
 return : rem -------------end framehandler3
 rem -------------------------------------------------------------
 rem -------------------------------------------------------------


 rem -------------------------------------------------------------
 rem -------------------------------------------------------------
framehandler4 rem --------------------------- start frame handler4
 rem -------------------------------------------------------------
 rem -------------------------------------------------------------
 
 REFP0=0: rem player face forward


 rem COLUP1=50:REFP1=255:rem player face backwards



 rem ------------------------------------------------
 rem ------pan the camera to follow player 1:
 rem ------------------------------------------------
 if x-BITIndex > 12 and BITIndex < 72 then BITIndex=BITIndex+1:scrollvirtualworldtoggle=1
 if x < BITIndex+10 and BITIndex>0 then BITIndex=BITIndex-1:scrollvirtualworldtoggle=1
 rem -----pan camera vertically (BYTErowoffset) if player is near the edge of the playfield CAM
 rem i = y*12: rem "read i(fastyindex,y)" is faster (12 step lookup table for virtual world y values)
 i=fastyindex(y): rem index the y*12 lookup table
 if BYTErowoffset<120 and BYTErowoffset+36<i then BYTErowoffset=BYTErowoffset+12:scrollvirtualworldtoggle=1
 if i>36 then i=i-36
 if BYTErowoffset>i then BYTErowoffset=BYTErowoffset-12:scrollvirtualworldtoggle=1	
 

 
 rem -------------------------------------------------------------
 rem -------------------------------------------------------------
 rem ----------end framehandler4 
 rem -------------------------------------------------------------
 rem -------------------------------------------------------------

 rem -------------------------------------------------------------
 rem ------------------------------------------------
 rem end game loop (implicit return)-----------------
 rem ------------------------------------------------
 rem -------------------------------------------------------------


 rem -------------------------------------------------------------
 rem -------------------------------------------------------------
 rem ---:the next comment line is used by the compiler
 rem ---gameloop2 subroutine, runs every frame:    --
 rem ------------------------------------------------
 rem -------------------------------------------------------------

 rem vars: h - sliding index for player 2 sprite message

 if l<>4 and l<>8 and l<>12 and l<>16 then goto scrollplayerdelay
 loadplayer1(h)
 h=h+1
 if h>184 then h=112
scrollplayerdelay
 rem i=i+1:mazecolours(l)=i
 l=l+1
 if l>16 then l=0:COLUP1=mazecolors(n):n=n+1
 if n>16 then n=0
 rem play 2nd or 3rd (60/90 MUSICINDEX) and clear board if enough blocks are destroyed:
 if score=255 then score=0:COLUPF=0:MUSICINDEX=90:for i=0 to 91:for j=0 to 19 step 3:vwpixel(i,j,on):next j,i:COLUPF=mazecolors(k):k=k+1
 if k>16 then k=0
 
 rem -------------------------------------------------------------
 rem -------------------------------------------------------------
 rem end gameloop2 (implicit return)----------------- 
 rem ------------------------------------------------
 rem -------------------------------------------------------------


 rem -------------------------------------------------------------
 rem -------------------------------------------------------------
 rem ---:the next comment line is used by the compiler
 rem ---KITCHENSINK subroutine, runs when scrollvirtualworldtoggle=1
 rem ------------------------------------------------
 rem -------------------------------------------------------------
 rem -------------------------------------------------------------

 rem run playfield central banner routine when scrolling:
 
 if r>84 then r=16
 for j=0 to 19: rem --- slide sprite library array through virtual world array
 i=r+j
 e=fastyindex(j)+5: rem same as j*12+5, lookup table
 rem e=e+5
 virtualworld(e)=sprites(i):push a slice of sprites array into world array
 next j
 r=r+20

 rem -------------------------------------------------------------
 rem -------------------------------------------------------------
 rem end KITCHENSINK (implicit return)----------------------------
 rem -------------------------------------------------------------
 rem -------------------------------------------------------------

 rem Dynamic RAM array variables are initialised in data statements:
 data mazecolors $b0,$50,$60,$a0,$02,$40,$22,$c0,$92,$f4,$52,$a2,$d0,$f2,$70,$e2
 rem -- player one block destroyed music:
 data ballwaveform 6,6,4,7,8,1,2,6,6,4,4,7
 data ballmusic 2,4,6,8,10,12,14,16,18,20,9
 rem ---- player2 block destroyed music:
 data ballwaveform2 4,4,4,4,4,4,4,6,6,4,4,7
 data ballmusic2 11,9,12,4,7,0,11,14,18,20,9

virtualworld
X.....................................X...X..X.........X..XXXX.....XXXXXX......XXXXXXXXXXXXX
.X.......XXXXX........................X...X..X.........X..X..X....X......X.....X..........XX
..XX.........X........................X...X...X...X...X...XXXXX..X..X..X..X....X...XXXXXXXXX
....X........X.........................X.X.....X.X.X.X....X....X.X........X....X............
.....X.......X..........................X.......X...X.....XXXXXX.X.X....X.X....XXXXXXXXXX...
......X......X..........XXXXXXXXXX...............................X..XXXX..X.............X...
.......X......X..................X................................X......X..............X...
........X.....X..................X.................................XXXXXX...............X...
.........X.....X.............X...X..............................................XXXXXXXXX...
..........X...X..............X...X..........................................................
...........X.X...............X...X..................................................XXXXXXXX
............X................X...XXXXXXXXX........................................XXX......X
X............................X....................................................X........X
.X.......XXXXX...............XXXXXXXXXXXXX........................................X...XXXXXX
..XX.........X........................................................................X.....
....X........X........................................................................X.....
.....X.......X........................................................................X.....
......X......X........................................................................X.....
.......X......X.......................................................................X.....
X.......X.....XXXX....................................................................XXXXXX

sprites
0
..XXX...
..XXX...
XXXXX.X.
..XX.XX.
XXXX.X..
X.XXX...
XX.XXX..
.XX.XXXX
8
.X.X.X..
..XXXX..
X..XX...
XXXXXX..
...XX.XX
...XX...
X.X..X.X
.X....X.
16
........
XX...XX.
XX...XX.
XXXXXXX.
XXXXXXX.
XX...XX.
XX...XX.
........
24
........
..XXX...
.X...X..
.XXXXX..
.X......
.X......
..XXXX..
........
32
........
.XX.....
.XX.....
.XX.....
.XX.....
.XXXXX..
.XXXXX..
........
40
........
.XX.....
.XX.....
.XX.....
.XX.....
.XXXXX..
.XXXXX..
........
48
........
..XXXX..
.XXX.XX.
.XX..XX.
.XX..XX.
.XX.XXX.
..XXXX..
........
56
........
........
........
........
........
........
........
........
64
........
X......X
X......X
X..XX..X
X..XX..X
X.X..X.X
XX....XX
........
72
........
..XXXX..
.XXX.XX.
.XX..XX.
.XX..XX.
.XX.XXX.
..XXXX..
........
80
........
.XXXX...
.XX..X..
.XXXX...
.XX.X...
.XX..X..
.XX..XXX
........
88
........
.XX.....
.XX.....
.XX.....
.XX.....
.XXXXX..
.XXXXX..
........
96
........
.XXXX...
.XX.XX..
.XX..XX.
.XX..XX.
.XX..XX.
.XXXXX..
........
104
........
........
...xx...
..x.xx..
.x..xxx.
.x....x.
..x..x..
...xx...
112
XXXXXX..
X...XX..
XXXXXX..
XX...X..
XX...X..
XX...X..
XX...X..
........

120
........
........
XXXXX...
..X.....
..X.....
..XX....
..XX....
..XX....
........
128
........
XXXXXX..
X...XX..
XXXXXX..
XX...X..
XX...X..
XX...X..
........
136
........
XXXXXX..
X...XX..
XXXXXXX.
XX....X.
XX....X.
XX....X.
........
144
........
........
..X.....
..X.....
..XX....
..XX....
..XX....
..XX....
........

152
........
........
.xxxxx..
.x...x..
.....x..
..xxxx..
.xx.....
.xx.....
.xxxxx..
160
........
........
.xxxxx..
.x......
.x......
.xxxxx..
.x...x..
.xx..x..
.xxxxx..
168
........
.xxxxxx.
.xx...x.
.xx...x.
.xx...x
.xx...x.
.xxx..x.
.xxxxxx.
........
176
........
.xxxxxx.
.xx...x.
.xx...x.
.xx...x
.xx...x.
.xxx..x.
.xxxxxx.
........
184
........
........
........
........
........
........
........
........


chiptunes
7, 30, 0, 0, 8
7, 24, 0, 0, 8
7, 20, 0, 0, 8
12, 9, 12, 7, 22
12, 14, 12, 11, 22
6, 30, 0, 0, 20
6, 24, 6, 30, 10
6, 22, 6, 30, 10
6, 21, 6, 30, 20
12, 26, 12, 19, 20
0, 0, 0, 0, 254
0,0,0,0,0

15, 5, 15, 12, 10
15, 17, 15, 19, 10
15, 5, 15, 12, 10
15, 5, 15, 12, 15
0, 0, 0, 0, 255
29,23,5,10,0

7, 30, 0, 0, 68
7, 24, 0, 0, 8
7, 20, 0, 0, 8
7, 24, 0, 0, 7
30, 0, 0, 8, 17
24, 0, 0, 8, 7
20, 0, 0, 8, 17
24, 0, 0, 8, 7
22, 0, 0, 8, 20
6, 0, 4, 0, 255
27, 0, 0, 8, 15
24, 0, 0, 8, 17
24,24,24,24,0