Files
core/hwe/sammo/Event/Action/UpdateCitySupply.php
T
Hide_D a4b52e49a7 feat: Event\Action에 하드코딩된 일부 액션 분리
- TurnExecutionHelper.php:434 부터 아래항목
2023-03-12 17:02:28 +09:00

79 lines
1.9 KiB
PHP

<?php
namespace sammo\Event\Action;
use sammo\CityConst;
use sammo\DB;
use sammo\Util;
class UpdateCitySupply extends \sammo\Event\Action{
public function run(array $env)
{
$db = DB::db();
$cities = [];
foreach ($db->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);
}
}
}