diff --git a/config/routes/ares.yaml b/config/routes/ares.yaml index 53bbeb6f2..d307cf474 100644 --- a/config/routes/ares.yaml +++ b/config/routes/ares.yaml @@ -37,3 +37,7 @@ loot: colonize: path: /colonize controller: App\Modules\Ares\Infrastructure\Controller\ViewMemorial + +conquer: + path: /colonize + controller: App\Modules\Ares\Infrastructure\Controller\ViewMemorial diff --git a/config/routes/athena.yaml b/config/routes/athena.yaml index 0f792ad96..4b5ae71b2 100644 --- a/config/routes/athena.yaml +++ b/config/routes/athena.yaml @@ -2,6 +2,10 @@ financial: resource: './athena/financial.yaml' prefix: /financial +trade: + resource: './athena/trade.yaml' + prefix: /trade + switchbase: path: /switchbase/{baseId}/{page} controller: App\Modules\Athena\Infrastructure\Controller\Base\SwitchBase @@ -77,7 +81,7 @@ trade_market: spatioport: path: /spatioport - controller: App\Modules\Athena\Infrastructure\Controller\Base\Building\RefineryController + controller: App\Modules\Athena\Infrastructure\Controller\Base\Building\ViewSpatioport school: path: /school diff --git a/config/routes/athena/trade.yaml b/config/routes/athena/trade.yaml new file mode 100644 index 000000000..62d28e9d0 --- /dev/null +++ b/config/routes/athena/trade.yaml @@ -0,0 +1,19 @@ +propose_route: + path: /routes/propose + controller: App\Modules\Athena\Infrastructure\Controller\Trade\ProposeRoute + +cancel_route: + path: /bases/{baseId}/routes/{id}/cancel + controller: App\Modules\Athena\Infrastructure\Controller\Trade\CancelRoute + +delete_route: + path: /bases/{baseId}/routes/{id}/cancel + controller: App\Modules\Athena\Infrastructure\Controller\Trade\DeleteRoute + +accept_commercial_route: + path: /bases/{baseId}/routes/{id}/accept + controller: App\Modules\Athena\Infrastructure\Controller\Trade\AcceptRoute + +refuse_commercial_route: + path: /bases/{baseId}/routes/{id}/refuse + controller: App\Modules\Athena\Infrastructure\Controller\Trade\RefuseRoute diff --git a/src/Modules/Athena/Infrastructure/Controller/Base/Building/ViewSpatioport.php b/src/Modules/Athena/Infrastructure/Controller/Base/Building/ViewSpatioport.php new file mode 100644 index 000000000..6cf09e953 --- /dev/null +++ b/src/Modules/Athena/Infrastructure/Controller/Base/Building/ViewSpatioport.php @@ -0,0 +1,56 @@ +getSession(); + $mode = $request->query->get('mode', 'list'); + + $inGameFactions = $colorManager->getInGameFactions(); + + return $this->render('pages/athena/spatioport.html.twig', [ + 'routes' => array_merge( + $commercialRouteManager->getByBase($currentBase->getId()), + $commercialRouteManager->getByDistantBase($currentBase->getId()) + ), + 'routes_data' => $commercialRouteManager->getBaseCommercialData($currentBase), + 'player_commercial_income_bonus' => $session->get('playerBonus')->get(PlayerBonus::COMMERCIAL_INCOME), + 'negora_commercial_bonus' => ColorResource::BONUS_NEGORA_ROUTE, + 'is_player_from_negora' => $currentPlayer->getRColor() === ColorResource::NEGORA, + 'in_game_factions' => $inGameFactions, + 'mode' => $mode, + 'search_results' => ($mode === 'search' && $request->getMethod() === 'POST') + ? $commercialRouteManager->searchCandidates( + $currentPlayer->getId(), + $currentBase, + array_reduce($inGameFactions, function (array $carry, Color $faction) use ($request) { + if ($request->request->has('faction-' . $faction->getId())) { + $carry[] = $faction->getId(); + } + return $carry; + }, []), + abs(intval($request->request->get('min-dist', 75))), + abs(intval($request->request->get('max-dist', 125))), + ) : null, + ]); + } +} diff --git a/src/Modules/Athena/Infrastructure/Controller/Trade/AcceptRoute.php b/src/Modules/Athena/Infrastructure/Controller/Trade/AcceptRoute.php new file mode 100644 index 000000000..14ddb92b5 --- /dev/null +++ b/src/Modules/Athena/Infrastructure/Controller/Trade/AcceptRoute.php @@ -0,0 +1,122 @@ +getSession(); + for ($i=0; $i < $session->get('playerBase')->get('ob')->size(); $i++) { + $verif[] = $session->get('playerBase')->get('ob')->get($i)->get('id'); + } + $routeExperienceCoeff = $this->getParameter('athena.trade.experience_coeff'); + + if (in_array($baseId, $verif)) { + $cr = $commercialRouteManager->getByIdAndDistantBase($id, $baseId); + + if ($cr !== null && $cr->getStatement() == CommercialRoute::PROPOSED) { + $proposerFaction = $colorManager->get($cr->playerColor1); + $acceptorFaction = $colorManager->get($cr->playerColor2); + + if ($proposerFaction->colorLink[$cr->playerColor2] != Color::ENEMY && $acceptorFaction->colorLink[$cr->playerColor1] != Color::ENEMY) { + $proposerBase = $orbitalBaseManager->get($cr->getROrbitalBase()); + $acceptorBase = $orbitalBaseManager->get($cr->getROrbitalBaseLinked()); + + $nbrMaxCommercialRoute = $orbitalBaseHelper->getBuildingInfo(OrbitalBaseResource::SPATIOPORT, 'level', $acceptorBase->getLevelSpatioport(), 'nbRoutesMax'); + + if ($commercialRouteManager->countBaseActiveAndStandbyRoutes($acceptorBase->getId()) <= $nbrMaxCommercialRoute) { + # compute bonus if the player is from Negore + if ($session->get('playerInfo')->get('color') == ColorResource::NEGORA) { + $price = round($cr->getPrice() - ($cr->getPrice() * ColorResource::BONUS_NEGORA_ROUTE / 100)); + } else { + $price = $cr->getPrice(); + } + + if ($session->get('playerInfo')->get('credit') >= $price) { + # débit des crédits au joueur + $playerManager->decreaseCredit($currentPlayer, $price); + + # augmentation de l'expérience des deux joueurs + $exp = round($cr->getIncome() * $routeExperienceCoeff); + $playerManager->increaseExperience($currentPlayer, $exp); + $playerManager->increaseExperience($playerManager->get($proposerBase->getRPlayer()), $exp); + + # activation de la route + $cr->setStatement(CommercialRoute::ACTIVE); + $cr->setDCreation(Utils::now()); + + $n = new Notification(); + $n->setRPlayer($proposerBase->getRPlayer()); + $n->setTitle('Route commerciale acceptée'); + $n->addBeg(); + $n->addLnk('embassy/player-' . $currentPlayer->getId(), $currentPlayer->getName())->addTxt(' a accepté la route commerciale proposée entre '); + $n->addLnk('map/place-' . $acceptorBase->getRPlace(), $acceptorBase->getName())->addTxt(' et '); + $n->addLnk('map/place-' . $proposerBase->getRPlace(), $proposerBase->getName()); + $n->addSep()->addTxt('Cette route vous rapporte ' . Format::numberFormat($cr->getIncome()) . ' crédits par relève.'); + $n->addBrk()->addBoxResource('xp', $exp, 'expérience gagnée', $this->getParameter('media')); + $n->addSep()->addLnk('action/a-switchbase/base-' . $proposerBase->getRPlace() . '/page-spatioport', 'En savoir plus ?'); + $n->addEnd(); + $notificationManager->add($n); + + $entityManager->flush(); +// if (true === $this->getContainer()->getParameter('data_analysis')) { +// $qr = $database->prepare('INSERT INTO +// DA_CommercialRelation(`from`, `to`, type, weight, dAction) +// VALUES(?, ?, ?, ?, ?)' +// ); +// $qr->execute([$cr->playerId1, $cr->playerId2, 6, DataAnalysis::creditToStdUnit($cr->price), Utils::now()]); +// } + + $this->addFlash('success', 'Route commerciale acceptée, vous gagnez ' . $exp . ' points d\'expérience'); + + return $this->redirect($request->headers->get('referer')); + } else { + throw new ErrorException('impossible d\'accepter une route commerciale'); + } + } else { + throw new ErrorException('impossible d\'accepter une route commerciale'); + } + } else { + throw new ErrorException('Vous ne pouvez pas accepter les routes de ce joueur, vos deux factions sont en guerre'); + } + } else { + throw new ErrorException('impossible d\'accepter une route commerciale'); + } + } else { + throw new FormException('pas assez d\'informations pour accepter une route commerciale'); + } + } +} diff --git a/src/Modules/Athena/Infrastructure/Controller/Trade/CancelRoute.php b/src/Modules/Athena/Infrastructure/Controller/Trade/CancelRoute.php new file mode 100644 index 000000000..95f0f9d80 --- /dev/null +++ b/src/Modules/Athena/Infrastructure/Controller/Trade/CancelRoute.php @@ -0,0 +1,70 @@ +getSession(); + for ($i=0; $i < $session->get('playerBase')->get('ob')->size(); $i++) { + $verif[] = $session->get('playerBase')->get('ob')->get($i)->get('id'); + } + + if (in_array($baseId, $verif)) { + $cr = $commercialRouteManager->getByIdAndBase($id, $baseId); + if ($cr !== null && $cr->getStatement() == CommercialRoute::PROPOSED) { + $routeCancelRefund = $this->getParameter('athena.trade.route.cancellation_refund'); + $proposerBase = $orbitalBaseManager->get($cr->getROrbitalBase()); + $linkedBase = $orbitalBaseManager->get($cr->getROrbitalBaseLinked()); + + //rend 80% des crédits investis + $playerManager->increaseCredit($playerManager->get($session->get('playerId')), round($cr->getPrice() * $routeCancelRefund)); + + //notification + $n = new Notification(); + $n->setRPlayer($linkedBase->getRPlayer()); + $n->setTitle('Route commerciale annulée'); + + $n->addBeg()->addLnk('embassy/player-' . $session->get('playerId'), $session->get('playerInfo')->get('name'))->addTxt(' a finalement retiré la proposition de route commerciale qu\'il avait faite entre '); + $n->addLnk('map/place-' . $linkedBase->getRPlace(), $linkedBase->getName())->addTxt(' et '); + $n->addLnk('map/place-' . $proposerBase->getRPlace(), $proposerBase->getName()); + $n->addEnd(); + $notificationManager->add($n); + + //destruction de la route + $commercialRouteManager->remove($cr); + $this->addFlash('success', 'Route commerciale annulée. Vous récupérez les ' . $routeCancelRefund * 100 . '% du montant investi.'); + + $entityManager->flush(); + + return $this->redirect($request->headers->get('referer')); + } else { + throw new ConflictHttpException('impossible d\'annuler une route commerciale'); + } + } else { + throw new BadRequestHttpException('pas assez d\'informations pour annuler une route commerciale'); + } + } +} diff --git a/src/Modules/Athena/Infrastructure/Controller/Trade/DeleteRoute.php b/src/Modules/Athena/Infrastructure/Controller/Trade/DeleteRoute.php new file mode 100644 index 000000000..671e241d1 --- /dev/null +++ b/src/Modules/Athena/Infrastructure/Controller/Trade/DeleteRoute.php @@ -0,0 +1,93 @@ +getSession(); + + for ($i = 0; $i < $session->get('playerBase')->get('ob')->size(); $i++) { + $verif[] = $session->get('playerBase')->get('ob')->get($i)->get('id'); + } + + if (in_array($baseId, $verif)) { + $cr = $commercialRouteManager->get($id); + if ($cr !== null && in_array($cr->statement, [CommercialRoute::ACTIVE, CommercialRoute::STANDBY])) { + if ($cr->playerId1 === $currentPlayer->getid() || $cr->playerId2 === $currentPlayer->getId()) { + if ($cr->getROrbitalBase() == $baseId OR $cr->getROrbitalBaseLinked() == $baseId) { + $proposerBase = $orbitalBaseManager->get($cr->getROrbitalBase()); + $linkedBase = $orbitalBaseManager->get($cr->getROrbitalBaseLinked()); + if ($cr->getROrbitalBase() == $baseId) { + $notifReceiver = $linkedBase->getRPlayer(); + $myBaseName = $proposerBase->getName(); + $otherBaseName = $linkedBase->getName(); + $myBaseId = $proposerBase->getRPlace(); + $otherBaseId = $linkedBase->getRPlace(); + } else { //if ($cr->getROrbitalBaseLinked == $base) { + $notifReceiver = $proposerBase->getRPlayer(); + $myBaseName = $linkedBase->getName(); + $otherBaseName = $proposerBase->getName(); + $myBaseId = $linkedBase->getRPlace(); + $otherBaseId = $proposerBase->getRPlace(); + } + + # perte du prestige pour les joueurs Négoriens + # @TODO check if this code is used somewhere or not +// $S_PAM1 = $playerManager->getCurrentSession(); +// $playerManager->newSession(); +// $playerManager->load(array('id' => array($cr->playerId1, $cr->playerId2))); +// $exp = round($cr->getIncome() * $routeExperienceCoeff); +// +// $playerManager->changeSession($S_PAM1); + //notification + $n = new Notification(); + $n->setRPlayer($notifReceiver); + $n->setTitle('Route commerciale détruite'); + $n->addBeg()->addLnk('embassy/player-' . $currentPlayer->getId(), $currentPlayer->getName())->addTxt(' annule les accords commerciaux entre '); + $n->addLnk('map/place-' . $myBaseId, $myBaseName)->addTxt(' et '); + $n->addLnk('map/place-' . $otherBaseId, $otherBaseName)->addTxt('.'); + $n->addSep()->addTxt('La route commerciale qui liait les deux bases orbitales est détruite, elle ne vous rapporte donc plus rien !'); + $n->addEnd(); + $notificationManager->add($n); + + //destruction de la route + $commercialRouteManager->remove($cr); + + $this->addFlash('success', 'Route commerciale détruite'); + + return $this->redirect($request->headers->get('referer')); + } else { + throw new ErrorException('impossible de supprimer une route commerciale'); + } + } else { + throw new ErrorException('cette route ne vous appartient pas'); + } + } else { + throw new ErrorException('impossible de supprimer une route commerciale'); + } + } else { + throw new FormException('pas assez d\'informations pour supprimer une route commerciale'); + } + } +} diff --git a/src/Modules/Athena/Infrastructure/Controller/Trade/ProposeRoute.php b/src/Modules/Athena/Infrastructure/Controller/Trade/ProposeRoute.php new file mode 100644 index 000000000..1ca12debf --- /dev/null +++ b/src/Modules/Athena/Infrastructure/Controller/Trade/ProposeRoute.php @@ -0,0 +1,133 @@ +getSession(); + + for ($i=0; $i < $session->get('playerBase')->get('ob')->size(); $i++) { + $verif[] = $session->get('playerBase')->get('ob')->get($i)->get('id'); + } + $baseFrom = $request->query->get('sourceBase'); + $baseTo = $request->query->get('destinationBase'); + + if ($baseFrom !== FALSE AND $baseTo !== FALSE AND in_array($baseFrom, $verif)) { + $proposerBase = $orbitalBaseManager->get($baseFrom); + $otherBase = $orbitalBaseManager->get($baseTo); + + $nbrMaxCommercialRoute = $orbitalBaseHelper->getBuildingInfo(OrbitalBaseResource::SPATIOPORT, 'level', $proposerBase->getLevelSpatioport(), 'nbRoutesMax'); + + // Check if a route already exists between these two bases + $alreadyARoute = $commercialRouteManager->isAlreadyARoute($proposerBase->getId(), $otherBase->getId()); + + if (($commercialRouteManager->countBaseRoutes($proposerBase->getId()) < $nbrMaxCommercialRoute) && (!$alreadyARoute) && ($proposerBase->getLevelSpatioport() > 0) && ($otherBase->getLevelSpatioport() > 0)) { + $player = $playerManager->get($otherBase->getRPlayer()); + + $playerFaction = $colorManager->get($session->get('playerInfo')->get('color')); + $otherFaction = $colorManager->get($player->rColor); + + if ($playerFaction->colorLink[$player->rColor] != Color::ENEMY && $otherFaction->colorLink[$session->get('playerInfo')->get('color')] != Color::ENEMY) { + + if ($proposerBase !== null && $otherBase !== null && ($proposerBase->getRPlayer() != $otherBase->getRPlayer()) && $player !== null) { + $distance = Game::getDistance($proposerBase->getXSystem(), $otherBase->getXSystem(), $proposerBase->getYSystem(), $otherBase->getYSystem()); + $bonusA = ($proposerBase->getSector() != $otherBase->getSector()) ? $this->getParameter('athena.trade.route.sector_bonus') : 1; + $bonusB = ($session->get('playerInfo')->get('color')) != $player->getRColor() ? $this->getParameter('athena.trade.route.color_bonus') : 1; + $price = Game::getRCPrice($distance); + $income = Game::getRCIncome($distance, $bonusA, $bonusB); + + if ($distance == 1) { + $imageLink = '1-' . rand(1, 3); + } elseif ($distance < 26) { + $imageLink = '2-' . rand(1, 3); + } elseif ($distance < 126) { + $imageLink = '3-' . rand(1, 3); + } else { + $imageLink = '4-' . rand(1, 3); + } + + # compute bonus + if (in_array(ColorResource::COMMERCIALROUTEPRICEBONUS, $playerFaction->bonus)) { + $priceWithBonus = round($price - ($price * ColorResource::BONUS_NEGORA_ROUTE / 100)); + } else { + $priceWithBonus = $price; + } + + if ($session->get('playerInfo')->get('credit') >= $priceWithBonus) { + # création de la route + $cr = new CommercialRoute(); + $cr->setROrbitalBase($proposerBase->getId()); + $cr->setROrbitalBaseLinked($otherBase->getId()); + $cr->setImageLink($imageLink); + $cr->setDistance($distance); + $cr->setPrice($price); + $cr->setIncome($income); + $cr->setDProposition(Utils::now()); + $cr->setDCreation(NULL); + $cr->setStatement(0); + $commercialRouteManager->add($cr); + + # débit des crédits au joueur + $playerManager->decreaseCredit($playerManager->get($session->get('playerId')), $priceWithBonus); + + $n = new Notification(); + $n->setRPlayer($otherBase->getRPlayer()); + $n->setTitle('Proposition de route commerciale'); + $n->addBeg()->addLnk('embassy/player-' . $session->get('playerId'), $session->get('playerInfo')->get('name')); + $n->addTxt(' vous propose une route commerciale liant '); + $n->addLnk('map/place-' . $proposerBase->getRPlace(), $proposerBase->getName())->addTxt(' et '); + $n->addLnk('map/place-' . $otherBase->getRPlace(), $otherBase->getName())->addTxt('.'); + $n->addSep()->addTxt('Les frais de l\'opération vous coûteraient ' . Format::numberFormat($priceWithBonus) . ' crédits; Les gains estimés pour cette route sont de ' . Format::numberFormat($income) . ' crédits par relève.'); + $n->addSep()->addLnk('action/a-switchbase/base-' . $otherBase->getRPlace() . '/page-spatioport', 'En savoir plus ?'); + $n->addEnd(); + $notificationManager->add($n); + + $this->addFlash('success', 'Route commerciale proposée'); + + return $this->redirect($request->headers->get('referer')); + } else { + throw new ErrorException('impossible de proposer une route commerciale - vous n\'avez pas assez de crédits'); + } + } else { + throw new ErrorException('impossible de proposer une route commerciale (2)'); + } + } else { + throw new ErrorException('impossible de proposer une route commerciale à ce joueur, vos factions sont en guerre.'); + } + } else { + throw new ErrorException('impossible de proposer une route commerciale (3)'); + } + } else { + throw new FormException('pas assez d\'informations pour proposer une route commerciale'); + } + } +} diff --git a/src/Modules/Athena/Infrastructure/Controller/Trade/RefuseRoute.php b/src/Modules/Athena/Infrastructure/Controller/Trade/RefuseRoute.php new file mode 100644 index 000000000..4c1c69e69 --- /dev/null +++ b/src/Modules/Athena/Infrastructure/Controller/Trade/RefuseRoute.php @@ -0,0 +1,70 @@ +getSession(); + + for ($i=0; $i < $session->get('playerBase')->get('ob')->size(); $i++) { + $verif[] = $session->get('playerBase')->get('ob')->get($i)->get('id'); + } + + if (in_array($baseId, $verif)) { + $cr = $commercialRouteManager->getByIdAndDistantBase($id, $baseId); + if ($cr !== null && $cr->getStatement() === CommercialRoute::PROPOSED) { + $proposerBase = $orbitalBaseManager->get($cr->getROrbitalBase()); + $refusingBase = $orbitalBaseManager->get($cr->getROrbitalBaseLinked()); + + //rend les crédits au proposant + $playerManager->increaseCredit($playerManager->get($proposerBase->getRPlayer()), intval($cr->getPrice())); + + //notification + $n = new Notification(); + $n->setRPlayer($proposerBase->getRPlayer()); + $n->setTitle('Route commerciale refusée'); + $n->addBeg()->addLnk('embassy/player-' . $currentPlayer->getId(), $currentPlayer->getName())->addTxt(' a refusé la route commerciale proposée entre '); + $n->addLnk('map/place-' . $refusingBase->getRPlace(), $refusingBase->getName())->addTxt(' et '); + $n->addLnk('map/place-' . $proposerBase->getRPlace(), $proposerBase->getName())->addTxt('.'); + $n->addSep()->addTxt('Les ' . Format::numberFormat($cr->getPrice()) . ' crédits bloqués sont à nouveau disponibles.'); + $n->addEnd(); + $notificationManager->add($n); + + //destruction de la route + $commercialRouteManager->remove($cr); + $this->addFlash('success', 'Route commerciale refusée'); + + return $this->redirect($request->headers->get('referer')); + } else { + throw new ConflictHttpException('impossible de refuser une route commerciale'); + } + } else { + throw new BadRequestHttpException('pas assez d\'informations pour refuser une route commerciale'); + } + } +} diff --git a/src/Modules/Athena/Manager/CommercialRouteManager.php b/src/Modules/Athena/Manager/CommercialRouteManager.php index fccbf4130..25a03a951 100644 --- a/src/Modules/Athena/Manager/CommercialRouteManager.php +++ b/src/Modules/Athena/Manager/CommercialRouteManager.php @@ -37,6 +37,7 @@ public function __construct( * operational: int, * stand_by: int, * total: int, + * total_income: int, * max: int * } **/ @@ -55,13 +56,16 @@ public function getBaseCommercialData(OrbitalBase $orbitalBase): array $nCRWaitingForMe = 0; $nCROperational = 0; $nCRInStandBy = 0; + $totalIncome = 0; + /** @var CommercialRoute $route */ foreach ($routes as $route) { if ($route->getStatement() == CommercialRoute::PROPOSED AND $route->getPlayerId1() == $session->get('playerId')) { $nCRWaitingForOther++; } elseif ($route->getStatement() == CommercialRoute::PROPOSED AND $route->getPlayerId1() != $session->get('playerId')) { $nCRWaitingForMe++; } elseif ($route->getStatement() == CommercialRoute::ACTIVE) { + $totalIncome += $route->getIncome(); $nCROperational++; } elseif ($route->getStatement() == CommercialRoute::STANDBY) { $nCRInStandBy++; @@ -73,7 +77,8 @@ public function getBaseCommercialData(OrbitalBase $orbitalBase): array 'waiting_for_other' => $nCRWaitingForOther, 'operational' => $nCROperational, 'stand_by' => $nCRInStandBy, - 'total' => $nCROperational + $nCRInStandBy + $nCRWaitingForOther, + 'total' => $nCROperational + $nCRInStandBy + $nCRWaitingForOther + $nCRWaitingForMe, + 'total_income' => $totalIncome, 'max' => $this->orbitalBaseHelper->getBuildingInfo( OrbitalBaseResource::SPATIOPORT, 'level', @@ -83,6 +88,11 @@ public function getBaseCommercialData(OrbitalBase $orbitalBase): array ]; } + public function searchCandidates(int $playerId, OrbitalBase $orbitalBase, array $factions, int $minDistance, int $maxDistance): array + { + return $this->entityManager->getRepository(CommercialRoute::class)->searchCandidates($playerId, $orbitalBase, $factions, $minDistance, $maxDistance); + } + // @TODO use an appropriate DTO for this public function getAllPlayerRoutes(Player $player): array { diff --git a/src/Modules/Athena/Model/CommercialRoute.php b/src/Modules/Athena/Model/CommercialRoute.php index 341786c28..c25394891 100644 --- a/src/Modules/Athena/Model/CommercialRoute.php +++ b/src/Modules/Athena/Model/CommercialRoute.php @@ -158,4 +158,19 @@ public function setPopulation2($var) { $this->population2 = $var; return $this; } + + public function isProposed(): bool + { + return self::PROPOSED === $this->statement; + } + + public function isActive(): bool + { + return self::ACTIVE === $this->statement; + } + + public function isInStandBy(): bool + { + return self::STANDBY === $this->statement; + } } diff --git a/src/Modules/Athena/Repository/CommercialRouteRepository.php b/src/Modules/Athena/Repository/CommercialRouteRepository.php index d006fd9e3..8b2a41443 100644 --- a/src/Modules/Athena/Repository/CommercialRouteRepository.php +++ b/src/Modules/Athena/Repository/CommercialRouteRepository.php @@ -5,6 +5,7 @@ use App\Classes\Entity\AbstractRepository; use App\Modules\Athena\Model\CommercialRoute; +use App\Modules\Athena\Model\OrbitalBase; use App\Modules\Demeter\Model\Color; use App\Modules\Zeus\Model\Player; @@ -74,6 +75,42 @@ public function get($id) return $commercialRoute; } + public function searchCandidates(int $playerId, OrbitalBase $orbitalBase, array $factions, int $minDistance, int $maxDistance): array + { + $qr = $this->connection->prepare('SELECT + pa.rColor AS playerColor, + pa.avatar AS playerAvatar, + pa.name AS playerName, + ob.name AS baseName, + ob.rPlace AS rPlace, + (FLOOR(SQRT(POW(? - s.xPosition, 2) + POW(? - s.yPosition, 2)))) AS distance + FROM orbitalBase AS ob + LEFT JOIN player AS pa + ON ob.rPlayer = pa.id + LEFT JOIN place AS p + ON ob.rPlace = p.id + LEFT JOIN system AS s + ON p.rSystem = s.id + LEFT JOIN sector AS se + ON s.rSector = se.id + WHERE + pa.id != ? + AND ob.levelSpatioport > 0 + AND (FLOOR(SQRT(POW(? - s.xPosition, 2) + POW(? - s.yPosition, 2)))) >= ? + AND (FLOOR(SQRT(POW(? - s.xPosition, 2) + POW(? - s.yPosition, 2)))) <= ? + AND pa.rColor in (' . implode(',', $factions) . ') + ORDER BY distance DESC + LIMIT 0, 40' + ); + $qr->execute([ + $orbitalBase->xSystem, $orbitalBase->ySystem, + $playerId, + $orbitalBase->xSystem, $orbitalBase->ySystem, $minDistance, + $orbitalBase->xSystem, $orbitalBase->ySystem, $maxDistance + ]); + return $qr->fetchAll(); + } + public function getAllPlayerRoutes(Player $player): array { $query = $this->connection->prepare('SELECT diff --git a/src/Modules/Atlas/Infrastructure/Controller/MapController.php b/src/Modules/Atlas/Infrastructure/Controller/MapController.php index d18413062..6c66ab675 100644 --- a/src/Modules/Atlas/Infrastructure/Controller/MapController.php +++ b/src/Modules/Atlas/Infrastructure/Controller/MapController.php @@ -67,6 +67,8 @@ public function __invoke( 'combat_reports' => $liveReportManager->getAttackReportsByPlaces($currentPlayer->getId(), $placesIds), 'colonization_cost' => $conquestManager->getColonizationCost($currentPlayer, $basesCount), 'conquest_cost' => $conquestManager->getConquestCost($currentPlayer, $basesCount), + 'route_sector_bonus' => $this->getParameter('athena.trade.route.sector_bonus'), + 'route_color_bonus' => $this->getParameter('athena.trade.route.color_bonus'), ]; } diff --git a/src/action/std/athena/route/accept.php b/src/action/std/athena/route/accept.php deleted file mode 100755 index 8e4c549e2..000000000 --- a/src/action/std/athena/route/accept.php +++ /dev/null @@ -1,113 +0,0 @@ -getContainer()->get(\App\Classes\Library\Session\SessionWrapper::class); -$request = $this->getContainer()->get('app.request'); -$database = $this->getContainer()->get(\App\Classes\Database\Database::class); -$orbitalBaseManager = $this->getContainer()->get(\App\Modules\Athena\Manager\OrbitalBaseManager::class); -$orbitalBaseHelper = $this->getContainer()->get(\App\Modules\Athena\Helper\OrbitalBaseHelper::class); -$commercialRouteManager = $this->getContainer()->get(\App\Modules\Athena\Manager\CommercialRouteManager::class); -$colorManager = $this->getContainer()->get(\App\Modules\Demeter\Manager\ColorManager::class); -$playerManager = $this->getContainer()->get(\App\Modules\Zeus\Manager\PlayerManager::class); -$notificationManager = $this->getContainer()->get(\App\Modules\Hermes\Manager\NotificationManager::class); -$routeExperienceCoeff = $this->getContainer()->getParameter('athena.trade.experience_coeff'); -$entityManager = $this->getContainer()->get(\App\Classes\Entity\EntityManager::class); -$mediaPath = $this->getContainer()->getParameter('media'); - -for ($i=0; $i < $session->get('playerBase')->get('ob')->size(); $i++) { - $verif[] = $session->get('playerBase')->get('ob')->get($i)->get('id'); -} - -$base = $request->query->get('base'); -$route = $request->query->get('route'); - - -if ($base !== FALSE AND $route !== FALSE AND in_array($base, $verif)) { - $cr = $commercialRouteManager->getByIdAndDistantBase($route, $base); - - if ($cr !== null && $cr->getStatement() == CommercialRoute::PROPOSED) { - $proposerFaction = $colorManager->get($cr->playerColor1); - $acceptorFaction = $colorManager->get($cr->playerColor2); - - if ($proposerFaction->colorLink[$cr->playerColor2] != Color::ENEMY && $acceptorFaction->colorLink[$cr->playerColor1] != Color::ENEMY) { - $proposerBase = $orbitalBaseManager->get($cr->getROrbitalBase()); - $acceptorBase = $orbitalBaseManager->get($cr->getROrbitalBaseLinked()); - - $nbrMaxCommercialRoute = $orbitalBaseHelper->getBuildingInfo(OrbitalBaseResource::SPATIOPORT, 'level', $acceptorBase->getLevelSpatioport(), 'nbRoutesMax'); - - if ($commercialRouteManager->countBaseActiveAndStandbyRoutes($acceptorBase->getId()) <= $nbrMaxCommercialRoute) { - # compute bonus if the player is from Negore - if ($session->get('playerInfo')->get('color') == ColorResource::NEGORA) { - $price = round($cr->getPrice() - ($cr->getPrice() * ColorResource::BONUS_NEGORA_ROUTE / 100)); - } else { - $price = $cr->getPrice(); - } - - if ($session->get('playerInfo')->get('credit') >= $price) { - # débit des crédits au joueur - $acceptor = $playerManager->get($session->get('playerId')); - $playerManager->decreaseCredit($acceptor, $price); - - # augmentation de l'expérience des deux joueurs - $exp = round($cr->getIncome() * $routeExperienceCoeff); - $playerManager->increaseExperience($acceptor, $exp); - $playerManager->increaseExperience($playerManager->get($proposerBase->getRPlayer()), $exp); - - # activation de la route - $cr->setStatement(CommercialRoute::ACTIVE); - $cr->setDCreation(Utils::now()); - - $n = new Notification(); - $n->setRPlayer($proposerBase->getRPlayer()); - $n->setTitle('Route commerciale acceptée'); - $n->addBeg(); - $n->addLnk('embassy/player-' . $session->get('playerId'), $session->get('playerInfo')->get('name'))->addTxt(' a accepté la route commerciale proposée entre '); - $n->addLnk('map/place-' . $acceptorBase->getRPlace(), $acceptorBase->getName())->addTxt(' et '); - $n->addLnk('map/place-' . $proposerBase->getRPlace(), $proposerBase->getName()); - $n->addSep()->addTxt('Cette route vous rapporte ' . Format::numberFormat($cr->getIncome()) . ' crédits par relève.'); - $n->addBrk()->addBoxResource('xp', $exp, 'expérience gagnée', $mediaPath); - $n->addSep()->addLnk('action/a-switchbase/base-' . $proposerBase->getRPlace() . '/page-spatioport', 'En savoir plus ?'); - $n->addEnd(); - $notificationManager->add($n); - - $entityManager->flush(); - $entityManager->clear(CommercialRoute::class); - if (true === $this->getContainer()->getParameter('data_analysis')) { - $qr = $database->prepare('INSERT INTO - DA_CommercialRelation(`from`, `to`, type, weight, dAction) - VALUES(?, ?, ?, ?, ?)' - ); - $qr->execute([$cr->playerId1, $cr->playerId2, 6, DataAnalysis::creditToStdUnit($cr->price), Utils::now()]); - } - - $session->addFlashbag('Route commerciale acceptée, vous gagnez ' . $exp . ' points d\'expérience', Flashbag::TYPE_SUCCESS); - } else { - throw new ErrorException('impossible d\'accepter une route commerciale'); - } - } else { - throw new ErrorException('impossible d\'accepter une route commerciale'); - } - } else { - throw new ErrorException('Vous ne pouvez pas accepter les routes de ce joueur, vos deux factions sont en guerre'); - } - } else { - throw new ErrorException('impossible d\'accepter une route commerciale'); - } -} else { - throw new FormException('pas assez d\'informations pour accepter une route commerciale'); -} diff --git a/src/action/std/athena/route/cancel.php b/src/action/std/athena/route/cancel.php deleted file mode 100755 index c43983d00..000000000 --- a/src/action/std/athena/route/cancel.php +++ /dev/null @@ -1,58 +0,0 @@ -getContainer()->get(\App\Classes\Library\Session\SessionWrapper::class); -$request = $this->getContainer()->get('app.request'); -$orbitalBaseManager = $this->getContainer()->get(\App\Modules\Athena\Manager\OrbitalBaseManager::class); -$commercialRouteManager = $this->getContainer()->get(\App\Modules\Athena\Manager\CommercialRouteManager::class); -$playerManager = $this->getContainer()->get(\App\Modules\Zeus\Manager\PlayerManager::class); -$notificationManager = $this->getContainer()->get(\App\Modules\Hermes\Manager\NotificationManager::class); -$routeCancelRefund = $this->getContainer()->getParameter('athena.trade.route.cancellation_refund'); -$entityManager = $this->getContainer()->get(\App\Classes\Entity\EntityManager::class); - -for ($i=0; $i < $session->get('playerBase')->get('ob')->size(); $i++) { - $verif[] = $session->get('playerBase')->get('ob')->get($i)->get('id'); -} - -$base = $request->query->get('base'); -$route = $request->query->get('route'); - -if ($base !== FALSE AND $route !== FALSE AND in_array($base, $verif)) { - $cr = $commercialRouteManager->getByIdAndBase($route, $base); - if ($cr !== null && $cr->getStatement() == CommercialRoute::PROPOSED) { - $proposerBase = $orbitalBaseManager->get($cr->getROrbitalBase()); - $linkedBase = $orbitalBaseManager->get($cr->getROrbitalBaseLinked()); - - //rend 80% des crédits investis - $playerManager->increaseCredit($playerManager->get($session->get('playerId')), round($cr->getPrice() * $routeCancelRefund)); - - //notification - $n = new Notification(); - $n->setRPlayer($linkedBase->getRPlayer()); - $n->setTitle('Route commerciale annulée'); - - $n->addBeg()->addLnk('embassy/player-' . $session->get('playerId'), $session->get('playerInfo')->get('name'))->addTxt(' a finalement retiré la proposition de route commerciale qu\'il avait faite entre '); - $n->addLnk('map/place-' . $linkedBase->getRPlace(), $linkedBase->getName())->addTxt(' et '); - $n->addLnk('map/place-' . $proposerBase->getRPlace(), $proposerBase->getName()); - $n->addEnd(); - $notificationManager->add($n); - - //destruction de la route - $commercialRouteManager->remove($cr); - $session->addFlashbag('Route commerciale annulée. Vous récupérez les ' . $routeCancelRefund * 100 . '% du montant investi.', Flashbag::TYPE_SUCCESS); - } else { - throw new ErrorException('impossible d\'annuler une route commerciale'); - } -} else { - throw new FormException('pas assez d\'informations pour annuler une route commerciale'); -} -$entityManager->flush(); diff --git a/src/action/std/athena/route/delete.php b/src/action/std/athena/route/delete.php deleted file mode 100755 index ff7d20725..000000000 --- a/src/action/std/athena/route/delete.php +++ /dev/null @@ -1,83 +0,0 @@ -getContainer()->get('app.request'); -$session = $this->getContainer()->get(\App\Classes\Library\Session\SessionWrapper::class); -$commercialRouteManager = $this->getContainer()->get(\App\Modules\Athena\Manager\CommercialRouteManager::class); -$orbitalBaseManager = $this->getContainer()->get(\App\Modules\Athena\Manager\OrbitalBaseManager::class); -$playerManager = $this->getContainer()->get(\App\Modules\Zeus\Manager\PlayerManager::class); -$notificationManager = $this->getContainer()->get(\App\Modules\Hermes\Manager\NotificationManager::class); -$routeExperienceCoeff = $this->getContainer()->getParameter('athena.trade.experience_coeff'); - -for ($i = 0; $i < $session->get('playerBase')->get('ob')->size(); $i++) { - $verif[] = $session->get('playerBase')->get('ob')->get($i)->get('id'); -} - -$base = $request->query->get('base'); -$route = $request->query->get('route'); - -if ($base !== FALSE AND $route !== FALSE AND in_array($base, $verif)) { - $cr = $commercialRouteManager->get($route); - if ($cr !== null && in_array($cr->statement, [CommercialRoute::ACTIVE, CommercialRoute::STANDBY])) { - if ($cr->playerId1 == $session->get('playerId') || $cr->playerId2 == $session->get('playerId')) { - if ($cr->getROrbitalBase() == $base OR $cr->getROrbitalBaseLinked() == $base) { - $proposerBase = $orbitalBaseManager->get($cr->getROrbitalBase()); - $linkedBase = $orbitalBaseManager->get($cr->getROrbitalBaseLinked()); - if ($cr->getROrbitalBase() == $base) { - $notifReceiver = $linkedBase->getRPlayer(); - $myBaseName = $proposerBase->getName(); - $otherBaseName = $linkedBase->getName(); - $myBaseId = $proposerBase->getRPlace(); - $otherBaseId = $linkedBase->getRPlace(); - } else { //if ($cr->getROrbitalBaseLinked == $base) { - $notifReceiver = $proposerBase->getRPlayer(); - $myBaseName = $linkedBase->getName(); - $otherBaseName = $proposerBase->getName(); - $myBaseId = $linkedBase->getRPlace(); - $otherBaseId = $proposerBase->getRPlace(); - } - - # perte du prestige pour les joueurs Négoriens - # @TODO check if this code is used somewhere or not -// $S_PAM1 = $playerManager->getCurrentSession(); -// $playerManager->newSession(); -// $playerManager->load(array('id' => array($cr->playerId1, $cr->playerId2))); -// $exp = round($cr->getIncome() * $routeExperienceCoeff); -// -// $playerManager->changeSession($S_PAM1); - //notification - $n = new Notification(); - $n->setRPlayer($notifReceiver); - $n->setTitle('Route commerciale détruite'); - $n->addBeg()->addLnk('embassy/player-' . $session->get('playerId'), $session->get('playerInfo')->get('name'))->addTxt(' annule les accords commerciaux entre '); - $n->addLnk('map/place-' . $myBaseId, $myBaseName)->addTxt(' et '); - $n->addLnk('map/place-' . $otherBaseId, $otherBaseName)->addTxt('.'); - $n->addSep()->addTxt('La route commerciale qui liait les deux bases orbitales est détruite, elle ne vous rapporte donc plus rien !'); - $n->addEnd(); - $notificationManager->add($n); - - //destruction de la route - $commercialRouteManager->remove($cr); - - $session->addFlashbag('Route commerciale détruite', Flashbag::TYPE_SUCCESS); - } else { - throw new ErrorException('impossible de supprimer une route commerciale'); - } - } else { - throw new ErrorException('cette route ne vous appartient pas'); - } - } else { - throw new ErrorException('impossible de supprimer une route commerciale'); - } -} else { - throw new FormException('pas assez d\'informations pour supprimer une route commerciale'); -} diff --git a/src/action/std/athena/route/propose.php b/src/action/std/athena/route/propose.php deleted file mode 100755 index 90ebcec9c..000000000 --- a/src/action/std/athena/route/propose.php +++ /dev/null @@ -1,122 +0,0 @@ -getContainer()->get('app.request'); -$session = $this->getContainer()->get(\App\Classes\Library\Session\SessionWrapper::class); -$commercialRouteManager = $this->getContainer()->get(\App\Modules\Athena\Manager\CommercialRouteManager::class); -$orbitalBaseManager = $this->getContainer()->get(\App\Modules\Athena\Manager\OrbitalBaseManager::class); -$orbitalBaseHelper = $this->getContainer()->get(\App\Modules\Athena\Helper\OrbitalBaseHelper::class); -$playerManager = $this->getContainer()->get(\App\Modules\Zeus\Manager\PlayerManager::class); -$notificationManager = $this->getContainer()->get(\App\Modules\Hermes\Manager\NotificationManager::class); -$colorManager = $this->getContainer()->get(\App\Modules\Demeter\Manager\ColorManager::class); -$routeColorBonus = $this->getContainer()->getParameter('athena.trade.route.color_bonus'); -$routeSectorBonus = $this->getContainer()->getParameter('athena.trade.route.sector_bonus'); -$entityManager = $this->getContainer()->get(\App\Classes\Entity\EntityManager::class); - -for ($i=0; $i < $session->get('playerBase')->get('ob')->size(); $i++) { - $verif[] = $session->get('playerBase')->get('ob')->get($i)->get('id'); -} -$baseFrom = $request->query->get('basefrom'); -$baseTo = $request->query->get('baseto'); - -if ($baseFrom !== FALSE AND $baseTo !== FALSE AND in_array($baseFrom, $verif)) { - $proposerBase = $orbitalBaseManager->get($baseFrom); - $otherBase = $orbitalBaseManager->get($baseTo); - - $nbrMaxCommercialRoute = $orbitalBaseHelper->getBuildingInfo(OrbitalBaseResource::SPATIOPORT, 'level', $proposerBase->getLevelSpatioport(), 'nbRoutesMax'); - - // Check if a route already exists between these two bases - $alreadyARoute = $commercialRouteManager->isAlreadyARoute($proposerBase->getId(), $otherBase->getId()); - - if (($commercialRouteManager->countBaseRoutes($proposerBase->getId()) < $nbrMaxCommercialRoute) && (!$alreadyARoute) && ($proposerBase->getLevelSpatioport() > 0) && ($otherBase->getLevelSpatioport() > 0)) { - $player = $playerManager->get($otherBase->getRPlayer()); - - $playerFaction = $colorManager->get($session->get('playerInfo')->get('color')); - $otherFaction = $colorManager->get($player->rColor); - - if ($playerFaction->colorLink[$player->rColor] != Color::ENEMY && $otherFaction->colorLink[$session->get('playerInfo')->get('color')] != Color::ENEMY) { - - if ($proposerBase !== null && $otherBase !== null && ($proposerBase->getRPlayer() != $otherBase->getRPlayer()) && $player !== null) { - $distance = Game::getDistance($proposerBase->getXSystem(), $otherBase->getXSystem(), $proposerBase->getYSystem(), $otherBase->getYSystem()); - $bonusA = ($proposerBase->getSector() != $otherBase->getSector()) ? $routeSectorBonus : 1; - $bonusB = ($session->get('playerInfo')->get('color')) != $player->getRColor() ? $routeColorBonus : 1; - $price = Game::getRCPrice($distance); - $income = Game::getRCIncome($distance, $bonusA, $bonusB); - - if ($distance == 1) { - $imageLink = '1-' . rand(1, 3); - } elseif ($distance < 26) { - $imageLink = '2-' . rand(1, 3); - } elseif ($distance < 126) { - $imageLink = '3-' . rand(1, 3); - } else { - $imageLink = '4-' . rand(1, 3); - } - - # compute bonus - if (in_array(ColorResource::COMMERCIALROUTEPRICEBONUS, $playerFaction->bonus)) { - $priceWithBonus = round($price - ($price * ColorResource::BONUS_NEGORA_ROUTE / 100)); - } else { - $priceWithBonus = $price; - } - - if ($session->get('playerInfo')->get('credit') >= $priceWithBonus) { - # création de la route - $cr = new CommercialRoute(); - $cr->setROrbitalBase($proposerBase->getId()); - $cr->setROrbitalBaseLinked($otherBase->getId()); - $cr->setImageLink($imageLink); - $cr->setDistance($distance); - $cr->setPrice($price); - $cr->setIncome($income); - $cr->setDProposition(Utils::now()); - $cr->setDCreation(NULL); - $cr->setStatement(0); - $commercialRouteManager->add($cr); - - # débit des crédits au joueur - $playerManager->decreaseCredit($playerManager->get($session->get('playerId')), $priceWithBonus); - - $n = new Notification(); - $n->setRPlayer($otherBase->getRPlayer()); - $n->setTitle('Proposition de route commerciale'); - $n->addBeg()->addLnk('embassy/player-' . $session->get('playerId'), $session->get('playerInfo')->get('name')); - $n->addTxt(' vous propose une route commerciale liant '); - $n->addLnk('map/place-' . $proposerBase->getRPlace(), $proposerBase->getName())->addTxt(' et '); - $n->addLnk('map/place-' . $otherBase->getRPlace(), $otherBase->getName())->addTxt('.'); - $n->addSep()->addTxt('Les frais de l\'opération vous coûteraient ' . Format::numberFormat($priceWithBonus) . ' crédits; Les gains estimés pour cette route sont de ' . Format::numberFormat($income) . ' crédits par relève.'); - $n->addSep()->addLnk('action/a-switchbase/base-' . $otherBase->getRPlace() . '/page-spatioport', 'En savoir plus ?'); - $n->addEnd(); - $notificationManager->add($n); - - $session->addFlashbag('Route commerciale proposée', Flashbag::TYPE_SUCCESS); - } else { - throw new ErrorException('impossible de proposer une route commerciale - vous n\'avez pas assez de crédits'); - } - } else { - throw new ErrorException('impossible de proposer une route commerciale (2)'); - } - } else { - throw new ErrorException('impossible de proposer une route commerciale à ce joueur, vos factions sont en guerre.'); - } - } else { - throw new ErrorException('impossible de proposer une route commerciale (3)'); - } -} else { - throw new FormException('pas assez d\'informations pour proposer une route commerciale'); -} diff --git a/src/action/std/athena/route/refuse.php b/src/action/std/athena/route/refuse.php deleted file mode 100755 index 3882faff1..000000000 --- a/src/action/std/athena/route/refuse.php +++ /dev/null @@ -1,58 +0,0 @@ -getContainer()->get('app.request'); -$session = $this->getContainer()->get(\App\Classes\Library\Session\SessionWrapper::class); -$commercialRouteManager = $this->getContainer()->get(\App\Modules\Athena\Manager\CommercialRouteManager::class); -$orbitalBaseManager = $this->getContainer()->get(\App\Modules\Athena\Manager\OrbitalBaseManager::class); -$orbitalBaseHelper = $this->getContainer()->get(\App\Modules\Athena\Helper\OrbitalBaseHelper::class); -$playerManager = $this->getContainer()->get(\App\Modules\Zeus\Manager\PlayerManager::class); -$notificationManager = $this->getContainer()->get(\App\Modules\Hermes\Manager\NotificationManager::class); -$colorManager = $this->getContainer()->get(\App\Modules\Demeter\Manager\ColorManager::class); - -for ($i=0; $i < $session->get('playerBase')->get('ob')->size(); $i++) { - $verif[] = $session->get('playerBase')->get('ob')->get($i)->get('id'); -} - -$base = $request->query->get('base'); -$route = $request->query->get('route'); - -if ($base !== FALSE AND $route !== FALSE AND in_array($base, $verif)) { - $cr = $commercialRouteManager->getByIdAndDistantBase($route, $base); - if ($cr !== null && $cr->getStatement() === CommercialRoute::PROPOSED) { - $proposerBase = $orbitalBaseManager->get($cr->getROrbitalBase()); - $refusingBase = $orbitalBaseManager->get($cr->getROrbitalBaseLinked()); - - //rend les crédits au proposant - $playerManager->increaseCredit($playerManager->get($proposerBase->getRPlayer()), intval($cr->getPrice())); - - //notification - $n = new Notification(); - $n->setRPlayer($proposerBase->getRPlayer()); - $n->setTitle('Route commerciale refusée'); - $n->addBeg()->addLnk('embassy/player-' . $session->get('playerId'), $session->get('playerInfo')->get('name'))->addTxt(' a refusé la route commerciale proposée entre '); - $n->addLnk('map/place-' . $refusingBase->getRPlace(), $refusingBase->getName())->addTxt(' et '); - $n->addLnk('map/place-' . $proposerBase->getRPlace(), $proposerBase->getName())->addTxt('.'); - $n->addSep()->addTxt('Les ' . Format::numberFormat($cr->getPrice()) . ' crédits bloqués sont à nouveau disponibles.'); - $n->addEnd(); - $notificationManager->add($n); - - //destruction de la route - $commercialRouteManager->remove($cr); - $session->addFlashbag('Route commerciale refusée', Flashbag::TYPE_SUCCESS); - } else { - throw new ErrorException('impossible de refuser une route commerciale'); - } -} else { - throw new FormException('pas assez d\'informations pour refuser une route commerciale'); -} diff --git a/src/views/components/bases/ob/spatioport.php b/src/views/components/bases/ob/spatioport.php deleted file mode 100755 index a3c4ab19a..000000000 --- a/src/views/components/bases/ob/spatioport.php +++ /dev/null @@ -1,401 +0,0 @@ -getContainer(); -$appRoot = $container->getParameter('app_root'); -$mediaPath = $container->getParameter('media'); -$componentPath = $container->getParameter('component'); -$orbitalBaseHelper = $this->getContainer()->get(\App\Modules\Athena\Helper\OrbitalBaseHelper::class); -$request = $this->getContainer()->get('app.request'); -$commercialRouteManager = $this->getContainer()->get(\App\Modules\Athena\Manager\CommercialRouteManager::class); -$database = $this->getContainer()->get(\App\Classes\Database\Database::class); -$session = $this->getContainer()->get(\App\Classes\Library\Session\SessionWrapper::class); -$sessionToken = $session->get('token'); -$entityManager = $this->getContainer()->get(\App\Classes\Entity\EntityManager::class); - -$nMaxCR = $orbitalBaseHelper->getBuildingInfo(OrbitalBaseResource::SPATIOPORT, 'level', $ob_spatioport->getLevelSpatioport(), 'nbRoutesMax'); -$nCRWaitingForOther = 0; $nCRWaitingForMe = 0; -$nCROperational = 0; $nCRInStandBy = 0; -$nCRInDock = 0; -$totalIncome = 0; - -$routes = array_merge( - $commercialRouteManager->getByBase($ob_spatioport->getId()), - $commercialRouteManager->getByDistantBase($ob_spatioport->getId()) -); - -if (count($routes) > 0) { - foreach ($routes as $route) { - if ($route->getStatement() == CommercialRoute::PROPOSED AND $route->getPlayerId1() == $session->get('playerId')) { - $nCRWaitingForOther++; - } elseif ($route->getStatement() == CommercialRoute::PROPOSED AND $route->getPlayerId1() != $session->get('playerId')) { - $nCRWaitingForMe++; - } elseif ($route->getStatement() == CommercialRoute::ACTIVE) { - $nCROperational++; - $totalIncome += $route->getIncome(); - } elseif ($route->getStatement() == CommercialRoute::STANDBY) { - $nCRInStandBy++; - } - } - $nCRInDock = $nCROperational + $nCRInStandBy + $nCRWaitingForOther; -} -$inGameFactions = $this->getContainer()->get(\App\Modules\Demeter\Manager\ColorManager::class)->getInGameFactions(); - -$factions = []; -foreach ($inGameFactions as $inGameFaction) { - $factions[] = $inGameFaction->id; -} - -# view -echo '
';
- echo '
';
- echo 'Routes commerciales';
- echo 'Gérez vos routes commerciales';
- echo '';
-
- $active = ($request->query->get('mode') == 'search') ? 'active' : '';
- echo '';
- echo '
';
- echo 'Recherche';
- echo 'Trouvez des partenaires commerciaux';
- echo '';
-
- echo 'Aucun partenaire commercial trouvé selon les critères de recherche fournis.
'; - } - echo '
';
- $base1 .= '' . PlaceResource::get($rc->baseType1, 'name') . ' ' . $rc->getBaseName1() . '
';
- $base2 .= '' . PlaceResource::get($rc->baseType2, 'name') . ' ' . $rc->getBaseName2() . '
';
- $base1 .= '' . PlaceResource::get($rc->baseType1, 'name') . ' ' . $rc->getBaseName1() . '
';
- $base2 .= '' . PlaceResource::get($rc->baseType2, 'name') . ' ' . $rc->getBaseName2() . '' . $orbitalBaseHelper->getBuildingInfo(OrbitalBaseResource::SPATIOPORT, 'description') . '
'; - echo '- Dernier pillage {{ report.dFight|date }}. + Dernier pillage {{ report.dFight|date|raw }}.
{% endif %} diff --git a/templates/molecules/base/trade/commercial_route_base.html.twig b/templates/molecules/base/trade/commercial_route_base.html.twig new file mode 100644 index 000000000..b0cd4b306 --- /dev/null +++ b/templates/molecules/base/trade/commercial_route_base.html.twig @@ -0,0 +1,7 @@ +
+ {{ base_type|scalar_base_type }}
+ {{ base_name }}
+
Revenu par relève
@@ -184,10 +184,9 @@
{% elseif commercial_route_data.not_accepted == true %}
Accepter la proposition
{% elseif commercial_route_data.stand_by == true %}
-
+
{% else %}
-
- {% if price > current_place.credit %}
+ {% if price > current_player.credit %}
{% elseif commercial_route_data.slots < get_building_info(constant('App\\Modules\\Athena\\Resource\\OrbitalBaseResource::SPATIOPORT'), 'level', current_base.levelSpatioport, 'nbRoutesMax') %}
@@ -241,7 +240,7 @@
{% if place.sectorColor != current_player.rColor or place.sectorColor == 0 %}
Vous ne pouvez envoyer des recycleurs que dans des secteurs non-revendiqués ou contrôlés par votre faction.
{% elseif place.typeOfPlace == constant('App\\Modules\\Gaia\\Model\\Place::EMPTYZONE') %}
- Cette endroit regorgait autrefois de ressources ou de gaz mais de nombreux recycleurs sont déjà passés par là et n\'ont laissé que le vide de l'espace.
+ Cet endroit regorgait autrefois de ressources ou de gaz mais de nombreux recycleurs sont déjà passés par là et n\'ont laissé que le vide de l'espace.
{% elseif current_base.levelRecycling == 0 %}
Vous devez disposer d'un centre de recyclage.
{% else %}
diff --git a/templates/pages/athena/spatioport.html.twig b/templates/pages/athena/spatioport.html.twig
new file mode 100644
index 000000000..527e6ce0d
--- /dev/null
+++ b/templates/pages/athena/spatioport.html.twig
@@ -0,0 +1,346 @@
+{% extends 'layouts/athena/current_base.html.twig' %}
+
+{% block content %}
+
+
+ Routes commerciales
+ Gérez vos routes commerciales
+
+
+
+
+ Recherche
+ Trouvez des partenaires commerciaux
+
+
+ Aucun partenaire commercial trouvé selon les critères de recherche fournis.
+ {% endif %} +{{ get_building_info(constant('App\\Modules\\Athena\\Resource\\OrbitalBaseResource::SPATIOPORT'), 'description')|raw }}
+