C# Gameplay Programmer
Singleplayer Career
For the full release of Thrill 2, the long awaited singleplayer game mode was included. I was in charge of technical design, implementation and iteration on the core systems supporting the singleplayer game loop. This loop involved AI boxer profile generation, boxing match simulation, calendar event generation, time simulation and general progression systems.
The singleplayer career saw players complete training sessions in between boxing matches against AI opponents, all scheduled in a monthly calendar. At the end of each in-game year, players that won enough fights were able to participate in a tournament where they competed against AI boxers for medals.
Expression System
Myself and one other developer were in charge of developing a blendshape-based expression system for the boxers. Each expression was made up of potentially dozens of blendshapes, and was specifically designed to combine positive and negative blendshapes into an easier to digest system (e.g. Eyelid Up and Eyelid Down combined into Eyelid with a positive and negative value.) This system allowed for designers to set up and test new expressions without needing any technical knowledge.
Advanced Damage Systems
For the first few months after Thrill 2 entered early access, the core damage systems were iterated one extensively. I was one of two developers working on these changes over this time. The backend damage systems in Thrill 2 were quite complex, taking multiple values from punch velocity, duration and direction to hand rotation relative to the body.
As I worked on the mathematical solutions to the problems within the damage system, I developed multiple tools to help quickly test, compare and iterate upon my changes. Below is a short video showcasing one of the tools used. With it my team was able to easily visualize recorded punches and specifically analyse the effects of the damage system on each frame.
Standing Mode Improvements
A big complaint we received from players using the standing movement mode was the frequency at which they would get stuck on the edges of the ring space. This was due to their movement being relative and restricted via the centre of their standing mode circle.
To solve this issue, I reworked the mechanic to make player movement and position clamping relative to the player's model position. You can see this behaviour in the video below.
Physics-based Reactions
When hitting opponents in the ring, we really needed to sell the impacts to make up for the lack of physical feedback in VR. To assist with this, I worked on a system that would allow for quick hit reactions without breaking the core physics systems that are used for each boxer and without needing baked animations.
This system took various data from a punch impact and translated it into positional and rotational data that was applied top-down onto the physics rig. You can see it in action in the video below.
In addition to that system, I also implemented a distance-based flinch system to increase realism. Boxers naturally tense and flinch their faces as a glove nears them. I imitated that real-life behaviour by utilizing the expression system outlined previously.
Multiplayer Lobbies
Before the game released in Early Access, I was responsible for implementing a private lobby system that would allow players to box against their friends. This system utilized the Unity Lobby API for it's backend, and supported cross-platform play to allow the use of a dedicated spectator client.
Reactionary Coach
For the release of the full game, which included the singleplayer career, we wanted a coach character to be present during singleplayer matches to give players encouragement and advice. I was in charge of implementing this, I did so by developing a reactionary coaching system.
This system had 'instant' and 'evaluatory' components, both being based on how the player was doing within the round. The instant component allowed the coach to yell commands to the player based on what was happening while the round was being played. These commands ranged from encouragements while the player was successfully landing and blocking hits, to beratements and advice while the player was not.
The evaulatory component to this system was more complex than it's instant counterpart. Instead of reacting to the current state of a round, it would instead record the player's landed and blocked damage and give advice accordingly. For example, if the player dealt a lot of damage but received just as much the coach would give encourage the offense and give advice for the defence.