Procedural levels
Rooms placed on a grid and carved into corridors, at varying elevations with Doom-style stairs and elevators. A strict blue → yellow → red key chain gates the exit.
C# · OpenGL 4.1 · Every seed is a different game
A retro-gameplay, modern-look first-person shooter where the levels, weapons, monsters and soundtrack are all generated from scratch — procedurally, every run.
No two runs are alike. A single seed drives an entire world — and it's all self-validating, so every level is guaranteed beatable.
Rooms placed on a grid and carved into corridors, at varying elevations with Doom-style stairs and elevators. A strict blue → yellow → red key chain gates the exit.
12 classes assembled from parametric parts — receiver, barrel, grip, mag, sight, stock — with seed-driven stats, colours and names. Each level generates its own arsenal.
Three body plans built as rigid-part skeletons and animated on the fly — walk cycles, attack lunges, hover, death topple. AI patrols, investigates noise, and gives chase with A* pathfinding.
Every gunshot is synthesized from oscillators and noise — no audio files. Each level gets its own looping action track, its tempo and key derived from the level number.
Every key or weapon pickup is a checkpoint. Die and you resume there — enemies you cleared stay dead, doors you opened stay open, guns you found stay found.
A four-strong roster that cycles and scales: The Maw, Gunlord, Eye Tyrant and Broodmother — oversized, glowing, and driving a health bar across the HUD.
Play starts from a fixed seed that increments each level, so the sequence is identical every run — but change the seed and everything changes with it: the map layout, the guns on the floor, the monsters in the rooms, the melody in your ears.
The level generator is self-validating: every lock is placed by staged flood-fill and rolled back if it can't be made solvable. The key order always holds, and the exit is always reachable — verified across thousands of generated levels.
You enter each level holding only weapon 1. The other guns are scattered around as floating, spinning pickups that glow in their accent colour — grab one and it arrives loaded.
Fast, straight, belt-fed. The chaingun's barrel cluster spins up on the trigger.
Twin side-by-side barrels dealing double the per-pellet damage up close.
Scope in on right-click — a scoped shot is dead-centre and a guaranteed one-hit kill.
Straight bolts of raw energy in the weapon's seed-driven accent colour.
Lobbed grenades bounce and detonate; rockets deal punchy splash across the whole radius.
A rare find on ~30% of levels, hard-capped at 10 rounds you can never exceed.
Captured straight from the running game on an Apple M4 — OpenGL 4.1 core profile at 2560×1440.






Self-contained builds — the .NET runtime is bundled in, so there's nothing else to install. Just download, unzip or mount, and play.
Unzip anywhere and run FPS2.exe. Windows may show a SmartScreen warning — click More info → Run anyway.
Open the .dmg and drag FPS2 to Applications. First launch: right-click the app → Open to clear Gatekeeper.
Version 1.0.0 · Also runs from source on Linux — see below.
Prefer to build it yourself? Requires the .NET 8 SDK and an OpenGL 4.1 core-profile context (macOS, Windows or Linux).
# launch fullscreen at 1920×1080
$ dotnet run -c Release
| WASD | Move |
| Mouse | Look |
| L-Click | Fire (hold for automatic) |
| R-Click | Scope in (rifles) |
| 1–6 / Wheel | Switch weapon |
| R | Reload |
| F | Flashlight |
| Tab | Overhead automap |
| E | Use exit pad (descend) |
| Esc | Quit |
Find keys in order — blue → yellow → red — to open the colour-coded locked doors. Grab green health cubes and magenta ammo cubes, ride elevators to hidden lofts, then reach the green exit pad and press E to descend to the next generated level.