Story Director

Rocket

Member
Ahwoo Staff
Developer
RocketWerkz
Messages
26
Reaction score
166
The story director is a survival-mode system that quietly tilts a round toward staying fun. It watches every living player, scores how much pressure they are under, and reacts in two directions: a player in real trouble gets a hidden helping hand (the game rolls slightly in their favor), and a player who has gone quiet and settled in gets a small surprise delivered to their doorstep. It only exists in rounds whose mode data enables it, PvP modes will never use it, and nothing about it is shown to players: there is no moodlet, no HUD element, no message. If it is working, nobody notices it.

All numbers on this page are live balance values and will be retuned; treat the mechanics as the contract and the numbers as a snapshot. Thresholds and timings live in the mode data (GameModes.xml), the mercy percentages live in code (StressRules.cs). A retune should update this page.

The stress score​


Every few seconds (currently every 10) the director computes a 0 to 100 stress score per living player from five ingredients. Each ingredient contributes up to a fixed number of points:

IngredientMax pointsWhat earns them
Health40Missing health (up to 20), missing blood (up to 10), pain level (up to 5), and being downed (5)
Mobility20Movement slowdown from fractures, pain, hunger, dehydration, fire and missing limbs, measured against the character's normal run speed
Armament25Reads the whole loadout, not just the hands: both hands, every worn slot, and one level into carried storage (slung rifles, holstered pistols, backpack guns). Spare magazines add their rounds to the best gun's count. Nothing carried scores the full 25; a gun with no rounds anywhere 18; down to the last 10 rounds 10; a melee weapon scores less the harder it hits (a strong one reaches 0). Swapping items between hands never moves the score.
Isolation15No other living player within 12 tiles scores 15; exactly one neighbor scores 8; more company scores 0
Round pressure10Grows with how deep into the phase the round is, scaled by the phase's TimeWeight, so every other ingredient weighs heavier late

The score is the sum, clamped to 100. A healthy, armed player standing in a group scores near 0; a bleeding, limping, dry-gun straggler alone at minute 25 scores near the top.

Severity tiers and how a player moves between them​


The score maps onto four tiers through per-phase thresholds authored in the mode data, and every phase also states a maximum tier it will ever assign: the score can say Extreme, but the phase's cap wins. A phase without a stress row assigns nothing at all, which is the default. Current survival values:

TierEnters at scoreWave assault (cap: Very Stressed)Extraction (cap: Extremely Stressed)
Nonebelow 40reachablereachable
Stressed40reachablereachable
Very Stressed65reachable, and the ceilingreachable
Extremely Stressed85capped down to Very Stressedreachable

Because wave assault caps at Very Stressed, the Extreme column of the mercy table below (including the internal bleed heal) only exists during extraction.

Movement between tiers is deliberately asymmetric:

  • Rising is instant. The moment a check computes a score in a higher tier, that tier applies.
  • Falling is sustained. A player only drops to a lower tier after their score has stayed below their current tier for a full sustain window (currently 20 seconds). A single lucky check does not strip the help away mid-firefight.
  • Clearing is immediate on hard exits. Death, turning, disconnecting, or the operator switching the director off all clear the tier straight to None.

Phases opt in individually: a phase without a stress block (Preparation, for example) never assigns a tier at all. In survival, the wave assault and extraction phases carry one.

What each tier does​


Each tier scales a fixed set of survival mechanics in the player's favor. 100 percent means unchanged; the table reads "you take 92 percent of normal melee damage" and so on.

EffectStressedVery StressedExtremely Stressed
Damage taken (melee, bullets, blasts, thrown, fire)92%85%75%
Blood loss per bleed cycle (external and internal)90%75%55%
Chance a heavy hit causes internal bleeding85%60%35%
Organ and bleed damage from walking on an unsplinted fracture75%40%0%
Move speed of zombies actively chasing you97%93%88%

Notes on the edges:

  • The damage reduction also quietly shrinks everything that rolls off the landed hit: fracture chance, organ hits and bleed severity all key off how much damage actually landed.
  • Only hostile damage is reduced. Medicine, surgery, walking on glass, embedded shrapnel and environmental self-damage are never scaled, and shrapnel from explosions is unaffected.
  • Only zombies that have actually noticed and are chasing the player slow down. A wandering zombie that has not seen you owes you nothing.
  • At Extremely Stressed there is one extra mercy: each check has a 20 percent chance to spontaneously heal one internal bleed, worst case first.

The other direction: adversity​


The same director watches for the opposite problem, a player who is safe, settled and bored. A player who has stayed within a few tiles of one spot for a sustained period (currently 2 minutes), sits below the phase's clear tier, and has not been visited recently (4 minutes at first, shortened by escalation) becomes eligible.

Each phase's adversity row names a clear tier (ClearedAtStressLevel, wave assault currently uses Very Stressed): reaching that tier or higher clears the player's adversity outright, wiping their hotspot and restarting their settled clock, while tiers below it do not interfere. In wave assault that means a merely Stressed camper still receives deliveries; only real trouble buys the camp a reprieve.

The camp's anchor point is not frozen: while the player stays inside the settled radius, the anchor slowly creeps toward wherever they actually spend their time (AnchorLerpPercent of the remaining distance per check, currently 10 percent every 30 seconds). A camp that gradually rearranges, a base whose action drifts from the gate to the workshop, keeps its settled identity instead of resetting at the radius edge, while anyone genuinely walking somewhere still breaks out: the anchor can only keep pace with a crawl of about a tile per half minute.

Deliveries into a persistent camp escalate: if the adversity row carries an <Escalate> element (wave assault currently does), each group delivered to the same settled camp shortens the next cooldown by ReductionSeconds until it reaches MinimumSeconds, and CountMultiplier compounds the group sizes per step, clamped at the authored CountCeiling. With the current data (multiplier 1.5, ceiling 200) an untouched camp sees 6 to 10 zombies in the first group, roughly half again more each delivery, and from about minute fourteen tops out at 103 to 171 members every 30 seconds. The ramp resets when the camp genuinely suffers (reaching the phase's clear tier), when the hotspot fully evaporates, or when the player establishes a new camp elsewhere, so the difficulty climbs exactly until a delivery works, then starts over.

Settled camps leave a hotspot: the moment a player crosses the settled threshold, their camp's spot and settled time (up to the threshold, currently 2 minutes) are remembered as a marker (one per player, replaced when they settle somewhere new). Briefly leaving the camp no longer resets the clock: while the player is away the marker slowly drains (at HotspotDecayPercent of real time, currently 1:1), and the moment they step back inside its radius their settled clock resumes from whatever the marker still holds. A player who returns to a still-warm camp is immediately eligible again once their cooldown lapses. The marker never drives anything by itself; groups are always spawned for the player, and a camp abandoned long enough simply evaporates. The director then spawns a zombie group (sized by the escalation ramp above) at a spot chosen to be close but provably out of sight of every living player, never inside a room, and marches it toward where that player was camped. If no hidden spot exists, it falls back to the nearest authored wave spawn point; if even that is observed, it skips the attempt and tries again later. Groups that cannot be delivered give up and dissolve into the ambient population rather than piling up. This only runs during the wave assault phase.
 

Where it is configured​


The per-phase triggers are mode data. The survival wave assault phase currently carries:

Code
<Stress CheckSeconds="10" SustainSeconds="20" TimeWeight="100" Maximum="VeryStressed"
        StressedScore="40" VeryStressedScore="65" ExtremelyStressedScore="85"/>
<Adversity CheckSeconds="30" HotspotDecayPercent="100" ClearedAtStressLevel="VeryStressed">
  <Settled Seconds="120" DriftTiles="12" AnchorLerpPercent="10"/>
  <DistanceTiles Minimum="20" Maximum="40"/>
  <SpawnGroup MinCount="6" MaxCount="10" CooldownSeconds="240" MaxConcurrentGroups="2"
              TtlSeconds="600" SpawnPerSecond="2">
    <Escalate ReductionSeconds="30" MinimumSeconds="30" CountMultiplier="1.5" CountCeiling="200"/>
    <Agent Def="Character.Human.Zombie.Wave"/>
    <Spawn Def="LV759.Wave.EastLandingPodlocks"/>
    <Spawn Def="LV759.Wave.EastCaverns"/>
    <Spawn Def="LV759.Wave.SouthEastCaves"/>
    <Spawn Def="LV759.Wave.SouthCentralCaves"/>
    <Spawn Def="LV759.Wave.SouthWestCaves"/>
  </SpawnGroup>
</Adversity>

The extraction phase carries the same <Stress> row with Maximum="ExtremelyStressed" and no <Adversity>. A stress row must always state its Maximum; leaving the row out entirely is how a phase opts out of stress. The mercy percentages and score weights are code constants (StressRules.cs and the director's scoring), tuned from playtests.

For tuning and verification the server has a director console command (status table, on, off) and an F7 Director tab on the server dashboard showing every player's live score, its five ingredients, tier, settled clock, hotspot state, escalation level and cooldown, plus the adversity groups in flight. The whole system is server-side: clients never receive the tier, which is why it cannot leak into any UI.
 
Back
Top