Point at them, then wind up: the lane comes from where the thumb lands
The lane used to come from the pull's own direction, so aiming up-court was always a downward drag. Every shot ended lower than it began, the next touch starts where the last one ended, and over a horde the thumb walks itself into the iOS bottom edge — where a pull down is Reachability and the system takes the gesture out from under you. A web page cannot refuse that. So touch-down picks the lane now (a ray from his chest through the thumb) and the pull after it is power and nothing else, in whatever direction there is room for. Aiming is what drags the thumb UP the screen, because that is where the shamblers are. The cost, and the thing to feel: the lane locks when the thumb lands. You can no longer sweep the aim while drawn. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
1 parent
1337c1f47d
commit
1798fc67b8
4 files changed
+45
-17
No files matched your search
@@ -646,18 +646,23 @@ function drawCard(title, sub1, sub2, color) {
|
||||
if (sub2) ctx.fillText(sub2, W / 2, H / 2 + 12);
|
||||
}
|
||||
|
||||
// Sit in the serve stance doing nothing and the gesture demonstrates itself: a ghost thumb slides
|
||||
// BACK from the player while chevrons grow FORWARD up the court, then it releases and repeats.
|
||||
// Pulling is the whole game in splatter mode, and a line of text was carrying that alone.
|
||||
// Sit in the serve stance doing nothing and the gesture demonstrates itself: a ghost thumb lands
|
||||
// OUT ON THE COURT — that is the aiming half, and it is why the anchor sits well up-court of him
|
||||
// rather than at his feet — then slides BACK while chevrons grow FORWARD up the court, and
|
||||
// releases. Both halves of the gesture in one loop; a line of text was carrying that alone.
|
||||
function drawPullHint() {
|
||||
const cyc = 1.9, t = (G.idleHintT - TUNE.pullHintAfter) % cyc;
|
||||
const draw = Math.min(1, t / 1.15); // the pull itself, then a beat held at full
|
||||
const gone = t > 1.45; // released — the thumb lifts off
|
||||
const anchor = proj(P.x, 0, P.z + 0.6);
|
||||
const ax = Math.round(anchor.x), ay = Math.round(Math.min(anchor.y + 6, METER_Y() - 26));
|
||||
const anchor = proj(P.x, 0, P.z - 12);
|
||||
const ax = Math.round(anchor.x), ay = Math.round(Math.min(anchor.y + 6, METER_Y() - 40));
|
||||
const len = 30 * draw;
|
||||
ctx.save();
|
||||
ctx.globalAlpha = gone ? 0 : 0.85;
|
||||
// the ring is where the thumb LANDED — the aiming half, and the half nobody would guess from a
|
||||
// moving dot alone. It stays put while the thumb slides away from it.
|
||||
ctx.strokeStyle = UI.dim; ctx.lineWidth = 1;
|
||||
ctx.beginPath(); ctx.arc(ax, ay, 4, 0, 7); ctx.stroke();
|
||||
// the dotted track the thumb travels, straight down-screen = "pull back"
|
||||
ctx.fillStyle = UI.dim;
|
||||
for (let d = 6; d < 34; d += 6) ctx.fillRect(ax - 1, ay + d, 2, 2);
|
||||
@@ -1096,7 +1101,7 @@ export function render() {
|
||||
? (G.weapon === 4 ? (touch ? 'TAP TO UNLOAD THE GUN' : 'SPACE UNLOADS THE GUN')
|
||||
: G.aim ? 'PULL BACK: FURTHER = HARDER'
|
||||
: G.weapon > 0 ? `SERVE FIRES: ${sel} · ${switchHint}`
|
||||
: touch ? 'PULL BACK TO AIM · RELEASE TO FIRE' : 'DRAG BACK TO AIM · SPACE SERVES')
|
||||
: touch ? 'POINT AT THEM · PULL BACK TO FIRE' : 'POINT AND DRAG BACK · SPACE SERVES')
|
||||
: G.serveNum === 2 ? (touch ? 'SECOND SERVE — TAP' : 'SECOND SERVE — SPACE')
|
||||
: (touch ? 'TAP TO TOSS, TAP TO SERVE' : 'SPACE TO TOSS, SPACE TO SERVE');
|
||||
ctx.fillText(txt, W / 2, METER_Y()); // same slot the draw meter uses
|
||||
|
||||
Reference in new issue
Block a user