Summary
EnemyBrain was written when jumping meant one ground jump. Two movement options
have since been added that it does not know exist:
- The double jump (
AIR_JUMPS = 1, AIR_JUMP_VELOCITY = -620) — a bot jumps
from the ground and never presses again in the air.
- The flat air dash — a bot dashes, but only to disengage on the ground. It
never uses the fact that an airborne dash now holds its Y and crosses a gap in
a straight line.
Why it matters
The canonical test is AI vs AI. diagnose.mjs --mode=online and
deathmatch-probe.mjs are the two runs that decide whether the game is healthy,
and neither can exercise a mechanic the bots do not use — so the double jump and
the air dash are currently only reachable by a human. That is the same blind spot
aim-probe.mjs exists for: a mechanic no bot touches is a mechanic nothing
measures.
It also makes bots read as worse than they are once humans are in the room. A
player who double jumps over a bot and dashes away is using two options the bot
cannot answer.
Evidence
movementSummary.wallJumps is routinely 0 across canonical runs, and no counter
exists for air jumps at all — which is itself part of the problem.
Suggested approach
- Measure first. Add
airJumps and airDashes to movementSummary in
PhysicsDiagnostics, so "the AI never does this" is a number rather than an
impression. Expect zero, then watch it become non-zero.
- Teach
EnemyBrain to spend the air jump when its target is above it and out
of single-jump reach, and to air dash across a gap rather than walking around.
- Keep the personality spread — a bot that always double jumps is as readable as
one that never does. AIConfig.skillLevel is the existing knob.
Definition of done
movementSummary.airJumps and airDashes non-zero across a handful of
canonical runs, and still zero for a bot configured not to use them.
arenaSummary.surfacesUsed does not regress — the point is more of the arena,
not bots stuck on the ceiling.
Out of scope
- Changing the tuning of either mechanic. See
specs/movement.md.
Summary
EnemyBrainwas written when jumping meant one ground jump. Two movement optionshave since been added that it does not know exist:
AIR_JUMPS = 1,AIR_JUMP_VELOCITY = -620) — a bot jumpsfrom the ground and never presses again in the air.
never uses the fact that an airborne dash now holds its Y and crosses a gap in
a straight line.
Why it matters
The canonical test is AI vs AI.
diagnose.mjs --mode=onlineanddeathmatch-probe.mjsare the two runs that decide whether the game is healthy,and neither can exercise a mechanic the bots do not use — so the double jump and
the air dash are currently only reachable by a human. That is the same blind spot
aim-probe.mjsexists for: a mechanic no bot touches is a mechanic nothingmeasures.
It also makes bots read as worse than they are once humans are in the room. A
player who double jumps over a bot and dashes away is using two options the bot
cannot answer.
Evidence
movementSummary.wallJumpsis routinely 0 across canonical runs, and no counterexists for air jumps at all — which is itself part of the problem.
Suggested approach
airJumpsandairDashestomovementSummaryinPhysicsDiagnostics, so "the AI never does this" is a number rather than animpression. Expect zero, then watch it become non-zero.
EnemyBrainto spend the air jump when its target is above it and outof single-jump reach, and to air dash across a gap rather than walking around.
one that never does.
AIConfig.skillLevelis the existing knob.Definition of done
movementSummary.airJumpsandairDashesnon-zero across a handful ofcanonical runs, and still zero for a bot configured not to use them.
arenaSummary.surfacesUseddoes not regress — the point is more of the arena,not bots stuck on the ceiling.
Out of scope
specs/movement.md.