Skip to content

ntre_apparatus_dm: first navmesh - #157

Merged
sunzenshen merged 15 commits into
NeotokyoRebuild:masterfrom
sunzenshen:navmesh-apparatus-release
Oct 14, 2026
Merged

sunzenshen merged 15 commits into
NeotokyoRebuild:masterfrom
sunzenshen:navmesh-apparatus-release

Conversation

@sunzenshen

@sunzenshen sunzenshen commented Oct 4, 2026 •

Copy link
Copy Markdown
Contributor

ntre_apparatus_dm: first navmesh

One file, neo/maps/nav/ntre_apparatus_dm.nav. This is the map's first navmesh: master has the map but no .nav, so bots cannot play it today. The NAV_MESH_PRECISE + NAV_MESH_CLIFF marks use the movement rules of NeotokyoRebuild/neo#2168 and #2175, and the two NAV_MESH_AVOID marks those of NeotokyoRebuild/neo#2170 (all merged).

Dependencies and status

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

  • Bots jump a gap link down instead of dropping into it neo#2198 ("Jump a gap link down instead of dropping into it", draft), for the four spawn halls' exits (see "The gap jumps"). Without it bots step off those exits into a slot that leads down into the kill volume: 29.6 fall deaths a match on master, 4.7 with it (see "Results").

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

  • More tweaks to bot ladder approaches, climbs and dismounts neo#2176 ("Fix bot ladder approaches, climbs and dismounts"). In a ladder rig, ladder 22 up: 0 of 17 climbs complete without it, 18 of 18 with it; over the map's ladders, 72 % of climbs up complete without it, 97 % with it. Ordinary DM matches rarely meet the ladder 22 wedge.
  • Refuse a path whose last leg climbs past a jump neo#2212 ("Refuse a path whose last leg climbs past a jump", draft), for the cover spot under the ramp near (720, 137, 584) (see "Known, not changed"): fell-off-path failures there 14.0 -> 0.3 a match, fall deaths x1.26 [0.97, 1.59], mostly at the gap edges already marked (24 pairs on master + #2198 + #2176, on an earlier revision of this mesh).
  • Re-path a bot that stands above its path neo#2214 ("Re-path a bot that stands above its path", draft), for the blast door's top near (-6616, 0, 805) (see "Known, not changed"): stuck episodes there 1.71 -> 0.62 a match at 12 bots and 0.67 -> 0.25 at 30 (24 pairs each, on this mesh, with #2198, #2176 and #2212), stuck episodes, fall deaths and kills flat elsewhere.

Pending before review:

  • A Windows run by the author before review (built and tested on Linux so far).

At a glance

master this PR
nav areas none 2417
file size none 2,650,220 bytes
nav ladders none 32 (31 connected both ways; see "Known, not changed")
areas the engine blocks at every round start - 0
areas no spawn can reach - 89 (see below)
areas marked PRECISE + CLIFF (fall edges) - 48, and 2 PRECISE only
fall deaths a match (30 bots, 5-minute deathmatch) - 4.7 with NeotokyoRebuild/neo#2198, 29.6 without

What the mesh is

Generated with nav_generate, then edited by hand against measurements from bot matches. The map is a set of halls, catwalks and walkways over a kill volume (trigger_hurt below z 192), so most of the work was keeping paths off edges a player cannot survive and making sure every class can leave every spawn.

  • Ladders: 32 nav ladders on the map's ladder brushes. Decorative ladder brushes (fences, kickplates) carry none. Neither does the brush near (-6352, -580): it is on the south face of a solid wall, with its foot on a copier on the wall's north side and its top on a crate 50 u east on the south side, so no player can mount it. The crate top keeps its two areas and is left by a drop. The free-standing ladder near (-3408, -232) carries one nav ladder, on its north face: its south face runs under a floor slab that stops climbers 56 u short of the top.
  • Handrails, props and grates: walk links that cross a handrail, prop or grate no player can pass are cut, and areas inside props are removed. Drops whose drop point lands on solid grate (no clear column for a hull) are cut too.
  • Fall edges: 48 areas are PRECISE + CLIFF: the edges bots fell to their deaths from, mostly 32 u strips split off the fatal side of bigger areas so the big through-areas keep their normal movement, and the two plank bridges below.
  • Every class can leave every spawn, and every DM spawn can reach every other, for every class.
  • No traps: every pocket a class could enter and not leave was either connected or given no link in. Connected: the trench south of the middle block (two plank bridges over the slot, near (-3850, -970) and (-3630, -970)), a room behind a vehicle-barrier post near (-2985, -440), and a room behind another post near (-3090, -440). Given no link in: rooms behind handrails and partitions with no exit a player hull fits through, and the tops of handrail bars and wall partitions. The room under the platform near (50, -40) keeps a climb out over two pipe elbows for a bot that falls in, but no route leads into it: Assault and Support bots fail that climb.
  • Analyzed in game after the last edit, so hiding spots and visibility lists are current.

The gap jumps

The halls at (-6688, 1376), (576, -1376), (-192, -1248) and the pocket at (-3152, -1568) end in a ledge at z 544-548. 46-50 u below and about 50 u out are walkways and bridge tops at z 500; between them a slot leads down into the kill volume. Every class leaves these halls by running and jumping across, and for an Assault or a Support it is the only way out. The mesh links each ledge to its landing one way (nine links).

Stock NextBot plans a link to a lower area as a drop: the bot walks to the ledge, takes the first point past it where a hull clears the drop, and steers at that point while it falls. Here that point is over the slot, so the bot falls into it. NeotokyoRebuild/neo#2198 plans a link down across a gap as a run-up and a jump for the landing. Cutting the links instead would trap Assault and Support bots at 4 of the 33 spawns: their other way out, a 64-104 u climb onto a thin partition, is Recon-only and bots fail it.

Edits at the stuck spots (the thirteen commits after the first two)

Each spot was found in 30-bot matches. Commits 5 and 6 were measured in ladder tests; commits 1-4, 7 and 8 in 24 paired matches against the mesh without the edit, on master + #2198 + #2176 (conditions as in "Results"). Commits 9-13 were measured on master + #2198 + #2176 + #2212, in a test that spawns bots at the spot with the objective at its other end where one applies, and in 8-32 paired matches. "Episodes" are one bot's stuck, fell-off-path and no-path events at the spot less than 2 s apart.

  1. Cut the 340 u drop 8152 -> 205 near (330, 40, 620). Bots on the ledge below (8519 / 8521) took the one-way drop and wedged at its take-off. Spot episodes 1.54 -> 0.29 a match.
  2. Cut four drops off the geodome's grate ring near (-6365, -121, 824). NextBot's drop point lands on the solid grate (a hull column on 0-6 of 11-31 crossings), so the bot walks to the grate edge and stands there. Spot episodes 1.08 -> 0.96 a match: neutral. Drops with a clear column stay.
  3. Fit the catwalk mouth to the blast door's jamb near (-6400, -420, 824). Bots heading north onto the catwalk stood in the pocket west of the jamb, the same every time: the path hugged the catwalk's west edge and the hull hit the jamb. Two stub areas in the pocket are removed and the mouth narrowed to the 16 u the door props leave, both pieces PRECISE so the bot walks that line. Pocket episodes 0.38 -> 0.04 a match; the mouth's areas 0.33 -> 0.17.
  4. Mark the fall edges beside the gap landings PRECISE + CLIFF: six areas, three near (-6520, 900, 500) and three in the middle of the map, one split off a bigger area. Deaths from these edges 21 -> 21 in 24 matches: no measured effect. Kept for the marks' standing behavior (no dodge, side-step or superjump off a fatal edge).
  5. Mark the catwalk edges over the pits PRECISE + CLIFF: eight areas on the z 500 catwalks, between x -5780 and 920. In a ladder rig, bots died in the pit within 3.5 s of leaving a catwalk ladder; the marked edges are those with 3 or more such deaths in 2 or more runs. Deaths from them 0.22 -> 0.10 a run (12 and 12, in 54 and 120 runs), kills flat.
  6. Give ladder 1 its pillar top near (590, -575, 1024). The 944 u shaft's top pointed at no floor. The 64 u pillar top is now two areas; its only way off is the ladder down, and climbs down complete (4 of 4). In a forced test (6 bots, 3 spawned at the ladder's foot with the objective pinned on the top and a test-only patch so deathmatch bots seek it, a tenth of weapon damage, 6 runs), 24 of 27 climbs reach the top and 16 stand on it for 1 s or more; Support bots tend to fall off (see "Known, not changed").
  7. Mesh the geodome rim near (-6365, -121, 824). Bots stood on the unmeshed grate band between the ring areas and the dome, resolved to the floor 112 u below and pushed into the dome. Seven rim strips are added, and five more drops whose drop point lies on the grate are cut; the floor is reached by the clear drops nearby. This does not fix the spot. With the strips, no bot at the rim resolves to the floor below any more (16 rows to 0 in 24 matches), but Attack bots whose goal is the floor under the dome now stand on the new strips instead: spot episodes 0.88 -> 1.00 a match with the first eight commits (see "Known, not changed").
  8. Cut the 1772 <-> 7610 pinch near (-6500, 884, 500). Commit 4's split left the two areas touching over 8 u at a wall corner, a portal no hull fits. Both already link through the 32 u piece beside it. Fell-off-path events there 0.21 -> 0.08 a match, episodes 0.46 -> 0.29.
  9. Drop ladder 13 near (-3408, -232). The free-standing ladder there carried a nav ladder on each face. Ladder 13, on the south face, runs under a floor slab whose underside stops climbers 56 u short of the top; no bot reached the top from that face. Ladder 14, on the north face, is the climb and stays: planned climbs reach the top (4 of 4 before, 4 of 5 after). Most falls there were bots walking past the ladder in a fight, caught by it with no climb planned (8 of 9). 16 pairs: contacts with the ladder 68 -> 34, falls off it 31 -> 19.
  10. Crouch at the duct mouths near (740, 640, 592). The duct is low only under a prop, but its CROUCH area starts 16 u before the prop on each side, so a bot standing at the area's edge already touches the prop. Bots crouch only on a CROUCH area, so they pushed the prop standing up. A 32 u CROUCH strip is split off the area at each mouth. Duct test: stuck events in the duct 136 -> 6, crossings north to south 18 -> 44; 8 pairs: stuck events in the duct 13 -> 0.
  11. Enter the stairs 585 from the top near (-5690, -40, 900). The landing linked to the stairs along their west edge, beside the handrail; a bot crossing there kept its hull on a 5 u floor lip behind the rail, walked out along it and stood at (-5725, 56, 944) with its path computed from the floor 120 u below. That link and a drop off the handrail top onto the same edge are cut; the landing reaches the stairs through the middle of their top edge. Stairs test: lip entries 12 -> 5; 8 pairs: episodes at the stairs 0.88 -> 0 a match, lip entries 17 -> 2, descents 67 -> 97.
  12. Split the curb box at its rail near (-90, -450, 604). Area 6591 is the top of a 28 u prop box with a 17 u rail across it. Bots that stepped onto the box's west end stood behind the rail for 3-5 s with a path east along the box, then jumped the rail. The west end is now its own area, left only by drops off the box's sides. 32 pairs: episodes at the box 0.47 -> 0.34 a match, on its west end 9 -> 4 in 32 matches.
  13. Widen the ramp 7684 / 7687 to its east wall near (709, -49, 623). Bots chasing a player on the ramp aim at where they predict the player will be, which often lands between the ramp areas' east edge and the wall; no area is found there and the chase reports no path. The two areas now run to 4 u short of the wall. 32 pairs: chase targets on the ramp that find no path 0.97 -> 0.31 a match.

Every commit passes the offline checks below: no new trap, no route longer by more than 10 %, no area blocked.

How to test

  1. Copy neo/maps/nav/ntre_apparatus_dm.nav into the game's maps/nav/ folder, on a build with Bots jump a gap link down instead of dropping into it neo#2198.
  2. map ntre_apparatus_dm, then neo_bot_quota 30, and join spectator. Deathmatch, one 5-minute round.
  3. Watch:
    • the spawn halls' exits near (-410, -960) and (-6520, 960): bots run at the ledge and jump the slot
    • the catwalk mouth at the blast door near (-6400, -420, 824): bots pass without standing at the jamb
    • the ledge near (330, 40, 620): no bot waits at its edge
    • the duct near (740, 640, 592): bots crouch at its mouth and pass through
    • the stairs near (-5690, -40, 900): bots coming from the landing walk down the middle of the stairs, not along the handrail

Results

Every match below: Release builds on Linux, deathmatch, 1 round of 5 minutes, 30 bots unless named, default weapon damage (1.485), 15 s pre-round freeze, 8 matches at a time, test-only logging (kills, stuck events, match end) in every arm. Every match reached match end with 0 asserts and a clean exit. "Stuck" is OnStuck plus FAIL_STUCK move failures, without the round-start spawn crowd, weapon scavenging and dead bots. Fall deaths are deaths to trigger_hurt or the world. Intervals are 95 % bootstrap intervals of the paired ratio.

master and NeotokyoRebuild/neo#2198 on this mesh (before the spot commits), 24 pairs:

a match master master + #2198 paired
fall deaths 29.6 4.7 x0.16 [0.13, 0.20], 24 of 24 pairs down
FAIL_FELL_OFF move failures 32.9 15.9 x0.44 [0.34, 0.56]
stuck events 34.5 33.1 x0.97 [0.78, 1.22]
FAIL_NO_PATH move failures 26.1 26.9 x1.02 [0.90, 1.16]
player kills (fall deaths excluded) 239.5 244.7 x1.02 [1.01, 1.04]

At 12 bots (8 pairs): fall deaths 11.5 -> 3.1 a match (x0.27 [0.16, 0.42], 8 of 8 pairs down), stuck episodes 10.5 -> 8.8 (x0.83 [0.62, 1.13]), player kills (fall deaths excluded) 61.6 -> 65.3; FAIL_NO_PATH 3.5 -> 6.4 (x1.82 [1.00, 3.61]), counts too small at this size to tell from noise (flat at 30 bots).

This PR against the mesh before the spot commits, both on master + #2198 + #2176 + #2212, 24 pairs:

a match before this PR paired
stuck episodes 11.1 9.0 x0.81 [0.71, 0.93], 17 of 24 pairs down
stuck events 32.2 28.4 x0.88 [0.73, 1.07]
fall deaths 4.8 3.8 x0.85 [0.66, 1.11]
FAIL_FELL_OFF move failures 8.3 7.5 x0.91 [0.72, 1.16]
FAIL_NO_PATH move failures 27.5 25.0 x0.91 [0.79, 1.06]
player kills (fall deaths excluded) 245.6 246.9 x1.01 [0.99, 1.02]

At 12 bots (8 pairs): stuck episodes x0.69 [0.48, 0.98], stuck events x0.64 [0.44, 0.92], fall deaths x0.73 [0.46, 1.15], FAIL_FELL_OFF x0.63 [0.37, 1.07], player kills x0.98 [0.93, 1.04]; FAIL_NO_PATH 2.9 -> 5.0 a match (x1.62 [0.99, 2.81]), small counts, not told from noise.

Per spot, episodes a match at 30 bots, before / this PR: the ledge at 8519 / 8521 (commit 1) 3.00 / 0.33; the catwalk-mouth pocket (commit 3) 0.46 / 0.29; the duct (commit 10) 0.96 / 0.25; the stairs (commit 11) 1.46 / 0.54; the curb box (commit 12) 0.75 / 0.67; the ramp 7684 (commit 13) 0.88 / 0.75; the geodome rim (commits 2, 7) 0.92 / 1.00, not fixed; the blast door's top 8604 1.75 / 1.46 (3.75 / 1.88 at 12 bots); ladder 20's top 0.79 / 0.79; the landing strip 3404 1.54 / 1.46; the ramp cover 2067 0.92 / 1.75 and the floor above it 1.17 / 1.79 (see "Known, not changed"). No new cluster of 1.0 episodes a match or more at 30 bots; at 12 bots two of 0.88 (7 episodes each in 8 matches), not seen at that rate at 30 bots.

Ladders in the same matches (ladder 1 left out; flagged when under 90 % of mounts complete or over 0.2 falls a match): no ladder is newly flagged on this PR at a large count. Ladder 20 up counts 0.67 -> 1.17 falls a match, and ladder 32 down completes 21-40 % of mounts in both arms (both under "Known, not changed").

Ladders, in a rig (12 bots spawned at a ladder's foot or top with a pinned objective at the other end, 1 round of 2 minutes, a tenth of weapon damage, 2 s freeze, 16 at a time, 3 runs a ladder and direction; 384 runs), master + #2198, without and with NeotokyoRebuild/neo#2176: climbs up completed 216 of 302 (72 %) and 336 of 346 (97 %); ladders with a completed climb up 30 and 32 of 32. Bots took ladders down in few runs on either build (8 and 40 mounts in 96 runs): they mostly take another route.

Offline checks of the final mesh:

  • every DM spawn reaches every other for every class (Recon, Assault and Support at the heights bots plan to climb: 68, 48 and 43 u); the rooftop spawn near (0, -384, 936) is left by a drop, so no route leads back to it
  • no pocket any class can enter and not leave, no dead end, no one-way link between areas at the same height, and no climb without its drop back except the two deliberate climbs out of the room under the platform near (50, -40)
  • 89 areas no spawn can reach, in 13 pockets: a deck near (-6070, 360, 824) (22 areas) and the platform near (-60, 10, 672) with the room under it (21) are reached only by climbs of 80-96 u that no class makes, the crate top near (-6250, -610) (2) has no way up, the curb box's west end near (-120, -450, 604) (1) is reached only by stepping up from the floor beside it, and the rest are small ledges and shelves with no way up. They are kept for a bot that gets there by falling or a jump, and all lead back into the mesh
  • no area blocked at round start, offline and in the engine
  • engine hull audit (a player hull swept across every link and stood on every area, in the server): 9 pairs of areas at the same height read blocked both ways and 4 links lead into areas too cramped to stand in, the same as before the spot commits. All are kept because bots cross them: a link walker (a bot of each class placed at one end and sent across, five times) crossed 7 of the 9 pairs both ways with every class, 5425 -> 53 near (-3300, 470) with every class (the planner does not take the other direction), and 939 -> 7882 near (-5330, -240), under a ceiling beam, with Recon only; every class walks through the cramped areas near (-3095, -460) and (-3160, -190).
  • the link walker walked every link of the mesh before the spot commits with each class; links that every class failed (drops with no clear column, drops onto ledges they overshoot) are cut

Known, not changed

  • The geodome rim near (-6365, -121, 824): Attack bots whose goal is the floor under the dome stand at the rim, now on the strips of commit 7: 0.92 -> 1.00 episodes a match. That goal is the cause left, and no mesh edit tried removes it; the next lever is in bot code, where the Attack behavior picks its goal.
  • The blast door's top (8604, AVOID) near (-6616, 0, 805): bots that roam toward the door slot below walk off the grate onto the door frame's top and wait there, 1.46 episodes a match at 30 bots and 1.88 at 12. Removing its nav area did not keep them off it and raised falls (see "Considered, not included"), so the area stays. The bots carry a complete path through the doorway below and walk its line across the grate above it, onto the frame: Re-path a bot that stands above its path neo#2214 re-paths a bot that stands above its path (1.71 -> 0.62 episodes a match at 12 bots, 0.67 -> 0.25 at 30, see "Dependencies and status").
  • Ladder 20's top near (-5952, 676, 704): the ladder rises through a hole in the floor. Bots going down it from the strip beside the hole walk toward a point behind the ladder and can wedge against it for a few seconds, 0.79 episodes a match. Climbs up reach the top (of 51 that the census's ladder reader counted as falls, 50 reached the top and landed beside the ladder), but some bots then go straight back down, which the reader counts as the falls in "Results". The fix belongs in where a path's ladder-down point is placed and in the bot's next path after a climb.
  • Ladder 14 near (-3408, -232), the north face of the free-standing ladder: bots that walk past it in a fight are caught by the ladder with no climb planned, drift off it and drop about 100 u (no damage). A bot-code item: release a bot from a ladder it did not plan to climb.
  • Ladder 32 down near (-6518, 864): most bots that mount it at the top turn back, the same on the mesh before the spot commits (21-40 % of mounts complete).
  • The ramp cover and the floor above it near (720, 137, 584) (2067) and (613, 140, 780) (207 / 450): 0.92 -> 1.75 and 1.17 -> 1.79 episodes a match (the two boxes overlap). About half the events are Attack bots chasing a player whose predicted position lies off the mesh, into a wall or under the floor: the chase reports no path and tries again, a short event, not a bot standing still; commit 13 cuts the ramp's share. A 16-pair rerun did not repeat the rise (floor box 1.69 -> 1.50, ramp cover 1.62 -> 1.38 episodes a match); pooled over 40 pairs both intervals include no change, and the stuck bots on the floor above stand at x 658-667 in area 450 heading for the ramp, 80 u from the edit, on both meshes. Bots retreating to cover on the ramp 170 u overhead used to stand under it failing to move; with Refuse a path whose last leg climbs past a jump neo#2212 in both arms that is 9 fell-off-path events there in 24 matches. The rest belongs in the chase code (snap the predicted position to the nearest area).
  • The 64 u lip near (-2224, -914): a Recon bot is occasionally stuck at it for 11-12 s (2 episodes in 8 matches in one census, none in 24 in another).
  • Falls at the gap edges already marked (3404, 8340, 8352): 0.7 a match together, measured with the first eight commits.
  • Ladders 42 and 44 down: no bot mounted them in 6 rig runs; bots route another way. Ladder 4 near (216, -736) is climb-only: its top ends short of the landing.
  • Ladder 1's top: Support bots tend to overshoot the pillar's east edge in the dismount's jump and fall (9 of 12 in the forced test), and bots climb it about once in 16 matches; the connection is kept, and the top is left as is.

Considered, not included

  • Narrow the slot behind the blast door (3586 / 7716), the 12-bot roam goal: door-top episodes 0.58 -> 0.92 a match at 30 bots, with 0.46 between two arms on the same mesh; 2.50 -> 2.50 at 12 bots. No measured benefit, so dropped.
  • Delete the blast door's top (8604): bots still walk onto the frame and fall off its ends. 8 pairs each: episodes there 1.38 -> 2.38 a match at 30 bots (fall deaths x1.29 [1.05, 1.63] map-wide), 2.50 -> 1.75 at 12 bots.
  • Start ladder 20's descent only from the floor in front of the hole: the wedge went (6 -> 0 in a ladder test) and the spot fell 1.29 -> 1.00 episodes a match, but stuck episodes rose map-wide, x1.29 [1.07, 1.56] over 24 pairs, for no cause found.
  • Delete the curb box's top (6591): bots stood behind the rail on the box next to it instead, with the same path (16 pairs).
  • Mark the stairs 585 STAIRS: the engine recomputes that mark when it loads the mesh and does not set it on 585, so it had no effect.
  • Mark ladder 1's top PRECISE + CLIFF: in the forced test (4 runs each), bots of every class then fell straight off the top while still climbing, 75 of 94 climbs within 2 s, against 9 of 20 without the marks.
  • Stretch the ladder 1 top north to the full width a hull fits: the dismount aims at the top's nearest point, which would move 12 u toward the overshoot side.
  • Cut the gap links: traps Assault and Support bots at 4 spawns (see "The gap jumps").
Earlier measurements (the mesh before the spot commits against the research mesh it was edited from)

These ran on a Debug research build (upstream master with the open bot PRs merged, NeotokyoRebuild/neo#2198 among them), on the mesh before the spot commits against the research mesh it was edited from (same spawn-hall gap links, without the trap, climb and drop edits), 48 pairs. Stuck events 30.9 -> 28.5 a match (x0.89 [0.73, 1.09]), FAIL_NO_PATH_EXISTS 13.0 -> 8.5 (x0.77 [0.62, 0.95]), fall deaths 5.1 -> 5.1, kills 253 -> 250. The unmountable ladder near (-6352, -580), with the objective pinned on the crate top: 123-151 ladder approach timeouts and 386-486 stuck events within 300 u a match with that ladder, 0-1 and 0 without it.

Master has the map but no .nav, so bots cannot play it. This mesh was
generated with nav_generate and edited by hand against bot matches:
34 nav ladders on the map's ladder brushes; links across handrails,
props and grates cut; fall edges over the kill volume marked
PRECISE + CLIFF; every spawn reaches every other for every class; no
pocket a class can enter and not leave.

The four spawn halls' exits are gap jumps down across a slot that
falls into the kill volume. They need the companion neo change that
plans a link down across a gap as a jump: planned as drops, bots
step off into the slot.
Ladder 25's brush is on the south face of a solid wall. The mesh put
its bottom on a copier top on the wall's north side and its top on a
crate top 50 u east on the south side, so no bot can mount it from the
bottom: Jinrai sent to the crate top press into the wall (about 140
ladder approach timeouts and 440 OnStuck a match). The crate top stays
reachable only by dropping from it, as before.

nav_analyze FRESH; same graph apart from the ladder.
Bots on 8519 / 8521 took the one-way drop 8152 -> 205 and wedged at
its take-off (step 3 census O: 8519 stuck 40 + FELL_OFF 13 events in
24 matches). Cut the drop; the walk routes stay.

Spot 2 episodes a match 1.54 -> 0.29 (census v, 24 pairs, 30 bots).
Gates: navconnect, nav_objectives, recheck, blockcheck clean.

nav_analyze FRESH; same graph.
Four drops off the geodome grate ring (1073 -> 7442, 1074 -> 8494,
1076 -> 1720, 1076 -> 7470) place their drop point over the 4 u solid
grate: NextBot's drop placement finds a clear 32 u column on fewer than
half the crossings (0-6 of 11-31, only at the 50-60 u push before the
70 u fallback), so the bot walks to the grate edge and stands there.
Drops with a column (1077 -> 7450, 1505 -> 7470, 2164 -> 7496) stay.

Spot 5 episodes a match 1.08 -> 0.96 (census v): neutral on its own;
the series does not fix the spot.
Gates clean; no route longer by more than 10 %.

nav_analyze FRESH; same graph.
Bots heading north onto the catwalk stood in the pocket west of the
blast door's jamb (x -6466..-6475, y -416, blocker world, 4.5-5.5 s,
then a stuck jump), the same every time: the path crossings hug the
catwalk's west edge, and the 32 u hull hits the jamb. The door props
leave standing room only for centers x -6408..-6392.

Delete the stubs 2158 / 2187 (the same pocket), narrow 2177 to
x -6408..-6392 and split 7650's door piece (8642) to that width, both
PRECISE so the follower walks the 16 u portal instead of skipping it.

Pocket episodes a match 0.38 -> 0.04, areas 213 / 461 / 2177 / 8642
0.33 -> 0.17 (census w, 24 pairs, 30 bots); no stuck on 2177 / 8642.
Gates clean.

nav_analyze FRESH; same graph.
Bots fell from gap take-off edges that 3404 / 8340 / 8352 do not
already mark. Split 7610's south 32 u off as 8631 (the 7393 gap link
lands on it; ladder 32 stays on the north piece) and mark 8631, 1772,
4047, 1956, 1958 and 1960 PRECISE + CLIFF, so bots do not dodge,
side-step or superjump off them.

World deaths from the marked edges: 21 -> 21 a 24-match census (N vs
F, same mesh without the marks): flat; kills on the strips flat. Kept
for the marks' standing behavior; the 1772 pinch this split left is
cut later in this series. Gates clean.

nav_analyze FRESH; same graph.
Ladder rig bots died in the pit within 3.5 s of leaving a catwalk
ladder, off edges open onto the slope. Mark the edges with 3 or more
deaths in 2 or more runs PRECISE + CLIFF: 4844, 8302, 8338, 4967,
8232, 2002, 2104 whole, and a 32 u strip split off 7582's east side
(8632).

Pit deaths per run x0.45 (ladder rig, 120 runs: take-off on a marked
catwalk edge 0.22 -> 0.10 a run); kills flat. Gates clean.

nav_analyze FRESH; same graph.
Ladder 1's top pointed at z 1536 with no top area; the only floor a
climber reaches is the 64 x 64 pillar top at z 1024.5. Lower the top
to 1024.5 and add the top as two areas: 8633 (x 600..624, clear of the
ladder plate, the ladder's forward area) and 8634 (x 560..600, stopping
a hull short of the plate, north edge y -602 where a hull stands beside
the plate). No drop link; the only exit is the ladder down, so the top
is a ladder dead end, not a trap.

Down 4 of 4 complete; up (6 forced runs, series head) 24 of 27 climbs
reach the top, 16 stand on it for 1 s or more (recon 7 of 9, assault 6
of 6, support 3 of 12), 11 fall within 2 s (recon 2, assault 0, support
9). Support loses the perch in the dismount jump (east past the
pillar), which no mesh change reaches; assault walks off after about
3 s. No marks on 8633 / 8634 (series vs the base: CLIFF +14, PRECISE
+16). Gates clean.

nav_analyze FRESH; same graph.
Bots stood on the unmeshed grate band between the ring areas (y -140)
and the geodome (y -121), resolved to the z 712 floor below and pushed
into the dome. Add rim strips 8635-8641 at z 824 (walk links only).

With the strips, the bots still wedge there: their path to the floor
(3565 / 3566 / 1190 under the dome) took drops whose crossing lies on
the grate (2185 -> 7508, 2174 -> 8494, 2184 -> 3578, 833 -> 7439,
2167 -> 1716: 0-6 of 11-21 crossings with a hull column, or only at
the 60 u push), so the follower sent them on into the dome. Cut those
five; the floor is reached by the clear drops 1077 -> 7450 and
2161 -> 879.

Strips alone: rim rows resolving to the z 712 floor 16 -> 0, spot 5
episodes 1.04 -> 0.92 a match (census w). With all eight commits
(24 pairs) spot 5 reads 0.88 -> 1.00 a match: Attack bots with goals
under the dome now stand on the strips. The spot is not fixed.
Gates clean; no route longer by more than 10 %.

nav_analyze FRESH; same graph.
The 7610 split left 1772 touching 7610 over 8 u at a wall corner, a
portal no hull fits (hull audit cut row). 1772 already links 8631 over
32 u and 8631 links 7610, so cut the pinch; no route longer by 10 %.

Hull audit cut rows 10 -> 9; FELL_OFF in the box 0.21 -> 0.08 a match
(census w). Gates clean.

nav_analyze FRESH; same graph.
The free-standing ladder at (-3408, -232) carries two records. Ladder
14 faces north over area 21 and is the climb. Ladder 13 faces south
over 5374, under the z 736 floor, whose underside is at z 722 there:
a climber on that face stops at feet z 669-680, 56 u short of the top
(rig, 0.1 s tracks). Drop ladder 13; routes from the south walk round
to 21 and take ladder 14.

Most falls at this ladder in normal play are bots in a fight walking
past it, caught by the brush with no climb planned (8 of 9 in 8
matches with nb_debug). With the record gone, 16 pairs: contacts with
the ladder 68 -> 34, falls off it 31 -> 19, accidental lifts to the
top 10 -> 2. Planned climbs of ladder 14 reach the top as before (rig
4 of 4 -> 4 of 5). Census otherwise flat (stuck x1.08 [0.83, 1.41]).
Gates clean; no route longer by more than 10 %.

nav_analyze FRESH; same graph.
The duct 1033 -> 1032 -> 1031 is low only under a prop at y 616-664
(underside z 649-666 over the z 592 floor), but CROUCH 1032 runs
y 600-680, so a bot standing on 1032's edge already touches the prop
with its half-width. Bots crouch only on a CROUCH area, so they never
enter 1032 and push the prop standing at y 680 and y 600.

Split a 32 u strip off each neighbor at the mouths (1033 y 680-712,
1031 y 568-600) and mark it CROUCH; the bot ducks before its hull
reaches the prop.

Duct rig (16 bots, 3 runs each way): OnStuck in the duct 136 -> 6,
crossings north to south 18 -> 44. Census 8 pairs: duct OnStuck
13 -> 0, other spots flat (stuck x1.15 [0.85, 1.61]). Gates clean; no
route longer by more than 10 %; hull audit unchanged.

nav_analyze FRESH; same graph.
The landing 7783 reached the stairs 585 through 585's west edge, along
the stairwell handrail. A bot crossing there kept its hull on the 5 u
floor lip behind the rail (z 944) instead of stepping down the
stairs, walked out along the lip and wedged above 2251 at
(-5725, 56), its path computed from the floor 120 u below.

Cut 7783 <-> 585; the landing reaches the stairs through 2464 ->
2465 -> 585, the middle of their top edge. Also cut 2456 <-> 585, the
handrail-top drop onto the same edge (0 of 5 hull lanes clear).

Stairs rig (16 bots, 3 runs each way): lip entries 12 -> 5, descents
47 -> 47. Census 8 pairs: episodes in the stairs box 0.88 -> 0 a
match, lip entries 17 -> 2, descents 67 -> 97; other spots flat
(stuck x0.88 [0.65, 1.20]). Gates clean; no route longer by more
than 10 %; hull audit unchanged.

nav_analyze FRESH; same graph.
6591 is the top of a 28 u prop box with a 17 u rail across it at
x -110. Bots stepped onto the box's west end by the prop steps along
the floor beside it stood behind the rail for 3-5 s with a path east
along 6591 to the 360 drop, then jumped it. Deleting 6591 left them
there with the same path from the next box (16 pairs).

Split 6591 at the rail. The west piece (8645, widened to the box edge)
is cut from the east piece and keeps only its drops to 8400 / 8406,
so a bot on the west end paths off the box's side.

Census 32 pairs: episodes in the curb box 0.47 -> 0.34 a match,
episodes on the west end 9 -> 4; other spots flat (stuck x1.01
[0.84, 1.23]). Gates clean; no route longer by more than 10 %; hull
audit unchanged.

nav_analyze FRESH; same graph.
Bots on the z 780 floor (207 / 450) chasing a player on the ramp
7684 -> 7687 aim at the player's predicted position, which often
lands at x 741-748: on the ramp's floor (wall at x 756) but past the
areas' east edge at x 740. No area is found there and the chase
fails with FAIL_NO_PATH_EXISTS.

Widen 7684 and 7687 east to x 752, 4 u short of the wall; nothing
lies east of them.

Census 32 pairs: chase targets on the ramp that find no path 0.97
-> 0.31 a match, no-path events on the 207 / 450 floor 0.66 -> 0.41;
other spots flat (stuck x0.98 [0.79, 1.21], no-path map-wide x1.00).
Gates clean; no route longer by more than 10 %; hull audit unchanged.

nav_analyze FRESH; same graph.

@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.

Suggestion: Mark area 3401 PRECISE + CLIFF, as its mirror 3404 is.

@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.

Three unmarked one-way drops off the helipad fence cross the kill slot (areas 4671, 4674, 4672 over to 415).

These links have the same shape as the hall exits that the analysis I ran says causes deaths 😬. On an 80 unit drop, a bot steers at the first point past the fence tip, and that point is over the open kill slot (28-98 units wide). Without neo#2198 the bot falls in.

With neo#2198 the drop becomes an unmarked gap jump. The fence-top areas have no CLIFF/PRECISE mark, so a bot standing on them can still dodge or side-step into the slot.

An analyzed distance-only cost says no spawn-to-spawn nor spawn-to-area shortest path uses the three links (0 of 59,562). That translates to roam or chase traffic from the pad heading west, not main-route traffic.

Suggestion: Cut the three drops, since the safe drop 93 to 8436 exists, or mark the fence tops PRECISE + CLIFF. The other eight fence tops over the slot are unmarked too.

Note

Marking as approved regardless, since this is still majorly a fine first navmesh.

@sunmachine
sunmachine requested a review from a team October 14, 2026 03:52
@sunmachine

sunmachine commented Oct 14, 2026 •

Copy link
Copy Markdown
Screenshot 2026-10-13 at 20 54 17

Specific spot for the helipad.

@sunmachine

Copy link
Copy Markdown
Screenshot 2026-10-13 at 20 56 00

And a specific spot for the jump in question.

@sunzenshen
sunzenshen merged commit 467c146 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