The VOID Interactive team discussed how the story of Ready or Not began, provided in-depth insights into their development process for NPC AI, and shared their experience with taking part in Steam's Early Access program.
We are VOID Interactive, the creative minds behind Ready or Not, a tactical first-person shooter. Our story is one of the unlikely beginnings, where fate brought together three young men from Australia and New Zealand through an online friendship formed by playing DayZ.
After several years of playing together, one of us suggested that we make our own game – a SWAT game. Two of the guys had some experience in game development, having produced 3D art for games like Verdun and Days of War. The third member was an avid gamer with coding skills, but he had never built a game. The initial working title for the game was CODE 10, but after a year of tinkering, we decided to scrap it and start over.
During the restart period, one of our team members had a chance encounter with an executive at a food company where he was providing IT support. This unexpected meeting led to the exec offering to fund the salaries of the team, so we could quit our jobs and focus solely on building Ready or Not. The executive also provided valuable support with all the business aspects of forming and running a company, such as legal, contracts, marketing, and other requirements needed to successfully deliver Ready or Not to the market. This allowed the budding developers to focus on their dream job – creating an amazing game.
Stirling, the young Australian, now serves as our COO, while Ryan, the young Kiwi, is our CTO. The executive who believed in the vision and supported the team is Julio, who is our CEO.
Ready or Not
Stirling, one of the co-founders of VOID Interactive, came up with the original idea for Ready or Not after being inspired by the Sydney Siege, a hostage crisis that occurred in Australia in 2014. As a fan of tactical first-person shooters, he wanted to create a game that would allow players to experience what it's like to be a SWAT officer responding to similar high-pressure situations.
Together, Stirling, Ryan, and another friend worked on a prototype for the game, which they initially called CODE 10. However, after a year of tinkering, they decided to scrap the project and start over. It was during this restart period that Ryan had the chance to encounter Julio, an executive at a food company where Ryan was providing IT support.
Julio was immediately intrigued by the vision for Ready or Not, as he had a personal connection to a mass shooting that occurred in San Ysidro, California in 1984. One of Julio's family members was working at a McDonald's restaurant during the shooting and was fortunate enough to survive by hiding in a small room at the back of the restaurant, and it was a SWAT sniper that ultimately took out the deranged gunman.
Over the years, Julio had become frustrated with the way that the media covered such tragic events, and saw Ready or Not as an opportunity to create a digital experience that would allow players to actively participate in similar scenarios as SWAT officers.
In the early days, the team consisted of only four people. After a few months, an animator was added, followed by a sound designer. Since everyone on the team worked remotely, there was no brick-and-mortar studio. Today, with 40 people working on the title, we remain an all-virtual team.
Choosing the FPS Genre
Through a mix of a passion for games and a perspective that people would appreciate a title that placed them in real-world scenarios with a chance to play the good guys and the first-person shooter perspective is ideal for this type of immersive game.
We also noted that the genre in general had more recently taken a turn towards more fast-paced shoot-em-up fantasy or cartoonish games, and while some of these are great fun, we felt there would be demand for a realistic, police-based shooter.
Also, with our team being avid players of games like Arma 3, Squad, and SWAT 4, they felt they had a good grasp on what aspects of a game make for good game-play.
Consulting with Real-Life Police Units
Over the years, our research approach has evolved, and even today we have a dedicated channel on our private Discord server for a SWAT commander who provides valuable insights into the world of SWAT. In addition, we have consulted with members of different police and military services, and many members of our team have experience with firearms and tactical gear. We also conduct extensive online research, which involves studying firsthand and secondhand accounts from police and tactical units, using them as inspiration for our mechanics.
Our lead game designer believes that tactics are an art and not a science. While tactics, procedures, and movements can be scripted into well-planned procedures that should work 100% of the time, he acknowledges that even the best-laid plans can sometimes fail without a bit of luck. In a video game environment, a failed plan can be catastrophic to the player's sense of immersion. As a result, our job is to interpret real-life procedures into a format that works for a virtual game, breaking them down into smaller parts that can be assembled into an enjoyable experience for players. This is still a work in progress and may not be fully reflected in the current state of the game, but it is our goal for the full release.
When it comes to multiplayer environments, tactics and procedures depend on the players themselves and their willingness to follow them. While we can provide a framework for players to work within, ultimately, it is up to each individual to decide how they want to approach Ready or Not.
AI System Used for Players’ Teammates and Enemies
We can start with the suspect and civilian AI since they share the same system, the AI model. The system we use for them is called a Utility-Based AI System, which is a decision-making model.
The concept behind Utility AI is to mathematically model human behavior in a computer program using numbers, formulas, and response curves. The "human" we want to model is called an agent or simply an AI. Each agent in a world environment has a list of decisions (or what we call actions) they want to make. For every frame, we run through the list of actions and decide which one to pick and execute. That’s the core AI loop.
So how does the AI make those decisions? The same way we do! For example, when we go online to shop for something, we don’t just consider the price; we may also value things like brand loyalty, shipping rates, shipping times, review scores, whether they have customer support, and whether we can return or refund our purchase.
All of these things influence our decision to purchase. Everybody’s utility differs. We turn these considerations into data and model them in a computer program using math. That is the essence of utility. And if you noticed the words in bold from the paragraph above, we can extract them, turn them into data, and model them in a computer program using math.
Inside each action, there is a list of considerations that make up what action is mathematically, and it ultimately determines the score for that action. Each consideration outputs a score, which then gets accumulated (using a scoring method) at the end to output a final score for that action.
This score is then used to pick the highest-scoring action to execute (using another system called the Activity System), with a commitment time set so that the AI does not oscillate in its decision-making, acting indecisive from frame to frame. There is also a thing called Commit Interrupts, which is a list of names of actions that can interrupt the current action if it is being committed to, and they get evaluated every frame too. This gives us more control.
The scoring method is just a list of four math operations: Additive, Subtractive, Multiplicative, and Divisive. They simply add, subtract, multiply, or divide into a score accumulator. It serves as another setting that designers can tweak to mold the final action score.
One example of what a consideration can be is "Health". This is scored using a Scoring Function that we define. That scoring function takes in a world context and outputs a number. In this case, "Health", it is really simple: we do Current/Max, which gives us a value (or in other words, a score) from a sliding scale between 0.0 to 1.0, which then can be optionally scaled by weight to bias the action in the AI if we want. You can imagine other considerations having more complicated functions.
The output of the scoring function is then mapped by the response curve and is used as the final score of the consideration. There are many curve presets to choose from. The default is a linear response, but you can have all sorts of easing curves, like exponential, ease, circular, sinusoidal, etc. (or even a handmade curve, or even better, we have the ability to implement your custom curve function, which is pretty neat.)
A health of 0.9, altered by the shape of a curve, can be either good or bad. It is good if you probably don't need to take cover and can risk taking certain actions. However, it is bad if you want your health to always stay full, as you must find cover and regenerate using a stim. (This does not happen in RON, but it is just an example of how looking at the same number can mean two different things.)
With a library of hundreds of considerations, using them and tweaking response curves is how we can get different "personality types" or behaviors out of our suspects and civilians. Some are more resistant to surrender than others, some are more eager to take cover, and some can be more suicidal if you don't de-escalate the situation quickly.
We have another concept in our system that I don't think I've seen anywhere else in other people's utility implementations, but it's hardly anything groundbreaking. We call it "Gates". Gates are similar to considerations, but instead of returning a score, they just return true or false, open or closed. The purpose of gates is to block off actions that we don't want the AI to consider. All gates must be open for the action to be considered for scoring.
Cooldown timers are one example where gates are useful. There is no way you can reasonably do this with considerations and weights; it needs to be a binary operation. Has the cooldown finished or not? The cooldown must be finished before considering said action. Before we had this concept, we would sometimes have AI surrender to no stimulus or do certain actions that they shouldn't have been doing. When we went to debug what was going on, all the scores seemed reasonable, and we could see why they did a certain thing. Gates help us control them a little more so that they don't go wild and do unexpected things, which our designers like.
The simple concept of using math and formulas to mold the output result to your liking (using weights, different scoring methods, and response curves) gives you a whole bunch of states that you can't possibly program into the AI manually. This greatly affects the gameplay experience, as each AI will behave slightly differently than the next.
Our previous version of the AI system was basically one large state machine at its core and could only ever be worked on by us, the programmers. If we wanted to progress, implement better AI, and allow for designer freedom to alter AI behavior quickly in the editor without asking programming to do simple things, a radical approach was needed to switch to Utility (which took about 6 months to implement).
However, we still use the state-machine concept for concrete actions like moving to and picking up a weapon on the floor or breaching a door (which has a lot of states). But the decision-making aspect of the AI, the brains if you will, is all Utility-Based. We don't have to manually say, "If this then that, if this then do X." Instead, as outlined above, we give them a set of actions and rules to follow, and then they can go about into the world and make decisions for themselves, which is pretty neat and what feels like "true" AI.
All we have to do on our side in the editor is set up their Archetype (the definition/personality of an AI), which houses the actions we want them to make. After we’re done, we assign the archetype to the specific AI in our data tables. We have about 50 archetypes and many AI variants in a level that share similar or the same archetypes, for many reasons. For simplicity's sake, we don’t want to duplicate archetypes unnecessarily when we can just reuse the ones that work. Or if we happen to take a liking to a particular archetype in the way they behave, etc. Plus, the overhead of our team in managing all those archetypes, it’s something we try to stay lean with.
As for the SWAT AI, we are actually in the middle of reworking them, so we can’t give much information about that right now. However, we can explain how they work right now. The SWAT AI uses something called the Activity System. It’s a simple system where we can give or queue activity to a certain AI, and it will perform that action, whatever we code it to do. That’s how all SWAT commands operate. And, in fact, how suspects and civilians perform actions. It is where all the logic happens and is one of the main AI systems and fabric of Ready or Not.
We have built a number of base functionalities over the years that aid us in quickly programming a new activity with ease. We can extend from these: BaseActivity, BaseCombatActivity, TeamBaseActivity, TeamStackUpActivity, TeamBreachAndClearActivity, and DoorBreachActivity. And all these largely operate on state machines, that is how SWAT AI’s breaching is done, through stages, similar to how a real-life SWAT team would. And it is how suspects take hostages, for example.
A simple explanation of the FallInActivity: It is an activity derived from TeamBaseActivity, and the way it works is the closest SWAT to the leader (you, the player) will follow first, then the next closest follows that AI, then the next, and so on, resulting in a snake-like movement pattern.
As SWAT navigate around, they target key points of interest in the environment. How do they know where to target? We first need to generate what we call World Data for a level. Basically, it generates environment data, like Stack Up points on a door, clear points, threat actors, etc. using the navigation mesh. Placing threat actors is one stage of the generation; they range from Low to Extreme. Low being empty space/no-activity, and Extreme being door threats. When SWAT doesn’t have any commands given to them, they will focus on and prioritize these threats.
To manage them, we have something called the SWAT Manager, a world subsystem, and a central point of control for us designed to manage and give orders to your SWAT team-mates, keep track of state, and request orders that they find in the environment like evidence or traps and some general helper functions aiding with development.
Designing and Balancing the Different Types of Weapons
Our weapons are divided into types, including pistols, submachine guns, rifles, shotguns, and less lethal options. All of the weapons within these categories are quite similar in nature. We designed them this way to keep the game's focus on the player's tactics and teamwork, rather than how effective they are with their individual weapons. Therefore, the wide selection is left up to the player's preference and experience.
Although some criticized our weapons in the past for their similar appearance, we are now exploring a wider range of more unique and modern weapons for upcoming updates. The experience for the player is set by the sounds, animations, and gunplay, and they can choose the coolest-looking or best-feeling weapon for them to use.
Work on the Game's Characters
Our game features three classes of characters: SWAT, Civilians, and Suspects. Currently, SWAT characters are a work in progress, so we cannot comment much on them. However, for Civilians and Suspect characters, we create 'profiles' for each level, setting their behaviours to be unique from other levels. These behaviours are based on decisions they make during gameplay. Military-trained suspects will take cover, suppress, and flank the player, whereas regular civilians may flee or recklessly rush the player.
Ready or Not is a tactical experience focused on close-quarters battles. While some may criticize our suspect characters for being more aggressive than expected, after rigorous testing, we've found that this keeps players on their toes and necessitates tactical and careful gameplay. Players who become careless can be punished, as they can overcome almost every challenge the suspects pose. Our levels aim to represent the danger of close-quarters encounters, with complex geometries that make players uncomfortable or scared as they navigate corners and sightlines.
Overall, our game offers a unique and engaging tactical experience that emphasizes player tactics and teamwork over individual weapon effectiveness. We strive to create unique and memorable encounters with realistic close-quarters battles and challenging enemy behaviours.
By December 2021, we had already been working on Ready or Not for over 5 years. We were self-funded for a few years, but as we gained more clarity about the requirements for building such an ambitious game, we realized we needed to grow the team, and to do so we needed cash. We had a first round of additional cash infusion when we began to pre-sell a Supporter package of Ready or Not around mid-2019 through our own website.
As the pre-sales funds began to dry up, we had a short stint with a publisher in 2021 which was ended through a mutual agreement later in that same year. We had always resisted going into the Steam early access program too early, as we were afraid that bad reviews for a very rough and buggy game would hurt our chances of success in the future. As such, we are incredibly grateful to Steam for giving us enough runway and development keys even though the game was not yet available for sale on Steam.
So while the game was still not ready, we felt it was in a good enough state to finally launch it into early access on Steam on December 17, 2021. Being on Early Access has helped us generate the necessary additional funding to continue to grow the team and invest in our game without the need for a publisher. Our game launch on Steam Early Access was so successful that it has guaranteed that we have the resources to get to 1.0 full release on PC and even to eventually take it to other platforms.
Promoting the Game
From the very beginning, we tested the waters with a teaser trailer that was picked up by GameSpot Trailers and garnered over one million views in a short amount of time, which gave us the confidence to move forward. The comments on the trailer revealed what players were looking for, and we incorporated this knowledge into the game.
We have always tried to stay very active on social media and in our communities, providing updates and transparency about the game's development. We have also never gotten lazy or stopped working hard on the game, continuously putting out new trailers and content and updating the game with relatively high frequency.
While we have a great team working on a great game, we have also been blessed with good timing, good luck, and a fantastic supporter base. With not too many other new games of this type in this genre, we were picked up by some very influential content creators.
It is helpful that we have always believed in creating a game that is as much fun to watch as it is to play; and have been over the moon when, without our prompting, we were featured on some very influential YouTube channels. We have also partnered with the LURKIT platform to help enable even more content creators to cover RON.
Also, the 10,000 supporters that we had gained over the previous 4 years proved to be our best advocates and were vital to our growth.
One final note, we always prioritized player and community participation in Ready or Not, and one way we demonstrate this is by supporting modding. We implemented mod.io and have been absolutely thrilled with all the talent that has been demonstrated in the community. In years past, it took some real specialist knowledge to be able to access and play mods, but with mod.io, you can have access to mods directly from the game menu.
Using Feedback from the Early Access Program
We have received a lot of valuable feedback through Early Access (some more scathing than others), which has allowed us to identify and address issues with our AI system that we wouldn’t normally pick up on in our internal QA sessions. For example, players have pointed out instances where the AI was too aggressive, or unreasonably resisting surrender after repeated stun effects (flashbangs, tasers, pepper spray, etc.), which helped us fix and fine-tune their behavior. There are many instances like this, but I would be here all day if I talk about them all.
Another benefit of Early Access is that it gives us insight into how players interact with their SWAT team and suspects/civilians through videos posted online and discussions on forums like Reddit and Discord. We get to talk to the community about these things, and we use some of their feedback to improve everything and anything about our AI systems and the game in general.
Community feedback is something that is always going to be part of our development as we continue to refine the game. It's not simply Reddit or Steam discussions – the exposure of the game is rather wide, so we may come across clips of people playing our game on Facebook, Twitch, and YouTube, and there we are able to see what people are saying about the game and what they're dissatisfied with the most.
We collect the most common complaints and make solving them one of the priorities for our upcoming updates. A common example would be how our suspect characters moved way too quickly during combat, which had become a huge issue that people weren't satisfied with, so we put some focus on crafting a new movement system for suspects to slow them down and keep their movements readable, as well as adding "surprise" animations to ensure that there's a grace period for players to understand what situation they're currently in.
Bottlenecks When Using Steam's Early Access
Being on Steam's Early Access has been great for us, and VALVE has been kind enough to feature our game several times. We were absolutely blessed to have been the number one seller on their platform globally for almost four weeks from the date of launch into early access. We have now been in the program for about 16 months and are working hard to get to 1.0 full release by the end of the year.
Ready or Not has recently surpassed 3,200,000 lifetime unique users and we still maintain a 92% rating. To us, having more eyeballs means having more pressure to continue to deliver, but that is not necessarily linked to early access.
VOID Interactive's Future Plans
The most important thing we have in front of us now is completing all the levels, content, and upgrades we have in store for 1.0. We continue to focus on gameplay, performance, and on creating immersive environments. While we will continue to maintain and improve Ready or Not beyond 1.0, we also plan to create additional features and levels to be offered as DLC.
We also are in the early stages of planning the Ready or Not expansion, which will take the same SWAT concept to another country, using their Special Response Teams and scenarios that are reflective of that locale. We are also now invested in other games through a few other teams in different game genres (more on that later).
We have also been seeing incredible demand to take RON to consoles and other platforms and hope to make announcements about that soon.