Sonic 3 & Knuckles "newgame+ ring-attack" by Evil_3D, TheYogWog & kaan55



Sonic point of view encode

Tails point of view encode

Camhack + Rings locations encode


Introduction

The thing about ring attack TASes is, in a traditional TAS, the idea is to go from beginning to end of a level or game as quickly as possible - but, in a ring attack, it is to go from one ring or set of rings to the next, in such a way that results in the overall level or game completion with the most rings in the shortest time.
Hopefully that gives some perspective on the extraordinary amount of work that ring attack TASes require.
And not to diminish other forms of TASes, which already in their own right require tremendous effort and expertise. It was in fact one such TAS - a traditional Sonic TAS, by SprintGod - which caught my eye in 2012. This was my introduction to TASes as a thing, and it blew my mind and inspired me to get into the TASing scene.
Around that time, new discoveries by the likes of MarzoJr, Nitsuja, Aglar, and others, of game-breaking bugs were resulting in Sonic 3 & Knuckles TASes that were faster and more impressive than ever before. However, there was a growing concensus within the community that such runs, for all their glory, deprived the viewer of the kind of intensive gameplay that makes TASes so attractive in the first place - for which Sonic games of old are ideal, by their fast-paced nature.
Yet, there seemed to be no solution to this dilemma given TASvideos' rightfully strict guidelines governing submissions. And yet again, in spite of this, in 2013 I began work on my own personal vision of what that solution could look like. And hence in 2014 I submitted my Knuckles ring attack TAS of S3K. It was well-received, luckily, and I said then that I hoped that one day a TAS just exactly like this one might eventually emerge.
And now it has.
And it's all thanks to the enterprising Evil_3D, who founded the project, and his inventive co-author Kaan55, who joined some time later, after offering several new strategies to get even more rings; whereas my own participation was primarily planning-related.
I would like to think that my TAS had the same impact on Evil_3D and Kaan55 as SprintGod's had on me. It was a pleasure working with them and getting to know them, albeit in the limited capacity that I did.
And I give them credit for staying true to my original vision of what a ring attack TAS could, and I daresay, should, be. (Could or should be, at least, for now... I can't deny that it would be fun to see Super or Hyper characters zooming around, collecting rings someday, now that this current milestone has been reached.)
I hope that you the viewer, find as much enjoyment as I do in watching this run, and as I and others on the forums did, in watching its development.

-The Yogwog


Emulator and Tools used

  • This movie starts from a savestate: Gens-11b Savestate to replay this movie (You can use marzojr & aglar newgame+ savestates too, both works)
  • Gens Re-Recording 11b + Camera hack + Solidity and Terrain dysplay
  • Sonic TAS tools
  • Rings locations script by Selicre
  • Rings unloaded notifier script by WST
  • Sonic Zone 0: This site contains very useful informations about classic Sonic games, it was used as the main fount of information of the levels and did the route planning process less tedious.

Movie objectives

  • Aims for fastest in-game time
  • Collects every possible rings, monitor rings and giant rings
  • Takes damage to save time
  • Abuses deaths to save time (all of them by Tails, poor foxy)
  • Abuses programming errors and glitches
  • Manipulates luck and enemy positions
  • Uses 2 Players
  • Starts from a savestate
  • Contains speed entertaiment/trade-offs
  • Disallow hyper transformation
    • This is for make the gameplay more natural, show an never seen before use of the elemental shields and less nocive for the audience, seeing the levels has 2~5 mins of duration the abuse of hyper flash can really damage people suseptible to seizures, and the invulnerability music can ruins the levels atmosphere (and can make you sick, really)

Timetable

LevelIG-TimeNormal RingsMonitor RingsGiant RingsTotalTASed by
Angel Island ACT 11:36'0717370/7100/2343Evil_3D
Angel Island ACT 24:13'2019540/4100/2335kaan55
Hydrocity ACT 12:24'57440140/14100/2680Evil_3D, kaan55
Hydrocity ACT 22:24'0225990/9100/2449kaan55
Marble Garden ACT 13:15'42506130/13400/81036Evil_3D, kaan55
Marble Garden ACT 23:37'1135390/9150/3593kaan55
Carnival Night ACT 12:44'03312260/26300/6872kaan55
Carnival Night ACT 23:13'12261270/27250/5781Evil_3D
Ice Cap ACT 12:18'4718930/3100/2319Evil_3D, kaan55
Ice Cap ACT 22:57'4146250/5150/3662kaan55
Launch Base ACT 13:35'35294150/15150/3594Evil_3D
Launch Base ACT 24:19'27409160/16250/5819kaan55
Mushroom Hill ACT 12:26'27360110/11250/5720kaan55
Mushroom Hill ACT 22:12'3733880/8300/6718kaan55
Flying Battery ACT 12:46'5831730/3100/2447Evil_3D
Flying Battery ACT 22:48'4226020/2100/2380kaan55
Sandopolis ACT 15:10'17383220/22350/7953Evil_3D, kaan55
Sandopolis ACT 22:36'4428480/8200/4564kaan55
Lava Reef ACT 13:01'23331170/17150/3651Evil_3D
Lava Reef ACT 2 + Boss Zone4:48'0733360/6250/5643kaan55, Evil_3D
Hidden Palace Zone0:33'183340/4073Evil_3D
Sky Sanctuary Zone1:51'2917980/80259Evil_3D
Death Egg ACT 12:25'5227890/90368Evil_3D, kaan55
Death Egg ACT 23:18'39198120/120318kaan55, Evil_3D
Doomsday Zone1:35'2219400194Evil_3D
Total1:11:49'5973412580/2583850/7713771kaan_3D, Evil55
  • Ice Cap 2 time is 0:55'15 "igt" + 7346 real time frames. We calculated the in-game time from the start of the level to the frame we beat the Act 2 boss like the game normally would've done.
  • Sonic starts Doomsday Zone with 50 rings, if you want to add it to the total rings would be 13821

General info

What rings didn't we get?

  • We collected 13771 out of 13826 total rings in Sonic and Tails history (99.60%). The difference of 55 rings consists of the following:
    • 42 rings on Angel Island 2 Knuckles area. The death boundary made them impossible to collect.
    • 1 mutually exclusive signpost ring monitor (10) on Launch Base 1 Knuckles boss area.
    • 3 rings in Knuckles final boss. (Impossible to access without cheats)
  • There is currently no known ways for Sonic and Tails to get any of these.

How long did this take to make?

  • 21 months, the run suffered a lot of resynching progress and we redo it from scratch most of the levels due to newer glitches and updating the inputs to a more optimized version.

Why the movie starts from a savestate?

  • The movie starts in a savestate with all emeralds/super emeralds to allow the giant rings collection and unlock the final zone, which contains more rings.

Why using 2 Players?

  • We chose Sonic and Tails for the following:
    • Sonic can avoid the hyper transformation using the elemental shields
    • Sonic can use the elemental shields abilities.
    • Sonic/Tails history has more levels and unlock other zones: Lava Reef 2 boss, Hidden Palace, Sky Sanctuary and Death Egg.
    • Sonic has the true final boss fight, Doomsday Zone. (adding more content)
    • Sonic along with Tails can do amazing combos, like carrying Sonic, and Tails can grab rings off-screen as long as Sonic's camera and Tails are in the same position vertically.
    • Tails can save a lot of time collecting out of the way rings, avoiding annoying backtracking.
    • Tails immortality/respawn is essential in some levels for collect more rings, the most notable use of this is Angel Island 2.
    • And of course, there is already an existing movie of Knuckles which this run was inspired by.

Suggested Screenshots

  • Frames: 72959 / 107856 / 170895 / 290534

Level Comments

Shield symbols under the level name represents the shield(s) used in the level

Angel Island ACT 1

Frame 1200/0:00'00 : The level starts with generating Tails and carrying Sonic when I still do not have control, and I keep Knuckles on the screen as long as possible to prevent the in-game time from starting earlier.
Frame 1960/0:04'00 : You can see that the monitors screens are glitched, but here I collected a ring monitor and speedshoes, the speedshoes are useful to travel the level more faster until the first giant ring.
Frame 2480/0:12'40 : Tails grab 3 rings off screen, at frame 2560/0:14'00 : you can see him grabbing 3 floating ring on the left side.
Frame 2760/0:17'20 : Tails grab a group of 7 floating rings.
Frame 2850/0:18'50 : This is a ring monitor.
Frame 3520/0:30'00 : Using the loop zip and using Tails to grab the 3 ring on the tiny lake this saves a lot of time.
Frame 3875/0:35'55 : This secret room has 3 monitors, 2 rings and 1 invulnerability.
Frame 4125/0:40'05 : This new loop zip was discovered by WST which allows me to skip having to run around in the hollow tree, and thanks to Tails we're also able to grab the 5 rings on the right while doing the zip.
Frame 5168/0:57'00 : Tails supports Sonic breaking this platform so that Sonic falls directly down and proceeds to the next giant ring room, same situation on frame 5673/1:05'13.
Frame 5475/1:02'05 : In the upper right part of the screen you can see Tails picking up a group of 3 rings.
Frame 6155/1:13'12 to 7163/1:29'42 : Here is where the lightning shield comes into action, this part normally without this shield would be very tedious to do since the rings are in very uniform positions, but thanks to his ability to attract this section is easily overcome.
Frame 6957/1:26'17 : Tails grabs 2 rings above Sonic and then the last group of 3 at frame 7165/1:29'43.
Frame 7393/1:33'29 : The boss receive perfect frame hits without the need of the insta-shield.

Angel Island ACT 2

Frame 8995/0:02'36 : By jumping at the right spot Tails is able to clip through the ground using the breakable rock. This allows him to go into Knuckles' area to grab some rings. This was also done in a few more areas.
Frame 9088/0:04'09 : For some reason the Act transition raises the death boundary a little which prevents Tails from being able to grab the rings in Knuckles' area. I have to go past a certain point to lower it back down. I purposefully get stopped as soon as I can in order to get sent back quickly.

Hydrocity ACT 1

This level is relatively played normal, however the most important things here to explain are Tails ring grabs.
Frame 25645/0:03'40 : Tails collects 10 floating rings off-screen here.
Frame 26273/0:14'08 : Tails takes the lower path to collect the ramp and loop rings
Frame 26719/0:21'34 : This lightning shield is needed for grab a 6 rings group at Frame 26979/0:25'54, then Tails grab them at Frame 27079/0:27'34 to prevent them from disappearing
Frame 26775/0:22'30 : Tails grab 3 rings down here, then he grab another 3 at Frame 27045/0:27'00
Frame 27405/0:33'00 to Frame 27646/0:37'00 : This section requires a very tight coordination between both characters, the image below is pretty self explanatory about what happen here
Frame 28535/0:51'50 to Frame 29473/1:07'27 : Same explanation as above, the image shows whats happen
Frame 30054/1:16'37 : This lightning shield is needed to grab the secret rings cloud at Frame 30477/1:23'40
Frame 30106/1:17'29 : Tails grab the loop rings and another 3 off-screen at Frame 30291/1:20'34
Frame 31166/1:33'39 : Tails grab 2 rings off-screen here, then he kill the badniks at Frame 31502/1:39'15 - 31609/1:40'59 to break the bridges quicky here
Frame 32840/2:01'29 : Tails grab 4 rings above this loop, the rest of the level is played normally
Frame 34046/2:21'10 : The boss received perfect frame hits with bubble shield bounces meanwhile Tails carries Sonic off-screen, you can appreciate this watching the camhack/Tails encode
Frame 34846/end level : This bubble bounce is for delay the score table a bit to get a perfect objects sync on HCZ 2, without this trick we'll lost an unnecessary amount of in-game time

...In progress...

Special Thanks to

  • TheYogWog: For his Knuckles ring-attack and his S + T 2015 test runs that made me interested in this project
  • marzojr: For his help and technical knowledge about this game
  • WST: For providing useful .lua scripts, the artwork and sharing the new AIZ1 zip
  • Selicre: For providing useful .lua scripts and develop the Atlas encode
  • DMTM: For sharing the first half of the new MHZ 2 boss strat
  • SID': For the amazing artwork!
  • Everyone who followed the project from its roots via forum thread/youtube and observing its growth and offering his support in these 2 years, I want to say thank you.

Submission text is still on development, be patient.

Otherwise we'll crush you with all the rings collected in the run

feos: Let's get crushed with the rings and judge this.
feos: Setting to delayed as we hope that the atlas workflow is done first, so everyone could enjoy the hell out of this movie when it's published.
feos: We're back on track.
feos: The ring has been attacked, the game+ has been newed, the submission text has been in development, and I have watched both the atlas and the Tails camhack encodes to pretend I understand what's going on. The movie is indeed remarkable, and presence of Tails makes it rather crazy in some places, also the whole thing quite boldly stands out from existing runs... of the whole series I should say. The audience fully agreed, accepting to Moons, will watch the rating regarding starring.
Dacicus: Processing...


WST
She/Her
Active player (489)
Joined: 10/6/2011
Posts: 1697
Location: RU · ID · AM
Selicre wrote:
At some point in the future I'm gonna have to make it so that it's uploaded to youtube while it's encoded into 4k, because I simply do not have the space.
Just curious, how much space do you need? I’m going to check if I can give you enough temporary space with NFS access (if such a solution is helpful for you). Already helped someone here in such a way once :)
S3&A [Amy amy%] improvement (with Evil_3D & kaan55) — currently in SPZ2 my TAS channel · If I ever come into your dream, I’ll be riding an eggship :)
Selicre
He/Him
Joined: 1/4/2019
Posts: 17
Location: RU
WST wrote:
Just curious, how much space do you need?
Now that I think about it, I'm pretty sure I'll manage. I'm currently using the veryfast preset to improve framerate, but if I wanna make it final I might as well use veryslow, which would improve compression significantly. I think the biggest bottleneck is just piping the data - I think it would be more efficient to use ffmpeg directly as a library, but sadly I have absolutely no idea how to do so. If someone has any sort of idea on how to feed the ffmpeg library a bunch raw image buffers and get a video out of it, I'm all ears, the project is open-source: https://hyper.is-a.cat/gogs/x10A94/atlas-s3k/
WST
She/Her
Active player (489)
Joined: 10/6/2011
Posts: 1697
Location: RU · ID · AM
Selicre wrote:
I think the biggest bottleneck is just piping the data - I think it would be more efficient to use ffmpeg directly as a library, but sadly I have absolutely no idea how to do so.
Googling gives tons of examples of how to convert series of images into a video, but almost no examples of «hot» encoding. Here are 2 of a few examples of frame buffer encoding. Also, 2 of my colleagues worked with ffmpeg, but not me.
S3&A [Amy amy%] improvement (with Evil_3D & kaan55) — currently in SPZ2 my TAS channel · If I ever come into your dream, I’ll be riding an eggship :)
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
Congrats on finishing it!!! Please tell me which code snipped dumps the framebuffer currently. There are lots of ways to reduce the filesize without killing the quality.
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.
Selicre
He/Him
Joined: 1/4/2019
Posts: 17
Location: RU
feos wrote:
Congrats on finishing it!!!
Well, it's nowhere near finished - it's definitely just the draft and I'll need to polish it a lot more.
feos wrote:
Please tell me which code snipped dumps the framebuffer currently. There are lots of ways to reduce the filesize without killing the quality.
https://hyper.is-a.cat/gogs/x10A94/atlas-s3k/src/master/src/main.rs#L244 As of right now, this is the code that accepts the images being encoded in a thread pool and uses a BMP encoder for the images, which pipes the output into ffmpeg. Actually, now that I think of it, I could probably squeeze out some more performance by using an RgbImage as the target, since then the encoder would not have to do much to actually encode it.
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
Does it keep all the intermediate images too? I'm seeing Rust for the first time :D
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.
Selicre
He/Him
Joined: 1/4/2019
Posts: 17
Location: RU
feos wrote:
Does it keep all the intermediate images too? I'm seeing Rust for the first time :D
Yeah, sorry for not keeping the codebase commented - I might have to do that for most of it so that others could learn and contribute. The intermediate images are stored in a hashmap since they could arrive out of order, since they are rendered in a thread pool. They are then removed from the hashmap when there's enough to go in order. Rust has move semantics, meaning that when you have ownership of some data, you are the sole owner, and it is guaranteed that dropping the value by moving it out of scope will deallocate the buffer, unlike in e.g. GC'd languages.
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
Here's how to pipe framebuffer to ffmpeg without intermediate images, tho this is in C++: https://github.com/clementgallet/libTAS/blob/master/src/library/encoding/AVEncoder.cpp https://github.com/clementgallet/libTAS/blob/master/src/library/encoding/NutMuxer.cpp With such a pipe set up you don't have any overhead that has to be kept just for the magic to keep working. And it still gives you full control over ffmpeg since you still pass your command. If it's just a matter of keeping only a few images and then removing them, all you need is efficient ffmpeg command. Here's what youtube does to your bitrate (might be outdated, but it's more or less true): https://vadosnaprimer.github.io/feos.vs.youtube.2160p.html Here's how size and speed relate when using x264: http://tasvideos.org/Feos/VideoTests.html Do you render at 1x scale? It's quite possible that rendering at 2x scale could allow you to preserve much higher quality in general while increasing the ratefactor significantly to reduce the size (native pixel size gets heavily killed by chroma subsampling that yuv420 does). It's worth using a short test clip to see what youtube does to your video, be it 4K or 8K. BTW, since Tails is so critically important in this run, won't it be better to keep him non-transparent at all? I guess he's half-transparent when off-screen, but this is one of the biggest features here, so making it more obvious would help. I doubt not knowing when he is off-screen will make anyone angry.
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.
Selicre
He/Him
Joined: 1/4/2019
Posts: 17
Location: RU
feos wrote:
https://vadosnaprimer.github.io/feos.vs.youtube.2160p.html
Thank you! This will be very useful.
feos wrote:
Do you render at 1x scale? It's quite possible that rendering at 2x scale could allow you to preserve much higher quality in general while increasing the ratefactor significantly to reduce the size. It's worth using a short test clip to see what youtube does to your video, be it 4K or 8K.
I'll render the final output in 4K in order to remove the 4:2:0 chroma subsampling. 8K would probably be overkill, unless someone else does it for me (prepare to spend 200GB on temp files!)
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
Selicre wrote:
I'll render the final output in 4K in order to remove the 4:2:0 chroma subsampling. 8K would probably be overkill, unless someone else does it for me (prepare to spend 200GB on temp files!)
You can't remove it after 420. Dumping the game screen at its native resolution (1x scale) leads to losing all single-pixel-wide chroma information, and also distorting the color borders. Dumping at 2x resolution and then applying 420 chroma subsampling allows to overcome most of this. So we have 3 sets of variables: how much of the game area is visible at once, how internal game resolution scales before getting dumped to the video, and how that is scaled to fight chroma subsampling artifacts. For 320x224 Genesis emulator footage, we dump lossless-compressed avi at native resolution, then we upscale it to 4K using pixel-based algorithms (think nearest neighbor). In your case I don't know the target resolution of your emulated footage and how it gets scaled. If you can expand the visible area to 4K, then applying 2x scale to that gives us 8K video that can be viewed without losing too much details in lower resolution modes too. It can be compressed quite well at a reasonably high speed with correct settings. Since it's not antialiased 3D footage, I don't think the filesize will be near half TB. If needed, half TB is how much spare HDD space I have for this. What about my other questions though?
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.
Selicre
He/Him
Joined: 1/4/2019
Posts: 17
Location: RU
feos wrote:
Dumping at 2x resolution and then applying 420 chroma subsampling allows to overcome most of this.
Yeah, that's kinda what I meant - I won't have any intermediate steps, it'll dump in 4K straight away.
feos wrote:
BTW, since Tails is so critically important in this run, won't it be better to keep him non-transparent at all? I guess he's half-transparent when off-screen, but this is one of the biggest features here, so making it more obvious would help. I doubt not knowing when he is off-screen will make anyone angry.
The fact that he goes semiopaque is because every object is semiopaque while not being rendered; I feel like adding more special cases is gonna make the code look pretty terrible. Hell, making it semiopaque to begin with already makes it rather complex, but it is a bit important because that lets you easily see why you can pass through objects at that particular time. I might switch it to being e.g. desaturated if it's deemed too distracting. Oh, and about the NUT encoding: I'll definitely try that, just in case image2pipe has some weird perf issues.
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
Selicre, would it be feasible to have at least some version of the full encode done until December? We'll need to handle this submission until New Year.
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.
Selicre
He/Him
Joined: 1/4/2019
Posts: 17
Location: RU
feos wrote:
Selicre, would it be feasible to have at least some version of the full encode done until December? We'll need to handle this submission until New Year.
Sorry about the delay! Real life stuff got ahold of me. I'll try to work on it this month; I feel like even if it's not perfect, it'll be received well enough that we don't need to bother with all of the edge cases, and I'd be able to make a better version if I have the time and energy to put into it.
Banned User
Joined: 6/7/2017
Posts: 420
Location: Somewhere
Thanks for the heads up about when we need to handle the submission Feos. I'm surprised that nobody has really said anything about this, but Evil and I will also try to get the submission text done before then. We're sorry it got delayed as much as it did. I'll start with some of the more major stuff like the Icecap signpost monitors.
Selicre
He/Him
Joined: 1/4/2019
Posts: 17
Location: RU
Link to video So this is a full rewrite to make this thing realtime. I've changed a bunch: * Plane B priority tiles are shown when necessary * Added a HUD showing some technical info and ring counts * Made the camera movement interpolated - there are some silent teleport issues but I know of a workaround * Objects no longer flicker when on screen * The camera is no longer constrained to level boundaries and is able to show objects outside of levels - doesn't render loopback tiles yet, but I might change that * Removed the checkerboard background because it unsurprisingly murdered the bitrate Things left to do: * Render out-of-bounds chunks when necessary * Splitscreen for tails when the distance between S&T is too big * Account for compound sprite X overflow a bit better * Maybe use vertical offset-per-tile data? I don't really know how I'd implement that * Make the final boss and ending not horrifyingly broken
BigBoct
He/Him
Editor, Former player
Joined: 8/9/2007
Posts: 1692
Location: Tiffin/Republic, OH
That was amazing, Selicre. Thank you so much for your effort! EDIT: Was watching a second time, and an idea that occurred to me. Could you reasonably add a border graphic to show where the screen boundary is? I don't think it's critical, but it would be nice.
Previous Name: boct1584
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
Thanks! Indeed it's incredible!
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.
Selicre
He/Him
Joined: 1/4/2019
Posts: 17
Location: RU
Thanks for the kind words!
boct1584 wrote:
Could you reasonably add a border graphic to show where the screen boundary is? I don't think it's critical, but it would be nice.
So fun thing is, I kinda didn't wanna add it because as of right now the entire viewport is drawn with the same GLSL shader - e.g. everything including the menu is drawn using paletted tiles. Adding something like a border would require me to write a new shader, which - it's a good idea! I just wanted to push it out as fast as possible. How do you think I should draw it? Fully shade the unreachable area, or, say, use a gradient line? I've been thinking of also drawing the camera boundary if sonic was sufficiently outside of it.
Player (98)
Joined: 12/12/2013
Posts: 378
Location: Russia
I just leave it here ._. Link to video
BigBoct
He/Him
Editor, Former player
Joined: 8/9/2007
Posts: 1692
Location: Tiffin/Republic, OH
Selicre, I was specifically thinking of showing the camera boundary, but a gradient shading extending out from where the camera boundary is might work too. My concern with something like that is that it might make Tails's offscreen shenanigans hard to see.
Previous Name: boct1584
Selicre
He/Him
Joined: 1/4/2019
Posts: 17
Location: RU
boct1584 wrote:
Selicre, I was specifically thinking of showing the camera boundary, but a gradient shading extending out from where the camera boundary is might work too. My concern with something like that is that it might make Tails's offscreen shenanigans hard to see.
Oh! I thought you were referring to the world boundary, i.e. the death plane and the camera scroll stop points. The reason why I didn't add this is because of how frantic the screen actually is; you can see that with e.g. the score tally in Ice Cap 2. It makes things a bit distracting. I'll definitely draw it when you are sufficiently offscreen, though.
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
Evil_3D, how do you make camhack focus on Tails all the time? When I just switch the target with Page Up, it gets reset when the Tails object disappears.
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.
Player (98)
Joined: 12/12/2013
Posts: 378
Location: Russia
difference with my encode: camera fixed to screen centered - easy to change. my encode has background - easy to disable. sprites correct priority (sonic/tails/rings not always on top) - easy to make always on top. I display glitchy invisible sprites: dead boss, blue things in marvel garden zone, magnetic platforms in flying battery zone... <- not easy to change. need to hardcode. had no time. I didn't hide hud. I show some object that I added in that time: spikes, monitors, and very few other objects. And, objects off screen is full opaque. The reason why I have background and correct priority - it was made with idea that original screen should seemlessly placed over it to prove that everything is right. Hud is visible because I display original screen, kinda same reason. One can say that sprites on top is not a bug, it is a feature. I can't argue with that. I tried camera smoothly following both, and with background enabled it makes weird move of it. I have issue with tails when he is "dead" because I don't know how to know is he alive atm, and I don't want to spend time on it. But when his position just reset - camera works fine. Just when he is dead, it's trying to reach some offscreen position. There is nifty hack to fix transitions in stages: if difference of sonic position > 128, shift camera with same difference :b As always, I'm not planning to update anything.
Selicre
He/Him
Joined: 1/4/2019
Posts: 17
Location: RU
r57shell wrote:
I tried camera smoothly following both, and with background enabled it makes weird move of it. I have issue with tails when he is "dead" because I don't know how to know is him alive atm, and I don't want to spend time on it. But when his position just reset - camera works fine. Just when he is dead, it's trying to reach some offscreen position.
I just set tails' position to sonic's position when tails is either at 0/0 or has x > 0x7000. Good enough for me. The issue with displaying the background together with the smooth camera is that the BG is inherently tied to the current camera position. If I were to try to display the background I'd have to emulate the behaviour for all animated tiles, which is not something that I have the time for. The glitchy (e.g. boss) sprites are still there, but they're not shown: I'm reading the object list at a specific point in time, when sprites are drawn: https://gogs.selic.re/x10A94/atlas-s3k/src/master/dumpframes.lua#L26 - this also means that lag doesn't screw up how sprites are drawn, since they always use the relevant info rather than "next frame" info. I'm currently experimenting with showing a short range of objects with known mappings. In the final encode, they will likely be shown at all times. The only problem I have is that the respawn table data doesn't match up with the object data, so there's a slight discontinuity. This'll likely require me to re-bake all savestates (which, btw, I've delta-compressed with qbsdiff to take up around 400MB rather than 209GB).
Player (98)
Joined: 12/12/2013
Posts: 378
Location: Russia
You said they are hidden: I was planning to do the same, but... Also, fix this stuff. https://imgur.com/a/emK20jl Btw, with rust you could write plugin instead of my dll, because rust is c++ friendly.