diff options
Diffstat (limited to 'src/gemini/Controller')
| -rw-r--r-- | src/gemini/Controller/Village.php | 88 | 
1 files changed, 88 insertions, 0 deletions
| diff --git a/src/gemini/Controller/Village.php b/src/gemini/Controller/Village.php index 85b9205..70aa899 100644 --- a/src/gemini/Controller/Village.php +++ b/src/gemini/Controller/Village.php @@ -4,9 +4,13 @@ namespace App\gemini\Controller;  use App\DB;  use App\Guard; +use App\Model\Event; +use App\Model\Event\SendResources;  use App\Model\Event\SendUnits;  use App\Model\Event\TrainUnits;  use App\Model\Event\UpgradeBuilding; +use App\Model\Unit; +use App\Model\Unit\Merchant;  use App\Model\Village as Model;  use App\View;  use GeminiFoundation\Request; @@ -89,6 +93,26 @@ class Village        $events['SendUnits'][] = DB::convertToModel(SendUnits::class, $row);;      } +    $eventsResourcesSendOwn = DB::query( +      <<<SQL +      select * from events_send_resources as event +      left join events on event.event_id = events.id +      where village_id=:id +      SQL, ['id' => $village->id] +    )->fetchAll(); + +    $eventsResourcesSendOther = DB::query( +      <<<SQL +      select * from events_send_resources as event +      left join events on event.event_id = events.id +      where (destination=:id or source=:id) and village_id!=:id and is_canceled=false +      SQL, ['id' => $village->id] +    )->fetchAll(); + +    foreach ([...$eventsResourcesSendOwn, ...$eventsResourcesSendOther] as $row) { +      $events['SendResources'][] = DB::convertToModel(SendResources::class, $row);; +    } +      $buildings = [];      foreach (Model::getBuildings($village->id, true) as $building) {        $buildings[$building->type] = $building; @@ -100,6 +124,7 @@ class Village        'events' => $events,        'buildings' => $buildings,        'villages' => DB::fetch(Model::class, "select * from villages where id!=:id", ['id' => $village->id]), +      'marketplace' => $village->getBuilding($village->id, 'Marketplace'),      ]));    } @@ -164,4 +189,67 @@ class Village        meta: "/village/{$village->x}/{$village->y}/storage/config"      );    } + +  // #[Route(path: '/village/{x}/{y}/send-resources', methods: ['POST'])] +  public function sendResources(Request $request): Response +  { +    $village = Model::getByCoordinates($request->get('x'), $request->get('y')); + +    $selectedResourceType = $request->get('selectedResourceType'); +    if (empty($selectedResourceType)) { +      return new Response(body: View::render('send-resources/01-resource-types.twig', [ +        'village' => $village, +        'marketplace' => $village->getBuilding($village->id, 'Marketplace'), +      ])); +    } + +    if (empty($request->get('selectedVillageX'))) { +      return new Response(body: View::render('send-resources/02-villages.twig', [ +        'village' => $village, +        'villages' => DB::fetch(Model::class, "select * from villages where id!=:id", ['id' => $village->id]), +        'selectedResourceType' => $selectedResourceType, +        'marketplace' => $village->getBuilding($village->id, 'Marketplace'), +      ])); +    } +    $selectedVillage = Model::getByCoordinates($request->get('selectedVillageX'), $request->get('selectedVillageY')); + +    $amount = intval($request->get('input')); +    if (empty($amount)) { +      return new Response(statusCode: Status::INPUT, meta: 'Amount'); +    } + +    $resourceCapabilities = Merchant::getResourceCapabilities($village); +    $necessaryMerchants = ceil($amount / $resourceCapabilities); +    $merchants = DB::fetch(Merchant::class, 'select sum(amount) from village_units where type=:type and residence_village_id=:villageId and is_traveling=false', ['villageId' => $this->source, 'type' => 'Merchant'])[0]['amount'] ?? 0; +    if ($merchants === 0) { +      return new Response( +        statusCode: Status::REDIRECT_TEMPORARY, +        meta: "/village/{$village->x}/{$village->y}/type/$selectedResourceType/village/{$selectedVillage->x}/{$selectedVillage->y}" +      ); +    } + +    $destination = $selectedVillage; + +    // event +    $event = new Event(); +    $event->time = (new \DateTime())->add( +      \DateInterval::createFromDateString( +        Unit::getTravelTime(new Merchant(), Model::getDistance($village->x, $village->y, $destination->x, $destination->y)) +        . ' seconds' +      ) +    ); +    $event->villageId = $village->id; +    $sendResourcesEvent = new SendResources(); +    $sendResourcesEvent->event = $event; +    $sendResourcesEvent->$selectedResourceType = $amount; +    $sendResourcesEvent->source = $village->id; +    $sendResourcesEvent->destination = $destination->id; +    $sendResourcesEvent->dbInsert(); + + +    return new Response( +      statusCode: Status::REDIRECT_TEMPORARY, +      meta: "/village/{$village->x}/{$village->y}" +    ); +  }  } | 
