The receiver waits behind his line, and a missed serve buys a second one
Oliver, three notes; two of them are here. "when the opponent serves the player does not stand at the baseline - but that's how it should be." setupPoint's receiving marks sat over a metre INSIDE the court on both sides (22.5 near, 1.2 far) — where you stand to attack a second serve, not where you wait for a first one. They mirror the server's depth now, in the one line every serving mode shares. "when serving results in an out there should be a second service... the umpire should announce 2nd service and the player must get another chance." True in tennis mode since forever and absent everywhere else: the duel, the match and the death match had no service rule at all, so a serve long or into the net was judged as an ordinary ground stroke — a point, and in the match a point costs blood. The out branch of onBounce's interlude block routes a serve to fault() instead, so the second serve, the HUD line, the umpire and the double fault all come for free. Three things it dragged out with it: - fault()'s double-fault branch called pointTo — TENNIS scoring — which in an interlude banks a number and skips the mode that owns the court. It goes through resolveInterlude there now. Nothing had ever reached that line from a duel or a match, because those modes could not fault. - startDuel never reset G.serveNum: harmless while a duel could not fault, the next duel's death loop the moment it can. - the match puts the body back on its receiving mark for the second serve (placeReceiver, split out of matchReady, which resets the serve number). "Fault. Second service." is one voiceSeq — a second voice() call would be dropped, one man one microphone. New recording via the usual say/afconvert. The service BOX is still not enforced in the match, deliberately: this is strictly more forgiving than what shipped. The lob gesture is OPEN 14. 4 new tests, 110 pass. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
1 parent
3d7e66449a
commit
6e07dc74bb
7 files changed
+182
-19
No files matched your search
+57
@@ -491,6 +491,46 @@ zombie (now an occasional opponent, `TUNE.racketEvery`, not the every-game fixtu
|
||||
`RETURNED`, `DOUBLE KILL`) is a footnote to something you already watched happen. Sharing the loud
|
||||
FACE with the milestone cards is right; sharing their SIZE made every footnote read as a milestone.
|
||||
|
||||
## Session log: THE SERVICE RULES ARRIVE IN THE OTHER MODES (2026-08-22)
|
||||
|
||||
Three notes from Oliver, two of them fixed here; the third (the lob) is under discussion in OPEN.
|
||||
|
||||
- **A RECEIVER STANDS BEHIND HIS BASELINE.** *"when the opponent serves the player does not stand at
|
||||
the baseline — but that's how it should be."* `setupPoint`'s receiving marks were z 22.5 near and
|
||||
1.2 far — over a metre INSIDE the court on both sides, which is where you stand to attack a second
|
||||
serve, not where you wait for a first one, and next to a server drawn behind his own line it read
|
||||
as a man who had wandered in. They now mirror the server's depth (24.2 / -0.43). It is one line, so
|
||||
every mode that serves through the tennis branch got it: classic, gore's opener, the match, and
|
||||
netplay. The duel is unaffected by design — it takes setupPoint's splatter early-out and is always
|
||||
your serve, from wherever you are standing.
|
||||
- **A MISSED SERVE BUYS A SECOND ONE.** *"when serving results in an out there should be a second
|
||||
service... the umpire should announce 2nd service and the player must get another chance."* True
|
||||
in tennis mode since forever, and **absent from every other mode**: the duel, the match and the
|
||||
death match had no service rule at all, so the first serve was judged as an ordinary ground stroke
|
||||
and a serve long or into the net handed the point away — in the match that is a point AND blood, on
|
||||
the very first ball of it. The out branch of `onBounce`'s interlude block now routes a serve to
|
||||
`fault()` instead of `resolveInterlude`, so the second serve, the HUD's SECOND SERVE line, the
|
||||
umpire and the double fault all come for free. Three things it dragged out with it:
|
||||
1. **`fault()`'s double-fault branch called `pointTo`** — TENNIS scoring — which in an interlude
|
||||
would bank a number and skip the mode that owns the court (blood, the fall, the ladder). It
|
||||
routes through `resolveInterlude` there now. Nothing had ever reached that line from a duel or a
|
||||
match, because those modes could not fault.
|
||||
2. **`startDuel` never reset `G.serveNum`.** Harmless while a duel could not fault; the moment it
|
||||
can, a fault in one duel arms second-serve in the NEXT one — the exact death loop `matchReady`
|
||||
already carries a note about, one mode over.
|
||||
3. **The match puts the body back on its receiving mark for the second serve** (`placeReceiver`,
|
||||
split out of `matchReady` because that call resets the serve number a fault has just spent).
|
||||
Not in netplay: the called ball is left rolling there, and `matchReady` would freeze it.
|
||||
- **THE BOX IS STILL NOT ENFORCED IN THE MATCH, deliberately.** Classic checks the service box; the
|
||||
match's line call only ever checked the court, and a deep-but-in serve stays legal there. That is
|
||||
the concession the mode was tuned around (see the "classic tennis gives double fault very often"
|
||||
note in `keyPressed`) and this change is strictly more forgiving than what shipped. Enforcing it
|
||||
is a one-line change if Oliver wants real service boxes in zombie tennis — ask before doing it.
|
||||
- **One new recording: `second_service.m4a`** (`say -v Daniel -r 168` -> `afconvert`, the existing
|
||||
pipeline). It plays as a SEQUENCE with the fault call — `voiceSeq(['fault', 'second_service'])` —
|
||||
because `voice()` drops any line that would start while the umpire is still talking, so a second
|
||||
`voice()` on the next line would have been silently swallowed. "Fault. Second service."
|
||||
|
||||
## ZOMBIE TENNIS — the mode, end to end (folded from HANDOFF-MATCH.md, 2026-08-17)
|
||||
|
||||
`HANDOFF-MATCH.md` was a temporary file written when a session ran out of context mid-slice. The
|
||||
@@ -3901,6 +3941,23 @@ Nothing here is broken; these are known gaps and unverified risks.
|
||||
from a tin). At 12 rounds/s a per-pellet sample will machine-gun the mixer, not just the wave.
|
||||
- **boss sounds** — footfall, wind-up, throw, wound, death. Three designs in `BOSS_ART`; decide
|
||||
whether they share one set or get one each before recording anything.
|
||||
14. **THE LOB ("lupfen") — asked for 2026-08-22, UNDER DISCUSSION, do not build it yet.** Oliver:
|
||||
*"when you're close to the net in a duel with another player there should be a gesture allowing
|
||||
to make a ball flying high from below... I don't know how to implement this gesture wise — this
|
||||
likely needs to be discussed."* The shot itself is nearly free: `trySwing` already solves every
|
||||
return through `solveShot` with a target depth from `SHOT_DEPTH` (up = deep, none = mid, down =
|
||||
short), so a lob is a deep target with a much slower `s` and the net-clearance loop doing the
|
||||
rest — the same maths, different two numbers. **The GESTURE is the whole question**, and every
|
||||
obvious answer is already spoken for: the flick is the rally aim (up = deep), the pull is the
|
||||
slingshot, a hold is nothing yet but is also invisible. Candidates to put to him, cheapest first:
|
||||
(a) the flick that is already there, but STEEPER THAN THE DEEP ONE — the up-flick keeps meaning
|
||||
"deep" and a near-vertical up-flick means "over him"; costs one threshold and no new input;
|
||||
(b) the same flick, but only ARMED while the opponent is inside his own service box (the shot
|
||||
only exists as an answer to a man at the net, so context can select it instead of the gesture);
|
||||
(c) a two-finger tap or an up-SWIPE from below the ball, both of which are new input surfaces.
|
||||
Whatever wins needs the receiving side to be answerable too, or a lob at the net is an ace: the
|
||||
zombie's chase reads the BOUNCE (`aiRead`), so a high slow ball gives it time — probably fine,
|
||||
but it must be measured, not assumed.
|
||||
|
||||
---
|
||||
|
||||
|
||||
Reference in new issue
Block a user