Posts for nfroggy

Joined: 4/23/2025
Posts: 1
I just stumbled across this video, excellent work on the TAS! You did a great job showing off a lot of the game's quirks and how they can be abused to beat it faster. I did a relocatable disassembly of this game a few years ago so I'm fairly familiar with how it works. From reading your description (great work BTW), I found a few things that could be clarified or corrected, and a few points you missed that might be useful if anyone feels like doing another TAS of this game in the future. Damage boosting: You don't need to jump to minimize a damage boost. You can also do it when you're running by pressing up or down along with the direction you're heading. This works because pressing up/down sets Lucia's Y speed variable even when she's not on a ladder. The knockback code then sees that Lucia's Y speed variable is nonzero, assumes she's jumping/on a ladder, and sets her Y speed to 0x40 to bump her down. Because Lucia's already on the ground, she immediately leaves the "knocked back" state. Another quirk with damage boosting is that the "knocked back" state is actually the same as the "jumping, air controls locked" state used for when Lucia jumps with level 0/1 boots, except Lucia's Y speed gets set to -0x80, the same as jumping with level 3 boots. This means that if you're holding A while you get hit, you go much higher since the "hold A = jump higher" code still runs. If you don't have level 3 boots, this lets you go higher than you otherwise could. I saw you did this in your TAS, I just thought I'd mention it since it's not in the writeup. Flashscroll: This works because Flash doesn't do 240 damage all at once, it does 10 damage per frame using a timer set to 24 frames. The flash timer is decremented in the NMI handler (probably because the same code is used for the palette cycling effect in the ending), but the NMI handler is written so the timer is only decremented when there isn't any tilemap data to be written to VRAM. Scrolling involves writing tilemap data to VRAM so it extends the amount of time that Flash is active. Flashsword: This works because of how Flash is implemented. The enemy damage code doesn't check whether Flash is the active weapon, it basically just says "if the flash timer is active, the enemy gets damaged by whatever the current weapon's damage amount is". This means that if you use Flash and then switch to the sword before the flash timer runs out, you're now doing 100 damage per frame to each onscreen enemy (assuming a level 2 sword). Potions: The way potions spawn works a bit differently to how you describe. There's a frame counter that gets incremented each gameplay frame (including when the game is paused, so it's easy to manipulate). When you kill an enemy, its object gets replaced with an explosion object. When the explosion object's timer runs out, it checks the frame counter to decide whether to spawn a potion. There are 16 frames of (red potion, purple potion, blue potion, orange potion) repeated 4 times, then 240 frames of no item drops. Bunyon: This requires some explanation of how the enemy spawning works. The game engine can handle up to 23 objects. Object 0 is always Lucia, and 1-8 are for her weapons/projectiles, so that leaves 14 object slots available for enemies. Besides Stage 10, the game will only allow 1 boss object to randomly spawn per frame, in slot 9. If slot 9 is taken, that means that no boss objects will spawn. This means that maximizing the number of Bunyons for Stage 14 requires keeping slot 9 free. This gets more complicated because of the Bunyon split mechanic. I would recommend reading the code yourself, but the main takeaway is that the last Bunyon in the table for a given size will replace the Bunyon split object. This means that this sequence will cause slot 9 to be free for another Bunyon to spawn: 1. Bunyon spawns in slot 9. 2. Lucia kills the Bunyon. 3. Bunyon object is replaced with a Bunyon split object. 4. Bunyon split object spawns 4 medium Bunyons. One of the medium Bunyons on the right side will replace the split object in slot 9. 5. Lucia kills the medium Bunyon or scrolls it off the screen. Slot 9 is now free. If you figure out the correct pattern to kill the maximum number of Bunyons (you need to kill 30 to beat the level, killing big, medium, or small Bunyons contributes to this count) while minimizing the number that get overwritten or scrolled off the screen, you should be able to reproduce hisatoki's boss fight. Note that you don't want multiple Bunyons at the same big/medium/small "split phase" at the same time because the split code doesn't check if an object slot is already populated before writing the split Bunyons to it, so you'll be overwriting objects from the other Bunyon.