CAGD 470 Group 1, Sprint 3
- Els Fouche
- Mar 4
- 5 min read
Kill Everything As Fast As Possible
Kill Everything As Fast As Possible is a 3D first-person boomer-shooter where you take control of a killer AI hell-bent on destroying every human in sight.
Project Credits:
Daniel Bocanegra-Ramos: Lead Designer
Jack Bradford: Producer
Dylan Brown: 3D Artist
Els S. Fouché: Lead Programmer, Level Designer
Sean Gibson: Programmer
Sophia Villenueve: 2D Artist
Rayen Yousfi: 3D Artist
Player Abilities
This sprint I was primarily working on new player abilities with a few bits of additional polishing thrown in. These changes and additions to the player's capabilities ranged from minor to fully transformative. The most inconsequential by far was modifying the player so that they're unable to shoot or use abilities during the '3, 2, 1' warmup period at the start of a level. The design idea here is that the player will have this time to scout and determine their route through the level. The level design will capitalize on this time by starting the player in a vantage point that allows them to make informed decisions about how to tackle the area.
Major Changes & Additions
The highly transformative changes outnumber the minor updates. First up, I added a shotgun with a fixed pellet pattern in the form of a five-pointed star. As the number of pellets increases the star pattern expands outwards, adding pellets radially. Every completion of the star pattern (five pellets) causes a new pattern to begin forming.
Fixed-Pattern Shotgun
I accomplished this effect simply by rotating the firing vector. This did involve hard-coding the pattern's rotation values which are then multiplied by the number of pellets mod 5, unfortunately. Ideally this system would be customizable to allow for any pellet pattern the designer might want - something to work on in the future.
After the shotgun, I created a modular grenade system. The base grenade handles the general functionality for being thrown, exploding, and for initiating the call to any grenade-specific effects a specific grenade type has. The first grenade type implemented was the ice grenade that explodes on contact and freezes enemies in place.
Freeze Grenade, No VFX
The general grenade logic was later reused for the rocket launcher projectile. While creating the rocket launcher I wanted to emulate this slow-motion footage of an FGM-148.
FGM-148 Javelin, Slow Motion Launch Footage
In-Game Rocket Launcher
I put some effort into capturing the idea of a heavy explosive warhead being launched just far enough from the user before it activates its primary rocket booster. I set it up so that the player's rocket launcher 'throws' the projectile forward in a gravity-affected arc before it begins traveling forward under its own power. Notably, the projectile does travel directly to the player's crosshair as they were positioned when the player pressed the fire key. Due to the power of the rocket launcher, I wanted to introduce some deliberate friction in its use that encourages player mastery. Of course, all of the parameters for the launcher are modifiable by the designer and the genre-defying initial launch may be scrapped in the future. Nonetheless, I'm pleased with how it turned out. I'm imagining it with a satisfying 'WHUMP' sound effect initially, followed shortly after by the 'whoosh' of the rocket catching.
Rocket Jumping
But of course, you can't have a rocket launcher in a game like this without rocket jumping. Currently the explosion doesn't damage the player - this is all but guaranteed to change soon but it hasn't yet been requested. Of note, the explosion can launch both players and enemies which is quite fun. I'm very happy with the fact that the warhead isn't armed until the rocket ignites as it increases the challenge of rocket jumping while also allowing for advanced techniques like double-explosion boosting.
The last highly-transformative ability that was added was the chain hook. This feature allows the player to attach to an enemy, quickly pulling them to it.
Chain Hook
Initially I approached this feature by attempting to predict the necessary velocity to launch them to the target. 'Predict projectile velocity' is a built-in feature of Unreal Engine; unfortunately, the prediction produced unexpected values that mostly just shot the player straight into the air. For simplicity's sake I decided to use 'Move Component To,' instead. This useful node is an asynchronous function that will move a component to a desired location over a desired time and can target the root component of an actor to move them. It does not sweep to the location which can cause problems.
Ordinarily, a sweep is used to prevent non-physics movement from penetrating through other objects. As such, it was necessary to manually assess potential collisions especially with regards to clipping through the floor. To prevent wall penetration the end destination is offset back towards the initiating actor by the thickness of the actor's capsule component radius. To prevent ground penetration a sphere cast is used to determine the offset upward to use to place the actor's feet on stable ground.
Minor Changes & Additions
Damaging Dash, v1
Damaging Dash, v2
First up, I added the ability for the player to become invulnerable for any length of time. I then tied this in to the player's dash ability, disabled their collision with enemies while dashing, and enabled the dash to do damage. This resulted in the 'deadly dash' feature that will be a powerup available to the player. Version 1 above shows the dash before the enemy was set up to receive damage from the ability. Version 2 shows the dash as it currently exists in-game, including the awesome blood particle effect created by Sean.
Game Flow
During this sprint I made a few minor changes to the game flow and updated the score system with a better-looking 'gained points' effect. As shown above in the Damaging Dash v2 video, gaining the in-game currency 'blood' is now much more visually prominent. I'd like to eventually make it so that the relative amount gained causes the size of the text to become larger and brighter.
Additionally, the player now correctly gains time when killing an enemy. I've yet to implement the same pop-up as the score counter, it will be added in future sprints.
Add Time to Timer, Debug
Gain Time on Kill
While implementing the ability to add time to the timer by killing enemies I realized my timer system needed to be refactored. In my initial haste to create the system I had placed the majority of the logic into the widget rather than the game state. This resulted in a non-negligible performance hit that was rectified when it was moved into the game state. I'm not yet certain what caused the performance hit. The logic is unchanged but running it in the widget seemed to incur extra overhead - I'm guessing something else must have been afoot. Hopefully I'll find the answer to that mystery, but either way the game state is a much more sensible location for the timer logic than the timer widget itself.
Regarding timing, some of our playtesters were having trouble timing their shots against moving targets due to the default mouse sensitivity for the game.
Aim Sensitivity Setting
Naturally, I implemented an aim sensitivity setting. I experimented with a logarithmic curve on the sensitivity slider to allow for a wider range of low-sensitivity values at the expense of a narrower band in the higher ranges but deemed this 'stupid as hell' and discarded the idea.
Last but not least, the player can now change weapons with the scroll wheel.
Weapon Selecting
Summary
This was an extremely feature-heavy sprint. I'm hopeful that, in the future, we'll have time to test each of these individually so that we can catch any potential problems that would be obfuscated by testing them at the same time.

Comments