top of page
Monochrome screenshot of Job Hunt, my video game

Job Hunt

"JobHunt"  is a 1st-person arena shooter where players can knock back and juggle enemies using their weapons and tackle ability into combos. The goal is to clear as many waves as possible! This is a personal project I started during my 4th year at BUAS because I love fast-paced action games

I'm solo developing this project, designing and implementing everything myself while learning the Godot engine & GDScript. This means I'm developing weapons, enemies, 3Cs and any other system.

Project Goals

Learning a new engine

As a Game Designer, I wanted to learn a text-based scripting language so that I can utilize my skillset in different engines and gain a new hard skill with a language akin to python/Lua.

Research and apply design in action games

As a Game Designer, I wanted to improve my design skills by making a fast-paced shooter so that I could gain experience in developing better user experiences and holistic features.

Juggle mechanics in an FPS

I wanted the players to be able to juggle enemies in a stylish way utilizing different weapons and abilities to kill them.

For the 3C's in this game, I was inspired by the movement of "Quake" & "Ultrakill". I used a Godot add-on that aims to simulate the character movement from the GoldSrc engine, which itself is a modified version of the Quake engine. I tweaked the values for movement, jumping and gravity. On top of that, I implemented a tackle ability and weapons with their own parameters. The goal was to create a fast and responsive player character through which the player could kill enemies in quick succesion by comboing enemies using their moveset.

3Cs Design

Knockback mechanics

The 1st draft for this project was a shooter where the player can juggle enemies and bounce them from the wall. From this I started ideating different mechanics and planning a move-set that provides multiple options and string into each other.

This resulted in abilities that enable the player to knockback the enemy.  This is how I intended to give the player a sense of autonomy by attacking the enemies with knockback, which stuns them, put them out of commision for a short period and gives the player space.

  • The tackle launches an enemy back. As a launcher, you can get enemies in air which will stun them.

  • ​The revolver suspends enemies in the air, stunning enemies and giving the player time to breathe.

  • The shotgun delivers heavy knockback & damage, intended to deliver the final blow.

Click the image above to view it in full. Click the arrows on the sides to view other images.

Click the thumbnail above to view the video.

Shotgun Ammo

In early playtests, I found that the shotgun became the meta strategy because it felt more powerful and killed enemies faster by just shooting at them. This meant players were not using the tackle or revolver to use their knockback abilities to their full effect to kill the enemies in the room. 

To solve that, I decided to make shotgun ammo a resource the player should not spend haphazardly. If the player fires all their shells and run out, they will be left with weaker options. This means players that use their shotgun more effectively, won't run out of ammo as easily, still feel powerful and make use of varying abilities.

Refill on Tackle

With the addition of shotgun ammo as a resource, I made it so that you gain it by tackling enemies. This gives the player a reward when using the tackle, motivating them to repeat this behaviour of tackling an enemy to then juggle them. 

Enemy Design

The enemies are just as important to an FPS as the weapons. As a challenge, enemies force the player to make use of their skill and abilities to overcome them and progress further in the game. 
In this project, I made 3 enemy types while scripting architecture for AI behaviour, wave spawning and an encounter manager to control the pacing and events in-game.

Enemy Design Brainstorming

To start off designing enemies, I first try to figure out what kind of challenge they make for the player.

I start by making a list of the player verbs, in-game abilities and player goals in the game. I then go through the list and brainstorm enemies that could challenge these skills or prevent the player from reaching their goals.

Click the image to view in full.
Click the arrows on the sides to view more.

Enemy Behaviour

In the end, the game had 3 enemy types the player could fight against. To make these enemies behave as I intended, I built several systems using GDScript that I can re-use and scale to make more game content.

Finite State Machine

I developed a Finite State Machine system for AI behaviour that I can add as a component to enemy characters. 

The state manager would look at it's attached components for states. Once it has made a list of available states, it will search for the assigned start state and run its logic. ​

This was the best option since I did not plan to have intelligent AI. They don't need to plan ahead or consider multiple factors in the way that Behaviour trees or HTN planning allows for. 

This let me swiftly code enemy behaviour with little complexity by attaching components and keeping the code organized within every unique state.

A diagram of Shield Enemy state machine.

Click the image to view in full.

Click the thumbnail above to view the video.

Enemy Encounter Manager

I developed an encounter manager to control the events in the game after the player has killed all enemies assigned to the encounter.

​The manager can be placed in the level and a developer can pick which enemies are part of that encounter. The developer should also select which object reacts to the signal of the manager when all enemies have been killed.

This encounter manager can trigger events such as doors opening or another wave of enemies to spawn into the room. With that, the pacing of the game and events can be gated behind a combat encounter.

Wave Spawner

To have the player survive in a wave-based arena shooter, I needed a wave spawner that increases with difficulty over the course of the game.

I developed the spawner to have a point pool every wave and each enemy type has a point value assigned to them. Every wave, this pool grows bigger, allowing more enemies to be spawned in the room and increasing the difficulty.

 

The point pool is calculated using a sin wave to increase the difficulty in a non-linear way. 

Players were now being challenged with more enemies further in their session, requiring prioritization of enemies and knocking them out the windows to eliminate them quicker.

Graph of wave spawner point pool.

In wave 5 (x-axis), there are 6 points (y-axis) available in the pool.

Click the image to view in full.

Click the thumbnail above to view the video.

Enemy Types

By using the player's skills and goals as a source of inspiration, I designed and developed 3 enemies for this project. Each of these enemies play around the core player mechanic of tackling enemies and the player's dexterity/movement. They are also made to be vulnerable when in the air to allow the player to juggle them.

Shield Enemy

This enemy has covered himself at the front with a bouncy shield. If the player gets hit by this enemy as they leap towards them, the player will be knocked back instead and receive damage.

But, with no shields on his back, the player has to position themself in the arena and tackle them from behind.

This constrains the player from tackling without repercussions use the space around them more.

Click the thumbnail above to view the video.

Click the thumbnail above to view the video.

Rocket Enemy

This enemy will use the 2 stone pillars in their hands to lock themselves in the ground and take aim with the rocket turret on their head. After charging it, they will fire a rocket at the player that deals a ton of AOE damage.

If the player tackles the enemy while they're charging, they will knock them out of the ground and stop the charge. 

If the player is brave enough, they can juggle the rocket just like any enemy knock it back towards wherever they want, using the AOE damage.

Players have to either close the distance to tackle the enemy out of their charge or run and dodge the rocket. If the player has good aim, they can parry the rocket.

Hedgehog Enemy

This enemy is covered in barbed wire and deals damage on contact with the player This means the tackle is a risky move, but will still give you shotgun ammo. 

These enemies jump high in the air and are very lightweight. The hang time they have gives the player a lot of time to juggle them.

This tests the player's basic aiming and shooting skills while staying away from the spaces it occupies in the fear of getting damaged.

Click the thumbnail above to view the video.

Additional Work

Since this was a solo project, I worked on a lot more systems and content for the project that I want to adress and highlight. While they don't typically fall under the responsibility of a Technical Game Designer, I want to share the experience I gained during this project.

Sound Design

During this project, I wanted to design the combat sound effects to be punchy and bass heavy, inspired by animes such as Jojo's Bizarre Adventure and Fire Force. To achieve this, I contacted a fellow student that specializes in audio design for advice and guidance.

He showed me how to use Reaper, a digital audio workstation (DAW) to apply FXs to sounds that I found from a sound effect library. After making a list of what I needed, I spent my time trimming, editing and mixing the audio for gameplay effects such as the weapons, characters jumping and more.

Menu Design

When it became time to implement a menu, I wanted to have a visual look that fit the game in its current state. Since the environment of the room was built out of concrete textures, I investigated a graphic design art style that matched the brutalist aesthetic. I found one and analyzed it to then make a design for the main menu.

I found a compact font online I could use and added scrolling text to add some motion on the screen. I first made a design in Figma to ask for feedback and then recreated it in Godot.

Main Menu design implemented in Godot

Game Feel

To create strong and satisfying game feel, I worked on the feedback and game juice for combat. I wanted every player action to feel like it had a strong impact.I made different animations for the weapons such as:

  • Weapon bobbing while running to indicate motion.

  • Weapon and camera lean when moving left or right.

  • Shoot and equip animations as feedback to the player's actions.

  • Weapon animations when the player uses their tackle ability as visual feedback for their action.

Besides that, I made punchy audio FXs using Reaper and implemented them, utilized screenshake when the player fires their weapons or is hit and VFX for multiple gameplay mechanics.

Documentation

Despite doing this project by myself, I wrote documentation on the plugins I was utilizing for this project, made research documents and had Kanban boards for tasks I had to by using Notion. I had 3 Kanban boards:

  1. Task list - Making UI elements, developing the wave system, implementing iterations, etc.

  2. Bug list - Audio doesn't play when intended, game crashes, unexpected enemy behaviour.

  3. Audio list - Any sound fx I have planned that needs to be sourced, edited and implemented.

Overview of thegame wiki on Notion.

Overview of the main game wiki page.

Click the image to view in full.

Click the image to view in full.
Click the arrows on the sides to view more.

Takeaways

Achievements

  • This is the first game project I have developed by myself and I released it online.

  • I have gotten comfortable and experienced with the Godot engine and GDScript.

  • ​My audio experience helped me to communicate with the audio designer at Vertigo Games during my internship.

  • ​I designed enemies that challenge the player's combat skills while creating diverse situations.

  • ​I was well organized by using Kanban boards and documenting my design/tech on Notion & Miro.

Challenges

  • I was learning a new engine, which influenced the speed at which I could develop features.

  • Working solo, I had to spend my time efficiently on the right tasks and prioritize them.

  • I had a small scope on weapons and player abilities working solo, so I had limited combat options available for the player.

  • The project had to be rescoped and redesigned when the original plan became out of reach.

Learnings

  • My scripting experience with Unreal's blueprints translates to different engines, as I can use similar logic.

  • I know better how to use visuals and audio to provide feedback and create engagement.

  • Enemy Design can be a challenging yet rewarding discipline, by creating "intelligent" obstacles for the player.

JH_Gameplay5_1.1.5.jpg

Job Hunt is available on Itch.io

bottom of page