
0 CONSTANT WALL-BLOCK-LIST-F
WALL-BLOCK-LIST-F 4 + CONSTANT WALL-NO-BRICKS-F
WALL-NO-BRICKS-F 4 + CONSTANT WALL-SIZE

: WALL-BLOCK-LIST WALL-BLOCK-LIST-F + ;
: WALL-NO-BRICKS WALL-NO-BRICKS-F + ;

: DEF-WALL
   <BUILDS
      WALL-SIZE ALLOT
   DOES>
   ;

0 CONSTANT BLOCK-HEIGHT-F
BLOCK-HEIGHT-F 4 + CONSTANT BLOCK-WIDTH-F
BLOCK-WIDTH-F 4 + CONSTANT BLOCK-XSIZE-F
BLOCK-XSIZE-F 4 + CONSTANT BLOCK-YSIZE-F
BLOCK-YSIZE-F 4 + CONSTANT BLOCK-BRICKS-F
BLOCK-BRICKS-F CONSTANT BLOCK-SIZE

: BLOCK-HEIGHT BLOCK-HEIGHT-F + ;
: BLOCK-WIDTH BLOCK-WIDTH-F + ;
: BLOCK-XSIZE BLOCK-XSIZE-F + ;
: BLOCK-YSIZE BLOCK-YSIZE-F + ;
: BLOCK-BRICKS BLOCK-BRICKS-F + ;

: DEF-WALL-BLOCK ( XSIZE / YSIZE / XBRICKS / YBRICKS )
   <BUILDS
      HERE >R
      2DUP
      * 2 << BLOCK-SIZE + ALLOT
      R
      BLOCK-HEIGHT !
      R
      BLOCK-WIDTH !
      R
      BLOCK-YSIZE !
      R>
      BLOCK-XSIZE !
   DOES>
   ;

0 CONSTANT WALL-BLOCK-F
WALL-BLOCK-F 4 + CONSTANT BLOCK-BOT-LEFTX-F
BLOCK-BOT-LEFTX-F 4 + CONSTANT BLOCK-BOT-LEFTY-F
BLOCK-BOT-LEFTY-F 4 + CONSTANT BLOCK-LIST-SIZE

: WALL-BLOCK WALL-BLOCK-F + ;
: BLOCK-BOT-LEFTX BLOCK-BOT-LEFTX-F + ;
: BLOCK-BOT-LEFTY BLOCK-BOT-LEFTY-F + ;

: DEF-WALL-BLOCK-LIST ( NUM-ELEMENTS -> )
   <BUILDS
      1+ BLOCK-LIST-SIZE * ALLOT
      HERE BLOCK-LIST-SIZE - ( START OF LAST ELEMENT )
      WALL-BLOCK -1 SWAP ! ( STORE -1 AS END OF LIST MARKER )
   DOES>
   ;

: DEF-WALL-BLOCK-ROW ( BRICK-COLOURS ... / ROW-NO / BLOCK -> )
   DUP >R ( SAVE BLOCK ADDRESS )
   BLOCK-WIDTH @ 2 << *
   R BLOCK-BRICKS + ( ADDRESS OF REQUIRED ROW )
   R BLOCK-WIDTH @ 2 << + 4 - ( ADDRESS OF END OF ROW )
   R> BLOCK-WIDTH @ 0 DO
      >R ( ADDRESS )
      18 << OR ( MERGE SCORE WITH COLOUR )
      R ! ( STORE BRICK COLOUR )
      R> 4 - ( DECREMENT ADDRESS )
   LOOP
   DROP
   ;

: INSERT-LIST-ELT ( XPOS / YPOS / BLOCK / BLOCK-LIST / ELT-NO -> )
   BLOCK-LIST-SIZE * + ( ADDR OF ELEMENT )
   >R R WALL-BLOCK ! ( STORE PTR TO BLOCK IN LIST ELEMENT )
   R BLOCK-BOT-LEFTY !
   R> BLOCK-BOT-LEFTX !
   ;

: ATTACH-LIST ( BLOCK-LIST / WALL -> )
   WALL-BLOCK-LIST !
   ;

0 CONSTANT BATX-F
BATX-F 4 + CONSTANT BATY-F
BATY-F 4 + CONSTANT BAT-WIDTH-F
BAT-WIDTH-F 4 + CONSTANT BAT-MINX-F
BAT-MINX-F 4 + CONSTANT BAT-MAXX-F
BAT-MAXX-F 4 + CONSTANT BAT-HEIGHT-F
BAT-HEIGHT-F 4 + CONSTANT BAT-XINC-F
BAT-XINC-F 4 + CONSTANT BAT-SPRITE-CTRL-F
BAT-SPRITE-CTRL-F 4 + CONSTANT BAT-SIZE

: BATX BATX-F + ;
: BATY BATY-F + ;
: BAT-WIDTH BAT-WIDTH-F + ;
: BAT-MINX BAT-MINX-F + ;
: BAT-MAXX BAT-MAXX-F + ;
: BAT-HEIGHT BAT-HEIGHT-F + ;
: BAT-XINC BAT-XINC-F + ;
: BAT-SPRITE-CTRL BAT-SPRITE-CTRL-F + ;

: DEF-BAT ( SPRITE-AREA / SPRITE-NO / XINC / MINX / MAXX / X / Y )
   <BUILDS
      HERE >R
      BAT-SIZE ALLOT
      R BATY !
      R BATX !
      R BAT-MAXX !
      R BAT-MINX !
      R BAT-XINC !
      >R DUP R>
      GET-SPRITE-CTRL-BLOCK
      DUP
      R BAT-SPRITE-CTRL !
      SPRITE-SIZE
      2DUP 2 << R BAT-HEIGHT !
      1 << R BAT-WIDTH !
      DROP
      1 <<
      R BAT-MAXX @
      SWAP -
      R> BAT-MAXX !
   DOES>
   ;

0 CONSTANT BALLX-F
BALLX-F 4 + CONSTANT BALLY-F
BALLY-F 4 + CONSTANT BALL-INCX-F
BALL-INCX-F 4 + CONSTANT BALL-INCY-F
BALL-INCY-F 4 + CONSTANT BALL-MINX-F
BALL-MINX-F 4 + CONSTANT BALL-MINY-F
BALL-MINY-F 4 + CONSTANT BALL-MAXX-F
BALL-MAXX-F 4 + CONSTANT BALL-MAXY-F
BALL-MAXY-F 4 + CONSTANT BALL-WIDTH-F
BALL-WIDTH-F 4 + CONSTANT BALL-HEIGHT-F
BALL-HEIGHT-F 4 + CONSTANT BALL-CENTRE-COL-F
BALL-CENTRE-COL-F 4 + CONSTANT BALL-SPRITE-CTRL-F
BALL-SPRITE-CTRL-F 4 + CONSTANT BALL-SIZE

: BALLX BALLX-F + ;
: BALLY BALLY-F + ;
: BALL-INCX BALL-INCX-F + ;
: BALL-INCY BALL-INCY-F + ;
: BALL-MINX BALL-MINX-F + ;
: BALL-MINY BALL-MINY-F + ;
: BALL-MAXX BALL-MAXX-F + ;
: BALL-MAXY BALL-MAXY-F + ;
: BALL-WIDTH BALL-WIDTH-F + ;
: BALL-HEIGHT BALL-HEIGHT-F + ;
: BALL-CENTRE-COL BALL-CENTRE-COL-F + ;
: BALL-SPRITE-CTRL BALL-SPRITE-CTRL-F + ;

: DEF-BALL ( SPRITE-AREA / SPRITE-NO / MINX / MINY / MAXX / MAXY /
             INITX / INITY / INCX / INCY -> )
   <BUILDS
      HERE >R
      BALL-SIZE ALLOT
      R BALL-INCY !
      R BALL-INCX !
      R BALLY !
      R BALLX !
      R BALL-MAXY !
      R BALL-MAXX !
      R BALL-MINY !
      R BALL-MINX !
      >R DUP R>
      GET-SPRITE-CTRL-BLOCK
      DUP
      R BALL-SPRITE-CTRL !
      2DUP SPRITE-SIZE
      DUP 1 << R BALL-HEIGHT FORTH !
      1 >>
      SWAP
      DUP R BALL-WIDTH !
      1 >>
      SWAP
      READ-SPRITE-PIXEL
      R> BALL-CENTRE-COL !
   DOES>
   ;

0 CONSTANT BALL-F
BALL-F 4 + CONSTANT BALL-LIST-SIZE
: BALL BALL-F + ;

: DEF-BALL-LIST ( NUM-ELEMENTS -> )
   <BUILDS
      1+ BALL-LIST-SIZE * ALLOT
      HERE BALL-LIST-SIZE - ( ADDRESS OF LAST DUMMY ELEMENT )
      BALL -1 SWAP !
   DOES>
   ;

: ATTACH-BALL ( BALL / BALL-LIST / ELT-NO -> )
   BALL-LIST-SIZE * + ( ADDR OF WANTED ELEMENT )
   BALL !
   ;
