Post feature RSS Level development

Technical article that goes into detail of all the work that went into each level in the mod.

Posted by on

General Level Workarounds

Most of the work mentioned here was done in every stage that was imported from Unleashed.

General Objects
While the majority of the object layout is compatible between both games, a straight conversion rarely leads to a playable level. There's a lot of objects that didn't make the cut into Generations and thus needed to be replaced:

  • Generations introduced an attribute for all objects, which defines the minimum distance Sonic needs to be from the object so it appears. Unleashed didn't do this and all objects were constantly loaded into memory, just made visible or invisible when a certain culling distance was reached. This means that the logic for all objects in the stage was constantly running, while Generations only processes the logic of the objects in range of the player. This attribute was a very useful addition, but all of the new objects that transitioned from Unleashed needed their ranges tweaked to work optimally. The goal was to reduce pop-in as much as possible while keeping decent performance on an average gaming rig.
  • Unleashed used platforms as individual objects specifically coded for each stage with their own names. Common examples include stuff like "AfricaFloor", "PetraFloor", etc. Generations changed this system to "GeneralFloor", which simply has hardcoded parameters for collision boxes and allows different models to be used depending on the stage it's in and the attribute. The platforms in Unleashed weren't one-way floors, unlike the Generations platforms, so it's impossible to get on them from below in the original game. There were all sorts of workarounds for these platforms, depending on the stage.
  • Rainbow Rings have different functionality in both games. They act as regular Orange Rings with a score bonus in Unleashed. Since the scoring system is gone in Generations, the Rainbow Rings now serve the function of "Trick" rings, so using them for the same thing would mess with the flow of the stage. A lot of Rainbow Rings got replaced by Orange Rings due to this, and Rainbow Rings were used to replace a different mechanic instead...
  • QTE Trick Ramps are gone, and they got replaced with ramps that can send you to different places based on whether or not you boost onto them. Since the QTEs were used in Unleashed to separate two different routes for Success and Failure, a straight replacement couldn't be made with the regular Trick Ramps. You're always pretty much boosting in this game, after all, so you'd always land in the successful route. They were replaced with regular Jump Ramps that would always send you to the Failure route, and Rainbow Rings placed above at certain points so that you could take the Success route by properly timing a jump.
  • Not all camera types are compatible. The most annoying one is "ObjCamera2D", which just straight up crashes the game whenever it comes into range. A decent replacement of it can be made with "ObjCameraPathParallel" with the right attributes, which is just a camera that centers on and looks at the path Sonic is going through. A lot of camera work in general needed to be tweaked/redone in many parts, and it took several tests to get it right.
  • All rings are lightdash enabled in Unleashed by default. However, in Generations, rings that can be lightdashed have a "glow" to them, and the move has gotten less reliable and a bit wonky. We stuck to making rings lightdash-enabled only on routes where you absolutely need them. There's also a bug in Generations where the player wouldn't be sent in the right directon after lightdashing; a workaround was adding Orange Rings to the end of ring trails.
  • The camera transition planes managed by "CameraCollisionBoard" don't work in the same way in Generations, and they need their "ACameraID", "ALinkObjID", "BCameraID", "BLinkObjID" attributes corrected to the proper camera planes that are right before and after each transition. If not done properly the camera will get stuck in several places, whereas in Unleashed they're supposed to transition back to a normal free-form camera.
  • Instead of using a regular Bomb object, Unleashed used one named for the Big Chaser sections, "eBigChaserBomb". A simple mass replace of these bombs did the trick.
  • Unleashed defined wall jump-enabled walls through the collision, while Generations only works with Wall Jump Panels for this move to be enabled. Luckily, there was an object left over that enables wall jumping on any surface inside the region it covers, "TriangleJumpCollision". This was a viable workaround for any section that needed wall jumping, without having to put visible panels that messed with the visuals of the level.
  • In Generations, there are no blue springs that launch you into QTE panels that you have to jump from, so the most common workaround for these were to just turn them into quick automatic spring chains. While this got rid of player input and sped up the transitions, there was an element of "building up to a setpiece" that was lost in the conversion. There were some tricky alternatives to this, but they required mashing A to get through, so the decision was to make transitions simple and quick unless they could be ported perfectly.
  • Red Medals are not the same kind of object as the Sun and Moon medals. There's also a limitation of only 5 Red Medals per stage, so we chose their locations by just general level design philosophy. Some of their positions were spots where Sun/Moon medals would be, and others were in brand new locations to encourage exploration and platforming.
  • The ultimate life-saver in Generations is the inclusion of an object called "ObjectPhysics". It's an object type that uses a customizable name reference, and looks it up in a global object database. These objects can use custom models, an animation that can play once or on loop, break into other objects, use collision boxes, and some other minor features. These objects were used all over the mod, and they're the heart of most of the object workarounds. A more detailed guide on how to work with this database can be found here.
  • Most of the ObjectPhysics entries from Unleashed are completely compatible with Generations. The only thing they need is a model format update through SonicGLvl, and converting their associated HKX files (Physics and Animations).
  • NPCs are a common element in various levels. They're in Windmill Isle, Rooftop Run, Arid Sands and Empire City. In Unleashed, they were specific objects that had the type of model they used controlled by a variable, plus parameters for the animation they played, and if they had an object attached to their hands or not. Even the walking ones don't actually move in Unleashed, they just walk in place! You can check that for yourself in Arid Sands; it's just a visual illusion since it's a boosting section. To work around the lack of the NPC objects, I took on a very tedious job: I created an ObjectPhysics entry for every single NPC in every level, right down to the exact same model, the same animation, and the same objects attached to it. With a well organized naming scheme, I eventually got it done for all four of these levels. Arid Sands in particular was the one that took the most time, as it has a huge amount of people.

  • Warning signs for bottomless pits didn't exist back in Unleashed, and it's a good addition to the series to indicate when you should walk around more carefully. We added plenty of new warning signs to all the stages to help the players be cautious around the many death hazards/pits, but not enough to tamper with the overall visuals too much.
  • The Special Effects particles aren't compatible between the two games at all, so all of the dynamic effects in the stages were replaced by similar equivalents that were already available in Generations. Since at the time of the project custom particle creation was not available, this was the only viable method without dedicating more research into it.
  • Generations got rid of the ability to have enemies trigger an event upon their death, except for the Egg Pawns with shields in that Seaside Hill mission with Rouge. This was sadly not a viable option at all, so most of the segments that relied on a set of enemies being killed were replaced with just the enemies being there and the invisible barriers removed.
  • Lobotomy developed a lot of higher resolution textures for all the stages in general, with focus on the organic ones that were reused across a lot of the terrain. They were tweaked to retain the same color palette, and their main purpose was to just add higher detail overall. The color tones and brightness of the levels all got tweaked to remain consistent throughout the mod and have a nice balanced palette. Here's some screenshot comparisons of the early levels with the original textures, and the final versions with custom re-textures. Screenshot comparisons are available here: 1, 2, 3, 4, 5.
  • Materials were mostly compatible overall, except for some Blending materials that needed to be tweaked to transition between textures properly. The solution was just to repeat their texture units and change them onto a blending shader, and the end result in each level looked pretty accurate. The Metal shaders didn't work well either; they just needed to get replaced with something that looked similar in specific cases.
  • Another specific change that needed to be implemented was tweaking the Havok World Size from the default. If this is not modified and the player or objects go outside the Havok World, the Havok thread just stops working and everything physics-related in the game breaks. This is also known as the "Ghost Mode" glitch. Because the Unleashed stages are far bigger than a regular Generations stage, the glitch mentioned happened in normal playthroughs and couldn't be avoided. To fix this, we found a parameter used in the Time Eater stage that looks like this:

  • Other general work that was done on each level was patching known exploits and glitches from Unleashed, so a lot of the collision got some minor patches to prevent these, as well as fixing new glitches introduced by the Generations engine.

Enemies

A lot of Egg Fighter types were removed from Generations, although there were many new additions such as all the Egg Pawns with various weapons. The Fire, Ice, Electric, and Wind robots from Unleashed that couldn't make the conversion were just replaced by Egg Pawns with similar weapon functionality. To make up for the loss of this enemy variety, I decided to recreate something that I loved from Sonic Colors: enemy theming. Since Generations supports overriding common objects' assets for each level, it was entirely possible to create new models of the same enemy for each level. I believe this was a huge contribution towards making each level feel more unique, and we had some fun consulting the community and deciding what to implement. They were also placed in parts where their themes would fit better. For example, the Fisherman Egg Pawns only hang around the human-populated sections of Jungle Joyride and the shores, while the Mayan/Aztec-inspired Egg Fighters only stay in the ancient ruins. Here's the final roster of custom enemy themes that made it in:

Almost all the enemies that weren't supposed to be static were given patrol routes across parts of the level. This was done to enable their chasing AI if the player is nearby, and it just looks better than enemies standing idle with no purpose waiting to be killed.


Individual Level Workarounds

The general process of developing the individual levels consisted of getting the stage to a state where the player could complete it from start to finish, even if there were a lot of missing objects and functionality. Once it was possible to run through the level to the end, work on the polishing and workarounds started section by section. Each part needed to be as polished as possible before moving on to the next one.

Here's an example of a level ported with very little work done on it, just enough for the player to reach the goal:

In any of the pictures below, a pink cube represents an object that doesn't have a display model set in the editor.

Windmill Isle

This stage mostly worked fine except for a lot of cameras that needed to be tweaked, some moreso than others. Since it relies on simple objects, just implementing the general workarounds already made it playable.

There's animated pelicans standing around town that point out the direction Sonic needs to go with their wings. They were created using ObjectPhysics.


There were some cosmetic details added, such as seagulls flying around in circles in several places where it seemed they would fit, along with matching ambient sounds. This was a nice touch to bring some more life to the stage. To recreate the seagulls that fly across when Sonic's going through the first set of rails over the ocean, they were re-animated and remade as regular ObjectPhysics that play their animation once they get into range. There's several sets of these placed all around the section.

Some very minor layout changes were made, like adding a few platforms here and there to help the player get back on track more easily.


Savannah Citadel

The main object used in this level is the jump poles. While the jump poles with the exact same functionality as Unleashed didn't make the cut, the City Escape ones are a pretty close match. Fun fact: the dimensions of the poles between both games are the exact same. A simple model replacement with the ones from the original stage was just enough to get the poles working.

The bongo springs are model-swapped classic springs with custom sounds from Unleashed. Their functionality is mostly the same.

The new axe-throwing Egg Pawns are positioned where the player can see them in advance from safe areas. That way, they can avoid the attack, try to bait it, or even take the risk of grabbing the Red Medal right in the trajectory of the axe. The Egg Pawns fulfilled the role of the fire enemies from Unleashed.

To make the second drifting section a bit less boring visually, some animals were added to the sides of the stage, as well as some African Hunter-themed Egg Fighters that patrolled around the elephants.

Using the regular Jump Ramp / Rainbow Ring workaround for the QTE Trick Ramp at the end of the second drifting section wasn't a very good option due to the wide nature of the drifting route. Boosting onto the Trick Ramp on the left will take Sonic to the upper rail route. Not boosting on the panel will only lead to the lower route on the tree. This actually involves some strategy, as it's not easy to have boost at all times during the second drifting section unless you run over the Egg Fighters. The dash panels to the right will funnel you quickly into the wide spring near the base of the tree, which will take you to the lower route.

Performing tricks above elephants was necessary.

The final QTE Trick Ramp got a very different workaround than just a Trick Ramp. Instead, a regular Spring launches the player up, and at the peak of their jump, an Orange Ring is in reach. With a well timed air boost or a jump dash, the Orange Ring will launch Sonic into the Goal Ring. Alternatively, if this fails, he'll fall into a set of swinging platforms from Green Hill Zone, remodeled with an african theme. These platforms activate when the player lands on the first one of them, and from there they can either try to backtrack to the spring to attempt to reach the Orange Ring, or simply jump slowly on the swinging platforms to reach the Goal Ring.


Rooftop Run

All the dynamic clothes hanging between houses were replaced by custom ObjectPhysics with the same model types.

The first Rainbow Ring got tweaked as an optional path to take, mostly for the purpose of building boost early and seeing the lush background at the start of the stage from up above.

The fountains are a combination of 4 separate elements:

  1. A classic spring with an invisible model that can be homing attacked. It's also silent when hit, and it forces the animation of Sonic curling into a ball. The speed it launches Sonic at and how long the player can't control Sonic after touching it is tweaked to match the action of the fountain in Unleashed.
  2. A sound trigger of the fountain's water. This is needed so an ambient sound of the fountain plays when the player is nearby.
  3. A particle emitter that is placed above the fountain's model. It's a constant loop reused from one of the fountains in Generations, scaled to match.
  4. An ObjectPhysics with the model of the fountain from Unleashed, and matching collision.

The pigeons in the Generations version of Rooftop Run and the ones in Unleashed share the same object type except for the name, so a simple global replacement worked correctly.

We added a visual touch that made it into the Generations stage: making Rooftop Run be in a festival. We didn't go overboard with the effects in the end, but some confetti triggers and hot air ballons from the Generations version got added into it.

Some of the spiked crushers from the Generations version of the stage were added. They only activate when the player reaches the dash panel to the left, so there's not much risk of getting hit when done right. It's used as encouragement to hit the dash panel at the right angle with a well-timed wall jump. Even when not hitting the Dash Panel, they still take a good amount of time to activate.

The first iron gate object was replaced by the equivalent in Rooftop Run Generations. It needs a strong boost to be opened.

The first lightdash route needed a small change because in Generations, the launch speed when using the move is much higher than in Unleashed, so you didn't end up on the correct route. To solve this, an Orange Ring was added to the end of the ring trail, and the lightdash was turned into a diagonal line to prevent people from just boosting at the peak of the jump to get to the upper path.

The Thorn Balls in Generations and Unleashed don't have the same functionality in movement patterns, so the inside of the tower got a redesign in a similar style.

The event of ending a skydive and landing at a specific point no longer exists in Generations. To solve the landing at the bottom of the tower, a collision trigger that disabled player input at a certain height at the end was implemented, along with a rigid body of collision in the shape of a funnel to force Sonic into the center. A dash pad was added to the landing spot to get the same effect as Sonic landing in the center and running outside the tower.

Professor Pickle!


There were some unused objects in the game that were implemented at one point during the development of Generations Rooftop Run. They're called "EucRollingBarrelCreater" and "EucRollingBarrelDeleter". However, these objects didn't have the basic functionality of being triggered by an external object, and just started working the moment they got into range. They're the rolling thorn barrel spawners, which were eventually scrapped and integrated into the airship. With some layer trickery involving enabling/disabling a set of objects, we were able to get similar functionality to the Unleashed equivalent.

Due to engine differences, shooting out of a four-way cannon sometimes leads to recalculating the current 2D plane Sonic is walking on. Since a part of Rooftop Run uses two 2D path splines that are very close together, placing a four-way cannon in this section led to Sonic getting stuck in a glitch where he'd constantly swap between the 2D planes, and be unable to get out of this weird state. A workaround was needed, so the design of the two paths was changed to the following:

A 2D platform is where the four-way cannon would normally be, which starts moving to the right into the lower route as soon as Sonic lands on it. However, there's a set of rings on an arc hinting that it's possible to do a wall jump somewhere to reach the spring above. The player is rewarded by getting onto the upper route if they simply try to wall jump from the left wall. Two quick successive wall jumps leads to finding a Spinner to homing attack and the lightdash trail to upper route.

A combination of a layer trigger and a SoundPoint was used to play the bell sound when Sonic goes on this loop-de-loop.

A lot of work was spent on getting the camera sequence of the clock tower to transition correctly.

Since the functionality of constantly-spawning Egg Chasers is not available, the last quickstep section has three waves of three chasers each that appear at different intervals, which keeps the player alert and encourages boosting into as many Egg Fighters as possible.


Dragon Road

The most memorable setpiece in the stage is the first giant dragon that opens his mouth when Sonic launches into it. As expected, this object's code wasn't in Generations at all, but it was easy to recreate it with a strange object not many people would think to use.

That is one of the dynamic pipes from Chemical Plant, internally called "CpzPipe", and they're actually very useful. Their models, skeletons, and animations are all completely modifiable and can be extended as needed, and they can play an animation only once when triggered. The problem with regular ObjectPhysics playing an animation once is a timing bug that will sometimes make the animation play from halfway through, but this doesn't happen with CpzPipes. This bug was actually visible on the early version of the Dragon Road demo, where the dragon would sometimes play the animation starting from its mouth halfway open instead of fully closed.

There's also an ObjectPhysics that triggers the sound of the dragon roaring. Both of these are triggered by an EventCollision object in the air while Sonic is launched towards the setpiece.

The main gimmick of this stage is the Chinese-themed spinning platforms. While this object isn't in Generations' code, Sonic Team reworked them into the spinning platforms in Sky Sanctuary Zone... even with the exact same dimensions. However, not enough floor types made it in. The SSZ ones only have two types of models/collision that can be replaced, while there were five types in Unleashed. To make up for this and keep the same number of spinning platforms as the original game, there's only two types of platforms in the entire level: full circular ones with decorations, and quarter circle ones. Due to the lack of more spinning objects to attach stuff to, the bar thorns on some of the platforms had to be made static. The bar thorns are simply an ObjectPhysics with a collision box for damaging the player when touched.

The platforms are a combination of an ObjectPhysics for a custom pillar, the SSZ spinning floor that matches, and a sound loop of the grinding noise that they made in Unleashed.

The models in the pictures of the editor are not representative of the models used ingame.

The original Dragon Road used One Quarter, Half, and Three Quarters types of platforms for the following parts. To replicate these, several copies of the One Quarter ones were made, but at different starting angles of 90 degrees each. These are later placed in the same position to look as seamless as possible:

When separated, you can find several copies of more spinning floor objects:

In later stages like Empire City and Jungle Joyride, the SSZ spinning floors are used in even stranger ways.

The rideable rockets were also a big element of the stage. Their parameters were merely the angle they launched at, speed and acceleration. The only comparable alternative we found in Generations were the Speed Highway Rockets, but these used custom path splines instead of variables like that. With math, it was possible to accurately recreate the trajectory, acceleration, and speed of the original rockets.

The rockets also needed a new custom animation for Sonic to be made, replacing his animation of grabbing onto the rocket with him riding the rocket.

The third rocket in the stage that leads into a skydive trigger needed some trickery with custom Jump Collisions and such to make Sonic stop properly in midair. If the player isn't stopped then, they'll keep going up to an incredible height due to the quick acceleration of that rocket.

Some platforms were added to the bottom of this cannon for safety reasons. It was too harsh to kill the player just for not realizing where they're supposed to shoot in time, but these platforms aren't exactly safe either. They'll start falling slowly to force the player to move to the right as quickly as possible. A jump pole to the side will get them back to the proper route.

Final Big Chaser section was replaced with an Egg Chaser section. The section overall actually ended up being much faster due to this change, and some enemies and boxes were added to mix up the layout a bit. It wasn't the most elegant solution at the time, but there weren't many alternatives we could come up with to keep each level unique.

I always liked the 1up and the spikes I added to the end, mostly to see what people would do with them in the demo. It's a completely optional thing to the side of the road, there's no risk of getting hurt by it if you're just boosting through, but people still tried to get it anyways just for the sake of greediness. A well-timed hop rewards you with the 1up without getting hurt.

Cool Edge

The thorn balls' models in the entire stage are replaced with the icy thorn equivalents from the Unleashed stage.

The Penguin objects from Unleashed aren't compatible, so we decided to use something with similar object behaviour. The replacement was the pigeons from Rooftop Run, with all their models and animations replaced with the penguin ones. There's a parameter that controls the distance the player needs to be for them to fly away... so we merely turned that value to zero. Yes, penguins are basically birds that can't fly. How fitting.

Other sets of penguins are only ObjectPhysics with looping animations, such as the ones waving and dancing around. Some extra ones were added to decorate the stage, along with my favourite ones at the end.

The Rooftop Run confetti particles were modified to resemble falling snow. The falling snow triggers whenever Sonic's in the outdoor parts of the stage, never when he's inside a tube or a cave. This wasn't in the original game, it's just an addition that seemed like it'd fit very well.

The heavy use of light shafts and ice shaders in this stage is what led us to fixing the FxPipeline renderer, as it's the renderer capable of doing these effects correctly.

Once we got the original HKX to work with this stage, the Ice Physics properties were still functional. They act a bit weird under some circumstances that don't come up very often, like crouching motionless, but it worked pretty well overall and didn't need much tweaking.

Stomping switches are not available in Generations anymore, so the alternative was to just use a regular switch for it. To keep the requirement to stomp at least once to activate it, we added a little reference to Sonic 3 & Knuckles with an ice cube around the switch, which is only breakable by stomping on it.

The door wasn't ported either, so like in Dragon Road, we used a CpzPipe to make the animation play properly once triggered. This is all done with the combination of an EventSetter object triggered by the switch, which in turn triggers a set of objects with different timers to get it to work correctly. The objects triggered are a sound cue for the door opening, the CpzPipe itself playing the animation, and an invisible wall object that gets disabled on the door. The CpzPipe itself doesn't have collision; the invisible wall just disappears a second after the animation plays, which is about when the door is half-open.

The second door later on in the level uses the exact same type of objects as the first one.

The Bobsleigh object just plain doesn't exist anymore, so this required a complicated workaround. We decided to use the regular snowboard that appears in City Escape, but replaced with the Bobsleigh model from Unleashed. All of Sonic's skateboarding animations needed to be replaced with new animations similar to the ones used in Unleashed. Since the animations were not compatible with the Generations skeleton, they were all animated with the original ones side-by-side for reference and replaced where it was necessary.

The Bobsleigh's physics were also tweaked to reduce the handling of it and try to keep it at a constant speed. We weren't really able to get something that controlled better than the original one with this method, but it was still playable enough. The layout of the bobsleigh sections was completely overhauled to fit the physics better, while reducing the risk of the player dying as often as in the original.

Any bobsleigh section also used Sonic's "Dash" mode, where he's prevented from Drifting and is kept between the bounds of the dash splines. The splines also needed to be remodelled around the tubes to give the bobsleigh better turning and handling. With the regular splines, the turning is normally very jerky and unresponsive.

Due to the different engines, Sonic can boost while on the Bobsleigh, something that could be done in the Wii/PS2 version of the game, but not the PS3/360 one. Another change is that you get hurt if you hit enemies without boosting. As a result, a lot of Egg Fighters were removed and positioned in places where you have more time to react to them instead of just crashing straight through. The layout redesigns accomodated for this, making boosting a huge risk; not of dying, but of getting hit and losing rings. Losing rings during this section is something you really want to avoid, because you'll need the ring bonus for the goal to get a good rank.

The first bobsleigh section uses a camera switch from outside along with a breakable ice wall to play an illusion. The bobsleigh model placed behind the door is a fake one, and it's just there for cosmetic purposes. Once the camera pans away, this fake bobsleigh is removed and the player is switched to Skateboarding mode. Sonic then breaks through the ice wall, making the transition appear smooth, since it was done off-camera. In the second section this trick isn't used because the speed that Sonic's going at makes it very hard to notice when he quickly gets into the Bobsleigh.

The whale is probably one of the most complicated tricks in the entire mod. First off, the original model and animation are the wrong scale, and their rigs are terribly done. They're actually double the size they should be, but they were hardcoded to be rendered at half size in Unleashed. Since importing animations with this terrible rig just didn't work out well at all, the entirety of its skinning and animation had to be redone.

Both whales use invisible classic springs at the end of their bodies with specific parameters to resemble the motion the whales make. There's also huge sets of particle effects positioned around different parts of the whales, taken straight from the Giant Chomper section in Green Hill Zone. These particles are activated at certain points when Sonic triggers the whale's actions.

2D mode changers with custom splines are used, for helping Sonic travel along each whale's back easily, along with an autorun trigger that disables player input.

First Whale: This whale plays two animations: one where it emerges from the water at the start, and one animation later of it flipping up its tail to launch Sonic towards the next section. This was all handled by a single whale object in Unleashed. To recreate this, and due to the previously mentioned animation bug problem with ObjectPhysics, CpzPipes are used. However, a CpzPipe is limited to playing only one animation per type, but the first whale is supposed to play two different animations at different moments. These animations also can't be joined together because the player might go at different speeds on top of the whale.

The first CpzPipe is the animation of the whale emerging out of the water. The second CpzPipe is the whale in a static state, and when triggered, it will flip its tail up. The two separate whales are in the same spot in different layers. Once the player enters the whale section with the bobsleigh, a trigger will activate the layer of the first Whale appearing out of the water. However, Layer Triggers are not perfectly synced with the framerate and can have a slight delay. To avoid Z-fighting problems or a whale disappearing for a few frames, the whale layers get swapped when the camera pans away from it after the first jump pad. Like this:

Second Whale: Just another type of CpzPipe, remaining in a motionless state until triggered, which will make it play its animation of lifting its head and letting out a cry. Static collision on its back, an invisible classic spring, particle triggers and sound triggers are enough to simulate this whale.

Both of these required a lot of testing to get the trajectory right, the timing of the animations correct, a good amount of particle effects and sounds, lots of camera work... as well as some science to figure out what size the whale is supposed to be by modifying Unleashed on the 360 to spawn Sonic above the whale and taking out screenshots from that viewpoint as an accurate reference.

The icicles did not retain their full ability to damage the player due to technical constraints, but it does get in the way of the player if they fall down to the ground. They actually use yet another type of object, "CscBreakRoad". These objects are the breakable road platforms from Crisis City, and they have one very useful function: collision can be attached to two of its bones dynamically, and it will play an animation when triggered, moving the collision at the same time. By remaking the model with the icicle from Unleashed, the object is able to fulfill a similar role, albeit without being able to damage the player directly.

Each icicle uses a CscBreakRoad, an ObjectPhysics right above the icicle for the chunk of ice it comes from, and a particle effect on the ground. The BreakRoad and the particle effect are triggered by an Event Collision trigger, with different timers on each event to get the particles to appear right at the moment the Icicle would land on the ground (for example, 1.4 seconds later for the first one).

The last set of falling ice blocks is complicated by the fact that there's not enough platform types available in each level to accomodate for the 8 or so different models this thing used. They also needed to fall individually when touched, so this needed an independent solution for each floor.

Each chunk of the falling bridge uses:

  1. ObjectPhysics with the correct Ice Platform model as in the original game.
  2. Invisible GeneralFloor that will shake when touched, then fall after a short amount time. Once it falls it will respawn after 99999 seconds, so unless you want to spend an entire day in this stage it will likely not respawn. The ObjectPhysics is attached to this falling floor.
  3. A particle effect of a splash right at the water, waiting to be triggered.
  4. EventCollision trigger which is slightly above the GeneralFloor. This guarantees that the player will trigger both the falling floor and the particle effect with a delayed timer. Both the falling speed of the GeneralFloor and the timing on the event trigger are synced for these to happen together.

Arid Sands

Using the first lightdash trail made the player go way too fast, so an invisible silent spring was placed at the end of the trail.

The moving platforms in this stage tend to be longer than normal platforms and needed to be solid. ObjectPhysics can't move the player on its own either, even if they're attached to something, so an invisible General Floor that actually moves is placed slightly above the solid platform. Said floor also has the ObjectPhysics attached to it, so it's a way to make custom platforms with different collision, but it takes work to get them placed correctly.

On a later part of the stage, one of the platforms is even longer than usual, so two invisible General Floors with the same movement pattern are used instead.

A similar trick was also used with the platforms moving vertically for the part with moving pillars that the player has to jump on.

In a similar fashion to Cool Edge's icicles, CscBreakRoad was used to replace the falling pillars. Unlike the icicles, not being able to hurt the player with the pillars isn't such a huge deal, since they're just meant to stop you in your tracks and make it harder to get through.

CscBreakRoad is also used to drop the big rocks with Egg Fighters on them. They tend to be triggered from far away, so it's not easy for the player to get below this rock before it hits the ground. The Egg Fighters have a long range for their chasing AI, because that's the only way they'll attempt to detect if they're standing on ground or in midair. If they don't chase after Sonic when the rocks are falling, they'll just stay there in midair! This is because Unleashed constantly calculated gravity for a lot of enemies, while Generations only attempts to calculate it when they move.

Empire City

One of the first quickstep sections is actually not properly quickstep-enabled in Unleashed. The section is clearly designed for it, but it uses a Dash Mode changer instead of a Quickstep Mode changer. The path spline XML entry for it is commented out for no apparent reason. Adding these entries and fixing the mode changers corrects this issue. It wasn't very noticeable in Unleashed because the default distance Sonic moves when pressing the bumpers is similar to the distance between the quickstep paths, but in Generations it's very different.

The rotating spikes are a combination of SSZ spinning floors with the collision and model of these thorn bars, and a bit of a weird workaround to get them to hurt the player. These floors can have objects attached to them and move them on a circular path, but it can't change their rotation. This is actually used in the classic level of SSZ to make the item monitors face towards the screen. Since the thorns are part of the SSZ floor model, the only way for the thorn bars to be able to hurt the player is to attach invisible ObjectPhysics with damage collision in the shape of small circles. It's an efficient method that also keeps the player safe from taking damage outside of the thorn bar at any time, and it only requires three per bar to fill the entire space that is needed. The player is not smaller than the gaps between them, so this method worked out pretty well in the end.

Separated from the spinning thorn bars, the damage collision objects look like this:

The first road got a layout overhaul due to the removal of the Big Chaser. It was replaced with a section where you have to dodge upcoming traffic by quickstepping from one lane to the other. I always thought this would be a very cool addition to the main stage, since you would think there would be cars in the way in a city with so many roads...

To introduce the player to the fact that cars are coming, there's a small autorun section at the start of the road where you have no control over Sonic. Then, a car comes through followed by some horn sounds. The player can't get hit in this autorun section, so it's a safe introduction to the concept.

Then the camera pans back to normal and you can quickstep between two lanes to dodge the traffic. There's about four car line spawners at the end of the road with slightly different speeds and gaps between them. The spawners are activated and deactivated by turning on/off layers with different triggers across the road. This maintains a constant stream of cars while advancing, and keeps the player safe if they decide to stop somewhere. Making it an autorun section was not viable because there was a chance the player would start running backwards after hitting a car. This does not happen in the regular quick step mode.

The objects used for spawning the cars are the regular cars with custom spline paths from Speed Highway, named "SphHighWayCar".

Due to differences in the culling of 3D models between Generations and Unleashed, this particular building in Empire City just disappeared when the player went on the rail that goes through it. Since there seemed to be no viable fix to this because of hardcoded engine differences, the camera had to be changed to look from outside the building.

Since there's no way to trigger events by killing enemies in Generations, the ending was redesigned to be a skydiving section. There's no hazards or goodies to catch, except for the spinning Goal Ring moving around the monument. There's actually a hidden spinning thorn bar inside the building, with the Goal Ring attached to it. The only reason it's tucked away like that is because there were no more types of SSZ spinning floors available to use, so it wasn't possible to just make an invisible one.

Jungle Joyride

The water geysers in the ocean and the beginning quickstep section were recreated by mass replacing with two CscIgnition objects. CscIgnition is the fire geyser from Crisis City. The particle emitter was turned white and replaced with water textures, the sound was replaced with the water geyser sound from Unleashed, and the base model was made invisible. Two of these objects are placed one above the other to simulate a longer jet of water coming out.

The breakable bridges in the first 2D section are actually CpzPipes with their animation ported from Unleashed. They use an event trigger right above the platform, a rigid body that acts as the collision for it, and a sound cue of wood breaking. When the event trigger is activated, there's a timer on the CpzPipe playing the animation, with the rigid body being turned off a bit later on. It gives the player just enough time to be able to jump off while the bridge is breaking. Some Fall Signs are placed above this area to indicate that these platforms are risky.

Similar to Arid Sands, the majority of Jungle Joyride's moving platforms have unusual, specific shapes and they need collision that matches their appearance. A lot of invisible GeneralFloors with ObjectPhysics attached to them are used throughout the level. The GeneralFloors are always slightly above the ObjectPhysics collision so they can transport Sonic properly when they move.

They're used in sections where they just move around.

Sections where the platforms will start to fall down when touched.

And even this section near the end with moving blocks coming out of holes in the walls.

The buoys in the ocean don't have collision, but they do have a floating animation. The object type SshBuoy replaces all of the ones from the original stage, and their model was swapped with the original one.

The falling pillars in the ocean actually used two different CscBreakRoads. As explained before, two bones can each be assigned a different rigid body that will move along with the animation. We only needed four of the pieces of the falling pillar from Jungle Joyride to have collision because they'd float around in the water. The two types of CscBreakRoad had their models replaced; one has the pillar's models, bones, and animation, while the other is just the same animation repeated with an invisible model. The rigid body assignment for each was done on two specific pieces of the pillar as needed. Even if one of them is technically invisible, the collision matches the animation of the other one at all times.

To get the water to "splash" when these pieces fall into the ocean, a set of particle effects are pre-placed in their landing spots. When the event trigger makes the pillars fall, a timer is set for each specific particle effect so they're properly synced with the animation.

I avoided using the GUN Truck to replace the Big Chaser on the other stages, but it would have been a missed opportunity not to use it here. There weren't many alternatives other than making yet another Egg Chaser section, and this section of the stage did not look nice at all with a forward-facing camera due to how it was modelled.

The truck received a makeover to fit the setting. The textures are muddier and dirty, with leftovers of dirt and leaves all over it. The logs on its back indicate that it's been modified to work as a deforestation truck.

The truck also has a scaling parameter which was set to half its default size so it'd fit properly into the path. Jump triggers for the truck are also placed on the big drops of the path.

At the end of the section, Sonic goes under a large rock with a couple of trees crossed over it. The death trigger of the GUN truck was placed there to simulate it crashing into this big rock during its reckless pursuit of Sonic.

There's also some GUN Hunter robots placed right before the truck section, which indicates that GUN has reached Adabat. FORESHADOWING!

The door opened by the stomping switch was recreated the same way as it was in Cool Edge: a CpzPipe, an event setter, a switch, and a sound trigger. The only difference is that instead of using an ice cube to "freeze" the switch, a mini-cage modeled using existing assets was created:

This decorative cage has a wood plank on its top, which is only breakable by stomping on it. The switch inside can be seen through the bars, but the gaps are too small for the player to fit through. The top being made out of wood implies it could probably be broken in some way.

In Unleashed, the spinning thorn springs only changed their direction at set intervals; unfortunately, this movement pattern could not be recreated perfectly. The only viable alternative was to make a custom SSZ spinning floor that was the model of an air spring with thorns on its back rotating constantly. An invisible classic spring is attached to the spring side; since the rotation of the attached objects doesn't change, the spring always launches Sonic upwards. On the other side, an invisible ObjectPhysics with damage collision is implemented. The end result is a spring that will always launch the player upwards, but when timed incorrectly will lock Sonic into hitstun for a few seconds and make him lose rings.

There's a new hazard in the form of a spinning pillar with thorns, hinting at players that there's a more efficient route while distracting them to the right with the 10 ring sitting below. The duration the player is allowed to sit in the cannon was extended, so there's plenty of time to make the right decision. If the thorns are in front of the 10-Ring, the player can launch upwards with the cannon and air-boost above it, eventually landing on the rocks to the right. If the thorns are above, they can safely take the lower route and get their reward.

The thorn movement is created with an animated ObjectPhysics with damage collision, and a GeneralFloor tucked away in the distance that moves it vertically.

Making the water-shooting statues insta-kill Sonic like they did in Unleashed was far too complicated to recreate with the objects available, so we opted instead to simply make them hurt the player. It uses several CscIgnition objects (in a similar way to the water geysers) to simulate a longer stream of water coming out at regular intervals. They're only activated when Sonic reaches an event trigger nearby.

The water jet forces the player to wait, unless they're willing to take a risk and air boost above them. The event trigger is placed on the Egg Fighter because the most common method of getting to this platform is by homing attacking it. In the downtime after hitting the Egg Fighter, the player can see the hazard in front of them with enough time to plan how to get around it.

To recreate the crushing doors, the common trick of using GeneralFloors tucked away in the distance with ObjectPhysics representing the real doors was used. There's also a sound trigger for the grinding noise they normally make.

The big platform that attempts to crush Sonic against the roof was recreated with two different types of "SshRuinFloor". They're the big ruin blocks that crush the player in Seaside Hill. The reason for using this object is because they're capable of damaging the player when they get close to a roof or a wall of the level. However, their collision is hardcoded to a default width, and they can't attach other objects to themselves. They're also capable of moving at a linear speed in a single direction and stopping there on their own.

To replicate such a wide platform, a set of invisible SshRuinFloors are used right where the player would walk, and one that has the actual 3D model changed is placed where it needs to be down below. Both sets of floors have the exact same movement patterns, and they're activated by an event trigger to the left.

A later section of the stage is completely separate from the rest of the terrain. The game uses a camera trick to simulate Sonic going into a lush forest, and coming out on the other side of it. Unleashed used a teleporting object that just warped Sonic to a specified point, which is no longer available in Generations. The solution was to use an object called "CpzPipeEnterCollision", which is used for the pipes in Chemical Plant to transport Classic Sonic through the tubes. These use a spline and have configurable velocities and launch speeds, so all that needed to be done to adapt it to this long teleport was to give it an insane amount of speed.

The end result is mostly the same, except with a 2-3 frames camera glitch to wait for the assets to load. You can still hear the Classic Sonic spin sound if you listen closely.

To make up for the absence of events triggered by enemy deaths, the last section with the spinning thorn bars was changed to a small jumping puzzle. Two bars rotate around an ancient structure, one with thorns on its side, and the other with a switch on top. Hitting the switch will deactivate the wall of flames. Although the switch can be activated by simply jumping on it, the Spinner on top can also be homing attacked to allow the player to easily direct Sonic towards the switch.

This object uses an SSZ spinning floor with two bars on its sides, one with spikes and one with the platform. To make the spikes hurt the player, a similar trick to Empire City's thorn bars is used: some invisible ObjectPhysics with damage collision are placed and attached to the spinning floor. The switch is also attached and a very small invisible GeneralFloor is positioned above it so it carries Sonic if he lands on the platform. Otherwise, the player would just slide right off, which looks very unnatural.

Glitch compilation
Glitches and bugs turning up during development is inevitable, some of which are more fun than others. Here's a compilation of some of our favorite glitches found by ourselves and the beta testers:

Next article: "Late research and White World"

Comments
BlazeHedgehog
BlazeHedgehog

I'm still not a fan of Lobotomy's new rock textures. They're more detailed, sure, but they lose the specific shape of the rock face.

Reply Good karma Bad karma+1 vote
Red_Z
Red_Z

Very interesting read! It's really nice to hear about all the workarounds you guys had to come up with. Congratz on producing such a polished mod despite having to jump through so many hoops!

Reply Good karma Bad karma+1 vote
Guest
Guest

This comment is currently awaiting admin approval, join now to view.

Post a comment
Sign in or join with:

Only registered members can share their thoughts. So come on! Join the community today (totally free - or sign in with your social account on the right) and join in the conversation.