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

Move: arrows / WASD · Field: F or on-screen toggle · Pause: Esc / P · Restart: R · Touch: swipe
Privacy policyMore 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.
23-second gameplay trailerHow 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
| Hunter | Field rule | What you'll see |
|---|---|---|
| Hunter | Reads the player-centered distance field | Takes the most direct downhill step toward you |
| Ambusher | Reads a field seeded ahead of your current direction | Cuts toward where you're going, not where you are |
| Weaver | Blends the player field with distance from Hunter | Approaches from a different angle |
| Drifter | Switches between the player and scatter fields | Applies 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
- Automated checks
- 20 headless verifiers passed
- 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 GodotFAQ
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.