Skip to content

Commit a5a5ae5

Browse files
committed
fix: implement monotonic transition shortening to prevent respawn wipe replay during input mashing
1 parent fe619a5 commit a5a5ae5

3 files changed

Lines changed: 23 additions & 2 deletions

File tree

src/GameScene.ts

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ import { PlayerView } from "./view/PlayerView";
2020
import {
2121
baseTransitionDuration,
2222
type DeathRespawnSequenceKind,
23-
retimedTransitionDuration,
23+
shortenedTransitionDuration,
2424
transitionTimings,
2525
SPAWN_WIPE_VISUALS,
2626
} from "./view/deathRespawn";
@@ -686,7 +686,11 @@ export class GameScene extends Phaser.Scene {
686686
return;
687687
}
688688

689-
transition.totalDuration = retimedTransitionDuration(transition.kind, transition.elapsed);
689+
transition.totalDuration = shortenedTransitionDuration(
690+
transition.kind,
691+
transition.totalDuration,
692+
transition.elapsed,
693+
);
690694
}
691695

692696
private tryApplyBufferedSkip(): void {

src/view/deathRespawn.ts

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,14 @@ export function retimedTransitionDuration(
4444
);
4545
}
4646

47+
export function shortenedTransitionDuration(
48+
kind: DeathRespawnSequenceKind,
49+
currentTotalDuration: number,
50+
elapsed: number,
51+
): number {
52+
return Math.min(currentTotalDuration, retimedTransitionDuration(kind, elapsed));
53+
}
54+
4755
export function transitionTimings(
4856
kind: DeathRespawnSequenceKind,
4957
totalDuration = baseTransitionDuration(kind),

tests/model/death-respawn.test.ts

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ import { PLAYER_INTRO_TIMING } from "../../src/player/intro.ts";
33
import {
44
baseTransitionDuration,
55
retimedTransitionDuration,
6+
shortenedTransitionDuration,
67
transitionTimings,
78
} from "../../src/view/deathRespawn.ts";
89
import { sampleStartIntro } from "../../src/view/startIntro.ts";
@@ -52,4 +53,12 @@ describe("Death and intro presentation math", () => {
5253
expect(spike.wipeCoverAt).toBeGreaterThan(spike.explodeAt);
5354
expect(spike.wipeRevealAt).toBeGreaterThan(spike.wipeCoverAt);
5455
});
56+
57+
test("skip shortening is monotonic, so repeated confirm presses cannot replay the wipe", () => {
58+
const once = shortenedTransitionDuration("normal", 1, 0.1);
59+
const mashedLater = shortenedTransitionDuration("normal", once, 0.55);
60+
61+
expect(once).toBeCloseTo(0.6, 5);
62+
expect(mashedLater).toBeCloseTo(once, 5);
63+
});
5564
});

0 commit comments

Comments
 (0)