Score Governor
import { scoreGovernor } from 'tods-competition-factory';
The scoreGovernor is a collection of scoring related tools that provide analysis/validation or generate values.
Lightweight independent/reusable components such as scoring dialogs can make use of the scoreGovernor without having to import any Competition Factory engines.
analyzeSet
const {
expectTiebreakSet,
expectTimedSet,
hasTiebreakCondition,
isCompletedSet,
isDecidingSet,
isTiebreakSet,
isValidSet,
isValidSetNumber,
isValidSetOutcome,
setFormat,
sideGameScores,
sideGameScoresCount,
sidePointScores,
sidePointScoresCount,
sideTiebreakScores,
sideTiebreakScoresCount,
winningSide,
} = scoreGovernor.analyzeSet({
matchUpScoringFormat,
setObject,
});
checkSetIsComplete
const hasWinningSide = scoreGovernor.checkSetIsComplete({
set: {
side1Score,
side2Score,
ignoreTiebreak,
matchUpFormat,
isDecidingSet,
isTiebreakSet,
},
});
generateScoreString
const sets = [
{
side1Score: 6,
side2Score: 7,
side1TiebreakScore: 3,
side2TiebreakScore: 7,
winningSide: 2,
},
{
side1Score: 7,
side2Score: 6,
side1TiebreakScore: 14,
side2TiebreakScore: 12,
winningSide: 1,
},
{ side1Score: 3 },
];
let result = scoreGovernor.generateScoreString({
sets, // TODS sets object
winningSide, // optional - 1 or 2
reversed, // optional - reverse the score
winnerFirst = true, // optional - boolean - tranform sets so that winningSide is first (on left)
matchUpStatus, // optional - used to annotate scoreString
addOutcomeString, // optional - tranform matchUpStatus into outcomeString appended to scoreString
autoComplete: true, // optional - complete missing set score
});
getSetComplement
Returns complementary sideScore given a lowValue
, tieBreakAt
and setTo
details.
const [side1Score, side2Score] = scoreGovernor.getSetComplement({
tiebreakAt,
lowValue,
isSide1,
setTo,
});
getTiebreakComplement
Returns complementary sideScore given a lowValue
, tieBreakNoAd
and tiebreakTo
details.
const [side1Score, side2Score] = scoreGovernor.getSetComplement({
tiebreakNoAd, // boolean whether tiebreak is "no advantage"
tiebreakTo,
lowValue,
isSide1,
});
generateTieMatchUpScore
Returns string representation of current tieMatchUp score.
const { scoreStringSide1, scoreStringSide2, set, winningSide } = scoreGovernor.generateTieMatchUpScore({
matchUp, // must have { matchUpType: 'TEAM' }
separator, // optional - defaults to '-'
});
isValidMatchUpFormat
Returns boolean indicating whether matchUpFormat code is valid.
const valid = scoreGovernor.isValidMatchUpFormat({ matchUpFormat });
keyValueScore
Utility for generating score strings based on key entry. Please see keyValueScore.test.js
in the source for more detail.
participantResults
An array of { drawPosition, participantId, participantResult }
objects is returned for each group of processed matchUps.
In the example given below 3 of 4 participants were tied with equivalent metrics and final rankOrder
was determined by Head to Head analysis.
See Round Robin Tally Policy.
{
drawPosition: 4,
participantId: 'uniqueParticipantId1',
participantResult: {
allDefaults: 0,
defaults: 0,
retirements: 0,
walkovers: 0,
matchUpsWon: 3,
matchUpsLost: 1,
victories: [
'uniqueMatchUpId1',
'uniqueMatchUpId2',
'uniqueMatchUpId3',
],
defeats: ['uniqueMatchUpId4'],
matchUpsCancelled: 0,
setsWon: 6,
setsLost: 2,
gamesWon: 36,
gamesLost: 12,
pointsWon: 0,
pointsLost: 0,
setsPct: 3,
matchUpsPct: 3,
gamesPct: 0.75,
pointsPct: 0,
result: '3/1',
games: '36/12',
provisionalOrder: 1, // order when ROUND_ROBIN groups are incomplete;
groupOrder: 1, // order including manually entered 'subOrder' (for statistical ties)
rankOrder: 1, // order without manually entered 'subOrder'
GEMscore: 30003000075000000,
},
};
GEMscore
GEMscore
is a hash of key participant metrics and is used for sorting participants from multiple groups where Head to Head does not apply.
This is used to determine "seedProxies" when ordered participants from each group progress to playoff strutures.
const GEM =
matchUpsPct * Math.pow(10, 20) +
tieMatchUpsPct * Math.pow(10, 16) +
setsPct * Math.pow(10, 12) +
gamesPct * Math.pow(10, 8) +
pointsPct * Math.pow(10, 3);
parseScoreString
Produces TODS sets objects.
const sets = mocksEngine.parseScoreString({ scoreString: '1-6 1-6' });
/*
console.log(sets)
[
({
side1Score: 1,
side2Score: 6,
side1TiebreakScore: undefined,
side2TiebreakScore: undefined,
winningSide: 2,
setNumber: 1,
},
{
side1Score: 1,
side2Score: 6,
side1TiebreakScore: undefined,
side2TiebreakScore: undefined,
winningSide: 2,
setNumber: 2,
})
];
*/
validateTieFormat
Provides validation for tieFormat
objects. See tieFormats.
const {
valid, // boolean whether valid or not
error,
} = scoreGovernor.validateTieFormat({
checkCollectionIds, // ensure collectionId is present on all collections
enforceGender,
tieFormat,
gender,
});