Affixes

1. What it is

Affixes are behavior primitives attached to enemies. Boss-flavored affixes (anchor-shield, gating, phase swaps, periodic invuln, reflective, armored) compose boss encounters inside a boss arena. World-roaming elite affixes (eight in total) roll onto elite-pack leaders in the open world and add damage, defense, regen, summons, retaliation, drops, and crowd-control beats.

2. Stats and variables

2.1 Boss-flavored affixes

AffixPriorityHooksMagnitudeEffect
shielded100onSpawn, filterIncomingDamage4 anchors at 0.42 × arena radius, default anchor type caimanHost takes 0 damage while any anchor is alive
shielded_respawn100onSpawn, onUpdate, filterIncomingDamage4 anchors, respawn interval 12 sSame as shielded; respawns any dead anchor every 12 s
gated90filterIncomingDamageSibling enemies sharing gateGroupIdHost takes 0 damage while any sibling in its gate group is alive
respawn_as95onUpdateList of (hpFrac threshold, nextTypeId) phases, optional next affix and ability setsOn HP-fraction crossing, despawn host silently and spawn replacement body at same position; carries hp, hpMax, displayName, barColor, boss flags; new phaseIndex stamped on replacement
periodic_invuln85onUpdate, filterIncomingDamageDefault window 3 s, default interval 10 s, optional cancelAnchorTypeIdHost enters invuln window on cadence; if cancelAnchorTypeId is set and no anchor of that type is alive, window ends early
reflective80filterIncomingDamagereflectFraction param requiredReserved stub; damage to host unchanged, no projectile spawn yet
armored20filterIncomingDamageDefault armorMult 0.5Incoming damage multiplied by armorMult

2.2 World-roaming elite affixes

AffixPriorityHooksMagnitudeEffect
burning_aura60onUpdateRadius 200, DPS 6Player takes 6 DPS while within 200 px of host; ~5 flame particles/sec orbiting host
volatile60onDeathRadius 250, damage 25On host death, 24-particle magenta starburst; player takes 25 damage if within 250 px; drops a Volatile Crystal at death point
regenerating50onUpdate, onDeath1.5% of hpMax per secondHost heals 1.5% maxHP/s while below max HP; ~3 green spark particles/sec; drops a Mineral Vein on death
reflective_burst70filterIncomingDamage, onDeathThreshold 12 damage, radius 180, burst damage 10When an incoming hit meets or exceeds 12 damage, fires 18-particle purple ring; player takes 10 damage if within 180 px; host takes full damage anyway; drops a Volatile Crystal on death
phasing75onUpdate, filterIncomingDamage, onDeathWindow 1.2 s, cycle interval 8 sHost is invulnerable for 1.2 s every 8 s; ~6 blue particles/sec during the active window; drops a Comet Fragment on death
summoner40onUpdate, onDeathHP threshold 50% of max, minion type orb_common, minion count 2, spawn distance 60 pxOne-time proc when host HP drops below 50%; spawns 2 orb_common minions in an evenly-spaced ring 60 px around host with red spark burst at each spawn point; drops 3 Scrap Piles in a 40 px triangle on death
hardened25onUpdate, filterIncomingDamage, onDeathMax reduction 0.5, ramp duration 30 sDamage taken multiplied by (1 − maxReduction × elapsed / rampDuration), capped at 0.5 multiplier (50% reduction) at 30 s; silver glint particles after ramp peak ~2/sec; drops a Drone Wreck on death
gravity_well55onUpdate, onDeathPull radius 150 px, pull accel 60 px/s², emit interval 0.25 sViolet swirl orbits host at ~4 particles/sec; drops a Magnetar Pulse on death (the corpse-drop carries the gravity pull)

2.3 Roll bands (world-roaming pool)

Host rarityAffix count
common0
uncommon0
rare1, with 70% chance to roll at all (else 0)
epic1 (50%) or 2 (50%)
legendary2 (50%) or 3 (50%)

The world-roaming pool is burning_aura, volatile, regenerating, reflective_burst, phasing, summoner, hardened, gravity_well. Sampling is without replacement, capped by pool size.

2.4 Archetype affix bias

Bias weight is 3.0. The biased affix is sampled with 3 × the weight of unbiased entries when both are in the pool.

ArchetypeBiased affix
chargerhardened
brutehardened
racerphasing
mortarvolatile
bombardiervolatile
sniperreflective_burst
lurkerreflective_burst
gunnerburning_aura
wispsummoner
fieldregenerating
orbgravity_well

Unmapped or unset archetypes fall back to uniform sampling.

2.5 Palette colors (world-roaming halo tints)

Affixrgb
burning_aura25511030
volatile25560200
regenerating80220120
reflective_burst180100255
phasing135180255
summoner220100100
hardened200200220
gravity_well16090255

Boss-only affixes have no palette entry and produce no world-elite halo.

2.6 Affix × affix interaction effects

TriggerCo-present affixEffect
volatile.onDeathreflective_burst18-particle purple ring overlay on the magenta starburst; player takes the reflective_burst burst damage (10) if within 180 px
regenerating.onUpdatephasing during active windowHeal rate doubles
regenerating.onUpdatehardened, after ramp peak (elapsed > 30 s)Heal rate doubles
summoner.onUpdate procvolatile4-particle magenta overlay at each minion spawn point; no mechanical change
summoner.onUpdate procgravity_wellMinion spawn distance reduced to 60% of normal (36 px default); 4-particle violet inward burst at each minion spawn
summoner.onUpdate procregeneratingOne-shot 25%-of-maxHP heal on the host, 12-particle green ring
summoner.onUpdate procphasingHost’s phasing cycleTimer set to windowDuration (immediate fresh invuln window)
summoner.onUpdate procreflective_burstReflective_burst threshold permanently halved on the host
hardened.filterIncomingDamagephasing during active windowHardened jumps to peak reduction (1 − maxReduction = 0.5 multiplier), skipping ramp
reflective_burst.filterIncomingDamagegravity_wellBurst radius scales × 1.5 (180 → 270 default); 12 extra violet particles for the enlarged-ring tell
gravity_well.onUpdatephasing during active windowSwirl emit interval halves (0.25 s → 0.125 s), doubling particle rate

3. How it works

  • Each affix is a record of hooks: onSpawn, onUpdate, filterIncomingDamage, onDeath. Each hook is optional.
  • Affixes are registered in a global registry at engine boot. ID collisions throw; unknown IDs throw.
  • A host’s affix list is sorted by descending priority on every dispatch. The list is small in practice (3 or fewer).
  • onSpawn runs once when the enemy spawns. Boss-flavored anchors (shielded, shielded_respawn) place their anchor enemies at evenly-spaced points on the arena’s 0.42-radius ring.
  • onUpdate runs every frame with delta time. Per-host state lives on the affix instance (timers, accumulators, triggered flags).
  • filterIncomingDamage runs in descending priority order on each incoming hit. If any hook returns 0, the chain short-circuits and the host takes 0 damage.
  • onDeath runs once when the host dies. Most world-roaming affixes drop a prop at the death point.
  • World-roaming affixes roll at elite-pack leader spawn time. The roll picks a target count from the host’s rarity band, applies any archetype bias to weight the pool, and samples without replacement.
  • Anchors spawned by shielded and shielded_respawn do not share HP with the boss, carry no affixes, do not count as bosses, and fire a boss-anchor-destroyed signal when killed.
  • respawn_as silently kills the old host (no death VFX, no death signals), spawns the next type at the same position, carries over HP, hpMax, display name, bar color, and boss flags, optionally swaps the affix list and ability list, and stamps a new phaseIndex. The replacement’s affixes run through the standard onSpawn dispatch on the next frame.
  • periodic_invuln cycles through interval → window → interval. If a cancelAnchorTypeId is set, the window ends early when no anchor of that type is alive.
  • phasing is active while its cycleTimer is at or below windowDuration; the timer counts down through the cycle interval and resets at zero.
  • hardened ramps linearly from 1.0 damage multiplier at spawn to (1 − maxReduction) at rampDuration seconds and clamps there.
  • summoner is one-shot: once the HP-fraction threshold is crossed, the triggered flag latches and the host cannot summon again.
  • burning_aura ticks damage every frame the player is in radius. DPS is multiplied by delta time per frame.
  • volatile fires the explosion and the prop drop on host death. The reflective_burst chain overlay also fires from inside volatile.onDeath when both affixes are present.
  • regenerating heals every frame and is capped at hpMax.
  • reflective_burst gates on dmg ≥ threshold at filter time. The burst is a pure side effect; the host still takes the full incoming hit.
  • gravity_well’s host-side hook is a visual swirl only. The actual gravity pull comes from the Magnetar Pulse prop it drops on death.

4. Interactions

  • The damage filter chain runs in descending priority. A 0-return short-circuits the chain and prevents further reductions.
  • Boss-flavored and world-roaming affixes share the same registry and dispatch path; only the roll pool differs.
  • World-roaming affixes never appear on boss arenas via the roll path (they roll only on elite-pack leaders).
  • Boss-flavored affixes never appear in the world-roaming roll pool and have no halo color.
  • Anchor enemies spawned by shielded and shielded_respawn carry no affixes themselves.
  • respawn_as can swap affix and ability lists per phase. The respawn_as instance itself is carried forward with a fresh prevHpFrac reset to the replacement’s current HP fraction so the next threshold is not immediately re-crossed.
  • The phasing × hardened pair stacks defenses: phasing zeroes the hit and hardened pre-locks to peak reduction during the window.
  • The phasing × regenerating and hardened × regenerating pairs double heal rate.
  • The summoner proc cascades into co-present affixes: volatile gets pre-tell particles at each minion spawn, gravity_well clumps minions inward, regenerating heals 25% maxHP, phasing snaps to an invuln window, reflective_burst’s threshold permanently halves.
  • The volatile + reflective_burst pair fires both bursts on death and double-checks player proximity for both damage instances.
  • The gravity_well + reflective_burst pair grows the burst radius by 50%.
  • The gravity_well + phasing pair doubles the gravity_well swirl emit rate during the phasing window.
  • Most world-roaming affixes drop a prop on host death: volatile and reflective_burst drop Volatile Crystal, regenerating drops Mineral Vein, phasing drops Comet Fragment, summoner drops a 3-cluster of Scrap Piles in a 40 px triangle, hardened drops Drone Wreck, gravity_well drops Magnetar Pulse. Prop drops fail silently if the prop pool is at cap.

5. What it does NOT do

  • Does not apply world-roaming affixes to common or uncommon enemies (zero count for those bands).
  • Does not apply affixes to anchor enemies spawned by shielded or shielded_respawn (anchors have their affix list cleared at spawn).
  • Does not let a single host carry the same affix twice (sampling is without replacement).
  • Does not guarantee an archetype’s biased affix lands; bias weight 3.0 makes it more likely, not mandatory.
  • Does not reduce damage when reflective is on a host (reflective is a reserved stub; passes damage through unchanged).
  • Does not run a per-frame regen telemetry stream; regen records only ~1 sample per second during co-presence interactions.
  • Does not retrigger summoner after its one-shot proc; the triggered flag is permanent for that host.
  • Does not auto-register the affix catalog at module import; registration runs once at engine boot to break a circular import path.
  • Does not let respawn_as fire boss-body-kill or boss-kill signals on the silently replaced host body.
  • Does not move volatile or reflective_burst host damage; both affixes’ bursts are side effects only — the host takes its full incoming damage.
  • Does not pull the player inward from the gravity_well affix itself; the pull lives on the Magnetar Pulse prop the affix drops on death.
  • Does not run affix hooks when the host’s affix list is empty (early return).