Skip to content

ntre_sentinel_ctg: navmesh rework - #162

Merged
sunzenshen merged 1 commit into
NeotokyoRebuild:masterfrom
sunzenshen:navmesh-sentinel-ctg-release
Oct 14, 2026
Merged

sunzenshen merged 1 commit into
NeotokyoRebuild:masterfrom
sunzenshen:navmesh-sentinel-ctg-release

Conversation

@sunzenshen

@sunzenshen sunzenshen commented Oct 8, 2026 •

Copy link
Copy Markdown
Contributor

ntre_sentinel_ctg: navmesh rework

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

On master this map and ntre_sentinel_jgr load the same mesh, byte for byte. This PR gives the CTG map its own, because the two BSPs differ
at the upper doorways (open frames here, team doors with nav blockers on JGR). The JGR map's is
#165; either can merge first.

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:

NAV_MESH_AVOID and NAV_MESH_PRECISE are stock Source nav attributes.

At a glance

master this PR
nav areas 1326 1177
file size 1,457,821 bytes 1,139,619 bytes
nav ladders 8 8, linked up and down
areas no spawn reaches 2 2, the same
areas entered with no way back 0 0
objectives a team cannot reach none none (13 of 13, both teams)
bot stuck events a match on neo master (A/B below) 44.5 4.4
stuck episodes a match on neo master 8.7 1.3

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, and standing room is carved around props where test bots stuck on them.
  • Walk links a player hull cannot cross are cut. The engine hull audit (a Recon hull swept along each link on 4 u
    lanes) found no clear lane on five links bots got stuck on: from the roofs into the freight elevators, and past a
    plywood sheet and a blockade. Against the mesh before the cuts, at weapon damage 0.1, one match at each of the 9
    ghost spawns: OnStuck events 97.7 -> 54.6 a match; with a second such batch, x0.58 [0.41, 0.82] over the 18 pairs.
    Master's one-way link 1058 -> 2418 near (-12, -1250), which spans a 50 u gap past a crate's corner with no clear
    lane, is cut too; 1058 still reaches 2418 through 17, on the open floor beside it.
  • Links over railings are cut where a way around exists. At the two stairways near (-860, -800) and (-860, 800),
    master links each stair's side over its handrail to the floor beside it (340 -> 31, 330 -> 30); bots now leave the
    stairs at their ends. These links are the only mesh change within 128 u of master's two leading spots, which went
    5.81 -> 0 and 5.70 -> 0 events a match (A/B below).
  • The culvert pipes. The two tunnels, each two pipes in series, are CROUCH end to end, with a 40-45 u CROUCH
    lead-in at each mouth, so a Support ducks before its standing hull meets the pipe. In a scripted walk of the links,
    Support gets through every mouth 5 of 5 (before: 0 of 5 at the first tunnel, 1, 2 and 4 of 5 at the second's).
  • The balcony walkways. The four slivers that join the walkways at ladders 1 / 2 and 4 / 5 to their platforms have
    no room for a standing hull, and bots crossing them fell to the balcony; they are AVOID. The drops from the east
    walkway that every class fell past are cut, and the west walkway gets the drops to the balcony the east side has.
    With the drop changes, west balcony falls ran 0.67 times the rate before (95 % interval [0.52, 0.86], 27 matches a
    mesh).
  • The cement bags near (-1440, -440) and (-1500, 210): bots skipped ahead into the bags' face. Areas 175, 550 and 549
    are PRECISE, so paths turn at their entry; marking 549 took stuck events at the bags beside it from 1.19 to 0.00 a
    match (27 matches a mesh, against the mesh before the mark: 10 pairs down, 0 up).
  • The cover under crate 737 near (1400, -40): the two cover areas are fitted to their standing room, and the area
    before them is split so paths turn below the crate's corner.
  • The handrail on the platform edge near (62, 90, 320): a sliver straddling it is removed and the area beside it stops
    half a hull short of the rail; the spot went 3.2 -> 0 events a match (27 matches a mesh, against the mesh before the
    edit; the whole map x0.68 [0.50, 0.91]).
  • The freight-elevator shafts. Ladders 3 and 6 are kept, linked both ways, and the pits under them are AVOID. The nook
    at ladder 6's top is linked to the roof beside it, and ladder 8's foot strip gets its missing link back.
  • The spider tank near (513, 1, 19): the floor under the tank's legs and body is cut around each piece of its collision
    at hull height, grown by half a hull, as on the JGR map, and a link at a leg where two areas touch only at a corner
    (3769 / 3770) is cut (on the JGR map a batch of test matches logged 72 stuck events on 3769, all against the tank). This removes
    73,084 sq u of floor that spawns reached on master, all under and beside the tank. Ghost spawn 9 is under the tank's body, with about 65 u of headroom (a Support must
    crouch); the floor there is cut with the rest, so the spawn is 50 u from the nearest area. Bots still walk under the
    body and take the ghost there (below), so no area is kept under it.
  • Walk links restored: two level links at the walkways that ran one way after an earlier railing pass get their
    missing direction back. In a scripted walk every class crosses the west one 5 of 5; the east one starts on a sliver
    where no bot can be placed, so only its other direction was walked (every class crosses it).
  • Marks: AVOID 0 -> 6, PRECISE 0 -> 3, CROUCH 18 -> 29, NO_MERGE 42 -> 15, OBSTACLE_TOP 26 -> 3.
  • Ids follow master's. 1139 of the 1177 areas keep a master id; 1013 of them have master's corners. 38 areas are new
    (18 of them pieces of the floor around the tank).
  • Re-analyzed in game after the edits, so the visibility lists bots use are current.

Deliberate one-way links

  • The crate stack by crate 737 near (1400, 10): master links 97 <-> 3081 <-> 3744 both ways; this PR keeps the climbs
    97 -> 3081 -> 3744 up the plywood sheet onto the crate and cuts the descents 3081 -> 97 and 3744 -> 3081. 3081 is the
    sheet's top edge, 25 x 10 u, where no bot can be placed, so 3081 -> 97 cannot be walked; restored, the drop 3744 -> 3081
    failed (Support fell 5 of 5, Assault stuck 4-5 of 5), and the crate top has its own drops to the floor (5 of 5, every
    class). No bot stepped down either cut link on master's mesh in the A/B below.

How it was tested

  • Reachability of the final file:
    • every spawn reaches every objective for both teams (13 of 13); no route is more than 10 % longer than master's
    • no dead end, no area a class can enter and not leave, no one-way climb of 60 u or more
    • the two areas no spawn reaches, near (112, 950, 107), are the same as master's
    • ghost spawn 9 at (512, -2, 38), under the tank's body, is 50 u from the nearest area (on master an area under the
      body covered it). On neo master, with the ghost pinned there, 13 matches a mesh (6 in the A/B below, 7 in separate
      runs): the ghost was taken in 9 of 13 on master (median 62 s after the round went live) and 11 of 13 on this mesh
      (median 68 s, first carries 23-83 s). Within 128 u of the tank, in the separate run's 6 matches: 1.33 events a match on master, 0 here.
  • Falls. The map has no trigger_hurt; fall deaths are fall damage. In the A/B below, 5 on master and 11 here in
    54 matches (paired x1.08 [0.99, 1.20]; two-sided binomial 11 of 16, p 0.21), spread: 2 and 5 by the culvert and area
    423, 0 and 3 off the strip at z 363 near (75..850, -560) (under "Known, not changed"), 1 and 1 at the plywood drop,
    2 and 2 elsewhere. The research build read 9 and 13.
  • Engine hull audit of the final file (every level link swept with a player hull in game):
    BLOCKED_LINKS map=ntre_sentinel_ctg level_pairs=2075 oneway=0 keep=7 cut=0 area=0 check=0 dynamic=0 entity=0 one_way_drops=116 sinks(any/recon/assault/support)=0/0/0/0 audit_links=4450 mesh_walk_links=4450.
    The 7 kept pairs: ladder 8's foot (3392 / 3733: the ladder is slanted and its only bottom area stands against it), and
    the six links of the walkway slivers 3747, 3750, 3759 and 3761, the only walk route between each ladder-top walkway and
    its platform; two of them (3750 / 3751, 3761 / 3762) are the restored walkway links, which a scripted walk crosses.
  • 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 9 ghost spawns in turn, 6 matches each (54 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 54 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, fall deaths) 51.7 [43.4, 61.3] 9.8 [8.1, 11.6] x0.20 [0.16, 0.26]
stuck events 44.5 [36.7, 53.3] 4.4 [3.2, 5.8] x0.10 [0.07, 0.13]
stuck episodes 8.7 [7.7, 9.7] 1.3 [1.0, 1.7] x0.23 [0.19, 0.27]
no path / fell off the path 2.39 / 4.70 2.39 / 2.74 x1.00 / x0.68
fall deaths 0.09 0.20 x1.08 [0.99, 1.20]
kills 23.6 24.8 x1.05
matches at match end with 0 asserts 54 of 54 54 of 54

Lower on this mesh at every one of the 9 pins and every rank tier (stuck, master / this mesh: Private 48.0 / 3.4,
Corporal 46.3 / 5.1, Sergeant 33.2 / 4.6, Lieutenant 50.1 / 4.7). Master's leading spots, events a match within 128 u,
master -> this mesh: the stair handrails at (-908, -877) 9.30 -> 0 and (-908, 869) 8.09 -> 0; the east balcony 2.26 ->
0.28 and the west 2.20 -> 0.35 (mostly bots falling off the walkways above); the platform handrail at (41, 219) 2.06 ->
0.04; the blockade by area 423 1.80 -> 0.80; the spider tank 0.78 -> 0; ladder 6's pit 0.48 -> 0 and ladder 3's 0.26 ->
0.02. No spot on this mesh reaches 1 event a match; the highest is area 423, 0.80, mostly bots in a fight.

The same comparison on the harness's research build (10-08)

Neo master of 10-08 plus the open bot PRs of the time (#2170, #2175, #2176 among them) and further research bot changes;
same design, without the rank-tier rotation.

a match master this mesh
all events (stuck, fell off the path, no path, fall deaths) 24.8 [20.2, 30.1] 6.4 [5.4, 7.5]
stuck events 20.1 2.6
stuck episodes 4.1 0.9
no path / fell off the path 0.41 / 4.13 0.44 / 3.15
fall deaths 0.17 0.24
kills 24.4 23.6
matches at match end with 0 asserts 54 of 54 54 of 54

Spots there, master -> this mesh: the stair handrails 5.81 -> 0 and 5.70 -> 0; ladder 6's pit 1.78 -> 0.07 and ladder 3's
0.61 -> 0.09; the platform handrail 1.22 -> 0; area 423 1.00 -> 0.31; the east balcony 0.98 -> 0.52 and the west 0.80 ->
0.43; the spider tank 0.31 -> 0.06. With #2176's last change (stand up below a ladder's hanging foot to mount it), stuck
events near ladders on this mesh went from 16.6 to 5.3 a match against the branch without it.

An earlier revision against master (research build)

The earlier revision lacked the culvert, walkway, cement-bag, crate and tank edits. Same design with 3 matches a pin
(27 a mesh), 2 rounds of 3 minutes: stuck events 59.3 -> 12.5 a match (paired x0.22, 95 % interval [0.16, 0.29], 26
pairs down, 0 up); fell off the path 10.8 -> 8.5; no path 0.9 -> 1.1; kills 48.9 and 48.9. All 54 matches reached match
end with 0 asserts. Intermediate revisions carrying the culvert, walkway, cement-bag and crate edits, compared with that
revision or with each other, read neutral on the whole map in four batches (x0.92 to x1.25, every interval spanning 1).

Known, not changed

  • The cover by crate 737 (areas 1220 / 3089): bots retreating to cover crowd its one hiding spot, 0.50 events a
    match on neo master in the A/B above (master 0.93), 2.15 in one earlier 27-match batch. PRECISE on the cover areas made it worse.
  • The drop from 1007 to 3365 under a plywood sheet near (135, 404, 365), areas 86 /
    3731: 0.41 events a match in the A/B above (master 0.31), 1.63 in one earlier 27-match batch. The engine audit reads
    no lane clear; in a scripted walk Recons crossed it 6 of 10 times (Assault 2, Support 0-2), so it is not cut.
  • Area 423 by a blockade and a pillar near (983, -671, 320): bots crowded it in earlier batches (1.56 events a
    match in one); in the A/B above 0.80 events a match, mostly bots in a fight (master 1.80).
  • Ladder 1's foot at area 359: no event in the A/B above on either mesh; 1.89 in one earlier 27-match batch, all in
    one match.
  • Ladders 3 and 6: restoring them, against the mesh without them, measured x1.66 [1.08, 2.82] stuck events: bots
    walking past ladder 3's top at the shaft floor were grabbed by it. They are kept so every ladder brush has its ladder,
    with the pits under them AVOID. In the A/B above, the pits read 0.02 events a match (master 0.74).
  • Drops off the strip at z 363 near (75..850, -575..-550), areas 3577 and 3586 (master's strip pieces joined into two): every
    piece of it has master's drop links to the floor, about 350 u down, on both sides. In the A/B above bots stepped off it
    about as often on both meshes, and 3 fall deaths there on this mesh against 0 on master, which 54 matches cannot
    separate.
  • The spawn rooms cannot be entered by the other team, as on master.

One file; on master this map and ntre_sentinel_jgr load the same
mesh. Against master: 1326 -> 1177 areas, 1,457,821 -> 1,139,619
bytes; stored BSP size now matches the map.

- 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: from the roofs into
  the freight elevators, past a plywood sheet and a blockade, master's
  gap link 1058 -> 2418 past a crate corner.
- The culvert pipes are CROUCH end to end, with a lead-in at each
  mouth.
- The four slivers joining the balcony walkways to their platforms
  are AVOID; drops every class fell past are cut, the west walkway
  gets the drops to the balcony the east side has.
- PRECISE at the cement bags; the cover under crate 737 is fitted to
  its standing room; the handrail sliver near (62, 90) is removed.
- Ladders 3 and 6 are kept, the pits under them AVOID.
- The floor under the spider tank is cut round each piece of its
  collision at hull height, grown by half a hull, as on the JGR map.
- The climbs 97 -> 3081 -> 3744 onto crate 737 stay one way.
- Re-analyzed in game after the edits.

Engine hull audit of this file: oneway 0, cut 0, area 0, check 0,
entity 0, keep 7 (ladder 8's foot 3392 / 3733, and the six links of
the walkway slivers, the only walk route to each ladder top), sinks 0
for every class. 108-match A/B against master, same bot code (30
bots, 9 ghost pins x 6, 1 round, 8 wide): events a match 24.8 ->
6.4, stuck events 20.1 -> 2.6, stuck episodes 4.1 -> 0.9; kills
24.4 / 23.6; all 108 matches ended clean.
@sunzenshen
sunzenshen merged commit c111614 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