Sonic ’06 – Seaside Hill Mod Technical Write Up

A quick write up of some behind the scenes of stuff for my Seaside Hill mod for ’06 in the style of my Greenflower Zone write up. This write up will be far less in depth, as a lot of the length from that one came from the evolution of our tools and techniques.

Reason for Starting this Project

My reason for starting this mod can be traced entirely to spite. For those unaware, GameBanana has a system where up to five mods for a game can become featured, appearing at the top of the game’s page with a fairly high prominence. The spite comes in purely from the fact that a simple texture swap of Wave Ocean with Seaside Hill’s textures ended up in this featured section (and is actually still there as of this writing).
Because of this, I decided that “No I’m not going to accept that. I’m going to do it properly.”

Spite is a wonderful motivator sometimes…

Initial Terrain Import

I knew from the very beginning that the hardest part of getting a Sonic Heroes stage into another game would be the fight against Heroes’ chunk system.
In Sonic Heroes stages are made up of various meshes that have a chunk number assigned to them, so far so good; the problem comes in with how Heroes structures these meshes. Each stage in Heroes uses various Chunk Boxes to determine whether or not a particular chunk is visible at any one point, on its own that doesn’t seem like a problem, and it wouldn’t be. However, the stage meshes in Heroes exploit this system for distant details.

For example, in Seaside Hill itself, the Whale Island is ALWAYS visible, this is because every chunk has a low quality version of it present within it, placed at an appropriate distance for visual flair. As a result, if every chunk is visible at once, things tend to overlap, either by being in places they shouldn’t be or simply by lower quality versions of themselves stored in more distant chunks.

HeroesPowerPlant showing an area in Seaside Hill with every chunk visible, notice the flat wall jutting out on the corner and the oddly structured cliffs.

As a result of this system, I had to manually remove any overlaps (some of which I’m sure I failed with if you look carefully), thankfully the collision doesn’t suffer from this same design quirk (as it would make no sense) and I could also visualise the Chunk Boxes so I wasn’t flying COMPLETELY blind.

Due to a quirk of Sonic ’06 itself, I had to shift the terrain back quite a bit, as Sonic ’06 has a failsafe system where the player is instantly killed upon passing the 25,000 mark on any axis (I believe this applies to objects as well, but I’m not sure), although this has since been remedied with a patch to remove this behaviour (on the 24th of August 2021).

Sonic dying due to hitting the failsafe distance from the origin of the stage.

Initial SET Porting

Due to similarities between the general play styles of Heroes and ’06, I targeted accuracy when it came to the SET layout of the stage. Thankfully, due to the SET format for Heroes itself being fairly well documented (I used this page on Sonic Retro a lot for reference), I was able to write some hacky code (based on code I made for automating Shadow The Hedgehog SET Conversion for Glyphic Canyon) to automate the very rough layouts.

From there it was a more standard fare, using SonicGLVL to manually handle everything else, such as Enemy and Item Capsule types, Spring targeting, Dash Panel strengths, Ring chains etc.

Due to our limitations regarding custom object physics, I ended up needing to bake all of the pillars and stone platforms into the stage geometry, with custom collision being used for them due to me being unfamiliar with a way to rip the original object collision from Heroes itself.

A modification of my reading code was used for this, exploiting an INI export option in HeroesPowerPlant and then sloppily reading that. I did it this way for those so I could read the miscellaneous data, as platforms like these have a scale value which I needed to take into account. As for actually importing them, I did the same thing as I did for the Flowers in Greenflower Zone, which was creating a 3DS Max script file that merged in another Max file for the object itself. Was it sloppy? Eh probably but hey it worked so I can’t complain.

Teasers and Crypticness

Around this time, I decided to start posting cropped, cryptic screenshots for this project on my Twitter in a large thread, although these teases tended not to be too interesting due to me not wanting to properly reveal what I was working on.

Skybox Trial & Error and Bloom

Thanks to the rather sloppily written XNO Builder I wrote for Marathon (although never publicised outside of the Lost Legacy server), I was finally able to do a proper custom sky mesh (as opposed to the one in Greenflower, which is just a massive sphere around the whole stage with no shader to avoid fog or lighting from affecting it), of course, this led to some trial and error regarding the shader and the textures.

In conjunction with the skybox requiring a lot of trial and error, the stage’s bloom actually became a pain for once, partially due to the fact that Seaside Hill has a lot of pure white textures (I can only assume?). As a result… Well… I hope you like illumination?

Some rendering shenanigans also occurred regarding the platform XNOs and their Radius value, which controls when a mesh gets culled out by the game. Due to the value being too small certain camera angles would make platforms disappear beneath the player’s feet.

Thankfully fixing this was easy, just increase the Radius value (which I think I decided to settle on multiplying it by 5).

Sea Gate

Due to how fast a lot of the Seaside Hill development was progressing, I decided to have a little fun and exploit the slot used by Tails’ Wave Ocean visit for a quick port of Sea Gate, as Team Sonic DO play it if you choose to play the Tutorial in Heroes. Not really much to say regarding it, as its such a small stage that the port process was piss easy (minus some frustration regarding behaviours of the Vertex Alphas and the flowers present in the stage going poof). Although it did lead to me having a bit of fun with the teaser on the Twitter thread. At first glance, it looks like a completely black image, but if you over exposure the image in an editor…

You can see its name on the stage select, to my knowledge, no one ever did this, then again my follow base is small enough that I don’t think anyone cared too much.

Water

What good is a seaside based stage without any water? Unfortunately the Marathon XNO Builder I wrote had no chance of making a mesh that would work well with the water shaders; the fact that I had (and still have) no knowledge in regards to how they work didn’t help.
Thankfully, I knew someone who did.

For their Emerald Coast mod, Nonami made some lovely looking water, so I turned to them and, within the span of a day, they presented an XNO and an appropriate custom shader to me, presumably based on their work on Emerald Coast.

Other Characters

Something I knew I wanted to do fairly early on was include some of the other characters as stand ins for the other teams, the first one of these I worked on was Silver as a stand in for Team Chaotix.

Thanks to the fact that I had to bake the platform positions in the terrain, I needed to tweak things ever so slightly for the multi character support; thankfully, the Lua Binaries for missions and stages have a seperate terrain path, so it was trivial to just change the path from stage/wvo/a to stage/wvo/chaotix, as for the folder structure itself, I could just copy over the Sonic one and replace the appropriate XNOs within it. While this method did result in a LOT of duplicate files, I don’t think there’s a better way to handle it with what we can do?

For a while after this, the development process turned into a case of going through the motions. Looking through old images I posted in private I don’t see anything of interest I need to talk about, until…

Custom” Physics Props

After a bit of time thinking about it, I started to look at various different ’06 props and comparing them to the breakable blocks in Seaside Hill, with the intent on trying something. By adding a custom entry to Common.bin I was able to add in a physics prop of my own without replacing any of the base game’s, however, there is one massive limitation in this approach; the collision for the prop has to be taken from an existing object, as we have no way to generate Havok files for the version of the middleware ’06 uses.

After a bit of time, I settled on using a container from Radical Train, leading to this:

Thanks to how wonky the collision is, Silver really struggles to actually use the blocks as weapons, but he at the very least can still lift them up and use them as a floating platform with his power.

Vertex Colours

Thanks to how Heroes works, lighting is faked by use of Vertex Colours, when paired with ’06’s real time shadow system they tend to clash horribly, so I needed to remove them, however, this led to a slight problem, as simply removing them in 3DS Max removed all the Vertex Alphas as well, causing some details to be lost. In typical me fashion; I decided to try do something stupid, not expecting it to work.

This code simply loops through every vertex in an object’s model and, if it has a Y position of 1 or higher (which would put it above the water) sets their R, G and B values for their Vertex Colours to 255, pure white, effectively removing the colour.

Shockingly, not only did this work first try (without screwing over things that used the Vertex Alphas for blending), it also created a nice looking effect in one part of the stage that I was not expecting.

An unexpected case where the Vertex Colour edit caused a nice fade to blue for this tunnel.

I believe that the rest of the work from here was fairly standard stuff, just cleaning up and fixing things while also working on the Light Dash splines.

The 1.0 release came out on the 22nd of May 2021, although I got right back to work after the release by beginning Ocean Palace 2 days later.

Ocean Palace

Ocean Palace was, initially, more of me going through the motions that you usually go through with a stage importing, doing a barebones grab of it to see how things could potentially fare. Basically all of the tools I used in Seaside Hill itself were recycled for this, although nothing really special happened in the development of it for a long time.

Although I can reveal a trick I used that I’m really happy with (despite Shadow’s Chaos Snap causing some problems with it).

This replication of the Triangle Jump is fairly obviously using the Chain Jump objects seen elsewhere in ’06 to pull it off, but there is one other unseen element to them, behind every Chain Jump object is a Spring hidden in the wall, this is to make it seem more like the Homing Attack can lock onto the wall for the Triangle Jump. While not perfect, it works most of the time, so I’m still pretty happy with it. The issue with Shadow’s Chaos Snap comes in if Shadow ends up teleporting to the Spring, as it puts him in the wall and inevitably causes him to fall to his death.

Poor Man’s Triangle Dive

In Sonic Heroes itself, Ocean Palace is the stage to introduce the Triangle Dive and its appropriate fans; for the longest time, I wasn’t sure what I would do for them as, while Sonic ’06 DOES have two objects (one as a box and the other as a cylinder) referred to as common_windcollision (objects that raise the player upwards in a special state) it is notoriously buggy when the floor is involved, causing the player to get stuck switching between the standing and wind states every frame.

Eventually, I decided to try bodge it to prevent this situation from ever happening, thanks to something I remembered regarding my EARLIEST Greenflower Zone experiment.

The thing I remembered from Greenflower which allowed me to make the fans work.

As mentioned in the Greenflower Technical Write Up, my original proof of concept from back before collision tools were a thing intended to fake it using the common_stopplayercollision object. As it turned out, that object behaved like a wall, causing the player to just kinda slide along it.

Remembering this fact made me try something, placing one of those objects alongside the wind collision object to make sure being in the wind and on the ground was never possible. Surprisingly, this turned out to work. But there was one strange caveat regarding it. If the player was close enough to the ground when in the wind they just wouldn’t raise at all for some reason; as a result the invisible walls needed to be a lot higher than the fan’s actual model.

Suddenly Whale!

For both Team Sonic and Team Dark, one of the defining set pieces of Ocean Palace comes at the end, where three rolling rocks chase the player down a set path (basically an automated spectacle more than anything). Of course, I had to figure out a way to replicate this. I’d already experimented with how the cameras for that area would fare, but I wasn’t too sure about the rocks themselves.

Initial camera test for the end of Ocean Palace, missing the other angles.

The first step was to figure out getting an object to move along a spline, the first course of action for this was to see how the whales in Wave Ocean worked and replicating that; the concern of the model was something I knew I’d push back and handle later. The whales would do as a test. And oh boy was the first test honestly kinda hilarious.

The first test of having a whale follow a spline replicating the Ocean Palace rocks. With the speed maybe set a little TOO high.

The simple act of Sonic dying on the back of and being carried away by a whale rocketing off down the path at mach one was extremely funny to me at the time, with the rather unfitting music I was listening to at the time only amplifying it.

Toying with the speed values got a far more presentable replication of the set piece. Although the model issue remained. Although it ended up not remaining as one for long.

Whether I actually noticed that message at the time (surely I did I can’t stand having unread pings…) or if I just came to the same idea naturally I decided to try out using the White Acropolis snowballs instead of the whales (due to the fact that they didn’t have any animation files, so I came to the assumption that the snowballs rolled without needing one). A simple model swap later and presto! Although a new, incredibly obvious issue presented itself and remains to this day, as I’m not sure how fixable it is.

For some reason, at various points along their paths, the rotation of the “snowballs” breaks. Not a problem for the snowball itself, as its just a sphere; but for these, it is incredibly noticeable and consistent. I never did figure out a solution for this and, as its harmless and honestly kinda funny, I just left it intact.

Why I Now Hate Turtles

Another defining part of Ocean Palace’s layout is a section where the player is navigating across blocks positioned on the back of various turtles swimming endlessly in a perfect formation. A cool area to be sure. But for me, it turned out to be my worst enemy. The amount of back and forth that happens due to the constant use of Cannons (which I always had to substitute with three Springs) led to me always putting off work on the turtle sections (which lead to a pleasant surprise when I realised Team Chaotix’s layout skipped it).

The main issue here comes, once again, from Sonic ’06’s targeting system (yes I never seem to make up my mind on whether I want to praise or despise that system). For objects such as Springs and Jump Panels, ’06 allows a target to be set; however this target is not something like a set of coordinates but is instead the object ID for another object. These IDs are NOT controllable by the designer, but are assigned sequentially, from 0 all the way up to the last object, so far so good.

Problems start to arise when you’re automating the basic importing and deleting unneeded objects, like I am. As I could end up setting the targeting for a load of Springs only to discover later that “Oh I need to delete this object which is very early in the list.”, this causes the IDs of every object after to be shifted back by one, but the target parameter will always remain the same (I’ve tried to think of ways to automate handling that, but I don’t think GLVL would be very kind to it).

Due to the sheer amount of objects and criss-crossing in the turtle sections, I found myself having to fix targets a LOT, as well as referencing the original layout in Heroes (using the game itself, as I don’t believe HeroesPowerPlant shows me the Cannon targets) to find out where things should point to.

Nothing too technical about this block, I just needed to rant about it. Moving on!

Silver and the Return of an Old Joke

Silver ended up being the second of four SETs I worked on for Ocean Palace. Thankfully his proved to be a fairly smooth ride (the lack of a Turtle section helped with that!). From the very start I knew EXACTLY what I wanted to do for this goal.

In the original Heroes, the Team Chaotix goal for Ocean Palace it to rescue a Chao (a fancy way of saying get to the goal really), ’06 doesn’t have Chao (and I frankly hate the buggers), while I could have taken advantage of something like the download_obj object to make a collectable Chao I had a much better idea. Although its one that needs some context.

Damn it YouTube!

WAY back in 2012, Melpontro uploaded the video above, titled Pelé the Beloved Dog in Wave Ocean, this became a running joke that seemed to fade away for a while, before suddenly reappearing in April of 2020. A fairly simple mod which replaced Sonic with a dog found in Soleanna (which is ironically NOT Pele! Pele is a different dog that is the focus of a mission). When I was initially toying with Ocean Palace, I hit upon the idea to shout this out fairly early on by making not-Pele the thing that Silver needs to rescue in his mission.

As for how many people actually get the reference without having it explained…? Well that’s yet to be seen.

Hello Darkness Burnout My Old Friend

Around this time I started to suffer from a massive burnout on Ocean Palace, every time I would open it to do anything I would just stare for a while then close it. A few small things were done during this burnout, sorting out the chunk mesh overlaps and dropping in the Seaside Hill water to get a feel for how the water would at least look. But progress as a whole was slow, especially when I tried to start Shadow’s SET and just wasn’t feeling it at all.

Although a looming deadline soon partially forced me to kick it into a higher gear, by this point it was July, and I knew I wanted Seaside Hill 1.1 to be submitted to the 2021 Sonic Hacking Contest. So for the first time in my modding work, I had a hard deadline to meet.

Image

Despite this though, I still found myself struggling to motivate myself, if anything it was a little worse; as I’ve always suffered from the feeling of FORCING myself to work on a mod. As I’ve said in the past, that’s not what modding is about.

Strangely, this burnout ended up being cured by the most unexpected thing.

Breaking One of my Rules

Out of the blue, I decided to go against one of my usual rules (which is don’t change the game physics for a stage mod) and increase the speed of every character up to something that roughly matched Sonic’s Blue Gem. This one change suddenly made Shadow’s Ocean Palace feel a lot better and is probably what single handedly brought my motivation back, all of a sudden I was actively working on it again.

Alongside the speed increase making the stage feel fun, the act of making a structured TODO list also helped me work on it more, as it kept me focused on checking things off the list and seeing active progress. Rather than just feeling like I was getting nowhere.

With the sudden burst of motivation, I ended up powering through the creation of Shadow and Amy’s SETs fairly quickly; but in classic me fashion, I started toying with something else on the side.

Because Why Not?

Image

For some reason, I got the idea to import the terrain from the Turtle Shell battle arena and slap an Egg Genesis into it, partially because I was curious how the boss would fare in an arena where the player couldn’t just rush up to its bottom weak point as Sonic and skip most of the actual fight.

Of course, an arena like this meant a lot of Springs to join up the various turtles and a lot of adjustments to the Egg Genesis. Thanks to how the enemy behaviours are heavily controlled by Lua Binaries, I ended up having a lot more control than I initially expected.

Image

Speaking of the Springs, there was initially FAR more, as I wanted every platform to be usable, before narrowing it down to a select few for the final revision, creating a constant circle.

Yes I did lay out my plan by drawing a red line on a screenshot in Paint.

From this point onwards, the rest of the project was fairly standard stuff, getting help from Nonami again for the water and the animations for the Fans (which I can only assume were all hex edited by hand as we don’t have a system for making XNMs) and checking things off my TODO list steadily, taking screenshots to indicate problem areas that needed addressing for easier references.

Closing Words

Unlike with Greenflower, Seaside Hill doesn’t really present any archival of how our modding scene has really changed, but it can kind of work as a way of showing that I’ve gotten more familiar with some of the tricks we’ve ended up forming, as the original 1.0 release was made from start to finish in roughly one month. Ocean Palace took a lot longer due to the burnout mid way through, but once things got going again it ended up being completed fairly quickly too in the grand scheme of things.

The real limitations for us at this point are the fact that some of our tools are still rather hacked together (the fact that we still use SonicGLVL and a homemade converter for SETs is very painful) and that our capabilities for model work is still very crippled due to the Ninja library being an utter nightmare. Eventually these limits will be overcome I’m sure, but probably by someone far smarter than me.

As it is for me right now, I’m content to stick to the stage mod side of things and occasionally help with reverse engineering where possible.

Image