AI director

Hordes

Ambushes appear right next to you from hidden spawners; vector hordes run in from far down the path. From rank 16 they arrive on a clock, up to 2.4 times faster.

Two kinds of horde

  • Ambush hordes spawn 12-25 m from the players at spawn points the players cannot see. They come from every side at once.
  • Far vector hordes spawn 60-80 m along the main path, usually ahead (two times out of three), and come in up to three waves. When 50 or more enemies are already alive, the director always picks a vector horde.
Ambush horde spawn distancemanagers/horde/templates/ambush_horde_template.lua:42
local MIN_DISTANCE_FROM_PLAYERS, MAX_DISTANCE_FROM_PLAYERS = 12, 25
Open managers/horde/templates/ambush_horde_template.lua at line 42 on GitHub

A pre-stinger (the horde scream) plays 7 seconds before the horde starts. When a horde spawns, nearby patrol zones are woken up too, so a horde often drags the next patrol in with it.

Timers

Below rank 16, the Havoc horde template matches the normal one: a 210-340 countdown that runs on metres travelled at R3 and R4. From rank 16 the horde override replaces it, and its countdown runs on seconds:

Rank Template Countdown Max enemies from hordes Gap between waves
1-15 Havoc default 210-340 m 85-90 10 s
16-29 havoc_01 140-240 s 90 10 s
30+ havoc_02 100-200 s 110 7 s
Havoc 16+ horde timers tick by timemanagers/pacing/horde_pacing/templates/mutator_horde_pacing_template.lua:216
    havoc_01 = {
      aggro_nearby_roamers_zone_range = 2,
      max_active_minions = 90,
      max_active_minions_for_ambush = 50,
      num_trickle_hordes_active_for_cooldown = 3,
      time_between_waves = 10,
      travel_distance_spawning = false,
      trigger_heard_dialogue = true,
      horde_timer_range = {
        140,
        240,
      },
      first_spawn_timer_modifer = {
Open managers/pacing/horde_pacing/templates/mutator_horde_pacing_template.lua at line 216 on GitHub

The horde_spawn_rate_increase modifier then speeds up the countdown itself. Each tier adds 0.2, so rank 40 runs the clock 2.4 times as fast. At rank 30 that is a countdown of 50-100 seconds, and at rank 40 about 42-83 seconds.

Havoc horde spawn ratesettings/havoc_settings.lua:304
    horde_spawn_rate_increase = {
      {
        horde_spawn_rate_modifier = 0.2,
      },
      {
        horde_spawn_rate_modifier = 0.4,
      },
      {
        horde_spawn_rate_modifier = 0.6,
      },
      {
        horde_spawn_rate_modifier = 0.8,
      },
      {
        horde_spawn_rate_modifier = 1,
      },
      {
        horde_spawn_rate_modifier = 1.2,
      },
      {
        horde_spawn_rate_modifier = 1.4,
      },
Open settings/havoc_settings.lua at line 304 on GitHub

The distance quota

The clock is not the only gate. The director only lets a horde start if the team’s furthest progress, divided by the per-horde quota, is higher than the number of hordes already triggered. The quota is 50-70 m on rank 16-29 and 45-70 m on rank 30+. There is also a short window, from 5 to 8 seconds after the team last moved forward, in which no horde may start.

Each horde needs new forward progressmanagers/pacing/horde_pacing/horde_pacing.lua:87
  local allowed_hordes_per_travel_distance = math.ceil(furthest_travel_distance / self._required_travel_distance) - self._triggered_hordes
  local hordes_enabled = pacing_manager:spawn_type_enabled("hordes") and allowed_hordes_per_travel_distance > 0
  local travel_distance_allowed = time_since_forward_travel_changed < TRAVEL_DISTANCE_CHANGE_ALLOWANCE_MIN or time_since_forward_travel_changed > TRAVEL_DISTANCE_CHANGE_ALLOWANCE_MAX
Open managers/pacing/horde_pacing/horde_pacing.lua at line 87 on GitHub

So on rank 16+ the timer keeps counting while you hold position, but if the team has used up its distance, the horde waits. The moment someone crosses the next quota line, the waiting horde can start right away.

Coordinated horde strikes

When a horde is about to start, the director may upgrade it to a coordinated strike. The variants include a sandwich from both sides, a push from behind, ranged enemies pushing from behind, a spread ambush, elite waves and a special strike with the horde. Each has a per-mission limit and conditions, such as the team being spread out or a quiet period of more than 50 seconds.

Havoc compositions

Havoc hordes swap the normal composition for denser mixes. For example, a medium renegade horde at C5 is 15-19 poxwalkers plus 15-19 mutated poxwalkers, where Auric has 26-29 poxwalkers with only a few mutated ones. With the buff_horde modifier they also have more health and hit mass, so cleave goes through fewer of them.

After a horde, the next one is usually already counting down and only waits for distance. Before pushing forward, agree on where you will fight it: a corridor or doorway that turns an ambush from every side into a single front for the Inferno and the flamer, with the Ogryn taking the hits. When you hear the scream, you have 7 seconds to get there.