Tee-riffic was a ~20 person collaborative project, taking place over a 7 weeks period at the end of my university course. It's been published to itch.io and judged by industry professionals, and ranked #1 out of all the other university projects for that year.
As a senior tech/programmer, my contributions had a direct impact on the game's core feel and gameplay experience. My greatest contribution was the ball's shooting and physics systems. There were only two people on the programming team, myself included.
Ball Shooting
Dynamic Damping Physics System
After-touch Mechanic
Melting/Heat Mechanic
Player Character Animation Blueprint
Water Volume
Tall Grass
Melting Overlap
Snowball-throwing mole (not used)
Avalanche Mechanic (not used)
Source Control Setup & Management
Color Customisation Backend
Tweaking Engine Physics Settings (physics sub-stepping)
Level Objectives System (not used)
After-touch allows the player to slightly influence the trajectory of the ball after it's been shot.
This obstacle calculates a predicted trajectory and shoots a snowball to intercept the player, knocking them back.
This is a showcase of the character animations and animation blueprint & setup in action.
While the ball is submerged in this volume, it applies a constant upwards force - to simulate buoyancy, and a constant sideways force - to simulate flow.
Tall grass is an obstacle that applies higher physics damping to the ball, making it slow down faster.
This is a demonstration of the color customisation, which I implemented the backend for.
This is likely the most complex system I contributed to this project.
Because of the way physics engines work, at least as it pertains to Unreal Engine 4, spherical objects will roll forever on a flat surface, unless acted upon by linear damping, for example.
To solve this, I developed a custom system that takes the ball’s speed at any given time and, if below a certain threshold and provided the ball is on flat ground, will start to exponentially increase the linear and angular damping on the ball until it comes to a stop.
This is a tick calculation, i.e.: it is called every tick. Here’s how it looks in blueprint:
If the ball is moving slower than the threshold, the “Freeze Ball” event is called once, which will secure the ball in place. If it is above the threshold, the ball must be moving, so the “Slow Down Ball” event is called.
Here’s a look at the “Freeze Ball” function, which is called when the ball is “practically stopped”:
It very simply sets the linear and angular velocity to 0. Bear in mind this is called every tick, so it will do this continually (until the ball goes back over the threshold, hence the extra velocity check).
And here’s a look at the “Slow Down Ball” event, called whenever the ball is moving:
Part 1 of 3:
Firstly, it checks whether the ball is below 250 units of velocity, and if it’s on flat ground. If it's not, there is no need to apply additional damping, so the default “moving” damping values are applied instead, as follows:
Part 2 of 3:
You can see above – given the ball is not inside a “damping modifier” volume (i.e.: tall grass, or in a melted state), the linear and angular damping values are set to 0.5 and 0.1 respectively. Of course, if they indeed are in those volumes, the damping modifier is applied on top of the damping defaults.
Part 3 of 3:
Going back down the other side of the same event chain – when the ball IS going below the 250 units of velocity (provided it’s on flat ground), the exponential damping will start to be applied. The curve ranges from the default of 0.1 to 5, and it’s on an exponent of 1.2. The alpha is taken as a fraction of current speed / 250. The lower the speed, the lower the alpha, and the higher the amount of damping it applies, until it comes below 5 units of speed, where the system switches over the “Freeze Ball”.
When the shoot button is pressed (and held), a timeline will play, increasing and decreasing the shot power bar %.
Part 1 of 2:
Upon release, an impulse is added to the ball, in the forward direction relative to the camera, and of a strength linearly interpolated between the max and minimum possible power values, using the "Shot Power %" variable as the alpha.
Part 2 of 2:
You can contact me at alannah.morrison7@gmail.com, I'll get back to you as soon as possible. Alternatively, I can also be found on the following platforms: