diff options
| author | Daniel Weipert <git@mail.dweipert.de> | 2024-01-08 15:10:10 +0100 | 
|---|---|---|
| committer | Daniel Weipert <git@mail.dweipert.de> | 2024-01-08 15:10:10 +0100 | 
| commit | 82875448c485d26375ed6dea4e64e940f6e10f74 (patch) | |
| tree | ff2580447429309824e7d64401ad75e7f756e45e /src/gemini/Controller/Unit.php | |
| parent | b21316248572cb27ed1f504529ad6680a473022e (diff) | |
gemini
Diffstat (limited to 'src/gemini/Controller/Unit.php')
| -rw-r--r-- | src/gemini/Controller/Unit.php | 94 | 
1 files changed, 94 insertions, 0 deletions
| diff --git a/src/gemini/Controller/Unit.php b/src/gemini/Controller/Unit.php index c04079a..9aa6968 100644 --- a/src/gemini/Controller/Unit.php +++ b/src/gemini/Controller/Unit.php @@ -2,10 +2,13 @@  namespace App\gemini\Controller; +use App\DB;  use App\Model\Event; +use App\Model\Event\SendUnits;  use App\Model\Event\TrainUnits;  use App\Model\Unit as Model;  use App\Model\Village; +use App\View;  use GeminiFoundation\Request;  use GeminiFoundation\Response;  use GeminiFoundation\Status; @@ -57,4 +60,95 @@ class Unit        meta: "/village/{$village->x}/{$village->y}"      );    } + +  // #[Route(path: '/village/{x}/{y}/send-units', methods: ['POST'])] +  public function sendUnits(Request $request): Response +  { +    $village = Village::getByCoordinates($request->get('x'), $request->get('y')); + +    $selectedUnit = $request->get('selectedUnit'); +    if (empty($selectedUnit)) { +      return new Response(body: View::render('send-units/01-units.twig', [ +        'village' => $village, +      ])); +    } + +    if (empty($request->get('selectedVillageX'))) { +      return new Response(body: View::render('send-units/02-villages.twig', [ +        'village' => $village, +        'villages' => DB::fetch(Village::class, "select * from villages where id!=:id", ['id' => $village->id]), +        'selectedUnit' => $selectedUnit, +      ])); +    } +    $selectedVillage = Village::getByCoordinates($request->get('selectedVillageX'), $request->get('selectedVillageY')); + +    $selectedAction = $request->get('selectedAction'); +    if (empty($selectedAction)) { +      return new Response(body: View::render('send-units/03-actions.twig', [ +        'village' => $village, +        'selectedUnit' => $selectedUnit, +        'selectedVillage' => $selectedVillage, +      ])); +    } + +    $amount = intval($request->get('input')); +    if (empty($amount)) { +      return new Response(statusCode: Status::INPUT, meta: 'Amount'); +    } + +    $destination = $selectedVillage; + +    /**@var Model $unit*/ +    $unit = new (Model::resolveType($selectedUnit))(); + +    $amountUnits = DB::query( +      'select amount from village_units where home_village_id=:home and residence_village_id=:home and type=:type', +      ['home' => $village->id, 'type' => $selectedUnit] +    )->fetchColumn(); + +    if ($amountUnits - $amount > 0) { +      $statement = DB::query( +        <<<SQL +        update village_units set amount=:amount where home_village_id=:home and residence_village_id=:home and type=:type +        SQL, +        ['amount' => $amountUnits - $amount, 'home' => $village->id, 'type' => $selectedUnit] +      ); +    } else if ($amountUnits - $amount === 0) { +      DB::query( +        <<<SQL +        delete from village_units where home_village_id=:home and residence_village_id=:home and type=:type +        SQL, +        ['home' => $village->id, 'type' => $selectedUnit] +      ); +    } + +    DB::query( +      'insert into village_units (amount, type, home_village_id, residence_village_id, is_traveling) values (:amount, :type, :home, :home, true)', +      ['amount' => $amount, 'type' => $selectedUnit, 'home' => $village->id] +    ); + +    // event +    $event = new Event(); +    $event->time = (new \DateTime())->add( +      \DateInterval::createFromDateString( +        Model::getTravelTime($unit, Village::getDistance($village->x, $village->y, $destination->x, $destination->y)) +        . ' seconds' +      ) +    ); +    $event->villageId = $village->id; +    $sendUnitsEvent = new SendUnits(); +    $sendUnitsEvent->event = $event; +    $sendUnitsEvent->type = $selectedAction; +    $sendUnitsEvent->unit = $selectedUnit; +    $sendUnitsEvent->amount = $amount; +    $sendUnitsEvent->source = $village->id; +    $sendUnitsEvent->destination = $destination->id; +    $sendUnitsEvent->dbInsert(); + + +    return new Response( +      statusCode: Status::REDIRECT_TEMPORARY, +      meta: "/village/{$village->x}/{$village->y}" +    ); +  }  } | 
