]> git.localhorst.tv Git - alttp.git/blobdiff - app/Models/Tournament.php
server calculated scoring
[alttp.git] / app / Models / Tournament.php
index f8b4804859fd6b03447901574647cf91941ced9b..a38e9bde591a546975a402e361c4f420fa63be17 100644 (file)
@@ -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);
        }
@@ -18,7 +70,7 @@ class Tournament extends Model
        }
 
        public function rounds() {
-               return $this->hasMany(Round::class)->orderBy('created_at');
+               return $this->hasMany(Round::class)->orderBy('number', 'DESC');
        }
 
 }