/** * {coord: {y: 12, x: 13}} * * return {valid: false, reason: 'Already fired there. Result was a miss.'} ou {valid: true, move_id: X, result: 'miss/hit/sank', ??goban: {}?? } * @ApiDoc( * description="Joue un coup.", * section="4 - Jeu", * authentication=true, * statusCodes={ * 200: "Le coup a été joué. Renvoie le résultat du coup (manqué/touché/coulé).", * 400: "Le coup n'est pas valide, ou bien ce n'est pas à votre tour de jouer." * } * ) * * @RequestParam(name="secret", nullable=false, description="Secret du joueur") * @RequestParam(name="x", nullable=false, description="Position X du tir") * @RequestParam(name="y", nullable=false, description="Position Y du tir") * @ParamConverter("game", class="AppBundle:Game", options={"id" = "game_id"}) * @Post("/api/v1/games/{game_id}/moves", name="shoot_api") * @Post("/games/{game_id}/moves", name="shoot") */ public function shootAction(Game $game, ParamFetcher $paramFetcher) { $player = $game->getPlayerBySecret($paramFetcher->get('secret')); if ($player === null) { throw new HttpException(400, 'Bad secret.'); } if (!$game->isFull()) { throw new HttpException(400, 'The game isn\'t full yet.'); } if ($game->isGameOver()) { throw new HttpException(400, 'Game over.'); } if ($game->getNextPlayer() === null || (int) $game->getNextPlayer() !== (int) $player) { throw new HttpException(400, 'It\'s not your turn to play.'); } $result = $game->playerShoots($player, ['x' => $paramFetcher->get('x'), 'y' => $paramFetcher->get('y')]); // can throw exception @TODO if (is_int($result)) { exit('Erreur : ' . $result); } $em = $this->getDoctrine()->getEntityManager(); $em->persist($game); $em->flush(); return $this->view(array('result' => $result), 200)->setTemplate('AppBundle:Api:shoot_result.html.twig')->setTemplateData(array('move' => ['x' => $paramFetcher->get('x'), 'y' => $paramFetcher->get('y'), 'result' => $result], 'move_id' => $game->getNextMoveId(), 'game' => $game, 'secret' => $paramFetcher->get('secret'))); }