Plasma Mortar zones
What this is
The Plasma Mortar legendary (lgd_arc_flame, energy+fire) lobs a slow arcing shell that, on impact, spawns a persistent damage patch in addition to its primary blast. That patch is a one-off bullet, not an entry in the shared flame-zone runtime. It is created inside the plasma_mortar_land behavior’s onDeath hook by pushing a new bullet into world.playerBullets with archetype plasma_fire_zone and a single behavior of the same name. The behavior’s update loop scans world.enemies directly each tick, applying damage in radius. Because it lives in the player-bullet pool, it counts against the same 100-bullet pool cap used elsewhere in the spawner and is independent of the shared zone runtime’s 16-zone FIFO cap.
How it differs from flame-zones
Flame-zones are a shared runtime owned by the effects system: Fire Trail, Thermite Charge, and the Carpet Bomber’s per-bomb echo all spawn into a single managed list with a global cap. The Plasma Mortar’s zone is a parallel code path. The differences are mechanical, not cosmetic.
| Aspect | Plasma Mortar zone (plasma_fire_zone) | Shared flame-zone runtime |
|---|---|---|
| Owning system | BulletBehaviors (bullet pool) | effects runtime (managed zone list) |
| Storage | One bullet in world.playerBullets | Entry in the runtime’s active-zone array |
| Pool cap | Shares the 100-bullet player pool cap | 16 simultaneous zones, oldest evicted FIFO |
| Tick rate | 4 Hz (interval = 1 / _zoneTickRate) | 4 Hz (fixed 0.25 s interval) |
| Target query | Linear scan of world.enemies each tick | Spatial-grid bucket lookup |
| Damage input | Per-tick value, precomputed at spawn | DPS contract, runtime multiplies by 0.25 s |
| Damage tag carrier | Energy (weapon’s primary damageTag) | Source-dependent (fire for the three shared sources) |
| Destructible hits | Disabled (_canHitDestructibles: false) | Runtime-controlled |
| Collision mode | pierce_all | N/A (no bullet collision) |
| Final-burst VFX on expiry | None | Shared runtime emits a final burst |
| Eviction trigger | Lifetime expiry only | Lifetime expiry or FIFO eviction by newer zone |
The Plasma Mortar zone also carries the energy damageTag from the parent weapon, while shared-runtime zones inherit fire from their (currently all fire-tagged) spawners.
Damage model
The zone is spawned by plasma_mortar_land.onDeath using the impact bullet’s runtime fields. The per-tick damage is baked at spawn — the zone does not re-read weapon stats afterwards.
| Field on zone bullet | Source value | Notes |
|---|---|---|
_zoneRadius | impact bullet _aoeRad × 0.8 | 80% of the resolved blast radius at landing |
dmg | ceil(impact_damage × 0.10), floor 1 | Per-tick damage, fixed for the zone’s life |
_zoneTickRate | 4 | Ticks per second |
_zoneTickT | accumulator | Reset to 0 after each damage tick |
| Damage application | damageEnemy(e, b.dmg, ...) per enemy in radius | Linear scan of world.enemies |
| Hit gate | `dist < _zoneRadius + (enemy.radius | |
| Skip filter | Dead, _dying, _frozenForLag, or _spawnT > 0.15 enemies skipped | Active spawn-protection respected |
| Telemetry | telemetry.recordWeaponHit(weaponId, dmg) on hit | Attributed to lgd_arc_flame |
Because dmg is precomputed at spawn, mid-life buffs to the weapon do not retroactively scale an already-spawned zone. A target standing in the patch the full lifetime takes ceil(impact_damage × 0.10) × 4 × 3 = ceil(impact_damage × 0.10) × 12 damage.
The zone also does not abort spawning if _aoeRad is zero — the plasma_mortar_land behavior returns early in that case, so no zone exists at all.
Lifetime
| Field | Value | Notes |
|---|---|---|
l (lifetime remaining) | 3.0 s | Counted down by the standard bullet lifetime decrement |
maxLifetime | 3.0 s | Reference for any lifetime-based VFX |
| Total ticks if pool slot held | 12 | 4 Hz × 3.0 s |
| Eviction mid-life | Only via pool-cap pressure | The 100-bullet world.playerBullets push is gated by length < 100; an existing zone is not evicted by a later spawn |
| Cleanup | Standard bullet despawn at lifetime expiry | No final-burst VFX call from this behavior |
| Carry between runs | None | Bullet pool cleared on run reset |
If the player-bullet pool is already at 100 entries when the shell lands, the zone is silently not spawned (the impact explosion still resolves). The same gate also applies to the three Plasma Droplet echo bullets the same onDeath hook fires.
Summary: Documented the Plasma Mortar’s plasma_fire_zone bullet-behavior — a separate persistent-damage-patch path from the shared flame-zone runtime. Contrasted ownership, pool, tick path, tag, and eviction; specified spawn-time damage formula (ceil(impact_damage × 0.10)), 4 Hz tick rate, 80%-of-blast radius, and 3.0 s lifetime; noted the 100-bullet pool gate and absence of mid-life rescaling.