/** * {ships: [{size: 4, x: 3, y:5, direction: 'horizontal' / 'vertical'}, {...}]}} * * return {valid: true} ou { valid: false, reason: 'Illegal : two ships intersecting'} * @ApiDoc( * description="Place ses navires.", * section="3 - Placement des navires", * authentication=true, * statusCodes={ * 200: "Les navires ont été placés. Il faut maintenant attendre que l'autre joueur ait fait de même.", * 400: "Les navires ne peuvent pas être placés tel que demandé. Les navires se croisent ou sortent du tableau.", * 403: "Mauvais secret." * } * ) * @ParamConverter("game", class="AppBundle:Game", options={"id" = "game_id"}) * @RequestParam(name="secret", nullable=false, description="Secret du joueur") * @RequestParam(name="ships", array=true, nullable=false, description="Tableau de {x, y, size, direction <horizontal|vertical>}") * @Post("/api/v1/games/{game_id}/ships", name="place_ships_api") * @Post("/games/{game_id}/ships", name="place_ships") */ public function placeShipsAction(Game $game, ParamFetcher $paramFetcher) { $player = $game->getPlayerBySecret($paramFetcher->get('secret')); // @TODO Exception in Game entity if bad secret? if ($player === null) { throw new HttpException(400, 'Bad secret.'); } if (!$game->isFull()) { // @todo mettre ces vérifs dans l'entité throw new HttpException(400, 'No one has joined yet.'); } if ($game->playerHasPlacedShips($player)) { throw new HttpException(400, 'You\'ve already placed your ships.'); } if (!($res = $game->setPlayerShips($player, $paramFetcher->get('ships'))) instanceof Game) { // can throw exception @TODO var_dump($res); } $em = $this->getDoctrine()->getEntityManager(); $em->persist($game); $em->flush(); return $this->view(array('info' => 'Ships placed!'), 200)->setTemplate('AppBundle:Api:verify_placed_ships.html.twig')->setTemplateData(array('secret' => $paramFetcher->get('secret'), 'game' => $game, 'opponent_player_id' => $player == 1 ? 2 : 1)); }