What it is

Combat resolves through circle-and-polygon hitboxes: weapons fire bullets and beams that test against enemy bodies; enemies fire bullets that test against the player’s convex hull polygon; the ship’s body itself rams enemies when it makes contact at speed. Every damage event flows through one of two chains — player-takes-damage or enemy-takes-damage — which apply multipliers, route through shield then hull, deliver knockback, and emit feedback (flash, shake, freeze-frame, floating numbers).

Stats / variables tables

Global player-damage multiplier

StatValue
Outgoing-damage multiplier (PLAYER_DAMAGE_MULT)0.263

Player-take-damage chain — multipliers

StageStatValue
Flat damage reductionFormulamax(0, 1 − damageReduction / 100)
Flat damage reductionClamp at 100% DRall damage zeroed
Threshold DRHP fraction at which threshold DR begins40%
Threshold DRHP fraction at which threshold DR maxes out5%
Threshold DRMaximum reduction24%
Threshold DRRamplinear from 0% at 40% HP to 24% at 5% HP
Final damageFormulaamount × flatDR × thresholdDR

Player knockback (on every damaging hit)

StatValue
Base knockback magnitude5
Per-damage magnitude0.19 × final damage
Knockback cap15
DirectionOpposite of incoming hit angle
Knockback when invulnerable0 (skipped)
Knockback when final damage is 0Still applied (base value)

Shield rules (player)

StatValue
Shield-hit invuln-flash duration0.3 s
Shield-break grace invulnengine config INVULN
Shield-break linger timer2.5 s
Bleed-through from shield to hullNone
Hull damage while shield > 0None
Shield regen delay reset triggerAny damage
Background shield regen reset triggerAny damage
Damage taken during background regenRoutes to hull; cancels regen progress
Shield damage breaks kill streakNo

Shield-damage feedback

StatValue
Shield-hit camera shake amp4 + (absorbed / shieldMax) × 5
Shield-hit camera shake dur0.18 + (absorbed / shieldMax) × 0.12 s
Shield-hit freeze-frame0.025 + (absorbed / shieldMax) × 0.04 s
Shield-break camera shake amp11
Shield-break camera shake dur0.45 s
Shield-break freeze-frame minimum0.10 s
Shield-break invert-screen duration0.10 s

Hull-damage feedback

StatValue
Hull-hit camera shake amp6 + (hullDmg / hpMax) × 8
Hull-hit camera shake dur0.25 + (hullDmg / hpMax) × 0.20 s
Hull-hit freeze-frame0.04 + (hullDmg / hpMax) × 0.06 s
Hull-hit silhouette flash duration0.08 s
Red screen flash intensity0.3 + (hullDmg / hpMax) × 2.0 (capped at 1.0)
Hull damage breaks kill streakYes

Damage types (weapon)

TypeRouting
normalShield absorbs first; if shield > 0, all damage absorbed; never bleeds to hull
trueBypasses shield absorption; applies straight to hull

Damage tags (weapon)

TagUse
bulletbullet-DMG modifier, bullet artifacts, blood-splatter exit-wound spray, ricochet pip
energyenergy-DMG modifier, energy artifacts, electric-arc impact VFX
firefire-DMG modifier, fire artifacts, ember spark + smoke wisp on hit
bombbomb-DMG modifier, bomb artifacts, shrapnel + dust on hit; explosive-blast route

Enemy bullet → player hull modifiers

SourceMultiplier vs hullMultiplier vs shield
Shooter machine-gun bullet0.351.0
All other enemy bullets1.0 (unless source-tagged)1.0

Enemy-take-damage — multipliers (in order applied)

StageStatValue
Boss shield absorbCapmin(damage, current shieldHp)
Shred multiplierSourceper-enemy status (shredded)
Affix damage filter chainSourceper-affix hook (shielded, gated, armored, periodic_invuln, reflective, reflective_burst, phasing, hardened)
Boss-bar cap (shared-health bodies)Formulamin(damage, 30 + sumOfLiveBarHpMax × 0.02)
Single-body boss / dmg-capped capFormulamin(damage, 30 + enemy.hpMax × 0.02)
Per-part hit immunity after a capped hitDuration0.20 s (12 frames at 60 fps)
Damage squash impulse on enemyDuration0.15 s

Enemy invulnerability conditions

ConditionEffect
Not aliveDamage ignored
Frozen-for-lag (HP=0, lag-bar draining)Damage ignored
Charger in lunge phase 2Damage ignored; “Immune” floating text fires (cooldown 5 s per enemy)
Boss or dmg-capped enemy with _hitImmune > 0Damage ignored
Shared-health boss bodyNon-player damage sources ignored
Spawn protection_spawnT > 0.15 s blocks collision insertion into grid
Dying / death VFX playingUntargetable, uncollidable

Knockback on enemies (Personal Space artifact path)

StatValue / source
Knockback forceArtifact-provided (getWeaponKnockback)
DirectionFrom ship outward toward enemy
Stun durationLegendary-tier artifact-provided (getWeaponStunDuration)
Elite (pack-leader) immunity100% to knockback and stun

Ship-vs-enemy body contact (ram / vehicle physics)

StatValue
Ram speed threshold (default)150 u/s
Ram low-speed damage (default)40
Ram high-speed damage (default)1000
Ram speed-high cap for interpolation5000 u/s
Ram damage formularound((RAM_DMG_LO + t × (RAM_DMG_HI − RAM_DMG_LO)) × meleeMult); t = clamp(0,1, (speed − threshold) / (5000 − threshold))
Ship-class mass — heavy3.0
Ship-class mass — medium2.0
Ship-class mass — light1.0
Ship mass formulaclassMass × shipScale
Enemy mass formulaenemyCollisionRadius × 0.07
Speed factor cap2.0
Speed factor formulamin(2.0, shipSpeed / 200)
Enemy knockback on contact200 × enemyFrac × speedFactor (per dt scaled by 60)
Ram speed bleed (ship velocity multiplier)1.0 − clamp(0.15, 0.85, shipFrac)
Sub-ram contact bleed (shipSpeed > 30)1.0 − clamp(0.1, 0.7, shipFrac × 0.8)
Sub-ram floorapplies only above 30 u/s
T-bone arc (forward)±40° (0.7 rad)
Per-enemy contact cooldown after collisionship.contactCooldown (default 0.25 s)
Ship-damage on contact (incoming)Skipped when ship is invulnerable

Warp-line damage (player warp-pass utility)

StatValue
Corridor half-width25 px
Damage per hit120 (before player-damage multiplier)
Perpendicular knockback strength on hit200

Explosive blast (cannon / missile / bomb-arch family)

StatValue
AOE damage fraction of direct damage50%
Falloff at center100%
Falloff at blast-radius edge30% (i.e. 1 − 0.7 × distFrac)
Primary target re-hit by AOESkipped (added to bullet hits-set)

Chain-arc weapon

StatValue
Default per-jump damage falloff0.88 × previous
Default max chain count3 (first hit + 2 jumps)
Default jump delay between arcs0.06 s
Default chain radius100
First-target acquire rangeweapon.acquireRange or chainRadius
Total chain reachacquireRange + chainRadius × 2
Manual-fire forward cone±45° (cos π/4)

Beam-trace weapon

StatValue
Default beam range200
Default beam width4
One-frame hit registerDamage applied once per enemy per fire

Tesla-line weapon

StatValue
Default line thickness6
Default contact cooldown per enemy0.3 s

Enemy-bullet arming

StatValue
Min travel distance from spawn before bullet hitbox armsENEMY_PROJ_ARM_DISTANCE
Fizzling enemy bullet hitboxDisarmed (visible but inert)

Enemy-enemy separation (boid)

StatValue
Separation range60
Separation force150
Spawn-protection (no separation)_spawnT > 0.15 s
Currently enabled in main resolveDisabled (enemies pass through each other; flock behaviors handle their own spacing)

Lifesteal

StatValue
Heal per enemy hitrawDmg × ship.lifeSteal
Heal capship.hpMax
Lifesteal sourceStacks from artifact procs + Leech modifier (+0.005 per rank)

Damage-floor / flooring

StatValue
AOE-damage floor per hit (explosive blast)max(1, ceil(directDmg × 0.5 × falloff))
Minimum enemy-XP-orb amountmax(1, ceil(…))
Damage-tag particle scalingmax(2, min(10, round(2 + dmg / 60)))

Critical hits

StatValue
Critical hit / damage multiplier in core combatNone (no crit roll in the damage chain)

Friendly fire

StatValue
Player damage to playerNone
Enemy damage to enemyNone (enemy bullets only collide with player; explosive AOE only damages enemies and destructibles)
Reflective affixesBounce a copy of damage back toward player via affix filter chain

Gauntlet kill-switch

StatValue
ship._gauntletPlayerDamageDisabledSuppresses all player-sourced damage to enemies for the duration of the gauntlet

How it works (gameplay flow)

Player takes damage

  • Invuln gate first: if the ship is invulnerable, damage and knockback are both skipped.
  • Flat DR multiplier applied (damageReduction / 100, clamped at 100%).
  • Threshold DR applied: at low HP the player becomes increasingly durable, reaching 24% damage reduction at 5% HP.
  • Final damage = amount × flatDR × thresholdDR.
  • Knockback applied unconditionally (capped at 15) opposite the hit direction. Even zero-damage hits push the ship.
  • If shield > 0, the shield absorbs the entire final damage value. Excess damage past shield HP is discarded. Hull is untouched.
  • If shield == 0, hull takes the damage (multiplied by hpDamageMult if the source provides one; shooter machine-gun bullets use 0.35).
  • When this hit drops the shield to zero, the ship gains shield-break grace invulnerability so the same attack does not chunk hull in the same frame, and shield enters background-regen-from-zero mode (damage during regen routes to hull and cancels regen progress).
  • Shield regen delay timer resets to ship.shieldRegenDelay on every damage event.
  • Hull damage breaks the kill streak; shield damage does not.

Enemy takes damage

  • Dead, frozen-for-lag, dying, charger-phase-2, and per-part hit-immune enemies all reject damage outright.
  • Boss shield (where present) absorbs first; if it absorbs the full hit, no bar drain.
  • Shred multiplier scales remaining damage (shredded enemies take more).
  • Affix damage filter chain runs in priority order: shielded/shielded_respawn (100), respawn_as (95), gated (90), periodic_invuln (85), reflective (80), phasing (75), reflective_burst (70), burning_aura/volatile (60), gravity_well (55), regenerating (50), summoner (40), hardened (25), armored (20). Any filter can short-circuit damage to zero.
  • Boss damage cap applies after filters: 30 + maxHP × 2% per hit. Shared-health boss bodies cap against the live pool of all bar-contributing bodies, not just the one being struck.
  • After a capped hit, the boss part enters 200ms hit-immunity.
  • Damage is subtracted, flash and squash trigger, floating damage number spawns.
  • Personal Space artifact knockback applies (elite pack leaders are immune).
  • Lifesteal heals the player by damage × ship.lifeSteal.
  • On lethal damage the enemy is frozen-for-lag (HP=0, lag-bar drains visually) before transitioning to dying state; kill credit, signals, kill-streak, XP orbs, and elite/boss bonuses all fire at the kill-blow moment, not when the visual finishes.

Ship contact / ram damage

  • Triggered when the ship’s hull polygon overlaps an enemy collision circle.
  • Ship is invulnerable from this path while ship.invulnerable is true.
  • Per-enemy contact-cooldown (default 0.25 s) prevents repeated triggers.
  • Mass-weighted push-apart separates ship and enemy by their mass fractions of the overlap.
  • If shipSpeed ≥ ram threshold (default 150 u/s): ram damage applies to the enemy (lerp 40 → 1000 across speed range, × meleeMult), ship velocity bleeds by the mass-share factor.
  • T-BONE label fires when the enemy lies within ±40° of the ship’s heading at the moment of ram.
  • Charger in phase 2 and charger-recovering states skip the contact pass entirely.

Boss damage caps

  • Single-body boss / dmg-capped enemy: each hit capped at 30 + hpMax × 2%, plus 200ms per-part immunity.
  • Shared-health boss: each hit capped at 30 + (sum of live bar bodies’ hpMax) × 2%. Non-player damage sources cannot damage shared-health bodies at all.
  • Boss shield (hasShield) is absorbed before the cap is computed.

Interactions

  • Weapons: damage flows from each weapon’s WeaponCoreSpec — base damage, fireRate, projectileCount, blastRadius, chainCount, beamWidth, behavior tags, plus damageTag and damage_type (‘normal’ vs ‘true’). Legendary weapons carry a secondaryDamageTag that fires a second damage-tag signal.
  • Ships: shipClass (heavy/medium/light) × shipScale sets ram mass; ramThreshold / ramDamageLo / ramDamageHi / meleeMult / contactCooldown / outerRadius / hullPoly are per-ship physics stats. damageReduction, hpMax, shieldMax, shieldRegenDelay, shieldRegenRate, lifeSteal, invulnerable, invulnTimer all read from ship state.
  • Modifiers (horizontals): Health (hpMax + damageReduction + hpRegen), Shield (shieldMax + regen rate + regen delay), Vitality (hpRegen), Bulwark (damageReduction), Charge / Overshield (shield), Leech (lifeSteal), tagged damage modifiers (damage_bullet / energy / fire / bomb at +25% per rank, damage_all at +10% per rank).
  • Affixes: filterIncomingDamage hooks on shielded, shielded_respawn, gated, periodic_invuln, reflective, reflective_burst, phasing, hardened, armored — each can scale, gate, or zero an incoming hit; onDeath hooks on volatile, gravity_well.
  • Artifacts: Personal Space (weapon knockback), legendary stun (weapon stun duration), Reactive Shield (listens to shield_hit signal), Soul Leech (listens to enemy_kill).
  • Status effects: shredded enemies take a multiplier from getShredMult.
  • Tutorial: shield-hit triggers step 3; hull-hit triggers step 4.
  • Telemetry: every damagePlayer call records a damage-chain entry (sampled ≤1 Hz); every player-bullet hit records a weapon-hit sample.
  • Signals fired: damage_dealt, bullet_hit, shield_hit, shield_break, player_damage, hull_damage, enemy_kill, boss_anchor_destroyed, boss_body_kill, boss_kill, tagged_kill, tbone_hit, kill_streak_milestone.

What it does NOT do

  • Does not roll critical hits in the core damage chain.
  • Does not apply friendly fire between player projectiles and the player ship.
  • Does not damage enemies with other enemies’ projectiles or explosions.
  • Does not bleed shield damage through to hull; if shield is alive, it absorbs the entire incoming hit and any excess is discarded.
  • Does not regenerate hull HP from this module (hp regen is driven elsewhere; this module only handles damage application, lifesteal heal, and shield regen-delay reset).
  • Does not let shared-health boss sub-bodies be damaged by non-player sources.
  • Does not allow elite pack leaders to be knocked back or stunned by the weapon-knockback artifact path.
  • Does not insert dying, frozen-for-lag, or spawn-protected enemies into the collision grid.
  • Does not let one boss part be chunked independently of its encounter: shared-health caps and per-part hit immunity bound burst DPS.
  • Does not apply the explosive-blast AOE to the primary target a second time.
  • Does not require destructible AOE damage — destructibles destroy only on direct ship contact.
  • Does not enable enemy-enemy separation in the main resolve pass; pass-through is the default.
  • Does not apply ram damage or speed bleed when the ship is invulnerable.
  • Does not apply knockback to the player when invulnerability blocks the hit.
  • Does not skip knockback when final damage is zero — the base 5-unit shove still fires.