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.
Inputs
Section titled “Inputs”- 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
What you can do moment-to-moment
Section titled “What you can do moment-to-moment”- 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
The escalation curve
Section titled “The escalation curve”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.
Why it stays fast
Section titled “Why it stays fast”- 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.
Where to dig deeper
Section titled “Where to dig deeper”- Run + Return Loop — how combat feeds the kingdom
- Units — multi-role job system
- Controls — keybindings + assist toggles
- The World — where the combat lives