get('x'), $request->get('y')); /**@var Model $unit*/ $unit = new (Model::resolveType($request->get('type')))(); $unit->type = $request->get('type'); $unit->homeVillageId = $village->id; $amount = intval($request->get('amount')); if (! Village::canTrain($village, $unit, $amount)) { return new RedirectResponse( Router::generate( 'village.show', ['x' => $request->get('x'), 'y' => $request->get('y')] ) ); } // resources foreach (Model::getResourceRequirements($unit, $amount) as $resourceType => $resourceValue) { $village->{$resourceType} -= $resourceValue; } $village->updateResources(); // event $event = new Event(); $event->type = 'TrainUnits'; $event->time = (new \DateTime())->add(\DateInterval::createFromDateString($unit->getBuildTime($amount) . ' seconds')); $event->payload = json_encode([ 'type' => $request->get('type'), 'amount' => $amount, ]); DB::query( 'insert into events (type, time, payload, village_id) VALUES (:type, :time, :payload, :id)', ['type' => $event->type, 'time' => $event->time->format('c'), 'payload' => $event->payload, 'id' => $village->id] ); return new RedirectResponse( Router::generate( 'village.show', ['x' => $request->get('x'), 'y' => $request->get('y')] ) ); } #[Route(path: '/village/{x}/{y}/unit/{type}/location/{lx}/{ly}/recall', methods: ['POST'])] public function recall(Request $request): Response { $village = Village::getByCoordinates($request->get('x'), $request->get('y')); $location = Village::getByCoordinates($request->get('lx'), $request->get('ly')); /**@var Model $unit*/ $unit = new (Model::resolveType($request->get('type')))(); $amount = intval($request->get('amount')); $amountUnits = DB::query( 'select amount from village_units where home_village_id=:home and residence_village_id=:residence and type=:type', ['home' => $village->id, 'residence' => $location->id, 'type' => $request->get('type')] )->fetchColumn(); if ($amountUnits - $amount > 0) { $statement = DB::query( << $amountUnits - $amount, 'home' => $village->id, 'residence' => $location->id, 'type' => $request->get('type')] ); } else if ($amountUnits - $amount === 0) { DB::query( << $village->id, 'residence' => $location->id, 'type' => $request->get('type')] ); } // event $event = new Event(); $event->type = 'SendUnits'; $event->time = (new \DateTime())->add( \DateInterval::createFromDateString( Model::getTravelTime($unit, Village::getDistance($village->x, $village->y, $location->x, $location->y)) . ' seconds' ) ); $event->payload = json_encode([ 'type' => 'Recall', 'unit' => $request->get('type'), 'amount' => $amount, 'source' => $location->id, 'destination' => $village->id, ]); DB::query( 'insert into events (type, time, payload, village_id) VALUES (:type, :time, :payload, :id)', ['type' => $event->type, 'time' => $event->time->format('c'), 'payload' => $event->payload, 'id' => $village->id] ); return new RedirectResponse( Router::generate( 'village.show', ['x' => $request->get('x'), 'y' => $request->get('y')] ) ); } #[Route(path: '/village/{x}/{y}/unit/{type}/location/{lx}/{ly}/send-back', methods: ['POST'])] public function sendBack(Request $request): Response { $village = Village::getByCoordinates($request->get('x'), $request->get('y')); $location = Village::getByCoordinates($request->get('lx'), $request->get('ly')); /**@var Model $unit*/ $unit = new (Model::resolveType($request->get('type')))(); $amount = intval($request->get('amount')); $amountUnits = DB::query( 'select amount from village_units where home_village_id=:home and residence_village_id=:residence and type=:type', ['home' => $location->id, 'residence' => $village->id, 'type' => $request->get('type')] )->fetchColumn(); if ($amountUnits - $amount > 0) { $statement = DB::query( << $amountUnits - $amount, 'home' => $location->id, 'residence' => $village->id, 'type' => $request->get('type')] ); } else if ($amountUnits - $amount === 0) { DB::query( << $location->id, 'residence' => $village->id, 'type' => $request->get('type')] ); } // event $event = new Event(); $event->type = 'SendUnits'; $event->time = (new \DateTime())->add( \DateInterval::createFromDateString( Model::getTravelTime($unit, Village::getDistance($village->x, $village->y, $location->x, $location->y)) . ' seconds' ) ); $event->payload = json_encode([ 'type' => 'SendBack', 'unit' => $request->get('type'), 'amount' => $amount, 'source' => $village->id, 'destination' => $location->id, ]); DB::query( 'insert into events (type, time, payload, village_id) VALUES (:type, :time, :payload, :id)', ['type' => $event->type, 'time' => $event->time->format('c'), 'payload' => $event->payload, 'id' => $village->id] ); return new RedirectResponse( Router::generate( 'village.show', ['x' => $request->get('x'), 'y' => $request->get('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')); $destination = Village::get($request->get('village')); /**@var Model $unit*/ $unit = new (Model::resolveType($request->get('unit')))(); $amount = intval($request->get('amount')); $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' => $request->get('unit')] )->fetchColumn(); if ($amountUnits - $amount > 0) { $statement = DB::query( << $amountUnits - $amount, 'home' => $village->id, 'type' => $request->get('unit')] ); } else if ($amountUnits - $amount === 0) { DB::query( << $village->id, 'type' => $request->get('unit')] ); } // event $event = new Event(); $event->type = 'SendUnits'; $event->time = (new \DateTime())->add( \DateInterval::createFromDateString( Model::getTravelTime($unit, Village::getDistance($village->x, $village->y, $destination->x, $destination->y)) . ' seconds' ) ); $event->payload = json_encode([ 'type' => 'Borrow', 'unit' => $request->get('unit'), 'amount' => $amount, 'source' => $village->id, 'destination' => $destination->id, ]); DB::query( 'insert into events (type, time, payload, village_id) VALUES (:type, :time, :payload, :id)', ['type' => $event->type, 'time' => $event->time->format('c'), 'payload' => $event->payload, 'id' => $village->id] ); return new RedirectResponse( Router::generate( 'village.show', ['x' => $request->get('x'), 'y' => $request->get('y')] ) ); } }