Volatile
What it is
Volatile is a world-roaming elite affix. When a host enemy carrying the affix dies, it detonates a one-shot explosion at the death point that damages the player if they are within radius and drops a Volatile Crystal prop on the ground. The detonation is purely a death-trigger — the host has no passive aura or per-frame behavior while alive. The affix is rolled at spawn time on elite-pack leaders, never appears on boss-flavored encounters, and does not require a boss arena.
Identity
| Field | Value |
|---|---|
| Affix ID | volatile |
| Category | world-roaming elite |
| Priority | 60 |
| Hooks | onDeath |
| Roll pool | world-roaming elite affix pool |
| Halo palette entry | magenta (r 255, g 60, b 200) |
Priority 60 only matters for ordering against other onDeath hooks; volatile has no damage filter, so it never participates in the priority short-circuit chain that gates incoming damage.
What it does
On host death, the affix runs four things at the death point in this order:
- Emit 24 magenta starburst particles in an evenly-spaced ring with random angular jitter.
- If the player ship is within explosion radius, apply a flat damage hit to the player.
- Spawn a Volatile Crystal prop at the death point (always attempted, pool-cap failures are silent).
- If the host also carries the reflective_burst affix, fire a second chain burst (see “How it interacts”).
The host itself takes no damage from the explosion. The player damage path runs through the engine’s shared damage-player adapter with source tag affix:volatile. The crystal drop is unconditional — it does not depend on whether the player was hit.
Per-tier values
| Param | Default | State key |
|---|---|---|
| Explosion radius | 250 world px | radius |
| Player damage | 25 | damage |
| Burst particle count | 24 | (constant) |
| Particle speed | 120–200 px/s (random) | (constant) |
| Crystal drop type | volatile_crystal | (constant) |
| Crystal drop chance | 100% (pool-cap fail-silent) | (constant) |
| Chain burst particle count (with reflective_burst) | 18 | (constant) |
The roll pool is allowed to override the radius and damage slots through the affix instance state; mistyped values (string given for a number slot) crash at first hook invocation. Anything not in the table above is fixed and not data-tunable.
How it interacts
Player proximity check
The radius check compares squared distance between the host position at death and the shared player ship. The player is hit only if (ship.x - host.x)^2 + (ship.y - host.y)^2 <= radius^2. Outside the radius, no damage lands but the visual burst and crystal drop still fire.
Volatile Crystal drop
The dropped Volatile Crystal is a prop, not an enemy. It has its own break-time synergy: when destroyed, it has a 25% chance to spawn a burning_aura proximity tick around the next hit. The drop chain is the player kills the volatile elite, a crystal appears at the death point, breaking the crystal can fire a burning_aura tick around the next damaging hit. The drop uses the engine’s late-bound spawnPropAt adapter; if the prop pool is at cap the spawn fails silently and the rest of the death path continues.
Affix × affix: volatile + reflective_burst
If the same host carries both volatile and reflective_burst, the volatile onDeath fires a second chain burst on top of the magenta starburst:
| Param | Value | Source |
|---|---|---|
| Chain burst particle count | 18 | volatile onDeath |
| Chain burst palette | purple (reflective_burst palette) | shared palette |
| Chain damage | reflective_burst burstDamage (default 10) | reflective_burst state |
| Chain radius | reflective_burst radius (default 180 world px) | reflective_burst state |
Both bursts paint the same death point for roughly 1.5 seconds. The chain hit-check is independent from the volatile radius — the player can land outside the volatile radius and still take the reflective_burst chain hit (or vice versa). Telemetry tag: affix_interaction:volatile_reflective_chain.
Affix × affix: volatile + summoner (perceptual only)
If the same host carries summoner, the summoner spawn proc overlays a 4-particle magenta micro-burst at each minion spawn point as a pre-tell that this host will pop on death. This is a visual cue only — the actual volatile explosion only fires when the host itself dies, not when minions die. Minions never inherit the affix.
Pipeline notes
The volatile onDeath hook is the first consumer of the engine’s prop-spawn adapter. The adapter is late-bound at engine boot via setAffixSpawnPropAt; if a hook fires before wiring, the engine throws loudly rather than silently swallowing the drop. The damage-player adapter is wired through the same boot path.
EXTRACT-CANDIDATE
- The “elite drops a themed prop on death” pattern is shared with regenerating (mineral_vein), reflective_burst (volatile_crystal), phasing (comet_fragment), summoner (scrap_pile × 3), hardened (drone_wreck), and gravity_well (magnetar_pulse). The full prop-drop mapping belongs on a roll-up page in the affixes overview or a dedicated “elite drops” concept page rather than duplicated per affix.
- The damage-player and prop-spawn late-bound adapter pattern (boot-time wiring with loud-throw on early call) is shared by all world-roaming affixes that touch the player or spawn props. The canonical home is the affixes runtime/architecture page.
- The 24-particle starburst recipe (evenly-spaced ring, random angular jitter, 120–200 px/s outward speed) is reused by reflective_burst (18 particles, otherwise identical shape). The recipe is a candidate for a shared “affix VFX primitives” sub-page.