(Link to video)
This is mostly just a port of the previous TAS to mGBA, with all of the platforming sequences remaining unchanged. However, there are a few differences.
First, we use the soft reset trick at the beginning of the game to skip the intro. More importantly, due to the manner in RNG in this game works, the boss fights in each of Casino Paradise, Ice Mountain, and Angel Island have to be redone.
Due to bad RNG, I lose roughly roughly .2 seconds in the first of those stages, and .15 in the next stage (more precise to be added later). However, I manipulate a significantly better pattern for the Metal Sonic fight, and save over half a second there. These values are all given based on the IGT, by the way.
Although the total time of this movie is 3 seconds longer, this is mostly due to the increased framerate of VBA. If we discount the opening portions of both movies (which gets rid of the GBA BIOS animation on mGBA, and the lack of reset on VBA), it should be fairly straightforward to see that this is the shorter movie (despite the 3-4 frames of additional lag picked up on each level due to more accurate emulation).
There is probably still room for improvement. One thing I did not incorporate is the 4 frame improvement to Casino Paradise 1 given in the game topic thread, due to the fact that it didn't actually end up saving time due to waiting for RNG for the Casino Paradise 2 boss.
LevelMukkimeChange
Neo Green Hill 10:12:670:12:670:00:00
Neo Green Hill 20:29:150:29:150:00:00
Secret Base 10:19:030:19:030:00:00
Secret Base 20:32:020:32:020:00:00
Casino Paradise 10:13:950:13:950:00:00
Casino Paradise 10:34:250:34:42+0:00:17
Ice Mountain 10:10:430:10:430:00:00
Ice Mountain 20:42:370:42:50+0:00:13
Angel Island 10:13:580:13:580:00:00
Angel Island 20:36:530:36:00-0:00:53
That's it for changes; it appears that I lose about .15 seconds on the final stage, but this is actually copied identically from the previous TAS and appears to be due to clock desync between the emulators

Fog: Judging.
Fog: It's nice to see this was able to be ported to a more accurate emulator in mGBA, and still save time compared to the previous submission.
Accepting as an improvement to the previous publication.
Fog: Replaced movie file with a file with a small improvement to IGT.
fsvgm777: Processing.

TASVideoAgent
They/Them
Moderator
Joined: 8/3/2004
Posts: 14776
Location: 127.0.0.1
This topic is for the purpose of discussing #5492: Mukki & ruadath's GBA Sonic Advance in 10:49.73
Skilled player (1703)
Joined: 9/17/2009
Posts: 4952
Location: ̶C̶a̶n̶a̶d̶a̶ "Kanatah"
Although the total time of this movie is 3 seconds longer, this is mostly due to the increased framerate of VBA. If we discount the opening portions of both movies (which gets rid of the GBA BIOS animation on mGBA, and the lack of reset on VBA), it should be fairly straightforward to see that this is the shorter movie (despite the 3-4 frames of additional lag picked up on each level due to more accurate emulation).
For convenience, can you please make a table of sorts of the improvements?
Active player (250)
Joined: 12/13/2016
Posts: 352
Sorry, I've been a little bit busy with some things so I apologize for the delay in getting the table up. I also might replace the movie with a version that achieves the same real time value but reduces in-game time by performing RNG manipulations before the level timer begins rather than in the middle of the level.
Active player (250)
Joined: 12/13/2016
Posts: 352
Previously mentioned improvement is here Same real time, but minor improvement to IGT. It should be noted that unlike previous Sonic runs, this movie prioritizes real time over IGT; it would not be very difficult to reduce the IGT further by waiting at the start of each of the RNG levels for some long amount of time to get perfect RNG, but I don't think that would prove very interesting. Hence the time loss on certain stages. In any case, it shouldn't matter, since this movie beats the previous one in terms of IGT as well (even if you do count the clock desync in the final stage against this run).
Dashjump
He/Him
Experienced player (517)
Joined: 8/18/2012
Posts: 82
Just an enquiry, not trying to flame, but:
ruadath wrote:
but this is actually copied identically from the previous TAS and appears to be due to clock desync between the emulators
If the bulk of this TAS is copied directly from Mukki's input, wouldn't it basically make him the main author of this run? If so, I think he deserves to be at least co-authored in the title. The low rerecord count also seems to suggest that minimal work was done to optimise every level. Sorry, I'm just genuinely curious as a similar issue was raised by a few staff members in the Sonic Advance 2 chaos emeralds submission.
Active player (250)
Joined: 12/13/2016
Posts: 352
Sure, I don't mind (just changed the submission). TASvideos seems to be pretty wildly inconsistent about how authorship works for these kinds of movies; I've seen runs that are just a few frame improvements be credited entirely to the new author, so wasn't sure what to do. It doesn't really bother me either way. The main point of the submission was to get the run ported to mGBA since the original one doesn't run on console (at least not without waiting for 15 seconds on the main menu). This submission fixes that, and also makes minor improvements.
Active player (250)
Joined: 12/13/2016
Posts: 352
Fog, not sure if you did this, but since I didn't see it mentioned in the submission notes, could/did you replace the file with the IGT improvement listed a few posts earlier? Thanks.
Post subject: Movie published
TASVideoAgent
They/Them
Moderator
Joined: 8/3/2004
Posts: 14776
Location: 127.0.0.1
This movie has been published. The posts before this message apply to the submission, and posts after this message apply to the published movie. ---- [3414] GBA Sonic Advance by Mukki & ruadath in 10:49.73
Joined: 5/14/2007
Posts: 525
Location: Pisces-Cetus filament
ruadath wrote:
it would not be very difficult to reduce the IGT further by waiting at the start of each of the RNG levels for some long amount of time to get perfect RNG, but I don't think that would prove very interesting. Hence the time loss on certain stages.
What do you mean by "long amount of time"? I ask because the levels start automatically after about two seconds if you don't press any button, so I assume that manipulating a favorable RNG within one second is realistic. I think aiming for in-game time is important in this game, like in the great majority of Sonic games. There is a reason all the TASes of the Sonic Advance series aim for in-game time.
Dashjump wrote:
If the bulk of this TAS is copied directly from Mukki's input, wouldn't it basically make him the main author of this run? If so, I think he deserves to be at least co-authored in the title. The low rerecord count also seems to suggest that minimal work was done to optimise every level.
Yeah, not including Mukki as an author from the start was quite bold, to say it politely.
AzumaK wrote: I swear my 1 year old daughter's favorite TASVideo is your R4MI run :3 xxNKxx wrote: ok thanks handsome feos :D Help improving TASVideos!
Joined: 4/10/2018
Posts: 4
Location: Quebec, Canada
Link to video Console-verified using Game Boy Interface. A lag frame was inserted at frame 24890.
Site Admin, Skilled player (1234)
Joined: 4/17/2010
Posts: 11251
Location: RU
Thanks for posting :)
Warning: When making decisions, I try to collect as much data as possible before actually deciding. I try to abstract away and see the principles behind real world events and people's opinions. I try to generalize them and turn into something clear and reusable. I hate depending on unpredictable and having to make lottery guesses. Any problem can be solved by systems thinking and acting.
Site Admin, Skilled player (1234)
Joined: 4/17/2010
Posts: 11251
Location: RU
I tried applying Bisqwit's camhack to this game, but this movie desyncs. Download test.lua
Language: lua

while true do offX = mainmemory.read_s16_le(0x5B96) offY = mainmemory.read_s16_le(0x5B98) camX = mainmemory.read_s16_le(0x59D0) camY = mainmemory.read_s16_le(0x59D2) mainmemory.write_s16_le(0x59D0, camX+offX-128) mainmemory.write_s16_le(0x59D2, camY+offY-80) emu.frameadvance() end
With VBA-Nest it's possible to hook lua functions to memory writes and executes, but I couldn't figure what registers hold what, and what the PC is when camera values are being written. Otherwise you can do things like this:
Language: lua

event.onmemorywrite(function() offY = mainmemory.read_s16_le(0x5B98) camY = mainmemory.read_s16_le(0x59D2) emu.setregister("R7", camY+offY-80) end, 0x030059D0)
It just kinda doesn't work...
Warning: When making decisions, I try to collect as much data as possible before actually deciding. I try to abstract away and see the principles behind real world events and people's opinions. I try to generalize them and turn into something clear and reusable. I hate depending on unpredictable and having to make lottery guesses. Any problem can be solved by systems thinking and acting.
upthorn
He/Him
Active player, Emulator Coder (387)
Joined: 3/24/2006
Posts: 1802
Does it still desync if you make a savestate, run the camhack code, render, and then load the savestate without updating the display?
How fleeting are all human passions compared with the massive continuity of ducks.
Site Admin, Skilled player (1234)
Joined: 4/17/2010
Posts: 11251
Location: RU
I tried implementing this and even if I force frameskips in hawk's code for those "invisible" frames, I couldn't make it usable. Based on this draft by Dacicus and Masterjun, you have to advance 2 frames in order to see your hacked camera, then load a state and call emu.frameadvance() again to let the emu continue. And even after hacking hawk a bit, it's really not ready for this setup yet. For posterity: https://pastebin.com/79pVQzAq https://pastebin.com/fUVspZyc Nevermind, it mostly works. Just slowly. https://github.com/TASVideos/BizHawk/pull/1725 And with the updated script I made it blazing fast! Download sonicadvance_camhack_bizhawk.lua
Language: lua

local offX, offY, camX, camY local addr_offX = 0x5B96 local addr_offY = 0x5B98 local addr_camX = 0x59D0 local addr_camY = 0x59D2 while true do client.invisibleemulation(true) local memorystate = memorysavestate.savecorestate() offX = mainmemory.read_u16_le(addr_offX) offY = mainmemory.read_u16_le(addr_offY) camX = mainmemory.read_u16_le(addr_camX) camY = mainmemory.read_u16_le(addr_camY) Xval = camX + offX - 128 Yval = camY + offY - 80 mainmemory.write_u16_le(addr_camX, Xval) mainmemory.write_u16_le(addr_camY, Yval) client.seekframe(emu.framecount()+1) client.invisibleemulation(false) client.seekframe(emu.framecount()+1) client.invisibleemulation(true) memorysavestate.loadcorestate(memorystate) memorysavestate.removestate(memorystate) -- client.invisibleemulation(false) emu.frameadvance() end
Warning: When making decisions, I try to collect as much data as possible before actually deciding. I try to abstract away and see the principles behind real world events and people's opinions. I try to generalize them and turn into something clear and reusable. I hate depending on unpredictable and having to make lottery guesses. Any problem can be solved by systems thinking and acting.
Site Admin, Skilled player (1234)
Joined: 4/17/2010
Posts: 11251
Location: RU
Warning: When making decisions, I try to collect as much data as possible before actually deciding. I try to abstract away and see the principles behind real world events and people's opinions. I try to generalize them and turn into something clear and reusable. I hate depending on unpredictable and having to make lottery guesses. Any problem can be solved by systems thinking and acting.