top of page


This game was made in our own engine Wondrous Engine that was made at The Game Assembly school.

The gameplay elements is taken from Doom Eternal which is a fast pace combat game and the graphic style is from Subnautica.

I made most of the gameplay mechanics in this game. Player movement, weapons, bullets and enemy attack behaviours.

Video shows the trailer of our seventh game project in the school The Game Assembly.

FPS Controller

So in this game I was in charge of making the player movement, which includes using jetpack, jumping, sprinting and crouching.

So my idea was to have a component that carry all the information of all the different velocities and then we use a system that grabs all player entities which updates every movement.

In the video you can see the movement in action. We jump, crouch, sprints and uses a jetpack. The jetpack in our game we decided to make it more like a double jump. So it refreshes to full when you are on the ground and you can use it straight away again.

Video showcase of the jumping, crouching, jetpack and sprinting mechanics in the game.

The character controller is based in a Player System. In which we add everything to make the player move. In it we add animations, weapons and a controller component to make everything move. 


The Controller Component carries all the necessary information that we need for manipulating the player. I use small structs to keep this information, JumpSettings, SprintSettings, CrouchSettings etc.

Header File for
Controller Component

Crouch Settings


(Hover for more code)

Then I added a ControllerSystem where all the logic comes in place. In the example picture of Controller System Update Loop, here we can see we get all the player entities (if we have more than one player we update them as well) and do all the logic to make them use Jetpack, Jump, Sprint and Crouch.

I do a lot of collisions checks for objects above and below you. Above to reset velocities if we hit something, below the player is for example if the player can sprint or not.

Controller System
Update Loop

Crouch Update


(Hover for more code)

Weapon & Bullet System

So in this game our weapon has two slots. First one is just regular bullets and the second slot uses special bullets, to get new special bullets you have to suck in slimes (enemies).

For the controllers we use LMB (Shooting), RMB (Sucks Enemies) and Mouse Scroll (Changing Weapons).

Weapon Component

Weapon Settings


(Hover for more code)


(Hover for more code)

For creating the weapons I thought of doing similar ways that our player has, in which we create a component that we add to the player and then with our entity system we create a system to grab all bullets to make them move accordingly.

WeaponComponent holds all the information we need for cooldowns, raycast lengths and offsets. Our weapon is inside an array with the struct WeaponSettings. These weapon settings is used when shooting and get changed whenever we sucks in a new enemy into the gun.

Our bullets are using PhysX API and most of our bullets are physical, in which you can see the bullet flying out. So to not get them affected by physics I needed to set them to kinematic and then have a system shooting them out at a velocity in the direction the weapon face in.

Plasma JSON

Weapon Tool (IMGUI)


(Hover for more code)


(Hover for more code)

In this project we use JSON files to read all the weapon data. In it we store all weapon stats that is needed for causing damage and movement. We read the JSON file at startup and save everything inside a map container so we don't do any more unnecessary reading from JSON files since it is quite heavy to read.

Then I created a weapon tool in which we use IMGUI to render everything in-game. The tool is used for making all the changes needed and then you can save all the changes made using a save button.

Rocket Settings on the Weapon Tool (IMGUI)

You can see mechanics of sucking the slimes and getting different weapons. Plasma weapon (blue enemy) and a shotgun weapon (pink enemy).

bottom of page