From 250132a538e896ebe6aa768edd32abbf342af899 Mon Sep 17 00:00:00 2001 From: Claire Nord Date: Sun, 18 Aug 2024 20:06:25 -0700 Subject: [PATCH] app routes room $roomName summary: add batting average --- app/routes/room.$roomName_.summary/coryat.ts | 32 ++++++++++++++++++++ app/routes/room.$roomName_.summary/route.tsx | 15 ++++++++- 2 files changed, 46 insertions(+), 1 deletion(-) diff --git a/app/routes/room.$roomName_.summary/coryat.ts b/app/routes/room.$roomName_.summary/coryat.ts index c3b762e..6f10d61 100644 --- a/app/routes/room.$roomName_.summary/coryat.ts +++ b/app/routes/room.$roomName_.summary/coryat.ts @@ -1,5 +1,37 @@ import { State } from "~/engine"; +/** getBattingAverage returns the number of correct responses and number of + * possible correct responses for a player. */ +export function getBattingAverage(userId: string, state: State) { + const player = state.players.get(userId); + if (!player) { + return [0, 0]; + } + + let numResponses = 0; + let numCorrectResponses = 0; + + for (const roundIsAnswered of state.isAnswered) { + for (const rowIsAnswered of roundIsAnswered) { + for (const { isAnswered, answeredBy } of rowIsAnswered) { + if (!isAnswered) { + continue; + } + const correct = answeredBy.get(player.userId); + if (correct === undefined) { + continue; + } + numResponses += 1; + if (correct) { + numCorrectResponses += 1; + } + } + } + } + + return [numCorrectResponses, numResponses]; +} + /** getCoryat returns the player's score without any wagerable clues. If correct, * add the "natural" value of a clue in this row back in. */ diff --git a/app/routes/room.$roomName_.summary/route.tsx b/app/routes/room.$roomName_.summary/route.tsx index 0f7d60a..8458607 100644 --- a/app/routes/room.$roomName_.summary/route.tsx +++ b/app/routes/room.$roomName_.summary/route.tsx @@ -13,7 +13,7 @@ import { BASE_URL, formatDollars } from "~/utils"; import { getSolve, markSolved } from "~/models/solves.server"; import ScoreChart from "./chart"; -import { getCoryat } from "./coryat"; +import { getBattingAverage, getCoryat } from "./coryat"; import GameSummary from "./summary"; export const meta: MetaFunction = ({ data }) => { @@ -65,9 +65,13 @@ export async function loader({ request, params }: LoaderFunctionArgs) { getCoryat(player.userId, state), ); const combinedCoryat = coryats.reduce((acc, coryat) => acc + coryat, 0); + const battingAverages = sortedPlayers.map((player) => + getBattingAverage(player.userId, state), + ); return json({ sortedPlayers, + battingAverages, coryats, combinedCoryat, game, @@ -119,6 +123,15 @@ export default function PlayGame() { ))} +

Batting averages

+
+ {data.sortedPlayers.map((p, i) => ( + + {p.name}: {data.battingAverages[i][0]} /{" "} + {data.battingAverages[i][1]} + + ))} +