]> git.localhorst.tv Git - alttp.git/blobdiff - resources/js/helpers/Tournament.js
switch participant list to scoreboard
[alttp.git] / resources / js / helpers / Tournament.js
index 6b4ca28fb93c2c185ec096ed4579707a93f52ead..2c145a83cc5aa48bf6e3b0c4688ae9c4e5967aa4 100644 (file)
@@ -1,6 +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;
@@ -38,6 +79,8 @@ export const sortParticipants = tournament => {
 };
 
 export default {
+       calculateScores,
+       compareScore,
        findParticipant,
        patchResult,
        sortParticipants,