Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions config/routes/ares.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -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
6 changes: 5 additions & 1 deletion config/routes/athena.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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
Expand Down
19 changes: 19 additions & 0 deletions config/routes/athena/trade.yaml
Original file line number Diff line number Diff line change
@@ -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
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
<?php

namespace App\Modules\Athena\Infrastructure\Controller\Base\Building;

use App\Modules\Athena\Manager\CommercialRouteManager;
use App\Modules\Athena\Model\OrbitalBase;
use App\Modules\Demeter\Manager\ColorManager;
use App\Modules\Demeter\Model\Color;
use App\Modules\Demeter\Resource\ColorResource;
use App\Modules\Zeus\Model\Player;
use App\Modules\Zeus\Model\PlayerBonus;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;

class ViewSpatioport extends AbstractController
{
public function __invoke(
Request $request,
Player $currentPlayer,
OrbitalBase $currentBase,
CommercialRouteManager $commercialRouteManager,
ColorManager $colorManager,
): Response {
$session = $request->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,
]);
}
}
122 changes: 122 additions & 0 deletions src/Modules/Athena/Infrastructure/Controller/Trade/AcceptRoute.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,122 @@
<?php

namespace App\Modules\Athena\Infrastructure\Controller\Trade;

use App\Classes\Entity\EntityManager;
use App\Classes\Exception\ErrorException;
use App\Classes\Exception\FormException;
use App\Classes\Library\Format;
use App\Classes\Library\Utils;
use App\Modules\Athena\Helper\OrbitalBaseHelper;
use App\Modules\Athena\Manager\CommercialRouteManager;
use App\Modules\Athena\Manager\OrbitalBaseManager;
use App\Modules\Athena\Model\CommercialRoute;
use App\Modules\Athena\Resource\OrbitalBaseResource;
use App\Modules\Demeter\Manager\ColorManager;
use App\Modules\Demeter\Model\Color;
use App\Modules\Demeter\Resource\ColorResource;
use App\Modules\Hermes\Manager\NotificationManager;
use App\Modules\Hermes\Model\Notification;
use App\Modules\Zeus\Manager\PlayerManager;
use App\Modules\Zeus\Model\Player;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;

class AcceptRoute extends AbstractController
{
public function __invoke(
Request $request,
Player $currentPlayer,
CommercialRouteManager $commercialRouteManager,
ColorManager $colorManager,
OrbitalBaseManager $orbitalBaseManager,
OrbitalBaseHelper $orbitalBaseHelper,
PlayerManager $playerManager,
NotificationManager $notificationManager,
EntityManager $entityManager,
int $baseId,
int $id,
): Response {
$session = $request->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');
}
}
}
70 changes: 70 additions & 0 deletions src/Modules/Athena/Infrastructure/Controller/Trade/CancelRoute.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,70 @@
<?php

namespace App\Modules\Athena\Infrastructure\Controller\Trade;

use App\Classes\Entity\EntityManager;
use App\Modules\Athena\Manager\CommercialRouteManager;
use App\Modules\Athena\Manager\OrbitalBaseManager;
use App\Modules\Athena\Model\CommercialRoute;
use App\Modules\Hermes\Manager\NotificationManager;
use App\Modules\Hermes\Model\Notification;
use App\Modules\Zeus\Manager\PlayerManager;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpKernel\Exception\BadRequestHttpException;
use Symfony\Component\HttpKernel\Exception\ConflictHttpException;

class CancelRoute extends AbstractController
{
public function __invoke(
Request $request,
CommercialRouteManager $commercialRouteManager,
PlayerManager $playerManager,
NotificationManager $notificationManager,
OrbitalBaseManager $orbitalBaseManager,
EntityManager $entityManager,
int $baseId,
int $id,
): Response {
$session = $request->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');
}
}
}
93 changes: 93 additions & 0 deletions src/Modules/Athena/Infrastructure/Controller/Trade/DeleteRoute.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,93 @@
<?php

namespace App\Modules\Athena\Infrastructure\Controller\Trade;

use App\Classes\Exception\ErrorException;
use App\Classes\Exception\FormException;
use App\Modules\Athena\Manager\CommercialRouteManager;
use App\Modules\Athena\Manager\OrbitalBaseManager;
use App\Modules\Athena\Model\CommercialRoute;
use App\Modules\Hermes\Manager\NotificationManager;
use App\Modules\Hermes\Model\Notification;
use App\Modules\Zeus\Model\Player;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;

class DeleteRoute extends AbstractController
{
public function __invoke(
Request $request,
Player $currentPlayer,
CommercialRouteManager $commercialRouteManager,
OrbitalBaseManager $orbitalBaseManager,
NotificationManager $notificationManager,
int $baseId,
int $id,
): Response {
$session = $request->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');
}
}
}
Loading