X-Git-Url: https://git.localhorst.tv/?a=blobdiff_plain;f=resources%2Fjs%2Fhelpers%2FTournament.js;h=2c145a83cc5aa48bf6e3b0c4688ae9c4e5967aa4;hb=1c3b922ba7143a548c8a7526f5e4384f336e2f1e;hp=1b808fdf3211f8eede21ee009defb1043db3d4d6;hpb=d748feb96453d74aeffec648d6f5f68d9ef3b520;p=alttp.git diff --git a/resources/js/helpers/Tournament.js b/resources/js/helpers/Tournament.js index 1b808fd..2c145a8 100644 --- a/resources/js/helpers/Tournament.js +++ b/resources/js/helpers/Tournament.js @@ -1,5 +1,47 @@ +import Participant from './Participant'; import Round from './Round'; +export const calculateScores = tournament => { + if (!tournament || !tournament.participants || !tournament.participants.length) return []; + const scores = tournament.participants.map(participant => ({ participant, score: 0 })); + if (!tournament.rounds || !tournament.rounds.length) return scores; + tournament.rounds.forEach(round => { + const filtered = Participant + .sortByResult(tournament.participants, round) + .map(p => ({ participant: p, result: Participant.findResult(p, round) })) + .filter(r => r.result && (r.result.time || r.result.forfeit)) + .reverse(); + let running = 0; + let bonus = 1; + let lastResult = null; + for (let i = 0; i < filtered.length; ++i) { + const score = scores.find(s => s.participant.id === filtered[i].participant.id); + if (!score) return; + const result = filtered[i].result; + const betterThanLast = lastResult === null || result.time < lastResult; + if (!result.forfeit && betterThanLast) { + running += bonus; + lastResult = result.time; + bonus = 1; + } else { + ++bonus; + } + if (!result.forfeit) { + score.score += running; + } + } + }); + return scores.sort(compareScore).reverse(); +}; + +export const compareScore = (a, b) => { + const a_score = a && a.score ? a.score : 0; + const b_score = b && b.score ? b.score : 0; + if (a_score < b_score) return -1; + if (b_score < a_score) return 1; + return 0; +}; + export const findParticipant = (tournament, user) => { if (!tournament || !tournament.participants || !tournament.participants.length) return null; if (!user || !user.id) return null; @@ -18,7 +60,28 @@ export const patchResult = (tournament, result) => { }; }; +export const patchRound = (tournament, round) => { + if (!tournament) return tournament; + return { + ...tournament, + rounds: tournament.rounds.map(r => r.id === round.id ? round : r), + }; +}; + +export const sortParticipants = tournament => { + if (!tournament || !tournament.participants || !tournament.participants.length) { + return tournament; + } + return { + ...tournament, + participants: tournament.participants.sort(Participant.compareUsername), + }; +}; + export default { + calculateScores, + compareScore, findParticipant, patchResult, + sortParticipants, };