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); }
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; }
/** * 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()); }
/** * 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'); } }
/** * 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; }
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); }
/** * 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'); } }
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; } }
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)); }
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()))); }
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)); }
public function isKingAttacked(Player $player) { return $player->getKing() && in_array($player->getKing()->getSquareKey(), $this->getPlayerControlledKeys($player->getOpponent(), false)); }