Skip to content
Felucca Online

Docs

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

KeyWhat
right mouse, WASD, click, numpadwalk (Shift: faster)
Vghost on/off: walk through rock, water and walls (on by default)
Mthe map: drag to pan, wheel to zoom, click to teleport there; Esc or M closes
Ggo to: x,y or a place's name (exact, then the first starting with it, then containing it, then a kind like shrine)
Na note: type it (any language), Enter saves it with a capture, Esc cancels
J / Kthe previous / next open note: teleports there and shows it
Umark 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 of world.json and how far it is (tiles); terrain the tile's ground; z its height; hour the time of day; world_hash and commit the 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 --screenshot headless). Captures stay local (world-notes/shots/ is ignored by git).
  • A later line with the same id updates the note: {"id": "…", "status": "resolved"} (U in the game, or appended by whoever fixed it, with an optional comment). 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.