Overview

I have always been passionate about movement in games, and I had the fortunate and opportunity to contribute to some elements of the movement in SUPERVIVE! I added improvements and drove features that improved game feel, variety, and depth. Of course, this was a team effort especially including gameplay engineers, and most listed features I updated and improved but did not initially create!


Glider

I improved Glider movement from the initial prototype implementation in a couple of ways. Primarily, I focused on improving the feeling of momentum and the flow to and from Gliding and other movement states. Some improvements:

  • Rather than clamping to a top speed immediately on start, players maintain the speed they enter the glide with, decelerating down to top glide speed over a short duration. This improved feel and also added space for movement depth and optimization.

  • Reduced many instances of small speed jittering around max speed. I used some smoothing operations and interpolated decrease of braking and thrusting force magnitudes applied when near the target speed.

  • The glider flies towards players’ cursor aim. If they are rotating quickly, the acceleration being added can be against current velocity, slowing the player. I added a “steering speed”, allowing players to maintain their max speed in a turn if they rotate a little more slowly. This works by rotating their velocity spherically towards acceleration rather than adding it linearly.

  • Improved handling of vertical velocity and preserving momentum. Relatedly, added support of a “soft ceiling” height to prevent degenerate gliding at out of reach heights. This pulls players who are Gliding down to an acceptable height but with enough delay they can still make strategic plays like jumping over tall walls. Additionally, to compensate for this and preserve the feeling of momentum, players convert this downward speed into forward speed in a “swoop” based on how far they are being pulled!


Dash Speed Curves

I pitched and pushed for the implementation of Dash Speed Curves for our character’s dashes. The idea: rather than dashes moving characters at a constant speed for some duration, the speed of a character during a dash should be controlled via a Curve. With some support from one of our many incredible engineers, Jason, we were able to make this happen! This improved the feeling of character identity in hand, added more nuanced levers for tuning and control, and provided opportunities for more movement depth and optimization.

Quick technical context: the curves controlled speed over duration: the speed of the character on Y was looked up using the current time in the dash on X, with both axes normalized to [0,1] for easier tuning. There would additionally be dash Duration and Max Speed values which scaled the normalized values.

The basis of the curves is a 4 point curve which describes 3 sections between them, which I’ve named similar to audio envelope names for their shared behavior.
Attack: The start of the dash, where the character jumps to a starting speed then increases to a max speed
Sustain: The middle or “body” of the dash, as the character somewhat maintains their speed before…
Release: The falloff or end of the dash speed as the dash timing ends.
Tuning the starting speeds, ending speeds, duration, max speed, and shape of these curve sections defines the dash behavior for an ability, and I used it add variety in feel and gameplay to different characters. As an example, let’s look at the dash curves and dashes for Shiv and Elluna, two Hunters with very different dashes and purposes for dashes in their kit.

Shiv is a high-skill glass cannon damage dealer who fights with ranged attacks but at closer range than other ranged Hunters. Shiv uses her dash to split-second dodge close range enemy attacks or follow up attacks as she dances around enemies to stay at her ideal range. The goals for her dash is a snappy, quick move that she can weave into attacks and movement naturally and skillfully. In fantasy, Shiv’s dash should feel like a quick acrobatic cartwheel representing her lifetime of elite combat training.. As such, Shiv’s dash has a high start speed and a rapid Attack up to max speed, which allows her to use this ability effectively for dodging. Furthermore, while the Sustain is long, the total dash duration is short, and the Release has a harsh falloff to a much lower final speed than most dashes. This not only helps Shiv players line up their followup empowered attack by reducing movement when it becomes ready, but it also supports a major counterplay axis of baiting out her dash early and being able to easily hit her during her longer & slower dash recovery.

Elluna on the other hand is a beginner friendly support who heals her allies and uses her unique passive to carry downed allies to safety while reviving them. The goals for Elluna’s dash are to support the “ambulance” behavior and allow her to dive into and out of fights with her cooldowns despire her usual backline positioning. Additionally, her dash is meant to feel magical and Elluna in general is more floaty and ethereal due to being a magical healing bunnykin. So, Elluna’s dash starts out much slower and has a much longer and more sweeping Attack. The Sustain almost immediately begins decaying somewhat, before the final short Release which leaves her at high speed. These turnings help her to dash a long distance in for her allies or away once she’s saved them, but notably the much slower starts makes this dash less capable of reactively dodging an enemy attack. Additionally, I made the entire curve flow more smoothly, with less clear moments of change in velocity. This gives in a feeling of an initial impulse which slowly decays in the air, making it feel much more floaty and magical than Shiv’s rigid and snappy movements.

Dash + Glide

Dashes can be interrupted with gliding to preserve the dash speed into the glider; this “Dash + Glide” interrupt behavior was a primary motivating factor for how hard I pushed for Dash Curves and why I did the Glider momentum work, since I believe it adds greatly to the mechanical depth of the game!

Since gliding will inherit and maintain the speed on start, the specific timing of when is most optimal to interrupt dashes with gliding is heavily dependent on the character’s curve. Shiv will want to rapidly glide almost as soon as she dashes due to the quick Attack, while Elluna benefits from waiting for a short beat and maintaining the “float”. Also, since gliding is inherently highly risky in combat, there’s major risk to interrupting your dash with a glide. Dashing + Gliding is the fastest standard movement players can make, and is the way to get the further distance with one’s dash. So, players moving around the BR map or at each other in combat are constantly deciding whether to trade off the risk of being spiked while gliding with the benefits of pathing with faster gliding speed and gaining more distance with a dash cooldown.

The depth of movement around the map and in combat was commonly called out positively as some of the best elements of the game. While I hate self aggrandizing, the depth added to combat of all forms and even just pathing and moving through the world while looking for loot or moving to the circle is one of my proudest accomplishments on SUPERVIVE!


Grindrails

Grindrails are a movement tool scattered around the map players can use to rapidly relocate at the cost of being stuck to the rail path. I added some movement code elements to the existing logic improve game feel and depth.

  • Before, players had to directly collide with the rail spline mesh. I added a larger trigger that allows players to attach from further away (especially while in air) and wrote the “attach” movement logic to get players onto the spline.

  • Players felt odd that their WASD inputs didn’t matter on grindrails, so I added support for WASD controlling the speed on the rail based on whether players are inputting along their grinding direction or against it.

  • Grindrails allow you to speed up by holding the jump button, allowing a jump on release. I added VFX to this behavior to make it clearer for enemies and yourself.

  • Players jump towards their cursor when grindrail jumping. I updated it so jump distances take into account the direction and speed you are travelling — you’ll jump further if you’re jumping along your grinding speed, and less far when aiming perpendicular or opposite to velocity. I added a special “switchback” case for grind jumps pointed along the grindrail the opposite direction, so players can do small quick hops to change direction without having to do a large jump and wait to fall back on the rail.

  • I added some control assists: holding jump while shortly above a grindrail will attach you and begin speed grinding instead of pulling out glider inches above the rail. Releasing jump shortly after coming off the end of a rail is still treated as a Grindrail Jump (grindrail “coyote time”)


Mini-Mantle

A small extra feature I added late in development was the Mini-Mantle. Mantles in SUPERVIVE aren’t a full mantle movement state because we didnt want to prevent player combat while fighting near edges. Instead, players skid and stop on the wall and pause briefly, followed be a large jump to bring you to the height of the ledge. However, doing this full mantling loop for tiny mantles where a player barely catches the lip really disrupted the flow of movement. So, I added a special mini-mantle behavior to make a more fluid movement for that case. Mini-mantles: skip the pause; apply much larger upwards force that normal to get you over the ledge faster; then apply a corresponding downward force shortly after to prevent launching with too high of a jump. It’s a small thing but players were very positive about it!


Combat Slows

SUPERVIVE is a high-speed, high-mobility Battle Royale. This combination can lead to disengage power becoming too strong and difficulties in the combat sandbox getting fights to conclude in a satisfying way — fights can often end not with a team winning or losing, but both teams bouncing off damaged and then healing up. We didn’t want to reduce mobility, especially during non-combat lulls during the match, but we needed to add some “sticky” force to fights to keep them closer and get more win/lose fights. My design goal was adding these sticky forces in a way that is low complexity, low mind-share, and has skill expression and depth.

For this, I improved our attack slows on primary attacks and built in hit-slow.

Primary Attack Slow

While attacking with their primary attack (LMB), Hunters build up a self-slow. This self-slow increases with repeated attacks, but decays after a delay between attacks, usually slightly longer than the attack cooldown.

This adds a defensive risk to offensive action — while shooting, it is easier to be shot due to being more slow. Furthermore, this makes “run away while shooting” much weaker, making disengage and offense more mutually exclusive and weakening timid disengagements. It asks for more commitment to fights.

The timing of the self slows was such that players could choose a slightly slower “skirmishing” shooting cadence; trading DPS on target for increased sidestepping capability and positioning.

Hit Slow

When hit with damage Hunters can be briefly slowed. My goals were to reward offensive success; helps “stick” fights even when an enemy is fully disengaging; and allow for more successful picks from ambuses.

I needed to support many types of attacks in this system, with a high variety in cadence, frequency, and impact. To that end, there are 2 types of hit-slow: Minor and Major. As players take consistent damage, it adds to a bucket. Once that bucket overflows, players take a Minor slow. Minor slows have a reasonable cooldown so players cannot be repeatedly affected by them. Major slows are caused when a player takes a very large amount of damage in a single chunk, and have a much shorter cooldown.

In honesty I was heavily inspired by the system for categorizing and playing damage reacts in Destiny Combatants and other game enemies.