The match plays fair: deeper pool, no regicide, serves from the line
"the player is too weak in this mode. also the killing by smashing occurs too often. i cant really control it. maybe obsolete? also the serving after the first serve does not happen from behind the groundline". matchPlayerHp 8 — the match brings its own pool. The gore mode's 4 was an inheritance, not a decision, and a real game has rallies you deserve to lose without the run ending. Regicide is out of the match (kept in the duel, where any-weapon-counts is the point of sudden death). In a full game every hard serve that happened to meet the body was a free kill nobody aimed. A match ball never damages the opponent — it passes through like a soft ball and racketAI plays it — so the wound stages are exactly the scoreboard. That also made hp-per-opponent meaningless, so the ladder escalates in racketAI instead: +12% speed per body felled, whiff chance x0.82 per rung. And serving resets to behind the baseline with real deuce/ad mirroring: setupPoint's "serve from wherever you're standing" branch now excludes the match, which falls through to the tennis positioning. Verified live: second serve from z 24.3, x mirrored to the ad side, opponent unwounded by anything but the score. 38 tests, 15 seeds clean. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
1 parent
0620e97d6c
commit
ea6e50f8f8
8 files changed
+73
-17
No files matched your search
@@ -531,23 +531,39 @@ test('a point won tears a wound stage off the body; only the game point fells it
|
||||
assert.ok(!zombies.includes(zb), 'the game-winning point IS the kill');
|
||||
const next = oppOf();
|
||||
assert.ok(next && next !== zb, 'a fresh opponent shambled on');
|
||||
assert.equal(next.hpMax, TUNE.matchOppHp + TUNE.matchOppHpPer, 'with a deeper pool');
|
||||
assert.equal(next.hpMax, TUNE.matchOppHp, 'same flat pool — the ladder escalates in speed/flub, not hp');
|
||||
assert.equal(G.runGames, 1, 'the ladder banked the game');
|
||||
assert.deepEqual(score.pts, [0, 0], 'and the points reset');
|
||||
});
|
||||
|
||||
test('their points draw blood, and the fourth is the run', () => {
|
||||
test('their points draw blood from the MATCH pool, and running dry is the run', () => {
|
||||
startMatch();
|
||||
G.hp = TUNE.playerHp;
|
||||
for (let k = 1; k <= 3; k++) {
|
||||
resolveInterlude('O');
|
||||
assert.equal(G.hp, TUNE.playerHp - k, 'point ' + k + ' cost a wound');
|
||||
assert.notEqual(G.mode, 'eaten');
|
||||
}
|
||||
assert.equal(G.hp, TUNE.matchPlayerHp, 'the match brings its own, deeper pool');
|
||||
resolveInterlude('O');
|
||||
assert.equal(G.hp, TUNE.matchPlayerHp - 1, 'a point costs one');
|
||||
G.hp = 1;
|
||||
resolveInterlude('O');
|
||||
assert.equal(G.mode, 'eaten', 'blood only — and it runs out the way it always does');
|
||||
});
|
||||
|
||||
test('a match ball never wounds the body: the score is the only way through', () => {
|
||||
startMatch();
|
||||
const zb = oppOf();
|
||||
// a full-power ball straight into the opponent — the regicide path, now closed for matches
|
||||
ball.active = true; ball.lastHit = 'P'; ball.y = 1.2; ball.pow = 1; ball.bounces = 0;
|
||||
ball.x = zb.x; ball.z = zb.z; ball.vx = 0; ball.vy = 0; ball.vz = -1;
|
||||
for (let i = 0; i < 5; i++) update(DT);
|
||||
assert.ok(zombies.includes(zb), 'still standing');
|
||||
assert.equal(zb.hp, zb.hpMax, 'and unwounded — "killing by smashing" is out of the match');
|
||||
});
|
||||
|
||||
test('the ladder escalates in speed and reliability, not in hp', () => {
|
||||
// pure arithmetic on the knobs racketAI reads — pinned so a future tuning pass cannot silently
|
||||
// flatten the ladder again
|
||||
assert.ok(TUNE.matchSpeedPer > 0, 'each opponent is faster');
|
||||
assert.ok(TUNE.matchFlubKeep < 1, 'and whiffs less');
|
||||
});
|
||||
|
||||
test('a game won heals, so a clean player can go the distance', () => {
|
||||
startMatch();
|
||||
G.hp = 1;
|
||||
|
||||
Reference in new issue
Block a user