Ejemplo n.º 1
0
 protected function acceptRematch(Player $player)
 {
     $game = $player->getGame();
     $opponent = $player->getOpponent();
     // if the rematch is already accepted
     // can happen if the guy clicks frenetically
     // on the rematch accept button
     if ($nextGame = $game->getNext()) {
         $nextOpponent = $nextGame->getPlayer($player->getColor());
         $nextPlayer = $nextOpponent->getOpponent();
     } else {
         $nextOpponent = $this->gameGenerator->createReturnGame($opponent);
         $nextPlayer = $nextOpponent->getOpponent();
         $nextGame = $nextOpponent->getGame();
         $this->logger->notice($player, 'Player:rematch accept');
         $this->messenger->addSystemMessage($game, 'Rematch offer accepted');
         $nextGame->start();
         $this->memory->setAlive($nextPlayer);
         // the opponent still pings the old game,
         // so we set it as active on the new game
         if ($this->memory->getActivity($opponent)) {
             $this->memory->setAlive($nextOpponent);
         }
     }
     // tell spectators to reload the table
     $game->addEventToStacks(array('type' => 'reload_table'));
     // tell players to move to next game
     foreach (array(array($player, $nextPlayer), array($opponent, $nextOpponent)) as $pair) {
         $pair[0]->addEventToStack(array('type' => 'redirect', 'url' => $this->urlGenerator->generate('lichess_player', array('id' => $pair[1]->getFullId()))));
     }
     $this->objectManager->persist($nextGame);
 }
Ejemplo n.º 2
0
 public function getEventsSinceClientVersion(Player $player, $clientVersion, $withPrivateEvents)
 {
     $game = $player->getGame();
     $version = $player->getStack()->getVersion();
     $opponentActivity = $this->memory->getActivity($player->getOpponent());
     $currentPlayerColor = $game->getTurnColor();
     try {
         $events = $version != $clientVersion ? $this->getDiffEvents($player, $clientVersion) : array();
     } catch (OutOfBoundsException $e) {
         return array('reload' => true);
     }
     // remove private events if user is spectator
     if (!$withPrivateEvents) {
         foreach ($events as $index => $event) {
             if ('message' === $event['type'] || 'redirect' === $event['type']) {
                 unset($events[$index]);
             }
         }
     } else {
         // render room messages
         foreach ($events as $index => $event) {
             if ('message' === $event['type']) {
                 $events[$index]['html'] = $this->roomMessageRenderer->renderRoomMessage($event['message']);
                 unset($events[$index]['message']);
             }
         }
     }
     $data = array('v' => $version, 'oa' => $opponentActivity, 'e' => $events, 'p' => $currentPlayerColor, 't' => $game->getTurns());
     if ($game->hasClock()) {
         $data['c'] = $game->getClock()->getRemainingTimes();
     }
     return $data;
 }
Ejemplo n.º 3
0
 /**
  * After the player has moved, run the AI to get the next move applied immediatly
  *
  * @param Player $player
  * @return void
  */
 protected function performAiAnswer(Player $player)
 {
     $game = $player->getGame();
     $opponent = $player->getOpponent();
     $stack = new Stack();
     $manipulator = $this->manipulatorFactory->create($game, $stack);
     $possibleMoves = $manipulator->play($this->ai->move($game, $opponent->getAiLevel()));
     $player->addEventToStack(array('type' => 'possible_moves', 'possible_moves' => $possibleMoves));
     $player->addEventsToStack($stack->getEvents());
 }
Ejemplo n.º 4
0
 /**
  * Resign this player opponent if possible
  *
  * @param Player $player
  * @return void
  */
 public function forceResign(Player $player)
 {
     $game = $player->getGame();
     if ($game->getIsPlayable() && 0 == $this->memory->getActivity($player->getOpponent())) {
         $game->setStatus(Game::TIMEOUT);
         $game->setWinner($player);
         $this->finish($game);
         $game->addEventToStacks(array('type' => 'end'));
         $this->logger->notice($player, 'Player:forceResign');
     } else {
         $this->logger->warn($player, 'Player:forceResign');
     }
 }
Ejemplo n.º 5
0
 /**
  * Creates a return game for the given player,
  * reverting players colors
  *
  * @param  Player the player who creates the return game
  * @return Player the new player on the new game
  **/
 public function createReturnGame(Player $player)
 {
     $game = $player->getGame();
     $variant = $game->getVariant();
     $nextGame = $this->createGame($variant);
     if (Game::VARIANT_960 == $game->getVariant()) {
         Forsyth::import($nextGame, $game->getInitialFen());
         $nextGame->setInitialFen($game->getInitialFen());
     }
     $nextPlayer = $nextGame->getPlayer($player->getOpponent()->getColor());
     $nextGame->setCreator($nextPlayer);
     if ($game->hasClock()) {
         $nextGame->setClock(clone $game->getClock());
     }
     $nextGame->setIsRated($game->getIsRated());
     $nextGame->getPlayer('white')->setUser($game->getPlayer('black')->getUser());
     $nextGame->getPlayer('black')->setUser($game->getPlayer('white')->getUser());
     $game->setNext($nextGame);
     return $nextPlayer;
 }
Ejemplo n.º 6
0
 protected function acceptRematch(Player $player)
 {
     $game = $player->getGame();
     $opponent = $player->getOpponent();
     // if the rematch is already accepted
     // can happen if the guy clicks frenetically
     // on the rematch accept button
     if ($nextGame = $game->getNext()) {
         $nextOpponent = $nextGame->getPlayer($player->getColor());
         $nextPlayer = $nextOpponent->getOpponent();
         $messages = array();
     } else {
         $nextOpponent = $this->gameGenerator->createReturnGame($opponent);
         $nextPlayer = $nextOpponent->getOpponent();
         $nextGame = $nextOpponent->getGame();
         $messages = $this->starter->start($nextGame);
         $this->objectManager->persist($nextGame);
     }
     return array($nextGame, $messages);
 }
Ejemplo n.º 7
0
 /**
  * The player cancels his previous draw offer
  *
  * @param Player $player
  * @return void
  */
 public function cancel(Player $player)
 {
     $game = $player->getGame();
     if ($player->getIsOfferingDraw()) {
         $this->messenger->addSystemMessage($game, 'Draw offer canceled');
         $player->setIsOfferingDraw(false);
         $player->getOpponent()->addEventToStack(array('type' => 'reload_table'));
         $this->logger->notice($player, 'Player:cancelDrawOffer');
     } else {
         $this->logger->warn($player, 'Player:cancelDrawOffer no offered draw');
     }
 }
Ejemplo n.º 8
0
 public function setWinner(Player $player)
 {
     $player->setIsWinner(true);
     $player->getOpponent()->setIsWinner(null);
     // Denormalization
     if ($user = $player->getUser()) {
         $this->winnerUserId = (string) $user->getId();
     } else {
         $this->winnerUserId = false;
     }
 }
Ejemplo n.º 9
0
 public function renderGameWatchData(Player $player, $possibleMoves)
 {
     $game = $player->getGame();
     $gameId = $game->getId();
     $color = $player->getColor();
     $opponent = $player->getOpponent();
     $generator = $this->getRouterGenerator();
     $translator = $this->getTranslator();
     $locale = $this->container->get('session')->getLocale();
     $data = array('game' => array('id' => $game->getId(), 'started' => $game->getIsStarted(), 'finished' => $game->getIsFinishedOrAborted(), 'clock' => $game->hasClock(), 'player' => $game->getTurnPlayer()->getColor(), 'turns' => $game->getTurns(), 'last_move' => $game->getLastMove()), 'player' => array('color' => $player->getColor(), 'version' => $player->getStack()->getVersion(), 'spectator' => true, 'unique_id' => uniqid()), 'opponent' => array('color' => $opponent->getColor(), 'ai' => $opponent->getIsAi(), 'active' => true), 'url' => array('sync' => $this->getXhrUrlPrefix() . $generator->generate('lichess_sync', array('l' => $locale, 'id' => $gameId, 'color' => $color, 'version' => 9999999, 'playerFullId' => '')) . '/', 'table' => $generator->generate('lichess_table', array('id' => $gameId, 'color' => $color, 'playerFullId' => '')) . '/', 'opponent' => $generator->generate('lichess_opponent', array('id' => $gameId, 'color' => $color, 'playerFullId' => '')) . '/'), 'i18n' => array('Game Over' => $translator->trans('Game Over'), 'Waiting for opponent' => $translator->trans('Waiting for opponent'), 'Your turn' => $translator->trans('Your turn')), 'possible_moves' => $possibleMoves, 'sync_latency' => $this->container->getParameter('lichess.sync.latency') * 1000, 'animation_delay' => $this->container->getParameter('lichess.animation.delay') * 1000, 'locale' => $this->container->get('session')->getLocale());
     return sprintf('<script type="text/javascript">var lichess_data = %s;</script>', json_encode($data));
 }
Ejemplo n.º 10
0
 public function join(Player $player, array $messages)
 {
     $this->post('join/' . $player->getFullId(), array("redirect" => $this->url('lichess_player', array('id' => $player->getOpponent()->getFullId())), "messages" => $this->encodeMessages($messages), "entry" => $this->encodeLobbyEntry($player->getGame())));
 }
Ejemplo n.º 11
0
 public function renderGameWatchData(Player $player, $version, $possibleMoves)
 {
     $game = $player->getGame();
     $gameId = $game->getId();
     $color = $player->getColor();
     $opponent = $player->getOpponent();
     $generator = $this->getUrlGenerator();
     $translator = $this->getTranslator();
     $data = array('game' => array('id' => $game->getId(), 'started' => $game->getIsStarted(), 'finished' => $game->getIsFinishedOrAborted(), 'clock' => $game->hasClock(), 'player' => $game->getTurnPlayer()->getColor(), 'turns' => $game->getTurns(), 'last_move' => $game->getLastMove()), 'player' => array('color' => $player->getColor(), 'version' => $version, 'spectator' => true, 'unique_id' => uniqid()), 'opponent' => array('color' => $opponent->getColor(), 'ai' => $opponent->getIsAi(), 'active' => true), 'url' => array('table' => $generator->generate('lichess_table', array('id' => $gameId, 'color' => $color, 'playerFullId' => '')), 'players' => $generator->generate('lichess_game_players', array('id' => $gameId))), 'possible_moves' => $possibleMoves, 'animation_delay' => round($this->container->getParameter('lichess.animation.delay') * 1000 * self::animationDelayFactor($game->estimateTotalTime())));
     return sprintf('<script type="text/javascript">var lichess_data = %s;</script>', json_encode($data));
 }
Ejemplo n.º 12
0
 public function isKingAttacked(Player $player)
 {
     return $player->getKing() && in_array($player->getKing()->getSquareKey(), $this->getPlayerControlledKeys($player->getOpponent(), false));
 }