I have worked on this game as a gameplay programmer since August 2022. My team included Aditya Patil, Joel Shaji, Kesavan Shanmugasundaram, and David Liu. We made a third-person, rouge-like shooter with a focus on ability-based combat.
I worked on much of the foundational mechanics of our game. I created or implemented the player controller, the projectiles, every ability, all player animations, the lodestone combat, and many other small tasks. My technical implementations were carefully premeditated so that both the player and the enemies could use every single ability without any extra logic.
There are six abilities total: three for light attack and three for heavy attack. Each can be combined to create powerful synergies and a unique combat style. Both the player and enemies have a unique visual style of VFX for every single combination of abilities. This sums to a total of 32 potential unique VFX styles for projectiles.
I implemented these projectiles with special abilities using an inheritance system. At the top of the system is the “Logic Layer,” which has 3 Blueprints that contain all the logic for every upgrade. Bellow the logic layer is the “Visual Layer,” which, by contrast, has no logic whatsoever. Instead, it overrides the VFX manager to provide easily customizable projectile styles.
The logic layer has a topmost “Base Projectile” blueprint, which has logic shared by all projectiles. This includes firing, hitting and damaging opponents, homing, and keeping track of nearby enemies. This blueprint also calls dummy methods that can be overridden in its children. These include functions that are triggered for hitting an opponent, hitting the environment, and initializing after being launched. These functions act as important triggers for the child classes. This also holds an “Ability Struct” that stores all the information about the projectile, and its upgrades.
The “Light Projectile” is a child of the Base Projectile in the logic layer. It uses the Hit Character function to check if it is a player shot and heal the player. This blueprint implements all three light attack upgrades: rebound, vulnerable debuff, and special behaviors for burst fire.
Rebound is the most complex upgrade, it simply uses the enemy tracker built into the base projectile BP to evaluate which other enemy character it has a direct line of sight to. It uses this list of viable targets to launch another projectile with one less rebound at a random viable enemy.
Vulnerable debuff applies a stack of vulnerable to the character it hits. This is done in the “Character” blueprint that both player and enemies share.
The burst uses a special creation function outside the projectile blueprints to implement the burst fire mode. The projectile only uses a special event on creation to boost the homing substantially for the first two seconds, so the shots curve towards where the player or enemy fired.
The “Heavy Projectile” is a child of the Base Projectile in the logic layer. It implements the three heavy attack upgrades in our game: explosive, frost, and airstrike.
Explosive uses the hit character function and the hit environment function to create a separate “Explosion” blueprint that damages anything in the radius. This upgrade also synergizes with the frost debuff by passing the frost damage to the explosion so it can also apply the debuff.
The frost debuff simply adds a frost stack to the character hit. This affects the character's movement speed and fire rate, which is implemented in the shared character blueprint, not the projectile.
The Airstrike ability is a charging attack that will spawn an airstrike blueprint. This triggers some cool VFX and fires identical heavy shots from the sky in a radius. These shots have all the upgrades of the heavy attack except for the ability to make more airstrikes. This makes it very powerful when mixed with the other abilities.