Repository navigation
ntre_ghost_ctg: navmesh rework - #163
Merged
sunzenshen merged 3 commits intoOct 14, 2026
Merged
Conversation
One file. Against master: 1682 -> 1250 areas, 1,257,663 -> 787,191 bytes; 2 nav ladders (master 1). - Areas the engine blocks at round start are cut around the obstacle, and standing room is carved round props where test bots stuck. - Walk links a player hull cannot cross are cut both ways: past the hanging robobags and their racks, conveyors, handrails, a cylinder, a crate and an office chair; strips inside a prop are removed (the stair handrails, a robot arm, a monitor wall, a post, two golf carts, the nook inside robobag 88). - The climb 3450 -> 15 near (938, 2075) is cut; its drop back was cut earlier on stuck evidence. - A nav ladder on the climbable brush at (-338, 2012); the dead end 3248 at its foot, inside the wall and a pipe, is removed. - Links cut one way by earlier passes get their missing direction back where the hull audit reads them clear both ways (15), or are cut both ways where it reads them blocked. - Hand edits at the golf cart (PRECISE strip), the forklift, the aircon yard gap jump, a pipe-top nook and ledge 4252. - Re-analyzed in game after the edits. Engine hull audit of this file: oneway 0, cut 0, area 0, check 0, entity 1 (a robobag), keep 4 (the desk top under ghost spawn 5, the ramp areas of a catwalk step plate), sinks 0 for every class. 100-match A/B against master, same bot code (30 bots, 10 ghost pins x 5, 1 round, 8 wide): events a match 13.1 -> 7.3, stuck events 10.3 -> 4.6, stuck episodes 2.9 -> 1.2; kills 24.6 / 25.5; all 100 matches ended clean.
The big room's floor area ran under two mech statues (static props) and a desk. Its portal to the room's west part has its crossing point behind them, so bots walked straight into a statue: 1.42 events a match at the statue near (-952, 2490) in the 100-match A/B against master (master 0.52), 66 of 71 heading for that portal. Both footprints are now holes in the floor area, at hull height plus 4 u, the desk joined to its statue's hole. The floor around them is five areas that link round the holes, so every corridor stays: 1250 -> 1254 areas, 787,191 -> 793,887 bytes. Re-analyzed in game. Engine hull audit unchanged: oneway 0, cut 0, area 0, check 0, entity 1, keep 4, sinks 0 for every class. Reachability as before. Previous file against this one, same bot code, 30 bots, 8 wide: - the 3 ghost pins with the statue episodes x 8: statue 0.71 -> 0 events a match, the room 1.00 -> 0.38 - 10 ghost pins x 5: statue 0.18 -> 0; events a match 7.4 -> 7.3, stuck episodes 1.1 -> 1.3, kills 25.1 / 25.7, no fall deaths; all 148 matches ended clean
This was referenced Oct 5, 2026
The stairway east of ladder 2's top, near (-160, 2050), has steps of about 11 u, but area 4336 modelled it as a 25 u strip sloped the wrong way with 25 u gaps on both sides, so its links to the landing and the corridor read as 22-24 u jumps. The bot path cost priced each at 10^5-10^6, and bots that had just climbed ladder 2 re-planned, walked off the landing and dropped 139 u back to the ladder's foot. 4336 is now one ramp from z 167 to 202 touching both. Over three A/Bs on neo master, 50 of 144 climbs turned back (35 %) before and 34 of 172 (20 %) after; 58 % -> 74 % reached the corridor. The 227 u drop 4314 -> 225 off the west end of the walkway near (-1375, 912, 255) lands on three hanging light props (632-634) 135 u above the floor. 2 of the 15 bots that took it in 90 matches stayed on them for the rest of the round. The drop is cut; it was a shortcut used 0.17 times a match, and 225 keeps its other links. Re-analyzed in game. Hull audit: no blocked link beyond the 4 kept and the robobag, as before.
sunzenshen
marked this pull request as ready for review
October 13, 2026 01:21
sunmachine
approved these changes
Oct 14, 2026
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
ntre_ghost_ctg: navmesh rework
One file,
neo/maps/nav/ntre_ghost_ctg.nav.Dependencies and status
Needs: none. Measured on neo master
092203f36with no open PR (A/B below). The bot changes this mesh carries data for are inmaster now:
near (-1060, -235), area 4930, is
NAV_MESH_PRECISE(below).cut out of the mesh, and the optional barriers competitive mode creates.
NAV_MESH_AVOIDpath cost, merged): used only by the optional catwalk edit under "Known, not changed".Helped by (measured better with it on the harness's research build; the mesh does not wait on it):
path failures a match on this map in its survey.
near (-381, -103), 37 stuck events and 1 fall in its survey, 0 stuck and 3 falls with it.
Related, open: NeotokyoRebuild/neo#2179 ("Bots avoid neo_npc_targetsystem via nav PVS"), so bots avoid the tank in
non-competition play. The A/B on master ran without it.
At a glance
What changed
Areas the engine blocks at round start, where a brush or prop stands over an area's center, are cut around the
obstacle or split.
Walk links a player hull cannot cross are cut. An engine hull audit (a Recon hull swept along each link on 4 u
lanes) found no clear lane on 34 links bots got stuck on, most past the hanging robobags and their racks, the rest
past handrails, pipes and a cylinder. Five areas left with no way in are removed.
Eight of these had been cut one way only. Seven of them, past robobags, a conveyor and a cylinder, are now cut both
ways (the hull audit finds no clear lane in either direction), and the nook inside the robobag near (-912, 1800) is
removed. The climb from 3450 to 15 (+51 u near (938, 2075)), whose drop back was cut on stuck evidence, is cut too.
The engine hull audit of the final file found more: links with no clear lane either way are cut both ways (two
wall faces, a conveyor, a robobag rack, a crate, an office chair, two stair handrails, and a gap link across a
conveyor), and strips that lie inside a prop are removed: under stair handrails, inside a robobag rack, a monitor
wall, a post, two robot arms, a hack case and a golf cart, and the three ramps onto and into the golf cart near
(-612, 3412).
Holes round twelve static props bots pressed against: two mech statues, a military desk, a car, a control-box
post, crates and posts, each cut where the engine's hull audit finds a standing hull cannot be next to the prop.
Holes round two more mech statues in the big room near (-1038, 2458) and (-1366, 2476), a desk joined to the
first one's hole, cut at hull height plus 4 u. The room's floor area ran under them, and its portal to the room's
west part had its crossing point behind them, so bots walked straight into a statue: at the statue near (-952, 2490)
1.42 events a match on the first revision of this mesh, against 0.52 on master, 66 of 71 heading for that portal.
The floor round the holes is five areas that link round them, so every corridor of the room stays open; a larger
carve of the room's middle, which closed them, was tried earlier and dropped (stuck events x1.82, routes moved into
the hanging robobags). With the holes: 0 events at that statue (A/B below).
The forklift and the catwalk posts are not carved: carving round them sent more bots into the forklift.
Hand edits where test bots got stuck:
into the cart. The strip now stops half a hull off the cart and is
PRECISE, so the path follower does not cutdiagonally past it.
cut; bots landed short on the round aircon units, with no nav and too high to climb back
and pressed the warehouse wall
climb back, which no class plans: no hull lane clears it, and bots of every class fell or stuck on every try
The stairway east of ladder 2's top, near (-160, 2050), is one ramp (area 4336, z 167 to 202) touching the landing and
the corridor. Its steps are about 11 u, but the strip that modelled it was 25 u wide, sloped the wrong way, with 25 u gaps on
both sides, so both links read as 22-24 u jumps, which the bot path cost prices at up to 10^6. Bots that had just climbed
ladder 2 re-planned there, walked off the landing and dropped 139 u back to the ladder's foot. Master's mesh has the same
strip. Within 60 s of topping ladder 2 (three A/Bs on neo master, the earlier revision of this mesh against this one):
The drops left are route choice: the re-plan when a climb ends picks a ground route of about equal cost.
The 227 u drop off the west end of the walkway near (-1375, 912, 255) to the floor is cut. It lands on three hanging
light fixtures (static props 632-634) 135 u above the floor: 2 of the 15 bots that took it in 90 matches stayed on them for
the rest of the round, about 10 "fell off the path" events a second (master's mesh has the same link). The drop was used
0.17 times a match; the floor below keeps its other links.
A nav ladder on the climbable brush at (-338, 2012), which master's mesh lacked. Ladder 1, master's, is kept:
at its foot 0.66 events a match on master and 0.42 on the first revision (first A/B), 0.74 on the first revision and
1.22 on this mesh (second A/B); see "Known, not changed".
Walk links restored: 15 links that ran one way after earlier cuts get their missing direction back, where the
hull audit reads them clear both ways (level links into small nooks), and drops back from rail tops and climbs are
restored. Two more such pairs, at handrails near (638, 1650) and (638, 2075), read blocked both ways and are cut both
ways instead. The pair 3096 / 3097 near (-300, 2475), whose end 3097 is a crouch area, is cut both ways: the audit
sweeps a crouched hull there, and no test match gives evidence for walking it standing. 3097 keeps its other link.
Four drops keep no climb back. Their climbs were cut by an earlier pass that removes links that cross a
railing and links onto a strip standing on a rail, unless the way round is missing or too long:
bar, which the railing check reads as a rail. The board is still entered by its climb from 2374.
No event at any of the four on this mesh.
The 25 u area 3248 near (-363, 2013, 28), entered only by a 139 u drop from ladder 2's top and touching its
neighbor at a corner, is removed: a standing hull there is 94 % inside the wall and a pipe. It is a pocket on master too.
Kept after a look, though the audit reads them blocked: the desk top under the hack case that ghost spawn 5 lies
on (without it the spawn is 74 u off the mesh), and the two ramp areas of the step plate on the catwalk near
(-1120, 1875), which are the only walk way onto the west catwalk. No test match stuck there. The rail top near
(-570, 1112, 259) keeps its climb from the walkway 4326 and the drop back, though the audit reads the drop blocked by
the handrail: the climb is the only way onto the platform south of the rail (4858 to 4860), and without the drop
back it would be a one-way climb. No event there.
Marks: NO_MERGE 93 -> 36, OBSTACLE_TOP 37 -> 2, CROUCH 16 -> 12, STAIRS 11 -> 9, PRECISE 0 -> 1.
Ids follow master's. 1215 of the 1254 areas keep a master id; 1006 of them have master's corners. 39 areas are new.
Re-analyzed in game after the edits, so the visibility lists bots use are current.
How it was tested
4,254 -> 4,721 u (+11 %); ghost spawn 10, defenders 6,892 -> 7,685 u (+12 %)
prop holes in the big room's floor (the four mech statues); the others are smaller prop holes, rail-top strips, floor beside the golf cart near
(-825, -225), nooks among the robobags, the pipe-top nook above and the golf cart ramps near (-612, 3412).
trigger_hurt.BLOCKED_LINKS map=ntre_ghost_ctg level_pairs=1927 oneway=0 keep=4 cut=0 area=0 check=0 dynamic=0 entity=1 one_way_drops=210 sinks(any/recon/assault/support)=0/0/0/0 audit_links=4289 mesh_walk_links=4287. The entity row is ahanging robobag; the 4 keep rows are the desk top and the step plate above; the 2 extra audit links are two links the
file lists twice, as master's does.
092203f36(Release dedicated server, harness logging only). Byte-identical copies of the map, onecarrying each
.nav, matches interleaved: CTG, the ghost pinned at each of the 10 ghost spawns in turn, 6 matches each (60 amesh), 30 bots, default weapon damage (1.485), 1 round, 8 matches at a time, one XP tier a match rotated over the spawns.
180 of 180 matches (a third arm ran the catwalk edit below) reached match end with 0 asserts. Events are counted as in the
earlier A/Bs below. It ran the revision before the stair ramp and the drop cut. Two later batches ran that revision against this mesh
the same way (30 and 20 matches a mesh): 10.3 and 10.9 events a match on the earlier revision, 9.0 and 10.5 on this one, no
new spot.
The table leaves out one bot on each mesh that stood on the light fixtures above for the rest of its round (1179 and 323
"fell off the path" lines; the drop is cut in this mesh). Both meshes read higher on master's bot code than on the research
build below, and that revision is below master's at each of the 10 ghost spawns. Spots on it at 0.5 a match or more: the
fall at the west end of the catwalk loop near (-1274, 36) (0.97; master 2.13), the statue under the north doorway near
(-1385, 2289) (0.58), ladder 1's foot (0.55), and near ladder 2's foot at (-148, 2097) (0.50).
same bot code in both arms; "this mesh" there is the revision before the stair ramp and the drop cut. Byte-identical
copies of the map, one carrying each
.nav, matchesinterleaved: CTG, the ghost pinned at each of the 10 ghost spawns in turn, 5 matches each (50 a mesh), 30 bots, default
weapon damage (1.485), 1 round, 8 matches at a time. Every match reached match end with 0 asserts. Events are stuck
events (
OnStuckplusFAIL_STUCK, without the spawn crush at round start and weapon scavenging), "fell off thepath" and "no path". A stuck bot logs about one stuck event a second; a stuck episode is one bot's stuck events less
than 10 s apart, counted once.
The first A/B ran master against the first revision of this mesh (before the holes round the two big-room statues
near (-1038, 2458) and (-1366, 2476)); a second A/B, the same way, ran that revision against this mesh.
The events intervals overlap a little (master 13.1 [9.5, 17.1], this mesh 7.3 [5.8, 9.0]); stuck episodes, 2.9 against
1.2-1.3 a match, are the clearer difference. Over the whole map the holes change nothing measurable (second A/B).
Spots at 1 event a match or more: in the first A/B, master's stair and rail landing (2.70) and block-top drop (1.36), and
the first revision's statue near (-952, 2490) (1.42); in the second A/B, none on the first revision, and on this mesh
ladder 1 (1.22) and the block-top drop (1.20), both far from the statue holes (under "Known, not changed").
The big-room statues. At the statue near (-952, 2490): master 0.52 events a match, first revision 1.42 (first A/B) and
0.18 (second), this mesh 0. A third batch on the three ghost pins whose matches had the first revision's episodes there,
8 matches each a mesh: first revision 0.71 at that statue and 1.00 in the room, this mesh 0 and 0.38. The room
around the statues: first revision 1.94 and 0.42 a match in the two A/Bs, this mesh 0.46. Between the statue near
(-1366, 2476) and the one under the north doorway near (-1390, 2329), the second A/B reads 0.42 a match on this mesh and
0.16 on the first revision, which read 0.52 there in the first A/B (master 0.28).
Master's leading spot, the stair and rail landing near (-1141, -31, 240): 2.70 events a match on master, 0.02 on this
mesh; the golf cart corner near (-896, -270) 0.68 -> 0.14, the rail drop near (-425, 458, 216) 0.68 -> 0. The drop
off the block-top walkway near (-1259, 10) (fell off the path, no stuck) 1.36 -> 0.72.
Bots fell off the 25 u walkway at z 220 near (-575, -138) onto the floor below it, near (-573, -192), 0.56 times a match
here and 0.32 on master: all "fell off the path", no stuck event, no fall death. Over the whole map they are equal
(2.36 a match on each mesh).
No event at the restored links, the nooks 1129, 1278, 4904, 2435 and 3334, the crouch pair 3096 / 3097, the step
plate, the desk top or the golf cart ramps. The cylinder nook 4222: 1 event in 50 matches (master 2). The 3450 drop:
1 "fell off the path" on each mesh. Ladder 2: 5 events in 50 matches.
Bots leave their spawns at round start on both meshes: 5 s after the round went live, no bot of either team was
still within 64 u of where it stood, and the median bot had moved by 1.0 s.
Earlier batches, older revisions of this mesh
On 09-23 two of the changes above were each measured against the mesh just before it, not against master, on an
earlier research build with a 2 s pre-round freeze, counting
OnStuckonly. The link cuts, against the mesh beforethem: 48.0 -> 39.0 a match (20 pairs, default damage), and 46 -> 0 events on the cut links. The prop holes, against the
mesh with those cuts (a separate batch, whose baseline also came to 48.0): 48.0 -> 34.1 (30 matches a mesh), at the
mech statues 2.6 -> 0.1, crates 1.8 -> 0.1, the double post 1.8 -> 0.0, the car 1.7 -> 0.7.
Known, not changed
catwalk loop: west about 900 u along a strip over the defenders' spawn, round a hairpin at x -1340 and back east on a
parallel strip, then north on the walkway along the spawn hall's east wall into the building's upper floor. The 50 u
between the strips is a full-height wall, so the loop is the real geometry. On neo master, within 60 s of the climb
(60 matches a mesh): 54 % of climbers reach the upper floor (188 of 351; master's mesh 39 %, 143 of 364), in a median
27 s; 85 fall off the loop and 54 take a planned drop off it back to the ground; 5 stuck at the top (with #2176).
At its foot 0.55 events a match.
the turn heading north-east and carry on over the north strip's north edge, which has no rail, to the floor near
(-1272, 30) (190 u, not lethal): 0.97 "fell off the path" a match on this mesh, 2.13 on master's, the most frequent fall
on both. Pulling the strip's area back from the edge made it worse (1.47);
PRECISEon the turn stopped the falls (0.07)but bots then stuck in the turn (stuck events 7.8 -> 28.7 a match). Needs a clip brush on that edge or path-follower
handling of a tight turn beside a drop, not a mesh change.
NAV_MESH_AVOIDon the ladder 1 ledge, the south strip and the turn (branchsunzenshen:navmesh-ghost-catwalk, attributes only). On neo master: climbers 351 -> 149 in 60 matches, 63 % of them reachthe upper floor, falls off the loop 85 -> 38; over the whole map 11.3 [8.3, 15.2] events a match against this mesh's 9.5,
no gain.
areas, as on master: 0.42 events a match near it on this mesh (second A/B), 0.28 on master.
The robobag curtain at areas 469, 833 and 1278: 0.06 events a match on master, none on this mesh. The girlbot bodies
near (-2190, 3685): 0.64 events a match on master, 0.72 on the first revision, 0.52 on this mesh and on the first
revision in the second A/B.
mesh, from the A/B: forklift 0.08 events a match on master, none here; girder wall 0.08 on master, 0.06 here.
lifted free by the server within about 1 s. The default 15 s freeze covers it. A map issue, not a mesh one.
areas on prop and ledge tops; one, area 2256 near (-1162, -738), has no link at all, as on master. No test-match event
in any of them.