Test Subject 901

Test Subject 901

available on SteamLogo9

Trudge through haunting halls and desolate rooms, teleport through the darkness and hide in the shadows as you plan your escape. Feel your heart race as your doom looms ever closer. Find a way out before your fate is sealed.
Test Subject 901 was developed over 9 months and is available to play on Steam for all VR headsets. I lead the development of the game as the team’s programmer, art was done by Ryan Gao with the help of Akhil Majagaonkar, and Connor Pannico contributed as a game designer during his internship with the studio.
Behind the scenes coverage can be found on Autodesk’s website.


The main programming language I used to code the game.


Used along with C++ with developing the game

Unreal Engine

The engine used.

Oculus Rift

Used the Rift CV1 and Rift S to integrate support for them.

Oculus Touch

Used for motion controller support with the Rift.

HTC Vive

Used the Vive to integrate OpenVR support.

Acer Mixed Reality

Used the Acer headset to integrate Windows Mixed Reality support.


Used SVN for version control along with Unreal’s plugin.

Visual Studio

The IDE used with Unreal Engine.

UE4 Materials

Worked with Unreal’s materials to create dynamic materials.


Used to manage all tasks.


Used to create and modify textures.


Used for pseudo code and problem solving.


Used to modify and mash together sound effects.

Vegas Pro

Used to edit videos used in-game.

Google Sheets

Used to manage pre-release steam keys.


Behavior Trees with C++

2021-05-01 10_43_15-Window

In Test Subject 901, there’s only one enemy that chases the player so I put most of my time into developing its AI. For this game I used behavior trees for the creature’s AI which let me create a state machine visually. To organize things I ended up creating multiple trees based on each state, every frame the selector would check the current state and then go into its respective tree. The main states the creature had were: avoiding, roaming, distracted, and hostile.

Avoiding State
I wanted to give the player a chance to grasp their surroundings and hide once they finished the tutorial so I added in a state where the creature would actively avoid being in sight of the player. The creature would still be audible from the distance letting players know that there’s something in the dark but it wouldn’t attack right away unless you actively tried to run towards it. To find points far enough from the player I created a quick C++ node that would do a radial scan around the creature until a point far enough from the player was found.
Roaming State
After a certain amount of time has passed the creature would switch to a roaming state where it would roam around the same room as the player. From time to time it would stop while the crystals on its back lit up, this gave players a chance to clearly see where the creature was before it starts moving again in the dark.
Distracted State
Players were given the ability to throw around objects to distract the creature. When the creature hears a loud noise it runs directly towards it temporarily and then goes back to roaming. This gives players a chance to search in areas that the creature is looming around or to open doors that are being blocked.
Hostile State
Once the creature captures the player within sight or hears them the state switches to hostile, from here the creature lights up and stares directly at the player notifying them that they’ve been spotted. The AI then gives the player a few seconds to hide again and then checks again if they’re visible. If they’re hidden then the state goes back to roaming and the loop continues. But if they failed to hide then the player lost the game and it’s time for a final scare before they get to try again. At this point the creature switches to attack mode.

Controlled Light & Sound

In Test Subject we wanted to play around a lot with the darkness and sounds to scare the player. When the creature goes into attack mode it doesn’t just jump right at the player but goes through various states depending on how the player acts. At the start of attack mode the creature sends out an event that notifies all lights surrounding it to turn off, at the same time the lights and emissive materials on the creature turn off as well.
Ryan Gao, the 3D artist, designed the environment with tons of emissive materials so the creature would still visible as a silhouette even if all the lights were off. This instilled the sense that the creature was somewhere near but didn’t let the player exactly track down where it was easily. On top of that I made it so sounds of objects falling and smashing played at random intervals around the player. Footsteps sounds would still be heard directly from the creature so you can hear it coming closer but when combined with random sounds the player would would start doubting their senses and start looking around in a panic. As a final touch I added in a constant heartbeat sound for the player.

AI That Plays with Expectations


When the creature is finally close enough, the way the player is attacked changes. For example, if the player tries looking away from the silhouette of the creature then it’ll disappear momentarily, giving the the player false sense of security, and then picks a random way of scaring the player.
One way was waiting for the player to turn their head, once they turn fast enough the creature would suddenly appear in-sight and eat them. This only activates after a certain speed because the player’s sight is obscured when turning quickly.
For another attack, the creature appears after the player teleports a certain amount of times. It’s simple but when combined with the possibility of the other attack it makes it hard to predict when the jump scare will come. A ton of other cases were also taken into consideration to cover for all the freedom players had within VR.









  • Hyper Psychic Gauntlets