From 09caff2b2a06d1f8ac8203567035a21c612165f9 Mon Sep 17 00:00:00 2001 From: Daniel Weipert Date: Thu, 11 Jan 2024 13:15:02 +0100 Subject: send resources --- src/Model/Event/BaseEvent.php | 1 + src/Model/Event/SendResources.php | 130 +++++++++++++++++------- src/Model/Event/SendResourcesCarriers.php | 70 +++++++++++++ src/Model/Event/SendResourcesMerchants.php | 154 ----------------------------- src/Model/Event/SendUnits.php | 21 ++++ src/Model/Event/TrainUnits.php | 5 + src/Model/Event/UpgradeBuilding.php | 6 +- 7 files changed, 194 insertions(+), 193 deletions(-) create mode 100644 src/Model/Event/SendResourcesCarriers.php delete mode 100644 src/Model/Event/SendResourcesMerchants.php (limited to 'src/Model/Event') diff --git a/src/Model/Event/BaseEvent.php b/src/Model/Event/BaseEvent.php index 0c1795b..2e2564b 100644 --- a/src/Model/Event/BaseEvent.php +++ b/src/Model/Event/BaseEvent.php @@ -17,6 +17,7 @@ abstract class BaseEvent abstract function dbInsert(): void; abstract function dbDelete(): void; + abstract function cancel(): void; public function getEvent(): Event { 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( << $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( << $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]); } } diff --git a/src/Model/Event/SendResourcesCarriers.php b/src/Model/Event/SendResourcesCarriers.php new file mode 100644 index 0000000..b6c3772 --- /dev/null +++ b/src/Model/Event/SendResourcesCarriers.php @@ -0,0 +1,70 @@ + $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'], + ] + ); + } + } + + public function dbInsert(): void + { + DB::query( + 'insert into events (time, village_id) VALUES (:time, :village_id)', + ['time' => $this->event->time->format('c'), 'village_id' => $this->event->villageId] + ); + $eventId = DB::$connection->lastInsertId(); + + DB::query( + << $eventId, + 'source' => $this->source, + 'destination' => $this->destination, + ] + ); + $sendResourcesCarriersEventId = DB::$connection->lastInsertId(); + + DB::query( + 'update events_meta_send_resources_carriers set event_id=:new_id where event_id=:old_id', + ['old_id' => $this->sendResourcesEventId, 'new_id' => $sendResourcesCarriersEventId] + ); + } + + public function dbDelete(): void + { + DB::query('delete from events where id=:id', ['id' => $this->eventId]); + DB::query('delete from events_send_resources_carriers where id=:id', ['id' => $this->id]); + DB::query('delete from events_meta_send_resources_carriers where event_id=:id', ['id' => $this->id]); + } +} diff --git a/src/Model/Event/SendResourcesMerchants.php b/src/Model/Event/SendResourcesMerchants.php deleted file mode 100644 index a50b2bc..0000000 --- a/src/Model/Event/SendResourcesMerchants.php +++ /dev/null @@ -1,154 +0,0 @@ -isCanceled) { - // TODO: switch destination and source - // TODO: add resources back to "destination" - // TODO: add merchants back to "destination" - } - - else { - // 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', - [ - 'wood' => $this->wood, - 'clay' => $this->clay, - 'iron' => $this->iron, - 'food' => $this->food, - 'id' => $this->destination, - ] - ); - - // TODO: foreach send_resources_merchants - $source = Village::get($this->source); - $destination = Village::get($this->destination); - $event = new Event(); - $event->time = (new \DateTime())->add( - \DateInterval::createFromDateString( - Unit::getTravelTime(new Merchant(), Village::getDistance($source->x, $source->y, $destination->x, $destination->y)) - . ' seconds' - ) - ); - $event->villageId = $this->source; - $sendUnitsEvent = new SendUnits(); - $sendUnitsEvent->event = $event; - $sendUnitsEvent->type = 'SendBack'; - $sendUnitsEvent->unit = 'Merchant'; - $sendUnitsEvent->amount = $amount; - $sendUnitsEvent->source = $village->id; - $sendUnitsEvent->destination = $destination->id; - $sendUnitsEvent->dbInsert(); - - // TODO: add resources to destination - // (TODO: add foreign merchants to destination)? - // TODO: create SendUnits event with merchants back to source - } - } - - public function dbInsert(int $previouId): void - { - DB::query( - 'update events_send_resources_merchants set event_id=:new_id where event_id=:old_id', - ['old_id' => $previouId, 'new_id' => $this->id] - ); - - /* - DB::query( - 'insert into events (time, village_id) VALUES (:time, :village_id)', - ['time' => $this->event->time->format('c'), 'village_id' => $this->event->villageId] - ); - - DB::query( - << DB::$connection->lastInsertId(), - 'wood' => $this->wood, - 'clay' => $this->clay, - 'iron' => $this->iron, - 'food' => $this->food, - 'source' => $this->source, 'destination' => $this->destination, - 'is_canceled' => $this->isCanceled ?: 0, // @see https://www.php.net/manual/de/pdostatement.execute.php#126013 - ] - ); - $sendResourcesEventId = DB::$connection->lastInsertId(); - - $resourceCapabilities = Merchant::getResourceCapabilities($this->event->villageId); - $resourcesTotal = $this->wood + $this->clay + $this->iron + $this->food; - $necessaryMerchants = ceil($resourcesTotal / $resourceCapabilities); - - $merchantsAccountedFor = 0; - while ($merchantsAccountedFor < $necessaryMerchants) { - $merchants = DB::fetch( - Merchant::class, - 'select * from village_units where type=:type and residence_village_id=:villageId and is_traveling=false', - ['type' => 'Merchant', 'villageId' => $this->source] - ); - foreach ($merchants as $merchant) { - $currentlyNecessaryMerchants = $necessaryMerchants - $merchantsAccountedFor; - $currentlyUseableMerchants = $currentlyNecessaryMerchants - $merchant->amount < 0 ? $currentlyNecessaryMerchants : $merchant->amount; - $merchantsAccountedFor += $currentlyUseableMerchants; - - DB::query( - << $currentlyUseableMerchants, - 'type' => 'Merchant', - 'home' => $merchant->homeVillageId, - 'residence' => $merchant->residenceVillageId, - ] - ); - DB::query('update village_units set amount=amount-:amount where id=:unitId', ['amount' => $necessaryMerchants, 'unitId' => $merchant->id]); - - DB::query( - << $sendResourcesEventId, - 'unit_id' => $merchant->id, - 'amount' => $necessaryMerchants, - ] - ); - } - }*/ - } - - public function dbDelete(): void - { - DB::query('delete from events_send_resources_merchants where event_id=:id', ['id' => $this->id]); - } -} diff --git a/src/Model/Event/SendUnits.php b/src/Model/Event/SendUnits.php index ed4d5b6..c9afd6e 100644 --- a/src/Model/Event/SendUnits.php +++ b/src/Model/Event/SendUnits.php @@ -102,6 +102,27 @@ class SendUnits extends BaseEvent ); } + public function cancel(): void + { + $this->event = $this->getEvent(); + + $cancelTimeDiff = $this->event->createdAt->diff(new \DateTime()); + $cancelTime = (new \DateTime())->add($cancelTimeDiff); + + $this->isCanceled = true; + $this->home = $this->destination; + $this->residence = $this->source; + + DB::query( + 'update events set time=:time where id=:id', + ['time' => $cancelTime->format('c'), 'id' => $this->event->id] + ); + DB::query( + 'update events_send_units set is_canceled=:is_canceled, home=:home, residence=:residence where id=:id', + ['is_canceled' => $this->isCanceled, 'home' => $this->home, 'residence' => $this->residence, 'id' => $this->id] + ); + } + public function dbInsert(): void { DB::query( diff --git a/src/Model/Event/TrainUnits.php b/src/Model/Event/TrainUnits.php index 5e77198..59b169f 100644 --- a/src/Model/Event/TrainUnits.php +++ b/src/Model/Event/TrainUnits.php @@ -27,6 +27,11 @@ class TrainUnits extends BaseEvent ); } + public function cancel(): void + { + $this->dbDelete(); + } + public function dbInsert(): void { DB::query( diff --git a/src/Model/Event/UpgradeBuilding.php b/src/Model/Event/UpgradeBuilding.php index a426a21..a3f3984 100644 --- a/src/Model/Event/UpgradeBuilding.php +++ b/src/Model/Event/UpgradeBuilding.php @@ -3,7 +3,6 @@ namespace App\Model\Event; use App\DB; -use App\Model\Event; class UpgradeBuilding extends BaseEvent { @@ -27,6 +26,11 @@ class UpgradeBuilding extends BaseEvent ); } + public function cancel(): void + { + $this->dbDelete(); + } + public function dbInsert(): void { DB::query( -- cgit v1.2.3