Skip to content

Commit 7ab1813

Browse files
committed
Asteroids high-score code or the game-over flow, & the Select Players screen may be showing current run best while the initials table shows stored leaderboard
1 parent 2bfb53f commit 7ab1813

2 files changed

Lines changed: 81 additions & 2 deletions

File tree

games/Asteroids/game/AsteroidsGameScene.js

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -558,6 +558,10 @@ export default class AsteroidsGameScene extends Scene {
558558
if (engine.canvas) {
559559
engine.canvas.style.cursor = 'default';
560560
}
561+
// Ensure qualifying game-over scores always enter initials flow before continue/auto-exit paths.
562+
if (!this.initialsEntry.active) {
563+
this.tryBeginInitialsEntry();
564+
}
561565
if (enterPressed && !this.lastEnterPressed && this.isGameOverScreenVisible()) {
562566
this.initialsEntry.cancel();
563567
this.returnToIntroAttract();
@@ -684,6 +688,8 @@ export default class AsteroidsGameScene extends Scene {
684688
}
685689

686690
render(renderer) {
691+
const leaderboardTopScore = this.highScoreService.getTopScore(this.highScoreRows);
692+
const liveHudHighScore = Math.max(this.session.highScore, leaderboardTopScore);
687693
renderer.drawRect(0, 0, this.world.bounds.width, this.world.bounds.height, '#020617');
688694
this.world.starfield.forEach((star) => {
689695
renderer.drawRect(star.x, star.y, star.size, star.size, '#94a3b8');
@@ -698,7 +704,7 @@ export default class AsteroidsGameScene extends Scene {
698704
renderer.drawText('SCORE 1', SCORE_ONE_X, 34, { color: '#ffffff', font: `18px ${HUD_FONT}`, textAlign: 'center' });
699705
renderer.drawText(`${this.session.players[0]?.score || 0}`.padStart(4, '0'), SCORE_ONE_X, 62, { color: scoreOneColor, font: `24px ${HUD_FONT}`, textAlign: 'center' });
700706
renderer.drawText('HIGH SCORE', HIGH_SCORE_X, 34, { color: '#ffffff', font: `18px ${HUD_FONT}`, textAlign: 'center' });
701-
renderer.drawText(`${this.session.highScore}`.padStart(4, '0'), HIGH_SCORE_X, 62, { color: '#ffffff', font: `24px ${HUD_FONT}`, textAlign: 'center' });
707+
renderer.drawText(`${liveHudHighScore}`.padStart(4, '0'), HIGH_SCORE_X, 62, { color: '#ffffff', font: `24px ${HUD_FONT}`, textAlign: 'center' });
702708
renderer.drawText('SCORE 2', SCORE_TWO_X, 34, { color: '#ffffff', font: `18px ${HUD_FONT}`, textAlign: 'center' });
703709
renderer.drawText(`${this.session.players[1]?.score || 0}`.padStart(4, '0'), SCORE_TWO_X, 62, { color: scoreTwoColor, font: `24px ${HUD_FONT}`, textAlign: 'center' });
704710

@@ -762,7 +768,7 @@ export default class AsteroidsGameScene extends Scene {
762768
font: `56px ${HUD_FONT}`,
763769
textAlign: 'center',
764770
});
765-
renderer.drawText(`HIGH SCORE ${String(this.session.highScore).padStart(4, '0')}`, 480, 286, {
771+
renderer.drawText(`HIGH SCORE ${String(leaderboardTopScore).padStart(4, '0')}`, 480, 286, {
766772
color: '#ffffff',
767773
font: `20px ${HUD_FONT}`,
768774
textAlign: 'center',

tests/games/AsteroidsPresentation.test.mjs

Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -85,8 +85,81 @@ function testAsteroidsAttractMenuFlow() {
8585
assert.equal(scene.attractController.active, false);
8686
}
8787

88+
function testAsteroidsGameOverQualifyingScoreInitialsFlow() {
89+
const scene = new AsteroidsGameScene();
90+
const storage = createStorage();
91+
scene.highScoreService = new AsteroidsHighScoreService({ storage, tableSize: 5 });
92+
scene.highScoreRows = [
93+
{ initials: 'ACE', score: 1800 },
94+
{ initials: 'VTR', score: 1400 },
95+
{ initials: 'ION', score: 1000 },
96+
{ initials: 'CPU', score: 700 },
97+
{ initials: 'BOT', score: 500 },
98+
];
99+
scene.session.players = [
100+
{ id: 1, score: 1900, lives: 0, nextExtraLifeScore: 10000, worldState: null },
101+
];
102+
scene.session.activePlayerIndex = 0;
103+
scene.session.mode = 'game-over';
104+
scene.initialsEntry.cancel();
105+
106+
const engine = {
107+
input: createInput(),
108+
canvas: { style: {} },
109+
};
110+
111+
scene.update(0.016, engine);
112+
assert.equal(scene.initialsEntry.active, true);
113+
assert.equal(scene.initialsEntry.score, 1900);
114+
assert.equal(scene.isGameOverScreenVisible(), false);
115+
116+
engine.input = createInput({ pressed: ['Enter'] });
117+
scene.update(0.016, engine);
118+
119+
assert.equal(scene.initialsEntry.active, false);
120+
assert.equal(scene.session.mode, 'menu');
121+
assert.equal(scene.highScoreRows.length, 5);
122+
assert.equal(scene.highScoreRows[0].initials, 'AAA');
123+
assert.equal(scene.highScoreRows[0].score, 1900);
124+
for (let index = 1; index < scene.highScoreRows.length; index += 1) {
125+
assert.equal(scene.highScoreRows[index - 1].score >= scene.highScoreRows[index].score, true);
126+
}
127+
}
128+
129+
function testAsteroidsMenuHighScoreUsesLeaderboardTop() {
130+
const scene = new AsteroidsGameScene();
131+
scene.highScoreRows = [
132+
{ initials: 'ACE', score: 1800 },
133+
{ initials: 'VTR', score: 1400 },
134+
{ initials: 'ION', score: 1000 },
135+
{ initials: 'CPU', score: 700 },
136+
{ initials: 'BOT', score: 500 },
137+
];
138+
scene.session.highScore = 2500;
139+
scene.session.mode = 'menu';
140+
scene.attractController.active = false;
141+
142+
const textCalls = [];
143+
const renderer = {
144+
drawRect() {},
145+
strokeRect() {},
146+
drawPolygon() {},
147+
drawLine() {},
148+
drawCircle() {},
149+
drawText(text, ...rest) {
150+
textCalls.push([text, ...rest]);
151+
},
152+
};
153+
154+
scene.render(renderer);
155+
assert.equal(textCalls.some(([text]) => text === 'HIGH SCORE 1800'), true);
156+
assert.equal(textCalls.some(([text]) => text === 'HIGH SCORE 2500'), false);
157+
}
158+
88159
export function run() {
89160
testAsteroidsHighScoreService();
90161
testAsteroidsInitialsEntry();
91162
testAsteroidsAttractMenuFlow();
163+
testAsteroidsGameOverQualifyingScoreInitialsFlow();
164+
testAsteroidsMenuHighScoreUsesLeaderboardTop();
92165
}

0 commit comments

Comments
 (0)