Repository navigation
ntre_apparatus_dm: first navmesh - #157
Conversation
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
left a comment
There was a problem hiding this comment.
Suggestion: Mark area 3401 PRECISE + CLIFF, as its mirror 3404 is.
sunmachine
left a comment
There was a problem hiding this comment.
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.


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. TheNAV_MESH_PRECISE+NAV_MESH_CLIFFmarks use the movement rules of NeotokyoRebuild/neo#2168 and #2175, and the twoNAV_MESH_AVOIDmarks those of NeotokyoRebuild/neo#2170 (all merged).Dependencies and status
Needs (worse than master, or broken, without it):
Helped by (measured better with it; the mesh does not wait on it):
Pending before review:
At a glance
PRECISE+CLIFF(fall edges)PRECISEonlyWhat 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_hurtbelow 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.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.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.
PRECISEso the bot walks that line. Pocket episodes 0.38 -> 0.04 a match; the mouth's areas 0.33 -> 0.17.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).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.CROUCHarea 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 aCROUCHarea, so they pushed the prop standing up. A 32 uCROUCHstrip 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.Every commit passes the offline checks below: no new trap, no route longer by more than 10 %, no area blocked.
How to test
neo/maps/nav/ntre_apparatus_dm.navinto the game'smaps/nav/folder, on a build with Bots jump a gap link down instead of dropping into it neo#2198.map ntre_apparatus_dm, thenneo_bot_quota 30, and join spectator. Deathmatch, one 5-minute round.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
OnStuckplusFAIL_STUCKmove failures, without the round-start spawn crowd, weapon scavenging and dead bots. Fall deaths are deaths totrigger_hurtor 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:
FAIL_FELL_OFFmove failuresFAIL_NO_PATHmove failuresAt 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_PATH3.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:
FAIL_FELL_OFFmove failuresFAIL_NO_PATHmove failuresAt 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_OFFx0.63 [0.37, 1.07], player kills x0.98 [0.93, 1.04];FAIL_NO_PATH2.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:
Known, not changed
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").Considered, not included
STAIRS: the engine recomputes that mark when it loads the mesh and does not set it on 585, so it had no effect.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.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_EXISTS13.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.