Star Halo cooldown
What this is
Star Halo’s spin phase deals light sweep contact damage as its stars orbit the player. The re-hit gate for that sweep is not a fixed cooldown duration written in the weapon spec — it is derived at runtime from the spin geometry: one full revolution of the halo must elapse between two hits from the same star on the same enemy. This guarantees that a given star can hit a given enemy at most spins times across the cast, no matter how long the enemy sits inside the ring.
The cooldown lives per-star (each orbiting star has its own contact map keyed on enemy reference), so an enemy parked under the formation still takes up to starCount distinct hits per revolution as different stars sweep across it.
The formula
The cooldown is computed each frame the spin phase runs.
| Quantity | Source | Default |
|---|---|---|
spinDuration | ringSpinDuration on the spec, copied to b._ringSpinDuration at spawn | 3.2 seconds |
spins | ringSpins on the spec, copied to b._ringSpins at spawn | 3 revolutions |
revolutionPeriod | spinDuration / Math.max(1, spins) | 1.067 seconds at the default 3.2 / 3 |
A hit is permitted on an enemy only when one of these holds:
| Condition | Behavior |
|---|---|
Enemy not present in this star’s contactCooldowns map | Apply damage, write the current spinT into the map |
spinT - lastHitTime >= revolutionPeriod | Apply damage, overwrite the map entry with the current spinT |
spinT - lastHitTime < revolutionPeriod | Skip — no damage, no VFX, no telemetry |
spinT is the bullet-local spin clock (seconds since the spin phase began, accumulated frame-by-frame). The check uses this local clock, not the global game time, so pausing the cast or speed-modifying the bullet does not desync the gate.
Per-enemy sweep damage during spin is light: Math.max(1, Math.ceil(starDmg * 0.25)) — 25% of the per-star explosion damage, floored at 1.
Derived hit budget
Because the gate is exactly one revolution and the cast runs for exactly spins revolutions, each (star, enemy) pair caps at spins hits per cast. Stars do not share contact maps, so an enemy in range of every star can absorb up to starCount * spins sweep hits in the same cast.
| Level | starCount | spins | Max sweep hits per enemy per cast |
|---|---|---|---|
| L1 | 5 | 3 | 15 |
| L4 | 8 | 3 | 24 |
| L8 | 12 | 3 | 36 |
| L12 | 18 | 3 | 54 |
| L16 | 24 | 3 | 72 |
| L20 | 30 | 3 | 90 |
These are maximums — an enemy only attains them by sitting in the sweep radius of every star for the full cast, which only happens if the enemy is at or near the ring’s circumference for the entire 3.2-second spin.
Why it differs from per-target-contact-cooldown
The standard per-target-contact-cooldown gate is a fixed seconds-per-hit value read from the weapon spec (e.g. Sweep and Fire Ring use 0.18 s, Line and Magnetar use 0.08 s, default 0.3 s). It is independent of weapon geometry — a faster orbit just lets the blade re-hit at the same wall-clock cadence.
Star Halo’s gate is geometry-locked:
| Axis | per-target-contact-cooldown | Star Halo cooldown |
|---|---|---|
| Source of the duration | Static field on the spec | Computed from spinDuration / spins at runtime |
| Granularity of the contact map | Per bullet, per enemy | Per star, per enemy (each star inside the coordinator bullet keeps its own map) |
| Scales with weapon level | No — same gate at L1 and L20 | No directly, but spins=3 is constant so the gate is constant; level scales starCount, not hit cadence |
| Couples to visual rotation | No — re-hit cadence and visible motion are independent | Yes — exactly one rotation between hits, so the visual loop is the cooldown |
| Hit-budget cap per cast | Unbounded — depends on cast lifetime | Hard-capped at spins per (star, enemy), starCount * spins per enemy |
| Map cleared on bullet recycle | Yes | Yes (the coordinator bullet owns the star list and dies with the cast) |
The design intent is different too: the standard cooldown smooths a continuous-contact weapon into a rhythmic tick. Star Halo’s gate enforces a discrete, countable damage event — exactly spins taps from each star — that lines up with the theatrical 3-revolution cast. Damage during spin is intentionally small (25% of per-star explosion damage); the cast’s real damage comes from the post-spin burst-out + per-star AoE explosion, not the orbit sweep.