75 lines
4.1 KiB
Markdown
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.
|