The hook turns as hard as the geometry needs, or not at all

A slice hooking onto a body two metres to the side flew a closed loop around
it forever: 285 frames of the same circuit, never arriving, never falling.
A constant turn rate has a constant turn radius (v/w = 2 m), and anything
inside that circle cannot be reached however long the ball steers — while
the hook pins vy at 0, so nothing else ends it either. A crowd is nothing
but close bodies, which made the one place this weapon should shine the one
place it hung.

The rate is no longer a constant. An arc leaving along the current heading
and passing through a body at distance d, bearing a, has radius d/(2 sin a),
so the ball needs 2 v sin(a) / d — solved every frame, because the body is
walking while the ball travels. sliceTurn stays as the FLOOR, which is what
it was always really for: how wide the curl looks when there is room.
Turning faster than needed is safe, the aim being re-solved each frame.

Two things the maths cannot cover, so they are ruled out instead: a body
behind the ball, which no tangent arc reaches at any rate (sliceArc), and a
target that walks out of reach mid-hook (sliceHookT, a hard 0.7 s licence to
steer). An endless orbit is now impossible by construction rather than by
the geometry happening to work out.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
wuwiandClaude Opus 5 committed 2026-08-09 13:53:20 +02:00
1 parent 99d84b2c9d
commit e11ad30a63
3 files changed
+42 -11

No files matched your search

+13 -2
View File
@@ -247,8 +247,19 @@ export const TUNE = {
sliceHops: 2, // extra bodies one perfect serve hooks to. 2 => TRIPLE KILL is the ceiling
sliceR: 6.5, // m the hook reaches for the next body. Wider reads as the game aiming for you;
// much narrower and a spread-out crowd never chains at all
sliceTurn: 11, // rad/s the ball swings onto the next one, and THE knob for how it looks: past
// ~30 it snaps like a ricochet, under ~6 it sails wide before finishing the turn
sliceTurn: 11, // rad/s the ball swings onto the next one: a FLOOR, not the rate. It is the knob
// for how the shot LOOKS when there is room — past ~30 it snaps like a ricochet,
// under ~6 it sails wide. The rate actually used is whatever the geometry needs
// (see the hook), because a fixed rate has a fixed turn radius (v/w = 2 m here)
// and ANY body inside that circle is unreachable: the ball flew a closed loop
// around it forever, never arriving, never falling. A crowd is all close bodies,
// so the one place the weapon should shine was the one place it hung.
sliceArc: 120, // deg: the widest bearing off the ball's heading that can be hooked at all. No
// single tangent arc reaches a body directly BEHIND the ball at any turn rate,
// so past this the chain just ends and it plows on
sliceHookT: 0.7, // s a hook may steer before it lets go. The geometry above is solved fresh every
// frame and still cannot promise an arrival when the target WALKS, so this is the
// backstop that makes an endless orbit impossible by construction, not by maths
// The schedule calls the DUEL, not the tin: weapons are only ever won, but a duel comes round
// on its own so there is always a chance at one. Fires off the next hand-cleared wave.
duelFirst: 2, // game after which the first scheduled sudden-death duel is called