From 89e4e6c121f9021bcfaa7dd385257a909a386cad Mon Sep 17 00:00:00 2001 From: Jeroen De Meerleer Date: Sat, 1 Jun 2019 16:39:58 +0200 Subject: [PATCH] MAJOR UPDATE: Generalization + Tiebreaks --- src/Constants.php | 17 + src/Enums/Tiebreak.php | 31 ++ src/Enums/TournamentSystem.php | 2 +- .../IncompatibleReaderException.php | 6 +- src/Exceptions/LibpairtwoException.php | 4 +- src/Interfaces/ReaderInterface.php | 5 +- src/Models/Game.php | 36 ++- src/Models/Pairing.php | 36 ++- src/Models/Player.php | 289 +++++------------ src/Models/Round.php | 21 +- src/Models/Tournament.php | 193 +++++++++--- src/Player.php | 99 ++++++ src/Readers/Models/Pairtwo6.php | 44 +-- src/Readers/Pairtwo6.php | 141 +++++++-- src/Sws.php | 6 +- src/Tiebreaks.php | 295 ++++++++++++++++++ src/Tournament.php | 157 +++++++++- tests/ReadSws_test.php | 37 ++- 18 files changed, 1047 insertions(+), 372 deletions(-) create mode 100644 src/Constants.php create mode 100644 src/Enums/Tiebreak.php create mode 100644 src/Tiebreaks.php diff --git a/src/Constants.php b/src/Constants.php new file mode 100644 index 0000000..4fa0c64 --- /dev/null +++ b/src/Constants.php @@ -0,0 +1,17 @@ +white; } /** - * @param Pairing $white + * @param Pairing|null $white + * @return Game */ - public function setWhite($white): void + public function setWhite(?Pairing $white): Game { $this->white = $white; + return $this; } /** - * @return Pairing + * @return Pairing|null */ - public function getBlack() + public function getBlack(): ?Pairing { return $this->black; } /** - * @param Pairing $black + * @param Pairing|null $black + * @return Game */ - public function setBlack($black): void + public function setBlack(?Pairing $black): Game { $this->black = $black; + return $this; } /** - * @return GameResult + * @return Gameresult|null */ - public function getResult() + public function getResult(): ?Gameresult { return $this->result; } /** - * @param GameResult $result + * @param Gameresult|null $result + * @return Game */ - public function setResult(GameResult $result): void + public function setResult(?Gameresult $result): Game { $this->result = $result; + return $this; } } diff --git a/src/Models/Pairing.php b/src/Models/Pairing.php index 8fc31a4..594fb28 100644 --- a/src/Models/Pairing.php +++ b/src/Models/Pairing.php @@ -14,10 +14,10 @@ use JeroenED\Libpairtwo\Player; abstract class Pairing { - /** @var Player */ + /** @var Player|null */ private $Player; - /** @var Player */ + /** @var Player|null */ private $Opponent; /** @var Color */ @@ -30,35 +30,39 @@ abstract class Pairing private $Round; /** - * @return Player + * @return Player|null */ - public function getPlayer() + public function getPlayer(): ?Player { return $this->Player; } /** - * @param Player $Player + * @param Player|null $Player + * @return Pairing */ - public function setPlayer(Player $Player): void + public function setPlayer(?Player $Player): Pairing { $this->Player = $Player; + return $this; } /** - * @return Player + * @return Player|null */ - public function getOpponent() + public function getOpponent(): ?Player { return $this->Opponent; } /** - * @param Player $Opponent + * @param Player|null $Opponent + * @return Pairing */ - public function setOpponent(Player $Opponent): void + public function setOpponent(?Player $Opponent): Pairing { $this->Opponent = $Opponent; + return $this; } /** @@ -71,10 +75,12 @@ abstract class Pairing /** * @param Color $Color + * @return Pairing */ - public function setColor(Color $Color): void + public function setColor(Color $Color): Pairing { $this->Color = $Color; + return $this; } /** @@ -87,10 +93,12 @@ abstract class Pairing /** * @param Result $Result + * @return Pairing */ - public function setResult(Result $Result): void + public function setResult(Result $Result): Pairing { $this->Result = $Result; + return $this; } /** @@ -103,9 +111,11 @@ abstract class Pairing /** * @param int $Round + * @return Pairing */ - public function setRound(int $Round): void + public function setRound(int $Round): Pairing { $this->Round = $Round; + return $this; } } diff --git a/src/Models/Player.php b/src/Models/Player.php index eaa396d..18e8ebd 100644 --- a/src/Models/Player.php +++ b/src/Models/Player.php @@ -18,42 +18,22 @@ abstract class Player /** @var string */ private $Name; - /** @var int */ - private $Rank; + /** @var int[] */ + private $Ids; - /** @var int */ - private $FideId; - - /** @var int */ - private $ExtraPts; - - /** @var int */ - private $KbsbElo; + /** @var int[] */ + private $Elos; /** @var DateTime */ - private $dateofbirth; + private $DateOfBirth; - /** @var int */ - private $KbsbID; - - /** @var float */ - private $Points; - - /** @var int */ - private $ClubNr; - - /** @var float */ - private $ScoreBucholtz; - - /** @var float */ - private $ScoreAmerican; - - /** @var int */ - private $FideElo; + /** @var float[] */ + private $Tiebreaks = []; /** @var string */ private $Nation; + // TODO: Implement categories /** @var string */ private $Category; @@ -63,15 +43,12 @@ abstract class Player /** @var Gender */ private $Gender; - /** @var int */ - private $NumberOfTies; - - /** @var bool */ - private $Absent; - /** @var Pairing[] */ private $Pairings = []; + /** @var bool|DateTime|int|string[] */ + private $BinaryData; + /** * @return string */ @@ -82,186 +59,84 @@ abstract class Player /** * @param string $Name + * @return Player */ - public function setName($Name): void + public function setName(string $Name): Player { $this->Name = $Name; + return $this; } /** - * @return int + * @return string[] */ - public function getRank(): int + public function getIds(): ?array { - return $this->Rank; + return $this->Ids; } /** - * @param int $Rank + * @param string[] $Ids + * @return Player */ - public function setRank(int $Rank): void + public function setIds(array $Ids): Player { - $this->Rank = $Rank; + $this->Ids = $Ids; + return $this; } /** - * @return int + * @return int[] */ - public function getFideId(): int + public function getElos(): ?array { - return $this->FideId; + return $this->Elos; } /** - * @param int $FideId + * @param int[] $Elos + * @return Player */ - public function setFideId(int $FideId): void + public function setElos(array $Elos): Player { - $this->FideId = $FideId; + $this->Elos = $Elos; + return $this; } /** - * @return int + * @return \DateTime */ - public function getExtraPts(): int + public function getDateOfBirth(): \DateTime { - return $this->ExtraPts; + return $this->DateOfBirth; } /** - * @param int $ExtraPts + * @param \DateTime $DateOfBirth + * @return Player */ - public function setExtraPts(int $ExtraPts): void + public function setDateOfBirth(\DateTime $DateOfBirth): Player { - $this->ExtraPts = $ExtraPts; + $this->DateOfBirth = $DateOfBirth; + return $this; } /** - * @return int + * @return float[] */ - public function getKbsbElo(): int + public function getTiebreaks(): array { - return $this->KbsbElo; + return $this->Tiebreaks; } /** - * @param int $KbsbElo + * @param float[] $Tiebreaks + * @return Player */ - public function setKbsbElo(int $KbsbElo): void + public function setTiebreaks(array $Tiebreaks): Player { - $this->KbsbElo = $KbsbElo; - } - - /** - * @return DateTime - */ - public function getDateofbirth(): DateTime - { - return $this->dateofbirth; - } - - /** - * @param DateTime $dateofbirth - */ - public function setDateofbirth(DateTime $dateofbirth): void - { - $this->dateofbirth = $dateofbirth; - } - - /** - * @return int - */ - public function getKbsbID(): int - { - return $this->KbsbID; - } - - /** - * @param int $KbsbID - */ - public function setKbsbID(int $KbsbID): void - { - $this->KbsbID = $KbsbID; - } - - /** - * @return float - */ - public function getPoints(): float - { - return $this->Points; - } - - /** - * @param float $Points - */ - public function setPoints(float $Points): void - { - $this->Points = $Points; - } - - /** - * @return int - */ - public function getClubNr(): int - { - return $this->ClubNr; - } - - /** - * @param int $ClubNr - */ - public function setClubNr(int $ClubNr): void - { - $this->ClubNr = $ClubNr; - } - - /** - * @return float - */ - public function getScoreBucholtz(): float - { - return $this->ScoreBucholtz; - } - - /** - * @param float $ScoreBucholtz - */ - public function setScoreBucholtz(float $ScoreBucholtz): void - { - $this->ScoreBucholtz = $ScoreBucholtz; - } - - /** - * @return int - */ - public function getScoreAmerican(): int - { - return $this->ScoreAmerican; - } - - /** - * @param int $ScoreAmerican - */ - public function setScoreAmerican(int $ScoreAmerican): void - { - $this->ScoreAmerican = $ScoreAmerican; - } - - /** - * @return int - */ - public function getFideElo(): int - { - return $this->FideElo; - } - - /** - * @param int $FideElo - */ - public function setFideElo(int $FideElo): void - { - $this->FideElo = $FideElo; + $this->Tiebreaks = $Tiebreaks; + return $this; } /** @@ -278,10 +153,12 @@ abstract class Player * example value: BEL * * @param string $Nation + * @return Player */ - public function setNation(string $Nation): void + public function setNation(string $Nation): Player { $this->Nation = $Nation; + return $this; } /** @@ -294,10 +171,12 @@ abstract class Player /** * @param string $Category + * @return Player */ - public function setCategory(string $Category): void + public function setCategory(string $Category): Player { $this->Category = $Category; + return $this; } /** @@ -310,10 +189,12 @@ abstract class Player /** * @param Title $Title + * @return Player */ - public function setTitle(Title $Title): void + public function setTitle(Title $Title): Player { $this->Title = $Title; + return $this; } /** @@ -326,42 +207,12 @@ abstract class Player /** * @param Gender $Gender + * @return Player */ - public function setGender(Gender $Gender): void + public function setGender(Gender $Gender): Player { $this->Gender = $Gender; - } - - /** - * @return int - */ - public function getNumberOfTies(): int - { - return $this->NumberOfTies; - } - - /** - * @param int $NumberOfTies - */ - public function setNumberOfTies(int $NumberOfTies): void - { - $this->NumberOfTies = $NumberOfTies; - } - - /** - * @return bool - */ - public function getAbsent(): bool - { - return $this->Absent; - } - - /** - * @param bool $Absent - */ - public function setAbsent(bool $Absent): void - { - $this->Absent = $Absent; + return $this; } /** @@ -374,9 +225,31 @@ abstract class Player /** * @param Pairing[] $Pairings + * @return Player */ - public function setPairings(array $Pairings): void + public function setPairings(array $Pairings): Player { $this->Pairings = $Pairings; + return $this; + } + + /** + * @param string $Key + * @return bool|DateTime|int|string + */ + public function getBinaryData(string $Key) + { + return $this->BinaryData[$Key]; + } + + /** + * @param string $Key + * @param bool|int|DateTime|string $Value + * @return Player + */ + public function setBinaryData(string $Key, $Value): Player + { + $this->BinaryData[$Key] = $Value; + return $this; } } diff --git a/src/Models/Round.php b/src/Models/Round.php index 33bfde7..dcdd277 100644 --- a/src/Models/Round.php +++ b/src/Models/Round.php @@ -28,35 +28,38 @@ abstract class Round /** * @return DateTime - * */ - public function getDate() + public function getDate(): DateTime { return $this->date; } /** * @param DateTime $date + * @return Round */ - public function setDate($date): void + public function setDate(DateTime $date): Round { $this->date = $date; + return $this; } /** * @return Game[] */ - public function getGames() + public function getGames(): array { return $this->games; } /** * @param Game[] $games + * @return Round */ - public function setGames($games): void + public function setGames(array $games): Round { $this->games = $games; + return $this; } /** @@ -69,10 +72,12 @@ abstract class Round /** * @param int $roundNo + * @return Round */ - public function setRoundNo(int $roundNo): void + public function setRoundNo(int $roundNo): Round { $this->roundNo = $roundNo; + return $this; } /** @@ -85,9 +90,11 @@ abstract class Round /** * @param Pairing[] $pairings + * @return Round */ - public function setPairings(array $pairings): void + public function setPairings(array $pairings): Round { $this->pairings = $pairings; + return $this; } } diff --git a/src/Models/Tournament.php b/src/Models/Tournament.php index 63467d3..6a11f96 100644 --- a/src/Models/Tournament.php +++ b/src/Models/Tournament.php @@ -26,6 +26,7 @@ namespace JeroenED\Libpairtwo\Models; +use JeroenED\Libpairtwo\Enums\Tiebreak; use JeroenED\Libpairtwo\Enums\TournamentSystem; use JeroenED\Libpairtwo\Player; use DateTime; @@ -71,7 +72,7 @@ abstract class Tournament private $NoOfRounds; /** @var Round[] */ - private $Rounds; + private $Rounds = []; /** @var int */ private $Participants; @@ -95,13 +96,22 @@ abstract class Tournament private $Federation; /** @var Player[] */ - private $Players; + private $Players = []; /** @var int */ private $Year; /** @var Pairing[] */ - private $Pairings; + private $Pairings = []; + + /** @var Tiebreak[] */ + private $Tiebreaks = []; + + /** @var string */ + private $PriorityElo = 'Fide'; + + /** @var string */ + private $PriorityId = 'Nation'; /** * @return string @@ -113,10 +123,12 @@ abstract class Tournament /** * @param string $Name + * @return Tournament */ - public function setName(string $Name): void + public function setName(string $Name): Tournament { $this->Name = $Name; + return $this; } /** @@ -129,26 +141,12 @@ abstract class Tournament /** * @param string $Organiser + * @return Tournament */ - public function setOrganiser(string $Organiser): void + public function setOrganiser(string $Organiser): Tournament { $this->Organiser = $Organiser; - } - - /** - * @return string - */ - public function getOrganiserClub(): string - { - return $this->OrganiserClub; - } - - /** - * @param string $OrganiserClub - */ - public function setOrganiserClub(string $OrganiserClub): void - { - $this->OrganiserClub = $OrganiserClub; + return $this; } /** @@ -161,10 +159,30 @@ abstract class Tournament /** * @param int $OrganiserClubNo + * @return Tournament */ - public function setOrganiserClubNo(int $OrganiserClubNo): void + public function setOrganiserClubNo(int $OrganiserClubNo): Tournament { $this->OrganiserClubNo = $OrganiserClubNo; + return $this; + } + + /** + * @return string + */ + public function getOrganiserClub(): string + { + return $this->OrganiserClub; + } + + /** + * @param string $OrganiserClub + * @return Tournament + */ + public function setOrganiserClub(string $OrganiserClub): Tournament + { + $this->OrganiserClub = $OrganiserClub; + return $this; } /** @@ -177,10 +195,12 @@ abstract class Tournament /** * @param string $OrganiserPlace + * @return Tournament */ - public function setOrganiserPlace(string $OrganiserPlace): void + public function setOrganiserPlace(string $OrganiserPlace): Tournament { $this->OrganiserPlace = $OrganiserPlace; + return $this; } /** @@ -193,10 +213,12 @@ abstract class Tournament /** * @param string $OrganiserCountry + * @return Tournament */ - public function setOrganiserCountry(string $OrganiserCountry): void + public function setOrganiserCountry(string $OrganiserCountry): Tournament { $this->OrganiserCountry = $OrganiserCountry; + return $this; } /** @@ -209,10 +231,12 @@ abstract class Tournament /** * @param int $FideHomol + * @return Tournament */ - public function setFideHomol(int $FideHomol): void + public function setFideHomol(int $FideHomol): Tournament { $this->FideHomol = $FideHomol; + return $this; } /** @@ -225,10 +249,12 @@ abstract class Tournament /** * @param DateTime $StartDate + * @return Tournament */ - public function setStartDate(DateTime $StartDate): void + public function setStartDate(DateTime $StartDate): Tournament { $this->StartDate = $StartDate; + return $this; } /** @@ -241,10 +267,12 @@ abstract class Tournament /** * @param DateTime $EndDate + * @return Tournament */ - public function setEndDate(DateTime $EndDate): void + public function setEndDate(DateTime $EndDate): Tournament { $this->EndDate = $EndDate; + return $this; } /** @@ -257,10 +285,12 @@ abstract class Tournament /** * @param string $Arbiter + * @return Tournament */ - public function setArbiter(string $Arbiter): void + public function setArbiter(string $Arbiter): Tournament { $this->Arbiter = $Arbiter; + return $this; } /** @@ -273,26 +303,30 @@ abstract class Tournament /** * @param int $NoOfRounds + * @return Tournament */ - public function setNoOfRounds(int $NoOfRounds): void + public function setNoOfRounds(int $NoOfRounds): Tournament { $this->NoOfRounds = $NoOfRounds; + return $this; } /** * @return Round[] */ - public function getRounds() + public function getRounds(): array { return $this->Rounds; } /** * @param Round[] $Rounds + * @return Tournament */ - public function setRounds(array $Rounds): void + public function setRounds(array $Rounds): Tournament { $this->Rounds = $Rounds; + return $this; } /** @@ -305,10 +339,12 @@ abstract class Tournament /** * @param int $Participants + * @return Tournament */ - public function setParticipants(int $Participants): void + public function setParticipants(int $Participants): Tournament { $this->Participants = $Participants; + return $this; } /** @@ -321,10 +357,12 @@ abstract class Tournament /** * @param string $Tempo + * @return Tournament */ - public function setTempo(string $Tempo): void + public function setTempo(string $Tempo): Tournament { $this->Tempo = $Tempo; + return $this; } /** @@ -337,10 +375,12 @@ abstract class Tournament /** * @param int $NonRatedElo + * @return Tournament */ - public function setNonRatedElo(int $NonRatedElo): void + public function setNonRatedElo(int $NonRatedElo): Tournament { $this->NonRatedElo = $NonRatedElo; + return $this; } /** @@ -353,10 +393,12 @@ abstract class Tournament /** * @param TournamentSystem $System + * @return Tournament */ - public function setSystem(TournamentSystem $System): void + public function setSystem(TournamentSystem $System): Tournament { $this->System = $System; + return $this; } /** @@ -369,10 +411,12 @@ abstract class Tournament /** * @param string $FirstPeriod + * @return Tournament */ - public function setFirstPeriod(string $FirstPeriod): void + public function setFirstPeriod(string $FirstPeriod): Tournament { $this->FirstPeriod = $FirstPeriod; + return $this; } /** @@ -385,10 +429,12 @@ abstract class Tournament /** * @param string $SecondPeriod + * @return Tournament */ - public function setSecondPeriod(string $SecondPeriod): void + public function setSecondPeriod(string $SecondPeriod): Tournament { $this->SecondPeriod = $SecondPeriod; + return $this; } /** @@ -401,26 +447,30 @@ abstract class Tournament /** * @param string $Federation + * @return Tournament */ - public function setFederation(string $Federation): void + public function setFederation(string $Federation): Tournament { $this->Federation = $Federation; + return $this; } /** * @return Player[] */ - public function getPlayers() + public function getPlayers(): array { return $this->Players; } /** * @param Player[] $Players + * @return Tournament */ - public function setPlayers($Players): void + public function setPlayers(array $Players): Tournament { $this->Players = $Players; + return $this; } /** @@ -433,25 +483,82 @@ abstract class Tournament /** * @param int $Year + * @return Tournament */ - public function setYear(int $Year): void + public function setYear(int $Year): Tournament { $this->Year = $Year; + return $this; } /** * @return Pairing[] */ - public function getPairings() + public function getPairings(): array { return $this->Pairings; } /** * @param Pairing[] $Pairings + * @return Tournament */ - public function setPairings($Pairings): void + public function setPairings(array $Pairings): Tournament { $this->Pairings = $Pairings; + return $this; + } + + /** + * @return Tiebreak[] + */ + public function getTiebreaks(): array + { + return $this->Tiebreaks; + } + + /** + * @param Tiebreak[] $Tiebreaks + * @return Tournament + */ + public function setTiebreaks(array $Tiebreaks): Tournament + { + $this->Tiebreaks = $Tiebreaks; + return $this; + } + + /** + * @return string + */ + public function getPriorityElo(): string + { + return $this->PriorityElo; + } + + /** + * @param string $PriorityElo + * @return Tournament + */ + public function setPriorityElo(string $PriorityElo): Tournament + { + $this->PriorityElo = $PriorityElo; + return $this; + } + /** + * @return string + */ + public function getPriorityId(): string + { + return $this->PriorityId; + } + + /** + * @param string $PriorityId + * @return Tournament + */ + public function setPriorityId(string $PriorityId): Tournament + { + $this->PriorityId = $PriorityId; + return $this; } } diff --git a/src/Player.php b/src/Player.php index 6b63f65..2828e99 100644 --- a/src/Player.php +++ b/src/Player.php @@ -52,4 +52,103 @@ class Player extends PlayerModel return $return; } + + /** + * @param string $type + * @return int + */ + public function getElo(string $type): int + { + return $this->getElos()[$type]; + } + + /** + * @param string $type + * @param int $value + * @return Player + */ + public function setElo(string $type, int $value): Player + { + $currentElos = $this->getElos(); + $currentElos[$type] = $value; + $this->setElos($currentElos); + return $this; + } + + /** + * @param string $type + * @return string + */ + public function getId(string $type): string + { + return $this->getElos()[$type]; + } + + /** + * @param string $type + * @param string $value + * @return Player + */ + public function setId(string $type, string $value): Player + { + $currentIds = $this->getIds(); + $currentIds[$type] = $value; + $this->setIds($currentIds); + return $this; + } + + /** + * @return int + */ + public function getNoOfWins() + { + $wins = 0; + foreach ($this->getPairings() as $pairing) { + if (array_search($pairing->getResult(), Constants::Won) !== false) { + $wins++; + } + } + return $wins; + } + + /** + * @return float + */ + public function getPoints(): float + { + $points = 0; + foreach ($this->getPairings() as $pairing) { + if (array_search($pairing->getResult(), Constants::Won) !== false) { + $points = $points + 1; + } elseif (array_search($pairing->getResult(), Constants::Draw) !== false) { + $points = $points + 0.5; + } + } + return $points; + } + + + /** + * @return int + */ + public function getPerformance(string $type, int $unratedElo) : float + { + $total = 0; + $opponents = 0; + foreach ($this->getPairings() as $pairing) { + if (array_search($pairing->getResult(), Constants::NotPlayed) === false) { + $opponentElo = $pairing->getOpponent()->getElo($type); + $opponentElo = $opponentElo != 0 ? $opponentElo : $unratedElo; + if (array_search($pairing->getResult(), Constants::Won) !== false) { + $total += $opponentElo + 400; + } elseif (array_search($pairing->getResult(), Constants::Lost) !== false) { + $total += $opponentElo - 400; + } elseif (array_search($pairing->getResult(), Constants::Draw) !== false) { + $total += $opponentElo; + } + $opponents++; + } + } + return round($total / $opponents); + } } diff --git a/src/Readers/Models/Pairtwo6.php b/src/Readers/Models/Pairtwo6.php index 305f9e0..84ee58c 100644 --- a/src/Readers/Models/Pairtwo6.php +++ b/src/Readers/Models/Pairtwo6.php @@ -16,7 +16,7 @@ abstract class Pairtwo6 private $BinaryData; /** - * @return String + * @return string */ public function getRelease(): string { @@ -24,11 +24,13 @@ abstract class Pairtwo6 } /** - * @param String $Release + * @param string $Release + * @return Pairtwo6 */ - public function setRelease(string $Release): void + public function setRelease(string $Release): Pairtwo6 { $this->Release = $Release; + return $this; } /** @@ -41,31 +43,33 @@ abstract class Pairtwo6 /** * @param Tournament $Tournament + * @return Pairtwo6 */ - public function setTournament(Tournament $Tournament): void + public function setTournament(Tournament $Tournament): Pairtwo6 { $this->Tournament = $Tournament; + return $this; } - /** - * Returns binary data from the sws-file - * - * @param string - * @return string - */ - public function getBinaryData(string $key) - { - return $this->BinaryData[$key]; - } /** - * Sets binary data - * - * @param string - * @param mixed + * @param string $Key + * @return bool|DateTime|int|string */ - public function setBinaryData(string $key, $data): void + public function getBinaryData(string $Key) { - $this->BinaryData[$key] = $data; + return $this->BinaryData[$Key]; + } + + + /** + * @param string $Key + * @param bool|int|DateTime|string $Value + * @return Pairtwo6 + */ + public function setBinaryData(string $Key, $Value): Pairtwo6 + { + $this->BinaryData[$Key] = $Value; + return $this; } } diff --git a/src/Readers/Pairtwo6.php b/src/Readers/Pairtwo6.php index 5d19746..dbe6da8 100644 --- a/src/Readers/Pairtwo6.php +++ b/src/Readers/Pairtwo6.php @@ -26,6 +26,7 @@ namespace JeroenED\Libpairtwo\Readers; +use JeroenED\Libpairtwo\Enums\Tiebreak; use JeroenED\Libpairtwo\Enums\Title; use JeroenED\Libpairtwo\Enums\Gender; use JeroenED\Libpairtwo\Enums\Color; @@ -59,7 +60,7 @@ class Pairtwo6 extends Pairtwo6Model implements ReaderInterface * @param string $filename * @return Pairtwo6 */ - public function read($filename) + public function read($filename): ReaderInterface { $swshandle = fopen($filename, 'rb'); $swscontents = fread($swshandle, filesize($filename)); @@ -77,7 +78,8 @@ class Pairtwo6 extends Pairtwo6Model implements ReaderInterface } $this->setTournament(new Tournament()); - + $this->getTournament()->setPriorityElo('Nation'); + $this->getTournament()->setPriorityId('Nation'); // UserCountry $length = 4; $this->setBinaryData("UserCountry", $this->readData('Int', substr($swscontents, $offset, $length))); @@ -219,9 +221,62 @@ class Pairtwo6 extends Pairtwo6Model implements ReaderInterface $offset += $length; // TieOrder - $length = 4 * 5; - $this->setBinaryData("TieOrder", $this->readData('Int', substr($swscontents, $offset, $length))); - $offset += $length; + for ($i = 0; $i < 5; $i++) { + $length = 4; + switch ($this->readData('Int', substr($swscontents, $offset, $length))) { + case 1: + $tiebreak = Tiebreak::Buchholz; + break; + case 2: + $tiebreak = Tiebreak::BuchholzMed; + break; + case 3: + $tiebreak = Tiebreak::BuchholzCut; + break; + case 4: + $tiebreak = Tiebreak::Sonneborn; + break; + case 5: + $tiebreak = Tiebreak::Kashdan; + break; + case 6: + $tiebreak = Tiebreak::Cumulative; + break; + case 7: + $tiebreak = Tiebreak::Between; + break; + case 8: + $tiebreak = Tiebreak::Koya; + break; + case 9: + $tiebreak = Tiebreak::Baumbach; + break; + case 10: + $tiebreak = Tiebreak::Performance; + break; + case 11: + $tiebreak = Tiebreak::Aro; + break; + case 12: + $tiebreak = Tiebreak::AroCut; + break; + case 13: + $tiebreak = Tiebreak::BlackPlayed; + break; + case 14: + $tiebreak = Tiebreak::Testmatch; + break; + case 15: + $tiebreak = Tiebreak::Drawing; + break; + case 0: + default: + $tiebreak = Tiebreak::None; + break; + } + $this->getTournament()->addTieBreak(new Tiebreak($tiebreak)); + $offset += $length; + } // Categorie $length = 4 * 10; @@ -242,24 +297,25 @@ class Pairtwo6 extends Pairtwo6Model implements ReaderInterface for ($i = 0; $i < $this->getBinaryData("NewPlayer"); $i++) { $player = new Player(); + // Rank (Unused value) $length = 4; - $player->SetRank($this->readData('Int', substr($swscontents, $offset, $length))); + $player->setBinaryData("Rank", $this->readData('Int', substr($swscontents, $offset, $length))); $offset += $length; $length = 4; - $this->setBinaryData("Players($i)_NamePos", $this->readData('Int', substr($swscontents, $offset, $length))); + $player->setBinaryData("NamePos", $this->readData('Int', substr($swscontents, $offset, $length))); $offset += $length; $length = 4; - $player->SetFideId($this->readData('Int', substr($swscontents, $offset, $length))); + $player->setId('Fide', $this->readData('Int', substr($swscontents, $offset, $length) . "")); $offset += $length; $length = 4; - $player->SetExtraPts($this->readData('Int', substr($swscontents, $offset, $length))); + $player->setBinaryData("ExtraPts", $this->readData('Int', substr($swscontents, $offset, $length))); $offset += $length; $length = 4; - $player->SetKbsbElo($this->readData('Int', substr($swscontents, $offset, $length))); + $player->setElo('Nation', $this->readData('Int', substr($swscontents, $offset, $length))); $offset += $length; $length = 4; @@ -267,35 +323,35 @@ class Pairtwo6 extends Pairtwo6Model implements ReaderInterface $offset += $length; $length = 4; - $player->setKbsbID($this->readData('Int', substr($swscontents, $offset, $length))); + $player->setId('Nation', $this->readData('Int', substr($swscontents, $offset, $length))); $offset += $length; $length = 4; - $player->setPoints($this->readData('Int', substr($swscontents, $offset, $length)) / 2); + $player->setBinaryData("Points", $this->readData('Int', substr($swscontents, $offset, $length)) / 2); $offset += $length; $length = 4; - $player->setClubNr($this->readData('Int', substr($swscontents, $offset, $length))); + $player->setId('Club', $this->readData('Int', substr($swscontents, $offset, $length))); $offset += $length; $length = 4; - $player->setScoreBucholtz($this->readData('Int', substr($swscontents, $offset, $length)) / 2); + $player->setBinaryData("ScoreBuchholz", $this->readData('Int', substr($swscontents, $offset, $length)) / 2); $offset += $length; $length = 4; - $player->setScoreAmerican($this->readData('Int', substr($swscontents, $offset, $length)) / 2); + $player->setBinaryData("ScoreAmerican", $this->readData('Int', substr($swscontents, $offset, $length)) / 2); $offset += $length; $length = 4; - $this->setBinaryData("Players($i)_HelpValue", $this->readData('Int', substr($swscontents, $offset, $length))); + $player->setBinaryData("HelpValue", $this->readData('Int', substr($swscontents, $offset, $length))); $offset += $length; $length = 4; - $player->setFideElo($this->readData('Int', substr($swscontents, $offset, $length))); + $player->setElo('Fide', $this->readData('Int', substr($swscontents, $offset, $length))); $offset += $length; $length = 1; - $this->setBinaryData("Players($i)_NameLength", $this->readData('Int', substr($swscontents, $offset, $length))); + $player->setBinaryData("NameLength", $this->readData('Int', substr($swscontents, $offset, $length))); $offset += $length; $length = 3; @@ -368,39 +424,39 @@ class Pairtwo6 extends Pairtwo6Model implements ReaderInterface $offset += $length; $length = 1; - $player->setNumberOfTies($this->readData('Int', substr($swscontents, $offset, $length))); + $player->setBinaryData('NumberOfTies', $this->readData('Int', substr($swscontents, $offset, $length))); $offset += $length; $length = 1; - $player->setAbsent($this->readData('Bool', substr($swscontents, $offset, $length))); + $player->setBinaryData('Absent', $this->readData('Bool', substr($swscontents, $offset, $length))); $offset += $length; $length = 1; - $this->setBinaryData("Players($i)_ColorDiff", $this->readData('Int', substr($swscontents, $offset, $length))); + $player->setBinaryData("ColorDiff", $this->readData('Int', substr($swscontents, $offset, $length))); $offset += $length; $length = 1; - $this->setBinaryData("Players($i)_ColorPref", $this->readData('Int', substr($swscontents, $offset, $length))); + $player->setBinaryData("ColorPref", $this->readData('Int', substr($swscontents, $offset, $length))); $offset += $length; $length = 1; - $this->setBinaryData("Players($i)_Paired", $this->readData('Int', substr($swscontents, $offset, $length))); + $player->setBinaryData("Paired", $this->readData('Int', substr($swscontents, $offset, $length))); $offset += $length; $length = 1; - $this->setBinaryData("Players($i)_Float", $this->readData('Int', substr($swscontents, $offset, $length))); + $player->setBinaryData("Float", $this->readData('Int', substr($swscontents, $offset, $length))); $offset += $length; $length = 1; - $this->setBinaryData("Players($i)_FloatPrev", $this->readData('Int', substr($swscontents, $offset, $length))); + $player->setBinaryData("FloatPrev", $this->readData('Int', substr($swscontents, $offset, $length))); $offset += $length; $length = 1; - $this->setBinaryData("Players($i)_FloatBefore", $this->readData('Int', substr($swscontents, $offset, $length))); + $player->setBinaryData("FloatBefore", $this->readData('Int', substr($swscontents, $offset, $length))); $offset += $length; $length = 1; - $this->setBinaryData("Players($i)_TieMatch", $this->readData('Int', substr($swscontents, $offset, $length))); + $player->setBinaryData("TieMatch", $this->readData('Int', substr($swscontents, $offset, $length))); $offset += $length; $this->getTournament()->addPlayer($player); @@ -411,9 +467,9 @@ class Pairtwo6 extends Pairtwo6Model implements ReaderInterface $offset += $length; for ($i = 0; $i < $this->getBinaryData("NewPlayer"); $i++) { - $namelength = $this->getBinaryData("Players($i)_NameLength"); - $nameoffset = $this->getBinaryData("Players($i)_NamePos"); $player = $this->getTournament()->getPlayerById($i); + $namelength = $player->getBinaryData("NameLength"); + $nameoffset = $player->getBinaryData("NamePos"); $player->setName($this->readData("String", substr($this->getBinaryData("PlayerNames"), $nameoffset, $namelength))); $this->getTournament()->updatePlayer($i, $player); @@ -499,7 +555,7 @@ class Pairtwo6 extends Pairtwo6Model implements ReaderInterface $system = TournamentSystem::American; break; case 6: - $system = TournamentSystem::Imperial; + $system = TournamentSystem::Keizer; break; case 0: default: @@ -637,6 +693,8 @@ class Pairtwo6 extends Pairtwo6Model implements ReaderInterface } } + $this->addTiebreaks(); + $this->getTournament()->pairingsToRounds(); return $this; } @@ -742,4 +800,27 @@ class Pairtwo6 extends Pairtwo6Model implements ReaderInterface return DateTime::createFromFormat($format, $concat); } + + + /** + * @return $this + */ + private function addTiebreaks(): Pairtwo6 + { + switch ($this->getTournament()->getSystem()) { + case TournamentSystem::Keizer: + $firstElement = new Tiebreak(Tiebreak::Keizer); + break; + case TournamentSystem::American: + $firstElement = new Tiebreak(Tiebreak::American); + break; + case TournamentSystem::Closed: + case TournamentSystem::Swiss: + $firstElement = new Tiebreak(Tiebreak::Points); + } + $tiebreaks = $this->getTournament()->getTiebreaks(); + array_unshift($tiebreaks, $firstElement); + $this->getTournament()->setTiebreaks($tiebreaks); + return $this; + } } diff --git a/src/Sws.php b/src/Sws.php index 18e6386..62f1944 100644 --- a/src/Sws.php +++ b/src/Sws.php @@ -26,7 +26,7 @@ namespace JeroenED\Libpairtwo; - +use JeroenED\LibPairtwo\Exceptions\LibpairtwoException; /** * This class reads a SWS file @@ -41,13 +41,13 @@ class Sws * Reads out $swsfile and returns a Pairtwo6 class object * * @param string $swsfile + * @throws LibpairtwoException * @deprecated */ public static function ReadSws(string $swsfile) { - trigger_error ( "This function is deprecated. Please convert your code to use the new pattern. More info to be found on Github (https://github.com/JeroenED/libpairtwo/wiki/Converting-your-code-to-the-generalized-format).", E_USER_DEPRECATED); + trigger_error("This function is deprecated. Please convert your code to use the new pattern. More info to be found on Github (https://github.com/JeroenED/libpairtwo/wiki/Converting-your-code-to-the-generalized-format).", E_USER_DEPRECATED); $reader = IOFactory::createReader("Pairtwo-6"); return $reader->read($swsfile); } - } diff --git a/src/Tiebreaks.php b/src/Tiebreaks.php new file mode 100644 index 0000000..e4f8778 --- /dev/null +++ b/src/Tiebreaks.php @@ -0,0 +1,295 @@ +getBinaryData('ScoreAmerican'); + } + + + /** + * @param Player $player + * @return float|null + */ + protected function calculateAmerican(Player $player): ?float + { + return $player->getBinaryData('ScoreAmerican'); + } + + + /** + * @param Player $player + * @return float|null + */ + protected function calculatePoints(Player $player): ?float + { + return $player->getPoints(); + } + + + /** + * @param Player $player + * @return float|null + */ + protected function calculateBaumbach(Player $player): ?float + { + $totalwins = 0; + foreach ($player->getPairings() as $pairing) { + if (array_search($pairing->getResult(), Constants::Won) !== false) { + $totalwins++; + } + } + return $totalwins; + } + + + /** + * @param Player $player + * @return float|null + */ + protected function calculateBlackPlayed(Player $player): ?float + { + $totalwins = 0; + foreach ($player->getPairings() as $pairing) { + if (array_search($pairing->getColor(), Constants::Black) !== false) { + $totalwins++; + } + } + return $totalwins; + } + + /** + * @param Player $player + * @return float|null + */ + protected function calculateBlackWin(Player $player): ?float + { + $totalwins = 0; + foreach ($player->getPairings() as $pairing) { + if (array_search($pairing->getColor(), Constants::Black) !== false && array_search($pairing->getResult(), Constants::Won) !== false) { + $totalwins++; + } + } + return $totalwins; + } + + + /** + * @param Player $player + * @param array $opponents + * @param int $key + * @return float|null + */ + protected function calculateMutualResult(Player $player, array $opponents, int $key): ?float + { + $interestingplayers = $opponents; + if ($key != 0) { + $interestingplayers = []; + foreach ($opponents as $opponent) { + if (($opponent->getTiebreaks()[$key - 1] == $player->getTiebreaks()[$key - 1]) && ($player != $opponent)) { + $interestingplayers[] = $opponent; + } + } + } + $points = 0; + $totalmatches = 0; + foreach ($player->getPairings() as $pairing) { + if (array_search($pairing->getOpponent(), $interestingplayers) !== false) { + if (array_search($pairing->getResult(), Constants::Won) !== false) { + $points = $points + 1; + } elseif (array_search($pairing->getResult(), Constants::Draw) !== false) { + $points = $points + 0.5; + } + $totalmatches++; + } + } + if ($totalmatches != count($interestingplayers)) { + $points = null; + } + return $points; + } + + + /** + * @param Player $player + * @param int $cut + * @return float + */ + protected function calculateAverageRating(Player $player, string $type, int $cut = 0): ?float + { + $pairings = $player->getPairings(); + $allratings = []; + foreach ($pairings as $pairing) { + if (array_search($pairing->getResult(), Constants::NotPlayed) === false) { + $toadd = $pairing->getOpponent()->getElo($type); + if ($toadd != 0) { + $allratings[] = $toadd; + } + } + } + sort($allratings); + $allratings = array_slice($allratings, $cut); + return round(array_sum($allratings) / count($allratings)); + } + + + /** + * @param Player $player + * @param int $cut + * @return float|null + */ + protected function calculateAveragePerformance(Player $player, string $type, int $cut = 0): ?float + { + $pairings = $player->getPairings(); + $allratings = []; + foreach ($pairings as $pairing) { + if (array_search($pairing->getResult(), Constants::NotPlayed) === false) { + $toadd = $pairing->getOpponent()->getPerformance($type, $this->getNonRatedElo()); + if ($toadd != 0) { + $allratings[] = $toadd; + } + } + } + sort($allratings); + $allratings = array_slice($allratings, $cut); + return round(array_sum($allratings) / count($allratings)); + } + + + /** + * @param Player $player + * @param int $cut + * @return float|null + */ + protected function calculateKoya(Player $player, int $cut = 50): ?float + { + $tiebreak = 0; + foreach ($player->getPairings() as $plkey => $plpairing) { + if (($plpairing->getOpponent()->getPoints() / count($plpairing->getOpponent()->getPairings()) * 100) >= $cut) { + if (array_search($plpairing->getResult(), Constants::Won) !== false) { + $tiebreak += 1; + } elseif (array_search($plpairing->getResult(), Constants::Draw) !== false) { + $tiebreak += 0.5; + } + } + } + return $tiebreak; + } + + + /** + * @param Player $player + * @param int $cutlowest + * @param int $cuthighest + * @return float|null + */ + protected function calculateBuchholz(Player $player, int $cutlowest = 0, int $cuthighest = 0): ?float + { + $tiebreak = 0; + $intpairings = $player->getPairings(); + + usort($intpairings, function ($a, $b) { + if (is_null($a->getOpponent())) { + return -1; + } + if (is_null($b->getOpponent())) { + return 1; + } + + if ($b->getOpponent()->getPoints() == $a->getOpponent()->getPoints()) { + return 0; + } + return ($a->getOpponent()->getPoints() > $b->getOpponent()->getPoints()) ? 1 : -1; + }); + + $intpairings = array_slice($intpairings, $cutlowest); + $intpairings = array_slice($intpairings, 0, 0 - $cuthighest); + + foreach ($intpairings as $intkey => $intpairing) { + if (!is_null($intpairing->getOpponent())) { + $tiebreak += $intpairing->getOpponent()->getPoints(); + } + } + return $tiebreak; + } + + + /** + * @param Player $player + * @return float|null + */ + protected function calculateSonneborn(Player $player): ?float + { + $tiebreak = 0; + foreach ($player->getPairings() as $key => $pairing) { + if ($pairing->getOpponent()) { + if (array_search($pairing->getResult(), Constants::Won) !== false) { + $tiebreak += $pairing->getOpponent()->getPoints(); + } elseif (array_search($pairing->getResult(), Constants::Draw) !== false) { + $tiebreak += $pairing->getOpponent()->getPoints() / 2; + } + } + } + return $tiebreak; + } + + + /** + * @param Player $player + * @return float|null + */ + protected function calculateKashdan(Player $player): ?float + { + $tiebreak = 0; + foreach ($player->getPairings() as $pairing) { + $toadd = 0; + if (array_search($pairing->getResult(), Constants::Won) !== false) { + $toadd = 3; + } elseif (array_search($pairing->getResult(), Constants::Draw) !== false) { + $toadd = 1; + } elseif (array_search($pairing->getResult(), Constants::Lost) !== false) { + $toadd = 0; + } + + if (array_search($pairing->getResult(), Constants::NotPlayed) !== false) { + $toadd = -1; + } + $tiebreak += $toadd; + } + return $tiebreak; // - $player->getNoOfWins(); + } + + /** + * @param Player $player + * @return float|null + */ + protected function calculateCumulative(Player $player): ?float + { + $tiebreak = 0; + $score = []; + foreach ($player->getPairings() as $pairing) { + $toadd = 0; + if (array_search($pairing->getResult(), Constants::Won) !== false) { + $toadd = 1; + } elseif (array_search($pairing->getResult(), Constants::Draw) !== false) { + $toadd = 0.5; + } + $tiebreak += $toadd; + $score[] = $tiebreak; + } + return array_sum($score); + } +} diff --git a/src/Tournament.php b/src/Tournament.php index e8d794b..1a46af8 100644 --- a/src/Tournament.php +++ b/src/Tournament.php @@ -8,10 +8,10 @@ namespace JeroenED\Libpairtwo; -use JeroenED\Libpairtwo\Models\Tournament as TournamentModel; +use JeroenED\Libpairtwo\Enums\Tiebreak; use JeroenED\Libpairtwo\Enums\Color; -class Tournament extends TournamentModel +class Tournament extends Tiebreaks { /** * Gets a player by its ID @@ -49,6 +49,18 @@ class Tournament extends TournamentModel $this->setPlayers($newArray); } + /** + * Adds a Tiebreak + * + * @param Tiebreak $tiebreak + */ + public function addTiebreak(Tiebreak $tiebreak) + { + $newArray = $this->getTiebreaks(); + $newArray[] = $tiebreak; + $this->setTiebreaks($newArray); + } + /** * Adds a round with given Round object * @@ -190,35 +202,150 @@ class Tournament extends TournamentModel /** * Gets the ranking of the tournament * - * @param bool $americansort * @return Player[] */ - public function getRanking(bool $americansort = false) + public function getRanking() { $players = $this->getPlayers(); - - $americansort ? usort($players, array($this, "SortAmerican")) : usort($players, array($this, "SortNormal")); - - return $players; + foreach ($this->getTiebreaks() as $tbkey=>$tiebreak) { + foreach ($players as $pkey => $player) { + $break = $this->calculateTiebreak($tiebreak, $player, $tbkey); + $tiebreaks = $player->getTiebreaks(); + $tiebreaks[$tbkey] = $break; + $player->setTiebreaks($tiebreaks); + $this->updatePlayer($pkey, $player); + } + } + $sortedplayers[0] = $players; + foreach ($this->getTiebreaks() as $tbkey=>$tiebreak) { + $newgroupkey = 0; + $tosortplayers = $sortedplayers; + $sortedplayers = []; + foreach ($tosortplayers as $groupkey=>$sortedplayerselem) { + usort($tosortplayers[$groupkey], $this->SortTiebreak($tbkey)); + foreach ($tosortplayers[$groupkey] as $playerkey => $player) { + if (!is_null($player->getTiebreaks()[$tbkey])) { + if ($playerkey != 0) { + $newgroupkey++; + if ($player->getTiebreaks()[$tbkey] == $tosortplayers[$groupkey][$playerkey - 1]->getTiebreaks()[$tbkey]) { + $newgroupkey--; + } + } + } + $sortedplayers[$newgroupkey][] = $player; + } + $newgroupkey++; + } + } + $finalarray = []; + foreach ($sortedplayers as $sort1) { + foreach ($sort1 as $player) { + $finalarray[] = $player; + } + } + return $finalarray; } /** * @param Player $a * @param Player $b - * @return int + * @return \Closure */ - private function sortNormal(Player $a, Player $b) + + private function sortTiebreak(int $key) { - return $b->getPoints() - $a->getPoints(); + return function (Player $a, Player $b) use ($key) { + if (($b->getTiebreaks()[$key] == $a->getTiebreaks()[$key]) || ($a->getTiebreaks()[$key] === false) || ($b->getTiebreaks()[$key] === false)) { + return 0; + } + return ($b->getTiebreaks()[$key] > $a->getTiebreaks()[$key]) ? +1 : -1; + }; + } + + + /** + * @return float|null + */ + private function calculateTiebreak(Tiebreak $tiebreak, Player $player, int $tbkey = 0): ?float + { + switch ($tiebreak) { + case Tiebreak::Keizer: + return $this->calculateKeizer($player); + break; + case Tiebreak::American: + return $this->calculateAmerican($player); + break; + case Tiebreak::Points: + return $this->calculatePoints($player); + break; + case Tiebreak::Baumbach: + return $this->calculateBaumbach($player); + break; + case Tiebreak::BlackPlayed: + return $this->calculateBlackPlayed($player); + break; + case Tiebreak::BlackWin: + return $this->calculateBlackWin($player); + break; + case Tiebreak::Between: + return $this->calculateMutualResult($player, $this->getPlayers(), $tbkey); + break; + case Tiebreak::Aro: + return $this->calculateAverageRating($player, $this->getPriorityElo()); + break; + case Tiebreak::AroCut: + return $this->calculateAverageRating($player, $this->getPriorityElo(), 1); + break; + case Tiebreak::Koya: + return $this->calculateKoya($player); + break; + case Tiebreak::Buchholz: + return $this->calculateBuchholz($player); + break; + case Tiebreak::BuchholzCut: + return $this->calculateBuchholz($player, 1); + break; + case Tiebreak::BuchholzMed: + return $this->calculateBuchholz($player, 1, 1); + break; + case Tiebreak::Sonneborn: + return $this->calculateSonneborn($player); + break; + case Tiebreak::Kashdan: + return $this->calculateKashdan($player); + break; + case Tiebreak::Cumulative: + return $this->calculateCumulative($player); + break; + case Tiebreak::AveragePerformance: + return $this->calculateAveragePerformance($player, $this->getPriorityElo()); + break; + case Tiebreak::Performance: + return $player->getPerformance($this->getPriorityElo(), $this->getNonRatedElo()); + break; + default: + return null; + } } /** - * @param Player $a - * @param Player $b + * Return the average rating for tournament + * * @return int */ - private function sortAmerican(Player $a, Player $b) + public function getAverageElo(): int { - return $b->getScoreAmerican() - $a->getScoreAmerican(); + $totalrating = 0; + $players = 0; + foreach ($this->getPlayers() as $player) { + $toadd = $player->getElo($this->getPriorityElo()); + if ($toadd == 0) { + $toadd = $this->getNonRatedElo(); + } + + $totalrating += $toadd; + $players++; + } + return intdiv($totalrating, $players); } } diff --git a/tests/ReadSws_test.php b/tests/ReadSws_test.php index 2b78ce8..be529e1 100644 --- a/tests/ReadSws_test.php +++ b/tests/ReadSws_test.php @@ -46,21 +46,21 @@ echo "Place: " . $sws->getTournament()->getOrganiserPlace() . PHP_EOL; echo "Unrated-Elo: " . $sws->getTournament()->getNonRatedElo() . PHP_EOL; echo "Federation: " . $sws->getTournament()->getFederation() . PHP_EOL; echo "Organiser: " . $sws->getTournament()->getOrganiserClubNo() . PHP_EOL; -echo "Fide Elo P1: " . $sws->getTournament()->getPlayerById(0)->getFideElo() . PHP_EOL; -echo "Fide Elo P2: " . $sws->getTournament()->getPlayerById(1)->getFideElo() . PHP_EOL; -echo "Fide Elo P3: " . $sws->getTournament()->getPlayerById(2)->getFideElo() . PHP_EOL; -echo "KBSB Elo P1: " . $sws->getTournament()->getPlayerById(0)->getKbsbElo() . PHP_EOL; -echo "KBSB Elo P2: " . $sws->getTournament()->getPlayerById(1)->getKbsbElo() . PHP_EOL; -echo "KBSB Elo P3: " . $sws->getTournament()->getPlayerById(2)->getKbsbElo() . PHP_EOL; +echo "Fide Elo P1: " . $sws->getTournament()->getPlayerById(0)->getElo('Fide') . PHP_EOL; +echo "Fide Elo P2: " . $sws->getTournament()->getPlayerById(1)->getElo('Fide') . PHP_EOL; +echo "Fide Elo P3: " . $sws->getTournament()->getPlayerById(2)->getElo('Fide') . PHP_EOL; +echo "KBSB Elo P1: " . $sws->getTournament()->getPlayerById(0)->getElo('Nation') . PHP_EOL; +echo "KBSB Elo P2: " . $sws->getTournament()->getPlayerById(1)->getElo('Nation') . PHP_EOL; +echo "KBSB Elo P3: " . $sws->getTournament()->getPlayerById(2)->getElo('Nation') . PHP_EOL; echo "Name P1: " . $sws->getTournament()->getPlayerById(0)->getName() . PHP_EOL; echo "Name P2: " . $sws->getTournament()->getPlayerById(1)->getName() . PHP_EOL; echo "Name P3: " . $sws->getTournament()->getPlayerById(2)->getName() . PHP_EOL; echo "Gender P1: " . $sws->getTournament()->getPlayerById(0)->getGender()->getKey() . PHP_EOL; echo "Gender P2: " . $sws->getTournament()->getPlayerById(1)->getGender()->getKey() . PHP_EOL; echo "Gender P3: " . $sws->getTournament()->getPlayerById(2)->getGender()->getKey() . PHP_EOL; -echo "Absent P1: " . $sws->getTournament()->getPlayerById(0)->getAbsent() . PHP_EOL; -echo "Absent P2: " . $sws->getTournament()->getPlayerById(1)->getAbsent() . PHP_EOL; -echo "Absent P3: " . $sws->getTournament()->getPlayerById(2)->getAbsent() . PHP_EOL; +echo "Absent P1: " . $sws->getTournament()->getPlayerById(0)->getBinaryData("Absent") . PHP_EOL; +echo "Absent P2: " . $sws->getTournament()->getPlayerById(1)->getBinaryData("Absent") . PHP_EOL; +echo "Absent P3: " . $sws->getTournament()->getPlayerById(2)->getBinaryData("Absent") . PHP_EOL; echo "Date Round 1: " . $sws->getTournament()->getRoundByNo(0)->getDate()->format('d/m/Y') . PHP_EOL; echo "Date Round 2: " . $sws->getTournament()->getRoundByNo(1)->getDate()->format('d/m/Y') . PHP_EOL; echo "Date Round 3: " . $sws->getTournament()->getRoundByNo(2)->getDate()->format('d/m/Y') . PHP_EOL; @@ -70,3 +70,22 @@ echo "Color Pairing 3: " . $sws->getTournament()->getPairings()[3]->getColor()-> echo "Player Pairing 1: " . $sws->getTournament()->getPairings()[0]->getPlayer()->getName() . PHP_EOL; echo "Player Pairing 2: " . $sws->getTournament()->getPairings()[1]->getPlayer()->getName() . PHP_EOL; echo "Player Pairing 3: " . $sws->getTournament()->getPairings()[2]->getPlayer()->getName() . PHP_EOL; +echo "Tiebreak 1: " . $sws->getTournament()->getTiebreaks()[0]->getValue() . PHP_EOL; +echo "Tiebreak 2: " . $sws->getTournament()->getTiebreaks()[1]->getValue() . PHP_EOL; +echo "Tiebreak 3: " . $sws->getTournament()->getTiebreaks()[2]->getValue() . PHP_EOL; +echo "Tiebreak 4: " . $sws->getTournament()->getTiebreaks()[3]->getValue() . PHP_EOL; +echo "Tiebreak 5: " . $sws->getTournament()->getTiebreaks()[4]->getValue() . PHP_EOL; +echo "Tiebreak 6: " . $sws->getTournament()->getTiebreaks()[5]->getValue() . PHP_EOL; +echo "Average Elo: " . $sws->getTournament()->getAverageElo() . PHP_EOL; +foreach ($sws->getTournament()->getRanking() as $player) { + echo str_pad($player->getName() . '(' . $player->getElo($sws->getTournament()->getPriorityElo()) . ') ', 35) . implode_pad(' ', $player->getTiebreaks(), 5, ' ') . PHP_EOL; +} + +function implode_pad($glue, $collection, $padlength, $padstring): string +{ + $newarray = []; + foreach ($collection as $elem) { + $newarray[] = str_pad($elem, $padlength, $padstring); + } + return implode($glue, $newarray); +}