query('SELECT city, nation FROM city WHERE nation != 0') as $city) { $newCity = new \stdClass(); $newCity->id = Util::toInt($city['city']); $newCity->nation = Util::toInt($city['nation']); $newCity->supply = false; $cities[$newCity->id] = $newCity; } $queue = new \SplQueue(); foreach ($db->queryAllLists('SELECT capital, nation FROM nation WHERE `level` > 0') as list($capitalID, $nationID)) { if (!key_exists($capitalID, $cities)) { continue; } $city = $cities[$capitalID]; if ($nationID != $city->nation) { continue; } $city->supply = true; $queue->enqueue($city); } while (!$queue->isEmpty()) { $cityLink = $queue->dequeue(); $city = CityConst::byID($cityLink->id); foreach (array_keys($city->path) as $connCityID) { if (!key_exists($connCityID, $cities)) { continue; } $connCity = $cities[$connCityID]; if ($connCity->nation != $cityLink->nation) { continue; } if ($connCity->supply) { continue; } $connCity->supply = true; $queue->enqueue($connCity); } } $db->update('city', [ 'supply' => 1 ], 'nation=0'); $db->update('city', [ 'supply' => 0 ], 'nation!=0'); $supply = []; foreach ($cities as $city) { if ($city->supply) { $supply[] = $city->id; } } if ($supply) { $db->update('city', [ 'supply' => 1 ], 'city IN %li', $supply); } } }