Pick a mode. Infinite Heat is a constant baseline (no ramp). Difficulty increases via wave composition and pressure, not heat escalation.
Spend Credits to evolve your build. Upgrades apply immediately. Reroll refreshes the list.
Wave 100 cleared. Prestige has increased and your meta upgrades were saved.
Rift Synthwave is still running underneath — but crossfaded to the pause layer. Spectrum here is live from the same master bus (enemies / heat / overdrive modulate it).
The grid is a moving window into an infinite timeline. We render N bars (default 16) starting at a bar index derived from the current playhead. Under the hood, bar indices can go on forever (0…∞).
The Seed is the root of all randomness. We use a small PRNG (fast, repeatable) so the same seed produces the same “random” decisions every time. Change the seed → the song changes, but remains coherent.
Each lane derives its own “sub-seed” from the root seed, lane id, and bar index. Conceptually:
laneSeed = mix(seed, hash(laneId), barIndex)
rng = PRNG(laneSeed)
That means KICK, SNARE, HAT, BASS can each have distinct behavior while staying locked to the same global seed.
For every lane and bar we build an occupancy grid of steps (16 steps per bar by default). We pre-fill it with:
Then we check the lane-bar count: If the lane has zero events in that bar, we auto-fill using math. If the lane already has events, we do not overwrite them.
Density is a probability/target controller. Higher density means more steps are likely to become hits, but only into free slots. We never place two hits on the same step.
Swing delays every other subdivision slightly (classic groove). It changes scheduling time, not bar math. In other words: placements stay the same, but the “off steps” happen a little later.
Audio is scheduled with a look-ahead window (we schedule slightly ahead of the playhead). This avoids glitches and ensures timing stays tight even if rendering lags.