This run was aimed to complete the game as fast as possible while also getting all 6 Chaos Emeralds for the 100% Ending. We used inputs from the current world record run by Aglar. You may ask, "why 100% of Sonic the Hedgehog?" This game never had a 100% TAS. So, we organised a collab where I am, Zekann, DarkShamilKhan and Rodonic01 are completing to 100%.

Game objectives

  • Emulator used: BizHawk 2.8.0
  • Complete the game as fast as possible
  • Collect all 6 Chaos Emeralds
  • Contains speed/entertainment tradeoffs
  • Aims for in-game time instead of real-time
  • Takes damage to save time
  • Abuses programming errors
  • Genre: Platform

Levels for getting chaos emeralds

  • 1st emerald - Green Hill act 1
  • 2nd emerald - Green Hill act 2
  • 3rd emerald - Marble act 1
  • 4th emerald - Spring Yard act 1
  • 5th emerald - Labyrinth act 2
  • 6th emerald - Star Light act 2
These levels were for getting 50 rings without having to go too far off the pre-planned path and losing a bunch of time.

Stage By Stage Comments

Green Hill act 1: The easiest level for gathering an emerald. This route is not so much different with Aglar's run.
Green Hill act 2: Before I thought that I need use zip like in Aglar's run, but I reconsider that better to gather emeralds in speedy acts or after getting 50 rings - to use zip like in Labyrinth 2.
Green Hill act 3: Not so much different from Aglar's run
Marble act 1: DarkShamilKhan made pre-zip part, I made post-zip part. We got same time same as Aglar.
Marble act 2: I don't know really: on BizHawk at faster route the zip doesn't work, only at slower route.
Marble act 3: Same problem as in act 2
Spring Yard act 1: Zekann improved AKA's route and also got 4th emerald.
Spring Yard act 2: First act where I faced with "BizHawk's wrong calculating" the speed: since beginning of level before 1st bounce ball and on slopes. Also Eandis found a new strat where you can get almost 18 seconds instead 25.
Spring Yard act 3: Not so much different from Aglar's run
Labyrinth act 1: I guess, no difference. Lua HUD can't be used in BizHawk.
Labyrinth act 2: Aglar did before pre-pipeline. After I gathered 50 rings and zipped as usually for 5th emerald.
Labyrinth act 3: Not so much different from Aglar's run
Star Light act 1: I guess, not so much different.
Star Light act 2: The last act of getting a last emerald.
Star Light act 3: No difference with Aglar's run
Scrap Brain act 1: Used Daniel Hall's strat
Scrap Brain act 2: No difference with Aglar's run
Scrap Brain act 3: Used Tee-N-Tee's strat
Final Zone: No difference with Aglar's run

Сrooked mechanic of special stages.

Wrong hitboxes, things which allow to jump instantly. So Rodonic01 has done a great job with completing all 6 special stages.

feos: Claiming for judging.
feos: Accepting as a new branch.

EZGames69: Processing...


TASVideoAgent
They/Them
Moderator
Joined: 8/3/2004
Posts: 15583
Location: 127.0.0.1
EZGames69
He/They
Publisher, Reviewer, Expert player (4460)
Joined: 5/29/2017
Posts: 2762
So because this TAS was done on Bizhawk, is there expected to be no camhack encode?
[14:15] <feos> WinDOES what DOSn't 12:33:44 PM <Mothrayas> "I got an oof with my game!" Mothrayas Today at 12:22: <Colin> thank you for supporting noble causes such as my feet MemoryTAS Today at 11:55 AM: you wouldn't know beauty if it slapped you in the face with a giant fish [Today at 4:51 PM] Mothrayas: although if you like your own tweets that's the online equivalent of sniffing your own farts and probably tells a lot about you as a person MemoryTAS Today at 7:01 PM: But I exert big staff energy honestly lol Samsara Today at 1:20 PM: wouldn't ACE in a real life TAS just stand for Actually Cease Existing
ParadaxeTH
He/Him
Player (149)
Joined: 12/23/2020
Posts: 6
Location: Far Lands
Unfortunately, yes.
Editor, Expert player (2073)
Joined: 6/15/2005
Posts: 3282
Still waiting for the ring attack TAS.
EZGames69 wrote:
So because this TAS was done on Bizhawk, is there expected to be no camhack encode?
The TAS is glitched as usual so you're not really missing anything.
Site Admin, Skilled player (1254)
Joined: 4/17/2010
Posts: 11475
Location: Lake Char­gogg­a­gogg­man­chaugg­a­gogg­chau­bun­a­gung­a­maugg
EZGames69 wrote:
So because this TAS was done on Bizhawk, is there expected to be no camhack encode?
Ported from Gens: Download camhack.lua
Language: lua

-- feos, 2023 -- addresses local addr_base = 0xD000 local addr_mode = 0xD04B local addr_cam1 = 0xF700 local addr_cam3 = 0xFDB8 local addr_cam4 = 0xF616 local addr_time = 0xFE22 -- offsets local offs_flags = 1 local offs_posX = 0x8 local offs_posY = 0xC -- constants local SCREEN_W = 320 local SCREEN_H = 224 local LEVEL_H = 2047 local SCROLLRATE = 16 local FREEZE_SIZE = 16 local MAX_FRAMES = 100 -- aliases local rb = mainmemory.readbyte local rs16 = mainmemory.read_s16_be local rs32 = mainmemory.read_s32_be local ru32 = mainmemory.read_u32_be local ws16 = mainmemory.write_s16_be local ws32 = mainmemory.write_s32_be local wu32 = mainmemory.write_u32_be -- buffers local freezebuffer = {} local memorystate gui.defaultPixelFont("gens") local function CamHack() client.invisibleemulation(false) local x = rs16(addr_base + offs_posX) -- character x position local y = rs16(addr_base + offs_posY) -- character y position local origx = rs16(addr_cam1) -- initial camera x position local origy = rs16(addr_cam1 + 4) -- initial camera y position local xx = math.max(0, x - SCREEN_W / 2) -- desired camera x position local yy = y - SCREEN_H / 2 -- desired camera y position local flags = rb(addr_base + offs_flags) local timer = rs32(addr_time) local deltaX = SCROLLRATE -- if flags && 0x80 ~= 0 if bit.band(flags, 0x80) ~= 0 or rb(0xF7CD) ~= 0 or (x - origx <= SCREEN_W and (y - origy <= 240 -- going downward through level-wraps or (y + LEVEL_H - origy <= SCREEN_H and origy >= LEVEL_H - SCREEN_H) -- going upward through level-wraps or (origy < 0 and (y >= LEVEL_H + origy or y <= origy + SCREEN_H))) or rb(addr_mode) == 0) then return end -- set the camera no more than 640 pixels distant if math.abs(xx - origx) > SCREEN_W * 2 then origx = math.max(0, xx - SCREEN_W * 2) end -- and always above target, because Sonic doesn't like externally forced upward scrolling if origy > yy then origy = yy - SCREEN_H * 2 else origy = math.max(yy - SCREEN_H * 2, origy) end if xx < origx then deltaX = -deltaX end local numframes = 1 + math.floor(math.max( math.abs(xx - origx) / SCROLLRATE, math.abs(yy - origy) / SCROLLRATE)) if numframes > MAX_FRAMES then numframes = MAX_FRAMES end memorystate = memorysavestate.savecorestate() for i = 1, FREEZE_SIZE do freezebuffer[i] = ru32(addr_base + i*4) end client.invisibleemulation(true) for i = 0, MAX_FRAMES * 2 do if i > numframes then break end if origy < -SCROLLRATE then origy = -SCROLLRATE end ws16(addr_cam1, origx) ws16(addr_cam1 + 4, origy) ws32(addr_cam3, origx) ws32(addr_cam4, origy) ws32(addr_cam4 + 4, origx) ws32(addr_time, timer) for i = 1, FREEZE_SIZE do wu32(addr_base + i*4, freezebuffer[i]) end client.seekframe(emu.framecount() + 1) if numframes < MAX_FRAMES and emu.islagged() then numframes = numframes + 1 else -- the game doesn't like being forced to scroll up if yy > origy then origy = origy + math.min(SCROLLRATE, yy - origy) end if xx ~= origx then if math.abs(xx - origx) <= SCROLLRATE then origx = xx else origx = origx + deltaX end end end end --[[-- gui.pixelText(10, 100, string.format( " pos: %4d x %4d\n".. "orig: %4d | %4d x %4d | %4d\n".. " cam: %4d %4d %4d\n".. " xx: %4d | %4d yy: %4d | %4d", x, y, origx, rs16(addr_cam1), origy, rs16(addr_cam1+4), rs32(addr_cam3), rs32(addr_cam4), rs32(addr_cam4+4), xx, math.max(0, x - SCREEN_W / 2), yy, y - SCREEN_H / 2)) --]]-- client.invisibleemulation(false) client.seekframe(emu.framecount() + 1) client.invisibleemulation(true) memorysavestate.loadcorestate(memorystate) memorysavestate.removestate(memorystate) --client.invisibleemulation(false) end while true do CamHack() emu.frameadvance() gui.clearGraphics() end
Mirror: User movie #638560487359337260
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.
EZGames69
He/They
Publisher, Reviewer, Expert player (4460)
Joined: 5/29/2017
Posts: 2762
There are a few notes to mention about this lua, the first one is don't expect the audio to be perfect during the moments the camhack has to work. They end up getting crusty, so it would be best to replace the audio using the audio from the non camhack dump, they would be identical. The other thing to note is this lua doesn't have the ability to put sprites on top of other graphical layers, so that players can see here sonic is if he's ever behind walls. However there's an easy way to cheat this by dumping the camhack footage with every layer disabled except for sprites, which the steps look like this (the color code for the pink is $ff00ff): final output: here is the avisynth code I used to layer these:
Language: avisynth

main = avisource("blah camhack.avi").ConvertToRGB32 sprites = avisource("blah sprites.avi").ConvertToRGB32 maskclip = ColorKeyMask(sprites, $ff00ff, 1) final = Overlay(main, sprites, mask=maskclip.ShowAlpha, mode="blend", opacity=1)
In the future this might become obsolete once there's a way to force the sprite layer on top, but in the case where that's not possible, this should work as an alternative.
[14:15] <feos> WinDOES what DOSn't 12:33:44 PM <Mothrayas> "I got an oof with my game!" Mothrayas Today at 12:22: <Colin> thank you for supporting noble causes such as my feet MemoryTAS Today at 11:55 AM: you wouldn't know beauty if it slapped you in the face with a giant fish [Today at 4:51 PM] Mothrayas: although if you like your own tweets that's the online equivalent of sniffing your own farts and probably tells a lot about you as a person MemoryTAS Today at 7:01 PM: But I exert big staff energy honestly lol Samsara Today at 1:20 PM: wouldn't ACE in a real life TAS just stand for Actually Cease Existing
Post subject: Movie published
TASVideoAgent
They/Them
Moderator
Joined: 8/3/2004
Posts: 15583
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. ---- [5121] Genesis Sonic the Hedgehog "100%" by ParadaxeTH, DarkShamilKhan, Zekann, Aglar & rodonic01 in 16:42.17