Salvage Run is a minimal asteroid-field roguelite demonstrating Storm! Engine v2's ECS, circle-collision model, and pure-velocity movement. Thrust, drift, break rocks into smaller rocks, tow what is worth taking back to the station before your hold or your fuel runs out.
- Core loop: blast rocks → fragments split → tow valuable chunks to the station
- Tether physics: damped spring, slack → stretch → swing — the only thing resisting "go faster"
- One data table: mass, value, split count, radius for all 12 rock types (size × material)
- Shift clock: 2 minutes, score = banked only, tethered loot lost on timeout
- 37 BDD specs covering table invariants, tether math, split chains, HUD math
Clean C++17, no frameworks beyond SDL2 + engine. Build: make && make run.
Built on Storm! Engine v2 2.3.0.
| Input | Action |
|---|---|
W / ↑ |
Thrust forward |
A / ← |
Rotate left |
D / → |
Rotate right |
Space |
Fire shot |
E |
Fire / release tether |
Esc |
Quit |
Gamepad (Xbox-style layout):
| Input | Action |
|---|---|
| Left stick X | Rotate (proportional) |
| Right trigger | Thrust |
| A button | Fire shot |
| B button | Fire / release tether |
The tether targets the nearest rock in a ±60° cone ahead of the ship, up to 300 px. Press again to release.
As an example for Storm! Engine. Everything in it is round, so CircleColliderComponent is the whole collision model with no approximation anywhere. Splitting a rock into two smaller rocks is entity churn by construction rather than by contrivance. Movement is RigidBodyComponent velocity integration and nothing else. MovementSystem is the entire physics layer, which makes this the cheapest of the four to get playable.
No tilemap, no camera scroll, and lighting has little to do in open space.
The engine must be installed first (sudo make -f Makefile.debian install in the engine tree). Then:
make # build
make run # run from this directory — asset paths are CWD-relative
./verify.sh # build, run headless, check it drawsDownload the SDK zip from the Storm! Engine releases, unpack it, and point SDK at the unpacked directory:
sudo apt install mingw-w64
unzip stormengine2-2.3.0-win64.zip -d ~/sdk
make -f Makefile.win SDK=~/sdk/stormengine2-2.3.0-win64
make -f Makefile.win SDK=~/sdk/stormengine2-2.3.0-win64 run # under wineThe build copies every DLL from the SDK's bin/ beside your .exe. Windows resolves DLLs from the executable's directory first.
MinGW-w64 only. MSVC cannot link this, the import library and C++ ABI are GCC's.
Want to build for other platforms? The engine is portable, so this project is portable. You will need to write a platform Makefile and a platform main() that calls Game::Run(). See the engine's examples/ for how to do that.
I have not done it yet, but many platforms supported by DevkitPro (i.e., WiiU, Wii, GameCube, etc.) are probably supported by the engine, so it is likely to be straightforward with minimal changes. This includes MacOS as well.
SCAFFOLD.md documents the layout and the traps that come with it.
Totally free, do what you want, but don't blame me if it breaks. LICENSE.md is the full text.
