Repository navigation
ntre_subsurface_ctg: navmesh rework - #148
Merged
sunzenshen merged 5 commits intoOct 14, 2026
Merged
Conversation
One file. Against master: 1201 -> 1059 areas, 617,909 -> 541,649 bytes; areas no spawn can reach 69 -> 0; all 9 nav ladders connected at both ends (master: 8, two of them with an end connected to nothing). - Sliver areas merged into their neighbors on the same floor. - Walk links a player hull cannot cross are cut (a platform edge at the defender spawn, a robot cart, crates, a wall), and floor under props bots stood pressed against is cut out, including the legs of the four spider tanks (prop_dynamic, never move) in the corridor under the train line. - The corridor through an 18 u gap in a row of raised barriers is removed; two strips past the forklift are PRECISE, so bots do not cut the corner into its crates. - Ladder 1's nav line runs 4 u east of the brush center, clear of the walkway plate above it. - The overhead train line is kept with its platforms, and its ladders are connected: ladder 3's bottom to the platform floor below it (master: none), its top to a pad on the prop behind the ladder; ladder 5's top to the rails (master: none); the west rails linked to the east part across a 5 u gap. Every train-line area is PRECISE + CLIFF: narrow rails and a 9 u beam 300-430 u over the floor. - A new ladder for the construction ladder on the machine at (392,-2900), with a crouch area on the machine top. - Removed: strips on the top edges of plywood boards leaning on a wall, which nothing can reach, and two stubs the engine blocks at every round start (inside a barrier prop; on a blast door's lower tier). - Re-analyzed in game after the edits.
Renumbers area and ladder ids only, so an id-keyed diff against master reads sensibly: 1029 of the 1059 areas carry the id of the master area they match; master's 8 ladders keep ids 1-8, the new one is 10. Areas are matched only within 64 u of height. Geometry, connections, attributes and the analyzed visibility data are unchanged (verified topology-identical).
A row of fences, a round-bar barrier and plywood signs runs along y -1124, x -70..254 and 779..1300. The strips behind it are entered only round its two ends. Bots bound for a strip steered round the curb at the end to the wrong side of the row, then pressed on against it toward the path point behind it. The corner areas at both ends (583, 3171, 3172, 847) are PRECISE: a bot there follows its path points without skipping ahead or steering round teammates. Attributes only; re-analyzed in game.
An outside review of this mesh found walk links that run one way only, a climb whose drop back was cut, and one area reached only by climbs no bot plans. Each one-way pair was swept with a player hull in both directions by the engine's hull audit: - Restore the missing direction of the two pairs clear both ways; cut both ways the pair blocked by a spider tank's leg. - Restore the drop from the platform near (3475, -4158) whose climb was kept. - Delete the top of the crate stack near (1438, -2937), reached only by 87-88 u climbs: nothing a player can jump onto reaches it. Beyond the review, from the same audit: delete nine areas no player hull fits in: four 12 u squares inside the wall at the fence row's ends (the corner beside each keeps the way round), a square inside another wall, and the floor under two power suits, a barrier gate and a door frame. Cut a pair blocked both ways by a spider tank's legs. Links past movable physics props are kept. Existing areas keep their ids. Re-analyzed in game (same graph, fresh visibility).
The spider tank near (170, -4045) is a prop_dynamic that never moves, but the mesh ran under its six legs: bots heading from area 6 to 3571 walked into a leg (link walker: Assault and Support stuck on every try). Its leg footprints, grown by a half hull, are cut out of the areas under them, as was done for the other tank; the pieces keep their links, and the largest piece of each area keeps its id. Every link round the tank is crossed by every class (link walker). Re-analyzed in game (same graph, fresh visibility).
sunzenshen
added a commit
to sunzenshen/neoAssets
that referenced
this pull request
Oct 4, 2026
As navmesh-subsurface-release e923bfd (NeotokyoRebuild#148): the six legs of the spider tank near (170, -4045), grown by a half hull, cut out of the areas under them.
sunzenshen
marked this pull request as ready for review
October 9, 2026 05:05
This was referenced Oct 9, 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_subsurface_ctg: navmesh rework
One file,
neo/maps/nav/ntre_subsurface_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.Dependencies and status
Needs (worse than master, or broken, without it):
NAV_MESH_PRECISE+NAV_MESH_CLIFFmarks use the movement rules of Bots follow their path on NAV_MESH_PRECISE areas neo#2168 (merged).Helped by (measured better with it; the mesh does not wait on it):
Pending before review:
At a glance
What changed
prop_dynamicand never move, and the tank near (170, -4045) (below).PRECISE, so bots do not cut the corner into its crates.PRECISE+CLIFF, as narrow walkways high above the floor: 25-50 u rails and a 9 u beam. A fall from them is 290-433 u, which does up to 14 damage. The only way up is ladder 3; the ways down are ladder 3 and drop links off the east car and a platform (294-308 u).The fence-row corners
A row of static fences, a round-bar barrier and plywood signs runs along y -1124, from x -70 to 254 and from 779 to 1300. Behind it are two narrow strips (the one west of the opening leads to ladder 1). They are entered only round the row's two ends from the open floor between them. Without marks there, bots bound for a strip were pushed round the curb at the row's end to the wrong side. They then pressed on against the fence toward the path point behind it until the stuck monitor fired. At the west end this was worse than master: 2.5-3.0 stuck events a match against master's 1.3-1.6.
The three corner areas (583 and 3172 at the west end, 847 at the east end) are
PRECISE. Under #2168 a bot there follows its path points without skipping ahead or steering round teammates. Attributes only. With it the two corners are at master's level: west 1.1 against master's 1.3, east 0.6 against 1.0 a match. Against the same mesh without the marks: x0.80 [0.55, 1.14] overall, and at the two fence corners x0.38 [0.26, 0.56] (14 pairs down, 2 up).The spider tank near (170, -4045)
The mesh ran under this tank's six legs, and a link walker (one bot of each class sent across a single nav link from 128 u back, in the server) found Assault and Support stuck against a leg on every try from area 6 to 3571. The six leg footprints, grown by half a player hull, are cut out of the areas under them. The pieces keep their links, the largest piece of each area keeps its id (15 small pieces get new ids), and every link round the tank is crossed by every class in the walker.
Id alignment
1019 of the 1064 areas carry the id of the master area they match, so an id-keyed diff against master reads sensibly. Master's 8 ladders keep ids 1-8, and the new ladder is 10. Areas are matched only within 64 u of height. The alignment changes ids only: geometry, connections, attributes and the analysis data are unchanged by it (verified topology-identical).
How it was tested
BLOCKED_LINKS map=ntre_subsurface_ctg level_pairs=1712 oneway=0 keep=0 cut=4 area=0 check=1 entity=13: the four are the kept links above, the entities the physics props.trigger_hurtand no other hurt volume, and no drop that kills a bot at full health. The deepest drop off the train line is 433 u, 14 damage. In the comparison below each mesh had one death from a fall: a bot on 2-8 health dropping 313 u from the mezzanine near (-370,-3600), a drop link master also has..nav, run back to back. CTG, 2 rounds of 3 minutes with the ghost pinned at each of the 8 ghost spawns in turn, 3 runs each, 30 bots, default weapon damage, 8 matches at a time. Every match reached match end with 0 asserts and no crash (241 matches in all, probes and earlier revisions included). The stuck count isOnStuckplusFAIL_STUCKmove failures, excluding the spawn crush at round start and the weapon-scavenging behavior. This comparison ran on the mesh without the audit edits (one-way links, the platform drop, the removed crate top and areas no hull fits in) and the cut at the tank near (170, -4045); those were measured against the mesh without them, below.OnStuck64.0 -> 19.9FAIL_NO_PATH_EXISTSmove failures 4.4 -> 4.1 a match (paired x1.02 [0.72, 1.49]). They come from attack chase paths that refuse areas the path reservations mark as hazardous, on both meshes. "Fell off the path" failures 0.08 -> 0.04bot-navmesh-generation-researchwith logging, its research switches at their defaults), the same design (each of the 8 ghost spawns pinned, 3 runs each, 30 bots, default weapon damage, 8 matches at a time), 24 pairs, every match to match end with 0 asserts:FAIL_NO_PATH_EXISTS0.6 -> 0.8 a match; kills 49.5 -> 49.7; fall deaths 2 -> 0 in 24 matchesHow 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.
sv_neo_ghost_spawn_pos "x y z", which replaces the position of the round's ghost spawn. The map file is not edited..bspunder a second name that loads its own.nav, so the same pin runs on both meshes in one batch.On this map
Each end of the restored and new ladders was probed, 3 matches each, 12 bots, at a tenth of weapon damage, on the same build. Reached, master against this mesh:
On the rails at the tops of ladders 4 and 5 the ghost rolled off onto the floor below on both meshes, so those probes say nothing about the rails. On master no bot reaches the train line at all. In an earlier test on this mesh (30 bots, a tenth of weapon damage), with the ghost pinned on the east or the west car, bots got it in 2 of 4 rounds and once carried it off the line to a capture. With the ghost at its real spawns, no bot climbed to the train line in 88 matches, so the line does not change ordinary rounds.
Known, not changed
Earlier measurements (without the fence-row marks)
These ran on the mesh without the fence-row corner marks, the audit edits and the cut at the tank near (170, -4045): 1059 areas, of which 1029 carried master's ids. Master against it, the same design, 24 pairs: x0.38 [0.29, 0.50], and again x0.37 [0.29, 0.48].