The Bouncing Ball is a homebrew Gameboy game made by HuCABBAGE for the 4th annual GBJam (2015).
In this neat little platformer with no music, thus only sound effects, you are in control of a little ball, which is constantly bouncing around.
Your goal is to bounce through all the 50 unique levels by collecting every heart you can find on your way.
About the game:
The Bouncing Ball is
a homebrew GameBoy game made by HuCABBAGE for the 4th annual GBJam (2015). In this game you play as a little ball that automatically bounces and your goal is to collect all hearts throughout the 50 different levels featured in the game.
Game objectives:
- Emulator used: BizHawk 2.4.1
- Core: Gambatte
- BIOS: Game Boy (World)
- Unofficial/homebrew game
- Genre: Platform
- Aims for fastest completion (real time)
- Abuses programming errors in the game
- This movie beats the cancelled submission by 4939 frames
Making of the TAS:
After BrunoValads introduced KiwiCracker to some glitches he had missed in his original submission, they collaborated to further improve the movie. Development started on BizHawk 2.4 and was finished on 2.4.1. The game is simple but the glitches made this an interesting TAS game.
Game mechanics:
- Modes
- Marathon: main mode, start on level 1 and end on level 50, after beating each level you get a password;
- Continue: continue main mode, via the password system;
- Practice: can select each one of the 50 levels for training;
- Controlling the ball
- D-pad left: move left;
- D-pad right: move right;
- Bouncing is automatic;
- Blocks
- Unbreakable blocks: solid, just bounce on its 4 sides;
- Breakable blocks: can be broken if you bounce on the top 2 times;
- Moving platforms: sprites that have a defined path, you can pass under it and bounce over;
- Arrow blocks:
- Up-arrow: boosts your bounce like a spring;
- Sideway-arrow: shoots your ball in the arrows direction like a cannon. You can stop your flight by either pressing a button (any button will do) or by flying into something else;
- Spikes: If the ball touches them, you die. Note: the bottom pit is actually a line of spikes, as seen in the GPU viewer;
- Hearts: If the ball touches a heart, the heart is collected. If all hearts are collected, you proceed to the next level. After collecting a heart, the ball’s momentum is preserved;
- Physics:
- The game precision is pixels and 16 subpixels per pixel. Speed is given in subpixels/frame;
- X speed: max moving speed to the right is 0x08, to the left is -0x09, sideway-arrow shot speed is ±0x10;
- Y speed: terminal falling speed is +0x18, upward bouncing speed is -0x19, upward arrow boost speed is -0x22.
Strategy:
When the last heart is collected, the ball flies upwards until it reaches the top of the screen. Only after that you can transition to the next level. So, when going for fastest completion in real time, the strategy is not necessarily to collect all hearts as fast as possible, but to transition the fastest. What this essentially means, is that the ball should have as much upwards momentum as possible, when collecting the last heart.
Since the bouncing is automatic, optimization usually involves minimizing bounce cycles. On some levels it’s clear that you’re close to the heart but have to wait the bounce.
Tricks and glitches:
- Bumping against a wall reverses the x speed of the ball. The default x speed to the right is 8 while it’s 9 to the left. So, when bumping off a wall to the left the 9 speed mirrors and you can hold it indefinitely. This was used to move faster in some levels.
- When it comes to moving platforms, the ball is actually able to bounce off of their bottom part as well, which is a few frames faster than a regular bounce (usually 1~2).
- Corner bounce: When doing a corner bounce, the ball kind of falls one pixel further before it then suddenly clips up onto the block again. Therefore, the corner bounce is usually 2 frames slower than a regular bounce (two frames, because of the one more frame of free fall and the one frame needed to clip up). A corner bounce reverses the x speed just like a bump against a wall, since the game interprets it as a wall and a floor at the same time. The corner bounce have different outcomes depending on the block you’re touching:
- Breakable blocks: Instead of destroying the block itself, it turns whatever is underneath the block into a breakable block and destroys it instead.
- Arrow blocks:
- Up-arrow: Can destroy the arrow block (not always the case);
- Sideway-arrow: Corner bounce doesn’t work on sideway-arrow-blocks (which makes sense, since the ball simply can’t bounce off those);
- Solid blocks and moving platforms: Nothing special. It’s just slower than a usual bounce (which sometimes actually comes in handy).
- Clipping through walls:
- The ball must be moving with high x speed (such as the normal max horizontal speed of 0x08), then in the very last frame before touching the block you hold the opposite direction for at least 7 frames. The game “forgets” to handle collision since you’re holding the opposite direction, so the ball can end up inside the block.
- Corner clip: Doing a corner clip is possible from both left and right:
- Breakable blocks: Usually destroys the block underneath
- Arrow blocks:
- Up-Arrow: Destroys the arrow-block;
- Sideway-arrow: Doesn’t work;
- Unbreakable block: Just clips through it, forcing the ball to zip downwards;
- Movable platforms: Doesn’t work;
- Clipping into walls directly (only possible when clipping from the left or with very high speed from the right):
- Breakable blocks: Usually destroys the block underneath;
- Unbreakable block: Clips through it, forcing the ball to zip downwards;
- Movable platforms: Doesn’t work.
- Clip bounce: When coming from beneath, the ball can kind of clip upwards to instantly bounce off the platform. On different platforms:
- Breakable blocks: Either the block itself or the block underneath gets destroyed
- Arrow blocks:
- Up-Arrow: Can destroy the arrow block (not always the case);
- Sideway-arrow: Doesn’t work;
- Unbreakable block: Just a simple clip bounce, nothing special happens;
- Movable platforms: Doesn’t work.
- Out of Bounds: by clipping the wall on the level/screen boundary, the ball can end up out of bounds, which is fully navigable. When checking the VRAM in the GPU Viewer, you can see that the main game region is the Background, and the secondary region is the Window. We don’t know exactly the details here, but when the ball is moving OOB it can reach the Window as well, right below the Background. While in the Window, the ball interacts with blocks from both the Background and the Window, with exception of the moving platforms and the level hearts. This is useful for 2 instances:
- Skipping portions of the level, by using it as a shortcut to get hearts faster, which was used a lot in the run and the research;
- Getting the OOB Heart: the pause menu is loaded in the Window, and it has a heart as cursor to select between “Resume” or “Quit”. This heart actually works the same way as the normal ones in the level, so if you get OOB and reach it you can end the level, as long you pause to load the heart there. Also it must be the last heart to take (the remaining heart counter at $00D6 must be 1), otherwise the level still waits for you to get the remaining ones, and down there you can’t get back to the level — unless you fall down and wait the overflow in the y position. This strat takes around 650 frames, depending on where the ball starts in the level, so levels that are slower than that were candidates for this trick. Unfortunately, it was only faster in level 23.
- Level 1 (176): Nothing special can be done here
- Level 2 (325): First abuse of the extra x speed by bumping the wall to the left and carrying this speed til the end, where wall clip is used to zip to the heart getting it faster.
- Level 3 (338): Wall zip to reach the heart faster.
- Level 4 (315): Nothing special can be done here.
- Level 5 (384): Small clips to interact with solid block earlier when advancing the steps.
- Level 6 (359): Nothing special can be done here.
- Level 7 (409): Nothing special can be done here.
- Level 8 (457): Nothing special can be done here.
- Level 9 (496): Corner clip in the end to zip and grab heart faster.
- Level 10 (168): Corner bounce to avoid dying to spike. A wall zip here would require an extra bounce, which is slower.
- Level 11 (112): OOB clip to skip all the level and get heart earlier.
- Level 12 (308): Corner bounce to get speed 9, and wall clip to zip and reach heart faster.
- Level 13 (314): Corner clip to reach the lateral spring earlier.
- Level 14 (429): Matching speed 9 with the moving platform cycle to bounce the least possible.
- Level 15 (379): Wall clip to skip the arrow block.
- Level 16 (123): Corner clip to zip straight to the heart, skipping the whole level.
- Level 17 (375): Saves one bounce in the start due speed 9, and saves another bounce in the end by clipping inside blocks with corner clip.
- Level 18 (338): Corner bouncing over. the spike in the top to skip most of the level.
- Level 19 (122): Corner clip to wall zip to get the heart faster.
- Level 20 (463): Clip through the block under the heart.
- Level 21 (427): Wallclip OOB into the heart.
- Level 22 (426): Nothing special can be done here.
- Level 23 (791): Grab 2 hearts on the right (one with zip), then clip out of bounds to get the OOB Heart.
- Level 24 (848): Nothing special can be done here. OOB Heart was an option but is slower.
- Level 25 (1168): Very slow level, really can't do anything special here.
- Level 26 (120): Corner clip the spring block and the block diagonally underneath to skip the whole level and get the heart earlier.
- Level 27 (145): Clip the brick block to zip downwards overwriting the spike block there.
- Level 28 (422): Skips the block cluster by wallclipping and zipping straight out of it.
- Level 29 (676): Corner clip zip to skip a small part of the level.
- Level 30 (476): Corner bounce in the spring block to erase it, enabling a corner clip in the solid block right next to it, skipping half the level.
- Level 31 (516): OOB wall zip to reach cannon faster.
- Level 32 (530): Wall zips to reach the heart faster.
- Level 33 (744): OOB clip to reach the last heart faster.
- Level 34 (482): Forgoes first 2 cannons with OOB clip. OOB Heart is impossible due the amount of spikes in the level, since when you are OOB the collision with some blocks still happen in the normal coordinates.
- Level 35 (216): OOB zip through the 1st heart until the 2nd, skipping almost the whole level
- Level 36 (338): Wallclip into the narrow passage, skipping almost the entire level.
- Level 37 (111): OOB zip to skip the entire level.
- Level 38 (788): Small clips to move faster.
- Level 39 (122): Corner clip to zip and skip most the level
- Level 40 (644): Kept the momentum from the cannon until the firsts heart, then wallclip to the left. OOB Heart is impossible here.
- Level 41 (652): OOB zip to get 2nd heart faster, then some precise tricks to pass thru the center of the level without backtracking.
- Level 42 (224): OOB clip to get 1st heart faster, then OOB zip to get 2nd heart faster.
- Level 43 (621): Just skip the last spring block.
- Level 44 (617): OOB Heart was an option, but it is a little bit slower
- Level 45 (605): Corner clip to adjust timing with the moving platform, to get the best cycle. Also took advantage of the cannon x speed until the end of the level.
- Level 46 (806): Nothing too special can be done here. OOB Heart was an option, but it's slower.
- Level 47 (2086): Nothing fancy can be done here, too many hearts, movement is tied to the moving platform cycles, and they lag a lot. OOB Heart to replace the last heart is slower...
- Level 48 (1267): Getting the 1st heart as usual, then going back to wall zip passing thru the 2nd heart. OOB Heart replacing the 1st was an option, but is impossible to get.
- Level 49 (852): Took advantage of the cannon x speed to reach the moving platform earlier, then wall zip to get 3rd heart faster.
- Level 50 (286): Sequence of wall clips and jump delays to ignore the need of the moving platform.
Lua script:
Screenshot suggestion:
Frame 13769
Memory: Optimization appears quite good.
This homebrew is decently notable, having popped up in top gameboy homebrew lists.
Entertainment was quite the divisive topic. I personally enjoyed it and felt that the various tricks were quite interesting. However, the lack of any music was a bit of a letdown. Some other people shared this sentiment, however others felt it was basic. There are some basic levels but I feel that the experience was good enough. It is borderline though so I'll accept to Moons with the expectation that it be re-evaluated upon collecting ratings.
Accepting to Moons.