Example #1
0
 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);
 }
Example #2
0
 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);
 }
Example #3
0
 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);
 }