Skip to content

Bots jump a gap link down instead of dropping into it - #2198

Merged
sunzenshen merged 5 commits into
NeotokyoRebuild:masterfrom
sunzenshen:bot-gap-drop-jump
Oct 12, 2026
Merged

sunzenshen merged 5 commits into
NeotokyoRebuild:masterfrom
sunzenshen:bot-gap-drop-jump

Conversation

@sunzenshen

@sunzenshen sunzenshen commented Oct 4, 2026 •

Copy link
Copy Markdown
Contributor

Description

Path::ComputePathDetails turns every walk link onto an area more than a step lower into a DROP_DOWN. It pushes the crossing point forward from the ledge, 10 u at a time up to two hull widths, until a hull traced straight down is clear, and the bot falls from there. When the two areas do not touch, the first clear column is over the gap between them, so the bot drops into the gap; only bots carried across by their run speed reach the landing. The gap-jump pass that follows, which turns a link between areas more than 38 u apart into a run-up and a jump, only looks at ground segments, so a link down across a gap never becomes a jump.

ntre_apparatus_dm hits this in every match. Its spawn halls' exits are links down across a slot that falls to a kill volume (about 50 u across and 48 u down). On master with the navmesh from NeotokyoRebuild/neoAssets#157, a 30-bot, 5-minute DM match has 29.6 fall deaths, most of them in that slot; with this PR, 4.7.

Dependencies and status

Needs:

  • None.

Needed by:

Pending before review:

  • A Windows build (built and tested on Linux so far).

What this PR does

Two changes, both in the path code:

  1. A link down across a gap is not a drop (NextBotPath.cpp). A walk link down to an area more than 38 u away in 2D is no longer marked as a drop. 38 u (1.9 of NEO's 20 u generation steps) is the gap-jump pass's own separation test, unchanged from stock and now one named constant, GapSeparationTolerance, shared by both places. The gap-jump pass then makes the link a run-up to the ledge and a jump for the landing, as it does for level gaps. Where the drop is more than twice the gap, that pass adds no jump, and the bot walks off the ledge heading for the landing instead of falling from a point over the gap.
  2. A gap jump keeps its landing after a mid-air re-path (NextBotPathFollow.cpp). A path recomputed while the bot is in the air starts from its last known area, the one it jumped from, so the new path's goal is the take-off point behind it. The bot lands below that point, IsAtGoal does not pass a goal more than a step up, and the bot walks back into the gap. In CheckProgress(), a gap-jump goal now moves on to its landing once the bot is jumping a gap or has reached the landing's area.

Paths with no link down across a gap are unchanged.

How to test

  1. ntre_apparatus_dm has no navmesh on master: copy neo/maps/nav/ntre_apparatus_dm.nav from ntre_apparatus_dm: first navmesh neoAssets#157 into the game's maps/nav/ folder.
  2. map ntre_apparatus_dm, then neo_bot_quota 30, and join spectator.
  3. Watch the spawn halls' exits, for example near (-410, -960) and (-6520, 960): bots run at the ledge and jump the slot to the walkway. A build without this PR shows bots stepping off into the slot and dying in the kill volume below.

Risk

Low. The change acts only on paths that cross a link down between areas that do not touch.

  • A gap jump can fall short where the stock drop happened to land. The link walker (in the collapsed block under "Results") found 33 such class-links on the 29 ntre_ meshes, almost all on links bots do not use in matches; weighted by how often bots cross each link, they carry 0.2 crossings a match against 25 for the links this PR fixes.
  • About one gap jump in eight on ntre_apparatus_dm has its path recomputed in mid-air (5.3 of 42.7 a match, in the collapsed block). Change 2 then heads for the landing while the bot is still jumping or once it stands on the landing's area. A bot that lands elsewhere, short on mesh in the gap or long past a narrow landing, keeps the take-off above it as its goal and presses toward that ledge until the stuck monitor re-paths. Handing the goal on in that case too measured no difference ("Considered, not included").
  • A path recomputed while the bot falls from a walk-off (the deep-gap case) has no recovery like a drop's: the bot heads for the crossing above it until the stock goal-too-high check or the stuck monitor re-paths. It needs a re-path inside a fall of well under a second.
  • If a re-path made in the air over one gap picks a different gap jump from the same take-off area, the bot heads for that jump's landing from wherever it lands. That needs a take-off area with two gap links and a re-path during the jump.
  • Stuck episodes were 10 % higher with this PR in the 28-map screen (apparatus excluded) and 9 % lower in a second run on 9 maps (apparatus included); neither is carried by one map or spot (Results).

Cost

Path computation (not per tick): two closest-point queries for each link down on a path; on a link down across a gap, these replace the stock drop search (up to seven hull traces and a ground-height query). Path following, on every map: one segment-type check per update, plus a segment lookup and two cheap calls while the current goal is a gap jump.

Results

Every match below: Release builds on Linux of upstream master at #2175, without and with this PR, both with the same test-only logging (kills, stuck events, match end); 30 bots, default weapon damage (1.485), 15 s pre-round freeze; both arms of each pair run back to back in the same batch of 8 parallel servers. Every match reached match end with 0 asserts and a clean exit. "Stuck" is OnStuck plus FAIL_STUCK move failures, without the round-start spawn crowd, SeekWeapon and dead bots; a stuck episode is one bot's stuck events less than 10 s apart. Fall deaths are deaths to trigger_hurt or the world. Intervals are 95 % bootstrap intervals (4000 draws) of the paired ratio, +1 smoothed, unless named.

ntre_apparatus_dm, #157's navmesh, 24 pairs of one-round, 5-minute DM matches (48 matches):

a match master this PR paired
fall deaths 29.6 4.7 x0.16 [0.13, 0.20], 24 of 24 pairs down
FAIL_FELL_OFF move failures 32.9 15.9 x0.44 [0.34, 0.56]
stuck events 34.5 33.1 x0.97 [0.78, 1.22]
stuck episodes 10.7 9.2 second run: x1.01 [0.86, 1.18]
FAIL_NO_PATH move failures 26.1 26.9 x1.02 [0.90, 1.16]
player kills (fall deaths excluded) 239.5 244.7 x1.02 [1.01, 1.04]
deaths, all causes 269.1 249.3 x0.93 [0.91, 0.94]
matches ending at the score limit 24 of 24 24 of 24

Fall deaths drop by about 25 a match and player kills rise by about 5; stuck does not move. A second run of 24 pairs on the same mesh (part of the 9-map run below) gave fall deaths 27.9 -> 5.1 (x0.18 [0.14, 0.23]) and stuck episodes 9.9 -> 10.0 (x1.01 [0.86, 1.18]).

At 12 bots (6v6, same map, 8 pairs of one-round, 5-minute DM matches, Release): fall deaths 11.5 -> 3.1 a match (x0.27 [0.16, 0.42], 8 of 8 pairs down), FAIL_FELL_OFF 17.4 -> 8.3 (x0.47 [0.25, 0.76]), stuck episodes 10.5 -> 8.8 (x0.83 [0.62, 1.13]), player kills with fall deaths excluded 61.6 -> 65.3 (x1.06 [0.96, 1.14]); FAIL_NO_PATH 3.5 -> 6.4 (x1.82 [1.00, 3.61]), a count too small at this size to tell from noise, against x1.02 [0.90, 1.16] at 30 bots.

Every other map. The 28 other ntre_ maps in scope, each on its neoAssets PR's navmesh at its head: CTG maps 1 round of 3 minutes with the ghost pinned at up to 4 spawns, each twice (ntre_isolation_ctg's one spawn 8 times); JGR maps 1 round of 5 minutes, the juggernaut pinned the same way (ntre_yard_jgr's 3 spawns 3 times); ntre_bullet_tdm 1 round of 5 minutes, unpinned, 8 times. 225 pairs (450 matches), then 16 more pairs each on ntre_transit_ctg and ntre_skyline_ctg (below). One row a map; numbers are a match, master / this PR; the ntre_apparatus_dm row is the 24 pairs above.

map matches fall deaths stuck episodes episodes, paired kills (difference [95 %]) outcome
ntre_apparatus_dm 24 / 24 29.6 / 4.7 10.7 / 9.2 x1.01 [0.86, 1.18] (second run) 239.5 / 244.7 score limit 24 / 24 of 24
ntre_ballistrade_ctg 8 / 8 0 / 0 0.75 / 1.00 x1.11 [0.68, 1.82] 22 / 20 (-1.8 [-5.1, +1.9]) captures 6 / 4 of 8
ntre_bullet_tdm 8 / 8 0 / 0 2.38 / 2.88 x1.18 [0.76, 1.97] 191 / 188 (-3.8 [-12.1, +5.0]) score limit 8 / 8 of 8
ntre_dawn_ctg 8 / 8 0 / 0 1.50 / 2.12 x1.23 [0.66, 2.38] 26 / 25 (-0.1 [-2.9, +2.5]) captures 1 / 3 of 8
ntre_decom_ctg 8 / 8 0 / 0 1.38 / 1.12 x0.94 [0.66, 1.38] 24 / 25 (+0.9 [-0.9, +2.6]) captures 2 / 1 of 8
ntre_disengage_ctg 8 / 8 0 / 0 0.38 / 0.62 x1.15 [0.77, 1.73] 26 / 24 (-1.6 [-3.0, -0.1]) captures 0 / 0 of 8
ntre_dusk_ctg 8 / 8 0 / 0 2.12 / 3.00 x1.28 [0.84, 1.91] 24 / 25 (+1.1 [-2.0, +4.0]) captures 1 / 0 of 8
ntre_engage_ctg 8 / 8 0 / 0 0.25 / 0.50 x1.15 [0.77, 1.77] 24 / 26 (+2.0 [-0.9, +4.6]) captures 0 / 0 of 8
ntre_ghost_ctg 8 / 8 0 / 0 3.88 / 4.75 x1.29 [0.75, 2.27] 26 / 27 (+0.9 [-1.2, +2.9]) captures 0 / 1 of 8
ntre_isolation_ctg 8 / 8 0 / 0 1.38 / 1.88 x1.23 [0.76, 1.86] 24 / 24 (+0.4 [-2.0, +2.9]) captures 1 / 1 of 8
ntre_marketa_ctg 8 / 8 0 / 0 2.12 / 2.25 x0.92 [0.55, 1.44] 24 / 26 (+1.6 [-1.0, +4.2]) captures 0 / 0 of 8
ntre_oilstain_ctg 8 / 8 0 / 0 0.12 / 0.62 x1.36 [0.92, 1.96] 24 / 26 (+1.2 [-0.9, +3.1]) captures 1 / 0 of 8
ntre_pissalley_ctg 8 / 8 0 / 0 1.88 / 2.75 x1.25 [0.92, 1.71] 24 / 26 (+1.4 [-1.0, +3.6]) captures 1 / 0 of 8
ntre_redlight_ctg 8 / 8 0 / 0.12 1.62 / 2.62 x1.43 [0.84, 2.41] 26 / 24 (-2.2 [-4.2, +0.0]) captures 0 / 0 of 8
ntre_ridgeline_ctg 8 / 8 0 / 0 3.38 / 3.62 x1.05 [0.88, 1.31] 25 / 25 (-0.4 [-2.0, +1.1]) captures 3 / 1 of 8
ntre_rise_ctg 8 / 8 0 / 0 1.88 / 2.50 x1.23 [0.91, 1.66] 25 / 25 (-0.8 [-3.1, +1.6]) captures 0 / 1 of 8
ntre_rogue_ctg 8 / 8 0.25 / 0.12 1.12 / 1.12 x0.90 [0.55, 1.43] 25 / 24 (-0.9 [-4.4, +2.5]) captures 2 / 2 of 8
ntre_saitama_ctg 8 / 8 0 / 0 2.38 / 2.62 x0.94 [0.63, 1.39] 23 / 23 (+0.0 [-2.8, +1.9]) captures 2 / 3 of 8
ntre_sentinel_ctg 8 / 8 0 / 0 2.38 / 1.50 x0.80 [0.45, 1.66] 26 / 24 (-2.4 [-4.6, -0.5]) captures 2 / 2 of 8
ntre_sentinel_jgr 8 / 8 0 / 0 5.38 / 5.62 x1.03 [0.85, 1.21] 111 / 115 (+3.8 [-6.5, +16.5]) score limit 3 / 2, time limit 5 / 6
ntre_shrine_ctg 8 / 8 0 / 0 1.50 / 1.50 x1.01 [0.65, 1.70] 25 / 25 (+0.0 [-2.4, +2.5]) captures 0 / 0 of 8
ntre_skyline_ctg 8 / 8 0.75 / 1.38 2.75 / 2.88 x1.10 [0.70, 1.61] 24 / 25 (+1.0 [-1.9, +3.6]) captures 1 / 1 of 8
ntre_subsurface_ctg 8 / 8 0 / 0 2.62 / 2.00 x0.76 [0.50, 1.11] 26 / 26 (+0.1 [-2.4, +2.8]) captures 0 / 0 of 8
ntre_tarmac_ctg 8 / 8 0 / 0 1.12 / 1.62 x1.30 [0.86, 1.99] 24 / 26 (+1.5 [-1.5, +4.0]) captures 0 / 0 of 8
ntre_terminal_jgr 8 / 8 0 / 0 6.12 / 6.00 x0.87 [0.49, 1.62] 64 / 56 (-7.1 [-16.8, +1.8]) score limit 7 / 7, time limit 1 / 1
ntre_threadplate_ctg 8 / 8 0 / 0 1.25 / 1.25 x1.01 [0.71, 1.48] 25 / 28 (+2.9 [+0.8, +5.0]) captures 1 / 0 of 8
ntre_transit_ctg 8 / 8 0 / 0 0.62 / 2.50 x2.33 [1.81, 2.98]; rerun x0.99 [0.78, 1.23] 25 / 26 (+1.0 [-1.4, +3.6]) captures 0 / 0 of 8
ntre_vtol_ctg 8 / 8 0 / 0 2.00 / 2.50 x1.29 [0.94, 1.76] 24 / 25 (+0.9 [-0.9, +2.6]) captures 0 / 0 of 8
ntre_yard_jgr 9 / 9 0 / 0 10.67 / 11.78 x1.07 [0.71, 1.62] 104 / 100 (-4.1 [-10.9, +1.9]) score limit 1 / 1, time limit 8 / 8

Over the 28 maps: kills 38 / 38 a match (difference -0.2 [-1.0, +0.7]); three maps' kill differences exclude 0 (threadplate up, sentinel CTG and disengage down), about what chance gives across 28. Ghost captures 24 / 20 in 192 CTG rounds. FAIL_FELL_OFF 2.33 / 2.32 a match; it fell on ntre_ballistrade_ctg (0.50 -> 0.12, x0.77 [0.59, 0.92]) and ntre_rogue_ctg (1.62 -> 1.00, x0.73 [0.54, 0.92]).

Fall deaths stay rare off apparatus: none in either arm on 25 of the 28 maps. On ntre_skyline_ctg, with its 16-pair rerun, they were 20 / 30 over 24 pairs (0.83 / 1.25 a match, x1.11 [0.77, 1.63]), spread over about 12 areas of the pit floor in both arms, with no spot that only this PR has.

Second run, 9 maps. ntre_apparatus_dm, ntre_bullet_tdm, ntre_dusk_ctg, ntre_ghost_ctg, ntre_isolation_ctg, ntre_redlight_ctg, ntre_skyline_ctg, ntre_tarmac_ctg and ntre_vtol_ctg, 8 pairs each (72 pairs, 144 matches), set up as above; intervals here are of the ratio of summed counts over pairs. Fall deaths 3.08 -> 0.72 a match (x0.23 [0.15, 0.38]), all on apparatus and ntre_skyline_ctg; stuck episodes 3.10 -> 2.82 (x0.91 [0.77, 1.08]); FAIL_FELL_OFF 6.01 -> 5.12 (x0.85 [0.59, 1.30]); kills -1.4 [-3.1, +0.2] a match, all of it fall deaths that no longer count as kills: without them, apparatus 237.5 -> 245.4 and the other 64 matches 45.2 / 45.2.

Stuck episodes: the two runs disagree, and neither points at a map or spot. The 28-map screen measured 2.36 -> 2.72 a match in its first 225 pairs and x1.10 [1.01, 1.18] over 257 pairs with the two reruns (x1.07 [0.99, 1.16] without transit's first pass, x1.09 [0.94, 1.27] for stuck events); the 9-map run measured x0.91 [0.77, 1.08]. In the screen, transit's first pass (x2.33) did not repeat in its 16-pair rerun (x0.99), and no other map's interval excludes 1, though many sit 10-30 % up. The five spots with over 2 stuck events a match on this PR and under 0.5 on master are mostly one bot held for tens of seconds, and master has eight such spots of its own; one of the five (ntre_yard_jgr near (-487, 241, -74), 5 of 9 matches) recurs and has not been watched. Episodes that start near a link down across a gap: x0.89 [0.52, 1.44] in the 9-map run.

Earlier measurements of the same two changes, on an older base and navmesh

The code is the same; the base and the navmesh differ. These ran on Debug builds of upstream master at #2180 and of our research build (upstream plus our open bot PRs, #2164 among them, since closed, with each change behind a test-only switch), on ntre_apparatus_dm's research navmesh, which has the same spawn-hall gap links as #157's. 30 bots, default weapon damage, 15 s freeze, 5-minute DM rounds on apparatus.

  • Upstream at Fix bots unable to initiate sprint away from frag grenades #2180, apparatus, 9 pairs: fall deaths 31.0 -> 9.3 a match (x0.31 [0.24, 0.39], 9 of 9 pairs down), stuck 57.0 -> 48.7 (x0.84 [0.67, 1.05]), player kills 320 -> 327. Gap jumps 0.3 -> 42.7 a match, all landed; change 2 moved a gap-jump goal on to its landing 5.3 times a match (39 of 43 in mid-air).
  • The two changes apart, research build, apparatus, 24 pairs: fall deaths 35.8 (stock) -> 7.8 (change 1, x0.23 [0.21, 0.26], 24 of 24 pairs down) -> 6.8 (changes 1 + 2, x0.88 [0.77, 1.01] against change 1, 17 down / 6 up: change 2's own effect is not resolved at this size). Stuck 45.7 / 46.7 / 45.0; kills, fall deaths included, 343 / 331 / 327.
  • Every map, research build, 233 pairs (8 a map, 9 on yard; CTG and JGR from up to 4 pinned spawns; 466 of 466 matches clean): apparatus fall deaths 34.8 -> 6.1 (x0.19 [0.15, 0.25]); on the other 28 maps fall deaths 0.13 -> 0.08, stuck 19.0 -> 18.5 (x0.98 [0.86, 1.12]), kills 81.8 -> 83.4 (+1.6 [-0.2, +3.5]), gap jumps 0.2 -> 1.6 a match. By map, stuck left its interval on four maps, two each way: down on rise (x0.38 [0.23, 0.67]) and dusk (x0.71 [0.51, 0.98]), up on redlight (x1.76 [1.20, 2.59]) and ballistrade (x2.85 [1.05, 8.65]); redlight and ballistrade had no gap jump in either arm. On apparatus stuck rose x1.28 [0.91, 1.72]: with about 29 fewer fall deaths a match, more bots reach the floors below the spawn halls.
  • Link walker, 29 maps (a harness mode in which bots cross one nav link at a time from a standing start). Every drop link and every gap link of the research navmeshes (1105 links down across a gap), once with each class, with and without the PR; a class-link that failed in either arm was walked 5 more times in both and counts as failing at 3 of 5.
class-links failing, stock failing, this PR fixed broken
link down across a gap that the gap-jump pass jumps (2244) 125 56 96 27
link down across a gap deeper than twice its width (1071) 69 8 67 6
drop between touching areas, unchanged code (21018) 491 502 11 22
level or upward gap links (381) 39 38 7 6

The touching-area drops run the same code in both arms, so their ±20 is the walker's run-to-run noise. Weighted by how often bots cross each link in ordinary matches, the gap links fixed carry 25 crossings a match and the ones broken 0.2 (one link on ntre_vtol_ctg, for Assault). Fixed links are mostly on apparatus, isolation, vtol, sentinel (CTG and JGR), skyline, subsurface, saitama and terminal.

Approaches tried and dropped

  • Cut the gap links from the navmesh. On apparatus they are the only way out of four spawn pockets for Assault and Support; without them those bots never leave, and cutting one link of a hall moves the traffic to the hall's other link across the same slot. The landing is about 50 u out across a lethal slot, which only a running jump clears, so the fix went into the path code.
  • Skip the drop only where the gap-jump pass will jump (its "mostly level" test as well as the distance). The links this would leave as drops, gaps deeper than twice their width, are the ones the walk-off fixes most clearly (69 failing class-links to 8 in the walker), so change 1 skips the drop on distance alone.
  • Re-path when the floor ahead ends over a drop the path does not plan (a probe ahead of the bot that re-paths before it walks off an unplanned edge). On apparatus, on the research build with both changes, 24 pairs: fall deaths a further x0.89 [0.74, 1.05], stuck x0.87 [0.71, 1.07], neither significant, for about 70 re-paths a match. It targets a different case (an unplanned drop, not a planned gap) and is not part of this PR.

Considered, not included

Both were measured in the 9-map run above (plus 16 more apparatus pairs), against this PR:

  • Hand the goal on to the landing whenever the bot is on the ground below the take-off. A bot that lands short or long after a mid-air re-path (Risk) would get the fell-below-path re-path from Re-path when a bot lands below its path #2185 at once instead of pressing toward the ledge. Fall deaths x0.87 [0.55, 1.44], kills -0.6 [-1.7, +0.5] a match, FAIL_FELL_OFF x1.02 [0.77, 1.32], stuck episodes x1.19 [1.00, 1.41] pooled and x1.00 [0.82, 1.24] on apparatus over 24 pairs. No measured benefit, and pooled stuck episodes leaned up, so the behavior change is left out.
  • Jump every link down across a gap, including those deeper than twice their width, instead of walking off. Fall deaths x0.87 [0.51, 1.49], FAIL_FELL_OFF x0.71 [0.46, 1.06] pooled and x1.02 [0.67, 1.52] on apparatus, stuck episodes x1.04 [0.88, 1.22]. Left out: the walk-off was not shown to cost anything.

Toolchain

  • Linux GCC Distro Native (Linux Mint 22.3, GCC 13.3.0)

Linked Issues

Path::ComputePathDetails marks every walk link onto an area more than
a step lower as a drop, and pushes the drop point forward from the
ledge until a hull column below it is clear. When the two areas do not
touch, that column is over the gap, so the bot falls into it. The
gap-jump pass that follows only looks at ground segments, so it never
turns such a link into a jump.

Leave a link down to an area more than 38 u away in 2D (1.9 of NEO's
20 u generation steps: the gap-jump pass's own separation test, now a
named constant) on the ground. The gap-jump pass then makes it a
run-up and a jump for the landing; where the drop is more than twice
the gap it adds no jump and the bot walks off the ledge toward the
landing.

A path recomputed in mid-air starts from the take-off area, so its
first goal is the take-off point behind the bot, which it cannot reach
once it lands lower, and it walks back into the gap. Move a gap-jump
goal on to its landing once the bot is jumping the gap or has reached
the landing's area.
The comment above the drop test named the jump the gap-jump pass adds,
but not the other outcome: on a link whose drop is more than twice
the gap, the pass adds no jump and the bot walks off the ledge toward
the landing. Name both, so a reader of the drop test does not have to
work out the pass's level test.
CheckProgress runs only from Update, after Update has returned on a
NULL goal, and the stock code below the gap-jump hand-off reads the
goal unguarded through IsAtGoal, so the extra m_goal test on the
hand-off guards nothing the rest of the function does not already
assume.
Name the constant's value in units (38 u: 1.9 of NEO's 20 u generation
steps) and that it is the gap-jump pass's stock separation test, so a
reader can tell it is inherited, not tuned. Say in the helper's comment
that the pass repeats the measure from a path position that earlier
insertions may have moved, so the two tests share a constant, not a
point: a link one test calls a gap and the other does not ends in a
walk-off toward the landing, not a drop into the gap.
The comment gave one cause, a path recomputed in mid-air, for two
conditions. Say what each covers: a bot still in the jump, and a bot
already standing on the landing's area when the re-path lands.
@sunzenshen sunzenshen changed the title Bots jump links down across a gap Jump a gap link down instead of dropping into it Oct 9, 2026
@sunzenshen
sunzenshen requested a review from sunmachine October 10, 2026 01:48
@sunzenshen

sunzenshen commented Oct 10, 2026 •

Copy link
Copy Markdown
Contributor Author

To be honest, the fact that this PR improves numbers on map ntre_apparatus_ctg seems to say more about how cursed its navmeshes are than anything else.

For testing, might want to watch out for bots suddenly jumping between navarea transitions where they didn't before.

One option is to test apparatus without this PR and see if the behavior looks okay enough without it.

@sunzenshen
sunzenshen marked this pull request as ready for review October 10, 2026 01:52

@sunmachine sunmachine left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

No issues with the code as far as I could find.

@sunmachine
sunmachine requested a review from a team October 11, 2026 19:37
@sunzenshen sunzenshen changed the title Jump a gap link down instead of dropping into it Bots jump a gap link down instead of dropping into it Oct 12, 2026
@sunzenshen
sunzenshen merged commit a497c98 into NeotokyoRebuild:master Oct 12, 2026
10 checks passed
sunzenshen added a commit to sunzenshen/neo that referenced this pull request Oct 13, 2026
Resolving 0d5d1a4 beside NeotokyoRebuild#2198's IsLinkAcrossGap left two #ifdef NEO
openings for one #endif. Found by the Debug build of the rebased tip.
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