
Game
Miasma Ashlung
I took a Blueprint prototype, rebuilt it in C++, and led the call that saved the project when procedural level generation started costing us more than it returned.
- C++
- Blueprints
- AI Perception
- EQS
- Niagara
- 9Weeks, concept to submission
- Tech LeadArchitecture and Git workflow
- GradEX2025 Showcase entry
Miasma Ashlung is an extraction horror game built by a student team in nine weeks. You go in, you take what you can carry, and you get out before the Miasma finds you. I was technical lead, which meant I owned the C++ architecture, the repository and the decisions about what we could actually finish.
Setting the technical foundation
I set up the GitHub repository and the branching workflow on day one, then ported the Blueprint prototype to C++. Blueprints were fine for proving the idea, but with five people committing daily they were about to become a merge problem we could not afford. Moving the core systems into C++ gave us readable diffs and let the designers keep working in Blueprint on top of a stable base.
Cutting procedural generation
We planned procedurally generated levels. Four weeks in, the generator was producing layouts that were technically valid and completely unplayable, and every fix widened the surface area of what could break. I made the call to drop it and move to hand built levels.
That decision is the reason the game shipped. It cost us a feature and bought back three weeks of stability, and it moved the horror from an emergent accident into something the level designers could actually author.
Enemy AI
The enemy runs on Unreal’s AI Perception system, combining sight with a hearing channel that the rest of the game can drive directly. Anything in the world can call Make Noise, so a thrown potion, a dropped object or a player moving too quickly all feed the same investigation behaviour.
Pairing perception with the Environment Query System let the enemy pick where to search rather than walking a fixed patrol. It reads the space, scores candidate positions against distance and reachability, and commits. The result is an enemy that appears to be looking for you, which is a very different feeling from one that happens to be nearby.
The Miasma
The Miasma is the hazard the game is named after, and it needed to be a system rather than a set piece. I rewrote its material to get the pulsing, veined look the art direction was asking for, then built the spreading behaviour on top of the same pathfinding and query data the AI uses, so it moves over surfaces in a way that reads as deliberate.
I also built physics based potion throwing, which is the player’s main tool for manipulating both the Miasma and the enemy, and wired the audio cues so that the noise a potion makes on landing is the same signal the enemy reacts to.
Holding the frame budget
I profiled the game with Unreal Insights through the last three weeks. Physics, the audio reactive AI and the Niagara effects were all competing for the same budget, and the profiler is the only way to find out which of them is actually costing you the frame. Reducing trace frequency and scheduling the expensive queries on timers rather than every tick recovered most of what we needed.
Breakdown
