diff --git a/src/lib/components/home/HighscoreColumn.svelte b/src/lib/components/home/HighscoreColumn.svelte index 940cb4b..7d7a14b 100644 --- a/src/lib/components/home/HighscoreColumn.svelte +++ b/src/lib/components/home/HighscoreColumn.svelte @@ -22,8 +22,15 @@ 1: { c: Balloon, size: 38 }, 2: { c: Cloud, size: 52 }, 3: { c: Moon, size: 40 }, - 4: { c: Star, size: 36 }, + 4: { c: Star, size: 34 }, }; + + // Gebrauchte Zeit nur bei voll geschafften Läufen (Sterne): Sekunden, ab 60s als M:SS. + function fmtTime(ms: number): string { + const s = Math.round(ms / 1000); + if (s < 60) return `${s}`; + return `${Math.floor(s / 60)}:${String(s % 60).padStart(2, '0')}`; + }
@@ -46,6 +53,15 @@ {/if} + {#if slot.stage === 4 && slot.timeMs != null} + + + {fmtTime(slot.timeMs)} + + {/if} {:else}
{/if} @@ -93,6 +109,21 @@ align-items: center; justify-content: center; } + .time { + position: absolute; + bottom: 5px; + left: 50%; + transform: translateX(-50%); + display: flex; + align-items: center; + gap: 3px; + color: var(--c-rocket-window); + } + .time-num { + font-size: 13px; + font-weight: 800; + line-height: 1; + } .placeholder { width: 32px; height: 32px; diff --git a/src/lib/game/persistence.ts b/src/lib/game/persistence.ts index 819c8ca..cfe1335 100644 --- a/src/lib/game/persistence.ts +++ b/src/lib/game/persistence.ts @@ -6,7 +6,7 @@ const SCHEMA_VERSION = 1; const PROGRESS_KEY = 'zahlzerlegung.progress'; const SETTINGS_KEY = 'zahlzerlegung.settings'; -export type RunRecord = { stage: Stage; date: string }; +export type RunRecord = { stage: Stage; date: string; timeMs?: number }; export type TargetProgress = { runs: number; @@ -87,10 +87,11 @@ export function recordRun( p: Progress, target: Target, stage: Stage, - date: string = new Date().toISOString() + date: string = new Date().toISOString(), + timeMs?: number ): Progress { const prev = p.perTarget[target] ?? { runs: 0, top5: [] }; - const next: RunRecord = { stage, date }; + const next: RunRecord = { stage, date, timeMs }; const merged = [...prev.top5, next].sort((a, b) => { if (b.stage !== a.stage) return b.stage - a.stage; return b.date.localeCompare(a.date); diff --git a/src/lib/stores/game.ts b/src/lib/stores/game.ts index c8e0a7c..d4e84cb 100644 --- a/src/lib/stores/game.ts +++ b/src/lib/stores/game.ts @@ -71,7 +71,9 @@ function tick() { function finalize() { const g = get(game); if (g.target === null) return; - recordResult(g.target, stageFor(g.correctCount)); + // Gebrauchte Zeit = verstrichene Zeit bis zum Ende (bei Sieg = Lösezeit für alle 10). + const elapsedMs = Math.max(0, g.totalMs - g.timeLeftMs); + recordResult(g.target, stageFor(g.correctCount), elapsedMs); } export function startGame(target: Target): void { diff --git a/src/lib/stores/progress.ts b/src/lib/stores/progress.ts index e38fd03..3ccc3e2 100644 --- a/src/lib/stores/progress.ts +++ b/src/lib/stores/progress.ts @@ -21,8 +21,8 @@ progress.subscribe((p) => { if (typeof window !== 'undefined') saveProgress(p); }); -export function recordResult(target: Target, stage: Stage): void { +export function recordResult(target: Target, stage: Stage, timeMs?: number): void { const date = new Date().toISOString(); - progress.update((p) => recordRun(p, target, stage, date)); + progress.update((p) => recordRun(p, target, stage, date, timeMs)); lastRun.set({ target, stage, date }); }