]> git.localhorst.tv Git - alttp.git/blobdiff - app/Models/Round.php
open tournament type
[alttp.git] / app / Models / Round.php
index b6c9d023917f4076775dd3f5d8f55321bb57c745..0f4847a7edb3bc38a7abb0adf977fd05a1881f8d 100644 (file)
@@ -21,43 +21,67 @@ class Round extends Model
        }
 
        public function updatePlacement() {
-               $runners = [];
-               foreach ($this->tournament->participants as $p) {
-                       if ($p->isRunner()) {
-                               $runners[] = $p;
-                       } else {
-                               $result = $p->findResult($this);
-                               if ($result) {
-                                       $result->updatePlacement(null, null);
+               if ($this->tournament->type == 'open-async') {
+                       $results = $this->results->sort([Result::class, 'compareResult']);
+                       $reversed = $results->reverse();
+
+                       $running = 0;
+                       $bonus = 1;
+                       $lastResult = null;
+                       foreach ($reversed as $result) {
+                               $betterThanLast = is_null($lastResult) || $result->time < $lastResult;
+                               if (!$result->forfeit && $betterThanLast) {
+                                       $running += $bonus;
+                                       $lastResult = $result->time;
+                                       $bonus = 1;
+                               } else {
+                                       ++$bonus;
+                               }
+                               if (!$result->forfeit) {
+                                       $result->updatePlacement($running, count($results) - $running + 1);
+                               } else {
+                                       $result->updatePlacement(0, count($results));
                                }
                        }
-               }
-
-               usort($runners, Participant::compareResult($this));
-               $mapped = array_map(function ($p) {
-                       return ['participant' => $p, 'result' => $p->findResult($this)];
-               }, $runners);
-               $filtered = array_filter($mapped, function($r) {
-                       return $r['result'] && ($r['result']->time || $r['result']->forfeit);
-               });
-               $reversed = array_reverse($filtered);
-
-               $running = 0;
-               $bonus = 1;
-               $lastResult = null;
-               foreach ($reversed as $r) {
-                       $betterThanLast = is_null($lastResult) || $r['result']->time < $lastResult;
-                       if (!$r['result']->forfeit && $betterThanLast) {
-                               $running += $bonus;
-                               $lastResult = $r['result']->time;
-                               $bonus = 1;
-                       } else {
-                               ++$bonus;
+               } else {
+                       $runners = [];
+                       foreach ($this->tournament->participants as $p) {
+                               if ($p->isRunner()) {
+                                       $runners[] = $p;
+                               } else {
+                                       $result = $p->findResult($this);
+                                       if ($result) {
+                                               $result->updatePlacement(null, null);
+                                       }
+                               }
                        }
-                       if (!$r['result']->forfeit) {
-                               $r['result']->updatePlacement($running, count($filtered) - $running + 1);
-                       } else {
-                               $r['result']->updatePlacement(0, count($filtered));
+
+                       usort($runners, Participant::compareResult($this));
+                       $mapped = array_map(function ($p) {
+                               return ['participant' => $p, 'result' => $p->findResult($this)];
+                       }, $runners);
+                       $filtered = array_filter($mapped, function($r) {
+                               return $r['result'] && ($r['result']->time || $r['result']->forfeit);
+                       });
+                       $reversed = array_reverse($filtered);
+
+                       $running = 0;
+                       $bonus = 1;
+                       $lastResult = null;
+                       foreach ($reversed as $r) {
+                               $betterThanLast = is_null($lastResult) || $r['result']->time < $lastResult;
+                               if (!$r['result']->forfeit && $betterThanLast) {
+                                       $running += $bonus;
+                                       $lastResult = $r['result']->time;
+                                       $bonus = 1;
+                               } else {
+                                       ++$bonus;
+                               }
+                               if (!$r['result']->forfeit) {
+                                       $r['result']->updatePlacement($running, count($filtered) - $running + 1);
+                               } else {
+                                       $r['result']->updatePlacement(0, count($filtered));
+                               }
                        }
                }
        }