src/Controller/AreaController.php line 89

Open in your IDE?
  1. <?php
  2. namespace App\Controller;
  3. use App\Entity\Area;
  4. use App\Entity\Location\Town;
  5. use App\Entity\User;
  6. use App\Form\Type\SignupType;
  7. use App\Model\AreaService;
  8. use App\Model\GameService;
  9. use App\Model\Helper\AccountHelper;
  10. use App\Model\HeroService;
  11. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  12. use Symfony\Component\Form\FormError;
  13. use Symfony\Component\HttpFoundation\Request;
  14. use Symfony\Component\HttpFoundation\Response;
  15. use Symfony\Component\Routing\Annotation\Route;
  16. /**
  17.  * @Route("/area")
  18.  */
  19. class AreaController extends AbstractController
  20. {
  21.     /**
  22.      * @var AreaService
  23.      */
  24.     private $areaService;
  25.     /**
  26.      * @var GameService
  27.      */
  28.     private $gameService;
  29.     /**
  30.      * @var AccountHelper
  31.      */
  32.     private $accountHelper;
  33.     /**
  34.      * @var HeroService
  35.      */
  36.     private $heroService;
  37.     public function __construct(AreaService $areaServiceGameService $gameServiceAccountHelper $accountHelperHeroService $heroService)
  38.     {
  39.         $this->areaService $areaService;
  40.         $this->gameService $gameService;
  41.         $this->accountHelper $accountHelper;
  42.         $this->heroService $heroService;
  43.     }
  44.     /**
  45.      * @Route("", name="area_index")
  46.      *
  47.      * @return Response
  48.      */
  49.     public function index(): Response
  50.     {
  51.         $areas $this->areaService->getActiveAreas();
  52.         unset($areas['c1outbreakinvasion2']);
  53.         return $this->render('area/index.html.twig', [
  54.             'areas' => $areas,
  55.             'page' => 'areas',
  56.         ]);
  57.     }
  58.     /**
  59.      * @Route("/{areaId}/news", name="area_news", requirements={"area"="\d+"})
  60.      *
  61.      * @param int $areaId
  62.      *
  63.      * @return Response
  64.      */
  65.     public function news(int $areaId): Response
  66.     {
  67.         $area $this->areaService->getArea($areaId);
  68.         $this->gameService->setArea($area);
  69.         return $this->render('area/news.html.twig', [
  70.             'area' => $area,
  71.             'page' => 'areas',
  72.             'news' => $this->gameService->fairgroundService->getNews(),
  73.         ]);
  74.     }
  75.     /**
  76.      * @Route("/{areaId}/map-preview", name="area_map_preview", requirements={"areaId"="\d+"})
  77.      *
  78.      * @param int $areaId
  79.      *
  80.      * @return Response
  81.      */
  82.     public function mapPreview(int $areaId): Response
  83.     {
  84.         $area $this->areaService->getArea($areaId);
  85.         $this->gameService->setArea($area);
  86.         $acres $this->gameService->locationService->getAcres();
  87.         $government $this->gameService->locationService->getGovernmentLocations();
  88.         return $this->render('area/map_preview.html.twig', [
  89.             'area' => $area,
  90.             'govLocations' => $government,
  91.             'acres' => $acres,
  92.             'page' => 'areas',
  93.         ]);
  94.     }
  95.     /**
  96.      * @Route("/{areaId}/info", name="area_info", requirements={"areaId"="\d+"})
  97.      *
  98.      * @param int $areaId
  99.      *
  100.      * @return Response
  101.      */
  102.     public function info(int $areaId): Response
  103.     {
  104.         $area $this->areaService->getArea($areaId);
  105.         $this->gameService->setArea($area);
  106.         return $this->render('area/info.html.twig', [
  107.             'area' => $area,
  108.             'page' => 'areas',
  109.             'towns' => $this->gameService->townService->findTowns(),
  110.         ]);
  111.     }
  112.     /**
  113.      * @Route("/{areaId}/signup", name="area_signup", requirements={"areaId"="\d+"})
  114.      *
  115.      * @param int     $areaId
  116.      * @param Request $request
  117.      *
  118.      * @return Response
  119.      */
  120.     public function signup(int $areaIdRequest $request): Response
  121.     {
  122.         /** @var User $user */
  123.         $user $this->getUser();
  124.         if (!$user instanceof User) {
  125.             return $this->redirectToRoute('area_index');
  126.         }
  127.         // If user already is in the area, redirect to game
  128.         $area $this->areaService->getArea($areaId);
  129.         if ($user->isInArea($area)) {
  130.             return $this->redirectToRoute('game_index');
  131.         }
  132.         return $this->createSignupForm($areaId$requestfalse);
  133.     }
  134.     /**
  135.      * @Route("/{areaId}/signup-premium", name="area_signup_premium", requirements={"areaId"="\d+"})
  136.      *
  137.      * @param int     $areaId
  138.      * @param Request $request
  139.      *
  140.      * @return Response
  141.      */
  142.     public function signupPremium(int $areaIdRequest $request): Response
  143.     {
  144.         // If user already has an area, redirect to game
  145.         /** @var User $user */
  146.         $user $this->getUser();
  147.         if (!$user instanceof User) {
  148.             return $this->redirectToRoute('area_index');
  149.         }
  150.         $area $this->areaService->getArea($areaId);
  151.         if ($user->isInArea($area)) {
  152.             return $this->redirectToRoute('game_index');
  153.         }
  154.         return $this->createSignupForm($areaId$requesttrue);
  155.     }
  156.     /**
  157.      * @param int     $areaId
  158.      * @param Request $request
  159.      * @param bool    $isPremium
  160.      *
  161.      * @return Response
  162.      */
  163.     private function createSignupForm(int $areaIdRequest $requestbool $isPremium false): Response
  164.     {
  165.         /** @var User $user */
  166.         $user $this->getUser();
  167.         $area $this->areaService->getArea($areaId);
  168.         $this->gameService->setArea($area);
  169.         // Get heroes available for picking
  170.         $defaultHeroes $this->heroService->getDefaultHeroes();
  171.         $customHeroes= [];
  172.         if ($isPremium) {
  173.             $customHeroes $this->heroService->getCustomHeroes($user);
  174.         }
  175.         // Create form
  176.         $form $this->createForm(SignupType::class, null, [
  177.             'heroes' => count($customHeroes) > ? ['Custom heroes' => $customHeroes'Base heroes' => $defaultHeroes] : $defaultHeroes,
  178.             'premium' => $isPremium,
  179.             'area' => $area,
  180.             'user' => $user,
  181.         ]);
  182.         $form->handleRequest($request);
  183.         if ($form->isSubmitted() && $form->isValid() && $user instanceof User && $area->isActive()) {
  184.             $formData $form->getData();
  185.             $formData['townName'] = trim($formData['townName']);
  186.             if (is_numeric($formData['townName'])) {
  187.                 $form->addError(new FormError("Invalid town name"));
  188.             }
  189.             // Check if town name is already in use or reserved
  190.             $existingTown $this->gameService->townService->getTownByName($formData['townName']);
  191.             if ($existingTown instanceof Town || $this->accountHelper->isReservedTownName($formData['townName'])) {
  192.                 $form->addError(new FormError("Town name is not available"));
  193.             }
  194.             // Check if mayor name is already in use
  195.             $existingTown $this->gameService->townService->getTownByName($formData['mayorName']);
  196.             if ($existingTown instanceof Town) {
  197.                 $form->addError(new FormError("Mayor name is not available"));
  198.             }
  199.             // Check that area has room
  200.             if ($area->getTowns() >= $area->getPlayers()) {
  201.                 $form->addError(new FormError("The area is full, contact us for more information!"));
  202.             }
  203.             // Check if round has ended
  204.             if ($area->getSettings()->turn >= $area->getSettings()->end_turn) {
  205.                 $form->addError(new FormError("This round has ended a new one will start soon."));
  206.             }
  207.             // If premium check that account has credit
  208.             if ($isPremium && $user->getPremium() == 0) {
  209.                 $form->addError(new FormError("You don't have enough credits."));
  210.             }
  211.             $extraWildcard false;
  212.             if ($user->getExtraWildcard() > && $formData['extraWildcard']) {
  213.                 $extraWildcard true;
  214.             }
  215.             if ($form->isValid()) {
  216.                 $this->accountHelper->signup($area$user$formData['hero'], $formData$extraWildcard$isPremium);
  217.                 $this->gameService->setArea($area);
  218.                 return $this->redirectToRoute('game_index');
  219.             }
  220.         }
  221.         return $this->render('area/signup.html.twig', [
  222.             'errors' => $form->getErrors(),
  223.             'form' => $form->createView(),
  224.             'area' => $this->areaService->getArea($areaId),
  225.             'mod' => min($area->getSettings()->turn 24 round(($area->getSettings()->turn 250) + 1) : 15),
  226.             'isPremium' => $isPremium,
  227.             'defaultHeroes' => $defaultHeroes,
  228.             'townTypes' => $area->getType() === Area::TYPE_PVE Town::TOWN_TYPES_PVE Town::TOWN_TYPES_PVP,
  229.             'page' => 'areas',
  230.         ]);
  231.     }
  232. }