GBA Digimon Sapphire in 30:23.93 by Noxxa
- Emulator used: BizHawk v2.4
- Aims for fastest time
- Takes damage to save time
About the game
Digimon Sapphire is a bootleg platforming game developed by Taiwanese bootleg game developer Vast Fame (known for games including Zook Hero Z, Rockman DX3, Devil Island, and Zook Man ZX4).
Throughout its existence from circa 1998 to 2003, Vast Fame developed various Game Boy games and a few Game Boy Advance games. Most of their games are either platform games (generally heavily inspired by Mega Man games) or role-playing games (generally inspired by Pokémon, often taking after Digimon). This game is a clear example of the latter.
Vast Fame games are generally known for being relatively high quality for unlicensed developers, with original stories, reasonably solid gameplay, and surprisingly decent music (helped by the fact that they took the sound engine from Mega Man V for many of their games). They are also known for their rather spotty grasp of the English language, for any games they made English versions of.
Digimon Sapphire actually is a legitimately decent game, with nice visuals, a decent chiptune soundtrack and reasonably good gameplay. It's a fairly straightforward platformer, where you walk around, jump around, fire projectiles at and jump on enemies to progress through eight worlds consisting of three stages, with bosses awaiting you at the end of the second and third stage of each world.
The game has three playable characters: Agumon, Veemon and Guilmon, the respective partners of the main protagonists Tai/Taichi, Davis/Daisuke and Takato of Digimon Adventure, Digimon Adventure 02 and Digimon Tamers respectively. Each of them are completely identical aside from having different sprites and their attacks having different sprites (Agumon and Guilmon fire fireballs, Veemon a V-shaped projectile). In fact, it's possible to hex edit one input at the start of the run to change the selected character (without costing any time), and the run will still sync just the same. So character selection is really just preference.
Besides jumping and shooting, the Digimon have the ability to Digivolve temporarily into a larger, fully invincible Digimon. Oddly, all three playable Digimon Digivolve into WarGreymon. Unsurprisingly, the pirate game remains pretty loose with canon.
On the subject of canon, this game hardly has much of a plotline. It's really just Agumon/Veemon/Guilmon going on a rampage throughout lots of colorful stages. The only dialogue featured is that of the bosses, but...it really does not help all that much.
About the run
This is an improvement of the published movie. Besides general gameplay improvements, there are two key differences: one is the usage of a different ROM, a newer dump (that was dumped in 2016) that is unmodified from the original, unlike the previous dump, and which resolves an issue that the previous ROM had, where the game could crash or play the credits after every stage. Thanks to this difference, there is no longer a need to reset after every stage, saving 198 frames on every instance where this occurs. It should be noted, however, that frame rules are different due to the lack of resets, so additional frames can be gained or lost because of this change.
Also, this run uses the mGBA core instead of the older VBA-next core used in the previous movie. In particular, this time it is required to have the BIOS screen visible on startup and on reset. As such, this movie loses 273 frames at the start.
Disregarding the differences caused by the ROM and emulator, this movie saves a total of 1844 frames in gameplay time from the published run. More details on this are listed below.
Infinite mid-air jump
A simple trick that allows for a lot of little skips and many bigger spiks as well. By jumping one frame after firing a projectile in mid-air, it is possible to jump in mid-air. This can be easily and infinitely repeated as well, allowing for practically free aerial movement.
This is less a trick and more just abuse of a property of the Digivolved form that it ignores ceilings in collision. Normally this makes no big difference, but combined with infinite jumps it means some vertical sections are traversed through faster by Digivolving and just plowing through the platforms like they aren't there.
Boss invincibility glitch
A very convenient trick which allows me to reduce the majority of bosses to paste in mere seconds.
How it works: most bosses spawn projectile objects of some kind to attack. Normally, when you hit them (either by jumping on them or hitting them with a projectile, like any normal enemy), the projectiles are "killed" just like other enemies, complete with dropping a pickup. However, for some reason, if the boss is invincible and its projectile is it, the projectile won't die but the boss will take 1 damage instead, bypassing the boss' own invincibility.
Thus, most bossfights come down to waiting until the boss fires a projectile, then whaling at it with dozens of hits at once, typically near-instantly killing the boss. The only real exception to this is Wormmon (2-3), as he is the only boss with no projectile attack whatsoever.
Boss fade-out (new)
Imagine you are TASing your typical boss fight in your typical game. You find a way to defeat it one frame faster. Typically, in most games, this results in an one frame gain across the whole run. Some other games have these annoying things called frame rules, where the one frame gain you had on the bossfight gets negated later on.
In this game? You actually end up losing one frame, in most cases. There are some interesting mechanics around the waiting time until the level fade-out screen happens at the end of a boss battle.
When a boss reaches -1 health and "dies", the following happens, in sequence:
- Wait until global timer modulo 16 reaches 0 (16-frame rule). When it does, it will spawn one random drop.
- Wait until 21 drops have occurred (320 frames). At this point, the boss graphic disappears.
- The boss timer will start counting up every frame.
- Once the boss timer hits 127, fade-out starts and the game proceeds to the next level.
This combination of timer requirements means that there are some interesting ways to optimize the final time that don't involve simply beating the boss faster.
- The 16-frame rule puts obvious limits on when the boss may be defeated, in the interest of saving time.
- The boss timer counting up is an interesting factor, because the timer is not reset before counting up. In fact, the timer stored here is what is also used for boss invincibility. In normal situations, this would be 0 on boss death, and would count up normally - but the boss invincibility glitch circumvents this, and killing a boss during invincibility will freeze the value until it starts counting up.
In short, it is faster to kill a boss on the last frame of invincibility, just before the timer resets and the boss becomes vulnerable again. This can potentially save up to 51 frames on the fade-out time.
Global timer and frame rules (new)
The game has a global timer at RAM address 0x1D84, which simply counts up by one during every non-lag frame. It persists during stage transitions, but not during resets, which makes it impossible to compare with the timer itself from the previous run.
The global timer affects various things:
- Item drops from enemies are fully timer-dependent. The item dropped is decided by timer modulo 23.
- The digivolution animation follows a 4-frame rule.
- Wormmon and Etemon's invincibility timer follows a 4-frame rule (only increments every 4th frame)
- Other invincibility timers follow a 4-frame rule before resetting. As a consequence, regular boss invinciblity lasts between 48 and 51 frames depending on what frame the boss is hit on.
- Boss dialogue follows an 8-frame rule (a new letter displays every 8th frame).
- Boss drops after defeating a boss follow an 16-frame rule (drops one item every 16th frame, for 21 items in total)
Slope optimization (new)
There's a very subtle issue when walking up a slope where sometimes movement stops for one frame on a slope. For the old run I never noticed this issue - this time, I took better care at spotting these issues, saving frames here and there. In the improvement chart, "minor optimizations" often include frames saved thanks to this.
Corner clip (new)
Doing a pixel-perfect precise jump into a corner wall, it's possible to clip a few pixels into the corner. This process can be repeated to enter incrementally deeper into a corner, eventually resulting in either the player getting stuck or falling through the wall. This takes some time to set up, so usually isn't that useful, but it did open up for instance a significant time-saving clip in World 2-1.
Stage-by-stage improvement chart
|Start 1-1||+273||+273||Added BIOS time|
|1-1 Stage||-11||+262||Did a different strategy on the first vertical section (which did not actually save time). Frames are saved by slope optimization and better drops in the vertical section|
|Start 1-2||-198||+64||Fixed ROM|
|1-2 Stage||-41||+23||29 frames saved in the first vertical section by avoiding taking damage. 12 frames saved by assorted small optimizations|
|1-2 Boss||-22||+1||7 frames saved by an overall faster strategy, and 15 frames saved by optimizing fade-out time rule|
|Start 1-3||-198||-197||Fixed ROM|
|1-3 Stage||-6||-203||Minor optimizations|
|1-3 Boss||-53||-256||53 frames saved by optimizing fade-out time rule and boss 16-frame rule|
|Start 2-1||-198||-454||Fixed ROM|
|2-1 Stage||-381||-835||372 frames saved from large vertical section skip. 2 frames saved from bat manipulation. 7 frames saved from small optimizations|
|Start 2-2||-198||-1033||Fixed ROM|
|2-2 Stage||-7||-1040||3 frames saved from small optimizations. The remaining 4 frames are gained by the boss dialogue 8-frame rule|
|2-2 Boss||-2||-1042||2 frames gained by optimizing fade-out time rule|
|Start 2-3||-198||-1240||Fixed ROM|
|2-3 Stage||-5||-1245||Total of 7 frames saved by minor optimizations, 2 frames lost by boss dialogue frame rule|
|2-3 Boss||-40||-1285||40 frames saved by the use of pause buffering to reduce boss invincibility time|
|Start 3-1||-198||-1483||Fixed ROM|
|3-1 Stage||-21||-1504||Most time saved from a better path through the final vertical section|
|Start 3-2||-198||-1702||Fixed ROM|
|3-2 Stage||-11||-1713||Minor optimizations, better downwards vertical section, and saving a frame rule on the boss entrance|
|3-2 Boss||-19||-1732||Optimized fade-out time rule|
|Start 3-3||-198||-1930||Fixed ROM|
|3-3 Stage||-11||-1941||Better upwards section near the end of the stage|
|3-3 Boss||-15||-1956||Optimized fade-out time rule|
|Start 4-1||-198||-2154||Fixed ROM|
|4-1 Stage||-12||-2166||Minor optimizations|
|Start 4-2||-198||-2364||Fixed ROM|
|4-2 Stage||-7||-2371||Minor optimizations, helped by frame rule|
|4-2 Boss||-47||-2418||Optimized fade-out time rule|
|Start 4-3||-198||-2616||Fixed ROM|
|4-3 Stage||-19||-2635||Minor optimizations, also improved on frame rule|
|4-3 Boss||-36||-2671||Optimized fade-out time rule|
|Start 5-1||-198||-2869||Fixed ROM|
|5-1 Stage||-3||-2872||Minor optimizations|
|Start 5-2||-198||-3070||Fixed ROM|
|5-2 Stage||-14||-3084||Better clip into the wall|
|5-2 Boss||-71||-3153||Faster strategy, making use of the fact that the ball held by the boss is hittable; also optimized fade-out time rule|
|Start 5-3||-198||-3351||Fixed ROM|
|5-3 Stage||-11||-3362||New route clipping through the cave at the start, and a few minor optimizations|
|5-3 Boss||-5||-3367||Different boss strategy where the boss is spawned earlier (saving 16 frames), at the cost of a slower start of the boss battle itself (costing 11 frames in total) - net gain of 5 frames|
|Start 6-1||-198||-3565||Fixed ROM|
|6-1 Stage||-5||-3570||Minor optimizations|
|Start 6-2||-198||-3768||Fixed ROM|
|6-2 Stage||-123||-3891||New clip through a vertical section, and small improvements in the other vertical section|
|6-2 Boss||-3||-3894||Optimized fade-out time rule|
|Start 6-3||-198||-4092||Fixed ROM|
|6-3 Stage||-42||-4134||Optimized camera positioning for faster transitioning between horizontal and vertical segments|
|6-3 Boss||-66||-4200||New boss strategy, taking damage instead of transforming, and optimized fade-out time rule|
|Start 7-1||-198||-4398||Fixed ROM|
|7-1 Stage||-28||-4426||Most frames saved by a better final vertical section|
|Start 7-2||-198||-4624||Fixed ROM|
|7-2 Stage||-191||-4815||New vertical clip through the S-shaped section|
|7-2 Boss||-42||-4857||Optimized fade-out time rule|
|Start 7-3||-198||-5055||Fixed ROM|
|7-3 Stage||-2||-5057||Minor camera optimizations|
|7-3 Boss||-5||-5062||Altered strategy, optimized fade-out time rule|
|Start 8-1||-198||-5260||Fixed ROM|
|8-1 Stage||-12||-5272||Improvements in the vertical sections|
|Start 8-2||-198||-5470||Fixed ROM|
|8-2 Stage||-1||-5471||1 frame saved by dialogue frame rule|
|8-2 Boss||-14||-5485||Optimized fade-out time rule|
|Start 8-3||-198||-5683||Fixed ROM|
|8-3 Stage||-2||-5685||Minor camera improvements|
|8-3 Boss||-17||-5702||Boss pattern improved by camera shifting, as well as general better optimization|
As extra supplementary content, I ripped the game's soundtrack. If you liked what you heard throughout the movie, you can access the original soundtrack playlist of Digimon Sapphire here.
Thanks for reading and/or watching!
Spikestuff: Publishing to publish!