Project Exhibited is a first-person stealth game set in the '60 with a Maltese palazzo as a location. The game revolves around playing as a thief to steal an artifact from a private art collection. I was one of the two AI programmers for this project with a supporting role in shaping the design of the AI apart from developing it. I also took care of a lot of bug-fixing. The game was made in a multidisciplinary team of 30~33 people using both C++ and blueprints. The game has been released on Steam.
AI - Perception System
For this project, we needed an AI capable of simulating multiple senses (audio, vision) and we decided to implement a custom perception system for it, not using the built-in tools Unreal provided, to have a better degree of control over the information passed.
I was responsible for the implementation of both algorithms. For the vision, the degree of awareness of the AI takes into account different variables, such as the current distance of the player, the state of the player (crouched, walking, running), and the current position of the player compared to the central focus of the vision (a 15' cone from the point the AI is looking at). All these variables were accessible and tweakable by our AI designer and, for the distance, an exponential curve was provided as a variable, to have the awareness of the AI ramping up the more the player is close to it.
For the audio, every sound emitted has an area and an intensity that can be tweaked. If the AI is in the area of the audio, the information is passed and the audio attenuation is performed over pathfinding distance.
AI - Cameras
Apart from human AI, in the game, there are also cameras that threaten the player.
The cameras were developed as state machine AIs able to rotate, spot the player and stunned guard, and being disabled.
They were developed in such a way as for handling the number of states listed above there was no need for a behavior tree.
In the case of player and stunned AI spotted, the cameras executed specific behaviors of triggering reactions from the close guards, such as attracting them to the location of interest and then send them to scout the area. I was responsible for the development of this logic, which, however, is also partially handled inside the AI director and inside the behavior tree of the human AI.
Audio - Custom Occlusion/Obstruction Algorithm
One of the crucial aspects of a stealth game is to make sure the player is hearing the audio queues that are relevant to him.
To do so I developed a custom algorithm for calculating the audio occlusion and obstruction that take inspiration from the following video.
The intensity of the audio queue is attenuated over pathfinding distance from the emitter to simulate occlusion and made null as soon as this value is greater than the area of influence of the sound (specified with a variable by designers).
For the obstruction as soon as an obstacle is found on the path, additional lines are ray cast and based on the number of lines blocked, an additional reduction of the value is performed. After the calculation is completed and the intensity is adjusted, the position from which the audio source is played is moved to the closest open space to the player to also simulate better right and left spatialization of the sound.
AI - Chasing Communication
To make the guards more challenging and a better threat for the player, the guards can communicate and alert each other if specific criteria are met.
The first guard that spots the player can notify close guard in a certain range. A bark is played to notify the player of being spotted and an animation is played to give the player the time to react.
During the chasing, guards send a message to the close by guards every three seconds. If any guard is present in the range specified, it starts chasing the player as well.
A maximum number of guards that can simultaneously follow the player is specified, as there's no point in allowing over a certain number and the algorithm take care of the insertion and removal of the guards in chasing, sending the ones that are the furthest from the player (and so not more relevant to him) back to their position.
Disclaimer: The features highlighted here only show part of the work I did. As a lot of my work was in collaboration with Niels Strijker I like to look at the AI as a team effort. Thus I recommend playing the game to get a complete experience of the AI, and see my work in action.