diff options
author | Daniel Weipert <git@mail.dweipert.de> | 2024-01-11 13:15:02 +0100 |
---|---|---|
committer | Daniel Weipert <git@mail.dweipert.de> | 2024-01-11 13:15:02 +0100 |
commit | 09caff2b2a06d1f8ac8203567035a21c612165f9 (patch) | |
tree | 999be04ff0a418a33e438be9befc8c9297e383f4 /src/Model/Event/SendResources.php | |
parent | 6301f63bd348109b8693a922f02e16d49205a8fd (diff) |
send resources
Diffstat (limited to 'src/Model/Event/SendResources.php')
-rw-r--r-- | src/Model/Event/SendResources.php | 130 |
1 files changed, 92 insertions, 38 deletions
diff --git a/src/Model/Event/SendResources.php b/src/Model/Event/SendResources.php index 5c751fd..ea9361c 100644 --- a/src/Model/Event/SendResources.php +++ b/src/Model/Event/SendResources.php @@ -5,7 +5,7 @@ namespace App\Model\Event; use App\DB; use App\Model\Event; use App\Model\Unit; -use App\Model\Unit\Merchant; +use App\Model\Unit\MailCarrier; use App\Model\Village; class SendResources extends BaseEvent @@ -26,12 +26,38 @@ class SendResources extends BaseEvent public function __invoke(): void { if ($this->isCanceled) { - // TODO: switch destination and source - // TODO: add resources back to "destination" - // TODO: add merchants back to "destination" + // add resources back to "destination" + DB::query( + 'update villages set wood=wood+:wood, clay=clay+:clay, iron=iron+:iron, food=food+:food where id=:id', + [ + 'wood' => $this->wood, + 'clay' => $this->clay, + 'iron' => $this->iron, + 'food' => $this->food, + 'id' => $this->source, + ] + ); + + // add mailCarriers back to "destination" + $meta = DB::query('select amount, unit_id from events_meta_send_resources_carriers where event_id=:eventId', ['eventId' => $this->id])->fetchAll(); + foreach ($meta as $m) { + $unit = DB::query('select * from village_units where id=:unitId', ['unitId' => $m['unit_id']])->fetch(); + + DB::query('update village_units set amount=amount+:amount where id=:unitId', ['amount' => $m['amount'], 'unitId' => $unit['id']]); + DB::query( + 'update village_units set amount=amount-:amount where type=:unitType and home_village_id=:homeVillageId and residence_village_id=:residenceVillageId and is_traveling=true', + [ + 'amount' => $m['amount'], + 'unitType' => $unit['type'], + 'homeVillageId' => $unit['home_village_id'], + 'residenceVillageId' => $unit['residence_village_id'], + ] + ); + } } else { + // add resources to destination // TODO: account for storage capacity DB::query( 'update villages set wood=wood+:wood, clay=clay+:clay, iron=iron+:iron, food=food+:food where id=:id', @@ -44,26 +70,45 @@ class SendResources extends BaseEvent ] ); - $source = Village::get($this->source); - $destination = Village::get($this->destination); + // create SendResourcesCarriers event with mailCarriers back to source + $source = Village::get($this->destination); + $destination = Village::get($this->source); $event = new Event(); $event->time = (new \DateTime())->add( \DateInterval::createFromDateString( - Unit::getTravelTime(new Merchant(), Village::getDistance($source->x, $source->y, $destination->x, $destination->y)) + Unit::getTravelTime(new MailCarrier(), Village::getDistance($source->x, $source->y, $destination->x, $destination->y)) . ' seconds' ) ); $event->villageId = $this->source; - $sendResourcesMerchants = new SendResourcesMerchants(); - $sendResourcesMerchants->dbInsert($this->id); + $sendResourcesMailCarriers = new SendResourcesCarriers(); + $sendResourcesMailCarriers->event = $event; + $sendResourcesMailCarriers->sendResourcesEventId = $this->id; + $sendResourcesMailCarriers->source = $source->id; + $sendResourcesMailCarriers->destination = $destination->id; + $sendResourcesMailCarriers->dbInsert(); + } + } + + public function cancel(): void + { + $this->event = $this->getEvent(); + $cancelTimeDiff = $this->event->createdAt->diff(new \DateTime()); + $cancelTime = (new \DateTime())->add($cancelTimeDiff); - // TODO: add resources to destination - // (TODO: add foreign merchants to destination)? - // TODO: create SendUnits event with merchants back to source - } + $this->isCanceled = true; + + DB::query( + 'update events set time=:time where id=:id', + ['time' => $cancelTime->format('c'), 'id' => $this->event->id] + ); + DB::query( + 'update events_send_resources set is_canceled=:is_canceled where id=:id', + ['is_canceled' => $this->isCanceled, 'id' => $this->id] + ); } public function dbInsert(): void @@ -90,61 +135,70 @@ class SendResources extends BaseEvent ); $sendResourcesEventId = DB::$connection->lastInsertId(); - $resourceCapabilities = Merchant::getResourceCapabilities($this->event->villageId); + $resourceCapabilities = MailCarrier::getResourceCapabilities($this->event->villageId); $resourcesTotal = $this->wood + $this->clay + $this->iron + $this->food; - $necessaryMerchants = ceil($resourcesTotal / $resourceCapabilities); + $necessaryMailCarriers = ceil($resourcesTotal / $resourceCapabilities); - $merchantsAccountedFor = 0; - while ($merchantsAccountedFor < $necessaryMerchants) { - $merchants = DB::fetch( - Merchant::class, + $mailCarriersAccountedFor = 0; + while ($mailCarriersAccountedFor < $necessaryMailCarriers) { + $mailCarriers = DB::fetch( + MailCarrier::class, 'select * from village_units where type=:type and residence_village_id=:villageId and is_traveling=false', - ['type' => 'Merchant', 'villageId' => $this->source] + ['type' => 'MailCarrier', 'villageId' => $this->source] ); - foreach ($merchants as $merchant) { - /**@type Merchant $merchant*/ + foreach ($mailCarriers as $mailCarrier) { + /**@type MailCarrier $mailCarrier*/ - $currentlyNecessaryMerchants = $necessaryMerchants - $merchantsAccountedFor; - $currentlyUseableMerchants = $currentlyNecessaryMerchants - $merchant->amount < 0 ? $currentlyNecessaryMerchants : $merchant->amount; - $merchantsAccountedFor += $currentlyUseableMerchants; + $currentlyNecessaryMailCarriers = $necessaryMailCarriers - $mailCarriersAccountedFor; + $currentlyUseableMailCarriers = $currentlyNecessaryMailCarriers - $mailCarrier->amount < 0 ? $currentlyNecessaryMailCarriers : $mailCarrier->amount; + $mailCarriersAccountedFor += $currentlyUseableMailCarriers; DB::query( <<<SQL - insert into village_units (amount, type, is_traveling, home_village_id, residence_village_id) - VALUES (:amount, :type, true, :home, :residence) + insert into village_units (amount, type, home_village_id, residence_village_id, is_traveling) + VALUES (:amount, :type, :home, :residence, true) on conflict (type, home_village_id, residence_village_id, is_traveling) - do update set is_traveling=true + do update set amount = village_units.amount+:amount SQL, [ - 'amount' => $currentlyUseableMerchants, - 'type' => 'Merchant', - 'home' => $merchant->homeVillageId, - 'residence' => $merchant->residenceVillageId, + 'amount' => $currentlyUseableMailCarriers, + 'type' => 'MailCarrier', + 'home' => $mailCarrier->homeVillageId, + 'residence' => $mailCarrier->residenceVillageId, ] ); - DB::query('update village_units set amount=amount-:amount where id=:unitId', ['amount' => $necessaryMerchants, 'unitId' => $merchant->id]); + DB::query('update village_units set amount=amount-:amount where id=:unitId', ['amount' => $necessaryMailCarriers, 'unitId' => $mailCarrier->id]); DB::query( <<<SQL - insert into events_send_resources_merchants (event_id, unit_id, amount) + insert into events_meta_send_resources_carriers (event_id, unit_id, amount) VALUES (:event_id, :unit_id, :amount) SQL, [ 'event_id' => $sendResourcesEventId, - 'unit_id' => $merchant->id, - 'amount' => $necessaryMerchants, + 'unit_id' => $mailCarrier->id, + 'amount' => $necessaryMailCarriers, ] ); } } - // TODO: remove resources from source + // remove resources from source + DB::query( + 'update villages set wood=wood-:wood, clay=clay-:clay, iron=iron-:iron, food=food-:food where id=:id', + [ + 'wood' => $this->wood, + 'clay' => $this->clay, + 'iron' => $this->iron, + 'food' => $this->food, + 'id' => $this->source, + ] + ); } public function dbDelete(): void { DB::query('delete from events where id=:id', ['id' => $this->eventId]); DB::query('delete from events_send_resources where id=:id', ['id' => $this->id]); - #DB::query('delete from events_send_resources_merchants where event_id=:id', ['id' => $this->id]); } } |