Skip to content

ntre_yard_jgr: navmesh rework - #154

Open
sunzenshen wants to merge 8 commits into
NeotokyoRebuild:masterfrom
sunzenshen:navmesh-yard-release
Open

sunzenshen wants to merge 8 commits into
NeotokyoRebuild:masterfrom
sunzenshen:navmesh-yard-release

Conversation

@sunzenshen

@sunzenshen sunzenshen commented Oct 2, 2026 •

Copy link
Copy Markdown
Contributor

ntre_yard_jgr: navmesh rework

One file, neo/maps/nav/ntre_yard_jgr.nav.

Dependencies and status

Needs: none. Measured on neo master 092203f36 with no open PR (A/B below). The bot change this mesh carries data for is in master now:

  • More tweaks to bot ladder approaches, climbs and dismounts neo#2176 ("Fix bot ladder approaches, climbs and dismounts", merged). Nine ladders are linked going down (3, 4, 5, 8, 9, 10, 13, 14 and 15), and their tops stand on a parapet or behind a handrail, 35-39 u above the floor behind them: bots take them down with its over-the-top descent mount (its commit "Mount ladder descents over a barrier at the top"). On neo master, 104 descents of those ladders reached the bottom in 48 matches, and 1 stuck event at their tops was a bot in a ladder behavior.

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

At a glance

master this PR
nav areas 1931 1570
file size 3,154,593 bytes 2,339,398 bytes (-26 %)
nav ladders (the map has 13 ladder brushes) 0 11, all both ways
juggernaut spawns a spawn can reach 2 of 3 3 of 3
areas no spawn or objective can reach 231 (18 pockets) 63 (15 pockets)
the same, counting only the climbs a Recon bot plans (under 68 u) 449 203
areas that can be entered and not left, for some class 2 (a staircase landing) 0
areas the engine blocks at every round start 6 0
bot stuck events a match on neo master (A/B below) 67.5 47.3
stuck episodes a match on neo master 14.4 8.8

What changed

  • Sliver areas merged into their neighbors on the same floor.
  • Areas the engine blocks at round start are cut away. At every round start the engine marks an area blocked when a prop or a displacement sits over its center, and bots cannot path through a blocked area. An offline check of that test finds 6 such areas on master and none here.
  • Walk links a player hull cannot cross. The engine's hull audit (a player hull stood on every area and swept across every link, in the server) and a link check against master:
    • pairs of walk links where one direction had been cut over a railing or prop and the other kept: the two pairs blocked both ways (a flatbed trailer near (1225, 1635), a container near (-1010, -660)) are cut both ways, the two clear both ways (6342 / 4843 on the east building's roof, 6719 / 6750 on the west roof) get their missing direction
    • three climbs of 34-39 u had lost their drop back; the climb reads clear, so the drop back is restored (6437 -> 644, 6440 -> 685, 4820 -> 6158)
    • four climbs of 101-178 u that no class plans (a Recon plans climbs under 68 u, Give each bot class its own jump-height buffer neo#2163) are removed: 63 -> 5661 onto the attacker deck's upper level, 301 -> 6433 and 871 -> 6443 onto two rail tops, 5640 -> 6158 from the east building's catwalk to its roof
    • 41 areas a player hull cannot stand in, or reached only through one, are deleted: the small squares inside the barrier round-bars, stair props, trailers, the forklift and the powersuit racks, and a 40 x 20 u area at the kitchen shelf near (-740, 2470) where bots that walked in stuck
  • Hand edits where test bots got stuck: two stair landings bots walk under, at (110, -1395) and (-1270, 905), have crouch areas under their edges, and an area that ran across a support beam under one is removed; at the L of barrier rails at (-1400, 700), the areas that ran through the rails are removed and the two inside the L are pulled a half hull off them.
  • No-return pockets closed:
    • ten 10 x 10 areas in the corner gaps of L-shaped barrier pairs had a link in and none out; each links back to the area beside it
    • four step surfaces of the truck at (-795, -987), entered by drops off its cab and trailer, each get a drop to the ground beside it
    • the walled lot in the south-west corner (x -2420..-1320, y -3940..-2900; 22 areas) is removed: a wall and a playerclip brush close its north side, its only ways in are drops off the south roofs, which no spawn can reach, and nothing in it can leave
  • Re-analyzed in game after the edits, so the per-area visibility lists bots use for what they can see are current.

Roofs and ladders

  • The west building's roof. Juggernaut spawn 1 stands on it, and master has no area within 370 u of that spawn. The roof is a walkway inside a 38 u parapet. Ladder 10 (west face) and ladder 13 (north face) lead up; their tops stand on the parapet, 37 u above the walkway, and they are linked both ways (see the code note above). Three strips on the parapet top, each a 37 u climb from the walkway, drop to open ground (about 13 damage).
  • The east building. Its catwalk (z 72) is meshed, and six nav ladders join the building's levels: 3 and 8 from the ground to the catwalk, 4 and 9 from the catwalk to the roof at z 200, 5 and 11 from that roof to the top tier at z 345. The tops of 3 and 8 stand behind the catwalk's handrail, which runs unbroken across them.
  • Ladder 12, the leaning ladder at (-276, -2904) in the south-west courtyard, follows its brush. It is 20 u wide and climbed from the south.
  • The north and south roofs. The north and south buildings have the same 389 u ladders as the west building, at (311, 1396) and (310, -1884), up to roofs about 720 x 435 u that master does not cover. Both roofs are meshed by hand: the walkway inside the parapet, the roof round its solid housing, and the raised platform round its two AC units. The areas stay 4 u off walls and props, and their corner heights follow the measured floor. Ladders 14 and 15 lead up; each ladder's top is the roof floor in front of it.
  • The roofs' ways down. Each roof has two parapet-top strips that drop about 385 u to open ground. The roofs have a 16 u ledge along the inner face of their parapet: a player within 16 u of it rests on it, but no player can stand on the ledge itself, as their box would be inside the parapet. The strips to the vent-top exits on the west parapets start from the band in front of the ledge, where a player stands on it, and the climb to the exits beside ladders 14 and 15 is recorded from the ledge a bot climbs from (39.5 u, so a Support plans it; Support plans climbs under 43 u).
  • The fifth 389 u ladder, at (2000, 1100), stands behind a playerclip wall (x 1944..1952) and is left out.

Prop staircases

The yard has ten stairs_top prop staircases: a landing about 76 u over the ground, on a slab with 55-69 u of headroom under it, and a flight down one side. Two stand on roofs and one is outside the playable area.

  • Seven flights meshed. Master meshes the landings but not their flights, so no walk link leads onto a landing, and a bot that walks up the steps anyway, chasing or cutting a corner past the flight's foot, can leave only by a drop, a climb onto the rail top, or not at all (the landing at (-170, 130) only by a 173 u climb no class makes). Each flight is one sloped area in the middle of its treads, 20 u wide, about 5 u clear of the handrail on one side and the open stringer on the other, linked both ways to the landing and to the floor at its foot. Drops recorded across the unmeshed flights, which bots followed off the flight's side, are replaced by the flights.
  • Crouch lead-ins. A bot ducks once its center is on a CROUCH area, and under a landing every class but sometimes Recon has to duck (standing, a Recon is 64 u tall, an Assault 65, a Support 70). At most of the crawlspace mouths the slab's edge lay 1-28 u inside the CROUCH area, so a bot walking in hit the edge standing before it ducked. At 15 mouths a strip of the area in front is split off and marked CROUCH, so the crouch zone starts 40 u before the edge (20 u at one mouth that is also a walkway).

Id alignment

1396 of the 1570 areas carry the id of the master area they match; 15 of those sit more than 64 u from their master location. The other 174 take ids above master's highest (6470). Master has no nav ladders, so the eleven ladders keep their own ids (3, 4, 5, 8-15).

How it was tested

  • Reachability:
    • every spawn can reach every other spawn, counting every link as recorded, and every juggernaut spawn is reachable (master: not spawn 1, on the roof)
    • all three building roofs can be reached by their ladders and left by their parapet exits, for every class; every staircase landing can be reached and left by its flight
    • 63 areas in 15 pockets no spawn or objective reaches (master 231 in 18, among them the east building's upper levels, 122 areas, which master gives no way up): raised tops of crates, trucks and containers and a platform, linked out only by drops
    • counting only the climbs a Recon bot plans (under 68 u), 203 areas stay out of reach (master 449)
    • no area that can be entered and not left, for any class, counting only the climbs each class plans (Recon under 68 u, Juggernaut 59 u, Assault 48 u, Support 43 u); master has two, the staircase landing at (-170, 130)
    • no walk link between two areas at the same level runs one way, and no climb a class plans lacks its drop back
    • the engine hull audit: of 2949 pairs of areas at the same height, 25 read blocked, and bots cross each of them: props (the metal ladder prop near (-290, -2860), the powersuit rack near (1220, -3910), the snowrex near (-770, -1390)), displacement slopes, and the stair flights' feet, which read blocked one way only; none by a prop that moves (BLOCKED_LINKS map=ntre_yard_jgr level_pairs=2949 oneway=0 keep=0 cut=2 area=5 check=18 dynamic=0 entity=0)
    • no area is blocked at round start (master 6)
  • Both spawns are one-way. Under that 68 u limit, the attacker spawn (a deck at z 152) and the defender spawn room (z 0) can be left but not re-entered, on master and on this mesh alike. The attacker deck drops 144 u to the courtyard below it, and 104 u to the south-west courtyard. The geometry agrees: there is no stair or ladder back up. This matters for reading the stuck counts below.
  • Falls. The map has no lethal hurt volume and no drop a bot at full health can die from: the deepest drop is 632 u, 24 damage. So no area needs a PRECISE / CLIFF mark. Fall deaths in the A/Bs are bots on under about 13 health dropping off the roof exits or the east building; in the A/B on neo master, 2 in 48 matches on this mesh, bots on 3 and 17 health off the east building and the west roof (one thrown above the roof first), which master's mesh does not reach, and none on master's.
  • A/B on neo master 092203f36 (Release dedicated server, harness logging only). Byte-identical copies of the map, one carrying each .nav, matches interleaved: JGR with the juggernaut pinned at each of its 3 spawn points in turn (sv_neo_jgr_spawn_force, Allow pinning the juggernaut to a specific spawn point neo#2169, merged), 16 matches each (48 a mesh), 30 bots, default weapon damage (1.485), 1 round, 8 matches at a time, one XP tier a match rotated over the spawns. 96 of 96 matches reached match end with 0 asserts and no crash. The stuck count is OnStuck plus FAIL_STUCK move failures, excluding the spawn crush at round start and the weapon-scavenging behavior; a stuck episode is one bot's stuck events less than 10 s apart, counted once. Ratios are paired by spawn and match, with 95 % intervals.
a match, neo master master this PR paired
stuck events 67.5 47.3 x0.63 [0.51, 0.79], 36 of 48 pairs down, 11 up
stuck episodes 14.4 8.8 x0.62 [0.54, 0.70]
stuck within 48 u of the seven ground-level staircases 11.9 5.1 x0.39 [0.29, 0.53]
stuck at the wall under the attacker deck 29.7 21.8 x0.49 [0.31, 0.81]
no path 18.3 20.1 x1.11 [0.92, 1.33]
fell off the path 19.8 24.4 x1.27 [1.05, 1.53]
kills 99.1 99.3 x1.00 [0.97, 1.03]
fall deaths 0 0.04

Both meshes read higher on neo master than on the research build (below): most of the stuck events are at the wall under the attacker deck, 91 % of them on a straight-line fallback on both meshes, and the rise in "fell off the path" is the drop off the attacker deck's west ramp (both under "Known, not changed"). By juggernaut spawn: 0 x0.55 [0.36, 0.82], 1 x0.63 [0.51, 0.77], 2 x0.73 [0.45, 1.16].

  • Link walk (a test server puts a bot on one side of a link and sends it across, once per class): every link walked by a Recon, an Assault and a Support, and the staircase and crawlspace links 5 times each. Every flight link is crossed 5 of 5 times by every class in both directions.
  • Ladders (the A/B on neo master): bots finish about 33 climbs up a match, 29 of them at ladder 12; 2.2 descents a match of the nine parapet and handrail ladders reach the bottom, most at ladders 10 and 13 (34 and 28 in 48 matches), and 2 ended elsewhere. Of the 57 stuck events at those nine ladders' tops in 48 matches, 1 was a bot in a ladder behavior; 30 are fights on the west roof at ladder 10, where juggernaut spawn 1 stands. On the research build (below): about 44 climbs a match, 90 % to the top, and about two descent starts a match, 89 % to the bottom.
  • Bots still see and shoot across the mesh (research-build A/B). 98 % of kills are between bots in different nav areas and 91 % in non-adjacent ones, against 98 % / 92 % on master (kill distance median 894 u, master 845 u).
  • Pinned-ghost probes (see below):
    • the tops of ladders 10 and 13 (the west roof) and 3 and 8 (the east catwalk): bots reached all 4, in 33-155 s; on master only ladder 8's catwalk spot, and on the roof and at ladder 3 they came no closer than 240-336 u, as master has no area there
    • the north and south roofs, 4 matches each: picked up on the roof in all 8, in 25-34 s, climbing ladders 14 and 15 25-55 times a match; on master nobody picked it up (2 matches each)
    • the staircase landing at (-160, 140), 4 matches: picked up in 4 of 4 at 33-81 s by bots that came up the stairs; with that flight unmeshed, 4 of 4 at 133-556 s, by bots that dropped onto the landing from above
    • the roofs' parapet exits, 3 matches each: bots climbed onto every probed exit and dropped off it; stuck events at the vent tops 15 in 6 matches, mostly bots chasing an enemy beyond the parapet

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. sv_neo_ghost_spawn_pos "x y z" (Debug ConVar for overriding the ghost spawn position neo#2202, merged) 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 spot counts as reached when a bot comes within 160 u of it. The closest approach is checked too, because a ghost on a raised top can be taken from the floor below.
  • A miss only counts with a control. One run is a screen; a spot bots miss is re-run beside a control spot bots are known to reach, in the same batch.
  • 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 that loads its own .nav. The same pin then runs on both meshes in one batch.

On this map. Yard has no ghost spawns or capture zones, so here the probe also needs the server forced into CTG and two harness patches that spawn the ghost and send bots to it without a capture zone; those are harness-only, used on test builds and not part of this PR or any neo PR. The probes ran on the harness's research build, which has those patches.

Known, not changed

  • Roaming to unreachable spawns. Bots that roam to a spawn point they cannot reach press the wall under the attacker deck. On neo master it is the largest stuck spot on both meshes: 29.7 stuck events a match on master's mesh and 21.8 on this one (A/B above), 91 % of them on a straight-line fallback. When no route reaches a bot's goal, Path::Compute falls back to a straight line and labels it complete, and seek-and-destroy accepts it. Bot code, not the mesh: Bots skip goals no route reaches neo#2190 ("Bots skip goals no route reaches", draft) rejects such a goal and tries another; its research version cut all stuck events x0.70 [0.51, 0.99] on master's mesh and x0.67 [0.51, 0.85] on this one's first revision (12 pairs each).
  • The south-west courtyard's door at (-350, -2795). The courtyard is reached from the attacker side only. Its way out to the yard is a drop off a 102 u dock through this door. Bots that have just dropped through it, and are sent back toward an enemy inside the courtyard, to cover, or roaming, press the dock face: on neo master 1.3 -> 4.1 stuck events a match (0.42 -> 0.81 bot episodes). On a real route that is 1.3 -> 1.6; the rest is on a straight-line fallback, which master's mesh has none of there: Attack chases and roaming, Bots skip goals no route reaches neo#2190's case. This mesh sends more bots through the courtyard than master does: its ladder 12 is the courtyard's main way up onto the dock (master has no ladder there), and the deck's west ramp drops into it (next item). Bot code, not the mesh.
  • The drop off the attacker deck's west ramp. Attackers that leave the deck west walk down its ramp to a ledge at z 24 and drop 104 u into the south-west courtyard. On landing the path follower reports "fell off the path" and re-plans, and the bot walks on. It does so about one time in three on both meshes (15 of 51 on master's mesh, 426 of 1172 on this one), over the same areas and the same drop link. On this mesh 23 times as many bots leave the deck this way, where on master's they press the wall under it; that is the rise in "fell off the path" in the A/B (8.9 a match at this drop, 0.3 on master's mesh). It is not a stuck spot (0.15 stuck events a match). Path follower behavior, not the mesh.
  • Two crawlspaces a Support bot cannot duck through. Under the landings at (140, -1395) and (-336, -764) the headroom at one mouth is 57-62 u, under a Support's ducked 59 u, and no lane across that portal holds its ducked hull. Supports routed through them stick: 2.2 and 1.3 stuck events a match. A mesh cannot route one class differently; Bots skip crouch gaps their hull cannot fit neo#2199 makes the bot planner refuse such portals for Support (on its own test build, Support's stuck events at the first mouth went 1.12 -> 0 a match).
Earlier measurements (on the harness's research build, and the mesh before its roofs, review fixes, ladder descents and staircases)
  • This mesh against master on the harness's research build (10-04: neo master then, before #2170, #2175, #2185, #2197, #2198 and #2215 merged and before #2176's final revision, plus the open bot PRs, including #2176's descent mount, and further research bot changes left at their defaults, with logging). Byte-identical copies of the map, one carrying each .nav, run back to back. JGR with the juggernaut pinned at each of its 3 spawn points, 30 bots, default weapon damage, 8 matches at a time, 24 pairs. The stuck count is OnStuck plus FAIL_STUCK move failures, excluding the spawn crush at round start and the weapon-scavenging behavior.
    • stuck events 38.2 -> 17.7 a match (paired x0.48, 95 % interval [0.39, 0.58], 22 of 24 pairs down, 2 up); counting a bot's stuck events less than 10 s apart as one episode, x0.54 [0.45, 0.63]
    • within 48 u of the ten prop staircases: 14.0 -> 5.5 stuck events a match (x0.38 [0.26, 0.57], 18 down, 4 up)
    • FAIL_NO_PATH_EXISTS 3.6 -> 3.8 a match; "fell off the path" 6.0 -> 5.5; kills 102.6 -> 106.2 a match, a minute of live round x1.02 [0.99, 1.05]; fall deaths 0 / 0; no asserts, no crashes in 48 matches
    • when no route reaches a bot's goal, Path::Compute falls back to a straight line and labels it complete, and the bot walks it into whatever is in between; on this map that is mostly bots roaming to a spawn point they cannot reach (see "Known, not changed"). Split by the path the bot followed: on a real route x0.48 [0.39, 0.58]; on a straight-line fallback x0.93 [0.80, 1.06]
    • in #2176's own ladder tests on this mesh (12 bots, a team sent down each ladder, three runs a ladder), the neo code before it finished 10 of 27 descents of the nine parapet and handrail ladders and #2176 117 of 124
    • the wall under the attacker deck 1.9 -> 1.1 stuck events a match, and none at the south-west courtyard's door on either mesh

The first revision of this PR had the rework, the west roof and the east building's ladders, with every ladder whose top stands behind a parapet or rail climb-only. Later revisions meshed the north and south roofs, applied the outside review's and the hull audit's fixes, linked those ladders going down, moved the roof exits onto standing room and meshed the staircases. Each later step was measured against the one before it, the same way.

  • The first revision against master, on upstream master plus More tweaks to bot ladder approaches, climbs and dismounts neo#2176 and #2186 with logging (42 pairs): stuck events 91.2 -> 59.2 a match (x0.56 [0.45, 0.70], 34 down, 8 up); counting a bot's stuck events less than 10 s apart as one episode, x0.56 [0.49, 0.63]; on a real route 60.0 -> 30.4 (x0.48 [0.41, 0.55], 40 down, 1 up), on a straight-line fallback 31.2 -> 28.8 (x0.75 [0.42, 1.34]). At the spots: the barrier L at (-1400, 700) 7.7 -> 0.3, the stair landing at (-1270, 905) 6.0 -> 0.6, a brick trim at (1190, -2536) 5.1 -> 0.4, the stair landing at (110, -1395) 3.6 -> 1.8, the wall under the attacker deck 36.2 -> 19.1. Kills a minute x1.01 [0.98, 1.04].
  • The same with #2176 switched off (upstream ladder code, 15 pairs): 61.1 -> 49.6 a match (x0.73 [0.52, 1.02]); episodes x0.71 [0.55, 0.89]; on a real route x0.65 [0.46, 0.89]. Ladder 12's climbs end at the top 78 % of the time (93 % with #2176).
  • With the north and south roofs, against master (42 pairs, same build): 82.1 -> 53.4 a match (x0.61 [0.51, 0.73], 36 down, 6 up); the roofs alone x0.92 [0.70, 1.19]. Bots climb to the new roofs about once every two matches and log 0.17 stuck events a match there.
  • The first revision on the harness's research build (upstream master plus the open bot PRs, 30 pairs): 67.3 -> 49.6 a match (x0.70 [0.49, 0.98]); episodes x0.66 [0.54, 0.79]; on a real route 43.8 -> 26.2 (x0.59 [0.46, 0.75]), on a straight-line fallback 23.5 -> 23.4.
  • Each later step against the one before (upstream build for the first three, research build after): the review fixes x1.03 [0.85, 1.25] (36 pairs; stuck at the edited spots 49 -> 37), the hull-audit fixes x0.93 [0.70, 1.25] (24 pairs; at the edited links 48 -> 21), the ladder descents x1.01 [0.79, 1.26] (30 pairs; 103 descents started, 77 reached the bottom, 7 dropped off, 16 were interrupted by an enemy in sight), the roof exits x0.98 [0.83, 1.15] (60 pairs; in the exit probe, stuck events at the vent tops 101 -> 15 in 6 matches), the staircases x0.84 [0.70, 1.03] (48 pairs; within 48 u of the staircases 8.8 -> 6.0 stuck events a match, x0.70 [0.49, 1.00], and FAIL_NO_PATH_EXISTS 1.29 -> 0.08, x0.69 [0.54, 0.84]; the landing at (730, -1110), which had no link out in the previous revision, no-path 1.17 -> 0; the staircase at (251, 477) 1.81 -> 0.75, x0.70 [0.54, 0.91]; the west roof's 0.62 -> 0.04, x0.80 [0.69, 0.92]).

Approaches tried and dropped

  • Parapet-top strips to mount the roof ladders from above (before #2176's descent mount): of 5 down-approaches to ladder 13 from its strip, 4 ended with the bot dropping off the parapet's outside and 1 timed out. The strips only added two more drop exits.
  • The roof ladders linked going down on #2176 without its descent mount: x1.23 [0.95, 1.55] against the climb-only mesh; of 184 descents 109 timed out against the parapet or the rail and 1 reached the bottom.
  • A crouch lead-in on the 500 u area north of the staircase at (556, 1427): splitting it left 25 u strips along the staircase that pulled bots' paths onto its flight; stuck events there 0.38 -> 1.58 a match (x1.66 [1.21, 2.29], 24 pairs).

One file. Against master: 1931 -> 1555 areas, 3,154,593 -> 2,279,973
bytes; 0 -> 9 nav ladders; areas the engine blocks at every round
start 6 -> 0; areas no spawn or objective can reach 231 -> 66.

- Sliver areas merged into their neighbors on the same floor.
- Areas the engine blocks at round start (a prop or a displacement
  over the area's center) are cut away.
- The west building's roof (juggernaut spawn 1) is meshed: master has
  no area within 370 u of that spawn. Its two ladders (west face,
  ladder 10; north face, ladder 13) are climb only: their tops stand on
  the 38 u parapet round the roof, and a bot on the walkway inside
  cannot get onto them going down. Three strips on the parapet top,
  each a 37 u climb from the walkway, drop to open ground.
- The east building's catwalk (z 72) is meshed, and six nav ladders
  join the building's levels: 3 and 8 from the ground to the catwalk,
  4 and 9 from the catwalk to the roof at z 200, 5 and 11 from that
  roof to the top tier at z 345. Ladders 3 and 8 are climb only: their
  tops stand behind the catwalk's continuous handrail.
- Ladder 12, the leaning ladder at (-276, -2904), follows its brush:
  20 u wide, climbed from the south.
- Hand edits where test bots got stuck: crouch areas under two stair
  landings and a crouch doorway, an L of barrier rails at (-1400, 700).
- No-return pockets closed: ten 10 x 10 areas in the corners of
  barrier pairs link back to the area beside them; four step surfaces
  on the truck at (-795, -987) drop to the ground; the walled lot in
  the south-west corner (22 areas), which nothing reaches and nothing
  in it can leave, is removed.
- Re-analyzed in game after the edits.
Renumbers area ids only, so an id-keyed diff against master reads
sensibly: 1438 of the 1555 areas carry the id of the master area they
match, and kept ids more than 64 u from their master location drop
from 57 to 14. Master has no nav ladders; the nine ladders keep their
ids (3, 4, 5, 8, 9, 10, 11, 12, 13). Geometry, connections, attributes
and the analysis data are unchanged (verified topology-identical).
The north and south buildings have the same 389 u ladders as the west
building, at (311, 1396) and (310, -1884), up to roofs about 720 x
435 u that no area covered. Both roofs are now meshed by hand: the
walkway inside the parapet, the roof round its solid housing, and the
raised platform round its two AC units, 4 u off walls and props, with
corner heights from the measured floor.

Ladders 14 and 15 connect them, climb only like ladders 10 and 13:
their tops stand on the 38 u parapet above the walkway. Each roof has
two ways down like the west roof's: 8 u strips on the parapet top, a
37 u climb from the walkway, that drop to open ground (about 13
damage).

Every existing area keeps its id; the 36 new areas take ids above the
previous highest. The fifth such ladder, at (2000, 1100), stands
behind a playerclip wall and is left out. Re-analyzed in game.
An outside review of this mesh found the landing at (-170, 130, -60)
(674 / 3904) to be a dead end: its only way out was a 173 u climb no
class makes. The landing is the top of a stairs_top prop whose flight
down its south side was never meshed, on master either. The review
also found climbs kept after their drop back was cut, and walk links
that run one way only.

- Mesh the flight: one sloped area (6822) from the landing's edge
  (3904) to the area at its foot (3899), in their column, clear of
  the east rail. The engine marks it STAIRS.
- Delete 4414 beside the foot of the flight: the rail stands on it
  (no hull fits on any of its sample points, and every link out of
  it is blocked), and with the flight open bots routed through it
  onto the rail.
- Remove the climbs no class plans: 674 -> 6438 (173 u) and the four
  kept climbs 63 -> 5661, 301 -> 6433, 871 -> 6443 and 5640 -> 6158
  (101-178 u). The areas they led to have other ways in or stay as
  drop-only pockets.
- 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 flatbed trailer, a container); restore the missing
  direction of the two pairs clear both ways.

Every other area keeps its id; the new one is numbered above the
highest. Re-analyzed in game (same graph, fresh visibility).
The engine's hull audit (a player hull stood on every area and swept
across every link, in the server) of the previous revision, and
navconnect's link check against master:

- Restore the drop back of three climbs of 34-39 u whose drop had
  been cut: the climb reads clear on most or all lanes.
- Delete 41 areas no player hull stands in (80-100 % of stand
  samples blocked) or reached only through one: the 20 x 20 and
  10 x 10 u squares inside the barrier round-bars, stair props,
  trailers, the forklift and the powersuit racks, and 2053 at the
  kitchen shelf near (-740, 2470), where bots that walked in stuck.
  Several had stuck events from bots heading into them.
- Delete four parapet strips of the two new roofs that carry no
  link anything else needs: 11 u wide against the parapet, no stand
  sample clear, never visited.

Kept: the parapet strips that are ladder 14's and 15's tops, and
links the audit reads blocked that bots cross (the metal ladder prop
near (-290, -2860), the powersuit rack, the snowrex, displacement
slopes and the new stairs).

Existing areas keep their ids. Re-analyzed in game (same graph,
fresh visibility).
Ladders 3, 8, 10, 13, 14 and 15 were climb only: their tops stand on
the roofs' 38 u parapets (10, 13, 14, 15) or behind the catwalk's
handrail (3, 8), and bots could not get onto them going down.
NeotokyoRebuild/neo#2176 now mounts such descents over the top edge,
so each ladder's top area lists it going down again.

Ladder 14's and 15's tops move from the 11 u walkway strips against
the north and south parapets, where no player hull fits, to the roof
floor in front of each ladder. The strips are removed, and the
parapet-top exits beside those ladders, reached only from the strips,
are linked from the ramp next to them (a 43.5 u climb with a drop
back). Re-analyzed in game.
The north and south roofs have a 16 u ledge along the inner face of
their parapet. A player within 16 u of the ledge rests on it, but no
player can stand on the ledge itself: their box would be inside the
parapet.

The strips 6788 and 6806, the only way to the vent-top exits on the
west parapets, lay on the ledge itself. Bots heading for them pressed
the parapet and stuck, and the engine's hull test found no room to
stand anywhere on them. They move 16 u inward, onto the band in front
of the ledge where a player stands on it, and the walkway beside them
gives up that band. Their links are unchanged.

The climb from the ramps to the parapet-top exits beside ladders 14
and 15 read 43.5 u, from the height of the gutter in front of the
ledge, over the 43 u a Support bot plans. A bot at that edge stands
on the ledge, so the ramps' edge now carries the ledge's height and
the climb reads 39.5 u.

No area added or deleted, ids unchanged. Re-analyzed in game (same
graph, fresh visibility).
Six stairs_top prop staircases had their landings meshed but not their
flights, so each landing was an island: a bot that walked up the steps,
chasing or cutting a corner, found no path off it, and the landing at
(730, -1110) had no link out at all. Each flight now gets one sloped
area in the middle of its treads, linked both ways to the landing and
to the floor at its foot, as the staircase at (-179, 147) got in an
earlier commit. Two drops nav_generate recorded across the unmeshed
flights (447 -> 302, 693 -> 5625) are replaced by those flights.

Bots duck once their center is on a CROUCH area. Under the landings
every class but sometimes Recon has to duck, and at most of the mouths
the landing's edge lay 1-28 u past the portal, so a standing bot hit
it first. A strip of the area in front of 15 mouths is split off and
marked CROUCH, so the crouch zone starts 40 u before the edge.

Every existing area keeps its id; 26 new areas take ids 6823-6848.
Re-analyzed in game (same graph, fresh visibility).
@sunzenshen
sunzenshen marked this pull request as ready for review October 13, 2026 01:17
@sunzenshen
sunzenshen requested a review from sunmachine October 13, 2026 01:19
@sunzenshen
sunzenshen marked this pull request as draft October 13, 2026 01:19
@sunzenshen
sunzenshen marked this pull request as ready for review October 14, 2026 04:19
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.

1 participant