]> git.localhorst.tv Git - alttp.git/blobdiff - app/Models/Tournament.php
server calculated scoring
[alttp.git] / app / Models / Tournament.php
index 217622bb9681c950d6b4113b38464ef6bf4ed167..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);
        }