Posts for MUGG

Editor, Experienced Forum User, Published Author, Expert player (2392)
Joined: 5/15/2007
Posts: 3966
Location: Germany
Shrek 2 on Gamecube Current best RTA You can have up to 4 human controlled players. However, at 3 players or less, you could switch characters at any time which cancels the character's current attack/move which speeds things up a lot. There are some sequence breaks, possibly also ones not shown in the video but idk. EDIT: Saw that this game exists on other consoles as well (XBox and PS2), but I don't know about differences.
Editor, Experienced Forum User, Published Author, Expert player (2392)
Joined: 5/15/2007
Posts: 3966
Location: Germany
You can probably use a luascript to draw the framecounter somewhere else on the screen. But I can't make a script for you, since I don't use FCEUX.
Editor, Experienced Forum User, Published Author, Expert player (2392)
Joined: 5/15/2007
Posts: 3966
Location: Germany
Are you saying I will be able to TAS The Summoning or Al-Qadim in Bizhawk? Will it run Mice Maze? I remember that game not being possible to run in JPC.
Editor, Experienced Forum User, Published Author, Expert player (2392)
Joined: 5/15/2007
Posts: 3966
Location: Germany
Nice! Can you only do this 1 time per stage, or multiple times?
Theoretically you can do this as often as you want but since the bug is rare you can only do it a few times. The bug can theoretically be used to remove walls such as in 3-3 or at the pipe section in 4-2 to move on quicker. But I'm not bringing fireflower into 3-3 so I can't create lag to make the bug happen - even if I did, shooting might not create any lag. And in 4-2 the location where the bug has to happen is not convenient - I would probably have to idle or lag more than the time I could save back. So for now I'm just aiming for the bug "anywhere" in 4-2 to remove the falling platform at the end.
EDIT: The script came out with a 0 lag, 7 idle frames scenario overnight. That's pretty good!
This saves 35 frames. It reaches the goal at framecount 87396 whereas the no-bug version reaches it at 87431. I might try a few other places to maybe come out with even less idle frames but other than that I'm content with this outcome. EDIT: I envisioned a new idea, removing the wall at the very end of 4-2. Mario can actually make the jump to the other side. This would save 66 frames at most compared to the no-bug version. However, it requires some heavy delays (idling and lag), by having an extra fireball from a snake fly to the right and by shooting before bouncing on the missile, in order to create lag at the specific spot the bug has to happen. This pretty much nullifies all the time that this could have saved back. My script didn't find results overnight here. So all in all, I'm not following this idea further.
Editor, Experienced Forum User, Published Author, Expert player (2392)
Joined: 5/15/2007
Posts: 3966
Location: Germany
By running the above script and also a version that randomly lets go of Right or B, I managed to get 3 results with the bug. They all take about 13 frames of delay (by idling and lag) and finish the level about 25 frames faster than the no-bug version. I'm glad about saving this much time but it needs optimizing. It should be possible to trigger the bug with only 1 or 2 delay frames. In one of the above-mentioned results, I was shooting and the bug happened before the first lag frame even happened - but the 13 lag frames that happened after that were unavoidable. The script currently running looks like this This being the responsible code:
Language: Lua

local waitframes = emu.framecount() +1 tastudio.onbranchload(function() (...) vary3 = math.random(22,45) vary4 = math.random(0,3) vary5 = math.random(0,7) end) (...) if run_test[6] then -- Have Mario on the ground, clear upcoming 200 frames in tastudio -- script will do inputs at set chance -- start this at 86282 local vary1 = math.random(1,80) local vary2 = math.random(1,50) local press_b = true local press_a = false local press_right = true -- star block jump if emu.framecount() >= waitframes + vary4 and emu.framecount() < waitframes + vary4 + 10 then press_a = true else press_a = false end -- ending jump if memory.read_u8(0xFFF3) > 0x83 then press_a = true end -- b kill if emu.framecount() == waitframes + 17 + vary5 then press_b = false end -- random if not press_a then if not (math.random(1,1000) < (980-vary1)) then if emu.framecount() > waitframes + 10 then press_right = false end end if emu.framecount() > waitframes + 17 + vary5 then if math.random(1,1000) > (980-vary2) and (emu.framecount() > waitframes + 16 + vary3) then press_b = false end end end tastudio.submitinputchange(emu.framecount(), "A", press_a) tastudio.submitinputchange(emu.framecount(), "B", press_b) tastudio.submitinputchange(emu.framecount(), "Right", press_right) if emu.framecount() > waitframes + 155 or emu.lagcount() > 407 then savestate.loadslot(5) end tastudio.applyinputchanges() end
If anyone wants to help with this, it would be much appreciated. EDIT: The script came out with a 0 lag, 7 idle frames scenario overnight. That's pretty good!
Editor, Experienced Forum User, Published Author, Expert player (2392)
Joined: 5/15/2007
Posts: 3966
Location: Germany
It looks like only the first instance of tastudio.submitinputchange() is handled and any more instances of it in the same frame are ignored. Playing on Bizhawk 2.9.1 Gambatte core.
Language: Lua

tastudio.submitinputchange(emu.framecount(), "B", true) tastudio.submitinputchange(emu.framecount(), "B", false) tastudio.applyinputchanges()
This will keep pressing B. I expected that it would let go of B. I can easily work around it but I'm just saying. Also this. event.on_bus_read()seems broken in Bizhawk 2.8 and 2.9.1. I'm not sure about the exact version it started and I don't know if it is fixed in 2.10.
Editor, Experienced Forum User, Published Author, Expert player (2392)
Joined: 5/15/2007
Posts: 3966
Location: Germany
I managed to get the bug by running a modified version of the linked script which repeatedly runs forward and jumps after delaying for increasing amounts of frames, while in a laggy situation. The laggy situation wasted a lot of time but due to the missing falling platform in the end, it reaches the goal at exactly the same frame as the optimized no-bug version. I'm convinced I can get it much faster eventually and save time with it. I'll keep trying. Link to video Modified luascript You have to change booleans at the beginning of the script. Currently it's set to have Mario delay, then start running/shooting, then jump. Upcoming input in the next ~200 frames in TAStudio has to be cleared and Mario has to be on the ground, obviously. The script running can be observed in the middle of the video. You will want to add client.pause() in line 86 or 223 so the script stops when the bug happens. This kind of test could be done in many places of the level. Of course it would be best to get the bug with the least amount of lag possible but it's already frustratingly hard to get the bug at all since it's very rare.
Editor, Experienced Forum User, Published Author, Expert player (2392)
Joined: 5/15/2007
Posts: 3966
Location: Germany
Improved script https://pastebin.com/55Leqbrp It will visually show on the screen when a bug frame has occured. The script will print information to the console if PRINT_INFO is set to true in line 5. The script recognized a scroll bug mid level in 4-1 and the one I got at the end of 1-3 and there have been no false alarms. The 4-1 one (bk2)
   FRAME 420  Cy:35112  **LAG**

Execu $0040 (VBLANK INTERRUPT)   cycle: 0
Execu $2258 (READ $FFEA)         cycle: 52
Execu $0050 (TIMER INTERRUPT)    cycle: 9408

   FRAME 421  Cy:35110

Execu $0040 (VBLANK INTERRUPT)   cycle: 0
Execu $2258 (READ $FFEA)         cycle: 52
Write $FFEA (01)                 cycle: 2084
Execu $0050 (TIMER INTERRUPT)    cycle: 7062

   FRAME 422  Cy:35114  **LAG**

Execu $0040 (VBLANK INTERRUPT)   cycle: 0
Execu $2258 (READ $FFEA)         cycle: 52
Execu $2254 (READ $FFE9)         cycle: 66
Write $FFE9 (5F)                 cycle: 90
Write $FFEA (02)                 cycle: 1872
Execu $0050 (TIMER INTERRUPT)    cycle: 4720

   FRAME 423  Cy:35112

Execu $0040 (VBLANK INTERRUPT)   cycle: 0
Execu $2258 (READ $FFEA)         cycle: 52
Write $FFEA (03)                 cycle: 1246
Write $FFEA (00)                 cycle: 1276
Execu $0050 (TIMER INTERRUPT)    cycle: 2374

   FRAME 424  Cy:35112

Execu $0040 (VBLANK INTERRUPT)   cycle: 0
Execu $2258 (READ $FFEA)         cycle: 52
Execu $0050 (TIMER INTERRUPT)    cycle: 770
Execu $0050 (TIMER INTERRUPT)    cycle: 32800

   FRAME 425  Cy:35110  **LAG**

Execu $0040 (VBLANK INTERRUPT)   cycle: 0
Execu $2258 (READ $FFEA)         cycle: 52
Execu $0050 (TIMER INTERRUPT)    cycle: 30454

   FRAME 426  Cy:35114

Execu $0040 (VBLANK INTERRUPT)   cycle: 0
Execu $2258 (READ $FFEA)         cycle: 52
Execu $0050 (TIMER INTERRUPT)    cycle: 28114

   FRAME 427  Cy:35114

Execu $0040 (VBLANK INTERRUPT)   cycle: 0
Execu $2258 (READ $FFEA)         cycle: 52
Execu $0050 (TIMER INTERRUPT)    cycle: 25768

   FRAME 428  Cy:35110  **LAG**

Execu $0040 (VBLANK INTERRUPT)   cycle: 0
Execu $2258 (READ $FFEA)         cycle: 52
Execu $0050 (TIMER INTERRUPT)    cycle: 23422

   FRAME 429  Cy:35110

Execu $0040 (VBLANK INTERRUPT)   cycle: 0
Execu $2258 (READ $FFEA)         cycle: 52
Write $FFEA (01)                 cycle: 2702
Execu $0050 (TIMER INTERRUPT)    cycle: 21080

   FRAME 430  Cy:35112

Execu $0040 (VBLANK INTERRUPT)   cycle: 0
Execu $2258 (READ $FFEA)         cycle: 52
Execu $2254 (READ $FFE9)         cycle: 66
Write $FFE9 (40)                 cycle: 92
Write $FFEA (02)                 cycle: 1874
Execu $0050 (TIMER INTERRUPT)    cycle: 18738
Write $FFEA (03)                 cycle: 20664
Write $FFEA (00)                 cycle: 20694

   FRAME 431  Cy:35114  **LAG**

Execu $0040 (VBLANK INTERRUPT)   cycle: 0
Execu $2258 (READ $FFEA)         cycle: 52
Execu $0050 (TIMER INTERRUPT)    cycle: 16392

   FRAME 432  Cy:35110

Execu $0040 (VBLANK INTERRUPT)   cycle: 0
Execu $2258 (READ $FFEA)         cycle: 52
Execu $0050 (TIMER INTERRUPT)    cycle: 14048

   FRAME 433  Cy:35114

Execu $0040 (VBLANK INTERRUPT)   cycle: 0
Execu $2258 (READ $FFEA)         cycle: 52
Execu $0050 (TIMER INTERRUPT)    cycle: 11704

   FRAME 434  Cy:35110

Execu $0040 (VBLANK INTERRUPT)   cycle: 0
Execu $2258 (READ $FFEA)         cycle: 52
Execu $0050 (TIMER INTERRUPT)    cycle: 9360

   FRAME 435  Cy:35114  **LAG**

Execu $0040 (VBLANK INTERRUPT)   cycle: 0
Execu $2258 (READ $FFEA)         cycle: 52
Execu $0050 (TIMER INTERRUPT)    cycle: 7016

   FRAME 436  Cy:35110

Execu $0040 (VBLANK INTERRUPT)   cycle: 0
Execu $2258 (READ $FFEA)         cycle: 52
Execu $0050 (TIMER INTERRUPT)    cycle: 4670

   FRAME 437  Cy:35106  **LAG**

Execu $0040 (VBLANK INTERRUPT)   cycle: 0
Execu $2258 (READ $FFEA)         cycle: 52
Execu $0050 (TIMER INTERRUPT)    cycle: 2330
Execu $0050 (TIMER INTERRUPT)    cycle: 35098

   FRAME 438  Cy:35120

Execu $0040 (VBLANK INTERRUPT)   cycle: 92
Execu $2258 (READ $FFEA)         cycle: 144
Write $FFEA (01)                 cycle: 3592
Execu $0050 (TIMER INTERRUPT)    cycle: 32758

   FRAME 439  Cy:35110

Execu $0040 (VBLANK INTERRUPT)   cycle: 0
Execu $2258 (READ $FFEA)         cycle: 52
Execu $2254 (READ $FFE9)         cycle: 66
Write $FFE9 (41)                 cycle: 90
Write $FFEA (02)                 cycle: 1872
Execu $0050 (TIMER INTERRUPT)    cycle: 30408
Write $FFEA (03)                 cycle: 32686
Write $FFEA (00)                 cycle: 32716

   FRAME 440  Cy:35116  **LAG**

Execu $0040 (VBLANK INTERRUPT)   cycle: 0
Execu $2258 (READ $FFEA)         cycle: 52
Execu $0050 (TIMER INTERRUPT)    cycle: 28064

   FRAME 441  Cy:35112

Execu $0040 (VBLANK INTERRUPT)   cycle: 0
Execu $2258 (READ $FFEA)         cycle: 52
Execu $0050 (TIMER INTERRUPT)    cycle: 25716

   FRAME 442  Cy:35108

Execu $0040 (VBLANK INTERRUPT)   cycle: 0
Execu $2258 (READ $FFEA)         cycle: 52
Execu $0050 (TIMER INTERRUPT)    cycle: 23374

   FRAME 443  Cy:35114  **LAG**

Execu $0040 (VBLANK INTERRUPT)   cycle: 0
Execu $2258 (READ $FFEA)         cycle: 52
Execu $0050 (TIMER INTERRUPT)    cycle: 21032

   FRAME 444  Cy:35118

Execu $0040 (VBLANK INTERRUPT)   cycle: 0
Execu $2258 (READ $FFEA)         cycle: 52
Execu $0050 (TIMER INTERRUPT)    cycle: 18686

   FRAME 445  Cy:35106

Execu $0040 (VBLANK INTERRUPT)   cycle: 0
Execu $2258 (READ $FFEA)         cycle: 52
Write $FFEA (01)                 cycle: 7104
Execu $0050 (TIMER INTERRUPT)    cycle: 16336

   FRAME 446  Cy:35110

Execu $0040 (VBLANK INTERRUPT)   cycle: 0
Execu $2258 (READ $FFEA)         cycle: 52
Execu $2254 (READ $FFE9)         cycle: 66
Write $FFE9 (42)                 cycle: 90
Write $FFEA (02)                 cycle: 1872
Execu $0050 (TIMER INTERRUPT)    cycle: 14000
Write $FFEA (03)                 cycle: 15926
Write $FFEA (00)                 cycle: 15956

   FRAME 447  Cy:35114  **LAG**

Execu $0040 (VBLANK INTERRUPT)   cycle: 0
Execu $2258 (READ $FFEA)         cycle: 52
Execu $0050 (TIMER INTERRUPT)    cycle: 11656

   FRAME 448  Cy:35118

Execu $0040 (VBLANK INTERRUPT)   cycle: 0
Execu $2258 (READ $FFEA)         cycle: 52
Execu $0050 (TIMER INTERRUPT)    cycle: 9310

   FRAME 449  Cy:35104

Execu $0040 (VBLANK INTERRUPT)   cycle: 0
Execu $2258 (READ $FFEA)         cycle: 52
Execu $0050 (TIMER INTERRUPT)    cycle: 6962

   FRAME 450  Cy:35114  **LAG**

Execu $0040 (VBLANK INTERRUPT)   cycle: 0
Execu $2258 (READ $FFEA)         cycle: 52
Execu $0050 (TIMER INTERRUPT)    cycle: 4626

   FRAME 451  Cy:35102

Execu $0040 (VBLANK INTERRUPT)   cycle: 0
Execu $2258 (READ $FFEA)         cycle: 52
Execu $0050 (TIMER INTERRUPT)    cycle: 2278
Execu $0050 (TIMER INTERRUPT)    cycle: 35046

   FRAME 452  Cy:35120

Execu $0040 (VBLANK INTERRUPT)   cycle: 44
Execu $2258 (READ $FFEA)         cycle: 96
Execu $0050 (TIMER INTERRUPT)    cycle: 32714

   FRAME 453  Cy:35114

Execu $0040 (VBLANK INTERRUPT)   cycle: 0
Execu $2258 (READ $FFEA)         cycle: 52
Write $FFEA (01)                 cycle: 1088
Execu $0050 (TIMER INTERRUPT)    cycle: 30362
Write $FFEA (03)                 cycle: 32430
Write $FFEA (00)                 cycle: 32460

   FRAME 454  Cy:35110

Execu $0040 (VBLANK INTERRUPT)   cycle: 0
Execu $2258 (READ $FFEA)         cycle: 52
Execu $0050 (TIMER INTERRUPT)    cycle: 28016

   FRAME 455  Cy:35112

Execu $0040 (VBLANK INTERRUPT)   cycle: 0
Execu $2258 (READ $FFEA)         cycle: 52
Execu $0050 (TIMER INTERRUPT)    cycle: 25674

   FRAME 456  Cy:35114

Execu $0040 (VBLANK INTERRUPT)   cycle: 0
Execu $2258 (READ $FFEA)         cycle: 52
Execu $0050 (TIMER INTERRUPT)    cycle: 23330

   FRAME 457  Cy:35114

Execu $0040 (VBLANK INTERRUPT)   cycle: 0
Execu $2258 (READ $FFEA)         cycle: 52
Execu $0050 (TIMER INTERRUPT)    cycle: 20984

   FRAME 458  Cy:35110

Execu $0040 (VBLANK INTERRUPT)   cycle: 0
Execu $2258 (READ $FFEA)         cycle: 52
Execu $0050 (TIMER INTERRUPT)    cycle: 18638
Write $FFEA (01)                 cycle: 22812

   FRAME 459  Cy:35112

Execu $0040 (VBLANK INTERRUPT)   cycle: 0
Execu $2258 (READ $FFEA)         cycle: 52
Execu $2254 (READ $FFE9)         cycle: 66
Write $FFE9 (43)                 cycle: 90
Write $FFEA (02)                 cycle: 1872
Execu $0050 (TIMER INTERRUPT)    cycle: 16296
Write $FFEA (03)                 cycle: 18346
Write $FFEA (00)                 cycle: 18376


new row rendered on 422, 430, 439, 446 (no bug frames)
451 has lag and two timer interrupts
    the first one at cycle 2330 ("no bug frame" would have a write to $ffea here)
453 usual structure but without write to $ffe9
459 next row rendered
The 1-3 one (bk2)
   FRAME 57985  Cy:35112

Execu $0040 (VBLANK INTERRUPT)   cycle: 0
Execu $2258 (READ $FFEA)         cycle: 52
Execu $0050 (TIMER INTERRUPT)    cycle: 19360

   FRAME 57986  Cy:35112

Execu $0040 (VBLANK INTERRUPT)   cycle: 0
Execu $2258 (READ $FFEA)         cycle: 52
Write $FFEA (01)                 cycle: 2616
Execu $0050 (TIMER INTERRUPT)    cycle: 17016

   FRAME 57987  Cy:35112

Execu $0040 (VBLANK INTERRUPT)   cycle: 0
Execu $2258 (READ $FFEA)         cycle: 52
Execu $2254 (READ $FFE9)         cycle: 66
Write $FFE9 (48)                 cycle: 90
Write $FFEA (02)                 cycle: 1872
Write $FFEA (03)                 cycle: 3084
Write $FFEA (00)                 cycle: 3114
Execu $0050 (TIMER INTERRUPT)    cycle: 14670

   FRAME 57988  Cy:35112

Execu $0040 (VBLANK INTERRUPT)   cycle: 0
Execu $2258 (READ $FFEA)         cycle: 52
Execu $0050 (TIMER INTERRUPT)    cycle: 12328

   FRAME 57989  Cy:35112

Execu $0040 (VBLANK INTERRUPT)   cycle: 0
Execu $2258 (READ $FFEA)         cycle: 52
Execu $0050 (TIMER INTERRUPT)    cycle: 9982

   FRAME 57990  Cy:35112

Execu $0040 (VBLANK INTERRUPT)   cycle: 0
Execu $2258 (READ $FFEA)         cycle: 52
Execu $0050 (TIMER INTERRUPT)    cycle: 7638

   FRAME 57991  Cy:35112

Execu $0040 (VBLANK INTERRUPT)   cycle: 0
Execu $2258 (READ $FFEA)         cycle: 52
Write $FFEA (01)                 cycle: 2558
Execu $0050 (TIMER INTERRUPT)    cycle: 5298

   FRAME 57992  Cy:35112

Execu $0040 (VBLANK INTERRUPT)   cycle: 0
Execu $2258 (READ $FFEA)         cycle: 52
Execu $2254 (READ $FFE9)         cycle: 66
Write $FFE9 (49)                 cycle: 90
Write $FFEA (02)                 cycle: 1872
Execu $0050 (TIMER INTERRUPT)    cycle: 2954
Write $FFEA (03)                 cycle: 9832
Write $FFEA (00)                 cycle: 9862

   FRAME 57993  Cy:35112

Execu $0040 (VBLANK INTERRUPT)   cycle: 0
Execu $2258 (READ $FFEA)         cycle: 52
Execu $0050 (TIMER INTERRUPT)    cycle: 798
Execu $0050 (TIMER INTERRUPT)    cycle: 33376

   FRAME 57994  Cy:35112

Execu $0040 (VBLANK INTERRUPT)   cycle: 0
Execu $2258 (READ $FFEA)         cycle: 52
Execu $0050 (TIMER INTERRUPT)    cycle: 31032

   FRAME 57995  Cy:35112

Execu $0040 (VBLANK INTERRUPT)   cycle: 0
Execu $2258 (READ $FFEA)         cycle: 52
Execu $0050 (TIMER INTERRUPT)    cycle: 28688

   FRAME 57996  Cy:35112

Execu $0040 (VBLANK INTERRUPT)   cycle: 0
Execu $2258 (READ $FFEA)         cycle: 52
Execu $0050 (TIMER INTERRUPT)    cycle: 26344

   FRAME 57997  Cy:35112

Execu $0040 (VBLANK INTERRUPT)   cycle: 0
Execu $2258 (READ $FFEA)         cycle: 52
Write $FFEA (01)                 cycle: 2580
Execu $0050 (TIMER INTERRUPT)    cycle: 23998

   FRAME 57998  Cy:35112

Execu $0040 (VBLANK INTERRUPT)   cycle: 0
Execu $2258 (READ $FFEA)         cycle: 52
Execu $2254 (READ $FFE9)         cycle: 66
Write $FFE9 (4A)                 cycle: 90
Write $FFEA (02)                 cycle: 1872
Write $FFEA (03)                 cycle: 3084
Write $FFEA (00)                 cycle: 3114
Execu $0050 (TIMER INTERRUPT)    cycle: 21656

   FRAME 57999  Cy:35112

Execu $0040 (VBLANK INTERRUPT)   cycle: 0
Execu $2258 (READ $FFEA)         cycle: 52
Execu $0050 (TIMER INTERRUPT)    cycle: 19310

   FRAME 58000  Cy:35112

Execu $0040 (VBLANK INTERRUPT)   cycle: 0
Execu $2258 (READ $FFEA)         cycle: 52
Execu $0050 (TIMER INTERRUPT)    cycle: 16970

   FRAME 58001  Cy:35112

Execu $0040 (VBLANK INTERRUPT)   cycle: 0
Execu $2258 (READ $FFEA)         cycle: 52
Execu $0050 (TIMER INTERRUPT)    cycle: 14624

   FRAME 58002  Cy:35112

Execu $0040 (VBLANK INTERRUPT)   cycle: 0
Execu $2258 (READ $FFEA)         cycle: 52
Write $FFEA (01)                 cycle: 2990
Execu $0050 (TIMER INTERRUPT)    cycle: 12280

   FRAME 58003  Cy:35112

Execu $0040 (VBLANK INTERRUPT)   cycle: 0
Execu $2258 (READ $FFEA)         cycle: 52
Execu $2254 (READ $FFE9)         cycle: 66
Write $FFE9 (4B)                 cycle: 90
Write $FFEA (02)                 cycle: 1872
Write $FFEA (03)                 cycle: 3084
Write $FFEA (00)                 cycle: 3114
Execu $0050 (TIMER INTERRUPT)    cycle: 9936

   FRAME 58004  Cy:35112

Execu $0040 (VBLANK INTERRUPT)   cycle: 0
Execu $2258 (READ $FFEA)         cycle: 52
Execu $0050 (TIMER INTERRUPT)    cycle: 7592

   FRAME 58005  Cy:35112

Execu $0040 (VBLANK INTERRUPT)   cycle: 0
Execu $2258 (READ $FFEA)         cycle: 52
Execu $0050 (TIMER INTERRUPT)    cycle: 5248

   FRAME 58006  Cy:35110

Execu $0040 (VBLANK INTERRUPT)   cycle: 0
Execu $2258 (READ $FFEA)         cycle: 52
Execu $0050 (TIMER INTERRUPT)    cycle: 2904

   FRAME 58007  Cy:35118

Execu $0040 (VBLANK INTERRUPT)   cycle: 0
Execu $2258 (READ $FFEA)         cycle: 52
Execu $0050 (TIMER INTERRUPT)    cycle: 798
Execu $0050 (TIMER INTERRUPT)    cycle: 33330

   FRAME 58008  Cy:35108

Execu $0040 (VBLANK INTERRUPT)   cycle: 0
Execu $2258 (READ $FFEA)         cycle: 52
Write $FFEA (01)                 cycle: 1712
Execu $0050 (TIMER INTERRUPT)    cycle: 30980
Write $FFEA (03)                 cycle: 33006
Write $FFEA (00)                 cycle: 33036


new row rendered on f987, f992, f998, f003
f007 has two timer interrupts (but no lag)
f008 usual structure but without write to $ffe9
I'm not going to try it in 3-3 because I don't have fireflower before the vertical wall section and there is no lag. Unless I bring fireflower beforehand, the bug is probably not possible. So if anything I'm trying it in 4-2. Since it took quite some time to get the bug just once in testing with tons of lag in 4-1, I think the chances of getting it in the TAS are too slim. It might happen by chance though.
Editor, Experienced Forum User, Published Author, Expert player (2392)
Joined: 5/15/2007
Posts: 3966
Location: Germany
New script, unfinished but it's functional. It can be used with both game versions. https://pastebin.com/63CdSW6w It will show how many cycles have passed since the beginning of a frame, for any instance where $FFEA is written to with 0x00, 0x01, 0x02 or 0x03. I will finish it and research the scroll bug with it, hopefully leading to some information.
Editor, Experienced Forum User, Published Author, Expert player (2392)
Joined: 5/15/2007
Posts: 3966
Location: Germany
Using this short script with Super Mario Land
memory.usememorydomain("System Bus")

event.on_bus_read(function(addr, val, flags)
	print("TEST")
end, 0xFFEA)

while true do	
	emu.frameadvance()
end
On Bizhawk 2.3.1, it prints every frame but on Bizhawk 2.8 and Bizhawk 2.9.1, nothing gets printed. Am I missing something or is it broken?
Editor, Experienced Forum User, Published Author, Expert player (2392)
Joined: 5/15/2007
Posts: 3966
Location: Germany
I don't think it was a syntax error, exactly. It's just that the old script used the table.getn function, which was deprecated in Lua 5.1 and removed in Lua 5.2. BizHawk currently uses Lua 5.4. You fixed it correctly by changing it to use the # operator.
I was talking about lines like
if MouseX>280 and MouseX<290>130 and MouseY<138 then
that I had to correct to
if MouseX>280 and MouseX<290 and MouseY>130 and MouseY<138 then
and the code for the arrowUp clickable button was missing altogether. I added onmemoryread and onmemorywrite for no particular reason. Now that I think about it, I'm sure the original script only checked for executed bytes, not reads or writes.
On point (2), the script is looking for the execution of specific addresses, and it would not be surprising for code addresses to be different in different versions of the game. You'll need a separate table of addresses for each different version.
Yes, you are right. I will try to make a new script soon. Thank you. My new hard mode run is currently in 3-2. Theoretically, the scroll bug could save time in some of the later levels, e.g.
  • in 3-3 - if one of the vertical walls could be removed and
  • in 4-2 - if one of the vertical breakable walls could be removed to move on quicker, but regardless of where it happens in the level, it would allow to skip the falling platform at the end of the level.
Editor, Experienced Forum User, Published Author, Expert player (2392)
Joined: 5/15/2007
Posts: 3966
Location: Germany
I'm going to need to understand scroll bug better, in order to attempt it in the later levels. After I discovered my visualisation luascript doesn't run correctly due to syntax errors that have somehow slipped into that post, I tried to fix the script but now it will output information that's different from before (when compared to the screenshot I had posted). When running the "seemingly fixed" script, I noticed the information output is different between v1.0 and v1.1 of the game. V1.0 (Every few frames of running right) V1.1 (Every few frames of running right) Not sure what to make of this. Unfortunately, I'm not very good at this. Help on this would be very appreciated. My goal is a luascript that will do one or more of these things: - Detect when the scroll bug has occured - Visualize with a red vertical line which row has been omitted - For non-bug frames with writes to $FFEA, should show information like how many cycles have passed in that frame and how many cycles it should have been to make the bug frame occur (if that makes sense) Here is the script with syntax errors "seemingly fixed". Here is a movie file with the scroll bug happening.
Editor, Experienced Forum User, Published Author, Expert player (2392)
Joined: 5/15/2007
Posts: 3966
Location: Germany
This looks very interesting. I especially like the explanation video which is very informative. You can tell a ton of effort went into the planning and creation. But I'm not sure if this should be considered a legitimate playthrough of Super Mario Bros. 3. Normally, the player deals with one game, played on a system with controller buttons and the power-on and reset buttons at his disposal. Now here, the player is additionally allowed to swap the game catridge at any time. I don't know. At this point, you might as well change the NES itself between cycles to change how it runs the game. The player being a god could naturally do that. Just open it up and change some connections and wiring, within 0.000001 seconds. I think at this point, things are getting absurd. But I love it.
Editor, Experienced Forum User, Published Author, Expert player (2392)
Joined: 5/15/2007
Posts: 3966
Location: Germany
Got an odd scroll bug while TASing. There was not a single lag frame during the level. The text is shifted to the left one row so it looks like it's related to the previously known scroll bug - which omits a vertical row during the level but here, the vertical row is omitted right at the end of the level. It's not looking to be a timesaver. I changed the level to make the scrollbug not happen and the bonus game would still start at the same framecount.
Editor, Experienced Forum User, Published Author, Expert player (2392)
Joined: 5/15/2007
Posts: 3966
Location: Germany
Thank you for including the results sequence. One more note, the publication text should probably explain that Maniac Mode is Japanese-exclusive. Unfamiliar people might get confused.
Editor, Experienced Forum User, Published Author, Expert player (2392)
Joined: 5/15/2007
Posts: 3966
Location: Germany
Submission Text wrote:
Note: The last input is at the frame 452729. If you add an extra A input at the frame ~522300 which is at the end of the credits, you get the battle results.
If possible it would be great to include the results sequence in the TASvideos encode to show how many kills each character got and how fast you completed each mission. Also the song is so good, it always gives me goosebumps.
Editor, Experienced Forum User, Published Author, Expert player (2392)
Joined: 5/15/2007
Posts: 3966
Location: Germany
I fondly remember this game, although it's been a while. It's the only FE game I played. The run looks to be tightly optimized and well planned. This being maniac difficulty and the execution of some of the strats looks very impressive. I actually watched the entire run from beginning to end, which is not something I do very often nowadays. Well done!
Editor, Experienced Forum User, Published Author, Expert player (2392)
Joined: 5/15/2007
Posts: 3966
Location: Germany
The RTA community simply runs until the first congratulations screen and calls that "Beat the game". https://www.speedrun.com/penguin_wars?h=Beat_the_Game&x=zdnr13x2 I made a run that uses the level select code and reaches the credits. The time is 4:23.66. https://tasvideos.org/UserFiles/Info/638769496191691263 Since it's not a legit category I will not try to improve it or submit it. Some notes: RNG for the first match changes depending how long you wait on the character select screen. The speed at which the balls drop down on you when a match starts can also be manipulated this way on the character select screen. But after that there are no easy ways to manipulate anything. When the opponent tries to push all the balls then I often opted for that to be the match I'm losing whereas when the opponent tries to hold onto the ball and charge, I would try to hit him first and make that a winning match. There doesn't seem to be the one correct way to win matches since every match is slightly different with the speeds at which the balls drop on you and the opponent's behavior which cannot really be manipulated. The opponent's behavior can be slightly affected depending on your positioning and if you are charging your ball, but that's all I found you can do to manipulate luck. I see two possible legit categories for TAS. 1) Play all 40 levels, reach the credits 2) Play the first 4 levels, reach the first congratulations screen (same as RTA community)
Editor, Experienced Forum User, Published Author, Expert player (2392)
Joined: 5/15/2007
Posts: 3966
Location: Germany
The level select cheat allows you to select a level in steps of 4 with 37 being the maximum. I tested it and beating level 37, 38, 39 and 40 will trigger the ending sequence. After an adversary or a bonus stage is beaten you can hold the A button to end the score tallying. If you do two perfect games (10 balls on the enemy side) without losing, you will get a bonus stage. To fastest way to skip it is to lose 1 match on purpose for each opponent. The bonus stage will even appear after level 40. My suggestion for a TAS is to start from level 37 and beat every opponent twice while losing once. This should result in a 3~4 minutes TAS. EDIT: It looks like using a level select is against the rules. So it cannot be submitted unless someone will run all 40 levels (~45 minutes), which I will not be doing.
Editor, Experienced Forum User, Published Author, Expert player (2392)
Joined: 5/15/2007
Posts: 3966
Location: Germany
Known as "King of the Zoo" in Europe. Most sources state that this game continues indefinitely but there is actually an ending sequence that unlocks after winning 40 matches which only very few people know about. Here is a playthrough that unlocks the ending: https://www.youtube.com/watch?v=GE_mdeb8g7I There is also a level cheat but I'm not sure if it allows you to reach the ending quicker. I'm making this post just so this information doesn't get lost.
Editor, Experienced Forum User, Published Author, Expert player (2392)
Joined: 5/15/2007
Posts: 3966
Location: Germany
I started a run, completed 14 out of the 38 mandatory races with the framecount at ~46900 (13 min 05 s). Looks like the run will be around 35 minutes... (oof)
Editor, Experienced Forum User, Published Author, Expert player (2392)
Joined: 5/15/2007
Posts: 3966
Location: Germany
I found that the RNG address ($0379 WRAM) in Dirty Racing (Game Boy) will be set to a different initial value when starting in GB mode, in GBC mode or in GBA mode. The RNG value that can be achieved when starting in GBA mode will give the most favorable outcome. Is it ok to TAS this Game Boy game in GBA mode?
Editor, Experienced Forum User, Published Author, Expert player (2392)
Joined: 5/15/2007
Posts: 3966
Location: Germany
Watch file https://tasvideos.org/UserFiles/Info/638734939047791423 RNG Manip What I know: - RNG can be manipulated mid-race by turning sharp or by spinning in an oil puddle. - The initial RNG values (when starting up the game) will be different between GB mode, GBC mode and GBA mode, with GBA mode having the powerup wall closest to the beginning. Other than that, there is no way to manipulate the powerup positioning prior to entering the first race. When obtaining SUPERSONIC in the first race, you cannot manipulate the positioning of the powerup wall in the next race: Turning sharp doesn't make wheel sounds when you are in SUPERSONIC mode so it doesn't roll the RNG. Spinning in an oil puddle somehow will only roll the RNG in such a way that it won't change positioning of money and the powerup wall in the next race whatsoever. Name Entry Bug At the beginning of the game, when entering your name, if your name is empty or consists only of spaces, the name will be set to "PLAYER ONE". However, if you select ED or ← and press Up + A, it seems the game will set the first character as a special kind of space. If you then select SP and move the selection to the right onto ED and confirm, you will be playing with an empty name. If you complete a race, it will first show a correct screen but the next screen after that will look incorrect, with the points being XX. It seems it's only a bug related to how information is presented. You will still get a gameover if you don't have the most points.
Editor, Experienced Forum User, Published Author, Expert player (2392)
Joined: 5/15/2007
Posts: 3966
Location: Germany
In this top down racing game you compete against 3 CPU cars. You start out in the first town, Steel City (on the Japanese version), where you have to win a race, then you can move to another city on the world map and have to win a number of races there to advance again. 🎵 GameFAQs guide Longplay While racing, there is a certain number of cash pickups (randomized positions), each giving you 5 cash. A vertical wall somewhere on the race track will be blinking, giving you a powerup when touching it:
  • REPAIR (Sets damage to 0)
  • FIRE!
  • POCKET MONEY
  • 2 POINT UP
  • ENEMY STOP (Enemies won't move for about 7 seconds)
  • WARP! (Switch position with another player randomly)
  • NITRO (Refills nitros to maximum)
  • SUPERSONIC !! (Will give you permanent high speed and you are allowed to move through enemy cars without collision)
The wall that will be blinking will have a randomized set of possible positionings. After picking up SUPERSONIC, it seems there will be no more blinking walls after that. The best strategy for TAS is to manipulate the powerup wall as early as possible in the track, then manipulate for SUPERSONIC to end the race as early as possible. After each race:
  • Points will be added to your total for the races in that city, determining if you win or lose after all races are over. 1st player gets 6 points, 2nd player gets 4, 3rd player gets 2, 4th player gets 1
  • You lose 1 grip, if you didn't upgrade grip previous race
  • Spare nitros change to cash (1 nitro = 1 cash)
  • You can buy enhancements in the shop Extra Accel: 50 cash Engine tune: 100 cash Tires: 30 cash Larger nitro: 100 cash (10 more max nitro) Damage repair: Reduces damage to 0, each damage point subtracts 1 cash
Cash should be invested in tires (allows for faster turning?) and in engine (max speed increase?). Extra accel. and repair aren't needed in TAS. The powerup you can get when touching a powerup wall can be somewhat manipulated by different movement. Perhaps it's related to different sounds getting produced. After winning in the cities with a cup icon, a street to a grand prix event is unlocked at the top of the world map. When finishing the game at the hardest difficulty there will be a cutscene. The other difficulty levels will tell you to try a higher difficulty. You start out with
EasyHardExpert
Money000
Damage000
Max Nitro604020
Grip322
Accel.653
Max Veloc.130130130
Grip Turning speed will be the same on all four possible values (0, 1, 2 and 3). However, when turning, you will be somewhat sliding across the floor on lower values. Editing the WRAM address for grip ($00C5) mid-race will not change how grip behaves in that race. Grip is reduced by 1 after a race if you didn't upgrade grip after the previous race. Best worldmap route You only have to complete the towns that have a cup icon. Since Blood Lake only has 1 race and N.Hearn City has 3 races, it is best to go this route: STEEL CITY → JOKER'S TOWN → STEEL CITY → BLOOD LAKE → BAYTON VILLAGE → MAGNUM LAKE → S.HEARN CITY → MAGNUM LAKE → MATLOCK TOWN → E.ASSIZ CITY → TAILSLIDE MOOR → W.ASSIZ CITY → KARTON VALLEY → PARADISE CITY
Editor, Experienced Forum User, Published Author, Expert player (2392)
Joined: 5/15/2007
Posts: 3966
Location: Germany
Insane movie. The special controller allowing any paddle position is... convenient. I've never heard of this controller before.