By Craig Thomas, Game Developer @Seed_Interactive
When we design our games, one of the things we like to focus on is appealing to a broad audience, rather than simply catering to a niche group. With our mobile games, we aim to create experiences that are accessible to players with less gaming experience while still providing a challenging and satisfying experience for more experienced players. While there are many things we do to achieve this, the one we’ll be focusing on today is the intensity system.
Heavily inspired by Left 4 Dead’s AI Director (http://www.valvesoftware.com/publications/2009/ai_systems_of_l4d_mike_booth.pdf), the intensity system’s purpose is to measure the intensity of the game, as experienced by each player, and adjust the intensity of the game to try to keep that value at an ideal level.
Screenshot of survival mode in Skies of Fury.
Before we dive into the details, let’s review the game we implemented this in to help provide context. The game is Ace Academy: Skies of Fury, a flying combat game set in WWI. We are currently working on a new survival game mode, where players attempt to survive for as long as possible while taking out as many enemies as possible. This game mode can be played solo or with other people locally (split screen or on a local network). The game is always a contest between the British and German air forces, with players being able to distribute themselves as they see fit between the two teams. It is this game mode that we designed the intensity system for.
The first thing we needed to do was to define intensity for our game. What determined how intense the game felt to a player? How could we quantify those values? This was an interesting exercise that had the added benefit of helping us really identify what we considered to be the most important elements of the gameplay. The answer we settled on was that the most important contributor to a player’s perceived intensity was dog fighting; being the hunter and lining up enemy planes and being the hunted and trying to shake an enemy were identified as the most influential elements of a player’s intensity.
To test this theory, we hooked up some rudimentary measurements and played the game. Those basic measurements were as follows:
- Whenever a player gets shot, increase their intensity (on a scale inversely proportional to their remaining health).
- Whenever a player is shooting an enemy, increase their intensity (proportional to the enemy’s difficulty). Add a small spike when they finish off an enemy.
- Whenever a player is NOT actively pursuing a target (i.e. they have not recently had their crosshair lined up with an enemy), decay their intensity towards zero
These measurements produced very intuitive results, and still serve as the basis for the intensity measurements we currently use (although they have been and continue to be refined).
Screenshot of a dogfight in Skies of Fury
Up to this point, AI were spawned completely randomly, the only constraint on them being a hard cap on the number of planes that could exist at one time. Now that we had a decently accurate model of the player’s intensity, the next step was to drive in-game events using this data. We designed a system that read the data from the intensity system and used that information to decide when to spawn AI, how many of them to spawn, and how difficult those AI should be.
Our first step in designing this AI spawning system was to create a pattern for it to try to replicate. This was our vision of what a player’s intensity would look like over an “ideal” play session. We knew we wanted the game to steadily get more and more intense over time, making it harder and harder for the player to survive. We also knew we wanted to add in relaxation periods; brief windows of time where the player would have a chance to catch their breath (and which would serve as a good contrast to periods of high intensity). We found that by alternating periods of rising intensity with shorter periods of falling intensity, we could easily achieve this effect in a way that felt natural and intuitive.
We now had a value representing how intense the game felt to the player, and a value for our ideal target intensity at that time. We designed the AI spawning system to use these values to create a budget it could use to spawn more AI. The system mixed spawning more AI with spawning more difficult AI to create a large variety of game play experiences, however something still didn’t feel quite right as we playtested this system. The biggest issue we noticed was that this system often led to very extreme game states, where there were either way too many or way too few AI being spawned.
Eventually we discovered that an individual player’s intensity was a poor measurement of the game’s state at that point in time. One player’s intensity was a very localized measurement, whereas we needed a measurement that was better at representing a bigger picture view of the game state. This problem became especially apparent when multiple players played at the same time; even accounting for multiple players’ intensities did not address all of the issues.
In the end, our solution was to begin to measure intensity for teams, as well as individual players. The components that make up the team intensity measurement include:
- The discrepancy between the number of AI on each team (a team with fewer planes relative to the other team will have a higher intensity, as they will, on average, have more planes hunting them).
- The discrepancy between the difficulty of AI on each team (a team with a few high level AI can take on a team with a lot of low level AI, for instance). Players are considered very high-level AI for these purposes.
- The overall health of each team (a team with a lot of planes at low health will be experiencing more intensity than one with the same number of planes at full health).
- The averaged value of the intensity for each player
By utilizing these team intensity values, we were able to obtain a more consistent experience that still followed our ideal intensity curve, but tended less towards extreme game states.
Above: Graph of team intensities over time. Dark blue is the British Team, red is the German Team, green is overall intensity, and cyan is the target intensity.
We knew we could still do more with the individual player measurements, however. To do this, we created a small system that kept track of the players’ intensities and raised or lowered their priority in the AI targeting system. By lowering their priority, we can reduce the number of AI shooting at them and give them a period of lower intensity, and vice versa.
While we continue to playtest and refine these systems, we now have a really solid base that is easy to tweak and build upon. This system allows us to close the gap between players of different skill levels, and ideally provide an experience that is enjoyable and engaging for every player.