diff --git a/PROJECT.md b/PROJECT.md index 54df9c7..cc3bbd0 100644 --- a/PROJECT.md +++ b/PROJECT.md @@ -510,6 +510,17 @@ flickReach)` ≈ 0.7 of a full swipe, the worst mistiming in the game cannot put above it the old risk curve is untouched. The tested contract from the pass before this one still holds — a perfectly timed flick never sails, a badly timed full one can. +**THE AUTO-RUN OWNS THE LEGS, so the drag does not** (2026-08-18, Oliver: *"could it be that when +playing touch on mobile zombie tennis and tennis i am still able to manually move by dragging? in +autorun this must be disabled"* — it could, and it was). It was not a harmless second option: a +manual axis SUPPRESSES the assist (the `!mx && !mz` gate in the movement block), so holding a drag +traded a full-speed run to the intercept point for a `0.35x` shuffle aimed at wherever the thumb +went rather than at where the ball will be. Walking was strictly worse than standing still, which is +most of *"i tend to not be able to reach the balls"*. `input.js` stops writing `touchAxis` under +`rallyFeel()`; the drag keeps its one rally meaning (release it quickly and it is the aimed swing), +keys stay a deliberate desktop override, and GORE keeps its drag-walk — there the assist recovers +depth only and holding your own artillery lane is the point. + **THE AIM IS DRAWN WHILE THE THUMB IS STILL MOVING.** Oliver asked to *"visualize the strength of my flick at flick-time"*, and he was asking for the half the placement ring cannot give: the ring is a RECEIPT, it arrives with the ball already gone. `G.swipe` (set by input.js during the drag, cleared diff --git a/index.html b/index.html index 85d1dbc..dd97f0f 100644 --- a/index.html +++ b/index.html @@ -659,6 +659,6 @@ if (location.hostname !== 'splatter-tennis.wuwi.one') { - + diff --git a/src/input.js b/src/input.js index 451ba79..448358c 100644 --- a/src/input.js +++ b/src/input.js @@ -181,8 +181,16 @@ cv.addEventListener('touchmove', e => { } const r = stick.r; steerPX = (t.clientX - r.left) / r.width * 2 - 1; - touchAxis.x = Math.abs(dx) > DEAD ? Math.sign(dx) : 0; - touchAxis.z = Math.abs(dy) > DEAD ? Math.sign(dy) : 0; + // THE AUTO-RUN OWNS THE LEGS IN A RALLY, so the drag does not. Walking here was strictly worse + // than standing still: a manual axis SUPPRESSES the assist (the `!mx && !mz` gate in update), + // so holding a drag traded a full-speed run to the intercept point for a 0.35x shuffle that + // goes wherever your thumb went rather than where the ball will be — which is most of "i tend + // to not be able to reach the balls". The gesture keeps its one rally meaning: let go quickly + // and it is the aimed swing. Keys are untouched; a held arrow on a desktop is still an override. + // Gore keeps its drag-walk — there the assist only recovers depth and you hold your own lane. + const legs = !rallyFeel(); + touchAxis.x = legs && Math.abs(dx) > DEAD ? Math.sign(dx) : 0; + touchAxis.z = legs && Math.abs(dy) > DEAD ? Math.sign(dy) : 0; // THE FLICK, SHOWN WHILE IT IS STILL A FLICK. The placement ring is a receipt — it arrives with // the ball already gone. This is the same aim BEFORE the release, which is the half the player // could not see: how much width the length of the swipe is buying, and whether that is already