Student at Washington University in St. Louis

The Curse Of Brookings Hall

A 3D horror puzzle game set in WashU’s Brookings Hall, where players uncover secrets through exploration and solving physical puzzles.

ROLE

Lead Game Developer, Level Designer

Software Used

Unity, Blender, Maya, Adobe Premiere Pro

Time

Jan 2025 - May 2025

ROLE

Lead Game Developer, Level Designer

Software Used

Unity, Blender, Maya, Adobe Premiere Pro

Time

Jan 2025 - May 2025

About the Game

Set in a lab under Washington University's iconic Brookings Hall. Here, players use text based clues and solve puzzles to demystify the lab's past. As players explore the lab, however, they are kept on edge by the eerily colored camera filters, interactive puzzles and decayed environment.

Phone showing Bloomy UI
Phone showing Bloomy UI
Tablet showing Bloomy UI
Tablet showing Bloomy UI
Laptop showing Bloomy UI
Laptop showing Bloomy UI

Design Goals

The goal was to create atmospheric and information feedback loops to keep players engaged. Before building in Unity, The map and interaction flow was first sketched on paper as shown below, planning out each room and clue placements. This visualized how players would move through the space and allowed me to create a invisible guide that leads player towards the ending.

Laptop showing Bloomy UI
Laptop showing Bloomy UI
Tablet showing Bloomy UI
Tablet showing Bloomy UI
Laptop showing Bloomy UI
Laptop showing Bloomy UI

Technical Goals

The enemy was created in Mixamo, which automatically generated a full skeletal to the 3D model. The NavMeshAgent handles navigation between random patrol points set on the map, switching to idle for randomized intervals before walking again. A raycast projects forward from the enemy’s chest; if it hits the player within a set distance, the AI cancels patrol and begins chasing, switching animation states dynamically to sprint.


When the enemy reaches the player, it triggers the jumpscare sequence: swapping to a high priority Cinemachine camera at a preset point, enabling a flashing light, playing audio, and switching the Animator to a jumpscare trigger. After a short delay, the scene transitions to a death screen. Coroutines control idle and chase durations, making behavior timing simple. This system created a believable patrol/chase loop that's easily tunable through inspector fields for speed, distances, and timing.

The enemy was created in Mixamo, which automatically generated a full skeletal to the 3D model. The NavMeshAgent handles navigation between random patrol points set on the map, switching to idle for randomized intervals before walking again. A raycast projects forward from the enemy’s chest; if it hits the player within a set distance, the AI cancels patrol and begins chasing, switching animation states dynamically to sprint.

When the enemy reaches the player, it triggers the jumpscare sequence: swapping to a high priority Cinemachine camera at a preset point, enabling a flashing light, playing audio, and switching the Animator to a jumpscare trigger. After a short delay, the scene transitions to a death screen. Coroutines control idle and chase durations, making behavior timing simple. This system created a believable patrol/chase loop that's easily tunable through inspector fields for speed, distances, and timing.

Challenges

The biggest challenge for this project was communication between team members. I learned the importance of communication and progress checks when working on larger projects for a long duration.

On the technical side, one of my main challenges was learning how to handle lighting in Unity. I experimented with both baked and real time lighting. One can be time consuming to iterate on, while the other is very performance heavy.