X-Git-Url: https://git.localhorst.tv/?a=blobdiff_plain;f=app%2FModels%2FTournament.php;h=96e89b8939358aea1b88acfdfa8f1c89270e86aa;hb=e1ecc76c1c6d527502d6576ee19be06df2a15bb7;hp=f8b4804859fd6b03447901574647cf91941ced9b;hpb=c30ac282dde3d746d6a7762ee18c70b4416500b5;p=alttp.git diff --git a/app/Models/Tournament.php b/app/Models/Tournament.php index f8b4804..96e89b8 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,65 @@ 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 hasScoreboard() { + return $this->type == 'signup-async'; + } + + 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 applications() { + return $this->hasMany(Application::class); + } + public function participants() { return $this->hasMany(Participant::class); } @@ -18,7 +78,15 @@ class Tournament extends Model } public function rounds() { - return $this->hasMany(Round::class)->orderBy('created_at'); + return $this->hasMany(Round::class)->orderBy('number', 'DESC'); } + + protected $casts = [ + 'accept_applications' => 'boolean', + 'locked' => 'boolean', + 'no_record' => 'boolean', + 'show_numbers' => 'boolean', + ]; + }