Submission #6850: hellagels & klmz's GBA Castlevania: Harmony of Dissonance in 04:58.46

(Link to video)
Game Boy Advance
baseline
VBA-rr v23.6
17826
59.7275005696058
39738
Unknown
Castlevania - Harmony of Dissonance (U) [!].gba
Submitted by hellagels on 8/22/2020 12:50:22 PM
Submission Comments
This is a 10251 frame, or 2:51.63, improvement over the current movie.

Goal

  • Aims for good ending
  • Abuses programming errors
  • Uses warps
  • Manipulates luck

Glitches

Talos Skip
Do a low jump, jump attack, and then get hit by Talos, Juste could dive into the floor and then wrong warp happens, skipping the whole section of being chased by Talos. There are several possible destinations of this wrong warp. Whether the glitch happens and the destination of wrong warp depend on sub-X and sub-Y. The side effect of the skip is that the camera stop moving. Objects, including candles, doors, and enemies, outside the camera do not get loaded.
In-event State
When an event is triggered, Juste get invincible and cannot freely move, and the game does not load other rooms even if Juste move outside the current room, except the case that the name of the region is showed on the screen. If a room is loaded while in event, taking advantage of region name display, the in-event flag would be still set, but Juste could do some move now. In such a state, the game will not load other rooms when being outside the current room, which make memory corruption possible, and you...
  • can slide and use the sub weapon of fist, but both these two will immediately suspend;
  • cannot double jump, high jump, or float by using floating boots;
  • can dive kick.
Memory Corruption
Do not try this glitch on real cartridge, it will turn your cartridge into garbage if the demo version flag is set. 0200008C-0200030B is a bitfield that records which rooms are visited. According to whether you are in Castle A or Castle B, the coordinate of the room to the map, the coordinate of Juste to the room, the game continually set the corresponding bit's value to 1. By moving extremely far outside the current room, which require in-event state, memory corruption happens if the corresponding bit is outside the bitfield interval.

Details of minimap RAM area

Please read this section after watching the embedded encode, it gives a good visualization to the RAM map.
The minimap is separated into left half and right half. Each chunk records a 32*40*2 (=2560 blocks/ bits) rectangle region, a double word is used for the whole horizontal line of Castle A in that rectangle region, the next double word is for the same line in Castle B, lines are records from top to bottom. 0200008C-020001CB is for left half and 020001CC-0200030B is for right half. RAM outside the minimap RAM area is also divided into chunks of same size. We can move to prior chunk by crossing the top and left border of the current chunk, and move to next chunk by crossing the bottom and right border.
Double words with address's last digit 4 or C can only be corrupted from Castle A, and those with address's last digit 0 or 8 can only be corrupted from Castle B. Luckily those flags need to be set in this run is in Castle A.

Route comments

We delay 21 frames at the dialog with Maxim, for manipulating luck. The rain animation calls up the RNG routine around 80 times per frame, much more frequent than other routines. We need two big heart drops and massive critical hits to reduce one round of multiple hit in Pike Master fight, and suitable RNG is very rare.
After skipping Talos, we pick axe. Axe is necessary for the whip launch which warp to Castle B, and it speeds up the Pike Master fight.
In the memory corruption section, we inevitably corrupt save room ID. Bit 0 of 0200030C, where save room ID is stored, is for whether the room is in Castle A or B, bits 1-7 are for X position of the room, bits 8-13 are for Y position of the room, bits 14-15 are unused. A illegal save room ID will cause the game freeze when loading the state. In the encode we only list one block (the game over trigger) not to visit, in fact there are lots of blocks need to avoid, those are mainly pointers. Corrupting those pointers can cause soft lock/freeze or reset. 0200043D's value is 0 in normal state and 1 underwater, we set this value to 3 so that the Y speed reduces to 1/8 of normal state, just low enough to set Maxim, Dracula, and Dracula Wraith fights' ending flags in a row.
After good ending's flag and the three bosses' flags are set, save and reset the game and head to final boss room. (Normally Maxim's Ring is required for good ending.) Since all three boss fights' flags are set, no boss fight happens there, and the movie ends after dialog.

Lua Scripts

Map Viewer

https://drive.google.com/file/d/1sTynqxAoef3Fjd8mXYyeESTSSXTKVGX_/view?usp=sharing
You need Lua-GD to run this script. Lua-GD can be download here. Decompress it and you get some .dll files, place them at the same directory of VBA-rr.exe.

Memory Corruption Visualizer

Userfiles/Info/65650966036547896
Address display is very awkward because there is no enough room for that.

History Runs

There are two finished runs that we did not submit here.

Any% in 5:30.38 by hellagels & klmz:

We did not know how to skip Talos until a week after this run is upload to Niconico and Bilibili. We did some multiple hits without sub weapon. Still worth watching.

Any% in 5:00.16 by hellagels & klmz:

Pretty much the same as this submission, the only difference is that we did not manipulated luck by taking advantage of the rain animation.

GoddessMaria: Castlevania... Judgement? Nah, just judging.
GoddessMaria: Quite an unexpected find, hellagels and klmz! This new improvement made the previous run, which was already impressive, even more impressive. The audience response, for the most part, was also positive to this. Good work, you two!
Accepting as an improvement to the previous movie.
feos: Pub.
Last Edited by adelikat on 11/5/2023 3:38 PM
Page History Latest diff List referrers