A low-poly stone dungeon corridor lit by two wall torches, with a heavy iron-banded door at the far end
Illustration generated with OpenArt (GPT Image 2.5 Flare).

A dungeon crawl with no asset files

Tomb is a small Eye of the Beholder style dungeon crawl that runs in the browser. One level, a party of four, doors, monsters and a stairway down that something is standing in front of. It is seven files and about 84 KB, and not one of those files is an image or a sound.

Every wall texture, door, monster sprite, item icon and hero portrait is drawn in code onto a canvas at load time and handed to three.js as a texture. Every sound effect is synthesised through WebAudio. There is no sprite sheet to keep in sync, no audio folder, and no pipeline that turns source art into shipped art.

What that buys you

The obvious win is size, but that is the least interesting one. The real wins are these:

  • The art is parameterised. A wall is not a picture of a wall, it is a function that makes walls. Change the mortar colour, the block height or the amount of grime and every wall in the dungeon changes at once.
  • There is nothing to lose. No missing texture, no broken path, no asset that was on someone's machine and never made it into the repository.
  • There is no build step at all. three.js arrives from a CDN through an import map. The whole game is static files — open a server on the folder and it runs.

The level is an ASCII map in src/level.js, with a legend above it. Building a new dungeon means typing a new block of text and reloading the page. That is a fast enough loop that you actually experiment with the layout, which is the part of a crawler that matters most.

What it costs

Procedural art has a ceiling, and it is lower than a good pixel artist's floor. You can get texture, grime, variation and a consistent palette almost for free. What you cannot get is intent — the specific, deliberate silhouette of a monster somebody designed. Everything ends up looking like it came from the same hand, because it did, and that hand is a loop.

The other cost is debugging. When a texture looks wrong you cannot open it and look at it. You have to reason about the code that drew it, or render it to a canvas somewhere visible and squint at it. That is slower than double-clicking a PNG.

The trade is a good one for a demo and a bad one for a game you intend people to fall in love with. Knowing which one you are building is the whole decision.

Grid movement is the point

The thing that makes a crawler feel like a crawler is not the graphics. It is that you move a whole square at a time and that turning is its own action. Free movement makes a corridor feel like a corridor you are walking down. Grid movement makes it feel like a place with rules — you can count squares, you can plan, and backing away from something is a decision with a cost.

It is also far easier to reason about. Doors are either open or closed on a specific square. A monster is on a square or it is not. Combat range is squares away, not metres. A surprising amount of the design falls out of that one choice.

Tomb is on the games shelf if you want to try it. It plays on a phone too — there is an on-screen movement pad.

All posts See the games shelf