Skip to content

Combat Loop

Bullet-hell first. Hundreds of enemies, no framerate excuses. Built in Rust on the Bevy ECS so the simulation stays at 60 FPS even when the screen is full of projectiles.

  • Move — WASD
  • Aim — mouse cursor
  • Shoot — left mouse, held for sustained fire
  • Cast — right mouse + 1–4 for ability slot
  • Dash — space, short i-frames + cooldown
  • Auto-aim assist — toggle in Controls
  • Sustained fire — direct twin-stick aim, falls off at long range
  • Stolen icons — pickup-driven abilities recovered from defeated enemies. Slot up to 4 simultaneously. Stack effects.
  • Spell casts — primary slotted ability with cooldown, secondary on right-click hold
  • Cover + line of sight — most enemies use predictable LOS so you can break sight to reset their shot timers

Every shard ramps wave count + projectile density on a sine curve. Quiet seconds feed dense waves. Density resets between rooms so you’re never in the trough during a boss.

  • Data-oriented ECS — projectiles, enemies and pickups are plain component data, so a frame walks packed arrays instead of chasing object graphs
  • Parallel systems — independent systems run across worker threads on the desktop build; the browser build runs the same schedule single-threaded
  • Server-authoritative simulation — the server owns the world and replicates it; the client predicts input and reconciles, so a dense wave cannot be desynced by a lagging client
  • Change detection — UI and replication only do work for components that actually changed this frame

If you’re a dev: see Community and dev process on the overview page.