August 15, 2022 - August 22, 2022 | Godot 3.5| Solo developer
Game designer, Programmer, Pixel Artist
Parasitic Breach is a top-down action shooter where you play as a parasite who jumps from host to host on a space station. Alone, you're weak, but when you infect one of the hostile crew members on board, you gain control of their body and weapon they possess. Use this advantage to shoot other crew members until it's time to infect a new host to hopefully gain control of the station!
Parasitic Breach was a solo project made in one week for the SGDA Summer Game Jam 2022 where the theme was "game over isn't the end." Of the 16 entries in the jam, Parasitic Breach placed 2nd overall. The game can be played here.
The concept of being a parasite that jumps between hosts was inspired by the Kirby series' copy abilities, but instead of defeating enemies to get their powers, you would instead be defeated by enemies to get their powers. The system that allows the player to quickly jump between bodies was actually deceptively simple to make. The player's state is stored as an integer, with each integer representing a particular enemy. When a player loses all their health, a parasite prefab is spawned right on top of the current host's texture and is allowed to lunge forward at a new host. If the parasite prefab collides with an enemy's hitbox, the player game object is set to the position of the enemy, the player's state is updated, and all associated animations play.
* Player seen infecting a new host
In order to believably convey the feeling of having to fight your way through waves of ship members, I needed to give the enemies of the game challenging AI that challenges the player and isn't a bumbling entity whose AI pathfinding gets stuck running into a wall. My initial idea was to have the enemies always know the location of the player and linearly move towards the direction of the player. As stated before, the issue this presented is that the enemies would get caught running into a wall which was easy to exploit and broke the immersion of having sentient entities pursuing you. The secondary approach was to use A* Pathfinding to find a best path from the enemy to the player that updates in real time. The issue here was that the map would have to be represented by a grid system that the enemy would follow, and this, in practice, looked stiff and rigid.
The approach I implemented involved sending four raycasts out into the four cardinal directions, and every frame rotate the rays around the enemy in a motion similar to blades on a helicopter. Then, if a collision is detected, apply a force onto the enemy that pushes them away from the wall, giving it a small nudge to continue pursuing the player. In practice, this implementation give the enemy movement the fluid motion that would be seen with always following the player's position, but with the precision to avoid easily being caught on a wall.
* Raycasts are shown orbiting the enemy
* Raycast collisions guide the enemy to a path towards the player
From there, I tweaked the enemy behaviors slightly to match what weapons they used. For the pistol enemy, the goal is to have an enemy that wants to approach the player, but maintain distance to avoid being in range, and when the player closes the distance, the pistol enemy moves back to stay out of range.
* The Pistol Enemy likes to keep its distance
For the shotgun enemy, the goal is to get close to the player to deal its damage, but then immediately backpedals to avoid staying within range of the player. After a certain amount of distance covered, the enemy reengages to take another shot.
* The Shotgun Enemy get close then retreats
For the saber enemy, the goal is similar to the shotgun enemy, but spends considerably less time backpedaling to avoid being too out of range from the player.
* The Saber Enemy likes to get up close and personal
In short, I feel like I have made a solid lineup of enemies that challenges the player in different ways to keep things fresh and interesting.
* All enemy AI patterns in action!
This was the first ambitious project I took on by myself. The game jam being a week long allowed me to attempt a larger scope and strive to upkeep a timeteble of work that needed to be done. I definitely learned a lot about Godot with this project further cementing its status as a game engine I'm the most familiar with. Utilizing more advanced coding topics such as enemy AI and state machines has given me a greater understanding of programming in games as a whole. If I could go back in time knowing what I know now, I would utilize inheritance and reusable code principles. A lot of my project consist of scripts that have a lot of overlap between them, but not making base classes for entities to inherit from really hinder the readability of the codebase.
Another thing I learned was how much crunch and overworking can affect oneself in very negative ways. I definitely didn't get much sleep that week looking back, and had I known the problem solving and time management skills like I do now, I would've had a lot healthier development cycle.