Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
35 changes: 27 additions & 8 deletions app/Draft/Commands/GenerateDraft.php
Original file line number Diff line number Diff line change
Expand Up @@ -65,6 +65,17 @@ public function generatePlayerData(): array

$playerNames = [...$this->settings->playerNames];

// Preset teams are defined by the order players are entered in the form
// (adjacent pairs form a team). Capture that mapping from the original
// order *before* the draft-order shuffle below can scramble it.
$presetTeams = [];
if ($this->settings->allianceMode && $this->settings->allianceTeamMode == AllianceTeamMode::PRESET) {
$teamNames = $this->generateTeamNames();
foreach (array_values($playerNames) as $i => $name) {
$presetTeams[$name] = $teamNames[(int) floor($i / 2)];
}
}

if (! $this->settings->presetDraftOrder) {
shuffle($playerNames);
}
Expand All @@ -75,16 +86,24 @@ public function generatePlayerData(): array
}

if ($this->settings->allianceMode) {
$teamNames = $this->generateTeamNames();
$teamPlayers = [];

if ($this->settings->allianceTeamMode == AllianceTeamMode::RANDOM) {
shuffle($players);
}

foreach(array_values($players) as $i => $player) {
$teamName = $teamNames[(int) floor($i / 2)];
$teamPlayers[$player->id->value] = $player->putInTeam($teamName);
if ($this->settings->allianceTeamMode == AllianceTeamMode::PRESET) {
// Teams are fixed: keep each player's preset team regardless of
// the (possibly randomised) draft order.
foreach ($players as $id => $player) {
$teamPlayers[$id] = $player->putInTeam($presetTeams[$player->name]);
}
} else {
// Random teams: pair players up by a fresh shuffle.
$teamNames = $this->generateTeamNames();
$shuffled = array_values($players);
shuffle($shuffled);

foreach ($shuffled as $i => $player) {
$teamName = $teamNames[(int) floor($i / 2)];
$teamPlayers[$player->id->value] = $player->putInTeam($teamName);
}
}

$players = $teamPlayers;
Expand Down
32 changes: 32 additions & 0 deletions app/Draft/Commands/GenerateDraftTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -112,4 +112,36 @@ public function itCanGeneratePlayerDataForAlliances(): void
$this->assertSame('Frank', $players[5]->name);
$this->assertSame('C', $players[5]->team);
}

#[Test]
public function itKeepsPresetTeamsWhenDraftOrderIsRandomised(): void
{
// Preset teams must stay fixed to the pairs entered in the form, even
// when the draft order is randomised (presetDraftOrder = false).
$originalPlayerNames = ['Alice', 'Bob', 'Christine', 'David', 'Elliot', 'Frank'];
$settings = DraftSettingsFactory::make([
'playerNames' => $originalPlayerNames,
'allianceMode' => true,
'allianceTeamMode' => AllianceTeamMode::PRESET,
'presetDraftOrder' => false,
]);

// Run a few times because the draft order is shuffled; the team a player
// belongs to must never change.
for ($run = 0; $run < 20; $run++) {
$draft = (new GenerateDraft($settings))->handle();

$teamByName = [];
foreach ($draft->players as $player) {
$teamByName[$player->name] = $player->team;
}

$this->assertSame('A', $teamByName['Alice']);
$this->assertSame('A', $teamByName['Bob']);
$this->assertSame('B', $teamByName['Christine']);
$this->assertSame('B', $teamByName['David']);
$this->assertSame('C', $teamByName['Elliot']);
$this->assertSame('C', $teamByName['Frank']);
}
}
}