chemaclass / phel-doom
DOOM-lite showcase written in Phel Lang. Terminal raycaster, pure functional state, ANSI render.
Package info
github.com/Chemaclass/phel-doom
Language:Shell
Type:project
pkg:composer/chemaclass/phel-doom
Fund package maintenance!
Requires
- php: >=8.4
- phel-lang/phel-lang: dev-main
- symfony/console: ^7.3
Requires (Dev)
- symfony/var-dumper: ^7.3
- dev-main
- v0.3.0
- v0.2.0
- v0.1.0
- dev-feat/levels-6-10
- dev-ref/levels-catalog
- dev-feat/35-sprint-stamina
- dev-feat/weapon-pickups-sprites
- dev-feat/keycards-locked-doors
- dev-feat/difficulty-cli
- dev-feat/backpack-pickup
- dev-feat/invuln-sphere
- dev-feat/berserk-powerup
- dev-feat/multi-weapons
- dev-feat/enemy-loot-drops
- dev-feat/wound-hp-flash
- dev-feat/empty-mag-feedback
- dev-feat/reload-animation
- dev-feat/enemy-life-shade
- dev-feat/low-ammo-warning
- dev-feat/ammo-pickups
- dev-feat/ammo-reserve
- dev-ref/13-fix-lint-warnings
- dev-perf/eval-sprite-zbuffer
- dev-perf/eval-diff-render
- dev-perf/dda-raycaster
- dev-feat/reload-and-ammo
- dev-feat/debug-overlay
- dev-fix/pause-freeze-anims
- dev-fix/rear-warning-radius
- dev-fix/pause-credits-border
This package is auto-updated.
Last update: 2026-05-24 18:51:32 UTC
README
DOOM-lite raycaster in your terminal. Pure Phel (Lisp on PHP). 256-color ANSI, procedural levels, FPS combat, ~5ms frame.
Full feature list: docs/features.md.
Quick start
Requires PHP >= 8.4, Composer, 256-color terminal.
git clone git@github.com:Chemaclass/phel-doom.git
cd phel-doom
make install
make play
composer install / composer play also work.
Controls
| Key | Action |
|---|---|
w / s / ↑↓ |
Move forward / back |
a / d |
Strafe left / right |
← / → |
Turn left / right |
SHIFT / x |
Sprint (1.6× speed, drains stamina) |
e |
About-face (snap 180°) |
space |
Fire |
r |
Reload (draws from reserve) |
1 / 2 / 3 |
Switch weapon (pistol / shotgun / chaingun) |
m / n |
Toggle minimap / sound |
p |
Pause |
h |
Info menu (stats, weapons table, controls) — also pauses |
ESC |
Close help / pause |
F3 |
Debug overlay (fps, pos, perf) |
q |
Quit |
Walk into a door to advance. Walk over pickups:
- ♥ heart —
+1life - ◆ armor — absorbs one hit (cap 3)
- ammo box —
+Nto a weapon's reserve. Kill-loot tags a random non-pistol weapon you own (pistol always has a refill path via floor boxes) - berserk — 20s of
×2damage - invuln — 10s damage immunity
- backpack — doubles every weapon's reserve cap
- ⚿ keycard — unlocks matching exit on L4 (blue) / L5 (red)
Compass top-centre tints one cardinal letter (E/S/W/N) toward your next target — orange = exit door, blue / red = keycard you still need. Built so you can play in 3D without checking the 2D map.
Weapons (DPS-balanced niches, find on map):
| Weapon | Dmg | Cd | Mag | DPS | Tier |
|---|---|---|---|---|---|
| pistol | 1 | 0.12s | 10 | 8 | L1 start (auto-fire) |
| shotgun | 3 | 0.6s | 4 | 5 | L2 pickup (single-action) |
| chaingun | 1 | 0.05s | 30 | 20 | L3 pickup (auto-fire) |
Hold space to spray with the pistol/chaingun. Shotgun needs a fresh pull per shell.
CLI:
--difficulty=easy|normal|hard|nightmare(-d) — scales enemy speed, HP, count--god(-g) ormake play-dev— no damage, GOD badge in HUD
Terminal quirks (kitty keyboard, tmux): see docs/input.md.
Docs
Per-subsystem write-ups in docs/:
- features — what the game does
- architecture — module layout + dependency rules
- game-loop — per-frame state transition
- raycaster + rendering — pixels on screen
- monsters + combat — AI, damage, knockback
- level-system + map — progression + procgen
- input + audio + scores
- wad-parser — DOOM .wad reader
- performance — hot-loop optimisations
- contributing — dev workflow + Phel quirks
License
MIT