Unity Engine

Turbo Force - AI Navigation (C#)

AI racers navigate by targetting waypoints that are generated from track spline data. The waypoint generator is robust enough to handle branching tracks, gaps, and surface regions (regeneration zones, dirt patches, etc.). The player can face off against multiple AI racers at various difficulty levels to earn medals and unlock new tracks.

Turbo Force - Online Multiplayer (C#, Steamworks)

The multiplayer system allows players to gather together in Steam matchmaking lobbies or by connecting to a dedicated server on the server browser. The Steamworks networking API is used to send data across the internet. Player motion is smoothed using techniques similar to Source engine's snapshot interpolation. Input prediction is used to minimize input lag and keep the client and server in sync. Network packets are also compressed using delta compression to save on network bandwidth.

Turbo Force - Rankings System (C#, PHP, MySQL)

The rankings system uses a PHP/MySQL back-end. When a player completes a track, their time and replay is automatically uploaded to a database. Other players can watch or directly compete with replay ghosts from the database. The rankings UI is designed to support mouse, keyboard and controller input. The UI also supports record filtering and infinite scrolling.

Turbo Force - Level Editor UI (C#, Unity UI)

The level editor uses a custom UI system that automatically generates fields for selected objects using C# Reflection. This system scans property attributes and then generates an appropriate field for the property's type. Property changes happen in real time and can be undone/redone.

glTF Asset Importer (C#) [View Source]

Turbo Force gives track creators the option to import assets from 3D modelling software by using the glTF file format. This tool supports animations, collision data, and DDS texture importing. Imported assets are reference counted in order to re-use resources and save memory.

Game Modifications

Rhythm Horizon Tools (C#) [View Source]

These tools were made for converting charts from StepMania to Rhythm Horizon and for randomly generating charts for Rhythm Horizon. While StepMania files are open source and easy to parse, the Rhythm Horizon file formats had to be reverse engineered by analysing the game's binary files.

These tools were written with test driven development and SOLID principles in mind. The project structure decouples UI from file parsing and converting, allowing for multiple front end implementations. I plan on implementing a front end once Rhythm Horizon leaves open beta and has a full release.

F-Zero GX Modding (C#) [View Source]

A track/collisions editor was made for F-Zero GX using Unity. Game files had to be extracted, decompressed, and reverse engineered using various techniques to analyse the binary data. The editor parses the binary information and allows modders to edit values and save them back into the game's binary format.

Garry's Mod Cooperative Game Mode (Lua) [View Source]

The cooperative game mode allows players to play Half-Life 2 based maps cooperatively in Garry's Mod. The server has hundreds of maps, many of which had to be modified in order to be compatible with Garry's Mod.

Defrag Mod for Counter-Strike: Global Offensive (SourcePawn) [View Source]

This is a SourceMod plugin which attempts to mimic the air strafe physics of Quake 3 Arena.


Roller Coaster Editor (C++) [View Source]

This editor uses a 3D path deformation algorithm to reshape an arbitrary mesh along a path, such as a B├ęzier curve. OpenGL is used for 3D rendering and Assimp is used for importing meshes from external modeling tools. This tool can be used to quickly and easily create complex 3D objects such as roller coasters and race tracks.

Distributed Systems

Distributed Instant Essay Grading System (Java)

For this project, I coded a Java service that allows short answer questions to be graded nearly instantly. This was done using Apache Hadoop Distributed File System (HDFS) to share grader files among nodes in a server cluster and Apache Zookeeper to route and load balance requests. Additionally, sockets were used to communicate between a master node and worker nodes in a hierarchical fashion. The master node handles all incoming requests from a web app and then routes the requests to be graded on a worker node with the lowest traffic.