orientation: the travel map, unexplored ways, the nearest exit

Prompted by "do sighted players have a minimap we don't have access to?"
No widget, but two map surfaces were only half exposed: the world map
screen, and the level view itself, which IS the explored-floor map --
rememberedFoV keeps everything ever seen drawn, and a sighted player pans
over it and reads the fog edge at a glance.

The world map dropped the three things the picture carries: what kind of
place each area is (the icon shape), which way it lies, and how long
travelling there takes. The last is the number the decision turns on and
was only ever in the side panel. states/worldmap.lua is now a read() plus
details() rather than probe/render -- necessarily, because render() gets
no state table and the travel time needs the screen's currentAreaId, an
upvalue like options and selectedOption. Travel time is the game's own
getDistanceMessage, the same call the screen makes. The blurb runs to
several sentences, so it goes on = and the settle timer instead of the
focus line.

Two gotchas: options[i].icon is already an image object, so the icon id
string has to come off the model area; and describe.direction only tests
the sign of each delta, which on the map's floating-point coordinates
called almost everything diagonal, hence a 25% deadzone carrying the same
4/3 x-correction the game's own distance maths uses.

New frontier.lua answers "where haven't I been", which nothing did:
surroundings is local, examine is one tile, and the tracker only finds
things it already knows about. A frontier tile is seen, not blocking
movement, with an in-bounds unseen CARDINAL neighbour -- cardinal because
the diagonal test fires on the unseen tile behind every wall corner, so a
lit corridor would report an unexplored way per corner. Clustered
8-connected and reduced to each cluster's nearest member, so a wide
doorway is one way but two openings that both lie north stay two. Reads
only FoV/rememberedFoV and reports only THAT an opening exists, never
what is beyond it -- exactly what the fog edge shows.

Shift+End names the nearest exit without disturbing the tracker
selection. Note for later: level.exits does not exist at runtime, it is
packed as nil and never assigned. The primitive is the game's own
getListByTag("exit"), which already gates on FoV or rememberedFoV, skips
hidden tiles and sorts by distance. Exits were already a tracker
category, so this is a shortcut rather than a new capability.

"remembered" moves from verbose to normal verbosity. tileFacts reads
actors only when a tile is currently VISIBLE, so a remembered tile is
silent about whatever may be standing on it now, and at normal verbosity
that silence was indistinguishable from "nothing there". A safety flag,
not a nicety.

Also adds descriptor.probeNames: a read() descriptor has no probe table,
so menus.selfTest could only report "custom read()" and the version-bump
canary was lost on exactly the screens reaching for the most upvalues.
worldmap and research now declare their game locals and get the same
PROBE BROKEN check.

120 testbed checks, 0 failures. It caught two things review had not. The
world map said "You are currently here." twice, because
getDistanceMessage and getLastVisitedMessage return the same sentence for
the area you are standing in -- fine as two panels on screen, a stutter
in one utterance. And the first frontier check walked a step east and
demanded the numbers change; it failed on a run where nothing was wrong,
the step landing but both openings keeping the same Chebyshev distance.
Replaced with the deterministic property: every reported distance must
equal Chebyshev from the player's current position, nearest first.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
Accessibility Mod
2026-08-03 16:05:15 +02:00
co-authored by Claude Opus 5
parent ce0f375a10
commit 5778e86e8e
10 changed files with 1004 additions and 23 deletions
+48
View File
@@ -59,6 +59,30 @@ the cursor away — press `Shift+]` to return to the newest.
| `;` | Where am I — area name, in-game date and time, coordinates |
| `Ctrl` + numpad `1`–`9` | Describe the tile in that direction without moving |
| `Ctrl` + numpad `5` | Describe the tile you are standing on |
| `End` | Unexplored ways — where there is still somewhere to go |
| `Shift+End` | The nearest way out of this level |
#### Getting your bearings on a whole floor (`End`)
`/` and the numpad probes tell you about the tiles beside you. `End` tells you
about the *floor*: it looks at everywhere you have already been, finds the places
where explored ground runs up against ground you have never seen, and reads them
out nearest first.
> `3 unexplored ways: 6 tiles north, 11 tiles south-west, 14 tiles east`
Each "way" is one opening, so a wide doorway counts once rather than three times.
When there is nowhere left to go you get `No unexplored ways from here`, which is
usually the moment to take `Shift+End` and leave.
This never tells you anything about ground you have not seen — only that there is
still a way through. It is the same thing a sighted player reads off the edge of
the explored area on screen.
`Shift+End` names the nearest exit you know about, how far away it is, and how
many steps it takes to walk there. Exits are also a tracker category (below), so
`Shift+End` is a shortcut rather than the only route — and it deliberately leaves
whatever you were tracking untouched.
#### Announcing things as they come into view (`Shift+/`)
@@ -126,6 +150,7 @@ Finds everything you have seen, sorted by distance.
| `Shift+PageUp` / `Shift+PageDown` | Previous / next **instance** of that kind |
| `Home` | Distance, direction, and number of steps by path |
| `Ctrl+Home` | Walk to it |
| `Shift+End` | The nearest exit, without changing your selection |
Categories: Creatures, Items, Alchemy, Interactables, Exits, Terrain features.
@@ -241,6 +266,29 @@ names, exactly as a sighted player sees only the icons.
Details also go into the message history, so `[` and `]` walk back through a
long description a piece at a time and `\` re-reads a line.
### The travel map
The map of Rimesia you get when you leave an area is a picture: icons scattered
across a painting, with a panel beside them. Arrowing through the list now reads
what the picture says.
```
Blackreed Mire, swamp, 2 of 9, north-east, Travel will take 1 day and 6 hours,
Visited 3 days ago
```
- **what kind of place it is** — town, crypt, mine, shipwreck, witchwood — which
on screen is only the shape of the icon;
- **which way it lies** from where you are standing now;
- **how long the journey takes**, which is the number the decision actually turns
on and which was previously only in the side panel;
- **when you were last there**, which on a map full of similar-sounding names is
often the only way to tell them apart.
The area's description is longer, so it is not read every time you move the
cursor. `=` reads it, and stopping on an area for half a second reads it by
itself — the same way item details work.
### Your character
| Key | Action |