Files
Viano-Core/doc/clientless/transport-deck-navigation.md
T

75 lines
4.1 KiB
Markdown

# Local transport deck navigation
Supported passengers: The Bravery (entry176310, display3015), Tiefenbahn subway
entries176080 through176086 (display3831). No new routes or boarding recordings
are created. Existing recorded dock transitions and native passenger ownership
remain authoritative.
The controller lazily builds and caches one model-local Recast/Detour mesh per
supported model from vmaps/Transportship.wmo.vmo and vmaps/Subwaycar.m2.vmo.
Existing collision extraction is sufficient; no world MMAP regeneration or new
external data format is required. Missing/unsupported models retain the recorded
shared stand behaviour. Cached meshes are rebuilt on process restart.
Raster cells are0.15m with0.10m vertical resolution, minimum headroom2m,
climb0.4m, slope45 degrees and erosion radius0.6m. Model-local XYZ is converted
to Detour YZX; extracted M2 triangle winding is reversed, like the map generator.
Queries reject incomplete corridors, distant floor projections and truncated
results. Polygon crossings preserve obstacle corners and floor geometry.
Only reachable points near the current deck level are selected; this does not
intentionally send bots on tours of other floors.
After boarding, bots may select a nearby reachable point with a validated return
path. Targets prefer spacing from reserved destinations and other nearby native
passengers. Crowding can leave bots at the original stand. Meshes are shared;
reservations and movement state are per passenger and vehicle identity.
Native splines use local transport coordinates, disable a second world-to-local
transformation, retain passenger ownership and walk at2m/s. A walk is scheduled
only during an actual pause with enough time for the outward path and a2s
reserve. The return path is validated then, but its time is reserved at the
destination, not at the departure dock. Departure, combat, death, timeout or the
last1.5s of a pause stop an active deck spline without detaching the passenger.
The current safe local position remains fixed during transit.
At a recorded destination dock, the bot finds a complete local path to the
recorded exit anchor. Return duration, exit duration and a2s reserve must fit the
remaining pause. The recorded disembarkation begins only after reaching that
anchor. If no safe path/time exists, the bot remains aboard rather than moving
through geometry. Existing ride timeout, cancellation and lost-passenger recovery
still apply. Group formation resumes only after complete disembarkation.
Read-only diagnostics (may populate the mesh cache):
```
clientless transport deck 176310
clientless transport deck 176081
```
Reports polygon counts and a bounded grid of reachable test targets/return paths.
Navigation log events: DECK_MESH and DECK_WALK. A DECK_WALK event records a spline
launch, not proof that the destination was reached. Normal TRANSPORT_STATE events
and passenger position traces are needed for live acceptance.
Regression tests:
- test_transport_deck_mesh.py: actual production mesh builder against synthetic
walls, low ceilings, disconnected floors, edges, invalid inputs, and both real
collision models. Data/build directory arguments are configurable.
- test_transport_deck_control.py: production scheduling/arrival method with
deterministic passenger/docking doubles.
- test_transport.py: existing native transition regressions plus the deck-return
gate that prevents premature disembarkation.
Visual acceptance should cover multiple passengers spreading at a dock, stopping
when departure begins, retaining their positions in transit and returning before
normal disembarkation. Geometry/controller tests do not replace this acceptance.
Live validation: both meshes were generated natively and a ship journey and a
first subway journey completed. After reducing the departure-only time budget,
a second subway journey exercised initial spreading too. That final journey hit
severe world-update stalls during disembarkation: the wagon departed and native
safety kept the passenger aboard. Exit timing under that load remains a known
limitation; see the dated checkpoint for exact evidence. Fixed travel-time
reserves do not compensate for entire skipped/late transport update windows.