diff options
Diffstat (limited to 'src/http/Controller')
-rw-r--r-- | src/http/Controller/Building.php | 10 | ||||
-rw-r--r-- | src/http/Controller/Event.php | 36 | ||||
-rw-r--r-- | src/http/Controller/Login.php | 49 | ||||
-rw-r--r-- | src/http/Controller/Map.php | 6 | ||||
-rw-r--r-- | src/http/Controller/User.php | 58 | ||||
-rw-r--r-- | src/http/Controller/Village.php | 69 |
6 files changed, 214 insertions, 14 deletions
diff --git a/src/http/Controller/Building.php b/src/http/Controller/Building.php index 4a59f0e..d434fe8 100644 --- a/src/http/Controller/Building.php +++ b/src/http/Controller/Building.php @@ -21,10 +21,7 @@ class Building $building = Model::getByVillage($village->id, $request->get('type')) ?? Model::getEmpty($village->id, $request->get('type')); // resources - foreach ($building->getResourceRequirements() as $resourceType => $resourceValue) { - $village->{$resourceType} -= $resourceValue; - } - $village->updateResources(); + $resourceRequirements = $building->getResourceRequirements(); // event $event = new Event(); @@ -35,7 +32,10 @@ class Building $upgradeBuildingEvent = new UpgradeBuilding(); $upgradeBuildingEvent->event = $event; $upgradeBuildingEvent->type = $building->type; - $upgradeBuildingEvent->dbInsert(); + $upgradeBuildingEvent->wood = $resourceRequirements['wood']; + $upgradeBuildingEvent->clay = $resourceRequirements['clay']; + $upgradeBuildingEvent->iron = $resourceRequirements['iron']; + $upgradeBuildingEvent->create(); return new RedirectResponse( Router::generate( diff --git a/src/http/Controller/Event.php b/src/http/Controller/Event.php index 8b9b92a..264fa26 100644 --- a/src/http/Controller/Event.php +++ b/src/http/Controller/Event.php @@ -8,7 +8,10 @@ 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\MailCarrier; use App\Model\Village; +use App\View; use App\http\Router; use Symfony\Component\HttpFoundation\RedirectResponse; use Symfony\Component\HttpFoundation\Request; @@ -20,6 +23,39 @@ class Event #[Route(path: '/village/{x}/{y}/send-resources', methods: ['POST'])] public function sendResources(Request $request): Response { + $village = Village::getByCoordinates($request->get('x'), $request->get('y')); + + $totalAmount = $request->get('wood') + $request->get('clay') + $request->get('iron') + $request->get('food'); + + $resourceCapabilities = MailCarrier::getResourceCapabilities($village); + $necessaryMailCarriers = ceil($totalAmount / $resourceCapabilities); + $mailCarriers = DB::fetch(MailCarrier::class, 'select sum(amount) as amount from village_units where type=:type and residence_village_id=:villageId and is_traveling=false', ['villageId' => $village->id, 'type' => 'MailCarrier'])[0]->amount ?? 0; + if ($mailCarriers === 0 || $totalAmount > $resourceCapabilities) { + return new Response(View::render('error.twig', ['message' => 'Insufficient Mail Carriers']), 403); + } + + $destination = Village::get($request->get('village')); + + // event + $event = new Model(); + $event->time = (new \DateTime())->add( + \DateInterval::createFromDateString( + Unit::getTravelTime(new MailCarrier(), Village::getDistance($village->x, $village->y, $destination->x, $destination->y)) + . ' seconds' + ) + ); + $event->villageId = $village->id; + $sendResourcesEvent = new SendResources(); + $sendResourcesEvent->event = $event; + $sendResourcesEvent->wood = $request->get('wood'); + $sendResourcesEvent->clay = $request->get('clay'); + $sendResourcesEvent->iron = $request->get('iron'); + $sendResourcesEvent->food = $request->get('food'); + $sendResourcesEvent->source = $village->id; + $sendResourcesEvent->destination = $destination->id; + $sendResourcesEvent->dbInsert(); + + return new RedirectResponse( Router::generate( 'village.show', diff --git a/src/http/Controller/Login.php b/src/http/Controller/Login.php index 8c04d85..37680a7 100644 --- a/src/http/Controller/Login.php +++ b/src/http/Controller/Login.php @@ -3,6 +3,7 @@ namespace App\http\Controller; use App\DB; +use App\Model\Building\Farm; use App\View; use Symfony\Component\HttpFoundation\RedirectResponse; use Symfony\Component\HttpFoundation\Request; @@ -26,15 +27,59 @@ class Login if (empty($user)) { $password = password_hash($request->get('password'), PASSWORD_DEFAULT); DB::query('insert into users (username, password, email) values (:username, :password, :email)', ['username' => $email, 'password' => $password, 'email' => $email]); + + $userId = DB::$connection->lastInsertId(); - // TODO: also insert new village at random free coordinates + // insert new village at random free coordinates + # TODO: check if coords are free + DB::query( + 'insert into villages (name, x, y, wood, clay, iron, food, satisfaction) values (:name, :x, :y, 100, 100, 100, 100, 100)', + [ + 'name' => $email, + 'x' => random_int(-10, 10), + 'y' => random_int(-10, 10), + ] + ); + $villageId = DB::$connection->lastInsertId(); + + DB::query('insert into user_villages (user_id, village_id) values (:user_id, :village_id)', [ + 'user_id' => $userId, + 'village_id' => $villageId, + ]); + + DB::query('insert into village_storage_config (wood, clay, iron, food, village_id) values (:wood, :clay, :iron, :food, :village_id)', [ + 'wood' => 25, + 'clay' => 25, + 'iron' => 25, + 'food' => 25, + 'village_id' => $village->id, + ]); + + $initialBuildings = ['TownHall', 'Storage', 'WoodCutter', 'ClayPit', 'IronMine', 'Farm']; + foreach ($initialBuildings as $buildingType) { + DB::query('insert into village_buildings (level, type, village_id) values (:level, :type, :village_id)', [ + 'level' => 1, + 'type' => $buildingType, + 'village_id' => $villageId, + ]); + } + + $initialUnits = ['WoodCutter', 'PitWorker', 'Miner', 'Farmer']; + foreach ($initialUnits as $unitType) { + DB::query('insert into village_units (amount, type, home_village_id, residence_village_id) values (:amount, :type, :village_id, :village_id)', [ + 'amount' => 1, + 'type' => $unitType, + 'village_id' => $villageId, + ]); + } } else { $password = $user['password']; + $userId = $user['id']; } if (password_verify($request->get('password'), $password)) { $_SESSION['user'] = [ - 'id' => $user['id'], + 'id' => $userId, 'username' => $user['username'], ]; diff --git a/src/http/Controller/Map.php b/src/http/Controller/Map.php index 69d23e1..3b0773f 100644 --- a/src/http/Controller/Map.php +++ b/src/http/Controller/Map.php @@ -10,13 +10,17 @@ use Symfony\Component\Routing\Annotation\Route; class Map { - #[Route(path: '/map/{x}/{y}/{range}', defaults: ['range' => 1], methods: ['GET'])] + #[Route(path: '/map/{x}/{y}/{range}', defaults: ['range' => 0], methods: ['GET'])] public function region(Request $request): Response { $x = $request->get('x'); $y = $request->get('y'); $range = $request->get('range'); + if ($range <= 0) { + $range = $_ENV['MAP_DEFAULT_RANGE']; + } + $statement = DB::query( 'select * from villages where x>=:x1 and x<=:x2 and y>=:y1 and y<=:y2', [ diff --git a/src/http/Controller/User.php b/src/http/Controller/User.php new file mode 100644 index 0000000..e38780f --- /dev/null +++ b/src/http/Controller/User.php @@ -0,0 +1,58 @@ +<?php + +namespace App\http\Controller; + +use App\DB; +use App\View; +use App\http\Router; +use Symfony\Component\HttpFoundation\RedirectResponse; +use Symfony\Component\HttpFoundation\Request; +use Symfony\Component\HttpFoundation\Response; +use Symfony\Component\Routing\Attribute\Route; + +class User +{ + #[Route(path: '/account', methods: ['GET'])] + public function account(Request $request): Response + { + $user = DB::query('select username,email from users where id=:id', ['id' => $_SESSION['user']['id']])->fetch(); + + return new Response(View::render('account.twig', [ + 'user' => $user, + ])); + } + + #[Route(path: '/account', methods: ['POST'])] + public function accountSave(Request $request): Response + { + $username = $request->get('username'); + $email = $request->get('email'); + + if ($request->get('password')) { + $password = password_hash($request->get('password'), PASSWORD_DEFAULT); + DB::query( + 'update users set username=:username, email=:email, password=:password where id=:id', + [ + 'username' => $username, + 'email' => $email, + 'password' => $password, + 'id' => $_SESSION['user']['id'], + ] + ); + } else { + DB::query( + 'update users set username=:username, email=:email where id=:id', + [ + 'username' => $username, + 'email' => $email, + 'id' => $_SESSION['user']['id'], + ] + ); + } + + $_SESSION['user']['username'] = $request->get('username'); + + + return new RedirectResponse(Router::generate('user.account')); + } +} diff --git a/src/http/Controller/Village.php b/src/http/Controller/Village.php index 7b1f227..22713b1 100644 --- a/src/http/Controller/Village.php +++ b/src/http/Controller/Village.php @@ -4,6 +4,8 @@ namespace App\http\Controller; use App\DB; use App\Guard; +use App\Model\Event\SendResources; +use App\Model\Event\SendResourcesCarriers; use App\Model\Event\SendUnits; use App\Model\Event\TrainUnits; use App\Model\Event\UpgradeBuilding; @@ -27,7 +29,7 @@ class Village join user_villages on villages.id = user_villages.village_id where user_villages.user_id=:id SQL, - ['id' => $_SESSION['user']['id']] + ['id' => $_SESSION['user']['id'] ?? -1] ); return new Response(View::render('villages.twig', [ @@ -55,26 +57,32 @@ class Village )->fetchAll(); foreach ($eventsBuilding as $row) { - $events['UpgradeBuilding'][$row['type']][] = DB::convertToModel(UpgradeBuilding::class, $row); + $model = DB::convertToModel(UpgradeBuilding::class, $row); + $model->populateEvent(); + + $events['UpgradeBuilding'][$row['type']][] = $model; } $eventsUnits = DB::query( <<<SQL select * from events_train_units as event left join events on event.event_id = events.id - where village_id=:id + where events.village_id=:id SQL, ['id' => $village->id] )->fetchAll(); foreach ($eventsUnits as $row) { - $events['TrainUnits'][] = DB::convertToModel(TrainUnits::class, $row); + $model = DB::convertToModel(TrainUnits::class, $row); + $model->populateEvent(); + + $events['TrainUnits'][] = $model; } $eventsUnitsSendOwn = DB::query( <<<SQL select * from events_send_units as event left join events on event.event_id = events.id - where village_id=:id + where events.village_id=:id SQL, ['id' => $village->id] )->fetchAll(); @@ -87,7 +95,56 @@ class Village )->fetchAll(); foreach ([...$eventsUnitsSendOwn, ...$eventsUnitsSendOther] as $row) { - $events['SendUnits'][] = DB::convertToModel(SendUnits::class, $row);; + $model = DB::convertToModel(SendUnits::class, $row); + $model->populateEvent(); + + $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 events.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) { + $model = DB::convertToModel(SendResources::class, $row); + $model->populateEvent(); + + $events['SendResources'][] = DB::convertToModel(SendResources::class, $row); + } + + $eventsResourcesCarriersSendOwn = DB::query( + <<<SQL + select * from events_send_resources_carriers as event + left join events on event.event_id = events.id + where events.village_id=:id + SQL, ['id' => $village->id] + )->fetchAll(); + + $eventsResourcesCarriersSendOther = DB::query( + <<<SQL + select * from events_send_resources_carriers as event + left join events on event.event_id = events.id + where (destination=:id or source=:id) and village_id!=:id + SQL, ['id' => $village->id] + )->fetchAll(); + + foreach ([...$eventsResourcesCarriersSendOwn, ...$eventsResourcesCarriersSendOther] as $row) { + $model = DB::convertToModel(SendResourcesCarriers::class, $row); + $model->populateEvent(); + + $events['SendResourcesCarriers'][] = $model; } $buildings = []; |