From 0ee3d8a4d013a6c1253bb3894cc841c35e53a464 Mon Sep 17 00:00:00 2001 From: George Powell Date: Wed, 28 Jan 2026 15:04:29 -0500 Subject: [PATCH] Revamped middle statline (ranking instead of arbitrary percentage) --- src/lib/components/WinScreen.svelte | 403 ++++----- src/routes/+page.svelte | 866 ++++++++++---------- src/routes/api/submit-completion/+server.ts | 10 +- 3 files changed, 656 insertions(+), 623 deletions(-) diff --git a/src/lib/components/WinScreen.svelte b/src/lib/components/WinScreen.svelte index a665a4d..c33f844 100644 --- a/src/lib/components/WinScreen.svelte +++ b/src/lib/components/WinScreen.svelte @@ -1,222 +1,233 @@
- -

- {congratulationsMessage} The verse is from - {bookName}. -

-

- You guessed correctly after {guessCount} - {guessCount === 1 ? "guess" : "guesses"}. - {grade} -

+ +

+ {congratulationsMessage} The verse is from + {bookName}. +

+

+ You guessed correctly after {guessCount} + {guessCount === 1 ? "guess" : "guesses"}. + {grade} +

-
- {#if hasWebShare} - - - - {:else} - - - {/if} -
+
+ {#if hasWebShare} + + + + {:else} + + + {/if} +
- {#if guessCount !== 1} -

- {getNextGradeMessage(guessCount)} -

- {/if} -
+ {#if guessCount !== 1} +

+ {getNextGradeMessage(guessCount)} +

+ {/if} +
- - {#if guessCount === 1} - - {/if} + + {#if guessCount === 1} + + {/if} - + - - {#if statsData} - -
- -
-
- #{statsData.solveRank} -
-
- You were the {toOrdinal(statsData.solveRank)} person to solve today -
-
+ + {#if statsData} + +
+ +
+
+ #{statsData.solveRank} +
+
+ You were the {toOrdinal(statsData.solveRank)} person to solve + today +
+
- -
-
- {Math.round( - ((statsData.totalSolves - statsData.guessRank + 1) / - statsData.totalSolves) * - 100 - )}% -
-
- You ranked {toOrdinal(statsData.guessRank)} of {statsData.totalSolves} - total solves -
-
+ +
+
+ {toOrdinal(statsData.guessRank)} +
+
+ You ranked {toOrdinal(statsData.guessRank)} of {statsData.totalSolves} + {statsData.totalSolves === 1 + ? "solve" + : "solves"}{statsData.tiedCount > 0 + ? `, tied with ${statsData.tiedCount} ${statsData.tiedCount === 1 ? "other" : "others"}` + : ""} +
+
- -
-
- {statsData.averageGuesses} -
-
- People guessed correctly after {statsData.averageGuesses} - {statsData.averageGuesses === 1 ? "guess" : "guesses"} on average -
-
-
-
- {:else if !statsSubmitted} - -
Submitting stats...
-
- {/if} + +
+
+ {statsData.averageGuesses} +
+
+ People guessed correctly after {statsData.averageGuesses} + {statsData.averageGuesses === 1 ? "guess" : "guesses"} on + average +
+
+
+
+ {:else if !statsSubmitted} + +
Submitting stats...
+
+ {/if}
diff --git a/src/routes/+page.svelte b/src/routes/+page.svelte index 5e285fe..af1d8e8 100644 --- a/src/routes/+page.svelte +++ b/src/routes/+page.svelte @@ -1,494 +1,510 @@ - - A daily bible game{isDev ? " (dev)" : ""} - + A daily bible game{isDev ? " (dev)" : ""} +
-
-

- -
-

-
- {isDev ? "Dev Edition | " : ""}{currentDate} -
+
+

+ +
+

+
+ {isDev ? "Dev Edition | " : ""}{currentDate} +
-
- +
+ - {#if !isWon} - - {:else} - { - chapterGuessCompleted = true; - const key = `bibdle-chapter-guess-${dailyVerse.reference}`; - const saved = localStorage.getItem(key); - if (saved) { - const data = JSON.parse(saved); - const match = dailyVerse.reference.match(/\s(\d+):/); - const correctChapter = match ? parseInt(match[1], 10) : 1; - chapterCorrect = data.selectedChapter === correctChapter; - } - }} - /> - {/if} + {#if !isWon} + + {:else} + { + chapterGuessCompleted = true; + const key = `bibdle-chapter-guess-${dailyVerse.reference}`; + const saved = localStorage.getItem(key); + if (saved) { + const data = JSON.parse(saved); + const match = + dailyVerse.reference.match(/\s(\d+):/); + const correctChapter = match + ? parseInt(match[1], 10) + : 1; + chapterCorrect = + data.selectedChapter === correctChapter; + } + }} + /> + {/if} - + - {#if isWon} - - {/if} -
- {#if isDev} - - {/if} -
+ {#if isWon} + + {/if} +
+ {#if isDev} + + {/if} +
diff --git a/src/routes/api/submit-completion/+server.ts b/src/routes/api/submit-completion/+server.ts index 625186e..8039910 100644 --- a/src/routes/api/submit-completion/+server.ts +++ b/src/routes/api/submit-completion/+server.ts @@ -48,13 +48,16 @@ export const POST: RequestHandler = async ({ request }) => { const betterGuesses = allCompletions.filter(c => c.guessCount < guessCount).length; const guessRank = betterGuesses + 1; + // Count ties: how many have the SAME guessCount (excluding self) + const tiedCount = allCompletions.filter(c => c.guessCount === guessCount && c.anonymousId !== anonymousId).length; + // Average guesses const totalGuesses = allCompletions.reduce((sum, c) => sum + c.guessCount, 0); const averageGuesses = Math.round((totalGuesses / totalSolves) * 10) / 10; return json({ success: true, - stats: { solveRank, guessRank, totalSolves, averageGuesses } + stats: { solveRank, guessRank, totalSolves, averageGuesses, tiedCount } }); } catch (err) { console.error('Error submitting completion:', err); @@ -105,13 +108,16 @@ export const GET: RequestHandler = async ({ url }) => { const betterGuesses = allCompletions.filter(c => c.guessCount < guessCount).length; const guessRank = betterGuesses + 1; + // Count ties: how many have the SAME guessCount (excluding self) + const tiedCount = allCompletions.filter(c => c.guessCount === guessCount && c.anonymousId !== anonymousId).length; + // Average guesses const totalGuesses = allCompletions.reduce((sum, c) => sum + c.guessCount, 0); const averageGuesses = Math.round((totalGuesses / totalSolves) * 10) / 10; return json({ success: true, - stats: { solveRank, guessRank, totalSolves, averageGuesses } + stats: { solveRank, guessRank, totalSolves, averageGuesses, tiedCount } }); } catch (err) { console.error('Error fetching stats:', err);