Four examples of individual modules and four examples of procedurally generated dungeons.
Before After
A demonstration of the modular kit I built.
The Blueprint script for handling spawning of enemy waves in each module.

Design

At the start of the project, our group met and decided on our concept for the rogue-like jam. We landed on a fantasy game in which the player is a wizard that advances their existing roster of spells with new modifiers as they go.

Due to time and workload constraints, the game only features a single "layer" and no boss fight. The player wins by navigating to the end of the procedurally generated level.

You can see our original design plans in a spreadsheet here.

Modular Level Design

Due to the spacial limitations of rogue-likes, it was especially convenient to utilize a modular kit in creating a large number of rooms with consistent dimensions. Eager to work with UE5's modeling mode, I created the core modular kit, myself, in-engine. An additional asset-store pack was utilized for smaller props and characters.

This core modular kit included pieces representing 2x2 meter spaces of varying heights. The origins of the static meshes were set to facilitate the quickest possible usage during level design.

Level design work involved creating a series of room modules with hazards and enemy spawn points. Each room was designed to be entered from either side in order to squeeze more variation from less rooms. Due to the large programming workload on this project, a dynamic system for handling occluding walls did not exist and see-through variations of each modular piece were modeled, along with manually created, rotated room variations.

Enemies spawn in a number of waves and in a quantity depending on the room's size. Smaller rooms get single waves of few enemies while larger rooms get two larger waves. In larger rooms, the first waves included spawns towards the center of the rooms, where the player would not be in at the start, while second waves spawned towards the exits, assuming that the player had moved into the center space while dodging enemies in the first wave.

Rooms feature additional hazards in the form of death pits and swinging blades. Swinging blades create a rhythmic timing challenge as they are placed on thin platforms the player must dodge through while being chased by enemies.

Rooms with death pits feature small platforms the player can dodge boost over to, like stepping stones. Rooms featuring these also heavily featured ranged enemies in order to discourage players from camping on these islands where melee enemies could not reach.

In the end, I created 16 rooms of unique dimension, each featuring several variations that were rotated and featured different door positions, enemy spawns, set dressing, up to a total of 61 rooms.

Blueprint Scripting

I used UE5's BP system for implementing a number of features into the game, including module sequencing, enemies, hazards, and UI.

I created several modular Actor BPs for handling the module system, in which each module had a manager that would communicate with its entrance/exit doors and enemy spawns, in order to facilitate multiple waves of enemies. The tool was designed in a way that new room modules can be created with functioning doors and waves by someone with no programming knowledge.

I scripted two of the enemy types that appear in the game, the heavy and the archer. I utilized UE5's Behavior Trees in tandem with BP scripting in their implementation. The archer enemy maintains a distance with the player from which they fire arrows, while the heavy will slowly stomp towards the player and throw a teleport spell towards them in order to close distance.

I handled the implementation of the main menu, the pause menu, the restart menu, and the player health bar.