]> git.localhorst.tv Git - alttp.git/blobdiff - resources/js/helpers/Tournament.js
server calculated scoring
[alttp.git] / resources / js / helpers / Tournament.js
index 7dffebbd07d96c1c189d6f51bdef61b62a524365..ec141d12829b9758405314e052ddeae2aba9d7d7 100644 (file)
@@ -1,54 +1,6 @@
 import Participant from './Participant';
 import Round from './Round';
 
-export const calculateScores = tournament => {
-       const runners = getRunners(tournament);
-       const scores = runners.map(participant => ({ participant, score: 0 }));
-       if (!scores.length) return scores;
-       if (!tournament.rounds || !tournament.rounds.length) return scores;
-       tournament.rounds.forEach(round => {
-               const filtered = Participant
-                       .sortByResult(runners, 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;
-                       }
-               }
-       });
-       const sorted = scores.sort(compareScore);
-       let placement = scores.length;
-       let skipped = 0;
-       let lastScore = sorted[0].score;
-       for (let i = 0; i < sorted.length; ++i) {
-               if (sorted[i].score > lastScore) {
-                       placement -= skipped;
-                       skipped = 1;
-                       lastScore = sorted[i].score;
-               } else {
-                       ++skipped;
-               }
-               sorted[i].placement = placement;
-       }
-       return sorted.reverse();
-};
-
 export const compareScore = (a, b) => {
        const a_score = a && a.score ? a.score : 0;
        const b_score = b && b.score ? b.score : 0;
@@ -85,6 +37,28 @@ export const hasTournamentAdmins = tournament => {
        return getTournamentAdmins(tournament).length > 0;
 };
 
+export const patchParticipant = (tournament, participant) => {
+       if (!tournament) return tournament;
+       if (!tournament.participants || !tournament.participants.length) {
+               return {
+                       ...tournament,
+                       participants: [participant],
+               };
+       }
+       if (!tournament.participants.find(p => p.id === participant.id)) {
+               return {
+                       ...tournament,
+                       participants: [...tournament.participants, participant],
+               };
+       }
+       return {
+               ...tournament,
+               participants: tournament.participants.map(
+                       p => p.id === participant.id ? participant : p,
+               ),
+       };
+};
+
 export const patchResult = (tournament, result) => {
        if (!tournament || !tournament.rounds) return tournament;
        return {
@@ -125,7 +99,6 @@ export const sortParticipants = tournament => {
 };
 
 export default {
-       calculateScores,
        compareScore,
        findParticipant,
        getRunners,