Explorer: touring the world and leaving notes
Decision #110. A tool for reviewing every location of the baked world (#100) and noting what to improve, each note with a capture of the place. It runs in the game client, without a server, on the same streaming and renderer as online play.
cargo run --release -p uo-client -- --explore # starts in the first capital
cargo run --release -p uo-client -- --explore --at Skartor # a place's name …
cargo run --release -p uo-client -- --explore --at 7212,5940 --map # … or tile coordinates; open the map
The world must be baked (uo-atlas --bake assets/world/felucca); the bake also writes the two
map pictures the explorer shows (overview.png at 1 px = 16 tiles, atlas-4.png at 1 px = 4).
Keys
| Key | What |
|---|---|
| right mouse, WASD, click, numpad | walk (Shift: faster) |
| V | ghost on/off: walk through rock, water and walls (on by default) |
| M | the map: drag to pan, wheel to zoom, click to teleport there; Esc or M closes |
| G | go to: x,y or a place's name (exact, then the first starting with it, then containing it, then a kind like shrine) |
| N | a note: type it (any language), Enter saves it with a capture, Esc cancels |
| J / K | the previous / next open note: teleports there and shows it |
| U | mark the shown note resolved |
The arrow keys still pan the camera and the time-of-day keys still work (N, which also flips day and night, is the explorer's while it runs). While a prompt or the map is open, no key or click reaches the game.
Notes
world-notes/notes.jsonl (committed; --notes DIR elsewhere), one JSON object per line:
{"id":"1792529503659","status":"open","time":"2026-10-20T20:51:43Z","x":7192,"y":6024,"z":2.88,
"comment":"the market looks empty","place":"Skartor (capital)","place_dist":0,"terrain":"flagstone",
"shot":"shots/1792529503659.png","world":"felucca","world_hash":"cf90fe2d71bb8d04","commit":"a948656e","hour":10.0}
place/place_dist: the nearest place ofworld.jsonand how far it is (tiles);terrainthe tile's ground;zits height;hourthe time of day;world_hashandcommitthe bake and code the note was made on.shot: the capture, relative to the notes folder: the scene render at texel resolution, without UI (like--screenshotheadless). Captures stay local (world-notes/shots/is ignored by git).- A later line with the same
idupdates the note:{"id": "…", "status": "resolved"}(U in the game, or appended by whoever fixed it, with an optionalcomment). The last line wins.
To work through notes: read the open ones (status not resolved), look at each capture, fix,
re-bake, check the place with --explore --at x,y, append the resolved line.
How it works
uo-client/src/explore.rs. The online client's world streaming (online/world.rs: the
terrain window around the player and region statics) and mobiles (online/mobiles.rs) run
without a network link when the Explorer resource exists; network-only systems (receive,
prediction, combat presentation, HUD model, input, bot) stay off. The explorer seeds the
Session with the baked world and one player entity, moves that player's Actor itself (a
teleport is a jump; the terrain window and regions follow) and hides the combat HUD. Its own
UI: an info panel, a prompt, and the map (the bake's pictures as UI images, places by zoom:
capitals, cities and towns always, villages, dungeons and places of interest closer in; notes
as big yellow pins labelled with the start of the comment, drawn over everything, resolved ones
smaller and grey; the player red). The info panel shows how many notes are open and their folder. Text input and the map's mouse are read right after
Bevy's input systems, which are then cleared, so the game sees nothing while typing.
UO_EXPLORE_NOTE="text" saves one note eight seconds in (a test hook); UO_EXPLORE_WALK=dx,dy walks that
far from the start (frame times while the world streams in, docs/performance.md).
Not yet: the HTML atlas's overlays (realms, danger, deposits, encounter tables), the dressing sites (farmsteads, camps) as markers, notes from online play.