Gasoline Fury is a Multiplayer game developed in Unreal Engine 4 where you have one goal, get to the finish line first by any means necessary.
The game is filled with amazing vistas, a persistent level up system for your pickups and is packed with adrenaline fueled gameplay.
Genre: Multiplayer Action Racer
Duration: 4 weeks
Engine: Unreal Engine 4
Team: 3 Designers, 5 Artists
Project Role: Lead Game Designer & Scripter
- Concept Development and Prototyping
- Progression System Design and Implementation
- Movement, Pickup and Feature Design
- Multiplayer Game Balancing
Player Progression & Pickups
When designing the player progression and pickup system I needed something that could be easily integrated with all other elements of the game. I also wanted to be able to change and tweak the unlocks and items from one location since there are many different places where they will be used, UI, Player Characters and Damage Systems to name a few. For that reason I choose to create the Level Up system as a component that could keep track of all the levels and unlocks for each player on it's own and easily be added to the Player Controller.
The system has three categories, Defense, Offense and Speed, where each category has three levels of upgrades. The system is persistent, so for each pickup you collect of a certain category you will be awarded XP toward the next level. When the player have collected enough pickups of a certain type, that category will level up. The next time a player collects a pickup of that category they will be rewarded with the second level item of that pickup category.
The reasoning for this persistent pickup system is letting the player choose to prioritize what they need during the race and allowing the player to get a sense of personalization by choosing their own upgrade path. The persistent system also lets the players use the pickups they collect while still being rewarded the XP and progress toward the next level so it doesn't feel like a punishment to use your pickups.
When the "LevelUpAbilities" event is called from a pickup it will run a check on the type of pickup it is and continue to run the level up script for that type. It will then check and output the new levels inside the function called "Check LevelWithinRange". The item and category levels will be applied and we will then call the function "Update Character Items" to equip the correct items based on those levels. We then run a delay that will stop the player from picking up the same type of pickup for a certain amount of time.
Each pickup category has their own structure array that contains the blueprint class that will spawn, pickup icons, and other variables needed for that pickup type. This information is then fetched by other blueprints using "Get Current References".
Checkpoints & Player Tracking
The checkpoint and player tracking on the track needed to be dynamic and have the option to have areas where multiple routes were possible. It also needed to have checkpoints that a player had to pass through, detect the direction of the player going through it and be used in player respawn.
The player tracking and checkpoint system is made up of two main blueprints, BP_Checkpoint and BP_GameplayTracker, and some functionalliy located in the player controller.
A BP_Checkpoint actor can be placed anywhere in the world and when a player passes through it from the correct direction a reference for that checkpoint will be saved in the player. That reference is then used in case of a player needing to respawn. If a player passes through a checkpoint in the wrong direction I call a function in that players HUD to display the "Wrong Way" -text.
BP_GameplayTracker is used as an actor in the world that will keep track of game time, checkpoints the players have to pass through and players positions during the race. This blueprint contains an array for BP_Checkpoint actors that a level designer can target in the world. The player needs to pass throgh the targeted checkpoints to complete a lap. At the start of the game all checkpoints are each assigned a identification number and the total number of checkpoints is saved, and we save all the player states into a sortable array.
The player position tracking is using an arbitrary number based on the lap count and the last passed checkpoint number. If two players have the same arbitrary number I compare the distance from each player to the next checkpoint in world space, the player with the shortest distance is then placed higher in the sorted player array.
Player-, Game Networking & Management
When designing the player movement and control I had to make it easy to balance, work in multiplayer over a p2p network, and have the player movement be easy to learn and hard to master. Everything is running through Unreal Engines network library and is using replicating variables, server run custom events and client events.