Skip to content

ntre_rise_ctg: navmesh rework - #160

Merged
sunzenshen merged 5 commits into
NeotokyoRebuild:masterfrom
sunzenshen:navmesh-rise-release
Oct 14, 2026
Merged

sunzenshen merged 5 commits into
NeotokyoRebuild:masterfrom
sunzenshen:navmesh-rise-release

Conversation

@sunzenshen

@sunzenshen sunzenshen commented Oct 8, 2026 •

Copy link
Copy Markdown
Contributor

ntre_rise_ctg: navmesh rework

One file, neo/maps/nav/ntre_rise_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:

  • NAV_MESH_AVOID annotation penalizes bot path costs neo#2170 ("NAV_MESH_AVOID annotation penalizes bot path costs", merged): the mesh marks 89 areas
    NAV_MESH_AVOID: the basement pool (87) and the balcony rail top above it, so no path drops into the pool as a
    shortcut, and the foot room of ladder 1, whose first rung is 54 u up and where ghost carriers piled up, so paths avoid
    the room unless the ladder saves a long way round. On stock neo master, areas 2720 and 2777 load without AVOID (they
    also carry NAV_MESH_STAIRS, and loading clears the other marks on a STAIRS area); Keep nav area attributes when marking stairs neo#2225 (draft) keeps them.
    The A/B below ran without it: within 100 u of either area, 0.02 and 0.04 events a match on this mesh (one match
    each), 0 on master's; pool areas 0 events a match (master's mesh 0.15).
  • More tweaks to bot ladder approaches, climbs and dismounts neo#2176 ("Fix bot ladder approaches, climbs and dismounts", merged): the mesh's 6 nav ladders.

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

At a glance

master this PR
nav areas 1330 1057
file size 648,467 bytes 402,893 bytes (-38 %)
nav ladders 3 (one with no top) 6, linked up and down
areas no spawn reaches over any link 24 in 7 pockets 21 in 9
the same, links any class plans (climbs up to 65 u) 241 in 13 22 in 10
per class: Recon / Assault / Support 224 / 247 / 255 22 / 29 / 74
areas entered with no way back 21 0
objectives reached only over links no class plans ghost spawn 1, capture zones 1 and 4 none
bot events a match on neo master (stuck, fell off the path, no path; 48 matches) 27.7 10.1
stuck episodes a match on neo master 3.69 2.12
deaths to the map's trigger_hurt a match 0 0
engine hull audit, level pairs blocked and not resolved not run 0 (6 kept with a reason, 15 breakables / a door)

What changed

  • Capture zones 1 and 4 are reachable. Their decks are reached by prop switchback staircases that master crossed
    with one 66-76 u jump link (zone 1) or not at all (zone 4). Each flight gets a sloped area over its steps, linked both
    ways to its landing and to the floor or deck. Ghost spawn 1 is reachable too: bots picked up the ghost in 48 of 48
    matches here, 36 of 48 on master's mesh.
  • Ladders 3 -> 6, each linked at both ends. Master's ladder near (730, -807) has no top area and sits in a 4-area
    pocket with no link to the rest of the mesh; its ladder is removed, the ledge kept (below).
  • Ladder 4's top on its wall cap. The ladder rises 30 u above the top floor over a 16 u wall cap, under a 48 u hatch
    only a crouching Recon fits. A CROUCH area on the cap (3589, z -344) carries the ladder's top, linked to the floor
    behind it by a 30 u climb. With Jinrai spawned at the top and the ghost at the foot, 8 matches each: bots reached the
    foot 19 times with it and 14 without, stuck events at the top 4 against 1,839, ghost picked up at 15.9 s against
    21.8 s; every descent was a Recon.
  • The west-wall drop cut. Master's drop 3548 -> 3542 lands 158 u down on a 24 u ledge over the drop west of
    x -961; bots overshot it and fell to the trigger_hurt (0.87 deaths a match with the drop, NSF bots chasing the ghost
    carrier). It is cut, with the drop 3305 -> 642 above it, whose areas had no other way out.
  • The ledge near (600, -790, -424). Recons reach it off the ramp east of it (area 118). Master's four areas there
    (190, 778, 1902, 1907) are kept, now with a one-way drop to the floor below (1907 -> 604), so a bot that gets up has a
    path down.
  • The basement fountain. Bots dropped in off the balcony rail and had no way out. A strip on its curb, the handrail
    top and the step outside give the 43 u climb out the fence allows; the pool is AVOID so no path uses it as a shortcut.
  • Drops cut where no bot can make them: the drops from areas 3569 and 3570 through 1 hp func_breakable floor
    panels, where bots walked to the panel rim and pressed into the wall, and into the walled pit 415 / 3570, whose only
    floor exit is a Recon climb. The climb out stays, for a Recon who falls in.
  • The beam near (-386, -274). A 4 u beam falls at 45 degrees to the floor across this mesh's strip 3374 (master's
    areas there are laid out differently); on an earlier revision, bots walking under it pressed the beam. The strip is
    now split, its middle (3588) CROUCH. No test match had an event there.
  • Removed: a vent-duct pocket near (590, -420, -426) that no link reaches (bots chasing a target there logged "no
    path"), slivers merged into their neighbors, and islands no spawn reaches. Also the raised bamboo bed near
    (1025, -100, -1047), 14 areas on a displacement planter 72 u above the floor: its only way in was a Recon climb from
    a strip inside the bench beside it (removed too), and three of its areas sit in bamboo clumps.
  • Engine hull audit rows resolved: pairs it reads clear both ways get their missing direction back; pairs it reads
    blocked both ways (sofas, a copier, a crate, a water cooler, a stair handrail, a table top) are cut; floor strips
    inside a prop or wall (a copier, file boxes, a forklift, a handrail, the balcony wall, under a sofa) are removed.
  • Marks: OBSTACLE_TOP 67 -> 8, NO_MERGE 113 -> 21, CROUCH 20 -> 15.
  • Ids follow master's: 1042 of 1057 areas keep a master id, 941 of them at the same place; new areas take the next
    free ids. Ladders 1 and 2 keep their ids; ladder 3 is new and reuses the id of master's ladder 3, which was removed
    with its pocket.
  • Re-analyzed in game after the edits, so the visibility lists bots use are current.

How it was tested

  • Reachability: every spawn reaches every objective for both teams; no dead end, no area a class enters and cannot
    leave, no one-way climb of 60 u or more except a 200 u walk link up ladder 3's shaft, which no class
    takes. Two deliberate one-way edges: the pit climb above, and a level crossing past an AC unit near (762, 475, -80)
    that every class walks one way only (Support stuck on the unit the other way). Two markers sit off the mesh as on
    master (capture zone 3 by 9 u, ghost spawn 2 by 46 u). Routes are within 5 % of master's but one: capture zone 3 for
    defenders, 3,593 -> 3,975 u.
  • Engine hull audit of this file (every level link swept with a player hull in game):
    BLOCKED_LINKS map=ntre_rise_ctg level_pairs=1562 oneway=0 keep=6 cut=0 area=0 check=0 dynamic=0 entity=15 one_way_drops=43 sinks(any/recon/assault/support)=0/0/0/0 audit_links=3397 mesh_walk_links=3397.
    The 15 entity rows are breakable panels, a breakable on the ledge above and a fence door, runtime state. The 6 kept:
    the AC unit crossing above, the feet of the four stair flights to capture zones 1 and 4 (the audit's stand test
    starts inside the slope; every class walks each flight), and a 16-24 u ledge on the west wall at z -864, where a
    player stands with its center over the drop.
  • Master against this mesh, neo master's bot code (092203f36, no open PR, Release). Byte-identical copies of the
    map, one carrying each .nav, matches interleaved: CTG, the ghost pinned at each of the 4 ghost spawns in turn, 30
    bots, default weapon damage, 1 round, all players at one XP rank (rotated over the four ranks across the spawns), 8
    matches at a time, 48 matches a mesh. Every match reached match end with 0 asserts. Events are stuck events
    (OnStuck plus FAIL_STUCK, without the spawn crush at round start and weapon scavenging), "fell off the path" 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. Ratios are paired by spawn and pass, with 95 % intervals.
a match (48 each) master this mesh this / master
bot events 27.7 10.1 x0.48 [0.32, 0.73]
stuck events 24.2 9.0 x0.50 [0.32, 0.77]
stuck episodes 3.69 2.12 x0.71 [0.55, 0.90]
no path / fell off the path 1.88 / 1.62 1.02 / 0.10
deaths to trigger_hurt 0 0
kills 26.2 25.4

Every ghost spawn is lower (x0.32-0.74), and every XP rank (stuck a match 17-38 on master, 6-12 here).

  • The leading master spot, the metal wall and door near (-227, -496), 8.33 events a match, is 2.69 here.
  • Ladder 1's foot near (1260, 1200): 1.38 events a match on master, 0.38 here. The off-mesh ledge near (640, -720,
    -424): 1.08 on master, 0.02 here.
Earlier batches, the harness's research build

These ran the harness's research build (neo master plus the open bot PRs and further research bot changes), not
master's bot code. 48 matches a mesh against master, on the previous revision of this file (1052 areas, before the
west-wall drop cut and the ladder 4 cap): events a match 8.9 [5.5, 13.1] (master) -> 6.5 [1.3, 15.8],
stuck episodes 1.3 -> 0.5. An older revision, 72 matches a mesh (1079 areas): 13.3 -> 5.7, stuck episodes 1.28 -> 1.04.
On neo master's own code the previous revision was not better than master's mesh (104 matches a mesh: events x0.84
[0.68, 1.05], stuck episodes x1.22 [1.07, 1.40], 0.87 trigger_hurt deaths a match), which the west-wall drop cut
fixes.

Known, not changed

  • Ladder 4's hatch fits only a crouching Recon; Assault and Support going down take another way. Going down is rare
    in play: 1 bot at its top in 64 matches, none rode it down.
  • Ladders 3 and 4, going up. On master's bot code, bots plan the climb, stand at the foot and press the wall:
    0.69 events a match at ladder 3's foot near (-237, -899) in 9 of 48 matches (Recons on the 56 u block beside the foot),
    0.04 at ladder 4's foot in 1 of 48 (0.43 a match over 104 matches on the previous revision, bots on area 145 pressing
    the shaft's south side); master has no ladder at either. The ladders are the only way onto the -336 / -374 floor
    between them, so both stay linked up; the climbs are bot code, which no mesh edit reaches. Ladder 3's 200 u walk link
    up the shaft stays, which no class takes.
  • Ladder 1's foot near (1260, 1200), beside the freight-elevator prop: 0.38 events a match here, 1.38 on master.
    The first rung is 54 u above the floor, and the bot ladder code does not reliably mount a ladder that high; a bot
    that planned up the ladder can stand under it to the round's end. That is bot code, which no mesh edit reaches. The
    ladder is master's, and the foot is master's two floor areas merged into one.
  • 21 areas in 9 pockets no spawn reaches over any link: the west-wall ledges below the cut drop (9), master's ledge areas
    above (4, reached off the mesh), the walled pit above, and five pockets of one or two areas with a link out and none
    in. Support also misses 52 more, behind 47-65 u climbs and the ladders. No objective in any of them.

One file. Against master: 1330 -> 1075 areas, 648,467 -> 434,425
bytes; nav ladders 3 -> 6; areas no spawn reaches over any link
24 -> 8. Master's file was built for an older BSP and reads stale.

- Capture zones 1 and 4 get areas over their prop staircases, so
  every class reaches them; ghost spawn 1 is reachable too.
- Ladders 3 -> 6, linked up and down.
- The basement fountain gets a way out (curb strip, handrail top);
  the pool is AVOID so no path uses it as a shortcut, as is the foot
  room of ladder 1.
- Drops through breakable floor panels (3569, 3570) and into the
  walled 415 pit are cut; a vent-duct pocket no link reaches is
  removed; the strip under the slanted beam near (-386,-274) is
  split with a CROUCH middle (3588).
- Links an engine hull audit reads blocked both ways are cut; ones
  it reads clear get their missing direction back.
- Area and ladder ids follow master's where an area is the same
  place. Re-analyzed in game.
The engine hull audit of the previous file listed 23 unresolved level
pairs. Each is now cut, removed or kept with a stated reason:

- Cut both ways where no lane is clear either way and both areas keep
  other links: 238/1050 (water cooler), 465/3040 (stair handrail),
  671/1385, 544/1989 (under a table top).
- Removed: floor strips inside a copier, file boxes, a forklift, a
  stair handrail and the balcony wall (2583, 1378, 2263, 3075,
  1318-1320), and 2190 under a three-seat sofa.
- Removed the raised bamboo bed near (1025, -100): its only way in was
  a climb from a strip inside the bench (2954), and three of its areas
  sit in bamboo clumps. No link reaches it without that strip.
- Kept: the four stair flight feet to capture zones 1 and 4 (the audit
  stands inside the slope; every class walks them), the narrow west
  ledge 3550/3551, and the one-way 485 -> 255 past an AC unit that
  every class walks this way only.

1075 -> 1052 areas. Audit of this file: oneway 0, cut 0, area 0,
check 0, keep 6, entity 14 (breakables and a fence door), sinks 0 for
every class. 96-match survey against master, same bot code (30 bots,
4 ghost pins, 1 round): events a match 8.9 -> 6.5, stuck episodes
1.3 -> 0.5, no path 0.62 -> 0.15; all matches ended clean.
On upstream neo master's bot code the previous file sent NSF bots down
master's drop 3548 -> 3542, 158 u onto a 24 u ledge over the void west
of x -961: 0.87 trigger_hurt deaths a match (90 in 104 matches,
master's mesh 0), and their round-start rush crowded areas 7 / 3387 /
314 on the way. Ladder 3 up and ladder 4 up drew bots that pressed
the walls at their feet (1.10 and 0.43 events a match, master 0).

- Cut 3548 -> 3542 and the drop 3305 -> 642 into 642 / 3301 / 3548,
  whose only way out was that drop (it would be a sink).
- Ladders 3 and 4 down only: removed from their bottom areas' up
  lists (797, 2181). The -336 / -374 floor between them (40 areas,
  no objective) is again reached by no link a class plans, as on
  master.
- Restored master's ledge areas 190, 778, 1902, 1907 near (600, -790,
  -424), with a one-way drop 1907 -> 604, so a bot that gets up there
  off the ramp has a path down.

1052 -> 1056 areas, ids master's. nav_analyze FRESH; hull audit
oneway 0, cut 0, keep 6, entity 15, sinks 0 for every class;
navconnect gate PASS. Master's mesh against this file, neo master
092203f36, 36 matches each (ri46-fin, ri46-f2): events a match 29.6 ->
8.0 (x0.35), stuck episodes 3.39 -> 2.14 (x0.70), falls 0, 0 asserts.
Ladder 4 (355, 376) rises 30 u above the top floor over a 16 u wall
cap (x 336-352) under a header at z -296: its top is a 48 u hatch.
The mesh put the top on 771, behind the cap, where a hull never
touches the ladder, so bots going down pressed the cap until a stuck
jump took them over it.

Add a CROUCH area on the cap (3589, z -344), link it to 771 (a 30 u
climb), move the ladder's top onto it at the brush top (-344), and
pull 771's east edge to x 316 so the climb's launch point is off the
wall (research 4fd91bc, re-applied to this file).

On neo master 092203f36, Jinrai spawned at the top and the ghost
at the foot, 8 runs a file (ri46-l4s): reached the foot 14 -> 19,
stuck events at the top 1839 -> 4, ghost picked up at 21.8 -> 15.9 s.
Only Recon fits the hatch. nav_analyze FRESH; hull audit oneway 0,
keep 6, entity 15, sinks 0; navconnect gate PASS.
Link ladders 3 and 4 up again from their bottom areas (797, 2181), as
on the PR head. Down only, the -336 / -374 floor between them was
reached by no link a class plans (60 areas unreached over any link);
with the up links it is 21, the 8 of the PR head plus the west-wall
ledges below the cut drop and master's ledge areas near (600, -790).

On neo master's bot code the up climbs do not work yet: bots plan
the climb, stand at the foot and press the wall. The feet ship as
known, a research item for the ladder code. The drop cut and the
ladder 4 cap stay.

nav_analyze FRESH; hull audit oneway 0, keep 6, entity 15, sinks 0;
navconnect gate PASS. Master's mesh against this file, neo master
092203f36, 48 matches each (ri46-up, ri46-up2): events a match
27.7 -> 10.1 (x0.48), stuck episodes 3.69 -> 2.12 (x0.71), falls 0,
0 asserts; ladder 3 foot 0.69 a match, ladder 4 foot 0.04.
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