diff --git a/front-end/src/apps/admin/admin-app.tsx b/front-end/src/apps/admin/admin-app.tsx index 1908e81..585b18b 100644 --- a/front-end/src/apps/admin/admin-app.tsx +++ b/front-end/src/apps/admin/admin-app.tsx @@ -76,8 +76,8 @@ export const AdminApp: FC = () => { (t) => t.tournamentKey === tournamentKey ); if (!tournament) return; - // FGC2023 SPECIFIC - if (tournamentKey === '2' || tournamentKey === '3') { + // FGC2024 SPECIFIC + if (tournamentKey === 't3' || tournamentKey === 't4') { await recalculatePlayoffsRankings( tournament.eventKey, tournament.tournamentKey diff --git a/front-end/src/apps/audience-display/displays/seasons/fgc_default/components/alliance-result.tsx b/front-end/src/apps/audience-display/displays/seasons/fgc_default/components/alliance-result.tsx index afea1a5..c501990 100644 --- a/front-end/src/apps/audience-display/displays/seasons/fgc_default/components/alliance-result.tsx +++ b/front-end/src/apps/audience-display/displays/seasons/fgc_default/components/alliance-result.tsx @@ -2,7 +2,14 @@ import styled from '@emotion/styled'; import { FC, useMemo } from 'react'; import RED_BANNER from '../assets/red-top-banner.png'; import BLUE_BANNER from '../assets/blue-top-banner.png'; -import { Alliance, BLUE_STATION, Match, Ranking, Team } from '@toa-lib/models'; +import { + Alliance, + BLUE_STATION, + Match, + QUALIFICATION_LEVEL, + Ranking, + Team +} from '@toa-lib/models'; import { CountryFlag } from './country-flag'; import ArrowUpwardIcon from '@mui/icons-material/ArrowUpward'; import ArrowDownwardIcon from '@mui/icons-material/ArrowDownward'; @@ -12,6 +19,8 @@ import { Breakdown as Breakdown2024 } from '../../fgc_2024'; import { Grid } from '@mui/material'; import BreakdownRow from './breakdown-row'; import { Block } from '@mui/icons-material'; +import { CardStatus } from '@toa-lib/models/build/seasons/FeedingTheFuture'; +import { useCurrentTournament } from 'src/api/use-tournament-data'; const Container = styled.div` display: flex; @@ -150,6 +159,7 @@ export const AllianceResult: FC = ({ ranks, teams }) => { + const tournament = useCurrentTournament(); const participants = match.participants ?? []; const allianceParticipants = participants.filter((p) => alliance === 'red' ? p.station < BLUE_STATION : p.station >= BLUE_STATION @@ -158,6 +168,13 @@ export const AllianceResult: FC = ({ () => (teams ? Object.fromEntries(teams.map((t) => [t.teamKey, t])) : {}), [teams] ); + const isPlayoffs = tournament + ? tournament.tournamentLevel > QUALIFICATION_LEVEL + : false; + const isAllianceRedCard = + allianceParticipants.filter((p) => p.cardStatus === CardStatus.RED_CARD) + .length >= 3; + const showZeroScore = isPlayoffs && isAllianceRedCard; // try to get breakdown sheet let breakdown: ResultsBreakdown[] = []; @@ -224,7 +241,11 @@ export const AllianceResult: FC = ({ TOTAL: - {alliance === 'red' ? match.redScore : match.blueScore} + {showZeroScore + ? 0 + : alliance === 'red' + ? match.redScore + : match.blueScore} diff --git a/front-end/src/apps/scorekeeper/hooks/use-commit-scores.ts b/front-end/src/apps/scorekeeper/hooks/use-commit-scores.ts index e23fd6c..3d0f174 100644 --- a/front-end/src/apps/scorekeeper/hooks/use-commit-scores.ts +++ b/front-end/src/apps/scorekeeper/hooks/use-commit-scores.ts @@ -17,7 +17,10 @@ import { patchWholeMatch, useMatchesForTournament } from 'src/api/use-match-data'; -import { recalculateRankings } from 'src/api/use-ranking-data'; +import { + recalculatePlayoffsRankings, + recalculateRankings +} from 'src/api/use-ranking-data'; import { sendCommitScores } from 'src/api/use-socket'; import { useSeasonFieldControl } from 'src/hooks/use-season-components'; @@ -70,7 +73,11 @@ export const useCommitScoresCallback = () => { await patchWholeMatch(pending); // TODO - When to calculate rankings vs. playoff rankings? - await recalculateRankings(eventKey, tournamentKey); + if (tournamentKey === 't3' || tournamentKey === 't4') { + await recalculatePlayoffsRankings(eventKey, tournamentKey); + } else { + await recalculateRankings(eventKey, tournamentKey); + } fieldControl?.commitScoresForField?.(); sendCommitScores({ eventKey, tournamentKey, id }); setState(MatchState.RESULTS_COMMITTED); diff --git a/lib/models/src/seasons/FeedingTheFuture.ts b/lib/models/src/seasons/FeedingTheFuture.ts index 8bf8ef4..f0a6b1d 100644 --- a/lib/models/src/seasons/FeedingTheFuture.ts +++ b/lib/models/src/seasons/FeedingTheFuture.ts @@ -386,18 +386,18 @@ export function calculatePlayoffsRankings( ...(rankingMap.get(participant.teamKey) as SeasonRanking) }; - if (participant.cardStatus === CardStatus.RED_CARD) { - ranking.played += 1; - rankingMap.set(participant.teamKey, ranking); - continue; - } - - if (participant.station < 20) { + if ( + participant.station < 20 && + participant.cardStatus <= CardStatus.YELLOW_CARD + ) { ranking.rankingScore += match.redScore; - } else if (participant.station >= 20) { + } else if ( + participant.station >= 20 && + participant.cardStatus <= CardStatus.YELLOW_CARD + ) { ranking.rankingScore += match.blueScore; } - + ranking.played += 1; rankingMap.set(participant.teamKey, ranking); } }