mirror of
https://github.com/tiennm99/ai-coding-workflow-labs.git
synced 2026-08-13 13:22:58 +00:00
feat: add best score tracking (Story 2.1)
Best score updates when current score exceeds it and persists across New Game resets within the session. localStorage persistence comes in Story 2.2.
This commit is contained in:
@@ -1,6 +1,6 @@
|
||||
# Story 2.1: Best Score Tracking
|
||||
|
||||
Status: ready-for-dev
|
||||
Status: done
|
||||
|
||||
## Story
|
||||
|
||||
@@ -15,17 +15,17 @@ so that I have a motivational anchor and can track my all-time progress.
|
||||
|
||||
## Tasks / Subtasks
|
||||
|
||||
- [ ] Task 1: Add bestScore state to App.svelte (AC: #1, #2)
|
||||
- [ ] Add `let bestScore = $state(0);` as a new reactive state variable
|
||||
- [ ] Add `$effect` that watches `gameState.score` — when it exceeds `bestScore`, update `bestScore`
|
||||
- [ ] Replace hardcoded `bestScore={0}` with `bestScore={bestScore}` in the ScoreBoard prop
|
||||
- [x] Task 1: Add bestScore state to App.svelte (AC: #1, #2)
|
||||
- [x] Add `let bestScore = $state(0);` as a new reactive state variable
|
||||
- [x] Add `$effect` that watches `gameState.score` — when it exceeds `bestScore`, update `bestScore`
|
||||
- [x] Replace hardcoded `bestScore={0}` with `bestScore={bestScore}` in the ScoreBoard prop
|
||||
|
||||
- [ ] Task 2: Preserve bestScore across New Game (AC: #2)
|
||||
- [ ] Verify that `handleNewGame()` resets `gameState` via `initGame()` but does NOT reset `bestScore`
|
||||
- [ ] `bestScore` is a separate `$state` variable, not part of `gameState` — it survives `initGame()` by design
|
||||
- [x] Task 2: Preserve bestScore across New Game (AC: #2)
|
||||
- [x] Verify that `handleNewGame()` resets `gameState` via `initGame()` but does NOT reset `bestScore`
|
||||
- [x] `bestScore` is a separate `$state` variable, not part of `gameState` — it survives `initGame()` by design
|
||||
|
||||
- [ ] Task 3: Verify existing tests still pass
|
||||
- [ ] Run `npx vitest run` — all 38 existing tests must pass (no game-logic.js changes)
|
||||
- [x] Task 3: Verify existing tests still pass
|
||||
- [x] Run `npx vitest run` — all 38 existing tests must pass (no game-logic.js changes)
|
||||
|
||||
## Dev Notes
|
||||
|
||||
@@ -98,8 +98,18 @@ This story is intentionally minimal:
|
||||
|
||||
### Agent Model Used
|
||||
|
||||
Claude Opus 4.6 (1M context)
|
||||
|
||||
### Debug Log References
|
||||
|
||||
### Completion Notes List
|
||||
|
||||
- Added `bestScore` as separate `$state(0)` in App.svelte — independent from gameState
|
||||
- Added `$effect` watching `gameState.score` to update bestScore when exceeded
|
||||
- Replaced hardcoded `bestScore={0}` prop with reactive `{bestScore}`
|
||||
- bestScore survives New Game by design — `handleNewGame()` only resets `gameState`
|
||||
- All 38 existing tests pass — no game-logic.js changes needed
|
||||
|
||||
### File List
|
||||
|
||||
- src/App.svelte (modified — added bestScore state, effect, and prop binding)
|
||||
|
||||
@@ -35,7 +35,7 @@
|
||||
# - Dev moves story to 'review', then runs code-review (fresh context, different LLM recommended)
|
||||
|
||||
generated: 2026-04-13
|
||||
last_updated: 2026-04-13T22:21:00
|
||||
last_updated: 2026-04-13T22:33:00
|
||||
project: try-bmad
|
||||
project_key: NOKEY
|
||||
tracking_system: file-system
|
||||
@@ -54,7 +54,7 @@ development_status:
|
||||
|
||||
# Epic 2: Save Progress & Keep Playing
|
||||
epic-2: in-progress
|
||||
2-1-best-score-tracking: ready-for-dev
|
||||
2-1-best-score-tracking: done
|
||||
2-2-game-state-persistence: backlog
|
||||
2-3-keep-playing-mode: backlog
|
||||
epic-2-retrospective: optional
|
||||
|
||||
+8
-1
@@ -7,6 +7,13 @@
|
||||
import { getDirectionFromKey } from './lib/input-handler.js';
|
||||
|
||||
let gameState = $state(initGame());
|
||||
let bestScore = $state(0);
|
||||
|
||||
$effect(() => {
|
||||
if (gameState.score > bestScore) {
|
||||
bestScore = gameState.score;
|
||||
}
|
||||
});
|
||||
|
||||
let tiles = $derived.by(() => {
|
||||
const result = [];
|
||||
@@ -55,7 +62,7 @@
|
||||
<header>
|
||||
<div class="flex items-center justify-between mb-2">
|
||||
<h1 class="text-[80px] font-bold leading-none" style="color: #776e65;">2048</h1>
|
||||
<ScoreBoard score={gameState.score} bestScore={0} />
|
||||
<ScoreBoard score={gameState.score} {bestScore} />
|
||||
</div>
|
||||
<div class="flex items-center justify-between mb-4">
|
||||
<p class="text-[18px]" style="color: #776e65;">Join the numbers and get to the <strong>2048 tile!</strong></p>
|
||||
|
||||
Reference in New Issue
Block a user