This is pretty much an extra write-up following RwAoNrDdOsM's 5-year old VT2 Intervention Systems + Other Relevant Systems post, with additional information (i love spending 3 hours digging for one number!!!!!!!!!!).
To keep things relatively simple and relatable (while not overlapping too much), I've decided to talk about Threat Level, Intensity, Pacing and Ambience (roaming enemies) as these are both important to gameplay while being very intriguing.
Taken from RwAoNrDdOsM's post,
Threat value is a value that determines how many active enemies there are and how much of a threat they are to a player. Active enemies generally include patrols when they are in combat, Blightstormer’s Vortexes, any alerted enemies and any horde enemies. Enemies are generally deactivated when they can’t find a target (doesn’t apply to horde enemies) and when an enemy is killed.
If your threat level is high enough, no horde will be spawned until it is below the requirement.
Threat Values help designers (and us onslaught modders) estimate how "dangerous" a horde will be via assigning a number to every breed without needing to call 3 friends over and test it out. Albeit, this is a poor metric now (personally) due to how much the game has changed since 5 years ago, where your only super armour weapon was the pickaxe, a Chaos Warrior would take on-average a minute to kill, THP was on the level 25 row and Battle Wizard was considered a crutch.
Threat value interacts with two different systems, the first being the aforementioned delay_horde_threat_value
, the second being delay_specials_threat_value
, the third being delay_mini_patrol_threat_value
.
delay_horde_threat_value | delay_specials_threat_value | delay_mini_patrol_threat_value | |
---|---|---|---|
Recruit | 40 | 40 | 35 |
Veteran | 50 | 50 | 40 |
Champion | 60 | 60 | 50 |
Legend | 60 | 60 | N/A (presumed 50) |
Cataclysm | 80 | 1000 | 80 |
Cataclysm 2 | 100 | 1000 | 100 |
Cataclysm 3 | 100 | 1000 | 100 |
Versus | N/A | 60 | 50 |
delay_horde_threat_value
and delay_specials_threat_value
are both self-explanatory, stop horde/specials from spawning if the current Threat Level exceeds this value, while delay_mini_patrol_threat_value
requires more information on "mini-patrols". But we'll get to that soon after we talk about Intensity.
Taken from RwAoNrDdOsM's post,
Intensity is a value applied to each player. It is used for going into different pacing states and its functions. Intensity is added when you take damage, when you are disabled (pounced) by a gutter runner, if you are downed, when you kill an enemy.
Intensity is split into three more systems:
- Individual Intensity
- Total Intensity (Sum of all alive player's intensity, divided by the number of alive players)
- Peak Intensity Threshold
With Individual Intensity affecting Total Intensity; Total Intensity & Peak Intensity Threshold affecting Pacing. In the grand scheme of things, we only care about the former two.
There are several settings that Fatshark uses to tweak Intensity. Constant values are italic-ized-errrr and bolded whatever.
decay_delay | The number of seconds before Intensity starts to be reduced. | / |
---|---|---|
decay_per_second | The amount of intensity reduced per second. | / |
intensity_add_knockdown | The amount of intensity added per downed teammate. | / |
intensity_add_nearby_kill | The amount of intensity added per kill. | 1 / (The distance between the player and the killed enemy) 1* |
intensity_add_per_percent_dmg_taken | The amount of intensity added per damage taken | (Percent of total heath lost) (Intensity added per percent damage taken) * 100* |
intensity_add_pounced_down | The amount of intensity added per disabled teammate (i.e. everytime the ! icon shows up) | / |
max_intensity | The maximum amount of intensity. Applies to both individuals and total intensity. | / |
INDIVIDUAL & TOTAL INTENSITY VALUES
decay_delay | decay_per_second | intensity_add_knockdown | intensity_add_nearby_kill | intensity_add_per_percent_dmg_taken | intensity_add_pounced_down | max_intensity | |
---|---|---|---|---|---|---|---|
Recruit | 3 | 2 | 50 | 1 | 1 | 10 | 100 |
Veteran | 3 | 2 | 50 | 1 | 1.5 | 10 | 100 |
Champion | 3 | 2 | 50 | 1 | 1 | 10 | 100 |
Legend | 4 | 2 | 50 | 1 | 0.5 | 10 | 100 |
Cataclysm | 6 | 2 | 50 | 1 | 0.2 | 10 | 100 |
Cataclysm 2 | 6 | 2 | 50 | 1 | 0.2 | 10 | 100 |
Cataclysm 3 | 6 | 2 | 50 | 1 | 0.2 | 10 | 100 |
Versus | 3 | 2 | 50 | 1 | 0.9 | 10 | 100 |
PEAK INTENSITY THRESHOLD VALUES
peak_intensity_threshold | |
---|---|
Recruit | 45 |
Veteran | 50 |
Champion | 55 |
Legend | 70 |
Cataclysm | 80 |
Cataclysm 2 | 90 |
Cataclysm 3 | 90 |
Versus | 70 |
Now that we've defined Threat and Intensity, let's go back to mini-patrols.
Mini-Patrols, despite being called a "mini" patrol, are not actually patrols but are similar. They are pre-determined small horde compositions.
- If the timer has expired and total intensity is within 1 and 15 and the maximum number of enemies still hasn't been hit, it spawns a mini_patrol. It also changes the state to "spawning" and updates the timer for the next mini patrol to 5s. Otherwise, it updates the timer for the next mini patrol to 2s.
- If the state is "spawning" and the timer has expired, it changes the state to "running" and updates the timer for the next mini patrol to 20s.
- If the state is "running" and there are less than three skaven_clan_rat and less than or equal to one skaven_storm_vermin, or the timer has expired, it changes the state to "waiting" and updates the timer for the next mini patrol to 15-20s.
tl;dr It checks every 2s to spawn a mini_patrol. If the check passes, spawn a mini_patrol with a frequency of 40 - 45s.
Congratulations, you have survived a massive difficulty jump. There's more.
Taken from RwAoNrDdOsM's post,
Pacing is the system that controls Specials Pacing, hordes and roaming enemies.
For the sake of simplicity, we'll only be focusing on the different stages of pacing.
1ST STAGE: PACING BUILD UP
- When you exit the Safe Zone (area at the start of the map before you meet any enemies), Pacing will proceed to the 1st stage.
- In this stage, hordes/specials/ambience can spawn.
- Pacing will advance into 2nd stage if the Total Intensity is above the Peak Intensity Threshold.
2ND STAGE: PACING SUSTAIN PEAK
- In this stage, hordes/specials/ambience can spawn.
- This stage lasts for 3-5s.
3RD STAGE: PACING PEAK FADE
- In this stage, hordes/specials CANNOT spawn. Ambience CAN spawn.
- Pacing will advance into 4th stage if the Total Intensity is below 32.5.
4TH STAGE: PACING RELAX
- In this stage, hordes/specials CANNOT spawn. Ambience CAN spawn.
- Pacing will advance into 1st stage if
relax_duration
timer runs out OR if Total Intensity is 0 OR if a player is caught rushing.
RELAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAX DURATION
relax_duration | |
---|---|
Recruit | 50 - 70 |
Veteran | 35 - 45 |
Champion | 35 - 45 |
Legend | 25 - 35 |
Cataclysm | 25 - 35 |
Cataclysm 2 | 25 - 35 |
Cataclysm 3 | 25 - 35 |
Versus | 20 - 35 |
This is possibly the most annoying, most convoluted and most mysterious system within the game. Whatever the f*ck Fatshark cooked, they cooked something hot and spicy. Extra thanks to Osmium for teaching me all of these, as 3/4 of this section is just our discord dms, but rephrased. If we go all nitty-gritty detailed, then there's going to be a lot of technical jargon to be explained, so pardon for the generalization.
At the very start of a run, a random seed is generated and every "SpawnZone" is defined (manually btw, holy sh*t). There are the following types of possible zones.
- Default
- Default light
- Skaven
- Skaven light
- Chaos
- Chaos light
- Beastmen
- Skaven Beastmen
- Chaos Beastmen
On load in, the game assigns factions and conflict directors for each zone. And any time the team crosses into a new zone, a new conflict director is loaded. This is why sometimes a Chaos horde can be coming at you, and then the team moves to a new area and the final wave can be Skaven or vice versa.
When players approach a spawn zone, it does a check of "how much stuff is alive? Do I need to spawn more? If yes, what do I need to spawn?" . It figures out what spawn zone it is and spawns a corresponding BreedPack (list of enemies), and it repeatedly spawns that breed pack until it achieves a goal "density area_density_coefficient
" and then it stops.
However, in this context, we need to define what "density" is. In this case, "density" is proportional to the total number of spawned BreedPacks. There is no "space" or area dependence.
This is how Fatshark makes some regions harder and others easier. An example being the beach section of The Pit (my BTMP group calls it Normandy), or the toilet hole dropdown in Convocation of Decay.
Yet, they need to guarantee that a zone won't be too hard for a player, but the game won't know that until the team gets to the new spawn zone since there is no way to know ahead of time what the horde timers or intensity or threat levels will be when the team reaches a new spawn zone.
Thus, they have something called a "clamp", checking if they spawned too many elites and replacing them with others if they did. For my fellow modded comrades, this is why you fight a Total Warhammer Skaven army then walk into an empty room.
The third system is EnemyRecycler
, which periodically checks if the game spawns too many enemies such that it causes excessive frame dips, while also despawning far-away enemies at a max rate of 6 per frame to free up space for more enemies.
All of these combined allows Fatshark to control the flow of gameplay. Threat and Intensity keeps players from being too overwhelmed by enemies, while Pacing stages and Ambience gives gameplay the rising tension and eventual climax. This took me 2 hours, please help, I am sick.
Go here if you want to see hordes explained, As again, feel free to ask any questions in the comments, and I'll try to answer them.