What it is
A dungeon crawl demo across two levels. The Sunken Crypt is stone, skeletons and a beholder standing in front of the stairs. The Drowned Vault below it is blue, cold and about twice the size, and it holds rats, spiders that poison, three secrets behind walls that carry a chiselled mason’s mark, and four port pads. Movement is on a grid the way the old Westwood crawlers did it — you step forward a whole square, and turning is its own action, which is what makes a corridor feel like a corridor.
Four heroes start. Four more are waiting below, and walking into one recruits them, up to a party of eight. The party shares one pack of weapons: chests add to it, and any hero trained on a weapon can take it up from their character sheet. Each weapon carries its own damage, speed and to-hit, so the swap genuinely changes how that hero fights.
No asset files
There are no PNGs, no sprite sheets and no sound files anywhere in the project. Every wall texture, monster sprite, item icon, hero portrait and sound effect is drawn or synthesised at runtime — the textures as procedural pixel art on a canvas, the audio through WebAudio. The whole game is seven files and 84 KB, and three.js itself arrives from a CDN through an import map, so there is nothing to compile and nothing to bundle.
The level is an ASCII map. Editing the dungeon means editing a block of text in
src/level.js and reloading the page.
Controls
| Key | Action |
|---|---|
| W A S D | Step forward, strafe, step back |
| Q E or ← → | Turn |
| Space | Open or close the door ahead |
| 1 … 8 | Attack with each hero |
| H | Drink a healing potion, which also cures poison |
| Click a portrait | Character sheet, and swap that hero's weapon (Esc closes it) |
There is also an on-screen movement pad, so it plays on a phone.
How it's put together
index.html,style.css— the page shell and the stone HUDsrc/level.js— both levels as ASCII maps, the legend and the parsersrc/textures.js— procedural pixel art for walls, doors, monsters, items and portraitssrc/audio.js— WebAudio sound effectssrc/main.js— world building, grid movement, doors, monsters, combat and the HUD
Running it yourself
ES modules need to be served over HTTP rather than opened from disk, so from the project folder:
python3 -m http.server 8137
Then open http://localhost:8137.