+
+ 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);
+ }
+ }
+
+