Chapter 18 still taught the machinery the listing lost when it moved onto SOLID and the persistent drawing layer: the frame-boundary PACE routine, the flattened live list, the SSHAPE pool accounting, and the sixty lines of BALLBRICKS/TESTCELL that computed a minimum translation axis by hand. Step 8 now registers each brick with SOLID, arms COLLISION 2 and reads the contact back with RCOLLISION, including the point that costs an evening if it is missed: the BUMP mask is by sprite, and the balls are sprites 5, 6 and 7, so their bits are 16, 32 and 64. The FOR-with-equal-bounds rule that every one-item case in the chapter depends on is now stated where it is first used rather than referred to from a step that no longer exists. The listing loses six declarations orphaned by the conversion and the comment blocks that still described the captures. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01EwxGB6TdoVvZ11KQQME9cL
104 lines
5.4 KiB
Markdown
104 lines
5.4 KiB
Markdown
# Breakout, with artwork
|
|
|
|
Breakout, written entirely in BASIC for the AKGL BASIC interpreter, using downloaded CC0
|
|
sprite artwork for the paddles, the balls and the powerup gems. The bricks, the HUD and
|
|
the lettering are drawn — `WINDOW` moves the text layer to two rows at the bottom, and
|
|
everything the program draws then stays on the screen without being redrawn or captured.
|
|
|
|
The bricks are also **collidable without being sprites**: `SOLID` registers a rectangle
|
|
the interpreter collides against, so sixty of them cost none of the eight slots.
|
|
|
|
```sh
|
|
../../../build-akgl/basic breakout.bas
|
|
```
|
|
|
|
It needs the SDL build. Without a graphics device the first `SPRSAV` refuses by name and
|
|
the program stops there, which is the right thing for it to do.
|
|
|
|
| Key | Does |
|
|
|---|---|
|
|
| left / right | move the paddle |
|
|
| space | start a game, launch the ball, release a stuck ball |
|
|
| P | pause |
|
|
| S | sound on and off |
|
|
| Q or escape | quit |
|
|
|
|
Three lives, six rows of bricks worth 60 down to 10 points a row, and a field that cycles
|
|
six rows, then five, then four while the ball gets faster every level up to a ceiling. A
|
|
gem is worth 50 on top of whatever it does.
|
|
|
|
## The powerups
|
|
|
|
A broken brick drops a gem about one time in seven, and only ever one at a time. Catch it
|
|
with the paddle. The colour of the gem is what tells you which it is; the banner that
|
|
flashes over the field names it as well.
|
|
|
|
| Gem | Name | Does | For |
|
|
|---|---|---|---|
|
|
| red | EXPAND | doubles the paddle's width | 20 seconds |
|
|
| yellow | MULTI | throws two more balls off the one in play | until they are lost |
|
|
| green | SLOW | drops the ball's speed to about two thirds | 16 seconds |
|
|
| blue | STICKY | the ball sticks where it lands; space fires it | 18 seconds |
|
|
| purple | CATCH | a second bar appears higher up the field | 24 seconds |
|
|
|
|
The second bar **mirrors** the paddle rather than following it, so it covers the side you
|
|
just left. A second bar directly above the first is worth nothing; a mirrored one turns a
|
|
dive across the field into a save at both ends.
|
|
|
|
## How it works, and how to write your own
|
|
|
|
**[Chapter 18 of the guide](../../../docs/18-tutorial-breakout-artwork.md)** builds this
|
|
program step by step: loading artwork, budgeting the eight sprite slots, taking the text
|
|
layer out of the way so a drawing can be seen, stamping the brick field, registering the
|
|
bricks as collision geometry, the stroke font, the bounce without a square root, and the
|
|
gems.
|
|
|
|
[Chapter 17](../../../docs/17-tutorial-breakout.md) does the same for
|
|
[`../characters`](../characters), which builds the same game out of the text grid and two
|
|
`DATA` sprites — a completely different program, and the shorter one to read first.
|
|
|
|
## Where the artwork came from
|
|
|
|
Kenney's [Puzzle Pack 1](https://kenney.nl/assets/puzzle-pack-1), released under
|
|
[CC0](http://creativecommons.org/publicdomain/zero/1.0/). The files in `art/` are the
|
|
pack's own `PNG/Default/` versions, unmodified, with the pack's licence file beside them.
|
|
`art/PROVENANCE.md` says which file is used for what and why the double-size set is not.
|
|
|
|
Crediting Kenney is not required by CC0. It is here because it should be.
|
|
|
|
## What is not in it
|
|
|
|
Named honestly rather than left to be discovered:
|
|
|
|
- **No music under the game**, only event sounds and two four-note stings. There is room in
|
|
the third voice for it; there was not much room anywhere else when it was written. The
|
|
conversion gave some of that room back — the variable table is under the 128 ceiling with
|
|
a handful to spare and the label table is at 57 of 64, where it was at 61.
|
|
- **One gem at a time.** There is one sprite slot for it. A brick broken while a gem is
|
|
falling drops nothing.
|
|
- **Sticky and multiball share one offset.** Two balls stuck to the paddle at once sit on
|
|
top of each other. It is rare enough that fixing it would cost a variable I do not have.
|
|
- **No high score on disk.** There is no disk.
|
|
- **No attract mode**, unlike `../characters`. It sits on the title screen until somebody
|
|
presses space, which also means it cannot test itself unattended the way that one can.
|
|
|
|
The eight interpreter defects this game turned up are filed in `TODO.md` §9, each with a
|
|
reduction that fits on a screen and the file and line of the cause. **Six are now fixed**
|
|
— the leaking `DEF` call, the skipped block that broke its caller's `RETURN`, the ignored
|
|
subscript on `SSHAPE`, `GRAPHIC CLR`, a negative `DATA` item, and half of the invisible
|
|
drawing. The two that stand are the left-operand arithmetic rule, which turned out to be a
|
|
decision rather than a defect and is now documented as one, and the 256-line batch tear,
|
|
which belongs to the host.
|
|
|
|
**The listing has since been converted**, and its header records what went. It used to
|
|
spend two of its eight sprites on the screen itself — an `SSHAPE` of the HUD strip and one
|
|
of the whole play field, because a drawing lasted a single frame and a sprite was the only
|
|
thing redrawn for nothing. A drawing persists now, so both slots are free, the `PACE`
|
|
routine that hunted for a frame boundary is gone with the captures it protected, and the
|
|
flattened live list that made a full-field redraw cheap is gone with the redraw itself: a
|
|
broken brick is erased in place.
|
|
|
|
What has *not* changed is the shape of the workarounds that no longer cost anything — six
|
|
separate scalars for six brick stamps, loops guarded by `GOTO` rather than wrapped in a
|
|
block. Its comments say which of the five traps still stand and which are marked FIXED.
|