From 4c24da374b0115b60b60149cd70b7e86f68f7be2 Mon Sep 17 00:00:00 2001 From: Hide_D Date: Sat, 11 Mar 2023 20:28:32 +0900 Subject: [PATCH] =?UTF-8?q?misc:=20UpdateCitySupply=EC=97=90=20=EB=B3=B4?= =?UTF-8?q?=EA=B8=89=20=EB=81=8A=EA=B8=B4=20=EB=8F=84=EC=8B=9C=20=EB=82=B4?= =?UTF-8?q?=EC=A0=95=20=EA=B0=90=EC=86=8C=EB=B6=80=20=ED=95=A9=EC=B9=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- hwe/sammo/Event/Action/UpdateCitySupply.php | 170 +++++++++++++------- 1 file changed, 112 insertions(+), 58 deletions(-) diff --git a/hwe/sammo/Event/Action/UpdateCitySupply.php b/hwe/sammo/Event/Action/UpdateCitySupply.php index 5365ea09..cfff5317 100644 --- a/hwe/sammo/Event/Action/UpdateCitySupply.php +++ b/hwe/sammo/Event/Action/UpdateCitySupply.php @@ -1,79 +1,133 @@ 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 = []; + 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; + $cities[$newCity->id] = $newCity; } - $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)) { + $queue = new \SplQueue(); + foreach ($db->queryAllLists('SELECT capital, nation FROM nation WHERE `level` > 0') as list($capitalID, $nationID)) { + if (!key_exists($capitalID, $cities)) { continue; } - $connCity = $cities[$connCityID]; - if ($connCity->nation != $cityLink->nation) { + $city = $cities[$capitalID]; + if ($nationID != $city->nation) { continue; } - if ($connCity->supply) { - 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); } - $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); - } - } + ], 'nation=0'); -} \ No newline at end of file + $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); + } + + //미보급도시 10% 감소 + $db->update('city', [ + 'pop' => $db->sqleval('pop * 0.9'), + 'trust' => $db->sqleval('trust * 0.9'), + 'agri' => $db->sqleval('agri * 0.9'), + 'comm' => $db->sqleval('comm * 0.9'), + 'secu' => $db->sqleval('secu * 0.9'), + 'def' => $db->sqleval('def * 0.9'), + 'wall' => $db->sqleval('wall * 0.9'), + ], 'supply = 0'); + //미보급도시 장수 병 훈 사 5%감소 + //NOTE: update inner join도 가능하지만, meekrodb 기준으로 깔끔하게. + $unsuppliedCities = $db->query('SELECT city, nation, trust, name FROM city WHERE supply = 0'); + foreach (Util::arrayGroupBy($unsuppliedCities, 'nation') as $nationID => $cityList) { + $cityIDList = Util::squeezeFromArray($cityList, 'city'); + $db->update('general', [ + 'crew' => $db->sqleval('crew*0.95'), + 'atmos' => $db->sqleval('atmos*0.95'), + 'train' => $db->sqleval('train*0.95'), + ], 'city IN %li AND nation = %i', $cityIDList, $nationID); + } + + //민심30이하 공백지 처리 + $lostCities = []; + foreach ($unsuppliedCities as $unsuppliedCity) { + if ($unsuppliedCity['trust'] >= 30) { + continue; + } + $lostCities[$unsuppliedCity['city']] = $unsuppliedCity; + } + + $logger = new ActionLogger(0, 0, $env['year'], $env['month']); + + if ($lostCities) { + foreach ($lostCities as $lostCity) { + $josaYi = JosaUtil::pick($lostCity['name'], '이'); + $logger->pushGlobalHistoryLog("【고립】{$lostCity['name']}{$josaYi} 보급이 끊겨 미지배 도시가 되었습니다."); + } + $db->update('general', [ + 'officer_level' => 1, + 'officer_city' => 0 + ], 'officer_city IN %li', array_keys($lostCities)); + $db->update('city', [ + 'nation' => 0, + 'officer_set' => 0, + 'conflict' => '{}', + 'term' => 0, + 'front' => 0 + ], 'city IN %li', array_keys($lostCities)); + } + } +}