Democratizing horror: How Mega Cat Studios brought accessibility to Five Nights at Freddy’s
This blog post was written by Madison Petrick, the UX and Accessibility Director at Mega Cat Studios.
For 10 years, the Five Nights at Freddy’s video game franchise has prided itself on its high-level difficulty. From some of the most unforgiving challenges in Ultimate Custom Night, to the original Five Nights at Freddy’s: 20/20/20/20 Mode, FNAF fans from all walks of playstyles have dared themselves over the years to beat these modes and eventually succeed after many, many tries.
But while the difficult nature of these titles can bring vast satisfaction for many, for others, the feasibility of playing them can be an altogether different challenge from dodging terror in “Nightmare Mode” at Freddy’s.
Accessibility in video games has grown at an exponential rate in recent years. What was once limited to simply being able to change volume settings eventually turned into brightness adjustment, remappable controls, and quality of life changes, like being able to access the settings menu upon first boot of a game. Fast forward to the 2020 release of Naughty Dog’s The Last of Us Part II, where a new standard was set. This 2020 Game of the Year had over 60 accessibility settings to choose from, with hundreds of hours poured into research and development.
While working on our latest release, FNAF: Into the Pit, we were approached with the idea of adding accessibility features to the game. Our small team didn’t have hundreds of hours to dedicate to research, let alone extra expendable “cat-power”. But all of our developers rose up to the challenge and took it upon themselves to each be responsible for developing some aspect of accessibility. Whether this was research, bug-testing, or learning new coding techniques on the fly and sharing them with our desk mates, our motivation to give everyone a chance to play FNAF: Into the Pit (and copious amounts of coffee) drove us forward.
What became the goal of integrating a few features into the final build turned into 20+ in the end. While there were features that unfortunately didn’t make the cut, we are proud of the new resources we brought to the long-standing FNAF franchise.
Accessibility features in FNAF
The following accessibility features are available in Five Nights at Freddy’s: Into the Pit. Note: Some of these features are not shown to avoid spoilers!
Color settings
Players are able to change the color contrast and overall brightness of the game.
We weren’t able to release a full Daltonization (color-contrast) adjustment plan in time for the game’s launch, however, we did implement overall brightness and contrast. A lot of simulations were run with the black and white scales so that visual contrast or overlap was limited as much as possible.
Changing the values on Unity’s post-processing volumes requires just a few lines of code, making it easy for players to customize the brightness and contrast levels.
if (mainCameraVolume.TryGet(out ColorAdjustments colorAdjustments))
colorAdjustments.contrast.value =
contrastValueCurve.Evaluate(value);
(ContrastHandler.cs)
The Creature, Chica, and World Noise Vignette
Each world-traversing NPC has their own colored screen vignette to indicate their proximity to the player, e.g., yellow for “The Creature” and purple for “Chica”. General noises around the world, i.e. noise makers, also have audio visualization, with a grey-colored vignette.
When receiving accessibility feedback, developers wanted to ensure Into the Pit did not rely only on sound in order to alert players to threats. While noise vignettes were added to accommodate audio accessibility, this feature also benefits those who prefer to have a more visual playstyle. Additionally, the vignettes are designed to be more than color-dependent only, thanks to the integration of pulsing-effects as a secondary proximity indicator to accommodate contrast and brightness settings.
Here is how Matthew Wojtechko, lead developer at Mega Cat Studio, explains the audio visualization feature:
“I made a big push to ensure that we visualized all important sounds in the game. We went through the game and came up with three sources of noise: The footsteps of the yellow rabbit, Chica’s footsteps, and miscellaneous world noise.
We had a pulsing vignette on the side of the screen to indicate which side the yellow rabbit is on, but now, we had to incorporate two other categories. We decided to make these pulse in a rhythm; a yellow pulse for the rabbit, a pink pulse for Chica, and a white pulse for anything else. If that item wasn’t making any noise, that “beat” would just be blank.
The hardest challenge in implementing this feature was determining which side the target was on relative to Oswald. This seems like a simple problem, except for the fact that the way the game was implemented in 3D space in Unity does not match the reality we’re trying to convey to the players.
Let’s consider the example of Oswald standing in the security room while the yellow rabbit is in the storage room. While the storage room is supposed to be on the left of the security room, in the Scene view we can see that these rooms are actually implemented in the reverse direction. In this case, a straightforward comparison between Oswald’s and the yellow rabbit’s positions isn’t reliable, as the player’s understanding of the map does not match the reality in the game engine.
This is why if Oswald and the sound target are in different rooms, the game determines the closest valid path using the Unity NavMesh system (which we already use for the enemies’ AI), and uses the door that would best lead to Oswald as the direction of the sound.”
Learn more about Unity’s AI Navigation system with these tutorials:
- AI Navigation 2.0: NavMesh basics
- AI Navigation 2.0: Runtime NavMesh surfaces
- AI Navigation 2.0: NavMesh links and obstacles
OpenDyslexic
Players are able to select not only font size and spacing, but a font created specifically for readers with dyslexia known as OpenDyslexic.
By utilizing OpenDyslexic, we hoped to increase the readability of nearly all text in Into the Pit for players with dyslexia. Though our default text is fully customizable in size, we wanted to add just a little more to this option for increased ease of readability due to the very text-based genre of the game.
OpenDyslexic font:
Default font:
Single tap
Quick time events (QTEs) in normal gameplay/cutscenes will have an option to be winnable with a single tap with infinite time.
With this feature, quick time events are able to be succeeded with just the single tap of a button and are not time-dependent. Though “button-mashing” is a common practice within the video game industry, this motor-control option can help decrease button fatigue for those players who want it.
Auto hiding minigames
Hiding minigames can be progressed automatically without any need for player input.
Players do not have to rely on fine-motor controls to successfully complete minigame actions as these can be performed automatically.
The examples below showcase virtually no difference between the player’s visual experience with the setting Off (left) or On (right), ensuring this feature emulates just as much suspense with less inputs.
Toggle run
Our toggle run option lets the player run without holding a button to help decrease button fatigue.
Players can select whether they want to hold their selected Run button or toggle their running by pressing their Run button On/Off during gameplay. Oswald automatically goes through doors if he runs close enough to them, also allowing for seamless transitions while running (for his life).
The game handles input using Unity’s Input System, which facilitates even-driven input. Our logic for determining whether the player is running or not is in one input callback, which takes the accessibility feature’s current setting in consideration:
public override bool OnRunInput(InputAction.CallbackContext ctx)
{
if (ctx.started)
{
if (IsToggleRunEnabled())
Oswald.isRunning = !Oswald.isRunning;
else
Oswald.isRunning = true;
}
else (ctx.canceled)
{
if (!IsToggleRunEnabled())
Oswald.isRunning = false;
}
return Oswald.isRunning;
}
Auto hint system
The auto hint system gives players the option to increase/decrease the rate of dialogue hints down to the minute (i.e. 5 minutes, 10 minutes, 20 minutes, Off).
Not knowing where to go next is a defeating moment for any player, especially after looking all over a map or area. In Into the Pit, players can customize the rate of dialogue hints Oswald will drop to help guide them to their next objective. These hints are automatic and can be changed or toggled on/off at any time.
Originally, the hint system was on at the same rate and could not be adjusted. However, Into the Pit devs knew some players would have a better experience if they received that hint sooner, while others might not want any.
This is implemented by waiting the amount of time specified by the accessibility settings. The timer gets reset when the player receives a new objective. The important thing with this implementation was making sure devs avoided edge-case bugs. This is why in the ShowHint function, this begins with a few guard clauses to avoid having Oswald talk to himself at an inopportune time.
protected void ShowHint()
{
if (GameManager.Instance == null ||
GameManager.Instance.Oswald == null ||
GameManager.Instance.Oswald.IsStumbling ||
InteractableDoor.isPlayerNearAnyDoor())
return;
if (AdventurePC.Instance && HintsManager.TryGetHint(out string hintText))
{
InvokeDelayed(new WaitUntil(() => TextBox.Instance), () =>
{
AdventurePC.Instance.Stop();
messageTemplate.speaker = AdventurePC.Instance;
messageTemplate.text = hintText;
TextBox.Instance.overrideBlockerDelay = .25f;
TextBox.Show(messageTemplate);
});
}
UpdateCurrentQuestObjectives();
ResetTimer();
}
Icon size
Icons can be scaled up and down in size. Even the largest size does not obstruct any views from the game.
Stereo/Mono Toggle
Players can opt to make the sound stereo (both sides are different) or mono (both sides are the same). Sound in any horror game is designed to not only be unsettling, but helpful when the game environment is trying to guide the player. Being able to know where “The Creature” might be lurking in Into the Pit is pretty important for survival, after all.
Remappable controls
Players can remap controls to their liking. Controls are compatible with accessibility devices such as the PlayStation®5 Access™ Controller and the Xbox Adaptive Controller.
Our developers utilized the new Input System from Unity to create the customizable layouts for Into the Pit’s controls. The Input System, even with some custom code edits, was better suited for having multiple bindings, which were utilized between all the shared interfaces and UI menus. This was easier to manage than our previous input system due to the integration of Input Actions, which made the input more organized and customizable for the developers.
“We have an Input Action for everything the player can do in-game,” says Matthew Wojtechko, “such as an Action for the flashlight, for running, moving, shooting in the minigames, etc. When the player rebinds something, that changes the bindings on the Action. All the rest of the code that responds to Input Actions remains the same, regardless of what the bindings are, as the Input Actions keep those specifics abstracted.”
Into the Pit has 37 custom Input Actions. Each one denotes a specific action the player can perform and lists the corresponding inputs used to trigger it. For example, using the flashlight is by default bound to the F key on the keyboard and left face button on controllers.
The ease of adjusting the input bindings is a major upgrade from the original input manager. It’s simple to modify them in the Editor, and rebinding at runtime is more efficient, although it requires some code. Our rebinding solution is based on the example provided in the Input System package, which hinges on Unity’s RebindingOperation class.
One edge case that comes up when implementing an input binding menu is handling conflicting inputs. This occurs when a player provides an input to an action which is already assigned to another action. One approach to solving this is to let the player assign a conflicting input, but prevent the player from saving the settings until they resolve the issue (i.e., changing one of the two instances of the same input to something else). While this is a reasonable approach, we opted to simply swap the bindings in this case. So, if Flashlight is F and Run is Shift, and the player binds Flashlight to Shift, then Run becomes F.
Using the Input System keeps the binding information abstracted when it comes to other code. So neither the script that listens for player input nor the script that adjusts input icons on screen deal in specific input, which helps make things simpler.
Quick Time Events (QTEs)
Into the Pit has two types of QTE customization: An option for easy QTEs in standard gameplay and an option to make hiding minigames automatic. Matthew Wojtechko did much of the work implementing the hiding minigames in the first place, and when it came time to implement this accessibility feature, he knew he could do it in a simple and straightforward way.
The unique mechanics for each hiding minigame inherit from a shared base class. This has a flag PlayAutomatic that checks the save data to see whether the player has this setting turned on or not. The following code has been simplified:
public abstract class MechanicHidingMinigame
{
public bool PlayAutomatic { get; protected set; }
protected override void Awake()
{
PlayAutomatic = PlayerPrefs.GetInt(AccessibilityHandler.AUTO_HIDING_MINIGAMES_KEY) == 1;
}
}
Then, each hiding minigame script can check against this flag to automatically “play” the game.
For example, in the minigame where you need to hold your breath, we control the breathing system at the proper times:
public class BreathGameMechanics : MechanicHidingMinigame
{
public void OnBonniePrepareLook()
{
if (PlayAutomatic)
{
BreathingSystem.Instance?.HoldBreath();
}
OnGoldBonnieAlmostLook?.Invoke();
}
public void OnBonnieEndLook()
{
isBonnieLooking = false;
if (PlayAutomatic)
{
BreathingSystem.Instance?.ReleaseBreath();
}
OnGoldBonnieStopLooing?.Invoke();
}
// There rest of the code in this class was removed for clarity
}
Customizable playstyle
The following customizations are offered in the main menu upon the first boot of the game. While we knew that most customizers are traditionally unlocked after beating a Five Nights at Freddy’s game on the hardest difficulty possible, we wanted to challenge that standard by giving players access to customizers after beating the game once on any difficulty. Players can customize the following for a preferred-playstyle experience:
- Customize character aggression.
- Adjust the difficulty of the hiding minigames.
- Increase or decrease the amount of checkpoints in the game by adjusting the checkpoint frequency.
- Option to increase battery quality that extends the duration of flashlight batteries.
- Increase or decrease the amount of hiding spots in the game.
- Increase or decrease the amount of noise makers in the game.
At Mega Cat Studios, we believe everyone deserves to play games, just as everyone deserves to be thoroughly jump scared in Five Nights at Freddy’s: Into the Pit (or not as jump scared – there’s a setting for that). We strive to bring excellence to all of our projects, which means growing our accessibility toolkit for our supportive community and fans. And if that means jumping into a ball pit of game development unknowns, we’ll dive in excitedly, every time.
We just hope it’s not haunted.