X-Git-Url: https://git.localhorst.tv/?a=blobdiff_plain;f=app%2FModels%2FRound.php;h=0f4847a7edb3bc38a7abb0adf977fd05a1881f8d;hb=537b998e8059c56e3a20ee2a89d42c3bbfbb80b8;hp=b6c9d023917f4076775dd3f5d8f55321bb57c745;hpb=3e970c52e6a46cf9db4f69c5bec9102da53c0744;p=alttp.git diff --git a/app/Models/Round.php b/app/Models/Round.php index b6c9d02..0f4847a 100644 --- a/app/Models/Round.php +++ b/app/Models/Round.php @@ -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)); + } } } }