fetchAll(); foreach ($results as $row) { /**@var UpgradeBuilding $event*/ $event = DB::convertToModel(UpgradeBuilding::class, $row); $event(); $event->dbDelete(); } # Train Units $results = DB::query(<<fetchAll(); foreach ($results as $row) { /**@var TrainUnits $event*/ $event = DB::convertToModel(TrainUnits::class, $row); $event(); $event->dbDelete(); } # Send Units $results = DB::query(<<fetchAll(); foreach ($results as $row) { /**@var SendUnits $event*/ $event = DB::convertToModel(SendUnits::class, $row); $event(); $event->dbDelete(); } # Send Resources $results = DB::query(<<fetchAll(); foreach ($results as $row) { /**@var SendResources $event*/ $event = DB::convertToModel(SendResources::class, $row); $event(); $event->dbDelete(); } # Send Resources Carriers $results = DB::query(<<fetchAll(); foreach ($results as $row) { /**@var SendResourcesCarriers $event*/ $event = DB::convertToModel(SendResourcesCarriers::class, $row); $event(); $event->dbDelete(); } // Resources $lastTick = json_decode(DB::query('select value from system where key=:key', ['key' => 'last_resource_tick'])->fetchColumn()); if ($lastTick) { $lastTick = new \DateTime($lastTick); } else { $lastTick = (new \DateTime())->modify('- 1 min'); } $diff = (new \DateTime())->diff($lastTick); $tickMultiplier = $diff->i + 60*$diff->h + 60*24*$diff->d; if ($tickMultiplier > 0) { $villages = DB::fetch(Village::class, 'select id,wood,clay,iron,food,satisfaction from villages'); foreach ($villages as $village) { /**@var Village $village*/ /**@var array $resourceGenerators*/ $resourceGenerators = []; /**@var Storage $storage*/ $storage = null; /**@var Building[] $buildings*/ $buildings = DB::fetch(ResourceGenerator::class, 'select level,type,village_id from village_buildings where village_id=:id', ['id' => $village->id]); foreach ($buildings as $building) { if ($building->type == 'Storage') { $storage = $building->cast(); } else if (in_array($building->type, ['WoodCutter', 'ClayPit', 'IronMine', 'Farm'])) { $resourceGenerators[] = $building->cast(); } } $foodIncrementor = 0; $resources = []; foreach ($resourceGenerators as $generator) { /**@type ResourceGenerator $generator*/ if ($generator->type === 'Farm') { $foodIncrementor = $generator->getResourceIncrementor(); } $village->{$generator->resourceType} = min( max( $village->{$generator->resourceType} + ($generator->getResourceIncrementor() * $tickMultiplier), 0 ), $storage->getResourceCapacity($generator->resourceType) ); } $populationDemand = Village::getPopulationDemand($village->id); if ( $foodIncrementor < 0 && (abs($village->food / $foodIncrementor) < $_ENV['SATISFACTION_FOOD_THRESHOLD'] || $village->food < $populationDemand) ) { $village->satisfaction = min(max($village->satisfaction - (1 * $tickMultiplier), 0), 100); } else if ($foodIncrementor > 0) { $village->satisfaction = min(max($village->satisfaction + (1 * $tickMultiplier), 0), 100); } DB::query( 'update villages set wood=:wood, clay=:clay, iron=:iron, food=:food, satisfaction=:satisfaction where id=:id', [ 'wood' => $village->wood, 'clay' => $village->clay, 'iron' => $village->iron, 'food' => $village->food, 'satisfaction' => $village->satisfaction, 'id' => $village->id, ] ); } DB::query('delete from system where key=:key', ['key' => 'last_resource_tick']); $lastResourceTickMinute = (new \DateTime((new \DateTime())->format('Y-m-d H:i')))->format('c'); DB::query('insert into system (key,value) VALUES (:key,:value)', ['key' => 'last_resource_tick', 'value' => json_encode($lastResourceTickMinute)]); // Satisfaction // TODO: < 75 => resource increment reduction // TODO: < 50 => support units go home // TODO: < 30 => home units walk away // record which units // => after X units => create new NPC village // // TODO: > 50 home units come back // > 75 resource increment normal // > 95 resource increment higher? } } }