public function fire() { $client = $this->client; if ($this->game->getState() != GameState::NIGHT) { $client->getChannelGroupOrDMByID($this->channel)->then(function (ChannelInterface $channel) use($client) { $client->send(":warning: You can only guard at night.", $channel); }); throw new Exception("Guarding occurs only during the night."); } // Voter should be alive if (!$this->game->hasPlayer($this->userId)) { $client->getChannelGroupOrDMByID($this->channel)->then(function (ChannelInterface $channel) use($client) { $client->send(":warning: You aren't alive in the specified channel.", $channel); }); throw new Exception("Can't guard if dead."); } // Person player is voting for should also be alive if (!$this->game->hasPlayer($this->args[1])) { $client->getChannelGroupOrDMByID($this->channel)->then(function (ChannelInterface $channel) use($client) { $client->send(":warning: Could not find that player.", $channel); }); throw new Exception("Voted player not found in game."); } // Person should be werewolf $player = $this->game->getPlayerById($this->userId); if ($player->role != Role::BODYGUARD) { $client->getChannelGroupOrDMByID($this->channel)->then(function (ChannelInterface $channel) use($client) { $client->send(":warning: You have to be a bodyguard to guard.", $channel); }); throw new Exception("Only bodyguard can guard."); } if ($this->game->getGuardedUserId() !== null) { $client->getChannelGroupOrDMByID($this->channel)->then(function (ChannelInterface $channel) use($client) { $client->send(":warning: You have already guarded.", $channel); }); throw new Exception("You have already guarded."); } if ($this->game->getLastGuardedUserId() == $this->args[1]) { $client->getChannelGroupOrDMByID($this->channel)->then(function (ChannelInterface $channel) use($client) { $client->send(":warning: You cant guard the same player as last night.", $channel); }); throw new Exception("You cant guard the same player as last night"); } $this->game->setGuardedUserId($this->args[1]); $client->getChannelGroupOrDMByID($this->channel)->then(function (ChannelInterface $channel) use($client) { $client->send("Guarding successful.", $channel); }); $this->gameManager->changeGameState($this->game->getId(), GameState::DAY); }
public function fire() { $client = $this->client; if ($this->game->getState() != GameState::NIGHT) { $client->getChannelGroupOrDMByID($this->channel)->then(function (Channel $channel) use($client) { $client->send(":warning: You can only kill at night.", $channel); }); throw new Exception("Killing occurs only during the night."); } // Voter should be alive if (!$this->game->hasPlayer($this->userId)) { $client->getChannelGroupOrDMByID($this->channel)->then(function (Channel $channel) use($client) { $client->send(":warning: You aren't alive in the specified channel.", $channel); }); throw new Exception("Can't kill if dead."); } // Person player is voting for should also be alive if (!$this->game->hasPlayer($this->args[0])) { $client->getChannelGroupOrDMByID($this->channel)->then(function (Channel $channel) use($client) { $client->send(":warning: Could not find that player.", $channel); }); throw new Exception("Voted player not found in game."); } // Person should be werewolf $player = $this->game->getPlayerById($this->userId); if ($player->role != Role::WEREWOLF) { $client->getChannelGroupOrDMByID($this->channel)->then(function (Channel $channel) use($client) { $client->send(":warning: YOu have to be a werewolf to kill.", $channel); }); throw new Exception("Only werewolves can kill."); } if ($this->game->hasPlayerVoted($this->userId)) { $client->getChannelGroupOrDMByID($this->channel)->then(function (Channel $channel) use($client) { $client->send(":warning: You have already voted.", $channel); }); throw new Exception("You have already voted."); } $this->game->vote($this->userId, $this->args[1]); $msg = KillFormatter::format($this->game); foreach ($this->game->getPlayersOfRole(Role::WEREWOLF) as $player) { $client->getDMByUserID($player->getId())->then(function (DirectMessageChannel $channel) use($client, $msg) { $client->send($msg, $channel); }); } foreach ($this->game->getPlayersOfRole(Role::WEREWOLF) as $player) { if (!$this->game->hasPlayerVoted($player->getId())) { return; } } $votes = $this->game->getVotes(); if (count($votes) > 1) { $this->game->clearVotes(); foreach ($this->game->getPlayersOfRole(Role::WEREWOLF) as $player) { $client->getDMByUserID($player->getId())->then(function (DirectMessageChannel $channel) use($client) { $client->send(":warning: The werewolves did not unanimously vote on a member of the town. Vote again.", $channel); }); } return; } $this->game->setWolvesVoted(true); $this->gameManager->changeGameState($this->game->getId(), GameState::DAY); }
public function vote(Game $game, $voterId, $voteForId) { if (!$game->hasPlayer($voterId)) { return; } if (!$game->hasPlayer($voteForId)) { return; } if ($game->hasPlayerVoted($voterId)) { return; } $game->vote($voterId, $voteForId); $voteMsg = VoteSummaryFormatter::format($game); $client = $this->client; $client->getChannelGroupOrDMByID($game->getId())->then(function (Channel $channel) use($client, $voteMsg) { $client->send($voteMsg, $channel); }); if (!$game->votingFinished()) { return; } $votes = $game->getVotes(); $vote_count = []; foreach ($votes as $lynch_player_id => $voters) { if (!isset($vote_count[$lynch_player_id])) { $vote_count[$lynch_player_id] = 0; } $vote_count[$lynch_player_id] += count($voters); } $players_to_be_lynched = []; $max = 0; foreach ($vote_count as $lynch_player_id => $num_votes) { if ($num_votes > $max) { $max = $num_votes; } } foreach ($vote_count as $lynch_player_id => $num_votes) { if ($num_votes == $max) { $players_to_be_lynched[] = $lynch_player_id; } } $lynchMsg = "\r\n:newspaper: With pitchforks in hand, the townsfolk killed: "; $lynchedNames = []; foreach ($players_to_be_lynched as $player_id) { $player = $game->getPlayerById($player_id); $lynchedNames[] = "@{$player->getUsername()} ({$player->role})"; $game->removePlayer($player_id); } $lynchMsg .= implode(', ', $lynchedNames) . "\r\n"; $client->getChannelGroupOrDMByID($game->getId())->then(function (Channel $channel) use($client, $lynchMsg) { $client->send($lynchMsg, $channel); }); $this->changeGameState($game->getId(), GameState::NIGHT); }