Questweavers

A mist-filled 3D stealth game level design project


— PROJECT NAME

Questweavers


— ROLE

Programming

Game Design

Tech Art


— DATE

Spring, 2026

Using the Rifts TTRPG for setting inspiration, we designed a stealth action-adventure game with a novel “mist” mechanic, and focused on creating a single level that would be set near the start of the game.


On this team of 6, my roles involved designing the game, enemies, and level layout, programming the mist mechanics, game flow, player controls, and tooling, creating tech art, and playtesting and iterating everything we made. To read our development blog, click here.

We were tasked with looking through the Rifts TTRPG source books as inspiration (for educational purposes only), finding something that inspired us, and designing a sliver of a game set there. We were drawn to the Rifts China setting, which is surrounded by a thick wall of mist and filled with demons. Based on this, we created a stealth / horror / adventure game where the player takes on the role of a fugitive escaping through the mist.

The Rifts China source book

For player experience goals, we focused on tension, mystery, and eventual mastery. We decided to have no combat; this increased the feeling of tension and let us spend more time exploring how mist could be used as an interesting mechanic. We designed our levels and abilities around a simple game loop:

Some Technical Details

The mist is the most important mechanic and environmental feature in our game world, and it serves as both tool and obstacle. Mist blocks sight and muffles sound, making it harder for the player to sense enemies, but also harder for the enemies to sense the player. It's useful for hiding and stealth, but also slows movement, making it harder to escape if you're seen.

Mist – a benefit and a hinderance

Player abilities – creating mist and putting out fires, removing mist, throwing firecrackers

We used the “Volumetric Fog & Mist 2” package for mist rendering, using its fog-of-war feature, we were able to paint mist into our level exactly where we wanted it, and also dynamically create or destroy mist. This works by writing to a texture that gets sampled and multiplied with the mist density. Reading that texture, we can determine how much mist surrounds any object, which we use for dynamically muffling audio. Specifically, all sounds are put through a low pass filter modulated by the player’s mist density, and every sound produced by the player or enemies has its volume and range reduced based on the mist density.


We also use this system to affect enemies' detection of the player. Our basic guard enemy can hear the player’s footsteps; louder footsteps (such as when falling or sprinting) can be heard from farther away. Upon detecting the player, enemies scream to alert each other. The range of this scream is also reduced if the enemy is in mist, giving the player another avenue of skill expression.


The mist clearly blocks vision for the player, but it also blocks vision for the enemies. We raymarch from an enemy to the player to determine the amount of mist between them. When there’s less mist, the enemies can see the player more easily.


I made useful editor-only gizmos to help us visualize enemy sense range and help us with their placement.

A gizmo to visualize enemy line of sight and aggro range

Enemies themselves are implemented using a Goal Oriented Action Planning approach. Each enemy has a set of senses (such as vision, hearing, and proximity), a set of goals (such as patrol, investigate noise, and attack the player), and a set of actions they can take (such as moving, melee attacking, burst attacking, and re-hiding). We found this approach more flexible than using state machines, since it made it easy to swap out and experiment with different senses, movement patterns, and attacks.

Analytics

Analytics and data collection were incredibly important to making our level as good as it could be. Through a combination of in-game analytics logging, screen and face recording, player surveys, and observer note-taking, I was able to identify and remedy pain points in the level, redesign areas where navigation was unclear, and tune enemy behavior. With more time, there’s a lot more we could improve using this data.

Some analytics events I collected

An analytics visualization of player paths through an earlier version of the level

Level Layouts

These images show our level layout as it progressed through the project. We started with testing basic interactions with enemies and the mist, then gray boxing, adding more environmental art, building out more parts of the level, and introducing new abilities.

We made many iterations to improve the level’s legibility and flow. Notably, I focused on making clearer points of interest and using lighting and sight lines to help players understand where to go next. Here are some before and after pictures of section 1-1 of the level.

Difficulty Balancing

One thing we struggled with was getting the difficulty right. Our playtesters had vastly different experience levels with both stealth games and games in general. One thing I realized near the end of the project was that players also had different ideas about what the game was and should be. They broadly fell into two categories. Some player believed this to be a puzzle game, where they should be able to think through a solution and then execute it. They wanted clear feedback that told them when they were safe. Other players believed this to be a horror game, and wanted more unpredictability. They wanted to feel less safe and more on edge. When addressing feedback from players it was important for us to understand what they were hoping for out of the game, and if that aligned with our own vision for the game.