Vav Labs

Playable · Made with Godot

Dijkstra's Ghost

Four hunters, one Dijkstra-map system. None runs its own A* search.

Play it below. Press F — or tap the field button — to cycle through the live fields under the chase.

Built and browser-tested with Godot 4.7 stable · Web build 2026-07-11

Dijkstra's Ghost maze gameplay with four hunters, field scores, and downhill arrows visible

Move: arrows / WASD · Field: F or on-screen toggle · Pause: Esc / P · Restart: R · Touch: swipe

Privacy policy

More ways to play

Play elsewhere or watch the trailer

Open the free browser release on itch.io, or watch the complete chase and live navigation overlay in 23 seconds.

Dijkstra's Ghost gameplay trailer preview with four hunters and a live navigation-field overlay23-second gameplay trailer

How the hunters move

A Dijkstra map stores the cheapest known cost from every reachable cell to one or more source cells. The hunters never ask for a route. Each reads neighboring field values and steps toward a lower score.

A field seeded at the player supports direct pursuit. Change the seed, rescan the field, or blend two scores and the same solver produces a different behavior.

For the turn-based version of the same target-conflict rule—with preview, confirm, deterministic arbitration, and undo—read how to prevent two units from moving to the same tile in Godot.

Four hunters, four field rules

HunterField ruleWhat you'll see
HunterReads the player-centered distance fieldTakes the most direct downhill step toward you
AmbusherReads a field seeded ahead of your current directionCuts toward where you're going, not where you are
WeaverBlends the player field with distance from HunterApproaches from a different angle
DrifterSwitches between the player and scatter fieldsApplies pressure in waves

Power-ups switch all four to one freshly rescanned flee field until the timer expires. There's no path object in the enemy code.

The field overlay

The overlay draws the selected policy's cell scores, downhill arrows, and color ramp. Press F repeatedly—or tap the field control—to cycle Hunter, Ambusher, Weaver, and Drifter. Weighted terrain tilts the slope; walls don't participate.

Build receipt

Engine
Godot 4.7 stable
Campaign
10 data-driven mazes
Browser smoke
Chromium canvas/input smoke passed without runtime or console errors
Web runtime
Single-threaded Godot export · Brotli WASM: 7.09 MB

Read the implementation

For the solver, field representation, flee rescan, source bias, and INF-safe scoring, read Dijkstra maps for roguelike AI in Godot.

From playable proof to PathForge

Dijkstra's Ghost demonstrates one principle behind PathForge: navigation is easier to reason about when costs and decisions are visible. PathForge extends that idea to tactical maps, agent clearance, dynamic blockers, and failure diagnostics. The first public build is still in development.

See the PathForge navigation workflow for Godot

FAQ

What is a Dijkstra map?

A Dijkstra map is a grid-wide distance field. Each reachable cell stores its cheapest known cost to one or more source cells. An actor moves toward a source by choosing a neighboring cell with a lower value.

Can several enemies share one Dijkstra map in Godot?

Yes — several enemies can share one Dijkstra map in Godot when they evaluate the same goal field. Dijkstra's Ghost uses one Dijkstra-map system; some policies reuse a player-centered field, Ambusher reseeds it, and Weaver blends two field scores. None runs per-enemy A* or stores a point-by-point path.

What does the field overlay show?

It shows the data used for the selected hunter's next move: cell score, downhill direction, and a color gradient. Press F or tap the field button to cycle through the hunters.

Can I play on a phone?

Yes. The game supports swipe steering and an on-screen field control. The responsive web build is intended for modern mobile browsers, with fullscreen recommended on small screens.

How big is the download?

About 7.1 MB when the browser accepts Brotli-compressed WebAssembly. Nothing loads until you press Play, and versioned game assets are cached for return visits.