South Park: Snow Day!

South Park: Snow Day!, Question Games

Promo art from South Park: Snow Day with Cartman in his wizard costume in front of Jimbo's Guns.

I was brought onto Snow Day as a designer, but over the course of the project, the team was leaning on my technical skills more and more, until I formally moved into the Engineering department.

I was responsible for a lot of the enemy variants, player and enemy upgrades, and special abilities. Here are a few highlights.

Cartman Boss Fight

Cartman from South Park: Snow Day with his giant golem summon.

The Cartman fight consisted of 5 phases, some of which involved fighting Cartman while his invincible snow golem menaced the players, and some of which involved hunting for a snow-covered Cartman in a multitude of decoy snow-Cartmans.

Cartman’s abilities were mostly repurposed from elsewhere in the game (bubble shield, meteor storm, resurrecting his clones, etc.) but the snow golem needed his own set of abilities. He had two melee attacks, a giant leap attack across the battlefield, he could teleport to instantly trade places with the real Cartman, and he could smash the ground to create a snow wave that damaged everything in its path.

When the phase changed, the golem would explode into smaller decoy Cartmans that had their own abilities. They had a blast attack that could send any nearby players flying, and they could launch rings of fireballs.

Screenshot from South Park: Snow Day! in the Cartman fight decoy phase, with multiple decoys firing rings of fireballs.

This was a fun one because I was able to make so many different types of attacks (melee, ranged, area of effect) and also flex some 3D math skills. For example, I had to pick good landing locations for decoys after the explosion, and launch the decoys at the right speeds and angles.

Performant Blueprints

One of the upgrades I made was Defensive Perimeter for the snowball turret. That upgrade made it so that every time you placed a turret, it would spawn a minefield around it.

Screenshot from South Park: Snow Day showing a snowball launcher with the Defensive Perimeter upgrade, with a few lit firecrackers planted in the snow around it.

The max number of mines you can get per turret is 14, but we didn’t know that until after our final tuning pass. I didn’t want performance to limit our tuning decisions, so the original implementation capped out at 30 mines per tower.

If you had four players who all had 5 turrets out at once, and all of them were upgraded with a maxxed out Defensive Perimeter, you could get up to 4 x 5 x 30 = 600 mines active at the same time.

The normal approach would be to check each frame if an enemy was close enough to set it off, and then do damage to everything within a radius. But overlap checks are expensive, and any other solution (like generating a list of actors within a radius) would need to happen on the tick. So I needed a lightweight approach.

Instead, I calculated the maximum distance from the center of the turret that could possibly matter. This would be:

max distance a mine can be from its turret
+
trigger radius of the mine
+
width of our widest enemy’s capsule

Then I just did a distance check of each active enemy (from a TArray managed by spawner code, not by GetAllActorsOfClass) to give each tower its own array of relevant enemies. Most of the time, that array was empty. But when it wasn’t, I only had to distance check each mine to the enemies in the turret’s array.

There’s more I could have done, like sorting the array of mines to check the outer mines first, or nativizing it, but it ended up not being necessary.

The Bullshit System

That’s the actual name of the system. It’s a game about kids playing and changing the rules on each other. If somebody changed the rules in an OP way, it was “bullshit.” I was responsible for the system that determined when the enemy team would decide to use bullshit, which enemies would participate, and most of the individual enemy bullshit abilities.

Screenshot from South Park: Snow Day! when the Miss-fire bullshit activates.

Miss-fire was an enemy bullshit ability that replaced your ranged weapon with a cat toy. You could still launch projectiles with it, but they would be ridiculous projectiles like bananas, dolls, and dice.

But there were also bullshit abilities that gave enemies extremely powerful attacks, which were always tough to balance. The idea behind bullshit was that it’s only going to be active for a short time, but during that time the player would need to focus all of their attention on it. So it needed to be dangerous, but it couldn’t be so brutal that it was unfair.

Progression and Outer Loop

I also did a lot of work around the broader structure of the game, beyond the moment-to-moment gameplay. This included unlocks, achievements, a lot of upgrades and almost all of the perks.

A couple of the bigger examples were the Nichole contracts, which were opt-in challenges that would provide a reward if you finished the run with it activated.

Screenshot from South Park: Snow Day showing a Nichole pact offering a Villain Monocle cosmetic if you survive two additional enemy upgrades.

I also designed and implemented the Butters Book of Laws (everything except the UI) as a way of allowing players to see the the gameplay effects they had unlocked, and encourage them to try out new upgrades and bullshits they hadn’t tried before.

Screenshot from South Park: Snow Day showing Butters' Book of Laws.

Tags: