Skip to content

ntre_vtol_ctg: navmesh rework - #166

Merged
sunzenshen merged 2 commits into
NeotokyoRebuild:masterfrom
sunzenshen:navmesh-vtol-release
Oct 14, 2026
Merged

sunzenshen merged 2 commits into
NeotokyoRebuild:masterfrom
sunzenshen:navmesh-vtol-release

Conversation

@sunzenshen

@sunzenshen sunzenshen commented Oct 8, 2026 •

Copy link
Copy Markdown
Contributor

ntre_vtol_ctg: navmesh rework

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

Dependencies and status

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

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

On neo master without either, no bot reached the pit or a trench bottom on this mesh in 42 matches (master's mesh: 4 bots
in 98 matches, 124 events).

At a glance

master this PR
nav areas 7350 6582
file size 50,906,904 bytes 41,364,038 bytes (-19 %)
nav ladders 1 1
areas no spawn reaches (every link) 17 in 4 pockets 15 in 2
areas entered with no way back, any class 0 0
ghost spawns or capture zones a team cannot reach none none
one-way level links 6 1, inherited (below)
bot events a match on neo master (stuck, fell off the path, no path) 35.1 8.0
stuck episodes a match on neo master 4.4 2.0

What changed

  • The trenches. Two unmeshed holes, 400 x 150 u, near (-2050, 1975) and (0, 1975), lie between the walkway platforms
    and the north rim strips; two crossbeams span each hole just under the rim, and bots stepped onto them and fell about
    1100 u to a bottom with no mesh and no exit (6 bots in 42 matches on the research mesh before these edits, trapped for
    the match). The areas with an edge on either hole, and those on the rims of the pits beside them, are PRECISE +
    CLIFF (34 areas).
  • Links over railings are cut where a way around exists. Master's leading spot, the handrail by area 553 near
    (-2399, 361), went 6.9 -> 0 events a match, and the one by 703 near (620, 337) 1.4 -> 0 (A/B below). A railing check
    walks a player box across each link on the map's collision; re-run on the mesh before the cuts, it reads every lane of
    each of these a rail:
    • 4814 / 27713 near (-650, -1462), a 19 u step over a rail, cut both ways;
    • 4 -> 4901 near (-3200, 850), master's one-way drop of 135 u off the roof over its edge rail;
    • 42440 -> 40678 near (-1550, -650) and 5360 -> 35085 near (2662, 562), climbs of 17 and 30 u over a rail (35085 is a
      strip on the rail's top). The drops back are kept: the check then judged each direction on its own;
    • 2019 / 32998 / 5175 -> 911 near (1300, -1075) and 7726 -> 25738 / 25777 near (-1790, -1625), climbs of 76-87 u over
      a rail. No class climbs that high, so no route changes; the drops back are kept;
    • the bunker steps 44687 near (-925, 2480) and 44689 near (-2150, 2480), 14 u strips on a 50 u wall below the bunker
      tops, which the check reads as rail tops. It kept the one way up onto each bunker (2928 -> 44687 -> 825, 2777 ->
      44689 -> 788) and cut the strips' links to the wall's other side, 2929 and 4491, both ways. The drops back along
      the kept routes are restored (next item); the links to 2929 and 4491 stay cut, and bots go round the wall
      (350-650 u).
  • Walk links restored: level links an earlier railing pass had left one way get their missing direction back where
    the engine hull audit read the lanes clear (15 links, among them 29922 / 29923, 42299 / 43839, 1393 / 44256, and the
    drops back off the bunker steps 44687 / 44689); three such pairs read blocked both ways and are cut both ways instead
    (1132 / 21293, 5360 / 35270, 13041 / 16171). One-way level links 6 -> 1.
  • The robocart near (157, 295): bots skipped ahead into the cart's hitch from area 8448's east end. The floor around
    the cart is carved, grown by half a hull: 8448 is split (new 44706), and 4956 loses a strip (new 44705).
  • The berm near (-3600, 1500) keeps master's areas: the ramp 43701 / 43702 drawn over the 25 u wall and the four
    strips on its top (40583-40586). A version with 43701 flat at the wall's top and the strips merged was worse on neo
    master: bots coming down from 4301 walked into the wall at (-3606, 1600) for 6-9 s at round start, about 1 event a
    match against 0.05 on master's mesh (98 matches). Restoring the ramp alone halved it (0.40 a match); with the strips
    too, 0.12 against master's 0.14 (42 matches each).
  • The wedge near (-2800, 2545): areas 11971, 1755 and 4477 drew one plane from the wedge's top to the ground, up to
    39 u above the real surface; each is split where the wedge meets the ground and set on it (new 44707-44709). Events
    there 0.48 -> 0 a match.
  • The under-stair pockets near (0, 1200) and (1010, 1200): the strips in front of the four CROUCH pockets under the
    stairs are CROUCH too, since a standing hull meets the stair underside before it reaches the pocket.
  • Blocked pairs cut, unstandable areas removed: 7 pairs blocked on every lane both ways (two fake doors, four sloped
    concrete walls by the mini radar, a wood wall); 6 areas no hull stands on (9261 and 44449 at the mini radar base, 21293,
    a pole 23109, a transformer 34180, a leaning sheetrock 21953); a 46 u drop with no launch lane (1885 -> 27871, every
    class stuck 5 of 5 in a scripted walk); and two displacement pairs, 2948 / 2950 near (-1225, -300) and 42585 / 44695
    near (-750, -650): in a scripted walk every class was stuck in 3-5 of 5 trials from 2950 to 2948 and in 4-5 of 5 from
    44695 to 42585. Each pair is cut both ways, since the two areas of each pair share neighbors (7861 and 16189; 7995 and
    44696) that take bots around; 0.02 and 0 events a match there in the A/B below.
  • Merged slivers. 785 of master's areas are gone, most merged into coplanar neighbors: the floor the mesh covers is
    36,378 sq u (0.1 %) smaller than master's. Among them are 6 CROUCH areas (4 at the walkway platforms by the trenches)
    and 4 STAIRS areas, each merged into a neighbor with the same mark, so that floor keeps its mark.
  • Standing room in front of the under-stair pockets: a 16 u strip of areas 869 and 890 next to the pockets, where
    coverage-sweep bots stuck against the stair underside, is carved out. The four drops of about 100 u from the floor
    above that landed on the strip (19 -> 890, and 241 / 8408 / 29927 -> 869) went with it.
  • Areas the engine blocks at round start. At each round start the engine blocks, for the whole round, any area with
    solid 35.5-59 u over its center, and bots cannot plan a path through it. Six of master's CROUCH areas at the ends
    of the walkway platforms by the trenches, near (-2200, 1525), (-150, 1525), (-2062, 1762) and (-12, 1762), lie under
    static props about 60 u up and are deleted (12074, 13488, 23607, 23633, 29836, 29865; 5,000 sq u). Bots could not
    path through them on master either. Four areas with displacement terrain in that box, 1651 near (-4862, -1812), 4798
    near (-690, -660), 4895 near (540, -590) and 39848 near (-710, -525), are split around it (new 44692-44703), so
    master's links 1651 <-> 2475 / 11056 / 40504, 4798 <-> 7995 / 39848 / 41333 and 4895 <-> 3192 / 31932 / 42703 /
    42704 now run through the new pieces.
  • Two drops cut: 8333 -> 8332 near (-970, 395), which drops through a closed static bunker door (0.45 -> 0 events a
    match there), and 40179 -> 28276 / 28277 near (-225, -575), drops across a displacement.
  • Marks: PRECISE 0 -> 34, CLIFF 0 -> 34, CROUCH 42 -> 34 (6 merged into CROUCH neighbors, 6 deleted as blocked at
    round start, 4 lead-ins added), STAIRS 23 -> 19 (4 merged into STAIRS neighbors), NO_MERGE 57 -> 25, OBSTACLE_TOP
    27 -> 6.
  • Ids follow master's. 6565 of the 6582 areas keep a master id; 6047 of them have master's corners. 17 areas are new.
  • Re-analyzed in game after the edits, so the visibility lists bots use are current.

Deliberate one-way links

  • 39787 -> 16064 near (2200, 762), inherited from master: a level step onto the stair 16064 past a small transformer.
    Every class walks it; 16064 has its own ways off, so no reverse is added.

How it was tested

  • Reachability (offline, the final file):
    • every spawn reaches both ghost spawns and every capture zone, for both teams and every class
    • no dead end, no area a class can enter and not leave, no one-way climb of 60 u or more
    • the areas no spawn reaches drop from 17 in 4 pockets to 15 in 2; the two pockets gone are single areas (16138, 38647)
    • one route is more than 10 % longer than on master: ghost spawn 1 for attackers, 844 -> 980 u (+16 %)
  • Falls. The map has no trigger_hurt.
  • Engine hull audit of the final file (every level link swept with a player hull in game):
    oneway 0, cut 0, area 0, check 0, dynamic 0, entity 0; no area any class can enter and not leave. Keep 64, each with
    its reason:
    • the inherited one-way link 39787 -> 16064 above;
    • 37 pairs on displacement slopes, read blocked one way only: the lane from the lower area starts under the terrain
      (an area's plane is rarely flush with a displacement). Every class crosses each both ways in scripted walks;
    • 8 steep strips and a stair, read blocked both ways because the lanes start inside the slope (the 25 u ridge strips
      on the roof near (750..1275, 340), area 22045 and the stair 39635). Every class crosses each both ways;
    • 8 pairs read blocked one way, where the lane starts against a door frame or prop (door frames, concrete sheets, the
      bunker door, a transformer). Every class crosses each both ways;
    • the 3 CROUCH lead-ins at the under-stair doorways (869 / 44179, 869 / 44181, 890 / 44279): the audit sweeps a
      standing hull, which meets the stair underside there by design (see "Known, not changed");
    • 5 more pairs. Three are master's links, where a cut would trade a working direction for a detour: 344 / 15487 (a
      displacement) and 9311 / 35265 (the mini radar's sloped wall), crossed in 3 of 5 trials one way, and 9307 / 35265
      beside it, read blocked both ways and crossed by every class. 42585 / 44696, a displacement rim, crosses in some
      trials one way. 13789 -> 44698 is a link no class plans (the planner reads it blocked), so bots do not use it;
    • master's berm ramp, 1140 / 43701 and 1140 / 43702: the lanes meet the wall the ramp is drawn over, and bots walk them
      (0.6-0.9 times a match), as on master.
  • Master against this mesh on neo master. Upstream neo master 092203f36 with no open PR, Release build plus the
    harness's logging. Byte-identical copies of the map, one carrying each .nav, matches interleaved: CTG, the ghost
    pinned at each of the 14 ghost spawns in turn, 3 matches each (42 a mesh), 30 bots, default weapon damage (1.485), 1
    round, every player at one rank tier rotated across the pins, 8 matches at a time. Stuck events are OnStuck plus
    FAIL_STUCK, without the spawn crush at round start and weapon scavenging. Paired ratio: geometric mean of
    (this mesh + 1) / (master + 1) over the 42 pairs, with a 95 % bootstrap interval.
a match, neo master master this mesh paired ratio [95 %]
all events (stuck, fell off the path, no path) [95 % interval] 35.1 [21.5, 53.8] 8.0 [6.5, 9.5] x0.36 [0.25, 0.54]
stuck events 23.6 5.9 x0.32 [0.21, 0.51]
stuck episodes 4.43 1.95 x0.55 [0.43, 0.69]
no path / fell off the path 1.45 / 9.98 0.98 / 1.10 x0.83 / x0.72
fall deaths 0 0
kills 24.8 25.1 x1.01
matches with the ghost picked up 40 of 42 37 of 42
matches at match end with 0 asserts 42 of 42 42 of 42

By rank tier, stuck events master / this mesh: Private 27.1 / 4.4, Corporal 28.5 / 5.8, Sergeant 16.5 / 7.1, Lieutenant
22.6 / 6.1. Master's fell-off count is one bot at the bottom of a trench. Before the berm restore, the same comparison over
98 pairs gave 34.6 -> 9.7 all events (x0.39 [0.31, 0.49]); all 588 matches of the eight batches (test copies included) ended clean with 0 asserts.

Master's leading spots, events a match within 128 u, master -> this mesh (neo master): the handrail by 553 near
(-2399, 361) 9.2 -> 0; the bunker door by 8333 near (-970, 395) 1.38 -> 0; the robocart (157, 295) 1.12 -> 0.24; the
under-stair doorway near (1160, 1100) 0.83 -> 0.21; the handrail by 703 near (620, 337) 0.71 -> 0; the wall by 39934 near
(-1428, 1819) 0.50 -> 0.14; the wedge 0.50 -> 0.10; the trench and pit rims 0.31 -> 0.14; the berm 0.14 -> 0.12. No spot on
this mesh is at 1 a match or more.

Earlier measurement on the harness's research build (neo master plus the open bot PRs of the time and further research bot changes)

Same setup, 4 matches a pin (56 a mesh), players' XP from zero.

a match (95 % interval in brackets) master this mesh
all events (stuck, fell off the path, no path, fall deaths) 18.9 [13.8, 25.1] 9.6 [7.8, 11.6]
stuck events 17.3 7.4
stuck episodes 3.7 2.4
no path / fell off the path 0.29 / 1.30 0.45 / 1.66
fall deaths 0 0
kills 24.5 24.3
matches at match end with 0 asserts 56 of 56 56 of 56

Master's leading spots, events a match within 128 u, master -> this mesh: the handrail by 553 near (-2399, 361) 6.9 -> 0;
the robocart (157, 295) 1.6 -> 1.3; the handrail by 703 near (620, 337) 1.4 -> 0; the wall by 39934 near (-1428, 1819)
0.6 -> 0.1; near (3250, -1319) 0.5 -> 0.1; the wedge 0.5 -> 0; the bunker door by 8333 near (-970, 395) 0.5 -> 0. The only
spot on this mesh at 1 a match or more is the robocart.

Known, not changed

The rates are events a match on this mesh in the neo master A/B above (stuck, fell off the path, no path), within 128 u
of the point, master's in brackets.

  • The robocart near (157, 295): 0.24 (1.12). Support and Assault bots cutting off an enemy still skip ahead into the
    cart at 8448's east end, a few events at a time; bot code, not the mesh.
  • The under-stair doorways near (-89, 1136), (113, 1136), (897, 1136) and (1160, 1100): 0.12, 0.02, 0, 0.21 (0.12,
    0.07, 0.07, 0.83). Bots retreating to cover head for the pockets and meet the door frame; in a scripted walk Recon and
    Assault cross the lead-ins in 0-5 of 5 trials, and Support does not plan into a CROUCH area. Master has the same
    pockets.
  • The trenches: on neo master no bot reached a trench bottom or the pit on this mesh in 42 matches, nor in 98 matches
    of the version before the berm restore (master's mesh: 4 bots in 42, 4 in 98). One bot did in 56 matches of two test
    copies of that version; on the research build, one bot in each of 2 of 56 matches (master 1 of 56).
  • The wood shelf by area 942 near (2612, 2431): 0.38 (0.14).
  • Other spots higher on this mesh, all under 0.6 a match: 12214 near (-1600, 1848) 0.55 (0), most of it bots in
    fights on the walkway in 4 of 42 matches; area 42481 near (-1469, -509) 0.43 (0.17); the ledge by 9034 near
    (1920, 544) 0.26 (0.12, falls off the path); 7903 near (-480, 2031) 0.17 (0.14).
  • Areas still blocked at round start. An offline model of the engine's test flags 6 areas on this mesh (master: 25):
    4895 and its three pieces 44698-44700 near (540, -590), where the displacement still reaches into the box over each
    piece, 5359 by the mini radar and 43703 near (-3390, 1888). Bots do not plan through them, as on master; the kept
    link 13789 -> 44698 above leads into one of them.
  • The east fence strips near x 4575-4600: the climbs onto the security-wire fence are cut (10 one way, 5 pairs both
    ways); the drops off it, which no bot route uses, are left as they are.

One file. Against master: 7350 -> 6579 areas, 50,906,904 ->
41,338,998 bytes; stored BSP size now matches the map.

- The rims of the two unmeshed trenches and of the pits beside them
  are PRECISE + CLIFF (34 areas), so bots keep to their path there
  instead of stepping onto the crossbeams and falling in.
- Links over railings are cut where a way around exists; level links
  an earlier railing pass left one way get their missing direction
  back where the engine lanes are clear.
- The floor by the robocart near (157, 295) is carved round the
  cart's hitch; area 8448 is split.
- The berm near (-3613, 1601) is drawn flat at the top of its 25 u
  wall instead of as a ramp over it.
- The wedge near (-2800, 2545): three areas drawn up to 39 u above
  the ground are split and set on the real surface.
- CROUCH lead-ins in front of the four under-stair pockets.
- Pairs blocked on every lane both ways are cut (fake doors, sloped
  concrete walls, a wood wall); six areas no hull stands on are
  removed (the mini radar base, a pole, a transformer, a sheetrock
  strip); a 46 u drop with no launch lane is cut, and two displacement
  pairs every class failed to cross in a scripted walk.
- Re-analyzed in game after the edits.

Engine hull audit of this file: oneway 0, cut 0, area 0, check 0,
dynamic 0, entity 0, keep 62, sinks 0 for every class. The keeps are
the inherited one-way 39787 -> 16064, 53 pairs on slopes or against
frames that read blocked where the lane starts inside geometry and
that every class crosses in scripted walks, 3 CROUCH lead-ins the
standing-hull sweep meets by design, and 5 pairs kept with their
reasons listed in the PR.

112-match A/B against master, same bot code (30 bots, 14 ghost pins
x 4, 1 round, 8 wide): events a match 18.9 -> 9.6, stuck events
17.3 -> 7.4, stuck episodes 3.7 -> 2.4, fell off the path 1.3 /
1.7; kills 24.5 / 24.3; all 112 matches ended clean.
The rework drew area 43701 by the berm near (-3600, 1500) flat at
the top of its 25 u wall, and merged the berm-top strips 40583 /
40584 and 40585 / 40586. On neo master's bot code, bots coming
down from 4301 then walked into the wall at (-3606, 1600) for 6-9
s at round start, aiming at the merged 40583's corner: about 1
event a match there against 0.05 on master's mesh (98 matches).

Restore master's ramp (43701 / 43702) and the four strips, with
master's ids and links, and re-analyze. In 42 matches a mesh
(14 ghost pins x 3, 30 bots, 1 round): berm 0.12 events a match
against master's 0.14; all events 35.1 -> 7.95 a match, stuck
23.6 -> 5.9, episodes 4.4 -> 2.0; 84 of 84 ended clean.

Engine hull audit: oneway 0, cut 0, keep 64 (the two ramp pairs
read blocked against the wall and are walked, as on master).
6582 areas, 41,364,038 bytes.
@sunzenshen
sunzenshen merged commit 6a7a3d4 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