| Library | Used for |
|---|---|
| RoostR.js | The whole picture: Renderer (context and context-loss events), Scene, PerspectiveCamera, Mesh with LINES and TRIANGLES geometry and custom shaders, RenderTargets and FullscreenQuad for the neon passes, per-mesh blending. The HUD's line art is RoostR too |
| BumpR.js | Scene/Physics collisions (player vs walls, doors, enemies, sensor pickups, fireballs) with a Spock Grid broadphase, and scene.raycast for hitscan shotgun pellets and enemy line of sight |
| LoopR.js | Player game loop with delta-time and a delta cap |
| Spock.js | Vec2/Vec3 maths, Rand seeded generator, Utils.clamp (also re-exported by RoostR) |
Controls adapt to your keyboard layout (QWERTY, AZERTY, QWERTZ, Dvorak). Positional keys stay in the same physical place on every layout, so WASD on QWERTY is ZQSD on AZERTY. Mnemonic keys follow the letter printed on the keycap. The on-screen labels adapt automatically (from the Keyboard Map API, or learned from your key presses), and F2 cycles Auto → QWERTY → AZERTY → QWERTZ → Dvorak, stored as doomr.keyboardLayout.
Every action can be rebound. Open the CONTROLS page with F1, or click CONTROLS on the title or pause screen. Each action has two slots (KEY 1 / KEY 2) and accepts keyboard keys or mouse buttons (MOUSE L/M/R/4/5). A key taken from another action is announced, and actions left without a key are flagged UNBOUND in red. Del clears a slot, R resets a row, and RESET ALL needs a second press. Esc and Enter are reserved. Customised keys are physical keys labelled with your own keycap glyph. Bindings are saved in the browser as doomr.controls.
| Key (QWERTY) | Action | Follows |
|---|---|---|
| W A S D | move (ZQSD on AZERTY) | position |
| mouse / ← → | turn | position |
| click / X / Ctrl / Alt / Enter | fire | position |
| F | grenade | position |
| Space | jump | position |
| C | crouch | position |
| Shift | run | position |
| 1-4 | weapons | position |
| E | open / close doors, loot chests (a discreet key prompt appears when in reach) | printed letter |
| M | toggle music | printed letter |
| V | toggle map | printed letter |
| ; | toggle sound (B also works) | printed letter |
| N | toggle night vision | printed letter |
| Tab | automap (G grid, + / - zoom) |
position |
| [ / ] | switch level | printed letter |
| P / Esc | pause | printed letter / position |
| F2 | cycle keyboard layout labels | position |
| F3 | show fps and render scale | position |
| F1 | open the controls page (rebind any action) | position |
The game rules in src/game.js have no DOM dependency, so they run headless in Node:
npm test