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 ''; - echo '

' . $orbitalBaseHelper->getBuildingInfo(OrbitalBaseResource::SPATIOPORT, 'frenchName') . '

'; - echo 'Niveau ' . $ob_spatioport->getLevelSpatioport() . ''; - echo '
'; - echo '
'; - echo '
'; - $active = (!$request->query->has('mode') || $request->query->get('mode') == 'list') ? 'active' : ''; - 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 '
'; - - echo '
'; - echo 'routes commerciales'; - echo '' . $nCRInDock . ' / ' . $nMaxCR . ''; - - echo ''; - echo ''; - echo '
'; - - echo '
'; - echo 'routes commerciales actives'; - echo '' . $nCROperational . ''; - echo '
'; - - echo '
'; - echo 'routes commerciales en attente'; - echo '' . $nCRWaitingForOther . ''; - echo '
'; - - echo '
'; - echo 'propositions commerciales'; - echo '' . $nCRWaitingForMe . ''; - echo '
'; - - if ($nCRInStandBy > 0) { - echo '
'; - echo 'routes commerciales bloquées'; - echo '' . $nCRInStandBy . ''; - echo '
'; - } - - echo '
'; - - echo '
'; - echo 'revenu total de cette base'; - echo ''; - echo Format::numberFormat($totalIncome); - if ($session->get('playerBonus')->get(PlayerBonus::COMMERCIAL_INCOME) != 0) { - echo '+ ' . Format::numberFormat($session->get('playerBonus')->get(PlayerBonus::COMMERCIAL_INCOME) * $totalIncome / 100) . ''; - } - echo ' '; - echo ''; - echo '
'; - echo '
'; - echo '
'; -echo '
'; - -if ($request->query->get('mode') === 'search') { - echo '
'; - echo '
'; - echo '

Recherche

'; - echo '
'; - echo '
'; - echo '
'; - echo '
'; - echo '

Chercher des partenaires commerciaux...

'; - foreach ($factions as $i) { - echo '

'; - } - - echo '

A une distance...

'; - - echo '

'; - echo '

'; - - echo '

'; - echo '

'; - - echo '

'; - echo '
'; - echo '
'; - echo '
'; - echo '
'; - - if ($request->query->get('show') === 'result') { - $min = $request->request->has('min-dist') ? abs(intval($request->request->get('min-dist'))) : 75; - $max = $request->request->has('max-dist') ? abs(intval($request->request->get('max-dist'))) : 75; - - $checkedFactions = [0]; - foreach ($factions as $i) { - if ($request->request->has('faction-' . $i)) { - $checkedFactions[] = $i; - } - } - - $qr = $database->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(',', $checkedFactions) . ') - ORDER BY distance DESC - LIMIT 0, 40' - ); - $qr->execute([ - $ob_spatioport->xSystem, $ob_spatioport->ySystem, - $session->get('playerId'), - $ob_spatioport->xSystem, $ob_spatioport->ySystem, $min, - $ob_spatioport->xSystem, $ob_spatioport->ySystem, $max - ]); - $aw = $qr->fetchAll(); - - echo '
'; - echo '
'; - echo '

Résultats

'; - echo '
'; - echo '
'; - echo '
'; - foreach ($aw as $base) { - echo ''; - echo ''; - echo '' . $base['playerName'] . ''; - echo '' . $base['baseName'] . ''; - echo '' . $base['distance'] . ' al.'; - echo ''; - } - - if (count($aw) == 0) { - echo '

Aucun partenaire commercial trouvé selon les critères de recherche fournis.

'; - } - echo '
'; - echo '
'; - echo '
'; - } -} else { - $j = 0; - foreach ($routes as $rc) { - if ($rc->getStatement() == CommercialRoute::PROPOSED && $rc->getPlayerId2() == $session->get('playerId')) { - $base1 = '
'; - $base1 .= '' . $ob_spatioport->getName() . ''; - $base1 .= '' . PlaceResource::get($rc->baseType1, 'name') . ' ' . $rc->getBaseName1() . '
'; - $base1 .= 'de ' . $rc->getPlayerName1() . '
'; - $base1 .= Format::numberFormat($rc->getPopulation1()) . ' millions de population'; - $base1 .= '
'; - - $base2 = '
'; - $base2 .= '' . $ob_spatioport->getName() . ''; - $base2 .= '' . PlaceResource::get($rc->baseType2, 'name') . ' ' . $rc->getBaseName2() . '
'; - $base2 .= 'de ' . $rc->getPlayerName2() . '
'; - $base2 .= Format::numberFormat($rc->getPopulation2()) . ' millions de population'; - $base2 .= '
'; - - echo '
'; - echo '
'; - echo ($j == 0) ? '

Propositions

' : ''; - echo '
'; - echo '
'; - echo '
'; - echo '
'; - if ($rc->getPrice() > $session->get('playerInfo')->get('credit')) { - echo 'pas assez de crédits pour accepter'; - } elseif ($nCRInDock >= $nMaxCR) { - echo 'pas d\'emplacement libre pour accepter'; - } else { - $price = $rc->getPrice(); - if ($session->get('playerInfo')->get('color') == ColorResource::NEGORA) { - # bonus if the player is from Negore - $price -= round($price * ColorResource::BONUS_NEGORA_ROUTE / 100); - } - echo 'accepter pour ' . Format::numberFormat($price) . ' crédits'; - } - echo 'x'; - echo '
'; - - echo '
'; - echo 'Etat de la route commerciale'; - echo ''; - echo 'En attente'; - echo ''; - echo '
'; - - echo '
'; - echo ($rc->getPlayerId1() == $session->get('playerId')) ? $base2 : $base1; - - echo '
    '; - echo '
  • Distance ' . $rc->getDistance() . ' al.
  • '; - echo '
  • Prix '; - echo Format::numberFormat($rc->getPrice()); - if ($session->get('playerInfo')->get('color') == ColorResource::NEGORA) { - # bonus if the player is from Negore - echo '- ' . Format::numberFormat(round(ColorResource::BONUS_NEGORA_ROUTE * $rc->getPrice() / 100)) . ''; - } - echo ' '; - echo '
  • '; - echo '
  • Estimation du revenu par relève'; - echo Format::numberFormat($rc->getIncome()); - if ($session->get('playerBonus')->get(PlayerBonus::COMMERCIAL_INCOME) != 0) { - echo '+ ' . Format::numberFormat($session->get('playerBonus')->get(PlayerBonus::COMMERCIAL_INCOME) * $rc->getIncome() / 100) . ''; - } - echo ' '; - echo '
  • '; - echo '
  • Population touchée ' . Format::numberFormat($rc->getPopulation1() + $rc->getPopulation2()) . ' millions
  • '; - - if (in_array($rc->getStatement(), array(CommercialRoute::ACTIVE, CommercialRoute::STANDBY))) { - echo '
  • En service depuis
    ' . Chronos::transform($rc->dCreation) . '
  • '; - } - echo '
'; - - echo ($rc->getPlayerId1() == $session->get('playerId')) ? $base1 : $base2; - echo '
'; - echo '
'; - echo '
'; - echo '
'; - $j++; - } - } - - $j = 0; - foreach ($routes as $rc) { - if ($rc->getStatement() != CommercialRoute::PROPOSED || $rc->getPlayerId2() != $session->get('playerId')) { - $base1 = '
'; - $base1 .= ''; - $base1 .= '' . PlaceResource::get($rc->baseType1, 'name') . ' ' . $rc->getBaseName1() . '
'; - $base1 .= 'de ' . $rc->getPlayerName1() . '
'; - $base1 .= Format::numberFormat($rc->getPopulation1()) . ' millions de population'; - $base1 .= '
'; - - $base2 = '
'; - $base2 .= ''; - $base2 .= '' . PlaceResource::get($rc->baseType2, 'name') . ' ' . $rc->getBaseName2() . '
'; - $base2 .= 'de ' . $rc->getPlayerName2() . '
'; - $base2 .= Format::numberFormat($rc->getPopulation2()) . ' millions de population'; - $base2 .= '
'; - - echo '
'; - echo '
'; - echo ($j == 0) ? '

Routes commerciales

' : ''; - echo '
'; - echo '
'; - echo '
'; - echo '
'; - if ($rc->getStatement() == CommercialRoute::PROPOSED) { - echo 'annuler la proposition commerciale'; - } else { - echo 'démanteler la route commerciale'; - } - echo '
'; - - echo '
'; - echo 'Etat de la route commerciale'; - echo ''; - switch ($rc->getStatement()) { - case CommercialRoute::PROPOSED: echo 'En attente'; break; - case CommercialRoute::ACTIVE: echo 'En activité'; break; - case CommercialRoute::STANDBY: echo 'Gelée'; break; - default: break; - } - echo ''; - echo '
'; - - echo '
'; - echo ($rc->getPlayerId1() == $session->get('playerId')) ? $base2 : $base1; - - echo '
    '; - echo '
  • Distance ' . $rc->getDistance() . ' al.
  • '; - echo '
  • Revenu par relève ' . (($rc->getStatement() != CommercialRoute::ACTIVE) ? '[non effectif]' : '') . ''; - echo Format::numberFormat($rc->getIncome()); - if ($session->get('playerBonus')->get(PlayerBonus::COMMERCIAL_INCOME) != 0) { - echo '+ ' . Format::numberFormat($session->get('playerBonus')->get(PlayerBonus::COMMERCIAL_INCOME) * $rc->getIncome() / 100) . ''; - } - echo ' '; - echo '
  • '; - echo '
  • Population touchée ' . Format::numberFormat($rc->getPopulation1() + $rc->getPopulation2()) . ' millions
  • '; - - if (in_array($rc->getStatement(), array(CommercialRoute::ACTIVE, CommercialRoute::STANDBY))) { - echo '
  • En service depuis
    ' . Chronos::transform($rc->dCreation) . '
  • '; - } - echo '
'; - - echo ($rc->getPlayerId1() == $session->get('playerId')) ? $base1 : $base2; - echo '
'; - echo '
'; - echo '
'; - echo '
'; - $j++; - } - } -} - -echo '
'; - echo '
'; - echo '

À propos

'; - echo '
'; - echo '
'; - echo '
'; - echo '

' . $orbitalBaseHelper->getBuildingInfo(OrbitalBaseResource::SPATIOPORT, 'description') . '

'; - echo '
'; - echo '
'; -echo '
'; - -if (count($routes) == 0) { - include $componentPath . 'default.php'; -} - -$entityManager->clear(CommercialRoute::class); diff --git a/templates/components/base/fast_view.html.twig b/templates/components/base/fast_view.html.twig index 646f3287c..01b76048e 100644 --- a/templates/components/base/fast_view.html.twig +++ b/templates/components/base/fast_view.html.twig @@ -212,10 +212,10 @@
Routes commerciales - {{ orbital_base.commercialRoutesData.operational }} / {{ orbital_base.commercialRoutesData.max }} + {{ orbital_base.commercialRoutesData.total }} / {{ orbital_base.commercialRoutesData.max }} - {% set percent = ((orbital_base.commercialRoutesData.operational / orbital_base.commercialRoutesData.max) * 100)|number %} + {% set percent = ((orbital_base.commercialRoutesData.total / orbital_base.commercialRoutesData.max) * 100)|number %} diff --git a/templates/components/common/navbar.html.twig b/templates/components/common/navbar.html.twig index e8463c724..6c4b6aac7 100644 --- a/templates/components/common/navbar.html.twig +++ b/templates/components/common/navbar.html.twig @@ -114,11 +114,11 @@ {% for notification in current_player_notifications %}

{{ notification.title }}

-
{{ notification.content }}
+
{{ notification.content|raw }}
{% endfor %} diff --git a/templates/components/fleet/combat_reports.html.twig b/templates/components/fleet/combat_reports.html.twig index c35cc84c6..4fd322966 100644 --- a/templates/components/fleet/combat_reports.html.twig +++ b/templates/components/fleet/combat_reports.html.twig @@ -39,7 +39,7 @@
{{ report_data.title }} - {{- report.dFight|date -}} + {{- report.dFight|date|raw -}}
diff --git a/templates/components/map/system_details.html.twig b/templates/components/map/system_details.html.twig index 4422b57b8..8bd050792 100644 --- a/templates/components/map/system_details.html.twig +++ b/templates/components/map/system_details.html.twig @@ -172,7 +172,7 @@

- 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_name }} + {{ base_type|scalar_base_type }} + {{ base_name }}
+ de {{ player_name }}
+ {{ population|number }} millions de population +
diff --git a/templates/molecules/map/place_actions.html.twig b/templates/molecules/map/place_actions.html.twig index 9e5ad924b..b5cefe45e 100644 --- a/templates/molecules/map/place_actions.html.twig +++ b/templates/molecules/map/place_actions.html.twig @@ -152,16 +152,16 @@ {% elseif default_base.levelSpatioport == 0 %} Il vous faut un spatioport pour proposer une route commerciale. {% elseif place.levelSpatioport == 0 %} - Le joueur ne dispose pas d\'un spatioport. + Le joueur ne dispose pas d'un spatioport. {% else %} {% set commercial_route_data = get_commercial_route_data(default_base, place) %} {% set distance = get_place_distance(default_base, place) %} {% set price = get_route_price(distance) %} - {% set price = get_route_income(default_base, place, distance, route_sector_bonus, route_color_bonus) %} + {% set income = get_route_income(default_base, place, distance, route_sector_bonus, route_color_bonus) %}
- + 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 %} - C\'est la guerre. + C'est la guerre. {% else %} - - {% if price > current_place.credit %} + {% if price > current_player.credit %} Vous n\'avez pas assez de crédits. {% 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 %} +
+
+ +

+ {{- get_building_info(constant('App\\Modules\\Athena\\Resource\\OrbitalBaseResource::COMMERCIAL_PLATEFORME'), 'frenchName') -}} +

+ Niveau {{ current_base.levelSpatioport }} +
+
+
+ + + Routes commerciales + Gérez vos routes commerciales + + + + + Recherche + Trouvez des partenaires commerciaux + + +
+ +
+ routes commerciales + {{ routes_data.total }} / {{ routes_data.max }} + + + + +
+ +
+ routes commerciales actives + {{ routes_data.operational }} +
+ +
+ routes commerciales en attente + {{ routes_data.waiting_for_other }} +
+ +
+ propositions commerciales + {{ routes_data.waiting_for_me }} +
+ + {% if routes_data.stand_by > 0 %} +
+ routes commerciales bloquées + {{ routes_data.stand_by }} +
+ {% endif %} + +
+ +
+ revenu total de cette base + + {{ routes_data.total_income|number }} + {% if player_commercial_income_bonus > 0 %} + + {{ (player_commercial_income_bonus * routes_data.total_income / 100)|number }} + {% endif %} + + +
+
+
+
+ + {% if mode == 'search' %} +
+
+

Recherche

+
+
+
+
+

Chercher des partenaires commerciaux...

+ {% for faction in in_game_factions %} +

+ +

+ {% endfor %} +

A une distance...

+ +

+

+ +

+

+ +

+
+
+
+
+ + {% if search_results is not null %} +
+
+

Résultats

+
+
+
+ {% for base in search_results %} + + + {{ base.playerName }} + {{ base.baseName }} + {{ base.distance}} al. + + {% endfor %} + + {% if search_results|length == 0 %} +

Aucun partenaire commercial trouvé selon les critères de recherche fournis.

+ {% endif %} +
+
+
+ {% endif %} + {% else %} + {% dump routes %} + {% for route in routes %} + {% if route.isProposed and route.playerId2 == current_player.id %} + {% set origin_base = include('molecules/base/trade/commercial_route_base.html.twig', { + 'base_id': route.rOrbitalBase, + 'base_name': route.baseName1, + 'base_type': route.baseType1, + 'player_id': route.playerId1, + 'player_name': route.playerName1, + 'population': route.population1, + }) %} + {% set destination_base = include('molecules/base/trade/commercial_route_base.html.twig', { + 'base_id': route.rOrbitalBaseLinked, + 'base_name': route.baseName2, + 'base_type': route.baseType2, + 'player_id': route.playerId2, + 'player_name': route.playerName2, + 'population': route.population2, + }) %} +
+
+ {% if loop.index == 1 %} +

Propositions

+ {% endif %} +
+
+
+
+ {% if route.price > current_player.credit %} + pas assez de crédits pour accepter + {% elseif routes_data.total >= routes_data.max %} + pas d'emplacement libre pour accepter + {% else %} + {% set price = route.price %} + {# @TODO move this calculation in a dedicated service #} + {% if is_player_from_negora %} + {% set price = price - (price * negora_commercial_bonus / 100)|round %} + {% endif %} + accepter pour {{ price|number }} crédits + {% endif %} + x +
+ +
+ Etat de la route commerciale + + En attente + +
+ +
+ {% if route.playerId1 == current_player.id %} + {{ destination_base|raw }} + {% else %} + {{ origin_base|raw }} + {% endif %} + +
    +
  • Distance {{ route.distance }} al.
  • +
  • + Prix + + {{ route.price|number }} + {% if is_player_from_negora %} + - {{ (negora_commercial_bonus * route.price / 100)|number }} + {% endif %} + + +
  • +
  • + Estimation du revenu par relève + + {{ route.income|number }} + {% if player_commercial_income_bonus > 0 %} + + {{ (player_commercial_income_bonus * route.income / 100)|number }} + {% endif %} + + +
  • +
  • + Population touchée + {{ (route.population1 + route.population2)|number }} millions +
  • + + {% if not route.isProposed %} +
  • + En service depuis
    + {{ route.dCreation|date|raw }} +
  • + {% endif %} +
+ + {% if route.playerId1 == current_player.id %} + {{ origin_base|raw }} + {% else %} + {{ destination_base|raw }} + {% endif %} +
+
+
+
+ {% endif %} + {% endfor %} + + {% for route in routes %} + {% if not route.isProposed or route.playerId2 != current_player.id %} + {% set origin_base = include('molecules/base/trade/commercial_route_base.html.twig', { + 'base_id': route.rOrbitalBase, + 'base_name': route.baseName1, + 'base_type': route.baseType1, + 'player_id': route.playerId1, + 'player_name': route.playerName1, + 'population': route.population1, + }) %} + {% set destination_base = include('molecules/base/trade/commercial_route_base.html.twig', { + 'base_id': route.rOrbitalBaseLinked, + 'base_name': route.baseName2, + 'base_type': route.baseType2, + 'player_id': route.playerId2, + 'player_name': route.playerName2, + 'population': route.population2, + }) %} +
+
+ {% if loop.index == 1 %} +

Routes commerciales

+ {% endif %} +
+
+
+
+ {% if route.isProposed %} + annuler la proposition commerciale + {% else %} + démanteler la route commerciale + {% endif %} +
+ +
+ Etat de la route commerciale + + {%- if route.isProposed -%} + En attente + {%- elseif route.isActive -%} + En activité + {%- elseif route.isInStandBy -%} + Gelée + {%- endif -%} + +
+ +
+ {% if route.playerId1 == current_player.id %} + {{ destination_base|raw }} + {% else %} + {{ origin_base|raw }} + {% endif %} + +
    +
  • + Distance + {{ route.distance }} al. +
  • +
  • + Revenu par relève + {% if not route.isActive %}[non effectif]{% endif %} + + {{ route.income|number }} + {% if player_commercial_income_bonus > 0 %} + + {{ (player_commercial_income_bonus * route.income / 100)|number }} + {% endif %} + + +
  • +
  • + Population touchée + {{ (route.population1 + route.population2)|number }} millions +
  • + + {% if not route.isProposed %} +
  • + En service depuis
    + {{ route.dCreation|date|raw }} +
  • + {% endif %} +
+ {% if route.playerId1 == current_player.id %} + {{ origin_base|raw }} + {% else %} + {{ destination_base|raw }} + {% endif %} +
+
+
+
+ {% endif %} + {% endfor %} + {% endif %} + +
+
+

À propos

+
+
+
+

{{ get_building_info(constant('App\\Modules\\Athena\\Resource\\OrbitalBaseResource::SPATIOPORT'), 'description')|raw }}

+
+
+
+ + {% if routes|length == 0 %} + {{ include('molecules/common/default.html.twig') }} + {% endif %} +{% endblock content %}