Skip to content

ntre_dawn_ctg: navmesh rework - #151

Merged
sunzenshen merged 6 commits into
NeotokyoRebuild:masterfrom
sunzenshen:navmesh-dawn-release
Oct 14, 2026
Merged

sunzenshen merged 6 commits into
NeotokyoRebuild:masterfrom
sunzenshen:navmesh-dawn-release

Conversation

@sunzenshen

@sunzenshen sunzenshen commented Oct 1, 2026 •

Copy link
Copy Markdown
Contributor

ntre_dawn_ctg: navmesh rework

One file, neo/maps/nav/ntre_dawn_ctg.nav. It was measured on upstream master plus the draft NeotokyoRebuild/neo#2176 (then only its unwanted-ladder release, now its changes 1 and 7) and NeotokyoRebuild/neo#2186 ("Bots skip weapons they cannot reach", merged since), with harness logging added; the final file was measured again on the harness's research build of the bot code (those PRs plus the other open bot code PRs, among them NeotokyoRebuild/neo#2197). ntre_dusk_ctg has the same layout and gets the same mesh in its own PR (#150).

Dependencies and status

Needs (worse than master, or broken, without it):

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

  • Bots detour around physics/animation props neo#2197 ("Bots detour around physics/animation props", ready for review): the two office chairs, which move and so are not cut out of the mesh.
  • More tweaks to bot ladder approaches, climbs and dismounts neo#2176 ("Fix bot ladder approaches, climbs and dismounts", draft): ladders 1, 2 and 4. In its ladder tests on this mesh (12 bots, a team sent up one ladder, three runs), climbs up ladder 4 finished 18 of 18 (master 15 of 19), up ladder 2 26 of 26 (master 7 of 17, 8 of them falling from the top), and up ladder 1, the 7 u wall cap, 12 of 20 (master 0 of 1). In matches on this map and ntre_dusk_ctg, its dismount change cut ladder 4 climbs kicked backwards off the top from 71 of 627 to 4 of 604 (see "Known, not changed").

Pending before review:

  • Nothing: ready for review.

At a glance

master this PR
nav areas 1358 1100
file size 1,168,376 bytes 773,980 bytes (-34 %)
areas the engine blocks at every round start 28 2
areas no spawn can reach 58 in 20 pockets 20 in 7 pockets (see below)
nav ladders 4 4; ladder 1 now leads somewhere (see "Ladder 1")
bot stuck events a match, 1 round (see below) 6.95 1.55
bot stuck events a match, 2 rounds, before the 116 step cut 34.9 15.2

Six commits:

  1. Rework - the mesh itself.
  2. Id alignment with master - ids only, so an id-keyed diff against master reads sensibly.
  3. Review fixes - one-way walk links, the area under the rabbitfrog vehicle and climbs no bot makes, from an outside review (section 3).
  4. Blocked links - drop backs restored, and areas no player hull fits in removed, from the engine's hull audit of commit 3 (section 3).
  5. The bamboo pocket - a drop no player can make cut, and the pocket's way out moved onto the lane a player fits through (section 3, last part).
  6. The 116 step - 116 -> 1165, a walk link down a ~27 u displacement step, cut one way (116 still reaches 1165 through 4380 and 4159; 1165 -> 116 stays). A bot spawned on 116 walked off at 1165's west edge and wedged with no ground under it. Twin runs at the ghost pins that spawn bots on 116, with the research build's wedge escape (a bot code experiment that hops a wedged bot free) switched off, 18 runs a mesh on both maps (6 on this one): wedges 2 -> 0, both on ntre_dusk_ctg.

1. What changed

  • Sliver areas merged into their neighbors on the same floor, and areas the engine blocks at round start (a prop or brush over their center) cut away. On master the engine blocks 28 areas at every round start; here 2.
  • The garden wall (the wall with the ivy ladder, south of the walkway near (240..500, 4630)). On master it was the largest stuck spot: 14.3 stuck events a match, 1.6 bot episodes a round. Bots on the walkway took the drop to the garden through the wall's west end (603 -> 601) or jumped at the wall's 8 u cap, and pressed into the wall. Both are cut; the garden is reached round the wall or by ladder 1. Here: 0.
  • Walk links a player hull cannot cross are cut: past the feet of the rabbitfrog vehicle near (2050,3900) (a helicopter that lands at round start and stays parked; see "Known, not changed"), between bamboo stalks near (1935,3525) and (450,1540), and through the bamboo row near (1650,4160), which is now crossed at its east end, with the areas beside it a half hull off the stalks. Two of these cuts (near (1935,3525) and at the vehicle) were already on ntre_dusk_ctg's research mesh and are applied here the same way; the engine's hull test finds the same blocked lanes on both maps.
  • Ladder 1 (see below).
  • Pockets: a 13 x 12 u sliver near (430,1555) that bots could walk into but not out of gets a return link; a box top no spawn reaches, with no way out, and an isolated area under props are removed.
  • The 116 step near (2176,4300): the walk link 116 -> 1165 down a ~27 u displacement step is cut one way. Paths from 116 entered 1165, a 25 u strip, at its west edge, over the steepest part of the step, where a bot can wedge with no ground under it. 116 still reaches 1165 through 4380 and 4159, and 1165 -> 116 stays.
  • Re-analyzed in game after the edits, so the per-area visibility lists bots use for what they can see are current.

2. Id alignment

1117 of the 1123 areas carry the id of the master area they match, including the wall cap at ladder 1's top (4424). All four ladders keep their ids. Areas are matched only within 64 u of height. Geometry, connections, attributes and the analysis data are unchanged by this step (verified topology-identical).

3. Review fixes

  • One-way walk links. The pass that cut walk links over railings and props cut one direction of some pairs and kept the other, so a bot following the kept direction walked into the same obstacle. Each pair was swept by the engine with a player hull in both directions:
    • blocked both ways, now cut both ways: seven pairs, at the rabbitfrog vehicle near (2000,3925) (3), at bamboo stalks near (1550,3880) and (1935,3535) (3) and at a tree near (1875,4210) (1)
    • clear both ways, the missing direction restored: six pairs, among them two narrow ones, beside the rabbitfrog (4152 / 691) and between bamboo stalks near (2260,4000) (3859 / 3858); two of the six (4127 and 4128 to 455, near (840,2400)) were one-way on master
  • The area under the rabbitfrog vehicle (694, near (2050,3900)) is deleted. Once it has landed, the vehicle stands on it for the rest of the round: the engine's hull test finds no room to stand on 287 of its 325 sample points. The areas round it were already joined to each other.
  • Climbs no bot makes. The 10 u wall cap near (30,4560) (4382) could only be reached by a 92 u climb from the ground below it; it is deleted with its climb. The 70 u climb onto the roof of the APC near (-2240,2860) (1386) is above every class's limit (a Recon plans climbs under 68 u) and is removed; the roof stays as a pocket bots can drop from, like the others.
  • Every other area keeps its id and geometry.
  • Blocked links (commit 4). The engine's hull audit of commit 3 (a player hull stood on every area and swept across every link, in the server), and a link check against master:
    • six climbs of 19-38 u had lost their drop back; the climb reads clear on some or every lane, so the drop back is restored. One of them drops off a crouch strip on a concrete barrier near (-2150,2825) onto an area bots reach on the level and never visited in 100 matches; the audit sweeps a crouched hull there, so it was checked in the matches below
    • areas no player hull stands in (89-100 % of stand samples blocked, seldom or never visited) are deleted: 12 x 12 to 25 x 25 u squares inside bamboo clumps, a street lamp, a temple lantern, a wooden wall, a desk, wall corners
    • 4143, beside the rabbitfrog vehicle near (1975,3910), is deleted: the parked vehicle blocks 224 of its 247 stand samples. The areas round the vehicle keep their other links
    • three pairs blocked both ways that bots never cross are cut both ways (bamboo)
    • kept, bots cross them: a bamboo row near (2250,4245), the work truck near (-1600,3262), a displacement slope; left as they stand at map load, for the bot code's runtime prop avoidance: the office chairs near (-812,925) and the breakable glass near (-650,1700)
  • The bamboo pocket (commit 5). A pocket under a 60 u ledge near (250,1830), beside a bamboo clump (a static prop), had two drops into it. Over the east one (into 2518) a stalk of the clump overhangs the space a player falls through, so the bots' path code finds no clear spot to drop and puts the landing 70 u past the ledge, beyond the clump. Bots took that drop, landed against the stalks and kept pushing toward the landing: 22 of the 26 stuck episodes at the pocket in 400 matches on commit 4 (both maps) started there, the other 4 at its way out (below).
    • that drop and the climb back up are cut: the engine's hull test reads both blocked on every lane, and no bot made either as planned. The pocket is still reached by the west drop (into 2506) and from the ground east of it (211)
    • the pocket's way out (2506 -> 2518 -> 211) is moved 9 u north, onto the 10 u lane where a player hull fits between the ledge wall and the stalks: the path crossed from 2506 to 2518 at a point no hull can stand on. 2506 keeps its south part, where bots landing from the drop end up. The hull test now reads 2506 -> 2518 -> 211 clear on every lane (1 of 5 before)

Ladder 1

Ladder 1 is the ivy wall on the garden's north side, (262..489, 4611..4623), from the garden floor (z -251) to the wall's 8 u wide cap (z -160); the walkway north of the wall is 45-50 u below the cap. On master the nav ladder covered only the top 42 % of the climb, and its top joined the cap both ways to the walkway. On the branch this mesh came from, the cap had no walk links at all, so the ladder led nowhere.

  • The ladder's bottom is on the garden floor, at the area in the gap between the two benches at its foot.
  • The cap drops to the walkway north of the wall (master's exits).
  • The jumps from the walkway up onto the cap stay cut, so the ladder is a climb route. With them restored as on master, the ladder could also be taken down, but in 60 test matches with that version no bot did, and stuck events were x1.23 of this PR's in both comparisons ([0.90, 1.69] and [0.86, 1.85], pooled with dawn).

Bots climbed it 16 times in 20 matches (dusk: 19 in 20); of the 57 climbs on both maps and both versions, 52 reached the walkway within 8 s. No stuck event on any area around the wall or the ladder.

How it was tested

  • Reachability:

    • every spawn can reach every other spawn
    • every objective is reachable
    • 20 areas no spawn can reach, in 7 pockets, all of which lead back into the mesh: roof and ledge pockets bots can only drop from (master has 58 in 20 pockets)
    • no area that can be entered and not left, for any class, counting only the climbs each class plans (Recon under 68 u, Assault 48 u, Support 43 u), and no area reached only by a climb above those limits
    • no walk link between two areas at the same level runs one way, and no climb a class plans lacks its drop back, except the step up from 1165 to 116, whose way down is the cut above (section 1)
    • the engine hull audit of this mesh: of 1845 pairs of areas at the same height, the few read blocked both ways are the kept links above, the office chairs and the glass (BLOCKED_LINKS map=ntre_dawn_ctg level_pairs=1845 oneway=0 keep=0 cut=1 area=2 check=1 entity=4)
    • the engine blocks 2 areas at every round start (master: 28): two crawl areas under the wooden bridge near (-25,4430); the crawl stays open through the three areas beside them, and master blocks one of the two as well
  • Falls. The map has no trigger_hurt and no other hurt volume, and no drop that kills a bot at full health (the deepest drop link is 233 u, 2 damage). No fall marks were needed.

  • Master against the final file, 1 round. The same twin setup and stuck count as below, on the harness's research build of the bot code: CTG, 1 round with the ghost pinned at each of the 5 ghost spawns, 4 runs each, 30 bots, default weapon damage, the game's default 15 s freeze time, 8 matches at a time, the arms interleaved. Rates a match are about half those of the 2-round runs below. All 40 matches reached match end with 0 asserts and no crash.

    • stuck events 6.95 -> 1.55 a match (paired x0.32, 95 % interval [0.18, 0.60], 16 of 20 pairs down, 4 up); bot episodes 2.60 -> 0.55 a match
    • FAIL_NO_PATH_EXISTS move failures 0.40 -> 0.50 a match (x1.07 [0.82, 1.40]); "fell off the path" failures 1.15 -> 1.60 (x1.31 [1.00, 1.73])
    • kills 24.1 -> 25.0 a match (x1.04 [0.99, 1.09]); ghost captures 2 -> 0 of 20 rounds; no fall deaths
    • at the spots: the garden wall 3.3 stuck events a match -> 0; the bamboo pocket 2 FAIL_NO_PATH_EXISTS move failures in 20 matches -> 0; at the 116 step no event of any kind on either mesh (bots stood on 1165 in 9 of 20 matches, master 13, and on 116 in all 20)
  • Master against this mesh before the 116 step cut, 2 rounds, same bot code. Byte-identical copies of the map, one carrying each .nav, run back to back. CTG, 2 rounds of 3 minutes with the ghost pinned at each of the 5 ghost spawns in turn, 4 runs each, 30 bots, default weapon damage, 8 matches at a time. Every match reached match end with 0 asserts and no crash (368 matches on dusk and dawn in all, probes and the other revisions included). The stuck count is OnStuck plus FAIL_STUCK move failures, excluding the spawn crush at round start and the weapon-scavenging behavior.

    • stuck events 34.9 -> 15.2 a match (paired x0.41, 95 % interval [0.28, 0.58], 18 of 20 pairs down, 2 up)
    • without #2176 (the unwanted-ladder release switched off in both arms, so upstream ladder code; 2 runs a spawn): 31.4 -> 14.7 (x0.49 [0.27, 0.95], 8 of 10 pairs down, 2 up)
    • FAIL_NO_PATH_EXISTS move failures 5.6 -> 4.2 a match, paired x0.87 [0.56, 1.37] (without #2176 4.8 -> 3.1); "fell off the path" failures 0.7 -> 0.6
    • kills 49.0 -> 49.3 a match (x1.00 [0.95, 1.06]); ghost captures 8 of 53 rounds -> 4 of 55 (over both maps and both comparisons 17 of 166 -> 17 of 165); team kill ratio (Jinrai / NSF enemy kills) 1.05 -> 0.99; deaths to the world (fall damage on low health) 1 -> 1 in 20 matches
    • bots still see and shoot across the mesh: 94 % of kills are between bots in different nav areas (master 94 %), 82 % in non-adjacent areas (master 83 %); median kill distance 413 u (master 402 u)
    • at the spots: the garden wall 14.3 stuck events a match -> 0; the dead-end room near (775,940) 3.6 -> 1.9; ladder 4's top 2.3 -> 1.6 (0.28 -> 0.20 bot episodes a round)
  • The review fixes (section 3) against the previous revision of this PR, one comparison. The same twin setup with the previous and the fixed .nav, the ghost pinned at each of the 5 ghost spawns, 10 matches each, 30 bots, default weapon damage, 8 matches at a time, on the same bot code as above:

    • stuck events 20.4 -> 14.5 a match (paired x1.21, 95 % interval [0.86, 1.73], 22 of 50 pairs down, 28 up). The rises are at three spots listed under "Known, not changed" below, none near an edit (the office chairs, the dead-end room and ladder 4's top, which swing from match to match); without them, 13.8 -> 6.9 (x0.93 [0.61, 1.38])
    • stuck events at the ends of the edited links and around the rabbitfrog vehicle 326 -> 4 in 50 matches: on the previous revision, bots trapped under the rabbitfrog vehicle made 325 stuck events in 3 of the 50 matches, up to 156 in one. Those traps came from the test harness's 2 s freeze time: the bots walked under the vehicle while it was still landing (see "Known, not changed")
    • FAIL_NO_PATH_EXISTS move failures 5.1 -> 5.3 a match; "fell off the path" 0.7 -> 0.5; kills 49.0 -> 47.7 a match; ghost captures 9 -> 13 of 100 rounds; 93 / 94 % of kills between different nav areas and 81 / 82 % between non-adjacent ones
    • no fall deaths, no asserts, no crashes in 100 matches
  • Commit 4 against commit 3, one comparison. The same twin setup, the ghost pinned at each of the 5 ghost spawns, 5 matches each, 30 bots, default weapon damage, 8 matches at a time, on the same bot code:

    • stuck events 18.8 -> 15.9 a match (paired x0.90, 95 % interval [0.59, 1.36], 14 of 25 pairs down, 11 up); without the three spots under "Known, not changed", x0.80 [0.44, 1.41]
    • stuck events at the edited links and areas 19 -> 15 in 25 matches; in the gap under the rabbitfrog vehicle 63 (2 matches) -> 0
    • FAIL_NO_PATH_EXISTS move failures 6.9 -> 7.4 a match; "fell off the path" 0.5 -> 0.7; kills 49.2 -> 49.2 a match; ghost captures 3 -> 5 of 50 rounds; 94 / 95 % of kills between different nav areas and 84 % between non-adjacent ones on both
    • no fall deaths, no asserts, no crashes in 50 matches
  • Commit 5 against commit 4, one comparison. The same twin setup, the ghost pinned at each of the 5 ghost spawns, 10 matches each, 30 bots, default weapon damage, the game's default 15 s freeze time, 8 matches at a time, on the harness's research build of the bot code (upstream master plus the bot code PRs, among them #2176, #2197 and #2186 (merged since)):

    • stuck events at the pocket 8 -> 0 in 50 matches (3 bot episodes -> 0; on ntre_dusk_ctg 13 -> 0 in 100)
    • stuck events 10.0 -> 10.1 a match (paired x0.98, 95 % interval [0.74, 1.29], 23 of 50 pairs down, 25 up); without the three spots under "Known, not changed", x1.15 [0.84, 1.57]
    • FAIL_NO_PATH_EXISTS move failures 1.1 -> 1.7 a match; "fell off the path" 3.1 -> 2.8; kills 48.7 -> 48.3 a match; ghost captures 5 -> 4 of 100 rounds; no fall deaths, no asserts, no crashes in 100 matches
    • the alternatives, measured the same way (50 matches each): moving the two areas without the cut left the pocket's stuck events as they were (10 -> 14); moving 2506 wholly onto the lane made the pocket look hidden (it saw 114 areas instead of 209), and bots, which avoid exposed areas, went through it three times as often (11 -> 54); the cut alone left one episode (8 -> 3), at the old crossing into 2518
  • The carve at the rabbitfrog vehicle, at the game's default freeze time (15 s), one comparison. Commit 4 against the same mesh with 694, 4143 and the three pairs through the vehicle put back (two-way), the same twin setup, the ghost pinned at each of the 5 ghost spawns, 5 matches each, 30 bots, default weapon damage, 8 matches at a time (beside another 8-wide batch on the same machine), on the same bot code. No bot was trapped under the vehicle on either mesh; the floor put back costs:

    • at the vehicle 0 -> 137 stuck events in 25 matches (5.5 a match, in 24 of the 25; on ntre_dusk_ctg 0 -> 123), bots pressing its parked feet; the longest episode 10 events
    • stuck events 16.1 -> 18.6 a match (paired x1.29, 95 % interval [0.93, 1.83], 9 of 25 pairs down, 16 up; on ntre_dusk_ctg x2.05 [1.37, 2.99])
    • FAIL_NO_PATH_EXISTS move failures 6.2 -> 4.3 a match; kills 49.1 -> 49.7; ghost captures 7 -> 4 of 50 rounds; no asserts, no crashes in 50 matches

How the pinned-ghost probes work

The offline checks show that the mesh links an area to a spawn. They do not show that a bot will walk there. To test one spot in game, the ghost is placed on it and bots are sent to get it.

  • The ghost is placed on the spot by a server cvar. A harness-only neo patch, used on test builds and not part of this PR or any neo PR, adds sv_neo_ghost_spawn_pos "x y z", which replaces the position of the round's ghost spawn. The map file is not edited.
  • A spot counts as reached when a bot stands within 40 u of it, or picks the ghost up there rather than on the floor below, where a ghost that rolls off a narrow landing ends up. A wider radius would count a bot on a level above or below.
  • Master's mesh runs beside this one on a byte-identical copy of the .bsp under a second name that loads its own .nav, so the same pin runs on both meshes in one batch.

On this map

Both ends of all four ladders were probed (ladder 4's top at both landings), 3 matches each, 12 bots, at a tenth of weapon damage, on the same build. Every probe was reached in 3 of 3 matches on both meshes (first pickup at 10-41 s; ladder 3's top, which bots almost never use, at 101-176 s on both). A ghost pinned on ladder 1's 8 u cap rolls off into the garden, so ladder 1 was checked through the climbs in the comparison above instead.

Known, not changed

  • The rabbitfrog vehicle on the capture zone near (2025,3920) is a prop_dynamic helicopter (rabbitfrog_dynamic.mdl) whose collision moves with its animation. It is re-created at every round start, lands within 10 s, and stays parked until the ghost is captured, when it takes off. With the default 15 s freeze time it has landed before anyone moves, so during play it is a fixed obstacle, and the mesh is carved round its parked footprint (commits 1, 3 and 4; the comparison above). With a freeze time under 10 s, as in the test harness, bots can walk under it while it is landing and stay trapped there until the round ends. That landing phase is left to runtime prop avoidance in bot code.
  • Two office chairs (prop_physics_multiplayer) start in the 100 u corridor near (-725,1275), and bots climb onto them or push them along. Stuck events there 1.5 -> 3.3 a match, bot episodes a round 0.11 -> 0.38; without #2176 3.0 -> 2.4 and 0.39 -> 0.27 (on ntre_dusk_ctg 5.9 -> 3.4 and 0.27 -> 0.40). The chairs move, so the mesh is not cut around them; that is runtime prop avoidance in bot code. Stuck events on physics props across the whole map: 0.25 -> 1.55 a match, without #2176 1.30 -> 0.80.
  • Ladder 4's top (681,1488): a few bots a match slide off the ladder's side onto a ledge under the upper floor's lip, or press the corner of the right-hand landing after dismounting. At master's level on the ladder PR as it was then (0.20 against 0.28 bot episodes a round; without #2176 0.43 against 0.64). #2176 now also takes a climb's exit from the landing the ladder leads to: in 60 matches on this map and ntre_dusk_ctg, climbs kicked backwards off the top went 71 of 627 -> 4 of 604 and stuck events at ladder 4's top 94 -> 30.
  • The dead-end room near (775,940): bots pushed into its doorway by teammates press toward a goal on the other side of its wall. Below master (above) and not a mesh matter.

One file. Against master: 1358 -> 1123 areas, 1,168,376 -> 809,878
bytes; areas the engine blocks at every round start 28 -> 2; areas
no spawn can reach 58 -> 19.

- Sliver areas merged into their neighbors on the same floor, and
  areas the engine blocks at round start (a prop or brush over their
  center) cut away.
- Walk links a player hull cannot cross are cut: the drop from the
  walkway to the garden through the garden wall's west end
  (603 -> 601 near (240,4640)) and the jumps from the walkway onto
  the wall's 8 u cap (master's largest stuck spot), past the feet
  of the rabbitfrog vehicle near (2050,3900), between bamboo stalks
  near (1935,3525) and (450,1540), and through the bamboo row near
  (1650,4160), which is now crossed at its east end with the areas
  beside it a half hull off the stalks.
- Ladder 1, the ivy wall at (375,4617): its top lands on the wall
  cap, which drops to the walkway north of the wall; its bottom is
  on the garden floor between the two benches. A climb route; the
  cap cannot be reached from the walkway.
- A 13 x 12 u sliver with a link in and none out gets a return link;
  a box top and an isolated area nothing reaches are removed.
- Re-analyzed in game after the edits.
Renumbers area and ladder ids only, so an id-keyed diff against
master reads sensibly: 1117 of the 1123 areas and all 4 ladders
carry the id of the master area they match. Areas are matched only
within 64 u of height. Geometry, connections, attributes and the
analyzed visibility data are unchanged (verified topology-identical).
An outside review of this mesh found walk links that run one way
only, and a wall-cap strip reached only by a 92 u climb no class
makes, whose drop back had been cut.

- One-way links, each swept with a player hull in both directions by
  the engine's hull audit: cut both ways the seven pairs blocked both
  ways (the rabbitfrog vehicle, bamboo stalks, a tree);
  restore the missing direction of the six pairs clear both ways.
- Delete 694, the area under the rabbitfrog vehicle near
  (2050, 3900): the vehicle blocks 287 of its 325 hull stand samples,
  its only way out ran into the vehicle, and bots that walked in got
  stuck there. 698 <-> 4152 joins its neighbors round it.
- Delete 4382, the wall cap at (30, 4562), and its 92 u climb from
  3998: nothing else reaches it.
- Remove 760 -> 1386 (70 u, over every class's limit) onto the APC
  at (-2320, 2860); 1386 stays as a drop-only pocket.

Existing areas keep their ids. Re-analyzed in game (same graph,
fresh visibility).
The engine's hull audit (a player hull stood on every area and swept
across every link, in the server) of the previous revision, and
navconnect's link check against master:

- Restore the drop back of six climbs of 19-38 u whose drop had been
  cut: the climb reads clear on some or all lanes.
- Delete areas no player hull stands in: squares inside bamboo
  clumps, a street lamp, a temple lantern, a wooden wall, a desk and
  wall corners, and 4143 beside the rabbitfrog vehicle
  near (1975, 3910), 224 of whose 247 stand samples the vehicle
  blocks: bots walked from it into the gap under the vehicle and
  wedged there.
- Cut three pairs blocked both ways that bots never cross (bamboo).

Kept: links bots cross though the audit reads them blocked (the work
truck, a bamboo row, a displacement slope);
the office chairs and the breakable glass, left as at map load.

Existing areas keep their ids. Re-analyzed in game (same graph,
fresh visibility).
The pocket under the ledge near (250, 1830) beside a bamboo clump (a
static prop) had two drops into it from 156. Over the one into 2518 a
stalk overhangs the space a player falls through, so the bots' path
code found no clear column and put the landing 70 u past the ledge,
beyond the clump: bots dropped, landed against the stalks and pushed
on toward it. Nearly every stuck episode at the pocket started there.
Cut that drop and its climb back; the engine's hull test reads both
blocked on every lane, and no bot made either as planned. The pocket
is still reached by the drop into 2506.

Also move the pocket's way out (2506 -> 2518 -> 211) 9 u north, onto
the lane a player hull fits between the ledge wall and the stalks: the
path crossed from 2506 to 2518 at a point no hull can stand on. 2506
keeps its south part, where bots landing from the drop end up. 2518
now meets 211 on its south edge, so that link faces south.

No area deleted, ids unchanged. Re-analyzed in game (same graph,
fresh visibility).
116 -> 1165 was a walk link down a ~27 u displacement step whose foot
is a crease with the hillside; a bot spawned on 116 walked off at
1165's west edge and wedged there with no ground under it. Cut it one
way: 116 still reaches 1165 through 4380 and 4159, and 1165 -> 116
stays. Pinned twin runs at that spawn, wedge escape off, 18 an arm:
wedges 2 -> 0.
@sunzenshen

Copy link
Copy Markdown
Contributor Author

There's a bit of a quirk with the automated reachability analysis where if the ghost is spawned on an incline like these roofs, it will roll off the roof, and the bots will then be able to pick up the ghost, so the agentic tester concludes that these roofs are reachable:

image

Interested to know if we want to manually prune these areas, or if we want to review and discuss the best way to test sloped navareas.

@sunzenshen
sunzenshen merged commit f3fdfee 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