Cleaning House

Team Size: 16 (1 Producer, 4 Engineers, 3 Designers, 1 Audio Designer, 7 Artists) | Duration: 9 months

first person horror roguelite on Steam, where I built the modular level generation, inventory, and item systems as a system engineer on the capstone team.

Unreal Engine
Blueprint
Perforce

Project Overview

Cleaning House is my undergraduate capstone project, our reference game was SULFUR, and as a systems engineer I drew a lot of inspiration from its features. I’ve implemented data-driven item objects, inventory systems, and modular levels for the hotel’s room generation.


My Contribution:

Modular level generation
Inventory & Item Systems
Player Buffs


Modular Level Generation

Initial Plan

Our initial goal was to create a fully procedurally generated dungeon out of hotel rooms, so I took on building the base actor for procedural generation, drawing from REE ANIMATION

Base Room Actors

  • SceneComponents were very helpful for organizing the different components in a hierarchy
  • Used Arrow components to mark entry and exit points, so the player could always navigate through the level
  • Used an overlap box to detect when rooms intersected with each other

However, we ran into a few issues: we didn’t have enough props to decorate the rooms, not enough enemy variety yet, and the core game loop still needed tightening. To resolve this, we got together as a team and came up with the idea of spawning pre-defined level layouts within a hallway setting. This let us reuse the level layouts our designers had already created for the vertical slice.

Revised Plan Pre-defined Modular Level Generation

We initially wanted to build on the base class I had created for procedural generation, but we hit another issue: when designers tried to convert the actors placed in a level, the converted actors including enemies, ended up parented as children of static elements. In hindsight, this came down to a communication gap on my part. I should have explained the plan more clearly: that enemies would be spawned dynamically later, so the team could focus on placing static elements first. That experience taught me to set expectations about a system’s roadmap before handing it off to designers.

Instead of relying on the base actor, I tested and decided to load a whole level as a single room. This costs some performance, but it was a deliberate tradeoff. It removed the need for a base actor, so anyone could design a room in any shape they wanted, as long as the three requirements were met. Keeping each room as a separate level also made testing much easier, since we could test an individual room in a smaller, isolated scale.

Inventory & Item Systems

Before this project, I had no idea how a grid-style inventory system worked, so I saw it as a great challenge to take on. I learned a lot about the different input events in UE5 and how to handle them, drawing from Your Sandbox

I used Data Assets to make the item objects data-driven. One issue I ran into was that I had created different base classes depending on interaction behavior, and sometimes a base class itself would get used directly, which led to editor errors because its Data Asset wasn’t present. I later discovered a class setting that lets you mark a base class as Abstract, so it no longer shows up in the dropdown — a small fix that prevented the problem entirely.

Player Buffs

We initially didn’t intend to have a roguelike buff system, but after pivoting toward a more roguelite genre, we decided a buff system was needed. Luckily, I had already worked with a buff system on Berserker Girl, so I was able to add one fairly quickly. I paired with another engineer to make sure it connected cleanly with the existing player systems.


What I Learned

This was my first time building systems for a big team of sixteen people, and it taught me a lot beyond just writing code. The biggest lesson for me was realizing that I’m not only building systems for the players, but also for the people who use them to make the game. Designers use my systems to place content, and other engineers modify and build on top of them, so how easy a system is to understand and work with matters just as much as whether it runs well. The level generation handoff taught me in hard way. If I had explained things more clearly, I could have saved the team a lot of trouble. Going forward, I want to keep developing my soft skills and communication, and to design my systems with my teammates in mind, not just the final player.