Repository navigation
ntre_bullet_tdm: navmesh rework - #155
Merged
sunzenshen merged 3 commits intoOct 14, 2026
Merged
Conversation
One file. Against master: 271 -> 233 areas, 78,998 -> 67,030 bytes; 3 areas not linked to the rest of the mesh -> 0; 0 areas blocked at round start in either. - The four train doorways are narrower than the areas either side share: a player hull clears 2 of 13 lanes through each. An 8 u area now spans each doorway through its clear lanes, linked to both sides, in place of the direct links. On master the doorways hold about 85 % of the map's stuck events. - Sliver areas are merged into their neighbors on the same floor (39 of master's areas), except where a merge would join a cul-de-sac to a walkway: shaft 1's foot and the west car's seats keep master's splits. - 12 areas beside the lethal track floor are PRECISE + CLIFF: the deck edge strips beside each shaft and a 50 u strip along the track side of two roofs. - The landing behind the ladder plane at the top of ladders 1 and 4 no longer lists the ladder going down; it stays the exit of a climb. Descents started there mostly end back at the top, about 5 and 3 times a match on master. Bots go down by the drop links into the shafts. - 3 small crouch areas linked to nothing are removed. - Re-analyzed in game after the edits.
Renumbers area ids only, so an id-keyed diff against master reads sensibly: 229 of the 233 areas carry the id of the master area they match (224 before), no kept id sits more than 64 u from its master location, and the diff shows 4 added / 42 removed areas (39 of the 42 merged into a neighbor on the same floor, 3 pruned). Geometry, connections, attributes and the analyzed visibility data are unchanged (verified topology-identical).
The seats in the three train cars are not places for bots to stand. Bots stepped or jumped onto them while cutting the turn into a car's aisle or side-stepping in it. A bot left on an aisle-side armrest cannot step down, because its head meets the light strip over the aisle, and stays stuck there. - Remove the 11 areas whose raised side lies on a seat cushion and the 3 table and seat tops in the middle car. All were side pockets: every other area keeps its links and reachability. - Mark each car's aisle line PRECISE: the doorway strip at the car's west end and the 25 u aisle strips between the seat rows. The west car's vestibule is split so the line runs through it as a strip. On a PRECISE area the path follower does not skip ahead and bots do not side-step, strafe or super-jump; with neo#2175 they also move in the exact direction of the path. - Re-analyzed in game. Existing areas keep their ids; the vestibule strip is the one added area. Seat stuck events a match, master -> this mesh, 32 matches each on upstream with neo#2175, neo#2176 and neo#2186: 3.7 -> 0.9. The PRECISE line needs neo#2175; without it the seats measure 3.9 -> 5.8.
Contributor
Author
|
A number of the gains were through encouraging the bots to take the narrow connection between the passageways to discourage getting stuck in the portal frames:
This navmesh needs the Precise annotation to reduce falls off the side of the train:
One known issue is that bots are discouraged to cross the roof ever since NeotokyoRebuild/neo#1601 was introduced. Before, bots were able to cross the roof, but at the moment bots rarely take that path anymore. |
sunzenshen
marked this pull request as ready for review
October 9, 2026 04:26
sunmachine
approved these changes
Oct 14, 2026
sunmachine
left a comment
There was a problem hiding this comment.
Precision navmeshes work great with the code changes on top.
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_bullet_tdm: navmesh rework
One file,
neo/maps/nav/ntre_bullet_tdm.nav. TheNAV_MESH_PRECISE+NAV_MESH_CLIFFmarks use the movement rules of NeotokyoRebuild/neo#2168 (merged).Dependencies and status
Needs (worse than master, or broken, without it):
PRECISE(see "3. Train seats"). With it, bots get stuck on the seats 0.9 times a match on this mesh against 3.7 on master; on upstream code without it, 5.8 against 3.9 (see "How it was tested").The rest of the gain needs no code change. Commits 1-2 were measured with and without the draft NeotokyoRebuild/neo#2176 (then only its unwanted-ladder release, now its changes 1 and 7), and their gain does not depend on it; the map's four nav ladders are master's.
Helped by (measured better with it; the mesh does not wait on it):
Pending before review:
At a glance
PRECISE+CLIFFPRECISE(train aisles)Three commits:
1. What changed
trigger_hurtover the track floor, and every upper-level area on that side drops into it. 12 areas are markedPRECISE+CLIFF, where test bots fell: the deck edge strips beside each shaft, ladder 1's top landing and the west roof's edge, and a 50 u strip split off the track side of two more roofs. Marking only the edge strip of a roof keeps the rest of it a normal walkway.FAIL_NO_PATH_EXISTSa match.2. Id alignment
229 of the 233 areas carry the id of the master area they match. No kept id sits more than 64 u from its master location. An id-keyed diff shows 4 added areas (two of the doorway strips and the two roof edge strips) and 42 removed (39 merged into a neighbor, the 3 unlinked ones). Geometry, connections, attributes and the analysis data are unchanged by this step.
3. Train seats
Bots are not meant to stand on the train seats, so this commit keeps them on the aisle. Before it, on master and after commits 1-2 alike, bots got onto a seat 45 to 55 times a match. Mostly this happened while cutting the turn from a car's doorway into its aisle: the hull met a seat's aisle-side armrest and the path follower's ledge climb jumped onto it. Bots also stepped onto a cushion while side-stepping one another or strafing in a fight. A bot on an aisle-side armrest cannot step down into the aisle, because its head meets the light strip over the aisle, so it stays there until it gives up its path.
PRECISE(17 areas): the doorway strip at the car's west end and the 25 u aisle strips between the seat rows. The west car's vestibule is split so the line runs on through it as a 25 u strip. On aPRECISEarea the path follower does not skip ahead past path points, and bots do not side-step one another, strafe in a fight or super-jump. With #2175 they also move in the exact direction of their path instead of on the nearest of eight movement keys. Without it, a bot that looks around while walking the aisle still drifts up to 30 degrees off its path and into an armrest, which is why the seats need #2175.How it was tested
.nav, run back to back. Upstream master plus #2175, #2176 and #2186, with harness logging added. TDM, one 5-minute round, 30 bots, default weapon damage, 32 matches a mesh, 8 at a time. The stuck count isOnStuckplusFAIL_STUCKmove failures, excluding the spawn crush at round start and the weapon-scavenging behavior.FAIL_NO_PATH_EXISTSmove failures 4.9 -> 8.6 a match (x1.45 [0.90, 2.34]); almost all are a bot chasing an enemy that will not plan through a fresh grenade's hazard in the corridors between the cars, which ends at the hazard by designNo ladder was added or changed, so no ladder probes were run.
Known, not changed