Carpet Bomber zones
What this is
Carpet Bomber (lgd_napalm_mortar, behavior carpet_bomber) is the bomb+fire legendary. Each weapon fire spawns a viewport-pinned bomber that follows the player and drops a sequence of bombs along a horizontal line. Every bomb impact produces three damage layers in the same frame: a direct AoE blast, a short-lived fire_patch_zone bullet, and an echo into the shared flame-zone runtime. This page documents the two persistent ground patches (the bullet-behavior patch and the shared-runtime echo) and the rules for how they interact when they overlap.
fire_patch_zone bullet
The fire_patch_zone bullet is a standalone, self-ticking ground patch. It is pushed into world.playerBullets for each bomb impact and runs the fire_patch_zone BulletBehaviors update each frame. It is not a member of the shared flame-zone runtime — it has its own tick rate, lifetime, and cleanup path through the bullet lifetime system.
| Field | Value | Notes |
|---|---|---|
| Bullet archetype | fire_patch | Renders as a fire patch sprite |
| Registered behavior | fire_patch_zone | priority: 1 |
| Lifetime | 2.5 s | Both l and maxLifetime |
| Zone radius | bomb blast radius x 0.7 | _zoneRadius = blastR * 0.7 |
| Per-tick damage | ceil(bomb_damage x 0.06) | Stored on dmg, minimum 1 |
| Tick rate | 5 Hz | _zoneTickRate = 5; interval = 0.2 s |
| Movement | None | vx = 0, vy = 0 |
| Pierce / hits | Pierce-all | _collisionMode = 'pierce_all', pierceCount = 0 |
| Target filter | Alive, non-dying, post-spawn enemies | Skips _frozenForLag, _dying, _spawnT > 0.15 |
| Spatial query | enemyGrid.query(x, y, radius + 30) | Spatial grid, not a full enemy scan |
| Hit shape | Filled circle including enemy radius | (dx*dx + dy*dy) < (r + enemy_radius)^2 |
| Hits destructibles | No | _canHitDestructibles = false |
| Cap | None specific to this bullet | Subject to world.playerBullets.length < 100 spawn gate |
| Damage tag | Inherits weapon’s damageTag | Routed through damageEnemy |
| Telemetry | recordWeaponHit(weaponId, dmg) per tick | Per-enemy per-tick |
| VFX | Random ember spawn at 30 percent of frames | Halved in v5.156.3 |
| Cleanup | Bullet expires via l <= 0 | Removed by the standard bullet sweep |
The 5 Hz tick and the 2.5 s lifetime yield up to 12 ticks against a stationary enemy that stays inside the radius for the full duration.
Echo into shared flame zones
Each bomb impact also calls spawnFlameZone(landX, landY, 50, bomb_damage * 0.20, 0.8) on the shared flame-zone runtime described in flame-zones. This echo is the in-game “Bomb Pyre” reference in the code comments. The runtime owns its own list, tick interval, eviction policy, and VFX, so the echo behaves identically to a Fire Trail patch or a Thermite Charge pulse once spawned.
| Field | Value | Notes |
|---|---|---|
| Spawn function | spawnFlameZone | From src/starship-survivors/engine/effects/custom-handlers.ts |
| Position | Bomb impact (landX, landY) | Same point as the blast and the bullet patch |
| Radius | 50 | Fixed; not scaled by blast radius |
| DPS input | bomb_damage x 0.20 | Per the shared runtime’s dps contract |
| Duration | 0.8 s | Fixed |
| Per-tick damage | dps x 0.25 | Runtime constant FLAME_DPS_TICK = 0.25 |
| Tick interval | 0.25 s | Runtime constant FLAME_DPS_TICK |
| Ticks at full duration | 3 | 0.8 / 0.25 = 3.2, floor effect from tick timer |
| Total potential per zone | bomb_damage x 0.20 x 0.8 = bomb_damage x 0.16 | If a target stays for the full 0.8 s |
| Damage tag | Fire | Echo is fire-tagged; spawner damage tag flows through damageEnemy |
| Eviction | FIFO at 16 simultaneous shared-runtime zones | Runtime constant FLAME_MAX_ZONES = 16 |
| Hits destructibles | No | Runtime queries enemies only |
| Render | Layered radial-gradient fire disk + ember/smoke particles | Composite mode lighter |
How the two interact
The bullet patch (fire_patch_zone) and the shared-runtime echo are independent systems that overlap on each bomb impact. They do not share a tick clock, a damage counter, an eviction policy, or a deduplication pass — an enemy standing on a bomb impact takes damage from both layers, and the AoE blast is a third instant hit at the same frame.
| Interaction | Behavior | Source |
|---|---|---|
| Bomb impact frame | AoE blast (damageEnemy once) + bullet patch spawn + echo spawn | All three fire in the same update iteration per bomb |
| Co-located radii | Bullet radius is blastR x 0.7, echo radius is fixed 50 | Bullet patch is wider for default blast >= 72 |
| Stacking per tick | Independent — each system applies its own tick | An enemy in both takes one bullet-patch tick (5 Hz) and one runtime tick (4 Hz) on their own schedules |
| Lifetime mismatch | Echo expires in 0.8 s; bullet patch persists for 2.5 s | The bullet patch keeps ticking after the echo is gone |
| Shared-runtime cap pressure | Each bomb consumes one of 16 shared-runtime slots | A full Carpet Bomber salvo (up to 18 bombs at L20) can evict every other Fire Trail / Thermite Charge / earlier-bomb echo currently active |
| Bullet cap pressure | Bullet patch spawn is gated by world.playerBullets.length < 100 | If the gate fails, the bullet patch is skipped but the AoE blast and the echo still fire |
| Destructibles | Bullet patch and echo both skip destructibles; only the AoE blast can damage them | Carpet Bomber’s canHitDestructibles: true applies to the blast layer only |
| Damage tagging | Both layers carry fire | Echo is hard-coded fire; bullet patch inherits the weapon’s damageTag, which is bomb on the base weapon but the bullet patch’s dmg is routed through damageEnemy with whatever tagging the weapon spec carries |
| VFX overlap | Both systems emit embers at the same point | Bullet patch is 30 percent per frame; echo runs the full shared-runtime VFX pass at 0.06 s |
| Run reset | Bullet patch is cleared with player bullets; echo list is cleared by clearFlameZones | Different code paths, same outcome |
The practical effect: a single bomb against a stationary enemy can deliver, in order, one AoE hit, up to three echo ticks over 0.8 s, and up to twelve bullet-patch ticks over 2.5 s, all on top of any other shared-runtime patch the player has active. The 16-slot shared-runtime FIFO is the most likely source of “missing” damage in a stacked Fire-Trail-plus-Carpet-Bomber build, because a single Carpet Bomber salvo can evict every prior Fire Trail patch on the field.