The maker of Robotnik's Revenge and Sonic 1 and 2 [Moderator Edit: Do not link to websites that host copyright protected materials (e.g. game ROMs)] has done it again: a delicious new hack named Sonic VR that sees Sonic go through 40 mini-levels that range in difficulty from trivially easy to maddeningly difficult -- all without rings, shields, power-ups or time limit. Each level is a mini-puzzle, and requires knowledge of the physics of Sonic games in order to win. With TAS abilities, Sonic blasts through these 40 levels, sometimes reaching the finish line before you can see what is going on.
Note: This is a TAS of a hack of a hack of Sonic 2; an IPS patch for the hack is available here.
Warning: If you haven't played the hack yet, I suggest you try it before watching the TAS.
Game objectives
- Emulator used: Gens 11b + S2Camhack + SolidityViewer + (partial)HitboxDisplay + LUA HUD for Genesis Sonic games
- Aims for fastest time (includes "No death" and "No damage")
- Abuses programming errors in the game (a lot)
Comments
This hack really sounds best with Kega Fusion; the sound from Gens doesn't really do it justice. Try playing it on Kega; the music is so good you won't be sorry.
There aren't any places to zip; I managed to get into a few walls, ceilings and floors but none led to anything -- in most cases, Sonic just fell to his death, while in others, he zipped a few tiles and then fell to his death.
Level009.bin -- Casino Nightmare -- is a nightmare to TAS. I managed to do that clean exit by sheer luck my first time through. Luckly, I was recording and saved it, as I have been completely unable to reproduce it since: I wasted over 3000 rerecords on that last room alone while trying to do it again, after reaching the room 1 second earlier.
The hack is not very hex friendly -- there is random in-level lag, possibly due to either the ROM banking, the music, the background swapping or all of them. If you compensate for this lag (a boring chore), it will synch.
I could not find a timer of any sort -- so comparing level times (or even listing them) depends on an arbitrarily-defined starting and ending point for the level. I used the following Lua script to determine the length of any level:
local level_started = false local first_frame = -1
local boringmodes = {0,4,0x10,0x14,0x18,0x1c,0x20,0x24,0x28} function disable_hud() local mode = memory.readbyte(0xfff600) for _,m in ipairs(boringmodes) do if mode == m then return true end end if mode == 0x8c then local time = memory.readlong(0xfffe22) return not (time > 0 and time < 5) end return false end gens.registerafter(function() if level_started then if memory.readbyte(0xFFFFB000) == 0 and level_started ~= false then print(string.format("|level%03d|MODULE ERROR for `frames`: Missing parameter value for amount00:00.00|", level, movie.framecount() - first_frame)) level_started = false end else if disable_hud() ~= true and memory.readbyte(0xFFFFB000) ~= 0 then if level == -1 then print("! Timetable\n||Level||Time||") end level = level + 1 level_started = true first_frame = movie.framecount() end end end)
The script times the length from the time you can first control Sonic to the time when you lose control of Sonic; while it might be slightly better to time the exact moment you touch the giant ring, you can still die up until the point I chose to base time on.
Running this script alongside the movie leads to the following times:
Timetable
Level | Time |
---|---|
level000 | 00:02.68s |
level001 | 00:04.05s |
level002 | 00:05.78s |
level003 | 00:04.58s |
level004 | 00:00.53s |
level005 | 00:04.25s |
level006 | 00:04.13s |
level007 | 00:20.83s |
level008 | 00:02.93s |
level009 | 00:09.37s |
level010 | 00:04.05s |
level011 | 00:03.35s |
level012 | 00:04.00s |
level013 | 00:02.60s |
level014 | 00:07.63s |
level015 | 00:01.68s |
level016 | 00:01.88s |
level017 | 00:02.30s |
level018 | 00:08.77s |
level019 | 00:03.38s |
level020 | 00:05.83s |
level021 | 00:05.98s |
level022 | 00:10.10s |
level023 | 00:05.82s |
level024 | 00:06.47s |
level025 | 00:12.38s |
level026 | 00:06.68s |
level027 | 00:08.98s |
level028 | 00:03.82s |
level029 | 00:08.53s |
level030 | 00:05.03s |
level031 | 00:04.35s |
level032 | 00:24.28s |
level033 | 00:02.43s |
level034 | 00:09.98s |
level035 | 00:08.52s |
level036 | 00:16.97s |
level037 | 00:05.13s |
level038 | 00:06.75s |
level039 | 00:28.42s |
Total | 04:45.27 |
From which it follows that level loading times, as well as the menus, take up 03:07.45.
Other comments
Thanks to Nitsuja and Upthorn for making the camera hack/solidity viewer, and thanks to ColinC10 for the hack. Thanks also goes for Sonic Retro and the Sonic Scene for making such hacks possible. Also, thanks to Noob Irdoh for suggesting pressing buttons early on in the menu screens.
Mukki: Judging...
Mukki: In these submissions both the run and the hack are to be judged. While most commented that the run itself was well made, the overwhelming majority of those that commented on the hack itself responded negatively. The problems cited were that the visual style was distracting and that the levels design did not make for a good TAS. My own opinion of this was a 'meh'; the music was great, but I am sympathetic to the problems outlined by other users (though I don't hold this opinion as strongly as the no voters), mainly I disliked that this hack took the large and non-linear levels that make Sonic TASes interesting and replaced them with the opposite. Either way, the response to this run falls short of the standard of approval required for a hack on this site. Therefore I am rejecting this submission.