Joined: 5/2/2015
Posts: 128
A cool glitch was found about 9 months ago by GameGlitchGuy, which allows you to skip forward at least several screens into the next stage. I know Scumtron looked into it a little bit this morning, but interested to see if anyone else can figure out how to skip more screens. https://www.youtube.com/watch?v=uDatPwn2bfM I skip forward 6 screens in that clip but the most I have skipped is 9 screens into stage 2.
Joined: 10/28/2013
Posts: 130
Location: United States
Hey, that's pretty cool! And nice that it can be used (with some difficulty) in a RTA as well.
Player (153)
Joined: 5/1/2006
Posts: 150
So, well-timed pausing/un-pausing during the transition from the end-level elevator screen to the elevator/score-tally screen can keep the game in the proper state to increment the room variable more than it's supposed to. That much was mostly obvious, I guess. I wasn't able to get it to skip more than 5 rooms (same as shown in WhiteHat's youtube clip linked above) in either FCEUX and BizHawk 1.13.0. Frame-by-frame inputs, per-poll inputs with Lua*, and just trying to mash Start with a controller at any emulation speed all saw the same results. Freezing address $62A when it's 0x40 during the screen transition does keep it skipping along all the way to the ending spaceship screen ($16 = 0x4D), so hopefully there is way to do the same with pausing. In lieu of trying to articulate my half-assed debugging, I'll just paste this here:
$0005#TransitionRelevant#b0 set during NMI after room loaded, reset after room++
$0016#Room#
$00BD#someFlag#branch out of polling-purgatory if non-zero
$00FB#Input#
$04BC#FrameCounter#
$0523#Difficulty#
$05FB#Music_setting#
$06AB#ElevatorThingy#No more skips if >= 0x41
$072A#StartPressed#
$072B#Paused#
$0734#AlsoInput#
*this dumb game is constantly polling input, sometimes as much as 70 times per frame, and It seemed like being able to have distinct start presses on adjacent frames would be helpful at one point. -------------------------------------------------------------------------------------------------------------------------------------------- Edit: Got more skips, but only with poll-based input. Could not reproduce with frame-based input. Just when I was convinced that a pause and an un-pause had to have an NMI routine between them for a skip to happen, putting a pair on the same frame (3397 here) worked out—and with fewer total start presses too. This script works with #4971: Randil & Alyosha's NES Cybernoid: The Fighting Machine in 04:35.78
Language: Lua

poll=0;i=1;frame=emu.framecount() pauses={ 3390,1 ,3396,2 ,3397,1 ,3397,3 ,3406,1 ,3418,1 ,3435,1 ,3444,1 ,3451,1 ,3452,1 } function pollAdvance() poll=poll+1 if (frame ~= emu.framecount()) then poll=1 end frame=emu.framecount() if (frame == pauses[i]) and (poll == pauses[i+1]) then memory.writebyte(0xFB,0x10) i=i+2 if (i >= #pauses) then i=1 end end --print(poll,frame) end memory.registerexec(0x830C,1,pollAdvance)
-------------------------------------------------------------------------------------------------------------------------------------------- Another Edit: Floatious told me that simply pressing start every 7 frames got it to skip pretty far, so I started with that, adjusted for when it failed, and got it to skip to the end of the game. This is probably still fairly sub-optimal.
Joined: 10/28/2013
Posts: 130
Location: United States
Was reminded of this glitch today, and surprised to see that there's still no published TAS making use of it. Would this potentially obsolete the current record-holder for this game, or is it deemed too akin to things like the SMB3 insta-win via DPCM?