Skip to content

ntre_terminal_jgr: navmesh rework - #140

Merged
sunzenshen merged 9 commits into
NeotokyoRebuild:masterfrom
sunzenshen:navmesh-terminal-release
Oct 14, 2026
Merged

sunzenshen merged 9 commits into
NeotokyoRebuild:masterfrom
sunzenshen:navmesh-terminal-release

Conversation

@sunzenshen

@sunzenshen sunzenshen commented Sep 27, 2026 •

Copy link
Copy Markdown
Contributor

ntre_terminal_jgr: navmesh rework

One file, neo/maps/nav/ntre_terminal_jgr.nav. Most of it was measured on upstream master plus NeotokyoRebuild/neo#2176 and NeotokyoRebuild/neo#2186 ("Bots skip weapons they cannot reach", merged since), with harness logging added, and again with #2176 switched off.

Dependencies and status

Needs (worse than master, or broken, without it):

  • More tweaks to bot ladder approaches, climbs and dismounts neo#2176 ("Fix bot ladder approaches, climbs and dismounts", draft), for nav ladders 8 and 25 (see "Nav ladders"): on upstream ladder code, bots walking past those two ladders get caught on them, about 1.5 times a round at ladder 8. In the ladder PR's own ladder tests on this mesh (12 bots, a team sent up or down one ladder), master finished 4 of 92 climbs up ladder 8, 81 of them ending back at the foot, and the ladder PR 12 of 12, three runs each. Ladder 25 is off the tested routes (the ladder PR's bots climbed it twice and finished both; master's never). Across all 48 of this mesh's ladders, one run each way, master finished 39 of 136 climbs and the ladder PR 113 of 113.

The rest of the mesh needs no code change.

Helped by (measured better with it; the mesh does not wait on it):

  • None measured.

Pending before review:

At a glance

master this PR
nav areas 2660 1893
file size 3,776,964 bytes 2,045,626 bytes (-46 %)
nav ladders (the map has 50 ladder brushes) 0 48, connected both ways but one
areas no spawn or objective can reach 69 (10 pockets) 0
the same, counting no walk link that climbs 68 u or more (the most a Recon bot plans to jump) 406 (59 pockets) 136 (59 pockets)
areas the engine blocks at every round start 2 0
bot stuck events a match (see below) 517.5 26.3

What changed

  • The spawn-room exit. It is a doorway under a lintel 60 u above the floor, so every class has to duck through it, but master marks only the strip under the lintel as a crouch area. Bots duck only once their center is inside one, so a standing bot's hull hit the lintel while it was still in the spawn room, and it stood pressing into the wall. The crouch zone now starts before the doorway. On master this one spot produces about half of the stuck events below.
  • Walk links a player hull cannot cross are cut. Seven run past handrails, a crossbeam, and wall and floor brushes: a hull swept along each finds no clear lane, and bots got stuck on every one of them. 8101 <-> 10248 runs through the handrail near (1200, -3712); bots go round it. 1533 -> 6074, a 30 u climb from the ramp onto a stair top near (-88, -3880), crosses the stair's stringer, and the engine hull audit (a player hull moved along the link in the server, recording the props and brushes it hits) finds no clear lane on any of its 6; 6074 keeps its other links.
  • Every walk link between areas at the same height runs both ways. Twelve ran one way only: eleven left by cutting hull-blocked links one direction at a time, and one from master. Each pair was swept in both directions with the engine hull audit. Two are blocked both ways and are cut both ways: past a small crate near (-520, 640) and a tree near (-380, -3810). Ten are clear on every lane and get their missing direction back.
  • No climb no class can make. Ten walk links climbed 70-144 u into an area with no drop back: seven whose drop was cut, two from master (334 -> 2036 and 342 -> 9410, 122 u from the platform onto the ledges above it) and 583 -> 9235 (144 u). A bot's path cost refuses any walk link that climbs its class's jump height or more (68 u for a Recon), so no bot planned these. They are removed. Two of them ran onto the sides of stair flights near (-100, -3200) and (-60, -1900) (1608 -> 9246, 6641 -> 9244); the flights keep their links at each end.
  • Every kept climb has its drop back. 8186 -> 3, the drop off the kcar roof near (1312, -4212) to the floor 51 u below, is linked: its climb (50.7 u, Recon only) is kept, and bots that reach the roof dropped off it even with the link cut (4 drops in 300 test matches). So is 10421 -> 323, the drop off the handrail top near (-50, -30, 302) to the platform 46 u below, whose climb is kept. A connectivity check run on every open navmesh PR (one-way links, climbs no class plans, traps, per class) found these two and the stair climb above.
  • Areas the engine blocks at round start. CNavArea::UpdateBlocked finds a solid at the center of 2 of master's areas (a prop and a brush) on every restart. They are cut around the obstacle.
  • Areas no hull fits in. The engine hull audit also lists links between areas at the same height that are blocked on every lane in both directions. Each was checked against the areas' stand samples (a hull placed every 4 u over the area), whether bots crossed it in the test matches below, and the stuck events near it:
    • Three areas no hull fits in anywhere (every stand sample blocked) are deleted: a crouch area under the robobag rack near (1962, -3640) and an area under the tree near (-366, -3812), each with every link blocked, and the top of the AC unit near (537, -3562, 97), which only 94 u climbs reached. 2 hiding spots go with them.
    • 7634, a sliver on the bottom tread of the stair flight near (1166, -3162), every sample blocked, is deleted: bots coming down the flight and heading for it hit the stair (9 stuck events in 5 of 175 matches). The flight keeps its links to the floor at its foot.
    • Kept: the feet of two other flights, 174 / 7511 near (1166, -638) and 8260 / 8261 near (1588, -3375). The audit's hull stands on the floor and meets the first tread, so these read blocked, but bots walk them (18 crossings at the first, 3 stuck events in 2 matches at the second).
  • Hand edits where test bots got stuck:
    • booth partitions
    • a machine module
    • stair landings and the drops beside them
    • a column
    • a rack foot
    • a railing
    • the foot of the ramp to the platform and two flatcar wheel trucks (below)
  • Unreachable floor is removed. Master has 69 areas in 10 pockets that no spawn or objective reaches: raised tops, ledges and a roof, each linked out only by drops of 76-268 u. That is above every class's crouch jump (Recon 72 u), and no climbable brush sits near any of them at their height. The platform building's roof (x 25..925, y -3450..-375: the roof at z 605, the gutters along it, and ledges at z 112-604; 52 areas, 17 hiding spots) was reached only by the 342 -> 9410 climb. None of the map's ladder brushes reaches it (all end at z 80 or at the platform, z 256-263), and its lowest ledges are 112-122 u above the floor or platform below them, so it is deleted too.
  • Re-analyzed in game after the edits, so the per-area visibility lists bots use for what they can see are current.

Nav ladders

The map has 50 ladder brushes (CONTENTS_LADDER; no ladder entity) and master's mesh has no nav ladder, so bots never climbed. The flatcar decks and the balconies at the car ends (z 80) were out of reach: their only links in are "jumps" of 73-80 u from the track floor, more than any class can jump, which the bots' path cost refuses. This mesh has 48 nav ladders, each from the brush's own extent:

  • 4 on the central platform, its west and east walls, from the floor at z 144 to the platform at z 256 (juggernaut spawn 0 stands at the foot of the east pair). The platform also has stairs; these are shortcuts.
  • 28 on the flatcars, the north and south faces of 14 cars, from the track floor to the deck. Up one side and off the other crosses the train.
  • 16 at car ends, from the track floor to a balcony about 40 x 120 u beside the car body. Two balconies had no area; each gets one, with a drop back to the floor in front.

Ladder 31 (the north face of the flatcar at (2038, -1200)) is descent-only (see "Approaches tried and dropped"). The flatcar keeps its south ladder both ways.

Two brushes get no ladder: one sits inside a flatcar's deck (floor at 80 u on both sides), and the other's foot is a hole in the floor slab down to z -64, 84 u below the brush.

The fence gaps

The fence at x -860 has two gaps. Master's four areas along its east side (9349-9352) are kept with their links and ids, so each gap leads straight into the area beyond it: 1.4 stuck events a match there (0.33 bot episodes).

The foot of the ramp to the platform

The ramp to the central platform is 75 u wide and climbs from the floor at x -650 to the platform at (-75, -450, 256) over open floor. Bots coming from the south-west met it at the south-east corner of its foot, and their next path point was 220 u up the ramp. They walked along its south edge, slid off while it was still low, followed its side on the floor and slipped under it once it was high enough to stand under. From below they passed the ramp's path points one by one and ended pressing into the platform wall under its top. Of 83 traced bots stuck there, 82 never set foot on the ramp. It was the largest stuck spot on this mesh without the edit and on master (master 8 events a match).

The first 50 u of the ramp (x -650..-600) is its own area, so the path turns onto the ramp's center line while the ramp is low enough to step onto. In the A/Bs below the spot goes from about 6 stuck events a match without that area to 0-0.04.

Wheel trucks

  • Area 649 ran under the corner of a flatcar's wheel truck at (-1626, -1140), and bots turning north there pressed into it. That corner of the area is cut out (the offline stand check with the stuck evidence of 95 matches), so the turn happens west of the truck: 0.80 -> 0.45 stuck events a match there on the upstream build, 0.84 -> 0.21 on the larger one (below).
  • Areas 45 and 50 ran to 5 u from the side of the flatcar at y 705. Bots coming up off the track at (0, 712) and turning east clipped the wheel truck at the car's west end. Area 45 is split at x 30, and its east part and area 50 now stop 17 u short of the car: 0.74 -> 0.04.

Id alignment

1885 of the 1893 areas carry the id of the master area they match, so an id-keyed diff against master reads sensibly. New areas (two balconies, the ramp's foot, three pieces at the wheel trucks) take ids above master's highest, and the fence areas keep master's 9349-9352. Ladders are numbered 1-48 (master has none). The alignment changes ids only: geometry, connections, attributes and the analysis data are unchanged by it.

How it was tested

  • Reachability:
    • every spawn can reach every other spawn
    • every objective is reachable from a spawn
    • every area is reachable from a spawn or an objective, counting every link as recorded
    • the mesh is one connected piece
    • counting no walk link that climbs 68 u or more (the most a Recon bot plans to jump since Give each bot class its own jump-height buffer neo#2163; it was 65 u before), 136 areas in 59 pockets stay out of reach (master 406 in 59): raised tops, the roofs of the long cars and pits. Each is left by a drop; none is entered only by a climb without a way back. Without the nav ladders it would be 201.
    • every walk link between two areas at the same height runs both ways, and no area is a dead end or a trap for any class
    • the engine hull audit of this mesh (a player hull swept across every link and stood on every area, in the server): of 3380 pairs of areas at the same height, 2 read blocked both ways, the stair feet kept above
  • Falls: the map has no lethal hurt volume and no drop a bot can die from (the deepest drop link is 302 u, 6 damage at full health), so no area needs a PRECISE / CLIFF mark.
  • Matches. Byte-identical copies of the map, one carrying each .nav. JGR with the juggernaut pinned at each of its 5 spawn points in turn (sv_neo_jgr_spawn_force, Allow pinning the juggernaut to a specific spawn point neo#2169), 30 bots, default weapon damage, 8 matches at a time; every match reached match end with 0 asserts. The count excludes stuck events in the spawn crush at round start and the weapon-scavenging behavior. The master comparisons ran on this mesh without the audit, climb, roof and drop-back edits above; those edits were measured against the mesh without them. "The rework alone" is this mesh without its nav ladders, fence areas, ramp foot, wheel-truck cuts and those edits.
    • Master against this mesh, on upstream master + #2176 + #2186 with logging (10 pairs): stuck events 517.5 -> 26.3 a match (x0.04 [0.03, 0.06], 10 of 10 pairs down); FAIL_NO_PATH_EXISTS 10.0 -> 4.9; "fell off the path" 8.6 -> 0.5; no fall deaths.
    • The ladders, fence areas, ramp foot and wheel-truck cuts, against the rework alone, same build (80 pairs): stuck events 31.0 -> 25.3 a match (x0.73, 95 % interval [0.58, 0.92], 50 pairs down, 27 up); counting a bot's stuck events less than 10 s apart as one episode, x0.71 [0.60, 0.84]. The spots they target drop: the floor under the ramp 5.8 -> 0.04, the fence gaps 5.2 -> 1.9, the wheel truck at area 45 0.74 -> 0.04, area 649 0.80 -> 0.45. The doorway at (2060, -500) goes the other way, 0.11 -> 0.45 bot episodes a match (one match in 80 had a 15-bot jam there; see "Known").
    • The same on a larger build (160 pairs): upstream master plus my open bot PRs (Look along the ledge for a drop-down's clear column neo#2164, #2165, #2166, #2170, #2172, #2174-#2180, #2185 and #2186; #2176 included) with logging and default-off research switches. Stuck events 27.8 -> 20.9 a match (x0.83, 95 % interval [0.71, 0.98], 91 pairs down, 69 up); counting a bot's stuck events less than 10 s apart as one episode, x0.85 [0.76, 0.96]. The floor under the ramp 5.7 -> 0, the fence gaps 4.7 -> 1.3, area 45 0.72 -> 0.03, area 649 0.84 -> 0.21.
      • FAIL_NO_PATH_EXISTS 7.8 -> 6.2 (upstream build), 1.3 -> 1.2 (larger build); no fall deaths.
      • Bots start 126 ladder climbs a match on the upstream build (131 on the larger one), and 87-89 % end at the top.
      • Kills a match: x0.95 [0.84, 1.08] (upstream build; matches run 27-107 kills, as the round ends early or late) and x1.02 [0.94, 1.11] (larger build). Kills a minute of live round: x1.05 [0.98, 1.13] and x1.08 [1.02, 1.15].
    • The climb, roof and one-way-link edits, against the mesh without them, on upstream master + #2176 + #2186 with logging (300 matches with the two rows below, every one to match end with 0 asserts and no crash), 100 pairs: stuck events 25.8 -> 20.7 a match (paired x0.89, 95 % interval [0.72, 1.09], 54 pairs down, 44 up). Within 64 u of a changed link: 42 -> 48 stuck events, 22 of them from one bot in one match walking from area 1151 to 234 into the side of a stair flight near (-20, -3145), on a route no edit changed. FAIL_NO_PATH_EXISTS 6.5 -> 6.5 a match; "fell off the path" 0.2 -> 0.4; no fall deaths. Kills 66.0 -> 63.3 a match, kills a minute of live round x0.94 [0.87, 1.01]: the direction flips between juggernaut spawns and between batches, and a third arm in one batch, with only the climb cuts and the roof removal, ran x1.09 [0.94, 1.28] against the mesh without them, so 25-match arms differ by about 10 % on this map. 90-91 % of kills between bots in different nav areas.
      • no bot crossed any of the ten removed climbs in the 100 matches with them in place (bots that go from 1565 / 9235 up to 6493 / 6483 climb ladders 3 and 4 beside those links, as often with the links removed)
      • Adding the hull edits (the areas no hull fits in and the handrail cut), 25 pairs: x0.94 [0.66, 1.37] (12 down, 13 up); at the changed areas and links 4 -> 0 stuck events.
      • Both together against neither, 25 pairs: stuck events 21.5 -> 19.6 a match (x0.98 [0.67, 1.39], 10 down, 15 up); within 64 u of a changed link 13 -> 4 (climb and one-way-link edits) and 6 -> 5 (hull edits; all five in area 421 beside the deleted crouch area); kills a minute of live round x1.05 [0.94, 1.17]; FAIL_NO_PATH_EXISTS 6.3 -> 6.8; no fall deaths; 92 % / 91 % of kills between bots in different nav areas.
    • The drop backs and the stair-climb cut, against the mesh without them, on the harness research build (neo bot-navmesh-generation-research with logging, its research switches at their defaults), 5 runs a spawn, 25 pairs, every match to match end with 0 asserts:
      • stuck events 29.7 -> 17.1 a match (paired x0.80, 95 % interval [0.53, 1.17], 14 pairs down, 11 up); no stuck event near any of the three links in either arm
      • FAIL_NO_PATH_EXISTS 0.9 -> 1.1 a match; kills 60.6 -> 64.2; no fall deaths
      • a link walker (one bot of each class sent across a single nav link from 128 u back, in the server): Recon, Assault and Support all make both restored drops
      • the connectivity check: no new defect against master (without these edits: 3)
    • With #2176 switched off (upstream ladder code, 15 matches each, on the mesh with its ladders and fence areas but without the ramp, wheel-truck and later edits): master 449.3 -> 23.1 a match (x0.04 [0.03, 0.07], 15 of 15 down), against the rework alone 25.7 -> 23.1 (x0.78 [0.38, 1.39]). But bots walking past ladder 8 (the south face of the flatcar at (-1575, 775), near the defenders' spawn, 52 climbs a match) and ladder 25 (the north face of the flatcar at (1212, -1200)) get caught on them: 1.47 and 0.80 stuck bot episodes a match, against 0.05 and 0.10 with #2176.
  • Ladder probes. Each of the 34 ladder tops was made the objective with the ghost pinned on it (see below), once on master's mesh and once on this one: bots reached all 34 on this mesh, within 16 u, in 10-48 s. On master they reached the 4 platform landings (by the stairs) and 2 others.
  • Bots still see and shoot across the mesh. On the upstream build, 91 % of kills are between bots in different nav areas and 76 % in non-adjacent ones, against 92 % / 80 % for the rework alone (kill distance median 521 u, 561 u; master 93 % / 82 %, 624 u); on the larger build 91 % / 76 % against 93 % / 79 %.

How the pinned-ghost probes work

The offline checks show that the mesh links an area to a spawn. They do not show that a bot will walk there: a link can cross a gap the player hull cannot fit through, or lead along a route path planning never picks. To test one area in game, the area is made the objective and bots are sent to get it.

  • The ghost is placed on the area by a server cvar. A harness-only neo patch, used on test builds and not part of this PR or any neo PR, adds sv_neo_ghost_spawn_pos "x y z". It replaces the position the round's chosen ghost spawn would have used, so any point becomes the CTG objective. The ghost is dropped a little above the area and settles onto it as it would from a real spawn. The map file is not edited.
  • A pickup at the spot means bots can reach the area. Bots run their normal CTG errand to the ghost. A pickup is the clear signal; a bot coming within 160 u is a weaker one. The position of the first pickup is checked, because a ghost on a low raised top can be taken from the floor below, and a ghost on a narrow ledge can fall off it.
  • A miss only counts with a control. One run is a screen. A spot bots miss is re-run 6 times beside a control spot on the same map that bots are known to reach, in the same batch. Without the control, "not reachable" and "the probe did not work" look the same.
  • Weapon damage is turned down for these probes, so bots move instead of dying in fights on the way.
  • Master's mesh can run beside this one. The game loads a .nav by map name, so the harness copies the .bsp byte for byte under a second name (for example ntre_oilstainb_ctg) that loads its own .nav. The same pin then runs on both meshes in one batch. The copy only carries the second mesh; the ghost comes from the cvar.

On this map. Terminal has no ghost spawns or capture zones, so here the probe also needs the server forced into CTG and two more harness patches that spawn the ghost and send bots to it without a capture zone. The areas removed as unreachable were judged from drop heights against the class crouch jumps, not probed, and the A/Bs above pin the juggernaut, not the ghost. The ladder probes ran on the harness research build, which has those patches.

Known, not changed

  • Ladder 31 is descent-only (above). Making it climbable again needs bots that wait their turn at a ladder and keep out from under the car's overhang at its foot. The same car's south ladder (32) collects 0.72 stuck events a match (0.22 bot episodes) at its foot, where the approach runs along the car's wheel truck, and 77 % of its 8 climbs a match end on the deck.
  • The doorway at (2060, -500) is 25 u of nav wide, between areas 269 and 312, on the new route over that flatcar. When the two teams meet there in a fight they can jam it: in and beside the doorway, 2.5 stuck events a match (0.45 bot episodes) on this mesh against 0.39 (0.11) on the rework alone on the upstream build (one 15-bot jam in 80 matches), and 1.9 (0.33) against 0.25 (0.06) on the larger build. It is a fight in a narrow door, not a missing link.
  • The juggernaut suit is a solid object until someone takes it. Where it lies in a corridor, bots rushing it pile up against it: one match in 80 on each mesh in the batches above (46 and 121 stuck events). Not a mesh matter.
Earlier measurements (the rework alone, and the rework with its ladders and fence areas)

These ran on earlier revisions of this mesh. The rework alone (1940 areas) has no nav ladders and merges master's four fence areas into one strip, and lacks the ramp foot, the wheel-truck cuts and the audit, climb, roof and drop-back edits. "With ladders and fence areas" adds the 48 nav ladders and master's fence areas (1949 areas). Ids: 1938 of the 1940 areas of the rework alone carried master's ids (kept ids more than 64 u from their master location fell from 128 to 59, and an id-keyed diff showed 2 added / 722 removed areas), and 1941 of the 1949 with ladders and fence areas. Counting no walk link that climbs 68 u or more, the rework alone left 252 areas in 51 pockets out of reach.

  • The rework alone against master, one batch (on the harness research build). JGR with the juggernaut pinned at each of its 5 spawn points, 3 matches each, 30 bots, default weapon damage.
    • stuck events 468 -> 43 a match (paired x0.08, 95 % interval [0.06, 0.11], 15 of 15 pairs down)
    • FAIL_NO_PATH_EXISTS move failures 7.3 -> 5.9 a match
    • "fell off the path" failures 7.4 -> 0.4 a match
    • kills 49.9 -> 63.6 a match
    • no fall deaths in either
  • Master, the rework alone and the rework with ladders and fence areas side by side, on upstream master + #2176 + #2186 with logging. Same design: juggernaut pinned at each of the 5 spawns in turn, 30 bots, default weapon damage, 8 matches at a time; 55 matches on each of the two reworks (11 per spawn), 35 on master. Every match reached match end with 0 asserts.
    • stuck events master 427.5 -> 22.7 a match (paired x0.05, 95 % interval [0.04, 0.06], 35 of 35 pairs down)
    • the rework alone 29.9 -> 22.7 a match (x0.81 [0.62, 1.07], 33 pairs down, 22 up); the fence gaps 3.6 -> 1.4
    • FAIL_NO_PATH_EXISTS move failures 9.7 -> 9.3 a match (x0.96 [0.74, 1.25]; master 10.5)
    • bots start 126 ladder climbs a match and 90 % reach the top; 14 descents, 98 %
    • kills 58.5 -> 62.5 a match (master 49.9)
    • no fall deaths
  • Pocket probes. Three pockets were probed 6 runs each, with a control picked up 3/3: no pickups (one run came within 140 u).

Approaches tried and dropped

  • Ladder 31 climbable. The attackers' round-start rush queued at it, and bots pushed back off the deck edge landed under the car's overhang (open from z 22 to 64) and walked under the car: 1.5 stuck events a match there, all in the rounds with the juggernaut at spawn 1 (2.7 bot episodes a round), against none on master. Fix: descent-only.
  • Master's four fence areas merged into one 25 u strip. A bot through either gap was routed along the fence to the strip's far portal, where it got stuck 3.6 times a match (0.95 bot episodes; master 1.4 and 0.20). Fix: master's four areas, links and ids.
  • A third wheel-truck cut the stand check proposed (an obstruction at (-1443, 1505)): stuck in that corner did not go down, and it cut a link.

One file. Against master: 2660 -> 1940 areas, 3,776,964 -> 2,146,204
bytes; 69 areas no spawn or objective reaches (10 pockets) -> 0; 2
areas the engine blocks at every round start -> 0.

- Areas CNavArea::UpdateBlocked finds solid at their center at round
  start are cut around the obstacle or dropped.
- 7 walk links a player hull cannot cross (handrails, a crossbeam,
  wall and floor brushes) are cut.
- The crouch zone at the spawn-room exit is widened so bots duck
  before their hull reaches the lintel.
- Hand edits where test bots got stuck: booth partitions, a machine
  module, stair landings and drops, a column, a rack foot and a railing.
- Unreachable floor is removed: raised tops, ledges and a roof linked
  out only by drops of 76-268 u, above every class's crouch jump.
- Re-analyzed in game after the edits.
Renumbers area ids only, so an id-keyed diff against master reads
sensibly: 1938 of the 1940 areas carry the id of the master area they
match, kept ids that moved more than 64 u from their master location
drop from 128 to 59, and the diff shows 2 added / 722 removed areas.
Geometry, connections, attributes and the analyzed visibility data are
unchanged (verified topology-identical).
@sunzenshen

Copy link
Copy Markdown
Contributor Author

This one accidentally slipped through the phase 1 criteria, since this one has ladders. Need to reprocess this nav file before it's ready to review.

The map has 50 ladder brushes and the mesh had no nav ladders, so the
flatcar decks and car-end balconies (z 80) were out of reach (their
only links in rise 73-80 u, over every class's jump) and the central
platform's four 112 u ladders were unused. 48 nav ladders, each
connected both ways:

- 4 on the central platform's west and east walls (z 144 -> 256)
- 28 on the north and south faces of 14 flatcars (floor -> deck)
- 16 at car ends, floor -> balcony; two balconies get an area

Ladder 31 (flatcar 432's north face) is descent-only: bots queued at
it in the round-start rush and walked under the car's overhang.
Brush 4479 (inside a deck) and 4486 (its foot is a hole) are left out.
Area ids unchanged; new ids above master's. Re-analyzed in game.
The 25 u strip east of the fence at x -860 is split back into
master's 9349 / 9350 / 9351 / 9352 with master's links and ids, so a
bot through either gap walks into the area beyond it. Commit 1 had
merged them into one strip: bots crossing a gap walked along the
fence to the far portal and got stuck there more often than on master.
Re-analyzed in game.
The ramp to the central platform (75 u wide, x -650..-75) climbs
over open floor. Bots coming from the south-west met it at its foot's
south-east corner, and their next path point was 220 u up the ramp:
they walked along its south edge, slid off while it was still low,
followed its side on the floor and slipped under it once it was high
enough. From below they passed the ramp's path points one by one and
pressed into the platform wall under its top. That was this mesh's
largest stuck spot.

The ramp's first 50 u (x -650..-600) is now its own area, so the path
turns onto the ramp's center line while it is low enough to step on.
Links and the other ids are unchanged; the new area takes an id above
master's highest. Re-analyzed in game.
- Area 649 ran under the corner of a flatcar's wheel truck at
  (-1626, -1140), and bots turning north there pressed into it. That
  corner of the area is cut out, so the turn happens west of the truck.
- Areas 45 and 50 ran to 5 u from the side of the flatcar at y 705.
  Bots coming up off the track at (0, 712) and turning east clipped
  the wheel truck at the car's west end. Area 45 is split at x 30; its
  east part and area 50 now stop 17 u short of the car.

Every area stays reachable as before; the three new areas take ids
above master's highest. Re-analyzed in game.
An outside review of this mesh found climbs kept after their drop
back was cut, and walk links that run one way only.

- Remove the ten one-way climbs of 70-144 u, over every class's
  limit: 1313 -> 222, 1565 -> 6493, 1608 -> 9246, 2071 -> 92,
  6641 -> 9244, 9235 -> 6483, 9452 -> 109, 583 -> 9235, 334 -> 2036
  and 342 -> 9410. No bot path used them.
- Delete the platform building's roof (52 areas, z 378-647 over
  x 25..925, y -3450..-375). Its only way in was the 122 u climb
  342 -> 9410, it has no ladder, and no walk or jump route leads up
  to it.
- One-way links, each swept with a player hull in both directions by
  the engine's hull audit: cut both ways the two pairs blocked both
  ways (a crate, a tree); restore the missing direction of the ten
  pairs clear both ways.

Existing areas keep their ids; the 48 nav ladders are unchanged.
Re-analyzed in game (same graph, fresh visibility).
The engine hull audit run for the review fixes also lists level
links blocked on every lane in both directions. Where the blocker is
static and bots do not cross:

- Delete three areas no player hull fits in anywhere: a crouch area
  under the robobag rack near (1962, -3640), an area under the tree
  near (-366, -3812) and the top of the AC unit near (537, -3562),
  which only 94 u climbs reached.
- Delete 7634, a sliver on the bottom tread of the stair flight near
  (1166, -3162). Bots coming down the flight and heading for it hit
  the stair; the flight keeps its links to the floor.
- Cut 8101 <-> 10248 through the handrail near (1200, -3712); bots
  go round it.

Two links at the feet of other flights, which the audit reads
blocked because its hull meets the first tread, are kept: bots cross
them. Existing areas keep their ids; the 48 nav ladders are
unchanged. Re-analyzed in game (same graph, fresh visibility).
A connectivity check of the open navmesh PRs failed this mesh on three
half cuts left by commit 1's railing pass, which judged each direction
of a link on its own:

- Restore 8186 -> 3, the drop off the kcar roof near (1312, -4212) to
  the floor 51 u below. Its climb was kept, and bots on the roof
  dropped off it anyway.
- Restore 10421 -> 323, the drop off the handrail top near (-50, -30)
  to the platform 46 u below. Its climb was kept.
- Cut 1533 -> 6074, a 30 u climb from the ramp onto a stair top near
  (-88, -3880) through the stair's stringer: the engine hull audit
  finds no clear lane.

Every class makes both restored drops (link walker). Existing areas
keep their ids; the 48 nav ladders are unchanged. Re-analyzed in game
(same graph, fresh visibility).
sunzenshen added a commit to sunzenshen/neoAssets that referenced this pull request Oct 4, 2026
As navmesh-terminal-release 9473417 (NeotokyoRebuild#140): restore 8186 -> 3 and
10421 -> 323, cut 1533 -> 6074 through the stair stringer.
@sunzenshen

Copy link
Copy Markdown
Contributor Author

Wireframe seems to have a really tough time detecting the matching nav ladders with the brush ladders, but on the Inspect panel you can see that the connected areas do report the addition of ladder nav connections:

image

Also did some spot checks with the ladders in the map:

image

@sunzenshen
sunzenshen marked this pull request as ready for review October 9, 2026 04:05
@sunzenshen
sunzenshen requested a review from sunmachine October 9, 2026 04:06

@sunmachine sunmachine left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

No obvious issues.

@sunmachine
sunmachine requested a review from a team October 14, 2026 02:22
@sunzenshen
sunzenshen merged commit ffec8f5 into NeotokyoRebuild:master Oct 14, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants