top of page
myphoto.jpg

Carl Lindstedt

Game Programmer

  • LinkedIn
  • GitHub

Grim Intervention

Role: System programmer, UI programmer

Time: 7 weeks

Team: 9 people

Language: C++, Unreal Engine 5

  • GitHub

Embark on a thrilling journey through the treacherous Realm of Greed wielding your mighty scythe. Explore the procedurally generated labyrinth to find the key to the boss room. Try to get as many souls along the way before you win... or before you get defeated. 

My Contribution

During this project I worked on many different systems such as:

  • Random World Generation

  • Enemy Encounters

  • Powerup System

  • Meta & Save System

  • UI Implementations

Random World Generation

The world in Grim Intervention is procedurally generated. I based my world generation algorithm on the ideas behind Wave Function Collapse and made a system that generates a grid of tiles with different elevations. The generated tiles are sampled from a pool of pre-built ones. Each tile has information regarding what can generate next to it. For example, if a stair is generated, the tile at the top of the stair needs to then be one of the ones with higher elevation and the one at the bottom of the stair needs to be one of lower elevation.

Filtering what tiles can possibly generate at a sector of the grid.

Collapsing a sector of the grid and generating the tile.

Enemy Encounters

When the player enters a previously unexplored tile, depending on the type of tile, enemies might spawn. Each tile holds information about possible enemy spawn points and the amount of spawned enemies is determined by how many tiles the player has previously explored, making it scale gradually throughout the course of the game.

Spawning enemies.

Powerup System

One of the key features in Grim Intervention is the players ability to upgrade their stats as well as introduce new skills. Whenever the players clears an enemy encounter, there is chance for a chest to spawn. The chance for this to happen increases for every tile you clear that doesn't yeild a chest, before then resetting (it is also affected by the players LUCK stat).

When a chest is opened the player is presented with three different powerups. These may do anything from giving the player an increase of damage, to introducing entire new skills like auras or special dashes. When a powerup is picked the player immidiately gets the benefit and the game continues.

Some powerups may even unlock new lines of further powerups that were previously locked from the player. An example of this would be picking the damaging aura powerup. That would unlock the possibility of getting other powerups such as making your aura deal damage more frequently or making your aura gain damage everytime you hit someone with it.

Meta & Save System

Another big part of the game is its meta progression system. All souls you collect during your runs are transferred back to the menu where they can be used to buy permanent bonuses for your character. You can upgrade stats such as luck, movement speed, damage, dash distance, etc. These are then reflected in the game.

The amount of souls as well as all permanent upgrades are then saved to a save file on the local machine. The information in the save file is then used to set the correct values whenever the player re-opens the game. 

UI Implementations

I was also in charge of all UI implementations during this project. This meant I was tasked with implementing all menus, screenspace UI, mini map, etc. Out of these, the two most worked on systems were the UI for the mini map as well as the UI for the powerup selection screen.

For the minimap I had to work with creating and displaying UI elements through code. For example, the map shows whenever an enemy encounter starts, if a chest spawns, the player, etc. And it also shows where in the world this happens. This was done by registering these events with certain icons and translating their location coordinates to the correct location on the mini map. 

For the powerup selection screen I randomly select powerups from a list of possible ones before then creating objects of them. These objects are then passed to the selection screen and displayed with information regarding how they affect the player.

Learnings
  • Knowing when to stop. Working on the procedural generation for this project, I found myself very invested in the system and could easily have worked on it for the entire duration of the project. However, when it was "good enough" I had to move on and work on other things.

  • Stepping outside of my comfort zone. Since I mainly focus on system & UI programming it is easy to end up doing the same thing every project. Therefore, during this project I did work on other smaller things as well, like shaders for example.

The Team

Designers:

Anja Simatic

Fredrik Askebris

Elias Bernmarker

Anton Cederlund

Artists:

Fred Schütt

Natasha Mezheven

Viktoriia Rudkovska

Programmers:

Richard Hill

Carl Lindstedt

bottom of page