X-Git-Url: https://git.localhorst.tv/?a=blobdiff_plain;f=app%2FModels%2FTournament.php;h=a38e9bde591a546975a402e361c4f420fa63be17;hb=d32516335ea2534e15256c948e9c38d3de40794b;hp=217622bb9681c950d6b4113b38464ef6bf4ed167;hpb=2b3d5b3d98705cda41a7218d7133234b227e87b6;p=alttp.git diff --git a/app/Models/Tournament.php b/app/Models/Tournament.php index 217622b..a38e9bd 100644 --- a/app/Models/Tournament.php +++ b/app/Models/Tournament.php @@ -2,6 +2,7 @@ namespace App\Models; +use App\Events\ParticipantChanged; use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Model; @@ -9,6 +10,57 @@ class Tournament extends Model { use HasFactory; + + public function getRunners() { + $runners = []; + foreach ($this->participants as $participant) { + if (in_array('runner', $participant->roles)) { + $runners[] = $participant; + } + } + return $runners; + } + + public function updatePlacement() { + $runners = []; + foreach ($this->participants as $p) { + if ($p->isRunner()) { + $p->score = 0; + $runners[] = $p; + } else { + $p->updatePlacement(null, null); + } + } + if (empty($runners)) { + return; + } + foreach ($this->rounds as $round) { + foreach ($runners as $p) { + $result = $p->findResult($round); + if ($result) { + $p->score += $result->score; + } + } + } + + usort($runners, [Participant::class, 'compareScore']); + $reversed = array_reverse($runners); + $placement = count($runners); + $skipped = 0; + $lastScore = $runners[0]->score; + foreach ($runners as $p) { + if ($p->score > $lastScore) { + $placement -= $skipped; + $skipped = 1; + $lastScore = $p->score; + } else { + ++$skipped; + } + $p->updatePlacement($p->score, $placement); + } + } + + public function participants() { return $this->hasMany(Participant::class); }